diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..1def6583b --- /dev/null +++ b/.clang-format @@ -0,0 +1,30 @@ +--- +BasedOnStyle: LLVM +Language: Cpp +AllowAllArgumentsOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +BinPackArguments: false +BinPackParameters: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: AfterColon +BreakInheritanceList: AfterColon +ColumnLimit: 80 +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +IndentCaseLabels: true +IndentPPDirectives: BeforeHash +IndentWidth: 2 +IndentWrappedFunctionNames: true +KeepEmptyLinesAtTheStartOfBlocks: false +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: All +ObjCBinPackProtocolList: Never +ReflowComments: true +SortIncludes: false +SpaceBeforeParens: Never +SpaceInEmptyParentheses: false +UseTab: Never + +... diff --git a/.swift-format b/.swift-format new file mode 100644 index 000000000..545beaa17 --- /dev/null +++ b/.swift-format @@ -0,0 +1,79 @@ +{ + "fileScopedDeclarationPrivacy" : { + "accessLevel" : "private" + }, + "indentConditionalCompilationBlocks" : true, + "indentSwitchCaseLabels" : false, + "indentation" : { + "spaces" : 2 + }, + "lineBreakAroundMultilineExpressionChainComponents" : false, + "lineBreakBeforeControlFlowKeywords" : false, + "lineBreakBeforeEachArgument" : false, + "lineBreakBeforeEachGenericRequirement" : false, + "lineBreakBetweenDeclarationAttributes" : false, + "lineLength" : 100, + "maximumBlankLines" : 1, + "multiElementCollectionTrailingCommas" : true, + "noAssignmentInExpressions" : { + "allowedFunctions" : [ + "XCTAssertNoThrow" + ] + }, + "prioritizeKeepingFunctionOutputTogether" : false, + "reflowMultilineStringLiterals" : { + "never" : { + + } + }, + "respectsExistingLineBreaks" : true, + "rules" : { + "AllPublicDeclarationsHaveDocumentation" : false, + "AlwaysUseLiteralForEmptyCollectionInit" : false, + "AlwaysUseLowerCamelCase" : true, + "AmbiguousTrailingClosureOverload" : true, + "AvoidRetroactiveConformances" : true, + "BeginDocumentationCommentWithOneLineSummary" : false, + "DoNotUseSemicolons" : true, + "DontRepeatTypeInStaticProperties" : true, + "FileScopedDeclarationPrivacy" : true, + "FullyIndirectEnum" : true, + "GroupNumericLiterals" : true, + "IdentifiersMustBeASCII" : true, + "NeverForceUnwrap" : false, + "NeverUseForceTry" : false, + "NeverUseImplicitlyUnwrappedOptionals" : false, + "NoAccessLevelOnExtensionDeclaration" : true, + "NoAssignmentInExpressions" : true, + "NoBlockComments" : true, + "NoCasesWithOnlyFallthrough" : true, + "NoEmptyLinesOpeningClosingBraces" : false, + "NoEmptyTrailingClosureParentheses" : true, + "NoLabelsInCasePatterns" : true, + "NoLeadingUnderscores" : false, + "NoParensAroundConditions" : true, + "NoPlaygroundLiterals" : true, + "NoVoidReturnOnFunctionSignature" : true, + "OmitExplicitReturns" : false, + "OneCasePerLine" : true, + "OneVariableDeclarationPerLine" : true, + "OnlyOneTrailingClosureArgument" : true, + "OrderedImports" : true, + "ReplaceForEachWithForLoop" : true, + "ReturnVoidInsteadOfEmptyTuple" : true, + "TypeNamesShouldBeCapitalized" : true, + "UseEarlyExits" : false, + "UseExplicitNilCheckInConditions" : true, + "UseLetInEveryBoundCaseVariable" : true, + "UseShorthandTypeNames" : true, + "UseSingleLinePropertyGetter" : true, + "UseSynthesizedInitializer" : true, + "UseTripleSlashForDocumentationComments" : true, + "UseWhereClausesInForLoops" : false, + "ValidateDocumentationComments" : false + }, + "spacesAroundRangeFormationOperators" : false, + "spacesBeforeEndOfLineComments" : 2, + "tabWidth" : 8, + "version" : 1 +} diff --git a/CHANGELOG.md b/CHANGELOG.md index c08e0ed2b..ab851d81e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +## 2.1.0-beta.1 + +## Fixes +- Add Temporary fix for circular paths, which break expo ([9c09743](https://github.com/Iterable/react-native-sdk/commit/9c09743)) + +## 2.1.0-beta.0 + +### Updates +- Update SDK so that it has full support for [React Native New Architecture](https://reactnative.dev/architecture/landing-page) + +### Chores +- Update dependencies for React Navigation and related packages ([95053bb](https://github.com/Iterable/react-native-sdk/commit/95053bb)) + + ## 2.0.3 ### Updates diff --git a/Iterable-React-Native-SDK.podspec b/Iterable-React-Native-SDK.podspec index 661790a03..0d023409f 100644 --- a/Iterable-React-Native-SDK.podspec +++ b/Iterable-React-Native-SDK.podspec @@ -1,7 +1,6 @@ require "json" package = JSON.parse(File.read(File.join(__dir__, "package.json"))) -folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' Pod::Spec.new do |s| s.name = "Iterable-React-Native-SDK" @@ -14,31 +13,20 @@ Pod::Spec.new do |s| s.platforms = { :ios => min_ios_version_supported } s.source = { :git => "https://github.com/Iterable/react-native-sdk.git", :tag => "#{s.version}" } - s.source_files = "ios/**/*.{h,m,mm,swift}" - - # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0. - # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79. - if respond_to?(:install_modules_dependencies, true) - install_modules_dependencies(s) - else - s.dependency "React-Core" - - # Don't install the dependencies when we run `pod install` in the old architecture. - if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then - s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1" - s.pod_target_xcconfig = { - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"", - "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1", - "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" - } - s.dependency "React-Codegen" - s.dependency "RCT-Folly" - s.dependency "RCTRequired" - s.dependency "RCTTypeSafety" - s.dependency "ReactCommon/turbomodule/core" - end - end - - s.dependency "Iterable-iOS-SDK", "6.5.4.1" + s.source_files = "ios/**/*.{h,m,mm,cpp,swift}" + s.private_header_files = "ios/**/*.h" + + # Load Iterables iOS SDK as a dependency + s.dependency "Iterable-iOS-SDK", "6.6.1" + + # Basic Swift support + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + 'CLANG_ENABLE_MODULES' => 'YES', + 'SWIFT_VERSION' => '5.0', + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + } + + install_modules_dependencies(s) end diff --git a/README.md b/README.md index fb5a88a63..390b8adb3 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Iterable. It supports JavaScript and TypeScript. - [Installation](#installation) - [📚 API Documentation](#-api-documentation) - [Architecture Support](#architecture-support) + - [Beta Versions](#beta-versions) - [Features](#features) - [Example project](#example-project) - [Version mapping](#version-mapping) @@ -50,6 +51,10 @@ Iterable's React Native SDK relies on: - Xcode 12+ - [Deployment target 13.4+](https://help.apple.com/xcode/mac/current/#/deve69552ee5) - [Iterable's iOS SDK](https://github.com/Iterable/iterable-swift-sdk) + - **Podfile Configuration**: The linkage must be set to dynamic in your Podfile to load Swift modules that the SDK depends on. Add the following to your Podfile: + ```ruby + use_frameworks! :linkage => :dynamic + ``` - **Android** - [`minSdkVersion` 21+, `compileSdkVersion` 31+](https://medium.com/androiddevelopers/picking-your-compilesdkversion-minsdkversion-targetsdkversion-a098a0341ebd) @@ -65,11 +70,29 @@ View the [API documentation](https://iterable-react-native-sdk.netlify.app). ## Architecture Support -**Important**: Iterable's React Native SDK has limited support for [React -Native's New Architecture](https://reactnative.dev/architecture/landing-page) -through interop. We are in the process of updating the SDK to fully support the New -Architecture, and suggest using the legacy architecture in the meantime. *TLDR;* Use the New Architecture at your own risk -- -you may encounter significant issues. +Iterable's React Native SDK now fully supports [React Native's New Architecture](https://reactnative.dev/architecture/landing-page), including TurboModules and Fabric. You can use the SDK with either the legacy architecture or the New Architecture. + +Notes: + +- Ensure your app is configured for New Architecture per the React Native docs. +- The example app in this repository is configured with New Architecture enabled. + +## Beta Versions + +To opt into beta versions of the SDK, you can install the latest beta version by using the `beta` tag: + +```bash +# Install the latest beta version +npm install @iterable/react-native-sdk@beta + +# Or using yarn +yarn add @iterable/react-native-sdk@beta +``` + +**Note:** Beta versions may contain experimental features and could have +breaking changes. We recommend testing beta versions in development environments +before using them in production. Please report any issues found in beta +releases to [Customer Support](https://support.iterable.com/hc/en-us/requests/new). ## Features @@ -97,6 +120,7 @@ For quick reference, the following table lists the versions of the [Android SDK] | RN SDK Version | Android SDK Version | iOS SDK Version | | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------- | +| [2.1.0-beta.0](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.1.0-beta.0) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4) | [2.0.3](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.3) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4) | [2.0.2](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.2) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4) | [2.0.1](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.1) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4) diff --git a/android/build.gradle b/android/build.gradle index fd26bc186..d546cce98 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,6 +1,7 @@ buildscript { - // Buildscript is evaluated before everything else so we can't use getExtOrDefault - def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["RNIterable_kotlinVersion"] + ext.getExtOrDefault = {name -> + return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['RNIterable_' + name] + } repositories { google() @@ -8,17 +9,12 @@ buildscript { } dependencies { - classpath "com.android.tools.build:gradle:7.2.1" + classpath "com.android.tools.build:gradle:8.7.2" // noinspection DifferentKotlinGradleVersion - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getExtOrDefault('kotlinVersion')}" } } -def reactNativeArchitectures() { - def value = rootProject.getProperties().get("reactNativeArchitectures") - return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] -} - def isNewArchitectureEnabled() { return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true" } @@ -63,7 +59,11 @@ android { defaultConfig { minSdkVersion getExtOrIntegerDefault("minSdkVersion") targetSdkVersion getExtOrIntegerDefault("targetSdkVersion") + buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()) + } + buildFeatures { + buildConfig true } buildTypes { @@ -80,6 +80,19 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + sourceSets { + main { + if (isNewArchitectureEnabled()) { + java.srcDirs += ['src/newarch'] + } else { + java.srcDirs += ['src/oldarch'] + } + } + } + + // Add this to match the Iterable SDK group ID + group = "com.iterable" } repositories { @@ -90,12 +103,9 @@ repositories { def kotlin_version = getExtOrDefault("kotlinVersion") dependencies { - // For < 0.71, this will be from the local maven repo - // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin - //noinspection GradleDynamicVersion - implementation "com.facebook.react:react-native:+" + implementation "com.facebook.react:react-android" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - api "com.iterable:iterableapi:3.5.2" + api "com.iterable:iterableapi:3.6.1" // api project(":iterableapi") // links to local android SDK repo rather than by release } diff --git a/android/gradle.properties b/android/gradle.properties index a46c61ab2..89c682313 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,7 +1,7 @@ -RNIterable_kotlinVersion=1.7.0 -RNIterable_minSdkVersion=21 -RNIterable_targetSdkVersion=31 -RNIterable_compileSdkVersion=31 -RNIterable_ndkversion=21.4.7075529 +RNIterable_kotlinVersion=2.0.21 +RNIterable_minSdkVersion=24 +RNIterable_targetSdkVersion=35 +RNIterable_compileSdkVersion=35 +RNIterable_ndkversion=27.1.12297006 android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file +android.enableJetifier=true diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java similarity index 76% rename from android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java rename to android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java index 4d1766472..3207bb5dc 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java @@ -8,19 +8,17 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; - +import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; -import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; -import com.facebook.react.modules.core.RCTNativeAppEventEmitter; + +import com.iterable.iterableapi.AuthFailure; import com.iterable.iterableapi.InboxSessionManager; import com.iterable.iterableapi.IterableAction; import com.iterable.iterableapi.IterableActionContext; @@ -44,15 +42,19 @@ import org.json.JSONException; import org.json.JSONObject; +import java.util.Map; +import java.util.HashMap; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -public class RNIterableAPIModule extends ReactContextBaseJavaModule implements IterableUrlHandler, IterableCustomActionHandler, IterableInAppHandler, IterableAuthHandler, IterableInAppManager.Listener { - private final ReactApplicationContext reactContext; +public class RNIterableAPIModuleImpl implements IterableUrlHandler, IterableCustomActionHandler, IterableInAppHandler, IterableAuthHandler, IterableInAppManager.Listener { + public static final String NAME = "RNIterableAPI"; + private static String TAG = "RNIterableAPIModule"; + private final ReactApplicationContext reactContext; - private InAppResponse inAppResponse = InAppResponse.SHOW; + private IterableInAppHandler.InAppResponse inAppResponse = IterableInAppHandler.InAppResponse.SHOW; //A CountDownLatch. This helps decide whether to handle the in-app in Default way by waiting for JS to respond in runtime. private CountDownLatch jsCallBackLatch; @@ -62,22 +64,42 @@ public class RNIterableAPIModule extends ReactContextBaseJavaModule implements I private final InboxSessionManager sessionManager = new InboxSessionManager(); - public RNIterableAPIModule(ReactApplicationContext reactContext) { - super(reactContext); + public RNIterableAPIModuleImpl(ReactApplicationContext reactContext) { this.reactContext = reactContext; } - // --------------------------------------------------------------------------------------- - // region IterableSDK calls + public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, String version, Promise promise) { + IterableLogger.d(TAG, "initializeWithApiKey: " + apiKey); + IterableConfig.Builder configBuilder = Serialization.getConfigFromReadableMap(configReadableMap); - @Override - public String getName() { - return "RNIterableAPI"; + if (configReadableMap.hasKey("urlHandlerPresent") && configReadableMap.getBoolean("urlHandlerPresent") == true) { + configBuilder.setUrlHandler(this); + } + + if (configReadableMap.hasKey("customActionHandlerPresent") && configReadableMap.getBoolean("customActionHandlerPresent") == true) { + configBuilder.setCustomActionHandler(this); + } + + if (configReadableMap.hasKey("inAppHandlerPresent") && configReadableMap.getBoolean("inAppHandlerPresent") == true) { + configBuilder.setInAppHandler(this); + } + + if (configReadableMap.hasKey("authHandlerPresent") && configReadableMap.getBoolean("authHandlerPresent") == true) { + configBuilder.setAuthHandler(this); + } + + IterableApi.initialize(reactContext, apiKey, configBuilder.build()); + IterableApi.getInstance().setDeviceAttribute("reactNativeSDKVersion", version); + + IterableApi.getInstance().getInAppManager().addListener(this); + + // MOB-10421: Figure out what the error cases are and handle them appropriately + // This is just here to match the TS types and let the JS thread know when we are done initializing + promise.resolve(true); } - @ReactMethod - public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, String version, Promise promise) { - IterableLogger.d(TAG, "initializeWithApiKey: " + apiKey); + public void initialize2WithApiKey(String apiKey, ReadableMap configReadableMap, String version, String apiEndPointOverride, Promise promise) { + IterableLogger.d(TAG, "initialize2WithApiKey: " + apiKey); IterableConfig.Builder configBuilder = Serialization.getConfigFromReadableMap(configReadableMap); if (configReadableMap.hasKey("urlHandlerPresent") && configReadableMap.getBoolean("urlHandlerPresent") == true) { @@ -96,6 +118,10 @@ public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, S configBuilder.setAuthHandler(this); } + // NOTE: There does not seem to be a way to set the API endpoint + // override in the Android SDK. Check with @Ayyanchira and @evantk91 to + // see what the best approach is. + IterableApi.initialize(reactContext, apiKey, configBuilder.build()); IterableApi.getInstance().setDeviceAttribute("reactNativeSDKVersion", version); @@ -106,81 +132,69 @@ public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, S promise.resolve(true); } - @ReactMethod public void setEmail(@Nullable String email, @Nullable String authToken) { IterableLogger.d(TAG, "setEmail: " + email + " authToken: " + authToken); IterableApi.getInstance().setEmail(email, authToken); } - @ReactMethod public void updateEmail(String email, @Nullable String authToken) { IterableLogger.d(TAG, "updateEmail: " + email + " authToken: " + authToken); IterableApi.getInstance().updateEmail(email, authToken); } - @ReactMethod public void getEmail(Promise promise) { promise.resolve(RNIterableInternal.getEmail()); } - @ReactMethod public void sampleMethod(String stringArgument, int numberArgument, Callback callback) { // TODO: Implement some actually useful functionality callback.invoke("Received numberArgument: " + numberArgument + " stringArgument: " + stringArgument); } - @ReactMethod public void setUserId(@Nullable String userId, @Nullable String authToken) { IterableLogger.d(TAG, "setUserId: " + userId + " authToken: " + authToken); IterableApi.getInstance().setUserId(userId, authToken); } - @ReactMethod - public void updateUser(ReadableMap dataFields, Boolean mergeNestedObjects) { + public void updateUser(ReadableMap dataFields, boolean mergeNestedObjects) { IterableLogger.v(TAG, "updateUser"); IterableApi.getInstance().updateUser(optSerializedDataFields(dataFields), mergeNestedObjects); } - @ReactMethod public void getUserId(Promise promise) { promise.resolve(RNIterableInternal.getUserId()); } - @ReactMethod - public void trackEvent(String name, ReadableMap dataFields) { + public void trackEvent(String name, @Nullable ReadableMap dataFields) { IterableLogger.v(TAG, "trackEvent"); IterableApi.getInstance().track(name, optSerializedDataFields(dataFields)); } - @ReactMethod public void updateCart(ReadableArray items) { IterableLogger.v(TAG, "updateCart"); IterableApi.getInstance().updateCart(Serialization.commerceItemsFromReadableArray(items)); } - @ReactMethod - public void trackPurchase(Double total, ReadableArray items, ReadableMap dataFields) { + public void trackPurchase(double total, ReadableArray items, @Nullable ReadableMap dataFields) { IterableLogger.v(TAG, "trackPurchase"); IterableApi.getInstance().trackPurchase(total, Serialization.commerceItemsFromReadableArray(items), optSerializedDataFields(dataFields)); } - @ReactMethod - public void trackPushOpenWithCampaignId(Integer campaignId, Integer templateId, String messageId, Boolean appAlreadyRunning, ReadableMap dataFields) { - RNIterableInternal.trackPushOpenWithCampaignId(campaignId, templateId, messageId, optSerializedDataFields(dataFields)); + public void trackPushOpenWithCampaignId(double campaignId, @Nullable Double templateId, String messageId, boolean appAlreadyRunning, @Nullable ReadableMap dataFields) { + RNIterableInternal.trackPushOpenWithCampaignId((int) campaignId, templateId != null ? templateId.intValue() : null, messageId, optSerializedDataFields(dataFields)); } - @ReactMethod - public void updateSubscriptions(ReadableArray emailListIds, ReadableArray unsubscribedChannelIds, ReadableArray unsubscribedMessageTypeIds, ReadableArray subscribedMessageTypeIds, Integer campaignId, Integer templateId) { + public void updateSubscriptions(@Nullable ReadableArray emailListIds, @Nullable ReadableArray unsubscribedChannelIds, @Nullable ReadableArray unsubscribedMessageTypeIds, @Nullable ReadableArray subscribedMessageTypeIds, double campaignId, double templateId) { IterableLogger.v(TAG, "updateSubscriptions"); Integer finalCampaignId = null, finalTemplateId = null; if (campaignId > 0) { - finalCampaignId = campaignId; + finalCampaignId = (int) campaignId; } if (templateId > 0) { - finalTemplateId = templateId; + finalTemplateId = (int) templateId; } IterableApi.getInstance().updateSubscriptions(readableArrayToIntegerArray(emailListIds), readableArrayToIntegerArray(unsubscribedChannelIds), @@ -191,7 +205,6 @@ public void updateSubscriptions(ReadableArray emailListIds, ReadableArray unsubs ); } - @ReactMethod public void showMessage(String messageId, boolean consume, final Promise promise) { if (messageId == null || messageId == "") { promise.reject("", "messageId is null or empty"); @@ -205,19 +218,16 @@ public void execute(@Nullable Uri url) { }); } - @ReactMethod public void setReadForMessage(String messageId, boolean read) { IterableLogger.v(TAG, "setReadForMessage"); IterableApi.getInstance().getInAppManager().setRead(RNIterableInternal.getMessageById(messageId), read); } - @ReactMethod - public void removeMessage(String messageId, Integer location, Integer deleteSource) { + public void removeMessage(String messageId, double location, double deleteSource) { IterableLogger.v(TAG, "removeMessage"); - IterableApi.getInstance().getInAppManager().removeMessage(RNIterableInternal.getMessageById(messageId), Serialization.getIterableDeleteActionTypeFromInteger(deleteSource), Serialization.getIterableInAppLocationFromInteger(location)); + IterableApi.getInstance().getInAppManager().removeMessage(RNIterableInternal.getMessageById(messageId), Serialization.getIterableDeleteActionTypeFromInteger((int) deleteSource), Serialization.getIterableInAppLocationFromInteger((int) location)); } - @ReactMethod public void getHtmlInAppContentForMessage(String messageId, final Promise promise) { IterableLogger.printInfo(); IterableInAppMessage message = RNIterableInternal.getMessageById(messageId); @@ -241,7 +251,6 @@ public void getHtmlInAppContentForMessage(String messageId, final Promise promis } } - @ReactMethod public void getAttributionInfo(Promise promise) { IterableLogger.printInfo(); IterableAttributionInfo attributionInfo = IterableApi.getInstance().getAttributionInfo(); @@ -257,8 +266,7 @@ public void getAttributionInfo(Promise promise) { } } - @ReactMethod - public void setAttributionInfo(ReadableMap attributionInfoReadableMap) { + public void setAttributionInfo(@Nullable ReadableMap attributionInfoReadableMap) { IterableLogger.printInfo(); try { JSONObject attributionInfoJson = Serialization.convertMapToJson(attributionInfoReadableMap); @@ -269,7 +277,6 @@ public void setAttributionInfo(ReadableMap attributionInfoReadableMap) { } } - @ReactMethod public void getLastPushPayload(Promise promise) { Bundle payloadData = IterableApi.getInstance().getPayloadData(); if (payloadData != null) { @@ -280,13 +287,11 @@ public void getLastPushPayload(Promise promise) { } } - @ReactMethod public void disableDeviceForCurrentUser() { IterableLogger.v(TAG, "disableDevice"); IterableApi.getInstance().disablePush(); } - @ReactMethod public void handleAppLink(String uri, Promise promise) { IterableLogger.printInfo(); promise.resolve(IterableApi.getInstance().handleAppLink(uri)); @@ -297,8 +302,7 @@ public void handleAppLink(String uri, Promise promise) { // --------------------------------------------------------------------------------------- // region Track APIs - @ReactMethod - public void trackInAppOpen(String messageId, @Nullable Integer location) { + public void trackInAppOpen(String messageId, double location) { IterableInAppMessage message = RNIterableInternal.getMessageById(messageId); if (message == null) { @@ -306,13 +310,12 @@ public void trackInAppOpen(String messageId, @Nullable Integer location) { return; } - IterableApi.getInstance().trackInAppOpen(message, Serialization.getIterableInAppLocationFromInteger(location)); + IterableApi.getInstance().trackInAppOpen(message, Serialization.getIterableInAppLocationFromInteger((int) location)); } - @ReactMethod - public void trackInAppClick(String messageId, @Nullable Integer location, String clickedUrl) { + public void trackInAppClick(String messageId, double location, String clickedUrl) { IterableInAppMessage message = RNIterableInternal.getMessageById(messageId); - IterableInAppLocation inAppOpenLocation = Serialization.getIterableInAppLocationFromInteger(location); + IterableInAppLocation inAppOpenLocation = Serialization.getIterableInAppLocationFromInteger((int) location); if (message == null) { IterableLogger.d(TAG, "Failed to get in-app for message ID: " + messageId); @@ -332,11 +335,10 @@ public void trackInAppClick(String messageId, @Nullable Integer location, String IterableApi.getInstance().trackInAppClick(message, clickedUrl, inAppOpenLocation); } - @ReactMethod - public void trackInAppClose(String messageId, Integer location, Integer source, @Nullable String clickedUrl) { + public void trackInAppClose(String messageId, double location, double source, @Nullable String clickedUrl) { IterableInAppMessage inAppMessage = RNIterableInternal.getMessageById(messageId); - IterableInAppLocation inAppCloseLocation = Serialization.getIterableInAppLocationFromInteger(location); - IterableInAppCloseAction closeAction = Serialization.getIterableInAppCloseSourceFromInteger(source); + IterableInAppLocation inAppCloseLocation = Serialization.getIterableInAppLocationFromInteger((int) location); + IterableInAppCloseAction closeAction = Serialization.getIterableInAppCloseSourceFromInteger((int) source); if (inAppMessage == null) { IterableLogger.d(TAG, "Failed to get in-app for message ID: " + messageId); @@ -362,15 +364,13 @@ public void trackInAppClose(String messageId, Integer location, Integer source, // --------------------------------------------------------------------------------------- // region In App APIs - @ReactMethod - public void inAppConsume(String messageId, Integer location, Integer source) { - if (messageId == null) { - return; + public void inAppConsume(String messageId, double location, double source) { + if (messageId != null) { + IterableLogger.v(TAG, "inAppConsume"); + IterableApi.getInstance().inAppConsume(RNIterableInternal.getMessageById(messageId), Serialization.getIterableDeleteActionTypeFromInteger((int) source), Serialization.getIterableInAppLocationFromInteger((int) location)); } - IterableApi.getInstance().inAppConsume(RNIterableInternal.getMessageById(messageId), Serialization.getIterableDeleteActionTypeFromInteger(source), Serialization.getIterableInAppLocationFromInteger(location)); } - @ReactMethod public void getInAppMessages(Promise promise) { IterableLogger.d(TAG, "getMessages"); try { @@ -382,7 +382,6 @@ public void getInAppMessages(Promise promise) { } } - @ReactMethod public void getInboxMessages(Promise promise) { IterableLogger.d(TAG, "getInboxMessages"); try { @@ -394,16 +393,25 @@ public void getInboxMessages(Promise promise) { } } - @ReactMethod - public void setInAppShowResponse(Integer number) { + public void getUnreadInboxMessagesCount(Promise promise) { + IterableLogger.d(TAG, "getUnreadInboxMessagesCount"); + try { + int unreadCount = IterableApi.getInstance().getInAppManager().getUnreadInboxMessagesCount(); + promise.resolve(unreadCount); + } catch (Exception e) { + IterableLogger.e(TAG, e.getLocalizedMessage()); + promise.reject("", "Failed to get unread inbox messages count with error " + e.getLocalizedMessage()); + } + } + + public void setInAppShowResponse(double number) { IterableLogger.printInfo(); - inAppResponse = Serialization.getInAppResponse(number); + inAppResponse = Serialization.getInAppResponse((int) number); if (jsCallBackLatch != null) { jsCallBackLatch.countDown(); } } - @ReactMethod public void setAutoDisplayPaused(final boolean paused) { IterableLogger.printInfo(); UiThreadUtil.runOnUiThread(new Runnable() { @@ -414,7 +422,6 @@ public void run() { }); } - @ReactMethod public void wakeApp() { Intent launcherIntent = getMainActivityIntent(reactContext); launcherIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); @@ -440,19 +447,16 @@ public Intent getMainActivityIntent(Context context) { // --------------------------------------------------------------------------------------- // region Inbox In-App Session Tracking APIs - @ReactMethod public void startSession(ReadableArray visibleRows) { List serializedRows = Serialization.impressionsFromReadableArray(visibleRows); sessionManager.startSession(serializedRows); } - @ReactMethod public void endSession() { sessionManager.endSession(); } - @ReactMethod public void updateVisibleRows(ReadableArray visibleRows) { List serializedRows = Serialization.impressionsFromReadableArray(visibleRows); @@ -517,7 +521,7 @@ public boolean handleIterableCustomAction(@NonNull IterableAction action, @NonNu @NonNull @Override - public InAppResponse onNewInApp(@NonNull IterableInAppMessage message) { + public IterableInAppHandler.InAppResponse onNewInApp(@NonNull IterableInAppMessage message) { IterableLogger.printInfo(); JSONObject messageJson = RNIterableInternal.getInAppMessageJson(message); @@ -531,7 +535,7 @@ public InAppResponse onNewInApp(@NonNull IterableInAppMessage message) { return inAppResponse; } catch (InterruptedException | JSONException e) { IterableLogger.e(TAG, "new in-app module failed"); - return InAppResponse.SHOW; + return IterableInAppHandler.InAppResponse.SHOW; } } @@ -569,6 +573,26 @@ public String onAuthTokenRequested() { } } + @Override + public void onAuthFailure(AuthFailure authFailure) { + // Create a JSON object for the authFailure object + JSONObject messageJson = new JSONObject(); + try { + messageJson.put("userKey", authFailure.userKey); + messageJson.put("failedAuthToken", authFailure.failedAuthToken); + messageJson.put("failedRequestTime", authFailure.failedRequestTime); + messageJson.put("failureReason", authFailure.failureReason.name()); + WritableMap eventData = Serialization.convertJsonToMap(messageJson); + sendEvent(EventName.handleAuthFailureCalled.name(), eventData); + } catch (JSONException e) { + IterableLogger.v(TAG, "Failed to set authToken"); + } + } + + public void pauseAuthRetries(boolean pauseRetry) { + IterableApi.getInstance().pauseAuthRetries(pauseRetry); + } + @Override public void onTokenRegistrationSuccessful(String authToken) { IterableLogger.v(TAG, "authToken successfully set"); @@ -576,30 +600,20 @@ public void onTokenRegistrationSuccessful(String authToken) { sendEvent(EventName.handleAuthSuccessCalled.name(), null); } - @Override public void onTokenRegistrationFailed(Throwable object) { IterableLogger.v(TAG, "Failed to set authToken"); sendEvent(EventName.handleAuthFailureCalled.name(), null); } - @ReactMethod public void addListener(String eventName) { // Keep: Required for RN built in Event Emitter Calls. } - @ReactMethod - public void removeListeners(Integer count) { + public void removeListeners(double count) { // Keep: Required for RN built in Event Emitter Calls. } - // --------------------------------------------------------------------------------------- - // endregion - - // --------------------------------------------------------------------------------------- - // region Misc Bridge Functions - - @ReactMethod - public void passAlongAuthToken(String authToken) { + public void passAlongAuthToken(@Nullable String authToken) { passedAuthToken = authToken; if (authHandlerCallbackLatch != null) { @@ -615,17 +629,14 @@ public void sendEvent(@NonNull String eventName, @Nullable Object eventData) { public void onInboxUpdated() { sendEvent(EventName.receivedIterableInboxChanged.name(), null); } - - // --------------------------------------------------------------------------------------- - // endregion } enum EventName { - handleUrlCalled, - handleCustomActionCalled, - handleInAppCalled, - handleAuthCalled, - receivedIterableInboxChanged, - handleAuthSuccessCalled, - handleAuthFailureCalled + handleUrlCalled, + handleCustomActionCalled, + handleInAppCalled, + handleAuthCalled, + receivedIterableInboxChanged, + handleAuthSuccessCalled, + handleAuthFailureCalled } diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIPackage.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIPackage.java index 2b04e447c..3fade361b 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIPackage.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIPackage.java @@ -1,29 +1,46 @@ package com.iterable.reactnative; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.HashMap; +import java.util.Map; -import com.facebook.react.ReactPackage; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.facebook.react.BaseReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.uimanager.ViewManager; -import com.facebook.react.bridge.JavaScriptModule; +import com.facebook.react.module.model.ReactModuleInfo; +import com.facebook.react.module.model.ReactModuleInfoProvider; -public class RNIterableAPIPackage implements ReactPackage { +public class RNIterableAPIPackage extends BaseReactPackage { + @Nullable @Override - public List createNativeModules( - ReactApplicationContext reactContext) { - List modules = new ArrayList<>(); - - modules.add(new RNIterableAPIModule(reactContext)); - - return modules; + public NativeModule getModule(@NonNull String name, @NonNull ReactApplicationContext reactContext) { + if (RNIterableAPIModuleImpl.NAME.equals(name)) { + return new RNIterableAPIModule(reactContext); + } else { + return null; + } } + @NonNull @Override - public List createViewManagers(ReactApplicationContext reactContext) { - return Collections.emptyList(); + public ReactModuleInfoProvider getReactModuleInfoProvider() { + return new ReactModuleInfoProvider() { + @NonNull + @Override + public Map getReactModuleInfos() { + Map moduleInfos = new HashMap<>(); + boolean isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; + moduleInfos.put(RNIterableAPIModuleImpl.NAME, new ReactModuleInfo( + RNIterableAPIModuleImpl.NAME, + RNIterableAPIModuleImpl.NAME, + false, // canOverrideExistingModule + false, // needsEagerInit + false, // isCxxModule + isTurboModule // isTurboModule + )); + return moduleInfos; + } + }; } } diff --git a/android/src/main/java/com/iterable/reactnative/Serialization.java b/android/src/main/java/com/iterable/reactnative/Serialization.java index 3a1f536a6..92c549554 100644 --- a/android/src/main/java/com/iterable/reactnative/Serialization.java +++ b/android/src/main/java/com/iterable/reactnative/Serialization.java @@ -24,6 +24,7 @@ import com.iterable.iterableapi.IterableInboxSession; import com.iterable.iterableapi.IterableLogger; import com.iterable.iterableapi.RNIterableInternal; +import com.iterable.iterableapi.RetryPolicy; import org.json.JSONArray; import org.json.JSONException; @@ -94,7 +95,7 @@ static CommerceItem commerceItemFromMap(JSONObject itemMap) throws JSONException categories[i] = categoriesArray.getString(i); } } - + return new CommerceItem(itemMap.getString("id"), itemMap.getString("name"), itemMap.getDouble("price"), @@ -216,9 +217,17 @@ static IterableConfig.Builder getConfigFromReadableMap(ReadableMap iterableConte configBuilder.setDataRegion(iterableDataRegion); } - - if (iterableContextJSON.has("encryptionEnforced")) { - configBuilder.setEncryptionEnforced(iterableContextJSON.optBoolean("encryptionEnforced")); + + if (iterableContextJSON.has("retryPolicy")) { + JSONObject retryPolicyJson = iterableContextJSON.getJSONObject("retryPolicy"); + int maxRetry = retryPolicyJson.getInt("maxRetry"); + long retryInterval = retryPolicyJson.getLong("retryInterval"); + String retryBackoff = retryPolicyJson.getString("retryBackoff"); + RetryPolicy.Type retryPolicyType = RetryPolicy.Type.LINEAR; + if (retryBackoff.equals("EXPONENTIAL")) { + retryPolicyType = RetryPolicy.Type.EXPONENTIAL; + } + configBuilder.setAuthRetryPolicy(new RetryPolicy(maxRetry, retryInterval, retryPolicyType)); } return configBuilder; @@ -257,7 +266,13 @@ static JSONObject actionContextToJson(IterableActionContext iterableActionContex } static IterableInboxSession.Impression inboxImpressionFromMap(JSONObject impressionMap) throws JSONException { - return new IterableInboxSession.Impression(impressionMap.getString("messageId"), + // Add null check for messageId to prevent NullPointerException + String messageId = impressionMap.optString("messageId", null); + if (messageId == null || messageId.isEmpty()) { + throw new JSONException("messageId is null or empty"); + } + + return new IterableInboxSession.Impression(messageId, impressionMap.getBoolean("silentInbox"), impressionMap.optInt("displayCount", 0), (float) impressionMap.optDouble("duration", 0) @@ -271,8 +286,13 @@ static List impressionsFromReadableArray(Readab JSONArray impressionJsonArray = convertArrayToJson(array); for (int i = 0; i < impressionJsonArray.length(); i++) { - JSONObject impressionObj = impressionJsonArray.getJSONObject(i); - list.add(inboxImpressionFromMap(impressionObj)); + try { + JSONObject impressionObj = impressionJsonArray.getJSONObject(i); + list.add(inboxImpressionFromMap(impressionObj)); + } catch (JSONException e) { + // Skip invalid entries instead of failing completely + IterableLogger.w(TAG, "Skipping invalid impression at index " + i + ": " + e.getLocalizedMessage()); + } } } catch (JSONException e) { IterableLogger.e(TAG, "Failed converting to JSONObject"); @@ -286,7 +306,7 @@ static List impressionsFromReadableArray(Readab // --------------------------------------------------------------------------------------- // region React Native JSON conversion methods // obtained from https://gist.github.com/viperwarp/2beb6bbefcc268dee7ad - + static WritableMap convertJsonToMap(JSONObject jsonObject) throws JSONException { WritableMap map = new WritableNativeMap(); diff --git a/android/src/newarch/java/com/RNIterableAPIModule.java b/android/src/newarch/java/com/RNIterableAPIModule.java new file mode 100644 index 000000000..f145bab10 --- /dev/null +++ b/android/src/newarch/java/com/RNIterableAPIModule.java @@ -0,0 +1,234 @@ +package com.iterable.reactnative; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.iterable.iterableapi.AuthFailure; +import com.iterable.iterableapi.IterableLogger; + +public class RNIterableAPIModule extends NativeRNIterableAPISpec { + private final ReactApplicationContext reactContext; + private static RNIterableAPIModuleImpl moduleImpl; + + RNIterableAPIModule(ReactApplicationContext context) { + super(context); + this.reactContext = context; + if (moduleImpl == null) { + moduleImpl = new RNIterableAPIModuleImpl(reactContext); + } + } + + @Override + @NonNull + public String getName() { + return RNIterableAPIModuleImpl.NAME; + } + + @Override + public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, String version, Promise promise) { + moduleImpl.initializeWithApiKey(apiKey, configReadableMap, version, promise); + } + + @Override + public void initialize2WithApiKey(String apiKey, ReadableMap configReadableMap, String version, String apiEndPointOverride, Promise promise) { + moduleImpl.initialize2WithApiKey(apiKey, configReadableMap, version, apiEndPointOverride, promise); + } + + @Override + public void setEmail(@Nullable String email, @Nullable String authToken) { + moduleImpl.setEmail(email, authToken); + } + + @Override + public void updateEmail(String email, @Nullable String authToken) { + moduleImpl.updateEmail(email, authToken); + } + + @Override + public void getEmail(Promise promise) { + moduleImpl.getEmail(promise); + } + + public void sampleMethod(String stringArgument, int numberArgument, Callback callback) { + moduleImpl.sampleMethod(stringArgument, numberArgument, callback); + } + + @Override + public void setUserId(@Nullable String userId, @Nullable String authToken) { + moduleImpl.setUserId(userId, authToken); + } + + @Override + public void updateUser(ReadableMap dataFields, boolean mergeNestedObjects) { + moduleImpl.updateUser(dataFields, mergeNestedObjects); + } + + @Override + public void getUserId(Promise promise) { + moduleImpl.getUserId(promise); + } + + @Override + public void trackEvent(String name, @Nullable ReadableMap dataFields) { + moduleImpl.trackEvent(name, dataFields); + } + + @Override + public void updateCart(ReadableArray items) { + moduleImpl.updateCart(items); + } + + @Override + public void trackPurchase(double total, ReadableArray items, @Nullable ReadableMap dataFields) { + moduleImpl.trackPurchase(total, items, dataFields); + } + + @Override + public void trackPushOpenWithCampaignId(double campaignId, @Nullable Double templateId, String messageId, boolean appAlreadyRunning, @Nullable ReadableMap dataFields) { + moduleImpl.trackPushOpenWithCampaignId(campaignId, templateId, messageId, appAlreadyRunning, dataFields); + } + + @Override + public void updateSubscriptions(@Nullable ReadableArray emailListIds, @Nullable ReadableArray unsubscribedChannelIds, @Nullable ReadableArray unsubscribedMessageTypeIds, @Nullable ReadableArray subscribedMessageTypeIds, double campaignId, double templateId) { + moduleImpl.updateSubscriptions(emailListIds, unsubscribedChannelIds, unsubscribedMessageTypeIds, subscribedMessageTypeIds, campaignId, templateId); + } + + @Override + public void showMessage(String messageId, boolean consume, final Promise promise) { + moduleImpl.showMessage(messageId, consume, promise); + } + + @Override + public void setReadForMessage(String messageId, boolean read) { + moduleImpl.setReadForMessage(messageId, read); + } + + @Override + public void removeMessage(String messageId, double location, double deleteSource) { + moduleImpl.removeMessage(messageId, location, deleteSource); + } + + @Override + public void getHtmlInAppContentForMessage(String messageId, final Promise promise) { + moduleImpl.getHtmlInAppContentForMessage(messageId, promise); + } + + @Override + public void getAttributionInfo(Promise promise) { + moduleImpl.getAttributionInfo(promise); + } + + @Override + public void setAttributionInfo(@Nullable ReadableMap attributionInfoReadableMap) { + moduleImpl.setAttributionInfo(attributionInfoReadableMap); + } + + @Override + public void getLastPushPayload(Promise promise) { + moduleImpl.getLastPushPayload(promise); + } + + @Override + public void disableDeviceForCurrentUser() { + moduleImpl.disableDeviceForCurrentUser(); + } + + @Override + public void handleAppLink(String uri, Promise promise) { + moduleImpl.handleAppLink(uri, promise); + } + + @Override + public void trackInAppOpen(String messageId, double location) { + moduleImpl.trackInAppOpen(messageId, location); + } + + @Override + public void trackInAppClick(String messageId, double location, String clickedUrl) { + moduleImpl.trackInAppClick(messageId, location, clickedUrl); + } + + @Override + public void trackInAppClose(String messageId, double location, double source, @Nullable String clickedUrl) { + moduleImpl.trackInAppClose(messageId, location, source, clickedUrl); + } + + @Override + public void inAppConsume(String messageId, double location, double source) { + moduleImpl.inAppConsume(messageId, location, source); + } + + @Override + public void getInAppMessages(Promise promise) { + moduleImpl.getInAppMessages(promise); + } + + @Override + public void getInboxMessages(Promise promise) { + moduleImpl.getInboxMessages(promise); + } + + @Override + public void getUnreadInboxMessagesCount(Promise promise) { + moduleImpl.getUnreadInboxMessagesCount(promise); + } + + @Override + public void setInAppShowResponse(double number) { + moduleImpl.setInAppShowResponse(number); + } + + @Override + public void setAutoDisplayPaused(final boolean paused) { + moduleImpl.setAutoDisplayPaused(paused); + } + + public void wakeApp() { + moduleImpl.wakeApp(); + } + + @Override + public void startSession(ReadableArray visibleRows) { + moduleImpl.startSession(visibleRows); + } + + @Override + public void endSession() { + moduleImpl.endSession(); + } + + public void updateVisibleRows(ReadableArray visibleRows) { + moduleImpl.updateVisibleRows(visibleRows); + } + + @Override + public void addListener(String eventName) { + moduleImpl.addListener(eventName); + } + + @Override + public void removeListeners(double count) { + moduleImpl.removeListeners(count); + } + + public void passAlongAuthToken(@Nullable String authToken) { + moduleImpl.passAlongAuthToken(authToken); + } + + @Override + public void pauseAuthRetries(boolean pauseRetry) { + moduleImpl.pauseAuthRetries(pauseRetry); + } + + public void sendEvent(@NonNull String eventName, @Nullable Object eventData) { + moduleImpl.sendEvent(eventName, eventData); + } + + public void onInboxUpdated() { + moduleImpl.onInboxUpdated(); + } +} diff --git a/android/src/oldarch/java/com/RNIterableAPIModule.java b/android/src/oldarch/java/com/RNIterableAPIModule.java new file mode 100644 index 000000000..c3a72339b --- /dev/null +++ b/android/src/oldarch/java/com/RNIterableAPIModule.java @@ -0,0 +1,239 @@ +package com.iterable.reactnative; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; + +public class RNIterableAPIModule extends ReactContextBaseJavaModule { + private final ReactApplicationContext reactContext; + private static RNIterableAPIModuleImpl moduleImpl; + + RNIterableAPIModule(ReactApplicationContext context) { + super(context); + this.reactContext = context; + if (moduleImpl == null) { + moduleImpl = new RNIterableAPIModuleImpl(reactContext); + } + } + + @NonNull + @Override + public String getName() { + return RNIterableAPIModuleImpl.NAME; + } + + @ReactMethod + public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, String version, Promise promise) { + moduleImpl.initializeWithApiKey(apiKey, configReadableMap, version, promise); + } + + @ReactMethod + public void initialize2WithApiKey(String apiKey, ReadableMap configReadableMap, String version, String apiEndPointOverride, Promise promise) { + moduleImpl.initialize2WithApiKey(apiKey, configReadableMap, version, apiEndPointOverride, promise); + } + + @ReactMethod + public void setEmail(@Nullable String email, @Nullable String authToken) { + moduleImpl.setEmail(email, authToken); + } + + @ReactMethod + public void updateEmail(String email, @Nullable String authToken) { + moduleImpl.updateEmail(email, authToken); + } + + @ReactMethod + public void getEmail(Promise promise) { + moduleImpl.getEmail(promise); + } + + @ReactMethod + public void sampleMethod(String stringArgument, int numberArgument, Callback callback) { + moduleImpl.sampleMethod(stringArgument, numberArgument, callback); + } + + @ReactMethod + public void setUserId(@Nullable String userId, @Nullable String authToken) { + moduleImpl.setUserId(userId, authToken); + } + + @ReactMethod + public void updateUser(ReadableMap dataFields, boolean mergeNestedObjects) { + moduleImpl.updateUser(dataFields, mergeNestedObjects); + } + + @ReactMethod + public void getUserId(Promise promise) { + moduleImpl.getUserId(promise); + } + + @ReactMethod + public void trackEvent(String name, @Nullable ReadableMap dataFields) { + moduleImpl.trackEvent(name, dataFields); + } + + @ReactMethod + public void updateCart(ReadableArray items) { + moduleImpl.updateCart(items); + } + + @ReactMethod + public void trackPurchase(double total, ReadableArray items, @Nullable ReadableMap dataFields) { + moduleImpl.trackPurchase(total, items, dataFields); + } + + @ReactMethod + public void trackPushOpenWithCampaignId(double campaignId, @Nullable Double templateId, String messageId, boolean appAlreadyRunning, @Nullable ReadableMap dataFields) { + moduleImpl.trackPushOpenWithCampaignId(campaignId, templateId, messageId, appAlreadyRunning, dataFields); + } + + @ReactMethod + public void updateSubscriptions(@Nullable ReadableArray emailListIds, @Nullable ReadableArray unsubscribedChannelIds, @Nullable ReadableArray unsubscribedMessageTypeIds, @Nullable ReadableArray subscribedMessageTypeIds, double campaignId, double templateId) { + moduleImpl.updateSubscriptions(emailListIds, unsubscribedChannelIds, unsubscribedMessageTypeIds, subscribedMessageTypeIds, campaignId, templateId); + } + + @ReactMethod + public void showMessage(String messageId, boolean consume, final Promise promise) { + moduleImpl.showMessage(messageId, consume, promise); + } + + @ReactMethod + public void setReadForMessage(String messageId, boolean read) { + moduleImpl.setReadForMessage(messageId, read); + } + + @ReactMethod + public void removeMessage(String messageId, double location, double deleteSource) { + moduleImpl.removeMessage(messageId, location, deleteSource); + } + + @ReactMethod + public void getHtmlInAppContentForMessage(String messageId, final Promise promise) { + moduleImpl.getHtmlInAppContentForMessage(messageId, promise); + } + + @ReactMethod + public void getAttributionInfo(Promise promise) { + moduleImpl.getAttributionInfo(promise); + } + + @ReactMethod + public void setAttributionInfo(@Nullable ReadableMap attributionInfoReadableMap) { + moduleImpl.setAttributionInfo(attributionInfoReadableMap); + } + + @ReactMethod + public void getLastPushPayload(Promise promise) { + moduleImpl.getLastPushPayload(promise); + } + + @ReactMethod + public void disableDeviceForCurrentUser() { + moduleImpl.disableDeviceForCurrentUser(); + } + + @ReactMethod + public void handleAppLink(String uri, Promise promise) { + moduleImpl.handleAppLink(uri, promise); + } + + @ReactMethod + public void trackInAppOpen(String messageId, double location) { + moduleImpl.trackInAppOpen(messageId, location); + } + + @ReactMethod + public void trackInAppClick(String messageId, double location, String clickedUrl) { + moduleImpl.trackInAppClick(messageId, location, clickedUrl); + } + + @ReactMethod + public void trackInAppClose(String messageId, double location, double source, @Nullable String clickedUrl) { + moduleImpl.trackInAppClose(messageId, location, source, clickedUrl); + } + + @ReactMethod + public void inAppConsume(String messageId, double location, double source) { + moduleImpl.inAppConsume(messageId, location, source); + } + + @ReactMethod + public void getInAppMessages(Promise promise) { + moduleImpl.getInAppMessages(promise); + } + + @ReactMethod + public void getInboxMessages(Promise promise) { + moduleImpl.getInboxMessages(promise); + } + + @ReactMethod + public void getUnreadInboxMessagesCount(Promise promise) { + moduleImpl.getUnreadInboxMessagesCount(promise); + } + + @ReactMethod + public void setInAppShowResponse(double number) { + moduleImpl.setInAppShowResponse(number); + } + + @ReactMethod + public void setAutoDisplayPaused(final boolean paused) { + moduleImpl.setAutoDisplayPaused(paused); + } + + @ReactMethod + public void wakeApp() { + moduleImpl.wakeApp(); + } + + @ReactMethod + public void startSession(ReadableArray visibleRows) { + moduleImpl.startSession(visibleRows); + } + + @ReactMethod + public void endSession() { + moduleImpl.endSession(); + } + + @ReactMethod + public void updateVisibleRows(ReadableArray visibleRows) { + moduleImpl.updateVisibleRows(visibleRows); + } + + @ReactMethod + public void addListener(String eventName) { + moduleImpl.addListener(eventName); + } + + @ReactMethod + public void removeListeners(double count) { + moduleImpl.removeListeners(count); + } + + @ReactMethod + public void passAlongAuthToken(@Nullable String authToken) { + moduleImpl.passAlongAuthToken(authToken); + } + + @ReactMethod + public void pauseAuthRetries(boolean pauseRetry) { + moduleImpl.pauseAuthRetries(pauseRetry); + } + + + public void sendEvent(@NonNull String eventName, @Nullable Object eventData) { + moduleImpl.sendEvent(eventName, eventData); + } + + void onInboxUpdated() { + moduleImpl.onInboxUpdated(); + } +} diff --git a/example/README.md b/example/README.md index 3b19f26e9..4ba5d0e6d 100644 --- a/example/README.md +++ b/example/README.md @@ -211,14 +211,12 @@ gem install xcodeproj -v '< 1.26.0' gem install concurrent-ruby -v '< 1.3.4' ``` -## Unable to build on Xcode 16.3 +## Xcode 16.3 Issue There is a [known issue](https://github.com/facebook/react-native/issues/50411) with Xcode 16.3 and react-native@0.75.3. -Until New Architecture is supporter by Iterable, we cannot upgrade to 0.76. -Therefore, to fix it we need to downgrade Xcode to 16.2. -- [Download Xcode 16.2](https://download.developer.apple.com/Developer_Tools/Xcode_16.2/Xcode_16.2.xip) +This SDK supports React Native New Architecture. If you encounter this Xcode-specific issue, consider downgrading Xcode to 16.2 or upgrading React Native once a fix is available. ## Other If things are not working and you are stumped as to why, try running the @@ -272,4 +270,4 @@ export NODE_OPTIONS=--openssl-legacy-provider You should also look through the [React Native environment setup docs](https://reactnative.dev/docs/set-up-your-environment) and make sure that -you did not miss anything. \ No newline at end of file +you did not miss anything. diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index e1892528b..ca5b5e90c 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,26 +1,34 @@ - + + - + + + + + + + + - - - - - - - - + android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" + android:launchMode="singleTask" + android:windowSoftInputMode="adjustResize" + android:exported="true"> + + + + + + + \ No newline at end of file diff --git a/example/ios/Podfile b/example/ios/Podfile index 833bd46c8..43e1952fb 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -13,7 +13,8 @@ prepare_react_native_project! linkage = ENV['USE_FRAMEWORKS'] if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green - use_frameworks! :linkage => linkage.to_sym + # IMPORTANT: This is needed to use the Swift code from Iterable-iOS-SDK in the RNIterableAPI module + use_frameworks! :linkage => :dynamic end target 'ReactNativeSdkExample' do diff --git a/example/ios/ReactNativeSdkExample-Bridging-Header.h b/example/ios/ReactNativeSdkExample-Bridging-Header.h index e11d920b1..339994e93 100644 --- a/example/ios/ReactNativeSdkExample-Bridging-Header.h +++ b/example/ios/ReactNativeSdkExample-Bridging-Header.h @@ -1,3 +1,4 @@ // -// Use this file to import your target's public headers that you would like to expose to Swift. +// Use this file to import your target's public headers that you would like to +// expose to Swift. // diff --git a/example/ios/ReactNativeSdkExample.xcodeproj/project.pbxproj b/example/ios/ReactNativeSdkExample.xcodeproj/project.pbxproj index 85e3e2153..2bf23431b 100644 --- a/example/ios/ReactNativeSdkExample.xcodeproj/project.pbxproj +++ b/example/ios/ReactNativeSdkExample.xcodeproj/project.pbxproj @@ -12,7 +12,7 @@ 779227342DFA3FB500D69EC0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 779227332DFA3FB500D69EC0 /* AppDelegate.swift */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; A3A40C20801B8F02005FA4C0 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1FC6B09E65A7BD9F6864C5D8 /* PrivacyInfo.xcprivacy */; }; - C44ACECC9AF4C133F6AA90BB /* libPods-ReactNativeSdkExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3FDE7B97F1D85673BE213502 /* libPods-ReactNativeSdkExample.a */; }; + CC7C0C660DB585466CC95446 /* libPods-ReactNativeSdkExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D7C71B2515F0E53180477AEC /* libPods-ReactNativeSdkExample.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -29,18 +29,18 @@ 00E356EE1AD99517003FC87E /* ReactNativeSdkExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReactNativeSdkExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* ReactNativeSdkExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ReactNativeSdkExampleTests.m; sourceTree = ""; }; + 054F9627BFE1F378023F2570 /* Pods-ReactNativeSdkExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeSdkExample.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample.debug.xcconfig"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* ReactNativeSdkExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ReactNativeSdkExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ReactNativeSdkExample/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ReactNativeSdkExample/Info.plist; sourceTree = ""; }; 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = ReactNativeSdkExample/PrivacyInfo.xcprivacy; sourceTree = ""; }; 1FC6B09E65A7BD9F6864C5D8 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = ReactNativeSdkExample/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 2659F7AEA92EF5F6D507914F /* Pods-ReactNativeSdkExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeSdkExample.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample.release.xcconfig"; sourceTree = ""; }; - 26BBADD2F086D341C535B27B /* Pods-ReactNativeSdkExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeSdkExample.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample.debug.xcconfig"; sourceTree = ""; }; - 3FDE7B97F1D85673BE213502 /* libPods-ReactNativeSdkExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeSdkExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BE74655C68E80463F6CD81B /* Pods-ReactNativeSdkExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeSdkExample.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample.release.xcconfig"; sourceTree = ""; }; 779227312DFA3FB500D69EC0 /* ReactNativeSdkExample-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ReactNativeSdkExample-Bridging-Header.h"; sourceTree = ""; }; 779227322DFA3FB500D69EC0 /* ReactNativeSdkExampleTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ReactNativeSdkExampleTests-Bridging-Header.h"; sourceTree = ""; }; 779227332DFA3FB500D69EC0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = ReactNativeSdkExample/AppDelegate.swift; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = ReactNativeSdkExample/LaunchScreen.storyboard; sourceTree = ""; }; + D7C71B2515F0E53180477AEC /* libPods-ReactNativeSdkExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeSdkExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ @@ -56,7 +56,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C44ACECC9AF4C133F6AA90BB /* libPods-ReactNativeSdkExample.a in Frameworks */, + CC7C0C660DB585466CC95446 /* libPods-ReactNativeSdkExample.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -99,7 +99,7 @@ isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 3FDE7B97F1D85673BE213502 /* libPods-ReactNativeSdkExample.a */, + D7C71B2515F0E53180477AEC /* libPods-ReactNativeSdkExample.a */, ); name = Frameworks; sourceTree = ""; @@ -138,8 +138,8 @@ BBD78D7AC51CEA395F1C20DB /* Pods */ = { isa = PBXGroup; children = ( - 26BBADD2F086D341C535B27B /* Pods-ReactNativeSdkExample.debug.xcconfig */, - 2659F7AEA92EF5F6D507914F /* Pods-ReactNativeSdkExample.release.xcconfig */, + 054F9627BFE1F378023F2570 /* Pods-ReactNativeSdkExample.debug.xcconfig */, + 2BE74655C68E80463F6CD81B /* Pods-ReactNativeSdkExample.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -169,13 +169,13 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ReactNativeSdkExample" */; buildPhases = ( - CA97E382C6B453F847C13176 /* [CP] Check Pods Manifest.lock */, + 787BEB56F90C9C0AEE4C88D5 /* [CP] Check Pods Manifest.lock */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 89B6BEF2485B9536DDD45973 /* [CP] Embed Pods Frameworks */, - 24A6D3DBDA584D8F55796A6D /* [CP] Copy Pods Resources */, + 152370F00B0C82FBF20ABDA2 /* [CP] Embed Pods Frameworks */, + 6099F4827CE15646F9A0205B /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -260,41 +260,41 @@ shellPath = /bin/sh; shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; - 24A6D3DBDA584D8F55796A6D /* [CP] Copy Pods Resources */ = { + 152370F00B0C82FBF20ABDA2 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-resources-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-resources-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 89B6BEF2485B9536DDD45973 /* [CP] Embed Pods Frameworks */ = { + 6099F4827CE15646F9A0205B /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ReactNativeSdkExample/Pods-ReactNativeSdkExample-resources.sh\"\n"; showEnvVarsInLog = 0; }; - CA97E382C6B453F847C13176 /* [CP] Check Pods Manifest.lock */ = { + 787BEB56F90C9C0AEE4C88D5 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -406,7 +406,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 26BBADD2F086D341C535B27B /* Pods-ReactNativeSdkExample.debug.xcconfig */; + baseConfigurationReference = 054F9627BFE1F378023F2570 /* Pods-ReactNativeSdkExample.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -436,7 +436,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2659F7AEA92EF5F6D507914F /* Pods-ReactNativeSdkExample.release.xcconfig */; + baseConfigurationReference = 2BE74655C68E80463F6CD81B /* Pods-ReactNativeSdkExample.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; diff --git a/example/ios/ReactNativeSdkExample/AppDelegate.swift b/example/ios/ReactNativeSdkExample/AppDelegate.swift index 1f3fbca7c..677a4fa9d 100644 --- a/example/ios/ReactNativeSdkExample/AppDelegate.swift +++ b/example/ios/ReactNativeSdkExample/AppDelegate.swift @@ -9,6 +9,9 @@ import UIKit import React import React_RCTAppDelegate import ReactAppDependencyProvider +import UserNotifications + +import IterableSDK @main class AppDelegate: UIResponder, UIApplicationDelegate { @@ -21,6 +24,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil ) -> Bool { + ITBInfo() + let delegate = ReactNativeDelegate() let factory = RCTReactNativeFactory(delegate: delegate) delegate.dependencyProvider = RCTAppDependencyProvider() @@ -36,8 +41,65 @@ class AppDelegate: UIResponder, UIApplicationDelegate { launchOptions: launchOptions ) + setupUserNotificationCenter() + return true } + + func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + ITBInfo() + IterableAPI.register(token: deviceToken) + } + + func application(_ application: UIApplication, + didFailToRegisterForRemoteNotificationsWithError + error: Error) { + ITBInfo("error: \(error)") + } + + func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + ITBInfo() + IterableAppIntegration.application(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: completionHandler) + } + + func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { + ITBInfo() + guard let url = userActivity.webpageURL else { + return false + } + + return IterableAPI.handle(universalLink: url) + } + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { + ITBInfo() + return RCTLinkingManager.application(app, open: url, options: options) + } + + private func setupUserNotificationCenter() { + UNUserNotificationCenter.current().delegate = self + UNUserNotificationCenter.current().getNotificationSettings { settings in + if settings.authorizationStatus != .authorized { + ITBInfo("Not authorized") + // not authorized, ask for permission + UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { success, _ in + ITBInfo("auth: \(success)") + if success { + DispatchQueue.main.async { + UIApplication.shared.registerForRemoteNotifications() + } + } + // TODO: Handle error etc. + } + } else { + // already authorized + ITBInfo("Already authorized") + DispatchQueue.main.async { + UIApplication.shared.registerForRemoteNotifications() + } + } + } + } } class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { @@ -54,3 +116,14 @@ class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { } } +extension AppDelegate: UNUserNotificationCenterDelegate { + // App is running in the foreground + public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { + completionHandler([.alert, .badge, .sound]) + } + + // The method will be called on the delegate when the user responded to the notification by opening the application, dismissing the notification or choosing a UNNotificationAction. The delegate must be set before the application returns from applicationDidFinishLaunching:. + public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { + IterableAppIntegration.userNotificationCenter(center, didReceive: response, withCompletionHandler: completionHandler) + } +} diff --git a/example/ios/ReactNativeSdkExampleTests-Bridging-Header.h b/example/ios/ReactNativeSdkExampleTests-Bridging-Header.h index 1b2cb5d6d..339994e93 100644 --- a/example/ios/ReactNativeSdkExampleTests-Bridging-Header.h +++ b/example/ios/ReactNativeSdkExampleTests-Bridging-Header.h @@ -1,4 +1,4 @@ // -// Use this file to import your target's public headers that you would like to expose to Swift. +// Use this file to import your target's public headers that you would like to +// expose to Swift. // - diff --git a/example/package.json b/example/package.json index 40ca703a4..f48f8af07 100644 --- a/example/package.json +++ b/example/package.json @@ -10,17 +10,17 @@ "build:ios": "react-native build-ios --scheme ReactNativeSdkExample --mode Debug --extra-params \"-sdk iphonesimulator CC=clang CPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ GCC_OPTIMIZATION_LEVEL=0 GCC_PRECOMPILE_PREFIX_HEADER=YES ASSETCATALOG_COMPILER_OPTIMIZATION=time DEBUG_INFORMATION_FORMAT=dwarf COMPILER_INDEX_STORE_ENABLE=NO\"" }, "dependencies": { - "@react-navigation/bottom-tabs": "^6.6.1", - "@react-navigation/native": "^6.0.8", - "@react-navigation/native-stack": "^6.11.0", - "@react-navigation/stack": "^6.3.21", + "@react-navigation/bottom-tabs": "^7.0.0", + "@react-navigation/native": "^7.1.14", + "@react-navigation/native-stack": "^7.0.0", + "@react-navigation/stack": "^7.4.2", "react": "19.0.0", "react-native": "0.79.3", - "react-native-gesture-handler": "^2.24.0", - "react-native-safe-area-context": "^5.1.0", - "react-native-screens": "^4.9.1", + "react-native-gesture-handler": "^2.26.0", + "react-native-safe-area-context": "^5.4.0", + "react-native-screens": "^4.10.0", "react-native-vector-icons": "^10.2.0", - "react-native-webview": "^13.13.1" + "react-native-webview": "^13.14.1" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/example/src/components/App/App.constants.ts b/example/src/components/App/App.constants.ts index f84c390cb..4710a6ba9 100644 --- a/example/src/components/App/App.constants.ts +++ b/example/src/components/App/App.constants.ts @@ -2,6 +2,7 @@ import { Route } from '../../constants'; export const routeIcon = { [Route.Commerce]: 'cash-outline', + [Route.Embedded]: 'chatbubble-outline', [Route.Inbox]: 'mail-outline', [Route.User]: 'person-outline', }; diff --git a/example/src/components/App/App.tsx b/example/src/components/App/App.tsx index 42769db1d..d71b9fe95 100644 --- a/example/src/components/App/App.tsx +++ b/example/src/components/App/App.tsx @@ -1,16 +1,59 @@ +/* eslint-disable react-native/split-platform-components */ import { createNativeStackNavigator } from '@react-navigation/native-stack'; +import { useEffect } from 'react'; +import { PermissionsAndroid, Platform } from 'react-native'; import { Route } from '../../constants/routes'; import { useIterableApp } from '../../hooks/useIterableApp'; +import type { RootStackParamList } from '../../types'; import { Login } from '../Login'; import { Main } from './Main'; -import type { RootStackParamList } from '../../types'; const Stack = createNativeStackNavigator(); +const requestNotificationPermission = async () => { + if (Platform.OS === 'android') { + const apiLevel = Platform.Version; // Get the Android API level + + if (apiLevel >= 33) { + // Check if Android 13 or higher + try { + const granted = await PermissionsAndroid.request( + PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS, + { + title: 'Notification Permission', + message: + 'This app needs access to your notifications for push, in-app messages, embedded messages and more.', + buttonNeutral: 'Ask Me Later', + buttonNegative: 'Cancel', + buttonPositive: 'OK', + } + ); + if (granted === PermissionsAndroid.RESULTS.GRANTED) { + console.log('Notification permission granted'); + } else { + console.log('Notification permission denied'); + } + } catch (err) { + console.warn(err); + } + } else { + // For Android versions below 13, notification permission is generally not required + // or is automatically granted upon app installation. + console.log( + 'Notification permission not required for this Android version.' + ); + } + } +}; + export const App = () => { const { isLoggedIn } = useIterableApp(); + useEffect(() => { + requestNotificationPermission(); + }, []); + return ( {isLoggedIn ? ( diff --git a/example/src/components/Embedded/Embedded.styles.ts b/example/src/components/Embedded/Embedded.styles.ts new file mode 100644 index 000000000..9dc6aea47 --- /dev/null +++ b/example/src/components/Embedded/Embedded.styles.ts @@ -0,0 +1,21 @@ +import { StyleSheet } from 'react-native'; +import { button, buttonText, container, hr } from '../../constants'; + +const styles = StyleSheet.create({ + button, + buttonText, + container: { ...container, paddingHorizontal: 0 }, + embeddedSection: { + display: 'flex', + flexDirection: 'column', + gap: 16, + paddingHorizontal: 16, + }, + hr, + text: { textAlign: 'center' }, + utilitySection: { + paddingHorizontal: 16, + }, +}); + +export default styles; diff --git a/example/src/components/Embedded/Embedded.tsx b/example/src/components/Embedded/Embedded.tsx new file mode 100644 index 000000000..806bb0c23 --- /dev/null +++ b/example/src/components/Embedded/Embedded.tsx @@ -0,0 +1,13 @@ +import { Text, View } from 'react-native'; + +import styles from './Embedded.styles'; + +export const Embedded = () => { + return ( + + EMBEDDED + + ); +}; + +export default Embedded; diff --git a/example/src/components/Embedded/index.ts b/example/src/components/Embedded/index.ts new file mode 100644 index 000000000..908767962 --- /dev/null +++ b/example/src/components/Embedded/index.ts @@ -0,0 +1,2 @@ +export * from './Embedded'; +export { default } from './Embedded'; diff --git a/example/src/components/Login/Login.tsx b/example/src/components/Login/Login.tsx index e32563398..9712792ed 100644 --- a/example/src/components/Login/Login.tsx +++ b/example/src/components/Login/Login.tsx @@ -44,7 +44,7 @@ export const Login = ({ navigation }: RootStackScreenProps) => { void; /** The user ID for the user */ - userId?: string; + userId?: string | null; } const IterableAppContext = createContext({ @@ -79,7 +81,7 @@ const IterableAppContext = createContext({ setLoginInProgress: () => undefined, setReturnToInboxTrigger: () => undefined, setUserId: () => undefined, - userId: undefined, + userId: null, }); const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; @@ -96,7 +98,9 @@ export const IterableAppProvider: FunctionComponent< const [apiKey, setApiKey] = useState( process.env.ITBL_API_KEY ); - const [userId, setUserId] = useState(process.env.ITBL_ID); + const [userId, setUserId] = useState( + process.env.ITBL_ID ?? null + ); const [loginInProgress, setLoginInProgress] = useState(false); const getUserId = useCallback(() => userId ?? process.env.ITBL_ID, [userId]); @@ -124,6 +128,26 @@ export const IterableAppProvider: FunctionComponent< config.inAppDisplayInterval = 1.0; // Min gap between in-apps. No need to set this in production. + config.retryPolicy = { + maxRetry: 5, + retryInterval: 10, + retryBackoff: IterableRetryBackoff.LINEAR, + }; + + config.onJWTError = (authFailure) => { + console.log('onJWTError', authFailure); + + const failureReason = + typeof authFailure.failureReason === 'string' + ? authFailure.failureReason + : IterableAuthFailureReason[authFailure.failureReason]; + + Alert.alert( + `Error fetching JWT: ${failureReason}`, + `Token: ${authFailure.failedAuthToken}` + ); + }; + config.urlHandler = (url: string) => { const routeNames = [Route.Commerce, Route.Inbox, Route.User]; for (const route of routeNames) { @@ -149,6 +173,22 @@ export const IterableAppProvider: FunctionComponent< config.inAppHandler = () => IterableInAppShowResponse.show; + // NOTE: Uncomment to test authHandler failure + // config.authHandler = () => { + // console.log(`authHandler`); + + // return Promise.resolve({ + // authToken: 'SomethingNotValid', + // successCallback: () => { + // console.log(`authHandler > success`); + // }, + // // This is not firing + // failureCallback: () => { + // console.log(`authHandler > failure`); + // }, + // }); + // }; + setItblConfig(config); const key = apiKey ?? process.env.ITBL_API_KEY; @@ -196,8 +236,8 @@ export const IterableAppProvider: FunctionComponent< ); const logout = useCallback(() => { - Iterable.setEmail(undefined); - Iterable.setUserId(undefined); + Iterable.setEmail(null); + Iterable.setUserId(null); setIsLoggedIn(false); }, []); diff --git a/example/src/types/navigation.ts b/example/src/types/navigation.ts index 5b5ad8a50..e3038d088 100644 --- a/example/src/types/navigation.ts +++ b/example/src/types/navigation.ts @@ -10,6 +10,7 @@ import { Route } from '../constants/routes'; export type MainScreenParamList = { [Route.Commerce]: undefined; [Route.Inbox]: undefined; + [Route.Embedded]: undefined; [Route.User]: undefined; }; diff --git a/ios/RNIterableAPI/RNIterable-Bridging-Header.h b/ios/RNIterableAPI/RNIterable-Bridging-Header.h index 35adb4320..01c1c3fb6 100644 --- a/ios/RNIterableAPI/RNIterable-Bridging-Header.h +++ b/ios/RNIterableAPI/RNIterable-Bridging-Header.h @@ -1,5 +1,6 @@ // -// Use this file to import your target's public headers that you would like to expose to Swift. +// Use this file to import your target's public headers that you would like to +// expose to Swift. // #import diff --git a/ios/RNIterableAPI/RNIterableAPI.h b/ios/RNIterableAPI/RNIterableAPI.h index 26bbf81fe..a8b725452 100644 --- a/ios/RNIterableAPI/RNIterableAPI.h +++ b/ios/RNIterableAPI/RNIterableAPI.h @@ -1,9 +1,18 @@ -// -// RNIterableAPI.h -// RNIterableAPI -// -// Created by Loren Posen on 6/11/25. -// Copyright © 2025 Iterable. All rights reserved. -// -#import +#import +#import +#if RCT_NEW_ARCH_ENABLED + + #import + #import + #import + #import +@interface RNIterableAPI : RCTEventEmitter + +#else + #import +@interface RNIterableAPI : RCTEventEmitter + +#endif + +@end diff --git a/ios/RNIterableAPI/RNIterableAPI.mm b/ios/RNIterableAPI/RNIterableAPI.mm index dc40a6e12..91955f797 100644 --- a/ios/RNIterableAPI/RNIterableAPI.mm +++ b/ios/RNIterableAPI/RNIterableAPI.mm @@ -1,139 +1,516 @@ -// -// Created by Tapash Majumder on 3/19/20. -// Copyright © 2020 Iterable. All rights reserved. -// #import "RNIterableAPI.h" -@interface RCT_EXTERN_REMAP_MODULE(RNIterableAPI, ReactIterableAPI, NSObject) +#if RCT_NEW_ARCH_ENABLED + #import "RNIterableAPISpec.h" +#endif -// MARK: - Native SDK Functions +#import -RCT_EXTERN_METHOD(initializeWithApiKey: (nonnull NSString *) apiKey - config: (nonnull NSDictionary *) config - version: (nonnull NSString *) version - resolver: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) +// Forward-declare the Swift protocols/enum used in the Swift header +// to avoid compiler errors. +@protocol IterableInAppDelegate; +@protocol IterableCustomActionDelegate; +@protocol IterableAuthDelegate; +@protocol IterableURLDelegate; +typedef NS_ENUM(NSInteger, InAppShowResponse) { + show = 0, + skip = 1, +}; -RCT_EXTERN_METHOD(initialize2WithApiKey: (nonnull NSString *) apiKey - config: (nonnull NSDictionary *) config - apiEndPointOverride: (nonnull NSString *) apiEndPoint - version: (nonnull NSString *) version - resolver: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) +#import "Iterable_React_Native_SDK-Swift.h" -RCT_EXTERN_METHOD(setEmail: (NSString *) email - authToken: (NSString *) authToken) - -RCT_EXTERN_METHOD(getEmail: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -RCT_EXTERN_METHOD(setUserId: (NSString *) userId - authToken: (NSString *) authToken) - -RCT_EXTERN_METHOD(getUserId: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -// MARK: - Iterable API Request Functions - -RCT_EXTERN_METHOD(disableDeviceForCurrentUser) - -RCT_EXTERN_METHOD(setInAppShowResponse: (nonnull NSNumber *) inAppShowResponse) - -RCT_EXTERN_METHOD(getLastPushPayload: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -RCT_EXTERN_METHOD(getAttributionInfo: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -RCT_EXTERN_METHOD(setAttributionInfo: (NSDictionary *) attributionInfo) - -RCT_EXTERN_METHOD(trackPushOpenWithCampaignId: (nonnull NSNumber *) campaignId - templateId: (nonnull NSNumber *) templateId - messageId: (nonnull NSString *) messageId - appAlreadyRunning: (BOOL) appAlreadyRunning - dataFields: (NSDictionary *) dataFields) - -RCT_EXTERN_METHOD(updateCart: (NSArray *) items) - -RCT_EXTERN_METHOD(trackPurchase: (nonnull NSNumber *) total - items: (NSArray *) items - dataFields: (NSDictionary *) dataFields) - -RCT_EXTERN_METHOD(trackInAppOpen: (NSString *) messageId - location: (nonnull NSNumber *) location) - -RCT_EXTERN_METHOD(trackInAppClick: (nonnull NSString *) messageId - location: (nonnull NSNumber *) location - clickedUrl: (nonnull NSString *) clickedUrl) - -RCT_EXTERN_METHOD(trackInAppClose: (nonnull NSString *) messageId - location: (nonnull NSNumber *) location - source: (nonnull NSNumber *) source - clickedUrl: (NSString *) clickedUrl) - -RCT_EXTERN_METHOD(inAppConsume: (nonnull NSString *) messageId - location: (nonnull NSNumber *) location - source: (nonnull NSNumber *) source) - -RCT_EXTERN_METHOD(trackEvent: (nonnull NSString *) name - dataFields: (NSDictionary *) dataFields) - -RCT_EXTERN_METHOD(updateUser: (nonnull NSDictionary *) dataFields - mergeNestedObjects: (BOOL) mergeNestedObjects) - -RCT_EXTERN_METHOD(updateEmail: (nonnull NSString *) email - authToken: (NSString *) authToken) - -RCT_EXTERN_METHOD(handleAppLink: (nonnull NSString *) appLink - resolver: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -RCT_EXTERN_METHOD(updateSubscriptions: (NSArray *) emailListIds - unsubscribedChannelIds: (NSArray *) unsubscribedChannelIds - unsubscribedMessageTypeIds: (NSArray *) unsubscribedMessageTypeIds - subscribedMessageTypeIds: (NSArray *) subscribedMessageTypeIds - campaignId: (nonnull NSNumber *) campaignId - templateId: (nonnull NSNumber *) templateId) - -// MARK: - SDK In-App Manager Functions - -RCT_EXTERN_METHOD(getInAppMessages: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -RCT_EXTERN_METHOD(getHtmlInAppContentForMessage: (nonnull NSString *) messageId - resolver: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -RCT_EXTERN_METHOD(getInboxMessages: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -RCT_EXTERN_METHOD(getUnreadInboxMessagesCount: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -RCT_EXTERN_METHOD(showMessage: (nonnull NSString *) messageId - consume: (nonnull BOOL) consume - resolver: (RCTPromiseResolveBlock) resolve - rejecter: (RCTPromiseRejectBlock) reject) - -RCT_EXTERN_METHOD(removeMessage: (nonnull NSString *) messageId - location: (nonnull NSNumber *) location - source: (nonnull NSNumber *) source) - -RCT_EXTERN_METHOD(setReadForMessage: (nonnull NSString *) messageId - read: (BOOL) read) - -RCT_EXTERN_METHOD(setAutoDisplayPaused: (BOOL) paused) - -// MARK: - SDK Inbox Session Tracking Functions - -RCT_EXTERN_METHOD(startSession: (nonnull NSArray *) visibleRows) - -RCT_EXTERN_METHOD(endSession) - -RCT_EXTERN_METHOD(updateVisibleRows: (nonnull NSArray *) visibleRows) - -// MARK: - SDK Auth Manager Functions +@interface RNIterableAPI () +@end -RCT_EXTERN_METHOD(passAlongAuthToken: (NSString *) authToken) +@implementation RNIterableAPI { + ReactIterableAPI *_swiftAPI; +} + +// MARK: - Initialization +- (instancetype)init { + self = [super init]; + if(self) { + // Instantiate the ReactIterableAPI and set the delegate + _swiftAPI = [ReactIterableAPI new]; + _swiftAPI.delegate = self; + } + return self; +} + +RCT_EXPORT_MODULE() + +// MARK: - RCTEventEmitter functions +- (NSArray *)supportedEvents { + return [ReactIterableAPI supportedEvents]; +} + +- (void)sendEventWithName:(NSString *_Nonnull)name result:(double)result { + [self sendEventWithName:name body:@(result)]; +} + +#if RCT_NEW_ARCH_ENABLED + +// MARK: - New Architecture functions exposed to JS + +- (void)startObserving { + [(ReactIterableAPI *)_swiftAPI startObserving]; +} + +- (void)stopObserving { + [(ReactIterableAPI *)_swiftAPI stopObserving]; +} + +- (void)initializeWithApiKey:(NSString *)apiKey + config:(NSDictionary *)config + version:(NSString *)version + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI initializeWithApiKey:apiKey + config:config + version:version + resolver:resolve + rejecter:reject]; +} + +- (void)initialize2WithApiKey:(NSString *)apiKey + config:(NSDictionary *)config + version:(NSString *)version + apiEndPointOverride:(NSString *)apiEndPointOverride + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI initialize2WithApiKey:apiKey + config:config + version:version + apiEndPointOverride:apiEndPointOverride + resolver:resolve + rejecter:reject]; +} + +- (void)setEmail:(NSString *_Nullable)email + authToken:(NSString *_Nullable)authToken { + [_swiftAPI setEmail:email authToken:authToken]; +} + +- (void)getEmail:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI getEmail:resolve rejecter:reject]; +} + +- (void)setUserId:(NSString *_Nullable)userId + authToken:(NSString *_Nullable)authToken { + [_swiftAPI setUserId:userId authToken:authToken]; +} + +- (void)getUserId:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI getUserId:resolve rejecter:reject]; +} + +- (void)setInAppShowResponse:(double)inAppShowResponse { + [_swiftAPI setInAppShowResponse:inAppShowResponse]; +} + +- (void)getInAppMessages:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI getInAppMessages:resolve rejecter:reject]; +} + +- (void)getInboxMessages:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI getInboxMessages:resolve rejecter:reject]; +} + +// NOTE: This is not used anywhere on the JS side. +- (void)getUnreadInboxMessagesCount:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI getUnreadInboxMessagesCount:resolve rejecter:reject]; +} + +- (void)showMessage:(NSString *)messageId + consume:(BOOL)consume + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI showMessage:messageId + consume:consume + resolver:resolve + rejecter:reject]; +} + +- (void)removeMessage:(NSString *)messageId + location:(double)location + source:(double)source { + [_swiftAPI removeMessage:messageId location:location source:source]; +} + +- (void)setReadForMessage:(NSString *)messageId read:(BOOL)read { + [_swiftAPI setReadForMessage:messageId read:read]; +} + +- (void)setAutoDisplayPaused:(BOOL)autoDisplayPaused { + [_swiftAPI setAutoDisplayPaused:autoDisplayPaused]; +} + +- (void)trackEvent:(NSString *)name dataFields:(NSDictionary *)dataFields { + [_swiftAPI trackEvent:name dataFields:dataFields]; +} + +- (void)trackPushOpenWithCampaignId:(double)campaignId + templateId:(NSNumber *)templateId + messageId:(NSString *)messageId + appAlreadyRunning:(BOOL)appAlreadyRunning + dataFields:(NSDictionary *)dataFields { + [_swiftAPI trackPushOpenWithCampaignId:campaignId + templateId:templateId + messageId:messageId + appAlreadyRunning:appAlreadyRunning + dataFields:dataFields]; +} + +- (void)trackInAppOpen:(NSString *)messageId location:(double)location { + [_swiftAPI trackInAppOpen:messageId location:location]; +} + +- (void)trackInAppClick:(NSString *)messageId + location:(double)location + clickedUrl:(NSString *)clickedUrl { + [_swiftAPI trackInAppClick:messageId location:location clickedUrl:clickedUrl]; +} + +- (void)trackInAppClose:(NSString *)messageId + location:(double)location + source:(double)source + clickedUrl:(NSString *_Nullable)clickedUrl { + [_swiftAPI trackInAppClose:messageId + location:location + source:source + clickedUrl:clickedUrl]; +} + +- (void)inAppConsume:(NSString *)messageId + location:(double)location + source:(double)source { + [_swiftAPI inAppConsume:messageId location:location source:source]; +} + +- (void)updateCart:(NSArray *)items { + [_swiftAPI updateCart:items]; +} + +- (void)trackPurchase:(double)total + items:(NSArray *)items + dataFields:(NSDictionary *)dataFields { + [_swiftAPI trackPurchase:total items:items dataFields:dataFields]; +} + +- (void)updateUser:(NSDictionary *)dataFields + mergeNestedObjects:(BOOL)mergeNestedObjects { + [_swiftAPI updateUser:dataFields mergeNestedObjects:mergeNestedObjects]; +} + +- (void)updateEmail:(NSString *)email authToken:(NSString *)authToken { + [_swiftAPI updateEmail:email authToken:authToken]; +} + +- (void)getAttributionInfo:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI getAttributionInfo:resolve rejecter:reject]; +} + +- (void)setAttributionInfo:(NSDictionary *_Nullable)attributionInfo { + [_swiftAPI setAttributionInfo:attributionInfo]; +} + +- (void)disableDeviceForCurrentUser { + [_swiftAPI disableDeviceForCurrentUser]; +} + +- (void)getLastPushPayload:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI getLastPushPayload:resolve rejecter:reject]; +} + +- (void)getHtmlInAppContentForMessage:(NSString *)messageId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI getHtmlInAppContentForMessage:messageId + resolver:resolve + rejecter:reject]; +} + +- (void)handleAppLink:(NSString *)appLink + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [_swiftAPI handleAppLink:appLink resolver:resolve rejecter:reject]; +} + +- (void)updateSubscriptions:(NSArray *_Nullable)emailListIds + unsubscribedChannelIds:(NSArray *_Nullable)unsubscribedChannelIds + unsubscribedMessageTypeIds:(NSArray *_Nullable)unsubscribedMessageTypeIds + subscribedMessageTypeIds:(NSArray *_Nullable)subscribedMessageTypeIds + campaignId:(double)campaignId + templateId:(double)templateId { + [_swiftAPI updateSubscriptions:emailListIds + unsubscribedChannelIds:unsubscribedChannelIds + unsubscribedMessageTypeIds:unsubscribedMessageTypeIds + subscribedMessageTypeIds:subscribedMessageTypeIds + campaignId:campaignId + templateId:templateId]; +} + +- (void)startSession:(NSArray *)visibleRows { + [_swiftAPI startSession:visibleRows]; +} + +- (void)endSession { + [_swiftAPI endSession]; +} + +- (void)updateVisibleRows:(NSArray *)visibleRows { + [_swiftAPI updateVisibleRows:visibleRows]; +} + +- (void)passAlongAuthToken:(NSString *_Nullable)authToken { + [_swiftAPI passAlongAuthToken:authToken]; +} + +- (void)pauseAuthRetries:(BOOL)pauseRetry { + [_swiftAPI pauseAuthRetries:pauseRetry]; +} + +- (void)wakeApp { + // Placeholder function -- this method is only used in Android +} + +// MARK: - TurboModule integration +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +#else + +// MARK: - RCTBridgeModule integration for Legacy Architecture + +RCT_EXPORT_METHOD(startObserving) { + [(ReactIterableAPI *)_swiftAPI startObserving]; +} + +RCT_EXPORT_METHOD(stopObserving) { + [(ReactIterableAPI *)_swiftAPI stopObserving]; +} + +RCT_EXPORT_METHOD( + initializeWithApiKey : (NSString *)apiKey config : (NSDictionary *) + config version : (NSString *)version resolve : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI initializeWithApiKey:apiKey + config:config + version:version + resolver:resolve + rejecter:reject]; +} + +RCT_EXPORT_METHOD( + initialize2WithApiKey : (NSString *)apiKey config : (NSDictionary *) + config version : (NSString *)version apiEndPointOverride : (NSString *) + apiEndPointOverride resolve : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI initialize2WithApiKey:apiKey + config:config + version:version + apiEndPointOverride:apiEndPointOverride + resolver:resolve + rejecter:reject]; +} + +RCT_EXPORT_METHOD(setEmail : (NSString *_Nullable) + email authToken : (NSString *_Nullable)authToken) { + [_swiftAPI setEmail:email authToken:authToken]; +} + +RCT_EXPORT_METHOD(getEmail : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI getEmail:resolve rejecter:reject]; +} + +RCT_EXPORT_METHOD(setUserId : (NSString *_Nullable) + userId authToken : (NSString *_Nullable)authToken) { + [_swiftAPI setUserId:userId authToken:authToken]; +} + +RCT_EXPORT_METHOD(getUserId : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI getUserId:resolve rejecter:reject]; +} + +RCT_EXPORT_METHOD(setInAppShowResponse : (double)inAppShowResponse) { + [_swiftAPI setInAppShowResponse:inAppShowResponse]; +} + +RCT_EXPORT_METHOD(getInAppMessages : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI getInAppMessages:resolve rejecter:reject]; +} + +RCT_EXPORT_METHOD(getInboxMessages : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI getInboxMessages:resolve rejecter:reject]; +} + +RCT_EXPORT_METHOD(getUnreadInboxMessagesCount : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI getUnreadInboxMessagesCount:resolve rejecter:reject]; +} + +RCT_EXPORT_METHOD(showMessage : (NSString *)messageId consume : (BOOL) + consume resolve : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI showMessage:messageId + consume:consume + resolver:resolve + rejecter:reject]; +} + +RCT_EXPORT_METHOD(removeMessage : (NSString *)messageId location : (double) + location source : (double)source) { + [_swiftAPI removeMessage:messageId location:location source:source]; +} + +RCT_EXPORT_METHOD(setReadForMessage : (NSString *)messageId read : (BOOL)read) { + [_swiftAPI setReadForMessage:messageId read:read]; +} + +RCT_EXPORT_METHOD(setAutoDisplayPaused : (BOOL)autoDisplayPaused) { + [_swiftAPI setAutoDisplayPaused:autoDisplayPaused]; +} + +RCT_EXPORT_METHOD(trackEvent : (NSString *)name dataFields : (NSDictionary *) + dataFields) { + [_swiftAPI trackEvent:name dataFields:dataFields]; +} + +RCT_EXPORT_METHOD( + trackPushOpenWithCampaignId : (double)campaignId templateId : (NSNumber *) + templateId messageId : (NSString *)messageId appAlreadyRunning : (BOOL) + appAlreadyRunning dataFields : (NSDictionary *)dataFields) { + [_swiftAPI trackPushOpenWithCampaignId:campaignId + templateId:templateId + messageId:messageId + appAlreadyRunning:appAlreadyRunning + dataFields:dataFields]; +} + +RCT_EXPORT_METHOD(trackInAppOpen : (NSString *)messageId location : (double) + location) { + [_swiftAPI trackInAppOpen:messageId location:location]; +} + +RCT_EXPORT_METHOD(trackInAppClick : (NSString *)messageId location : (double) + location clickedUrl : (NSString *)clickedUrl) { + [_swiftAPI trackInAppClick:messageId location:location clickedUrl:clickedUrl]; +} + +RCT_EXPORT_METHOD(trackInAppClose : (NSString *)messageId location : (double) + location source : (double)source clickedUrl : (NSString *) + clickedUrl) { + [_swiftAPI trackInAppClose:messageId + location:location + source:source + clickedUrl:clickedUrl]; +} + +RCT_EXPORT_METHOD(inAppConsume : (NSString *)messageId location : (double) + location source : (double)source) { + [_swiftAPI inAppConsume:messageId location:location source:source]; +} + +RCT_EXPORT_METHOD(updateCart : (NSArray *)items) { + [_swiftAPI updateCart:items]; +} + +RCT_EXPORT_METHOD(trackPurchase : (double)total items : (NSArray *) + items dataFields : (NSDictionary *)dataFields) { + [_swiftAPI trackPurchase:total items:items dataFields:dataFields]; +} + +RCT_EXPORT_METHOD(updateUser : (NSDictionary *)dataFields mergeNestedObjects : ( + BOOL)mergeNestedObjects) { + [_swiftAPI updateUser:dataFields mergeNestedObjects:mergeNestedObjects]; +} + +RCT_EXPORT_METHOD(updateEmail : (NSString *)email authToken : (NSString *) + authToken) { + [_swiftAPI updateEmail:email authToken:authToken]; +} + +RCT_EXPORT_METHOD(getAttributionInfo : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI getAttributionInfo:resolve rejecter:reject]; +} + +RCT_EXPORT_METHOD(setAttributionInfo : (NSDictionary *)attributionInfo) { + [_swiftAPI setAttributionInfo:attributionInfo]; +} + +RCT_EXPORT_METHOD(disableDeviceForCurrentUser) { + [_swiftAPI disableDeviceForCurrentUser]; +} + +RCT_EXPORT_METHOD(getLastPushPayload : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI getLastPushPayload:resolve rejecter:reject]; +} + +RCT_EXPORT_METHOD(getHtmlInAppContentForMessage : (NSString *) + messageId resolve : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI getHtmlInAppContentForMessage:messageId + resolver:resolve + rejecter:reject]; +} + +RCT_EXPORT_METHOD(handleAppLink : (NSString *)appLink resolve : ( + RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) { + [_swiftAPI handleAppLink:appLink resolver:resolve rejecter:reject]; +} + +RCT_EXPORT_METHOD( + updateSubscriptions : (NSArray *)emailListIds unsubscribedChannelIds : ( + NSArray *) + unsubscribedChannelIds unsubscribedMessageTypeIds : (NSArray *) + unsubscribedMessageTypeIds subscribedMessageTypeIds : (NSArray *) + subscribedMessageTypeIds campaignId : (double) + campaignId templateId : (double)templateId) { + [_swiftAPI updateSubscriptions:emailListIds + unsubscribedChannelIds:unsubscribedChannelIds + unsubscribedMessageTypeIds:unsubscribedMessageTypeIds + subscribedMessageTypeIds:subscribedMessageTypeIds + campaignId:campaignId + templateId:templateId]; +} + +RCT_EXPORT_METHOD(startSession : (NSArray *)visibleRows) { + [_swiftAPI startSession:visibleRows]; +} + +RCT_EXPORT_METHOD(endSession) { [_swiftAPI endSession]; } + +RCT_EXPORT_METHOD(updateVisibleRows : (NSArray *)visibleRows) { + [_swiftAPI updateVisibleRows:visibleRows]; +} + +RCT_EXPORT_METHOD(passAlongAuthToken : (NSString *_Nullable)authToken) { + [_swiftAPI passAlongAuthToken:authToken]; +} + +RCT_EXPORT_METHOD(pauseAuthRetries : (BOOL)pauseRetry) { + [_swiftAPI pauseAuthRetries:pauseRetry]; +} + +RCT_EXPORT_METHOD(wakeApp) { + // Placeholder function -- this method is only used in Android +} + +#endif @end diff --git a/ios/RNIterableAPI/ReactIterableAPI.swift b/ios/RNIterableAPI/ReactIterableAPI.swift index 4db314f20..f04b08e42 100644 --- a/ios/RNIterableAPI/ReactIterableAPI.swift +++ b/ios/RNIterableAPI/ReactIterableAPI.swift @@ -1,686 +1,716 @@ -// -// Created by Tapash Majumder on 3/19/20. -// Copyright © 2020 Iterable. All rights reserved. -// - import Foundation - import IterableSDK +import React -@objc(ReactIterableAPI) -class ReactIterableAPI: RCTEventEmitter { - deinit { - NotificationCenter.default.removeObserver(self) - } - - // MARK: - React Native Functions - - @objc static override func moduleName() -> String! { - return "RNIterableAPI" - } - - override var methodQueue: DispatchQueue! { - _methodQueue - } - - @objc override static func requiresMainQueueSetup() -> Bool { - false - } - - enum EventName: String, CaseIterable { - case handleUrlCalled - case handleCustomActionCalled - case handleInAppCalled - case handleAuthCalled - case receivedIterableInboxChanged - case handleAuthSuccessCalled - case handleAuthFailureCalled - } - - override func supportedEvents() -> [String]! { - var result = [String]() - - EventName.allCases.forEach { - result.append($0.rawValue) - } - - return result - } - - override func startObserving() { - ITBInfo() - - shouldEmit = true - } - - override func stopObserving() { - ITBInfo() - - shouldEmit = false - } - - // MARK: - Native SDK Functions - - @objc(initializeWithApiKey:config:version:resolver:rejecter:) - func initialize(apiKey: String, - config configDict: [AnyHashable: Any], - version: String, - resolver: @escaping RCTPromiseResolveBlock, - rejecter: @escaping RCTPromiseRejectBlock) { - ITBInfo() - - initialize(withApiKey: apiKey, - config: configDict, - version: version, - resolver: resolver, - rejecter: rejecter) - } - - @objc(initialize2WithApiKey:config:apiEndPointOverride:version:resolver:rejecter:) - func initialize2(apiKey: String, - config configDict: [AnyHashable: Any], - version: String, - apiEndPointOverride: String, - resolver: @escaping RCTPromiseResolveBlock, - rejecter: @escaping RCTPromiseRejectBlock) { - ITBInfo() - - initialize(withApiKey: apiKey, - config: configDict, - version: version, - apiEndPointOverride: apiEndPointOverride, - resolver: resolver, - rejecter: rejecter) - } - - @objc(setEmail:) - func set(email: String?) { - ITBInfo() - - IterableAPI.email = email - } - - @objc(setEmail:authToken:) - func set(email: String?, authToken: String?) { - ITBInfo() - - IterableAPI.setEmail(email, authToken) - } - - @objc(getEmail:rejecter:) - func getEmail(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - resolver(IterableAPI.email) - } - - @objc(setUserId:) - func set(userId: String?) { - ITBInfo() - - IterableAPI.userId = userId - } - - @objc(setUserId:authToken:) - func set(userId: String?, authToken: String?) { - ITBInfo() - - IterableAPI.setUserId(userId, authToken) - } - - @objc(getUserId:rejecter:) - func getUserId(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - resolver(IterableAPI.userId) - } - - // MARK: - Iterable API Request Functions - - @objc(setInAppShowResponse:) - func set(inAppShowResponse number: NSNumber) { - ITBInfo() - - self.inAppShowResponse = InAppShowResponse.from(number: number) - - inAppHandlerSemaphore.signal() - } - - @objc(disableDeviceForCurrentUser) - func disableDeviceForCurrentUser() { - ITBInfo() - - IterableAPI.disableDeviceForCurrentUser() - } - - @objc(getLastPushPayload:rejecter:) - func getLastPushPayload(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - resolver(IterableAPI.lastPushPayload) - } - - @objc(getAttributionInfo:rejecter:) - func getAttributionInfo(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - resolver(IterableAPI.attributionInfo.map(SerializationUtil.encodableToDictionary)) - } - - @objc(setAttributionInfo:) - func set(attributionInfo dict: [AnyHashable: Any]?) { - ITBInfo() - - guard let dict = dict else { - IterableAPI.attributionInfo = nil - return - } - - IterableAPI.attributionInfo = SerializationUtil.dictionaryToDecodable(dict: dict) - } - - @objc(trackPushOpenWithCampaignId:templateId:messageId:appAlreadyRunning:dataFields:) - func trackPushOpen(campaignId: NSNumber, - templateId: NSNumber?, - messageId: String, - appAlreadyRunning: Bool, - dataFields: [AnyHashable: Any]?) { - ITBInfo() - - IterableAPI.track(pushOpen: campaignId, - templateId: templateId, - messageId: messageId, - appAlreadyRunning: appAlreadyRunning, - dataFields: dataFields) - } - - @objc(updateCart:) - func updateCart(items: [[AnyHashable: Any]]) { - ITBInfo() - - IterableAPI.updateCart(items: items.compactMap(CommerceItem.from(dict:))) - } - - @objc(trackPurchase:items:dataFields:) - func trackPurchase(total: NSNumber, - items: [[AnyHashable: Any]], - dataFields: [AnyHashable: Any]?) { - ITBInfo() - - IterableAPI.track(purchase: total, - items: items.compactMap(CommerceItem.from(dict:)), - dataFields: dataFields) - } - - @objc(trackInAppOpen:location:) - func trackInAppOpen(messageId: String, - location locationNumber: NSNumber) { - ITBInfo() - - guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { - ITBError("Could not find message with id: \(messageId)") - return - } - - IterableAPI.track(inAppOpen: message, location: InAppLocation.from(number: locationNumber)) - } - - @objc(trackInAppClick:location:clickedUrl:) - func trackInAppClick(messageId: String, - location locationNumber: NSNumber, - clickedUrl: String) { - ITBInfo() - - guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { - ITBError("Could not find message with id: \(messageId)") - return - } - - IterableAPI.track(inAppClick: message, location: InAppLocation.from(number: locationNumber), clickedUrl: clickedUrl) - } - - @objc(trackInAppClose:location:source:clickedUrl:) - func trackInAppClose(messageId: String, - location locationNumber: NSNumber, - source sourceNumber: NSNumber, - clickedUrl: String?) { - ITBInfo() - - guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { - ITBError("Could not find message with id: \(messageId)") - return - } - - if let inAppCloseSource = InAppCloseSource.from(number: sourceNumber) { - IterableAPI.track(inAppClose: message, - location: InAppLocation.from(number: locationNumber), - source: inAppCloseSource, - clickedUrl: clickedUrl) - } else { - IterableAPI.track(inAppClose: message, - location: InAppLocation.from(number: locationNumber), - clickedUrl: clickedUrl) - } - } - - @objc(inAppConsume:location:source:) - func inAppConsume(messageId: String, - location locationNumber: NSNumber, - source sourceNumber: NSNumber) { - ITBInfo() - - guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { - ITBError("Could not find message with id: \(messageId)") - return - } - - if let inAppDeleteSource = InAppDeleteSource.from(number: sourceNumber) { - IterableAPI.inAppConsume(message: message, - location: InAppLocation.from(number: locationNumber), - source: inAppDeleteSource) - } else { - IterableAPI.inAppConsume(message: message, - location: InAppLocation.from(number: locationNumber)) - } - } - - @objc(getHtmlInAppContentForMessage:resolver:rejecter:) - func getHtmlInAppContent(messageId: String, resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { - ITBError("Could not find message with id: \(messageId)") - rejecter("", "Could not find message with id: \(messageId)", nil) - return - } - - guard let content = message.content as? IterableHtmlInAppContent else { - ITBError("Could not parse message content as HTML") - rejecter("", "Could not parse message content as HTML", nil) - return - } - - resolver(content.toDict()) - } - - @objc(trackEvent:dataFields:) - func trackEvent(name: String, dataFields: [AnyHashable: Any]?) { - ITBInfo() - - IterableAPI.track(event: name, dataFields: dataFields) - } - - @objc(updateUser:mergeNestedObjects:) - func updateUser(dataFields: [AnyHashable: Any], mergeNestedObjects: Bool) { - ITBInfo() - - IterableAPI.updateUser(dataFields, mergeNestedObjects: mergeNestedObjects) - } - - @objc(updateEmail:authToken:) - func updateEmail(email: String, with authToken: String?) { - ITBInfo() - - if let authToken = authToken { - IterableAPI.updateEmail(email, withToken: authToken, onSuccess: nil, onFailure: nil) - } else { - IterableAPI.updateEmail(email, onSuccess: nil, onFailure: nil) - } - } - - @objc(handleAppLink:resolver:rejecter:) - func handle(appLink: String, resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - if let url = URL(string: appLink) { - resolver(IterableAPI.handle(universalLink: url)) - } else { - rejecter("", "invalid URL", nil) - } +@objc public protocol ReactIterableAPIDelegate { + func sendEvent(withName: String, body: Any?) +} + +@objc public class ReactIterableAPI: RCTEventEmitter { + deinit { + NotificationCenter.default.removeObserver(self) + } + + @objc public weak var delegate: ReactIterableAPIDelegate? = nil + + @objc override public class func moduleName() -> String! { + return "RNIterableAPI" + } + + override open var methodQueue: DispatchQueue! { + _methodQueue + } + + @objc override static public func requiresMainQueueSetup() -> Bool { + false + } + + enum EventName: String, CaseIterable { + case handleUrlCalled + case handleCustomActionCalled + case handleInAppCalled + case handleAuthCalled + case receivedIterableInboxChanged + case handleAuthSuccessCalled + case handleAuthFailureCalled + } + + @objc public static var supportedEvents: [String] { + return EventName.allCases.map(\.rawValue) + } + + override public func startObserving() { + ITBInfo() + + shouldEmit = true + } + + override public func stopObserving() { + ITBInfo() + + shouldEmit = false + } + + // MARK: - Native SDK Functions + + @objc(initializeWithApiKey:config:version:resolver:rejecter:) + public func initializeWithApiKey( + apiKey: String, + config configDict: NSDictionary, + version: String, + resolver: @escaping RCTPromiseResolveBlock, + rejecter: @escaping RCTPromiseRejectBlock + ) { + ITBInfo() + + initialize( + withApiKey: apiKey, + config: configDict, + version: version, + resolver: resolver, + rejecter: rejecter) + } + + @objc(initialize2WithApiKey:config:version:apiEndPointOverride:resolver:rejecter:) + public func initialize2WithApiKey( + apiKey: String, + config configDict: NSDictionary, + version: String, + apiEndPointOverride: String, + resolver: @escaping RCTPromiseResolveBlock, + rejecter: @escaping RCTPromiseRejectBlock + ) { + ITBInfo() + + initialize( + withApiKey: apiKey, + config: configDict, + version: version, + apiEndPointOverride: apiEndPointOverride, + resolver: resolver, + rejecter: rejecter) + } + + @objc(setEmail:) + public func setEmail(email: String?) { + ITBInfo() + IterableAPI.email = email + } + + @objc(setEmail:authToken:) + public func setEmail(email: String?, authToken: String?) { + ITBInfo() + IterableAPI.setEmail(email, authToken) + } + + @objc(getEmail:rejecter:) + public func getEmail(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { + ITBInfo() + resolver(IterableAPI.email) + } + + @objc(setUserId:) + public func setUserId(userId: String?) { + ITBInfo() + IterableAPI.userId = userId + } + + @objc(setUserId:authToken:) + public func setUserId(userId: String?, authToken: String?) { + ITBInfo() + IterableAPI.setUserId(userId, authToken) + } + + @objc(getUserId:rejecter:) + public func getUserId(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { + ITBInfo() + resolver(IterableAPI.userId) + } + + // MARK: - Iterable API Request Functions + + @objc(setInAppShowResponse:) + public func setInAppShowResponse(inAppShowResponse number: Double) { + ITBInfo() + self.inAppShowResponse = InAppShowResponse.from(number: number as NSNumber) + inAppHandlerSemaphore.signal() + } + + @objc(disableDeviceForCurrentUser) + public func disableDeviceForCurrentUser() { + ITBInfo() + IterableAPI.disableDeviceForCurrentUser() + } + + @objc(getLastPushPayload:rejecter:) + public func getLastPushPayload(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) + { + ITBInfo() + resolver(IterableAPI.lastPushPayload) + } + + @objc(getAttributionInfo:rejecter:) + public func getAttributionInfo(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) + { + ITBInfo() + resolver(IterableAPI.attributionInfo.map(SerializationUtil.encodableToDictionary)) + } + + @objc(setAttributionInfo:) + public func setAttributionInfo(attributionInfo dict: NSDictionary?) { + ITBInfo() + guard let swiftDict = dict as? [AnyHashable: Any] else { + IterableAPI.attributionInfo = nil + return + } + IterableAPI.attributionInfo = SerializationUtil.dictionaryToDecodable( + dict: swiftDict) + } + + @objc(trackPushOpenWithCampaignId:templateId:messageId:appAlreadyRunning:dataFields:) + public func trackPushOpenWithCampaignId( + campaignId: Double, + templateId: NSNumber?, + messageId: String, + appAlreadyRunning: Bool, + dataFields: NSDictionary? + ) { + ITBInfo() + let swiftDict = dataFields as? [AnyHashable: Any] + + IterableAPI.track( + pushOpen: campaignId as NSNumber, + templateId: templateId, + messageId: messageId, + appAlreadyRunning: appAlreadyRunning, + dataFields: swiftDict) + } + + @objc(updateCart:) + public func updateCart(items: [[AnyHashable: Any]]) { + ITBInfo() + IterableAPI.updateCart(items: items.compactMap(CommerceItem.from(dict:))) + } + + @objc(trackPurchase:items:dataFields:) + public func trackPurchase( + total: Double, + items: [[AnyHashable: Any]], + dataFields: [AnyHashable: Any]? + ) { + ITBInfo() + IterableAPI.track( + purchase: total as NSNumber, + items: items.compactMap(CommerceItem.from(dict:)), + dataFields: dataFields) + } + + @objc(trackInAppOpen:location:) + public func trackInAppOpen( + messageId: String, + location locationNumber: Double + ) { + ITBInfo() + guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { + ITBError("Could not find message with id: \(messageId)") + return + } + IterableAPI.track(inAppOpen: message, location: InAppLocation.from(number: locationNumber as NSNumber)) + } + + @objc(trackInAppClick:location:clickedUrl:) + public func trackInAppClick( + messageId: String, + location locationNumber: Double, + clickedUrl: String + ) { + ITBInfo() + guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { + ITBError("Could not find message with id: \(messageId)") + return + } + IterableAPI.track( + inAppClick: message, location: InAppLocation.from(number: locationNumber as NSNumber), + clickedUrl: clickedUrl) + } + + @objc(trackInAppClose:location:source:clickedUrl:) + public func trackInAppClose( + messageId: String, + location locationNumber: Double, + source sourceNumber: Double, + clickedUrl: String? + ) { + ITBInfo() + guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { + ITBError("Could not find message with id: \(messageId)") + return + } + if let inAppCloseSource = InAppCloseSource.from(number: sourceNumber as NSNumber) { + IterableAPI.track( + inAppClose: message, + location: InAppLocation.from(number: locationNumber as NSNumber), + source: inAppCloseSource, + clickedUrl: clickedUrl) + } else { + IterableAPI.track( + inAppClose: message, + location: InAppLocation.from(number: locationNumber as NSNumber), + clickedUrl: clickedUrl) + } + } + + @objc(inAppConsume:location:source:) + public func inAppConsume( + messageId: String, + location locationNumber: Double, + source sourceNumber: Double + ) { + ITBInfo() + guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { + ITBError("Could not find message with id: \(messageId)") + return + } + if let inAppDeleteSource = InAppDeleteSource.from(number: sourceNumber as NSNumber) { + IterableAPI.inAppConsume( + message: message, + location: InAppLocation.from(number: locationNumber as NSNumber), + source: inAppDeleteSource) + } else { + IterableAPI.inAppConsume( + message: message, + location: InAppLocation.from(number: locationNumber as NSNumber)) + } + } + + @objc(getHtmlInAppContentForMessage:resolver:rejecter:) + public func getHtmlInAppContent( + messageId: String, resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock + ) { + ITBInfo() + guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { + ITBError("Could not find message with id: \(messageId)") + rejecter( + "", "Could not find message with id: \(messageId)", + NSError(domain: "", code: 0, userInfo: nil)) + return + } + guard let content = message.content as? IterableHtmlInAppContent else { + ITBError("Could not parse message content as HTML") + rejecter( + "", "Could not parse message content as HTML", NSError(domain: "", code: 0, userInfo: nil)) + return + } + resolver(content.toDict()) + } + + @objc(trackEvent:dataFields:) + public func trackEvent(name: String, dataFields: NSDictionary?) { + ITBInfo() + + IterableAPI.track(event: name, dataFields: dataFields as? [AnyHashable: Any]) + } + + @objc(updateUser:mergeNestedObjects:) + public func updateUser(dataFields: NSDictionary, mergeNestedObjects: Bool) { + ITBInfo() + guard let fields = dataFields as? [AnyHashable: Any] else { + ITBError("Could not cast dataFields to [AnyHashable: Any]") + return + } + IterableAPI.updateUser(fields, mergeNestedObjects: mergeNestedObjects) + } + + @objc(updateEmail:authToken:) + public func updateEmail(email: String, with authToken: String?) { + ITBInfo() + if let authToken = authToken { + IterableAPI.updateEmail(email, withToken: authToken, onSuccess: nil, onFailure: nil) + } else { + IterableAPI.updateEmail(email, onSuccess: nil, onFailure: nil) + } + } + + @objc(handleAppLink:resolver:rejecter:) + public func handle( + appLink: String, resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock + ) { + ITBInfo() + if let url = URL(string: appLink) { + resolver(IterableAPI.handle(universalLink: url)) + } else { + rejecter("", "invalid URL", NSError(domain: "", code: 0, userInfo: nil)) + } + } + + // MARK: - SDK In-App Manager Functions + + @objc(getInAppMessages:rejecter:) + public func getInAppMessages(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { + ITBInfo() + resolver(IterableAPI.inAppManager.getMessages().map { $0.toDict() }) + } + + @objc(getInboxMessages:rejecter:) + public func getInboxMessages(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { + ITBInfo() + resolver(IterableAPI.inAppManager.getInboxMessages().map { $0.toDict() }) + } + + @objc(getUnreadInboxMessagesCount:rejecter:) + public func getUnreadInboxMessagesCount( + resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock + ) { + ITBInfo() + resolver(IterableAPI.inAppManager.getUnreadInboxMessagesCount()) + } + + @objc(showMessage:consume:resolver:rejecter:) + public func showMessage( + messageId: String, consume: Bool, resolver: @escaping RCTPromiseResolveBlock, + rejecter: RCTPromiseRejectBlock + ) { + ITBInfo() + guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { + ITBError("Could not find message with id: \(messageId)") + return + } + IterableAPI.inAppManager.show(message: message, consume: consume) { (url) in + resolver(url.map({ $0.absoluteString })) + } + } + + @objc(removeMessage:location:source:) + public func removeMessage( + messageId: String, location locationNumber: Double, source sourceNumber: Double + ) { + ITBInfo() + guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { + ITBError("Could not find message with id: \(messageId)") + return + } + if let inAppDeleteSource = InAppDeleteSource.from(number: sourceNumber as NSNumber) { + IterableAPI.inAppManager.remove( + message: message, + location: InAppLocation.from(number: locationNumber as NSNumber), + source: inAppDeleteSource) + } else { + IterableAPI.inAppManager.remove( + message: message, + location: InAppLocation.from(number: locationNumber as NSNumber)) + } + } + + @objc( + updateSubscriptions:unsubscribedChannelIds:unsubscribedMessageTypeIds:subscribedMessageTypeIds: + campaignId:templateId: + ) + public func updateSubscriptions( + emailListIds: [NSNumber]?, + unsubscribedChannelIds: [NSNumber]?, + unsubscribedMessageTypeIds: [NSNumber]?, + subscribedMessageTypeIds: [NSNumber]?, + campaignId: Double, + templateId: Double + ) { + ITBInfo() + let finalCampaignId: NSNumber? = (campaignId as NSNumber).intValue <= 0 ? nil : campaignId as NSNumber + let finalTemplateId: NSNumber? = (templateId as NSNumber).intValue <= 0 ? nil : templateId as NSNumber + IterableAPI.updateSubscriptions( + emailListIds, + unsubscribedChannelIds: unsubscribedChannelIds, + unsubscribedMessageTypeIds: unsubscribedMessageTypeIds, + subscribedMessageTypeIds: subscribedMessageTypeIds, + campaignId: finalCampaignId, + templateId: finalTemplateId) + } + + @objc(setReadForMessage:read:) + public func setReadForMessage(for messageId: String, read: Bool) { + ITBInfo() + guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { + ITBError("Could not find message with id: \(messageId)") + return + } + IterableAPI.inAppManager.set(read: read, forMessage: message) + } + + @objc(setAutoDisplayPaused:) + public func setAutoDisplayPaused(autoDisplayPaused: Bool) { + ITBInfo() + DispatchQueue.main.async { + IterableAPI.inAppManager.isAutoDisplayPaused = autoDisplayPaused } - - // MARK: - SDK In-App Manager Functions - - @objc(getInAppMessages:rejecter:) - func getInAppMessages(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - resolver(IterableAPI.inAppManager.getMessages().map { $0.toDict() }) - } - - @objc(getInboxMessages:rejecter:) - func getInboxMessages(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - resolver(IterableAPI.inAppManager.getInboxMessages().map{ $0.toDict() }) - } - - @objc(getUnreadInboxMessagesCount:rejecter:) - func getUnreadInboxMessagesCount(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - resolver(IterableAPI.inAppManager.getUnreadInboxMessagesCount()) - } - - @objc(showMessage:consume:resolver:rejecter:) - func show(messageId: String, consume: Bool, resolver: @escaping RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { - ITBInfo() - - guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { - ITBError("Could not find message with id: \(messageId)") - return - } - - IterableAPI.inAppManager.show(message: message, consume: consume) { (url) in - resolver(url.map({$0.absoluteString})) - } + } + + // MARK: - SDK Inbox Session Tracking Functions + + @objc(startSession:) + public func startSession(visibleRows: [[AnyHashable: Any]]) { + let serializedRows = InboxImpressionTracker.RowInfo.rowInfos(from: visibleRows) + inboxSessionManager.startSession(visibleRows: serializedRows) + } + + @objc(endSession) + public func endSession() { + guard let sessionInfo = inboxSessionManager.endSession() else { + ITBError("Could not find session info") + return + } + let inboxSession = IterableInboxSession( + id: sessionInfo.startInfo.id, + sessionStartTime: sessionInfo.startInfo.startTime, + sessionEndTime: Date(), + startTotalMessageCount: sessionInfo.startInfo.totalMessageCount, + startUnreadMessageCount: sessionInfo.startInfo.unreadMessageCount, + endTotalMessageCount: IterableAPI.inAppManager.getInboxMessages().count, + endUnreadMessageCount: IterableAPI.inAppManager.getUnreadInboxMessagesCount(), + impressions: sessionInfo.impressions.map { $0.toIterableInboxImpression() }) + IterableAPI.track(inboxSession: inboxSession) + } + + @objc(updateVisibleRows:) + public func updateVisibleRows(visibleRows: [[AnyHashable: Any]]) { + let serializedRows = InboxImpressionTracker.RowInfo.rowInfos(from: visibleRows) + inboxSessionManager.updateVisibleRows(visibleRows: serializedRows) + } + + // MARK: - SDK Auth Manager Functions + + @objc(passAlongAuthToken:) + public func passAlongAuthToken(authToken: String?) { + ITBInfo() + passedAuthToken = authToken + authHandlerSemaphore.signal() + } + + @objc(pauseAuthRetries:) + public func pauseAuthRetries(pauseRetry: Bool) { + ITBInfo() + IterableAPI.pauseAuthRetries(pauseRetry) + } + + // MARK: Private + private var shouldEmit = false + private let _methodQueue = DispatchQueue(label: String(describing: ReactIterableAPI.self)) + + // Handling in-app delegate + private var inAppShowResponse = InAppShowResponse.show + private var inAppHandlerSemaphore = DispatchSemaphore(value: 0) + + private var passedAuthToken: String? + private var authHandlerSemaphore = DispatchSemaphore(value: 0) + + private let inboxSessionManager = InboxSessionManager() + + @objc func initialize( + withApiKey apiKey: String, + config configDict: NSDictionary, + version: String, + apiEndPointOverride: String? = nil, + resolver: @escaping RCTPromiseResolveBlock, + rejecter: @escaping RCTPromiseRejectBlock + ) { + ITBInfo() + let launchOptions = createLaunchOptions() + guard let configDictTyped = configDict as? [AnyHashable: Any] else { + rejecter("E_INVALID_CONFIG", "configDict could not be cast to [AnyHashable: Any]", nil) + return + } + let iterableConfig = IterableConfig.from( + dict: configDictTyped + ) + + if let urlHandlerPresent = configDict["urlHandlerPresent"] as? Bool, urlHandlerPresent == true { + iterableConfig.urlDelegate = self } - - @objc(removeMessage:location:source:) - func remove(messageId: String, location locationNumber: NSNumber, source sourceNumber: NSNumber) { - ITBInfo() - - guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { - ITBError("Could not find message with id: \(messageId)") - return - } - - if let inAppDeleteSource = InAppDeleteSource.from(number: sourceNumber) { - IterableAPI.inAppManager.remove(message: message, - location: InAppLocation.from(number: locationNumber), - source: inAppDeleteSource) - } else { - IterableAPI.inAppManager.remove(message: message, - location: InAppLocation.from(number: locationNumber)) - } + + if let customActionHandlerPresent = configDict["customActionHandlerPresent"] as? Bool, + customActionHandlerPresent == true + { + iterableConfig.customActionDelegate = self } - - @objc(updateSubscriptions:unsubscribedChannelIds:unsubscribedMessageTypeIds:subscribedMessageTypeIds:campaignId:templateId:) - func updateSubscriptions(emailListIds: [NSNumber]?, - unsubscribedChannelIds: [NSNumber]?, - unsubscribedMessageTypeIds: [NSNumber]?, - subscribedMessageTypeIds: [NSNumber]?, - campaignId: NSNumber, - templateId: NSNumber) { - ITBInfo() - - let finalCampaignId: NSNumber? = campaignId.intValue <= 0 ? nil : campaignId - let finalTemplateId: NSNumber? = templateId.intValue <= 0 ? nil : templateId - - IterableAPI.updateSubscriptions(emailListIds, - unsubscribedChannelIds: unsubscribedChannelIds, - unsubscribedMessageTypeIds: unsubscribedMessageTypeIds, - subscribedMessageTypeIds: subscribedMessageTypeIds, - campaignId: finalCampaignId, - templateId: finalTemplateId) - } - - @objc(setReadForMessage:read:) - func setRead(for messageId: String, read: Bool) { - ITBInfo() - - guard let message = IterableAPI.inAppManager.getMessage(withId: messageId) else { - ITBError("Could not find message with id: \(messageId)") - return - } - - IterableAPI.inAppManager.set(read: read, forMessage: message) - } - - @objc(setAutoDisplayPaused:) - func set(autoDisplayPaused: Bool) { - ITBInfo() - - DispatchQueue.main.async { - IterableAPI.inAppManager.isAutoDisplayPaused = autoDisplayPaused - } + + if let inAppHandlerPresent = configDict["inAppHandlerPresent"] as? Bool, + inAppHandlerPresent == true + { + iterableConfig.inAppDelegate = self } - - // MARK: - SDK Inbox Session Tracking Functions - - @objc(startSession:) - func startSession(visibleRows: [[AnyHashable: Any]]) { - let serializedRows = InboxImpressionTracker.RowInfo.rowInfos(from: visibleRows) - - inboxSessionManager.startSession(visibleRows: serializedRows) - } - - @objc(endSession) - func endSession() { - guard let sessionInfo = inboxSessionManager.endSession() else { - ITBError("Could not find session info") - return - } - - let inboxSession = IterableInboxSession(id: sessionInfo.startInfo.id, - sessionStartTime: sessionInfo.startInfo.startTime, - sessionEndTime: Date(), - startTotalMessageCount: sessionInfo.startInfo.totalMessageCount, - startUnreadMessageCount: sessionInfo.startInfo.unreadMessageCount, - endTotalMessageCount: IterableAPI.inAppManager.getInboxMessages().count, - endUnreadMessageCount: IterableAPI.inAppManager.getUnreadInboxMessagesCount(), - impressions: sessionInfo.impressions.map { $0.toIterableInboxImpression() }) - - IterableAPI.track(inboxSession: inboxSession) - } - - @objc(updateVisibleRows:) - func updateVisibleRows(visibleRows: [[AnyHashable: Any]]) { - let serializedRows = InboxImpressionTracker.RowInfo.rowInfos(from: visibleRows) - - inboxSessionManager.updateVisibleRows(visibleRows: serializedRows) - } - - // MARK: - SDK Auth Manager Functions - - @objc(passAlongAuthToken:) - func passAlong(authToken: String?) { - ITBInfo() - - passedAuthToken = authToken - - authHandlerSemaphore.signal() - } - - // MARK: Private - private var shouldEmit = false - private let _methodQueue = DispatchQueue(label: String(describing: ReactIterableAPI.self)) - - // Handling in-app delegate - private var inAppShowResponse = InAppShowResponse.show - private var inAppHandlerSemaphore = DispatchSemaphore(value: 0) - - private var passedAuthToken: String? - private var authHandlerSemaphore = DispatchSemaphore(value: 0) - - private let inboxSessionManager = InboxSessionManager() - - private func initialize(withApiKey apiKey: String, - config configDict: [AnyHashable: Any], - version: String, - apiEndPointOverride: String? = nil, - resolver: @escaping RCTPromiseResolveBlock, - rejecter: @escaping RCTPromiseRejectBlock) { - ITBInfo() - - let launchOptions = createLaunchOptions() - let iterableConfig = IterableConfig.from(dict: configDict) - - if let urlHandlerPresent = configDict["urlHandlerPresent"] as? Bool, urlHandlerPresent == true { - iterableConfig.urlDelegate = self - } - - if let customActionHandlerPresent = configDict["customActionHandlerPresent"] as? Bool, customActionHandlerPresent == true { - iterableConfig.customActionDelegate = self - } - - if let inAppHandlerPresent = configDict["inAppHandlerPresent"] as? Bool, inAppHandlerPresent == true { - iterableConfig.inAppDelegate = self - } - - if let authHandlerPresent = configDict["authHandlerPresent"] as? Bool, authHandlerPresent { - iterableConfig.authDelegate = self - } - - // connect new inbox in-app payloads to the RN SDK - NotificationCenter.default.addObserver(self, selector: #selector(receivedIterableInboxChanged), name: Notification.Name.iterableInboxChanged, object: nil) - - DispatchQueue.main.async { - IterableAPI.initialize2(apiKey: apiKey, - launchOptions: launchOptions, - config: iterableConfig, - apiEndPointOverride: apiEndPointOverride) { result in - resolver(result) - } - - IterableAPI.setDeviceAttribute(name: "reactNativeSDKVersion", value: version) - } + + if let authHandlerPresent = configDict["authHandlerPresent"] as? Bool, authHandlerPresent { + iterableConfig.authDelegate = self } - - @objc(receivedIterableInboxChanged) - private func receivedIterableInboxChanged() { - guard shouldEmit else { - return - } - - sendEvent(withName: EventName.receivedIterableInboxChanged.rawValue, body: nil) + + // connect new inbox in-app payloads to the RN SDK + NotificationCenter.default.addObserver( + self, selector: #selector(receivedIterableInboxChanged), + name: Notification.Name.iterableInboxChanged, object: nil) + + DispatchQueue.main.async { + IterableAPI.initialize2( + apiKey: apiKey, + launchOptions: launchOptions, + config: iterableConfig, + apiEndPointOverride: apiEndPointOverride + ) { result in + resolver(result) + } + + IterableAPI.setDeviceAttribute(name: "reactNativeSDKVersion", value: version) } - - private func createLaunchOptions() -> [UIApplication.LaunchOptionsKey: Any]? { - guard let bridge = 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(receivedIterableInboxChanged) + func receivedIterableInboxChanged() { + guard shouldEmit else { + return + } + delegate?.sendEvent( + withName: EventName.receivedIterableInboxChanged.rawValue, body: nil as Any?) + } + + 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 + } } extension ReactIterableAPI: IterableURLDelegate { - func handle(iterableURL url: URL, inContext context: IterableActionContext) -> Bool { - ITBInfo() - - guard shouldEmit else { - return false - } - - let contextDict = ReactIterableAPI.contextToDictionary(context: context) - sendEvent(withName: EventName.handleUrlCalled.rawValue, - body: ["url": url.absoluteString, - "context": contextDict] as [String : Any]) - - return true - } - - private static func contextToDictionary(context: IterableActionContext) -> [AnyHashable: Any] { - var result = [AnyHashable: Any]() - - let actionDict = actionToDictionary(action: context.action) - result["action"] = actionDict - result["source"] = context.source.rawValue - - return result - } - - private static func actionToDictionary(action: IterableAction) -> [AnyHashable: Any] { - var actionDict = [AnyHashable: Any]() - - actionDict["type"] = action.type - - if let data = action.data { - actionDict["data"] = data - } - - if let userInput = action.userInput { - actionDict["userInput"] = userInput - } - - return actionDict + public func handle(iterableURL url: URL, inContext context: IterableActionContext) -> Bool { + ITBInfo() + guard shouldEmit else { + return false + } + let contextDict = ReactIterableAPI.contextToDictionary(context: context) + delegate?.sendEvent( + withName: EventName.handleUrlCalled.rawValue, + body: [ + "url": url.absoluteString, + "context": contextDict, + ] as [String: Any]) + return true + } + + private static func contextToDictionary(context: IterableActionContext) -> [AnyHashable: Any] { + var result = [AnyHashable: Any]() + let actionDict = actionToDictionary(action: context.action) + result["action"] = actionDict + result["source"] = context.source.rawValue + return result + } + + private static func actionToDictionary(action: IterableAction) -> [AnyHashable: Any] { + var actionDict = [AnyHashable: Any]() + actionDict["type"] = action.type + if let data = action.data { + actionDict["data"] = data } + if let userInput = action.userInput { + actionDict["userInput"] = userInput + } + return actionDict + } } extension ReactIterableAPI: IterableCustomActionDelegate { - func handle(iterableCustomAction action: IterableAction, inContext context: IterableActionContext) -> Bool { - ITBInfo() - - let actionDict = ReactIterableAPI.actionToDictionary(action: action) - let contextDict = ReactIterableAPI.contextToDictionary(context: context) - - sendEvent(withName: EventName.handleCustomActionCalled.rawValue, - body: ["action": actionDict, - "context": contextDict]) - - return true - } + public func handle( + iterableCustomAction action: IterableAction, inContext context: IterableActionContext + ) + -> Bool + { + ITBInfo() + let actionDict = ReactIterableAPI.actionToDictionary(action: action) + let contextDict = ReactIterableAPI.contextToDictionary(context: context) + delegate?.sendEvent( + withName: EventName.handleCustomActionCalled.rawValue, + body: [ + "action": actionDict, + "context": contextDict, + ]) + return true + } } extension ReactIterableAPI: IterableInAppDelegate { - func onNew(message: IterableInAppMessage) -> InAppShowResponse { - ITBInfo() - - guard shouldEmit else { - return .show - } - - sendEvent(withName: EventName.handleInAppCalled.rawValue, - body: message.toDict()) - - let timeoutResult = inAppHandlerSemaphore.wait(timeout: .now() + 2.0) - - if timeoutResult == .success { - ITBInfo("inAppShowResponse: \(inAppShowResponse == .show)") - return inAppShowResponse - } else { - ITBInfo("timed out") - return .show - } - } + public func onNew(message: IterableInAppMessage) -> InAppShowResponse { + ITBInfo() + guard shouldEmit else { + return .show + } + delegate?.sendEvent( + withName: EventName.handleInAppCalled.rawValue, + body: message.toDict()) + let timeoutResult = inAppHandlerSemaphore.wait(timeout: .now() + 2.0) + if timeoutResult == .success { + ITBInfo("inAppShowResponse: \(inAppShowResponse == .show)") + return inAppShowResponse + } else { + ITBInfo("timed out") + return .show + } + } } extension ReactIterableAPI: IterableAuthDelegate { - func onAuthTokenRequested(completion: @escaping AuthTokenRetrievalHandler) { - ITBInfo() - - DispatchQueue.global(qos: .userInitiated).async { - self.sendEvent(withName: EventName.handleAuthCalled.rawValue, - body: nil) - - let authTokenRetrievalResult = self.authHandlerSemaphore.wait(timeout: .now() + 30.0) - - if authTokenRetrievalResult == .success { - ITBInfo("authTokenRetrieval successful") - - DispatchQueue.main.async { - completion(self.passedAuthToken) - } - - self.sendEvent(withName: EventName.handleAuthSuccessCalled.rawValue, - body: nil) - } else { - ITBInfo("authTokenRetrieval timed out") - - DispatchQueue.main.async { - completion(nil) - } - - self.sendEvent(withName: EventName.handleAuthFailureCalled.rawValue, - body: nil) - } + public func onAuthFailure(_ authFailure: IterableSDK.AuthFailure) { + ITBInfo() + + var failureDict: [String: Any] = [:] + failureDict["userKey"] = authFailure.userKey + failureDict["failedAuthToken"] = authFailure.failedAuthToken + failureDict["failedRequestTime"] = authFailure.failedRequestTime + failureDict["failureReason"] = authFailure.failureReason.rawValue + + delegate?.sendEvent( + withName: EventName.handleAuthFailureCalled.rawValue, + body: failureDict) + } + + public func onAuthTokenRequested(completion: @escaping AuthTokenRetrievalHandler) { + ITBInfo() + DispatchQueue.global(qos: .userInitiated).async { + self.delegate?.sendEvent( + withName: EventName.handleAuthCalled.rawValue, + body: nil as Any?) + let authTokenRetrievalResult = self.authHandlerSemaphore.wait(timeout: .now() + 30.0) + if authTokenRetrievalResult == .success { + ITBInfo("authTokenRetrieval successful") + DispatchQueue.main.async { + completion(self.passedAuthToken) } + self.delegate?.sendEvent( + withName: EventName.handleAuthSuccessCalled.rawValue, + body: nil as Any?) + } else { + ITBInfo("authTokenRetrieval timed out") + DispatchQueue.main.async { + completion(nil) + } + // TODO: RN should be able to handle nil case as well. Or we can wrap this up under one of the existing AuthFailure. But again, its not a authFailure in this one. Its a timeout error. + // TODO: Create a Dictionary representing AuthFailure object due to `null` auth token and pass it in body instead of passing `nil` + self.delegate?.sendEvent( + withName: EventName.handleAuthFailureCalled.rawValue, + body: nil as Any?) + } } - - func onTokenRegistrationFailed(_ reason: String?) { - - } + } + + public func onTokenRegistrationFailed(_ reason: String?) { + } } diff --git a/ios/RNIterableAPI/Serialization.swift b/ios/RNIterableAPI/Serialization.swift index cb27026be..478262924 100644 --- a/ios/RNIterableAPI/Serialization.swift +++ b/ios/RNIterableAPI/Serialization.swift @@ -4,265 +4,266 @@ // import Foundation - import IterableSDK struct SerializationUtil { - static func dateToInt(date: Date) -> Int { - Int(date.timeIntervalSince1970 * 1000) - } - - static func intToDate(int: Int) -> Date { - let seconds = Double(int) / 1000.0 // ms -> seconds - - return Date(timeIntervalSince1970: seconds) - } - - static func encodableToDictionary(encodable: T) -> [String: Any]? where T: Encodable { - guard let data = try? JSONEncoder().encode(encodable) else { - return nil - } - - return try? JSONSerialization.jsonObject(with: data, options: [.allowFragments]) as? [String: Any] + static func dateToInt(date: Date) -> Int { + Int(date.timeIntervalSince1970 * 1000) + } + + static func intToDate(int: Int) -> Date { + let seconds = Double(int) / 1000.0 // ms -> seconds + + return Date(timeIntervalSince1970: seconds) + } + + static func encodableToDictionary(encodable: T) -> [String: Any]? where T: Encodable { + guard let data = try? JSONEncoder().encode(encodable) else { + return nil } - - static func dictionaryToDecodable(dict: [AnyHashable: Any]) -> T? where T: Decodable { - guard let data = try? JSONSerialization.data(withJSONObject: dict, options: []) else { - return nil - } - - return try? JSONDecoder().decode(T.self, from: data) + + return try? JSONSerialization.jsonObject(with: data, options: [.allowFragments]) + as? [String: Any] + } + + static func dictionaryToDecodable(dict: [AnyHashable: Any]) -> T? where T: Decodable { + guard let data = try? JSONSerialization.data(withJSONObject: dict, options: []) else { + return nil } + + return try? JSONDecoder().decode(T.self, from: data) + } } extension IterableConfig { - static func from(dict: [AnyHashable: Any]?) -> IterableConfig { - let config = IterableConfig() - - guard let dict = dict else { - return config - } - - if let allowedProtocols = dict["allowedProtocols"] as? [String] { - config.allowedProtocols = allowedProtocols - } - - if let pushIntegrationName = dict["pushIntegrationName"] as? String { - config.pushIntegrationName = pushIntegrationName - } - - if let pushPlatform = dict["pushPlatform"] as? NSNumber { - switch pushPlatform { - case 0: - config.pushPlatform = .sandbox - case 1: - config.pushPlatform = .production - default: - config.pushPlatform = .auto - } - } - - if let autoPushRegistration = dict["autoPushRegistration"] as? Bool { - config.autoPushRegistration = autoPushRegistration - } - - if let inAppDisplayInterval = dict["inAppDisplayInterval"] as? Double { - config.inAppDisplayInterval = inAppDisplayInterval - } - - if let expiringAuthTokenRefreshPeriod = dict["expiringAuthTokenRefreshPeriod"] as? TimeInterval { - config.expiringAuthTokenRefreshPeriod = expiringAuthTokenRefreshPeriod - } - - if let logLevelNumber = dict["logLevel"] as? NSNumber { - config.logDelegate = createLogDelegate(logLevelNumber: logLevelNumber) - } - - if let useInMemoryStorageForInApp = dict["useInMemoryStorageForInApps"] as? Bool { - config.useInMemoryStorageForInApps = useInMemoryStorageForInApp - } - - if let dataRegion = dict["dataRegion"] as? NSNumber { - switch dataRegion { - case 0: - config.dataRegion = IterableDataRegion.US - case 1: - config.dataRegion = IterableDataRegion.EU - default: - config.dataRegion = IterableDataRegion.US - } - } - - - return config + static func from(dict: [AnyHashable: Any]?) -> IterableConfig { + let config = IterableConfig() + + guard let dict = dict else { + return config } - - private static func createLogDelegate(logLevelNumber: NSNumber) -> IterableLogDelegate { - DefaultLogDelegate(minLogLevel: LogLevel.from(number: logLevelNumber)) + + if let allowedProtocols = dict["allowedProtocols"] as? [String] { + config.allowedProtocols = allowedProtocols + } + + if let pushIntegrationName = dict["pushIntegrationName"] as? String { + config.pushIntegrationName = pushIntegrationName + } + + if let pushPlatform = dict["pushPlatform"] as? NSNumber { + switch pushPlatform { + case 0: + config.pushPlatform = .sandbox + case 1: + config.pushPlatform = .production + default: + config.pushPlatform = .auto + } + } + + if let autoPushRegistration = dict["autoPushRegistration"] as? Bool { + config.autoPushRegistration = autoPushRegistration + } + + if let inAppDisplayInterval = dict["inAppDisplayInterval"] as? Double { + config.inAppDisplayInterval = inAppDisplayInterval + } + + if let expiringAuthTokenRefreshPeriod = dict["expiringAuthTokenRefreshPeriod"] as? TimeInterval + { + config.expiringAuthTokenRefreshPeriod = expiringAuthTokenRefreshPeriod + } + + if let logLevelNumber = dict["logLevel"] as? NSNumber { + config.logDelegate = createLogDelegate(logLevelNumber: logLevelNumber) + } + + if let useInMemoryStorageForInApp = dict["useInMemoryStorageForInApps"] as? Bool { + config.useInMemoryStorageForInApps = useInMemoryStorageForInApp } + + if let dataRegion = dict["dataRegion"] as? NSNumber { + switch dataRegion { + case 0: + config.dataRegion = IterableDataRegion.US + case 1: + config.dataRegion = IterableDataRegion.EU + default: + config.dataRegion = IterableDataRegion.US + } + } + + return config + } + + private static func createLogDelegate(logLevelNumber: NSNumber) -> IterableLogDelegate { + DefaultLogDelegate(minLogLevel: LogLevel.from(number: logLevelNumber)) + } } extension CommerceItem { - static func from(dict: [AnyHashable: Any]) -> CommerceItem? { - guard let id = dict["id"] as? String else { - return nil - } - - guard let name = dict["name"] as? String else { - return nil - } - - guard let price = dict["price"] as? NSNumber else { - return nil - } - - guard let quantity = dict["quantity"] as? UInt else { - return nil - } - - let sku = dict["sku"] as? String - let description = dict["description"] as? String - let url = dict["url"] as? String - let imageUrl = dict["imageUrl"] as? String - let categories = dict["categories"] as? [String] - let dataFields = dict["dataFields"] as? [AnyHashable: Any] - - return CommerceItem(id: id, - name: name, - price: price, - quantity: quantity, - sku: sku, - description: description, - url: url, - imageUrl: imageUrl, - categories: categories, - dataFields: dataFields) + static func from(dict: [AnyHashable: Any]) -> CommerceItem? { + guard let id = dict["id"] as? String else { + return nil + } + + guard let name = dict["name"] as? String else { + return nil } + + guard let price = dict["price"] as? NSNumber else { + return nil + } + + guard let quantity = dict["quantity"] as? UInt else { + return nil + } + + let sku = dict["sku"] as? String + let description = dict["description"] as? String + let url = dict["url"] as? String + let imageUrl = dict["imageUrl"] as? String + let categories = dict["categories"] as? [String] + let dataFields = dict["dataFields"] as? [AnyHashable: Any] + + return CommerceItem( + id: id, + name: name, + price: price, + quantity: quantity, + sku: sku, + description: description, + url: url, + imageUrl: imageUrl, + categories: categories, + dataFields: dataFields) + } } extension IterableInAppTrigger { - func toDict() -> [AnyHashable: Any] { - var dict = [AnyHashable: Any]() - dict["type"] = self.type.rawValue - return dict - } + func toDict() -> [AnyHashable: Any] { + var dict = [AnyHashable: Any]() + dict["type"] = self.type.rawValue + return dict + } } extension UIEdgeInsets { - func toDict() -> [AnyHashable: Any] { - var dict = [AnyHashable: Any]() - dict["top"] = top - dict["left"] = left - dict["bottom"] = bottom - dict["right"] = right - return dict - } + func toDict() -> [AnyHashable: Any] { + var dict = [AnyHashable: Any]() + dict["top"] = top + dict["left"] = left + dict["bottom"] = bottom + dict["right"] = right + return dict + } } extension IterableInboxMetadata { - func toDict() -> [AnyHashable: Any]? { - var dict = [AnyHashable: Any]() - dict["title"] = title - dict["subtitle"] = subtitle - dict["icon"] = icon - return dict - } + func toDict() -> [AnyHashable: Any]? { + var dict = [AnyHashable: Any]() + dict["title"] = title + dict["subtitle"] = subtitle + dict["icon"] = icon + return dict + } } extension IterableInAppMessage { - func toDict() -> [AnyHashable: Any] { - var dict = [AnyHashable: Any]() - dict["messageId"] = messageId - dict["campaignId"] = campaignId - dict["trigger"] = trigger.toDict() - dict["createdAt"] = createdAt.map (SerializationUtil.dateToInt(date:)) - dict["expiresAt"] = expiresAt.map (SerializationUtil.dateToInt(date:)) - dict["saveToInbox"] = saveToInbox - dict["inboxMetadata"] = inboxMetadata?.toDict() ?? nil - dict["customPayload"] = customPayload - dict["read"] = read - dict["priorityLevel"] = priorityLevel - - return dict - } + func toDict() -> [AnyHashable: Any] { + var dict = [AnyHashable: Any]() + dict["messageId"] = messageId + dict["campaignId"] = campaignId + dict["trigger"] = trigger.toDict() + dict["createdAt"] = createdAt.map(SerializationUtil.dateToInt(date:)) + dict["expiresAt"] = expiresAt.map(SerializationUtil.dateToInt(date:)) + dict["saveToInbox"] = saveToInbox + dict["inboxMetadata"] = inboxMetadata?.toDict() ?? nil + dict["customPayload"] = customPayload + dict["read"] = read + dict["priorityLevel"] = priorityLevel + + return dict + } } extension IterableHtmlInAppContent { - func toDict() -> [AnyHashable: Any] { - var dict = [AnyHashable: Any]() - dict["type"] = type.rawValue - dict["edgeInsets"] = edgeInsets.toDict() - dict["html"] = html - return dict - } + func toDict() -> [AnyHashable: Any] { + var dict = [AnyHashable: Any]() + dict["type"] = type.rawValue + dict["edgeInsets"] = edgeInsets.toDict() + dict["html"] = html + return dict + } } extension InAppLocation { - static func from(number: NSNumber) -> InAppLocation { - if let value = number as? Int { - return InAppLocation(rawValue: value) ?? .inApp - } else { - return .inApp - } + static func from(number: NSNumber) -> InAppLocation { + if let value = number as? Int { + return InAppLocation(rawValue: value) ?? .inApp + } else { + return .inApp } + } } extension InAppCloseSource { - static func from(number: NSNumber) -> InAppCloseSource? { - guard let value = number as? Int else { - return nil - } - - return InAppCloseSource(rawValue: value) + static func from(number: NSNumber) -> InAppCloseSource? { + guard let value = number as? Int else { + return nil } + + return InAppCloseSource(rawValue: value) + } } extension InAppDeleteSource { - static func from(number: NSNumber) -> InAppDeleteSource? { - guard let value = number as? Int else { - return nil - } - - return InAppDeleteSource(rawValue: value) + static func from(number: NSNumber) -> InAppDeleteSource? { + guard let value = number as? Int else { + return nil } + + return InAppDeleteSource(rawValue: value) + } } extension InAppShowResponse { - static func from(number: NSNumber) -> InAppShowResponse { - if let value = number as? Int { - return InAppShowResponse(rawValue: value) ?? .show - } else { - return .show - } + static func from(number: NSNumber) -> InAppShowResponse { + if let value = number as? Int { + return InAppShowResponse(rawValue: value) ?? .show + } else { + return .show } + } } extension LogLevel { - static func from(number: NSNumber) -> LogLevel { - if let value = number as? Int { - return LogLevel(rawValue: value) ?? .info - } else { - return .info - } + static func from(number: NSNumber) -> LogLevel { + if let value = number as? Int { + return LogLevel(rawValue: value) ?? .info + } else { + return .info } + } } extension InboxImpressionTracker.RowInfo { - static func from(dict: [AnyHashable: Any]) -> InboxImpressionTracker.RowInfo? { - guard let messageId = dict["messageId"] as? String else { - return nil - } - - guard let silentInbox = dict["silentInbox"] as? Bool else { - return nil - } - - let rowInfo = InboxImpressionTracker.RowInfo(messageId: messageId, silentInbox: silentInbox) - - return rowInfo + static func from(dict: [AnyHashable: Any]) -> InboxImpressionTracker.RowInfo? { + guard let messageId = dict["messageId"] as? String else { + return nil } - - static func rowInfos(from rows: [[AnyHashable: Any]]) -> [InboxImpressionTracker.RowInfo] { - return rows.compactMap(InboxImpressionTracker.RowInfo.from(dict:)) + + guard let silentInbox = dict["silentInbox"] as? Bool else { + return nil } + + let rowInfo = InboxImpressionTracker.RowInfo(messageId: messageId, silentInbox: silentInbox) + + return rowInfo + } + + static func rowInfos(from rows: [[AnyHashable: Any]]) -> [InboxImpressionTracker.RowInfo] { + return rows.compactMap(InboxImpressionTracker.RowInfo.from(dict:)) + } } diff --git a/lefthook.yml b/lefthook.yml index 8b4be29b7..01686858b 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -7,6 +7,9 @@ pre-commit: types: glob: "*.{js,ts,jsx,tsx}" run: npx tsc + # version-check: + # glob: "package.json" + # run: node scripts/checkVersionAndUpdateBuildInfo.js commit-msg: parallel: true commands: diff --git a/package.json b/package.json index ef832a4ad..d378ab5a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@iterable/react-native-sdk", - "version": "2.0.3", + "version": "2.1.0-beta.1", "description": "Iterable SDK for React Native.", "source": "./src/index.tsx", "main": "./lib/module/index.js", @@ -42,7 +42,9 @@ "lint": "eslint \"**/*.{js,ts,tsx}\"", "docs": "typedoc", "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib", - "prepare": "yarn add_build_info; yarn bob build", + "prebuild": "yarn add_build_info", + "build": "yarn add_build_info && yarn bob build", + "prepare": "yarn build", "release": "release-it" }, "keywords": [ @@ -72,7 +74,7 @@ "@react-native/metro-config": "0.79.3", "@react-native/typescript-config": "0.79.3", "@react-navigation/native": "^7.1.14", - "@release-it/conventional-changelog": "^9.0.2", + "@release-it/conventional-changelog": "^9.0.4", "@testing-library/jest-native": "^5.4.3", "@testing-library/react-native": "^13.3.3", "@types/jest": "^29.5.5", @@ -83,12 +85,13 @@ "commitlint": "^19.6.1", "del-cli": "^5.1.0", "eslint": "^8.51.0", - "eslint-config-prettier": "^9.0.0", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-jest": "^28.9.0", "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-tsdoc": "^0.3.0", "jest": "^29.7.0", "prettier": "^3.0.3", + "prettier-eslint": "^16.4.2", "react": "19.0.0", "react-native": "0.79.3", "react-native-builder-bob": "^0.40.4", @@ -134,7 +137,10 @@ "release-it": { "git": { "commitMessage": "chore: release ${version}", - "tagName": "${version}" + "tagName": "${version}", + "tag": true, + "commit": true, + "push": true }, "npm": { "publish": true @@ -153,8 +159,7 @@ { "type": "fix", "section": "Bug Fixes" - }, - {} + } ] } } @@ -178,11 +183,17 @@ ] }, "codegenConfig": { - "name": "RNIterableSpec", + "name": "RNIterableAPISpec", "type": "modules", - "jsSrcsDir": "src", + "jsSrcsDir": "src/api/", "android": { "javaPackageName": "com.iterable.reactnative" + }, + "ios": { + "modules": { + "RNIterableAPI": "RNIterableAPI", + "ReactIterableAPI": "ReactIterableAPI" + } } }, "create-react-native-library": { diff --git a/scripts/checkVersionAndUpdateBuildInfo.js b/scripts/checkVersionAndUpdateBuildInfo.js new file mode 100644 index 000000000..4bff8ebab --- /dev/null +++ b/scripts/checkVersionAndUpdateBuildInfo.js @@ -0,0 +1,53 @@ +/** + * Pre-commit script that checks if package.json version has changed + * and updates build info if necessary + */ +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +const packageJsonPath = path.join(__dirname, '../package.json'); +const buildInfoPath = path.join(__dirname, '../src/itblBuildInfo.ts'); + +// Read current package.json +const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); +const currentVersion = packageJson.version; + +// Read current build info file +let buildInfoVersion = null; +if (fs.existsSync(buildInfoPath)) { + const buildInfoContent = fs.readFileSync(buildInfoPath, 'utf8'); + const versionMatch = buildInfoContent.match(/version:\s*['"`]([^'"`]+)['"`]/); + if (versionMatch) { + buildInfoVersion = versionMatch[1]; + } +} + +console.log(`Current package.json version: ${currentVersion}`); +console.log(`Current build info version: ${buildInfoVersion}`); + +// Check if versions are different +if (currentVersion !== buildInfoVersion) { + console.log('Version mismatch detected. Updating build info...'); + + try { + // Run the build info update + execSync('yarn add_build_info', { stdio: 'inherit' }); + + // Check if the file was actually modified + const gitStatus = execSync('git status --porcelain src/itblBuildInfo.ts', { encoding: 'utf8' }); + + if (gitStatus.trim()) { + console.log('Build info file was updated. Adding to commit...'); + execSync('git add src/itblBuildInfo.ts', { stdio: 'inherit' }); + console.log('Build info file has been staged for commit.'); + } else { + console.log('Build info file was not modified.'); + } + } catch (error) { + console.error('Error updating build info:', error.message); + process.exit(1); + } +} else { + console.log('Version is up to date. No build info update needed.'); +} diff --git a/src/__mocks__/MockRNIterableAPI.ts b/src/__mocks__/MockRNIterableAPI.ts index 390263153..1949c15bf 100644 --- a/src/__mocks__/MockRNIterableAPI.ts +++ b/src/__mocks__/MockRNIterableAPI.ts @@ -70,12 +70,14 @@ export class MockRNIterableAPI { static initialize2WithApiKey = jest.fn().mockResolvedValue(true); - static wakeApp = jest.fn() + static wakeApp = jest.fn(); static setInAppShowResponse = jest.fn(); static passAlongAuthToken = jest.fn(); + static pauseAuthRetries = jest.fn(); + static async getInAppMessages(): Promise { return await new Promise((resolve) => { resolve(MockRNIterableAPI.messages); diff --git a/src/__tests__/IterableInApp.test.ts b/src/__tests__/IterableInApp.test.ts index b4a157413..bddb3f3f9 100644 --- a/src/__tests__/IterableInApp.test.ts +++ b/src/__tests__/IterableInApp.test.ts @@ -1,7 +1,5 @@ import { NativeEventEmitter } from 'react-native'; -import { IterableLogger } from '../core'; - import { MockRNIterableAPI } from '../__mocks__/MockRNIterableAPI'; import { @@ -21,7 +19,6 @@ import { describe('Iterable In App', () => { beforeEach(() => { jest.clearAllMocks(); - Iterable.logger = new IterableLogger(new IterableConfig()); }); test('trackInAppOpen_params_methodCalledWithParams', () => { @@ -202,9 +199,11 @@ describe('Iterable In App', () => { // WHEN the simulated local queue is set to the in-app messages MockRNIterableAPI.setMessages(messages); // THEN Iterable.inAppManager.getMessages returns the list of in-app messages - return await Iterable.inAppManager?.getMessages().then((messagesObtained) => { - expect(messagesObtained).toEqual(messages); - }); + return await Iterable.inAppManager + ?.getMessages() + .then((messagesObtained) => { + expect(messagesObtained).toEqual(messages); + }); }); test('showMessage_messageAndConsume_returnsClickedUrl', async () => { @@ -222,9 +221,11 @@ describe('Iterable In App', () => { // WHEN the simulated clicked url is set to the clicked url MockRNIterableAPI.setClickedUrl(clickedUrl); // THEN Iterable,inAppManager.showMessage returns the simulated clicked url - return await Iterable.inAppManager?.showMessage(message, consume).then((url) => { - expect(url).toEqual(clickedUrl); - }); + return await Iterable.inAppManager + ?.showMessage(message, consume) + .then((url) => { + expect(url).toEqual(clickedUrl); + }); }); test('removeMessage_params_methodCalledWithParams', () => { diff --git a/src/api/NativeRNIterableAPI.ts b/src/api/NativeRNIterableAPI.ts new file mode 100644 index 000000000..391fadbb7 --- /dev/null +++ b/src/api/NativeRNIterableAPI.ts @@ -0,0 +1,140 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + // Initialization + initializeWithApiKey( + apiKey: string, + config: { [key: string]: string | number | boolean | undefined | string[] }, + version: string + ): Promise; + + initialize2WithApiKey( + apiKey: string, + config: { [key: string]: string | number | boolean | undefined | string[] }, + version: string, + apiEndPointOverride: string + ): Promise; + + // User management + setEmail(email: string | null, authToken?: string | null): void; + getEmail(): Promise; + setUserId(userId?: string | null, authToken?: string | null): void; + getUserId(): Promise; + + // In-app messaging + setInAppShowResponse(number: number): void; + getInAppMessages(): Promise<{ [key: string]: string | number | boolean }[]>; + getInboxMessages(): Promise<{ [key: string]: string | number | boolean }[]>; + getUnreadInboxMessagesCount(): Promise; + showMessage(messageId: string, consume: boolean): Promise; + removeMessage(messageId: string, location: number, source: number): void; + setReadForMessage(messageId: string, read: boolean): void; + setAutoDisplayPaused(autoDisplayPaused: boolean): void; + + // Tracking + trackEvent( + name: string, + dataFields?: { [key: string]: string | number | boolean } + ): void; + trackPushOpenWithCampaignId( + campaignId: number, + templateId: number | null, + messageId: string, + appAlreadyRunning: boolean, + dataFields?: { [key: string]: string | number | boolean } + ): void; + trackInAppOpen(messageId: string, location: number): void; + trackInAppClick( + messageId: string, + location: number, + clickedUrl: string + ): void; + trackInAppClose( + messageId: string, + location: number, + source: number, + clickedUrl?: string | null + ): void; + inAppConsume(messageId: string, location: number, source: number): void; + + // Commerce + updateCart(items: { [key: string]: string | number | boolean }[]): void; + trackPurchase( + total: number, + items: { [key: string]: string | number | boolean }[], + dataFields?: { [key: string]: string | number | boolean } + ): void; + + // User data + updateUser( + dataFields: { [key: string]: string | number | boolean }, + mergeNestedObjects: boolean + ): void; + updateEmail(email: string, authToken?: string): void; + + // Attribution + getAttributionInfo(): Promise<{ + [key: string]: string | number | boolean; + } | null>; + setAttributionInfo( + dict: { [key: string]: string | number | boolean } | null + ): void; + + // Device management + disableDeviceForCurrentUser(): void; + getLastPushPayload(): Promise<{ + [key: string]: string | number | boolean; + } | null>; + + // Content + getHtmlInAppContentForMessage( + messageId: string + ): Promise<{ [key: string]: string | number | boolean }>; + + // App links + handleAppLink(appLink: string): Promise; + + // Subscriptions + updateSubscriptions( + emailListIds: number[] | null, + unsubscribedChannelIds: number[] | null, + unsubscribedMessageTypeIds: number[] | null, + subscribedMessageTypeIds: number[] | null, + campaignId: number, + templateId: number + ): void; + + // Session tracking + startSession( + visibleRows: { [key: string]: string | number | boolean }[] + ): void; + endSession(): void; + updateVisibleRows( + visibleRows: { [key: string]: string | number | boolean }[] + ): void; + + // Auth + passAlongAuthToken(authToken?: string | null): void; + pauseAuthRetries(pauseRetry: boolean): void; + + // Wake app -- android only + wakeApp(): void; + + // REQUIRED for RCTEventEmitter + addListener(eventName: string): void; + removeListeners(count: number): void; +} + +// Check if we're in a test environment +const isTestEnvironment = () => { + return ( + typeof jest !== 'undefined' || + process.env.NODE_ENV === 'test' || + process.env.JEST_WORKER_ID !== undefined + ); +}; + +export default isTestEnvironment() + ? undefined + : TurboModuleRegistry.getEnforcing('RNIterableAPI'); diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 000000000..9c327891b --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,6 @@ +import { NativeModules } from 'react-native'; +import BridgelessModule from './NativeRNIterableAPI'; + +export const RNIterableAPI = BridgelessModule ?? NativeModules.RNIterableAPI; + +export default RNIterableAPI; diff --git a/src/core/classes/Iterable.test.ts b/src/core/classes/Iterable.test.ts index 4c044165e..afc5100dd 100644 --- a/src/core/classes/Iterable.test.ts +++ b/src/core/classes/Iterable.test.ts @@ -1,8 +1,7 @@ -import { NativeEventEmitter, Platform } from "react-native"; +import { NativeEventEmitter, Platform } from 'react-native'; -import { MockLinking } from "../../__mocks__/MockLinking"; -import { MockRNIterableAPI } from "../../__mocks__/MockRNIterableAPI"; -import { IterableLogger } from ".."; +import { MockLinking } from '../../__mocks__/MockLinking'; +import { MockRNIterableAPI } from '../../__mocks__/MockRNIterableAPI'; // import from the same location that consumers import from import { Iterable, @@ -10,33 +9,25 @@ import { IterableActionContext, IterableActionSource, IterableAttributionInfo, + IterableAuthResponse, IterableCommerceItem, IterableConfig, IterableDataRegion, IterableEventName, - IterableLogLevel, - IterableInAppMessage, IterableInAppCloseSource, IterableInAppDeleteSource, IterableInAppLocation, + IterableInAppMessage, + IterableInAppShowResponse, IterableInAppTrigger, IterableInAppTriggerType, - IterableAuthResponse, - IterableInAppShowResponse, -} from "../.."; -import { TestHelper } from "../../__tests__/TestHelper"; - -const getDefaultConfig = () => { - const config = new IterableConfig(); - config.logReactNativeSdkCalls = false; - return config; -}; + IterableLogLevel, +} from '../..'; +import { TestHelper } from '../../__tests__/TestHelper'; -describe("Iterable", () => { +describe('Iterable', () => { beforeEach(() => { jest.clearAllMocks(); - const config = getDefaultConfig(); - Iterable.logger = new IterableLogger(config); }); afterEach(() => { @@ -55,11 +46,11 @@ describe("Iterable", () => { jest.clearAllTimers(); }); - describe("setEmail", () => { - it("should set the email", async () => { - const result = "user@example.com"; + describe('setEmail', () => { + it('should set the email', async () => { + const result = 'user@example.com'; // GIVEN an email - const email = "user@example.com"; + const email = 'user@example.com'; // WHEN Iterable.setEmail is called with the given email Iterable.setEmail(email); // THEN Iterable.getEmail returns the given email @@ -69,11 +60,11 @@ describe("Iterable", () => { }); }); - describe("setUserId", () => { - it("should set the userId", async () => { - const result = "user1"; + describe('setUserId', () => { + it('should set the userId', async () => { + const result = 'user1'; // GIVEN an userId - const userId = "user1"; + const userId = 'user1'; // WHEN Iterable.setUserId is called with the given userId Iterable.setUserId(userId); // THEN Iterable.getUserId returns the given userId @@ -83,8 +74,8 @@ describe("Iterable", () => { }); }); - describe("disableDeviceForCurrentUser", () => { - it("should disable the device for the current user", () => { + describe('disableDeviceForCurrentUser', () => { + it('should disable the device for the current user', () => { // GIVEN no parameters // WHEN Iterable.disableDeviceForCurrentUser is called Iterable.disableDeviceForCurrentUser(); @@ -93,12 +84,12 @@ describe("Iterable", () => { }); }); - describe("getLastPushPayload", () => { - it("should return the last push payload", async () => { - const result = { var1: "val1", var2: true }; + describe('getLastPushPayload', () => { + it('should return the last push payload', async () => { + const result = { var1: 'val1', var2: true }; // GIVEN no parameters // WHEN the lastPushPayload is set - MockRNIterableAPI.lastPushPayload = { var1: "val1", var2: true }; + MockRNIterableAPI.lastPushPayload = { var1: 'val1', var2: true }; // THEN the lastPushPayload is returned when getLastPushPayload is called return await Iterable.getLastPushPayload().then((payload) => { expect(payload).toEqual(result); @@ -106,14 +97,14 @@ describe("Iterable", () => { }); }); - describe("trackPushOpenWithCampaignId", () => { - it("should track the push open with the campaign id", () => { + describe('trackPushOpenWithCampaignId', () => { + it('should track the push open with the campaign id', () => { // GIVEN the following parameters const campaignId = 123; const templateId = 234; - const messageId = "someMessageId"; + const messageId = 'someMessageId'; const appAlreadyRunning = false; - const dataFields = { dataFieldKey: "dataFieldValue" }; + const dataFields = { dataFieldKey: 'dataFieldValue' }; // WHEN Iterable.trackPushOpenWithCampaignId is called Iterable.trackPushOpenWithCampaignId( campaignId, @@ -133,10 +124,10 @@ describe("Iterable", () => { }); }); - describe("updateCart", () => { - it("should call IterableAPI.updateCart with the correct items", () => { + describe('updateCart', () => { + it('should call IterableAPI.updateCart with the correct items', () => { // GIVEN list of items - const items = [new IterableCommerceItem("id1", "Boba Tea", 18, 26)]; + const items = [new IterableCommerceItem('id1', 'Boba Tea', 18, 26)]; // WHEN Iterable.updateCart is called Iterable.updateCart(items); // THEN corresponding function is called on RNIterableAPI @@ -144,12 +135,12 @@ describe("Iterable", () => { }); }); - describe("trackPurchase", () => { - it("should track the purchase", () => { + describe('trackPurchase', () => { + it('should track the purchase', () => { // GIVEN the following parameters const total = 10; - const items = [new IterableCommerceItem("id1", "Boba Tea", 18, 26)]; - const dataFields = { dataFieldKey: "dataFieldValue" }; + const items = [new IterableCommerceItem('id1', 'Boba Tea', 18, 26)]; + const dataFields = { dataFieldKey: 'dataFieldValue' }; // WHEN Iterable.trackPurchase is called Iterable.trackPurchase(total, items, dataFields); // THEN corresponding function is called on RNIterableAPI @@ -160,23 +151,23 @@ describe("Iterable", () => { ); }); - it("should track the purchase when called with optional fields", () => { + it('should track the purchase when called with optional fields', () => { // GIVEN the following parameters const total = 5; const items = [ new IterableCommerceItem( - "id", - "swordfish", + 'id', + 'swordfish', 64, 1, - "SKU", - "description", - "url", - "imageUrl", - ["sword", "shield"] + 'SKU', + 'description', + 'url', + 'imageUrl', + ['sword', 'shield'] ), ]; - const dataFields = { key: "value" }; + const dataFields = { key: 'value' }; // WHEN Iterable.trackPurchase is called Iterable.trackPurchase(total, items, dataFields); // THEN corresponding function is called on RNIterableAPI @@ -188,11 +179,11 @@ describe("Iterable", () => { }); }); - describe("trackEvent", () => { - it("should call IterableAPI.trackEvent with the correct name and dataFields", () => { + describe('trackEvent', () => { + it('should call IterableAPI.trackEvent with the correct name and dataFields', () => { // GIVEN the following parameters - const name = "EventName"; - const dataFields = { DatafieldKey: "DatafieldValue" }; + const name = 'EventName'; + const dataFields = { DatafieldKey: 'DatafieldValue' }; // WHEN Iterable.trackEvent is called Iterable.trackEvent(name, dataFields); // THEN corresponding function is called on RNIterableAPI @@ -200,12 +191,12 @@ describe("Iterable", () => { }); }); - describe("setAttributionInfo", () => { - it("should set the attribution info", async () => { + describe('setAttributionInfo', () => { + it('should set the attribution info', async () => { // GIVEN attribution info const campaignId = 1234; const templateId = 5678; - const messageId = "qwer"; + const messageId = 'qwer'; // WHEN Iterable.setAttributionInfo is called with the given attribution info Iterable.setAttributionInfo( new IterableAttributionInfo(campaignId, templateId, messageId) @@ -219,10 +210,10 @@ describe("Iterable", () => { }); }); - describe("updateUser", () => { - it("should update the user", () => { + describe('updateUser', () => { + it('should update the user', () => { // GIVEN the following parameters - const dataFields = { field: "value1" }; + const dataFields = { field: 'value1' }; // WHEN Iterable.updateUser is called Iterable.updateUser(dataFields, false); // THEN corresponding function is called on RNIterableAPI @@ -230,20 +221,20 @@ describe("Iterable", () => { }); }); - describe("updateEmail", () => { - it("should call IterableAPI.updateEmail with the correct email", () => { + describe('updateEmail', () => { + it('should call IterableAPI.updateEmail with the correct email', () => { // GIVEN the new email - const newEmail = "woo@newemail.com"; + const newEmail = 'woo@newemail.com'; // WHEN Iterable.updateEmail is called Iterable.updateEmail(newEmail); // THEN corresponding function is called on RNIterableAPI expect(MockRNIterableAPI.updateEmail).toBeCalledWith(newEmail, undefined); }); - it("should call IterableAPI.updateEmail with the correct email and token", () => { + it('should call IterableAPI.updateEmail with the correct email and token', () => { // GIVEN the new email and a token - const newEmail = "woo@newemail.com"; - const newToken = "token2"; + const newEmail = 'woo@newemail.com'; + const newToken = 'token2'; // WHEN Iterable.updateEmail is called Iterable.updateEmail(newEmail, newToken); // THEN corresponding function is called on RNITerableAPI @@ -251,8 +242,8 @@ describe("Iterable", () => { }); }); - describe("iterableConfig", () => { - it("should have default values", () => { + describe('iterableConfig', () => { + it('should have default values', () => { // GIVEN no parameters // WHEN config is initialized const config = new IterableConfig(); @@ -291,8 +282,8 @@ describe("Iterable", () => { }); }); - describe("urlHandler", () => { - it("should open the url when canOpenURL returns true and urlHandler returns false", async () => { + describe('urlHandler', () => { + it('should open the url when canOpenURL returns true and urlHandler returns false', async () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners(IterableEventName.handleUrlCalled); @@ -304,7 +295,7 @@ describe("Iterable", () => { return false; }); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN canOpenUrl set to return a promise that resolves to true MockLinking.canOpenURL = jest.fn(async () => { return await new Promise((resolve) => { @@ -312,11 +303,11 @@ describe("Iterable", () => { }); }); MockLinking.openURL.mockReset(); - const expectedUrl = "https://somewhere.com"; - const actionDict = { type: "openUrl" }; + const expectedUrl = 'https://somewhere.com'; + const actionDict = { type: 'openUrl' }; const dict = { url: expectedUrl, - context: { action: actionDict, source: "inApp" }, + context: { action: actionDict, source: 'inApp' }, }; // WHEN handleUrlCalled event is emitted nativeEmitter.emit(IterableEventName.handleUrlCalled, dict); @@ -327,7 +318,7 @@ describe("Iterable", () => { }); }); - it("should not open the url when canOpenURL returns false and urlHandler returns false", async () => { + it('should not open the url when canOpenURL returns false and urlHandler returns false', async () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners(IterableEventName.handleUrlCalled); @@ -339,7 +330,7 @@ describe("Iterable", () => { return false; }); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN canOpenUrl set to return a promise that resolves to false MockLinking.canOpenURL = jest.fn(async () => { return await new Promise((resolve) => { @@ -347,11 +338,11 @@ describe("Iterable", () => { }); }); MockLinking.openURL.mockReset(); - const expectedUrl = "https://somewhere.com"; - const actionDict = { type: "openUrl" }; + const expectedUrl = 'https://somewhere.com'; + const actionDict = { type: 'openUrl' }; const dict = { url: expectedUrl, - context: { action: actionDict, source: "inApp" }, + context: { action: actionDict, source: 'inApp' }, }; // WHEN handleUrlCalled event is emitted nativeEmitter.emit(IterableEventName.handleUrlCalled, dict); @@ -362,7 +353,7 @@ describe("Iterable", () => { }); }); - it("should not open the url when canOpenURL returns true and urlHandler returns true", async () => { + it('should not open the url when canOpenURL returns true and urlHandler returns true', async () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners(IterableEventName.handleUrlCalled); @@ -374,7 +365,7 @@ describe("Iterable", () => { return true; }); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN canOpenUrl set to return a promise that resolves to true MockLinking.canOpenURL = jest.fn(async () => { return await new Promise((resolve) => { @@ -382,11 +373,11 @@ describe("Iterable", () => { }); }); MockLinking.openURL.mockReset(); - const expectedUrl = "https://somewhere.com"; - const actionDict = { type: "openUrl" }; + const expectedUrl = 'https://somewhere.com'; + const actionDict = { type: 'openUrl' }; const dict = { url: expectedUrl, - context: { action: actionDict, source: "inApp" }, + context: { action: actionDict, source: 'inApp' }, }; // WHEN handleUrlCalled event is emitted nativeEmitter.emit(IterableEventName.handleUrlCalled, dict); @@ -398,8 +389,8 @@ describe("Iterable", () => { }); }); - describe("customActionHandler", () => { - it("should be called with the correct action and context", () => { + describe('customActionHandler', () => { + it('should be called with the correct action and context', () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners( @@ -415,10 +406,10 @@ describe("Iterable", () => { } ); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN custom action name and custom action data - const actionName = "zeeActionName"; - const actionData = "zeeActionData"; + const actionName = 'zeeActionName'; + const actionData = 'zeeActionData'; const actionDict = { type: actionName, data: actionData }; const actionSource = IterableActionSource.inApp; const dict = { @@ -440,10 +431,10 @@ describe("Iterable", () => { }); }); - describe("handleAppLink", () => { - it("should call IterableAPI.handleAppLink", () => { + describe('handleAppLink', () => { + it('should call IterableAPI.handleAppLink', () => { // GIVEN a link - const link = "https://somewhere.com/link/something"; + const link = 'https://somewhere.com/link/something'; // WHEN Iterable.handleAppLink is called Iterable.handleAppLink(link); // THEN corresponding function is called on RNITerableAPI @@ -451,8 +442,8 @@ describe("Iterable", () => { }); }); - describe("updateSubscriptions", () => { - it("should call IterableAPI.updateSubscriptions with the correct parameters", () => { + describe('updateSubscriptions', () => { + it('should call IterableAPI.updateSubscriptions with the correct parameters', () => { // GIVEN the following parameters const emailListIds = [1, 2, 3]; const unsubscribedChannelIds = [4, 5, 6]; @@ -481,10 +472,10 @@ describe("Iterable", () => { }); }); - describe("initialize", () => { - it("should call IterableAPI.initializeWithApiKey and save the config", async () => { + describe('initialize', () => { + it('should call IterableAPI.initializeWithApiKey and save the config', async () => { // GIVEN an API key and config - const apiKey = "test-api-key"; + const apiKey = 'test-api-key'; const config = new IterableConfig(); config.logReactNativeSdkCalls = false; config.logLevel = IterableLogLevel.debug; @@ -500,9 +491,9 @@ describe("Iterable", () => { expect(result).toBe(true); }); - it("should give the default config if no config is provided", async () => { + it('should give the default config if no config is provided', async () => { // GIVEN an API key - const apiKey = "test-api-key"; + const apiKey = 'test-api-key'; // WHEN Iterable.initialize is called const result = await Iterable.initialize(apiKey); // THEN corresponding function is called on RNIterableAPI and config is saved @@ -511,13 +502,13 @@ describe("Iterable", () => { }); }); - describe("initialize2", () => { - it("should call IterableAPI.initialize2WithApiKey with an endpoint and save the config", async () => { + describe('initialize2', () => { + it('should call IterableAPI.initialize2WithApiKey with an endpoint and save the config', async () => { // GIVEN an API key, config, and endpoint - const apiKey = "test-api-key"; + const apiKey = 'test-api-key'; const config = new IterableConfig(); config.logReactNativeSdkCalls = false; - const apiEndPoint = "https://api.staging.iterable.com"; + const apiEndPoint = 'https://api.staging.iterable.com'; // WHEN Iterable.initialize2 is called const result = await Iterable.initialize2(apiKey, config, apiEndPoint); // THEN corresponding function is called on RNIterableAPI and config is saved @@ -531,10 +522,10 @@ describe("Iterable", () => { expect(result).toBe(true); }); - it("should give the default config if no config is provided", async () => { + it('should give the default config if no config is provided', async () => { // GIVEN an API key - const apiKey = "test-api-key"; - const apiEndPoint = "https://api.staging.iterable.com"; + const apiKey = 'test-api-key'; + const apiEndPoint = 'https://api.staging.iterable.com'; // WHEN Iterable.initialize is called const result = await Iterable.initialize2(apiKey, undefined, apiEndPoint); // THEN corresponding function is called on RNIterableAPI and config is saved @@ -543,12 +534,12 @@ describe("Iterable", () => { }); }); - describe("wakeApp", () => { - it("should call IterableAPI.wakeApp on Android", () => { + describe('wakeApp', () => { + it('should call IterableAPI.wakeApp on Android', () => { // GIVEN Android platform const originalPlatform = Platform.OS; - Object.defineProperty(Platform, "OS", { - value: "android", + Object.defineProperty(Platform, 'OS', { + value: 'android', writable: true, }); // WHEN Iterable.wakeApp is called @@ -556,17 +547,17 @@ describe("Iterable", () => { // THEN corresponding function is called on RNIterableAPI expect(MockRNIterableAPI.wakeApp).toBeCalled(); // Restore original platform - Object.defineProperty(Platform, "OS", { + Object.defineProperty(Platform, 'OS', { value: originalPlatform, writable: true, }); }); - it("should not call IterableAPI.wakeApp on iOS", () => { + it('should not call IterableAPI.wakeApp on iOS', () => { // GIVEN iOS platform const originalPlatform = Platform.OS; - Object.defineProperty(Platform, "OS", { - value: "ios", + Object.defineProperty(Platform, 'OS', { + value: 'ios', writable: true, }); // WHEN Iterable.wakeApp is called @@ -574,18 +565,18 @@ describe("Iterable", () => { // THEN corresponding function is not called on RNIterableAPI expect(MockRNIterableAPI.wakeApp).not.toBeCalled(); // Restore original platform - Object.defineProperty(Platform, "OS", { + Object.defineProperty(Platform, 'OS', { value: originalPlatform, writable: true, }); }); }); - describe("trackInAppOpen", () => { - it("should call IterableAPI.trackInAppOpen with the correct parameters", () => { + describe('trackInAppOpen', () => { + it('should call IterableAPI.trackInAppOpen with the correct parameters', () => { // GIVEN an in-app message and location const message = new IterableInAppMessage( - "1234", + '1234', 4567, new IterableInAppTrigger(IterableInAppTriggerType.immediate), new Date(), @@ -607,11 +598,11 @@ describe("Iterable", () => { }); }); - describe("trackInAppClick", () => { - it("should call IterableAPI.trackInAppClick with the correct parameters", () => { + describe('trackInAppClick', () => { + it('should call IterableAPI.trackInAppClick with the correct parameters', () => { // GIVEN an in-app message, location, and clicked URL const message = new IterableInAppMessage( - "1234", + '1234', 4567, new IterableInAppTrigger(IterableInAppTriggerType.immediate), new Date(), @@ -623,7 +614,7 @@ describe("Iterable", () => { 0 ); const location = IterableInAppLocation.inApp; - const clickedUrl = "https://www.example.com"; + const clickedUrl = 'https://www.example.com'; // WHEN Iterable.trackInAppClick is called Iterable.trackInAppClick(message, location, clickedUrl); // THEN corresponding function is called on RNIterableAPI @@ -635,11 +626,11 @@ describe("Iterable", () => { }); }); - describe("trackInAppClose", () => { - it("should call IterableAPI.trackInAppClose with the correct parameters", () => { + describe('trackInAppClose', () => { + it('should call IterableAPI.trackInAppClose with the correct parameters', () => { // GIVEN an in-app message, location, and source (no URL) const message = new IterableInAppMessage( - "1234", + '1234', 4567, new IterableInAppTrigger(IterableInAppTriggerType.immediate), new Date(), @@ -663,10 +654,10 @@ describe("Iterable", () => { ); }); - it("should call IterableAPI.trackInAppClose with a clicked URL when provided", () => { + it('should call IterableAPI.trackInAppClose with a clicked URL when provided', () => { // GIVEN an in-app message, location, source, and clicked URL const message = new IterableInAppMessage( - "1234", + '1234', 4567, new IterableInAppTrigger(IterableInAppTriggerType.immediate), new Date(), @@ -679,7 +670,7 @@ describe("Iterable", () => { ); const location = IterableInAppLocation.inApp; const source = IterableInAppCloseSource.back; - const clickedUrl = "https://www.example.com"; + const clickedUrl = 'https://www.example.com'; // WHEN Iterable.trackInAppClose is called Iterable.trackInAppClose(message, location, source, clickedUrl); // THEN corresponding function is called on RNIterableAPI @@ -692,11 +683,11 @@ describe("Iterable", () => { }); }); - describe("inAppConsume", () => { - it("should call IterableAPI.inAppConsume with the correct parameters", () => { + describe('inAppConsume', () => { + it('should call IterableAPI.inAppConsume with the correct parameters', () => { // GIVEN an in-app message, location, and delete source const message = new IterableInAppMessage( - "1234", + '1234', 4567, new IterableInAppTrigger(IterableInAppTriggerType.immediate), new Date(), @@ -720,19 +711,19 @@ describe("Iterable", () => { }); }); - describe("getVersionFromPackageJson", () => { - it("should return the version from the package.json file", () => { + describe('getVersionFromPackageJson', () => { + it('should return the version from the package.json file', () => { // GIVEN no parameters // WHEN Iterable.getVersionFromPackageJson is called const version = Iterable.getVersionFromPackageJson(); // THEN a version string is returned - expect(typeof version).toBe("string"); + expect(typeof version).toBe('string'); expect(version.length).toBeGreaterThan(0); }); }); - describe("setupEventHandlers", () => { - it("should call inAppHandler when handleInAppCalled event is emitted", () => { + describe('setupEventHandlers', () => { + it('should call inAppHandler when handleInAppCalled event is emitted', () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners(IterableEventName.handleInAppCalled); @@ -743,10 +734,10 @@ describe("Iterable", () => { return IterableInAppShowResponse.show; }); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN message dictionary const messageDict = { - messageId: "1234", + messageId: '1234', campaignId: 4567, trigger: { type: 0 }, createdAt: new Date().toISOString(), @@ -768,8 +759,8 @@ describe("Iterable", () => { ); }); - describe("authHandler", () => { - it("should call authHandler when handleAuthCalled event is emitted", async () => { + describe('authHandler', () => { + it('should call authHandler when handleAuthCalled event is emitted', async () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners(IterableEventName.handleAuthCalled); @@ -785,14 +776,14 @@ describe("Iterable", () => { const successCallback = jest.fn(); const failureCallback = jest.fn(); const authResponse = new IterableAuthResponse(); - authResponse.authToken = "test-token"; + authResponse.authToken = 'test-token'; authResponse.successCallback = successCallback; authResponse.failureCallback = failureCallback; config.authHandler = jest.fn(() => { return Promise.resolve(authResponse); }); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN auth handler returns AuthResponse // WHEN handleAuthCalled event is emitted nativeEmitter.emit(IterableEventName.handleAuthCalled); @@ -801,14 +792,14 @@ describe("Iterable", () => { // THEN passAlongAuthToken is called with the token and success callback is called after timeout return await TestHelper.delayed(1100, () => { expect(MockRNIterableAPI.passAlongAuthToken).toBeCalledWith( - "test-token" + 'test-token' ); expect(successCallback).toBeCalled(); expect(failureCallback).not.toBeCalled(); }); }); - it("should call authHandler when handleAuthFailureCalled event is emitted", async () => { + it('should call authHandler when handleAuthFailureCalled event is emitted', async () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners(IterableEventName.handleAuthCalled); @@ -824,7 +815,7 @@ describe("Iterable", () => { const successCallback = jest.fn(); const failureCallback = jest.fn(); const authResponse = new IterableAuthResponse(); - authResponse.authToken = "test-token"; + authResponse.authToken = 'test-token'; authResponse.successCallback = successCallback; authResponse.failureCallback = failureCallback; config.authHandler = jest.fn(() => { @@ -832,7 +823,7 @@ describe("Iterable", () => { return Promise.resolve(authResponse); }); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN auth handler returns AuthResponse // WHEN handleAuthCalled event is emitted nativeEmitter.emit(IterableEventName.handleAuthCalled); @@ -841,14 +832,14 @@ describe("Iterable", () => { // THEN passAlongAuthToken is called with the token and failure callback is called after timeout return await TestHelper.delayed(1100, () => { expect(MockRNIterableAPI.passAlongAuthToken).toBeCalledWith( - "test-token" + 'test-token' ); expect(failureCallback).toBeCalled(); expect(successCallback).not.toBeCalled(); }); }); - it("should call authHandler when handleAuthCalled event is emitted and returns a string token", async () => { + it('should call authHandler when handleAuthCalled event is emitted and returns a string token', async () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners(IterableEventName.handleAuthCalled); @@ -856,22 +847,22 @@ describe("Iterable", () => { const config = new IterableConfig(); config.logReactNativeSdkCalls = false; config.authHandler = jest.fn(() => { - return Promise.resolve("string-token"); + return Promise.resolve('string-token'); }); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN auth handler returns string token // WHEN handleAuthCalled event is emitted nativeEmitter.emit(IterableEventName.handleAuthCalled); // THEN passAlongAuthToken is called with the string token return await TestHelper.delayed(100, () => { expect(MockRNIterableAPI.passAlongAuthToken).toBeCalledWith( - "string-token" + 'string-token' ); }); }); - it("should call authHandler when handleAuthCalled event is emitted and returns an unexpected response", () => { + it('should call authHandler when handleAuthCalled event is emitted and returns an unexpected response', () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners(IterableEventName.handleAuthCalled); @@ -879,12 +870,12 @@ describe("Iterable", () => { const config = new IterableConfig(); config.logReactNativeSdkCalls = false; config.authHandler = jest.fn(() => { - return Promise.resolve({ unexpected: "object" } as unknown as + return Promise.resolve({ unexpected: 'object' } as unknown as | string | IterableAuthResponse); }); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN auth handler returns unexpected response // WHEN handleAuthCalled event is emitted nativeEmitter.emit(IterableEventName.handleAuthCalled); @@ -892,7 +883,7 @@ describe("Iterable", () => { expect(MockRNIterableAPI.passAlongAuthToken).not.toBeCalled(); }); - it("should call authHandler when handleAuthCalled event is emitted and rejects the promise", () => { + it('should call authHandler when handleAuthCalled event is emitted and rejects the promise', () => { // sets up event emitter const nativeEmitter = new NativeEventEmitter(); nativeEmitter.removeAllListeners(IterableEventName.handleAuthCalled); @@ -900,10 +891,10 @@ describe("Iterable", () => { const config = new IterableConfig(); config.logReactNativeSdkCalls = false; config.authHandler = jest.fn(() => { - return Promise.reject(new Error("Auth failed")); + return Promise.reject(new Error('Auth failed')); }); // initialize Iterable object - Iterable.initialize("apiKey", config); + Iterable.initialize('apiKey', config); // GIVEN auth handler rejects promise // WHEN handleAuthCalled event is emitted nativeEmitter.emit(IterableEventName.handleAuthCalled); @@ -912,4 +903,261 @@ describe("Iterable", () => { }); }); }); + + describe('authManager', () => { + describe('pauseAuthRetries', () => { + it('should call RNIterableAPI.pauseAuthRetries with true when pauseRetry is true', () => { + // GIVEN pauseRetry is true + const pauseRetry = true; + + // WHEN pauseAuthRetries is called + Iterable.authManager.pauseAuthRetries(pauseRetry); + + // THEN RNIterableAPI.pauseAuthRetries is called with true + expect(MockRNIterableAPI.pauseAuthRetries).toBeCalledWith(true); + }); + + it('should call RNIterableAPI.pauseAuthRetries with false when pauseRetry is false', () => { + // GIVEN pauseRetry is false + const pauseRetry = false; + + // WHEN pauseAuthRetries is called + Iterable.authManager.pauseAuthRetries(pauseRetry); + + // THEN RNIterableAPI.pauseAuthRetries is called with false + expect(MockRNIterableAPI.pauseAuthRetries).toBeCalledWith(false); + }); + + it('should return the result from RNIterableAPI.pauseAuthRetries', () => { + // GIVEN RNIterableAPI.pauseAuthRetries returns a value + const expectedResult = 'pause-result'; + MockRNIterableAPI.pauseAuthRetries = jest + .fn() + .mockReturnValue(expectedResult); + + // WHEN pauseAuthRetries is called + const result = Iterable.authManager.pauseAuthRetries(true); + + // THEN the result is returned + expect(result).toBe(expectedResult); + }); + }); + + describe('passAlongAuthToken', () => { + it('should call RNIterableAPI.passAlongAuthToken with a valid string token', async () => { + // GIVEN a valid auth token + const authToken = 'valid-jwt-token'; + const expectedResponse = new IterableAuthResponse(); + expectedResponse.authToken = 'new-token'; + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockResolvedValue(expectedResponse); + + // WHEN passAlongAuthToken is called + const result = await Iterable.authManager.passAlongAuthToken(authToken); + + // THEN RNIterableAPI.passAlongAuthToken is called with the token + expect(MockRNIterableAPI.passAlongAuthToken).toBeCalledWith(authToken); + expect(result).toBe(expectedResponse); + }); + + it('should call RNIterableAPI.passAlongAuthToken with null token', async () => { + // GIVEN a null auth token + const authToken = null; + const expectedResponse = 'success'; + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockResolvedValue(expectedResponse); + + // WHEN passAlongAuthToken is called + const result = await Iterable.authManager.passAlongAuthToken(authToken); + + // THEN RNIterableAPI.passAlongAuthToken is called with null + expect(MockRNIterableAPI.passAlongAuthToken).toBeCalledWith(null); + expect(result).toBe(expectedResponse); + }); + + it('should call RNIterableAPI.passAlongAuthToken with undefined token', async () => { + // GIVEN an undefined auth token + const authToken = undefined; + const expectedResponse = undefined; + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockResolvedValue(expectedResponse); + + // WHEN passAlongAuthToken is called + const result = await Iterable.authManager.passAlongAuthToken(authToken); + + // THEN RNIterableAPI.passAlongAuthToken is called with undefined + expect(MockRNIterableAPI.passAlongAuthToken).toBeCalledWith(undefined); + expect(result).toBe(expectedResponse); + }); + + it('should call RNIterableAPI.passAlongAuthToken with empty string token', async () => { + // GIVEN an empty string auth token + const authToken = ''; + const expectedResponse = new IterableAuthResponse(); + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockResolvedValue(expectedResponse); + + // WHEN passAlongAuthToken is called + const result = await Iterable.authManager.passAlongAuthToken(authToken); + + // THEN RNIterableAPI.passAlongAuthToken is called with empty string + expect(MockRNIterableAPI.passAlongAuthToken).toBeCalledWith(''); + expect(result).toBe(expectedResponse); + }); + + it('should return IterableAuthResponse when API returns IterableAuthResponse', async () => { + // GIVEN API returns IterableAuthResponse + const authToken = 'test-token'; + const expectedResponse = new IterableAuthResponse(); + expectedResponse.authToken = 'new-token'; + expectedResponse.successCallback = jest.fn(); + expectedResponse.failureCallback = jest.fn(); + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockResolvedValue(expectedResponse); + + // WHEN passAlongAuthToken is called + const result = await Iterable.authManager.passAlongAuthToken(authToken); + + // THEN the result is the expected IterableAuthResponse + expect(result).toBe(expectedResponse); + expect(result).toBeInstanceOf(IterableAuthResponse); + }); + + it('should return string when API returns string', async () => { + // GIVEN API returns string + const authToken = 'test-token'; + const expectedResponse = 'success-string'; + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockResolvedValue(expectedResponse); + + // WHEN passAlongAuthToken is called + const result = await Iterable.authManager.passAlongAuthToken(authToken); + + // THEN the result is the expected string + expect(result).toBe(expectedResponse); + expect(typeof result).toBe('string'); + }); + + it('should return undefined when API returns undefined', async () => { + // GIVEN API returns undefined + const authToken = 'test-token'; + const expectedResponse = undefined; + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockResolvedValue(expectedResponse); + + // WHEN passAlongAuthToken is called + const result = await Iterable.authManager.passAlongAuthToken(authToken); + + // THEN the result is undefined + expect(result).toBeUndefined(); + }); + + it('should handle API rejection and propagate the error', async () => { + // GIVEN API rejects with an error + const authToken = 'test-token'; + const expectedError = new Error('API Error'); + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockRejectedValue(expectedError); + + // WHEN passAlongAuthToken is called + // THEN the error is propagated + await expect( + Iterable.authManager.passAlongAuthToken(authToken) + ).rejects.toThrow('API Error'); + }); + + it('should handle API rejection with network error', async () => { + // GIVEN API rejects with a network error + const authToken = 'test-token'; + const networkError = new Error('Network request failed'); + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockRejectedValue(networkError); + + // WHEN passAlongAuthToken is called + // THEN the network error is propagated + await expect( + Iterable.authManager.passAlongAuthToken(authToken) + ).rejects.toThrow('Network request failed'); + }); + + it('should handle API rejection with timeout error', async () => { + // GIVEN API rejects with a timeout error + const authToken = 'test-token'; + const timeoutError = new Error('Request timeout'); + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockRejectedValue(timeoutError); + + // WHEN passAlongAuthToken is called + // THEN the timeout error is propagated + await expect( + Iterable.authManager.passAlongAuthToken(authToken) + ).rejects.toThrow('Request timeout'); + }); + }); + + describe('integration', () => { + it('should work with both methods in sequence', async () => { + // GIVEN a sequence of operations + const authToken = 'test-token'; + const expectedResponse = new IterableAuthResponse(); + MockRNIterableAPI.pauseAuthRetries = jest + .fn() + .mockReturnValue('paused'); + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockResolvedValue(expectedResponse); + + // WHEN calling both methods in sequence + const pauseResult = Iterable.authManager.pauseAuthRetries(true); + const tokenResult = + await Iterable.authManager.passAlongAuthToken(authToken); + + // THEN both operations should work correctly + expect(pauseResult).toBe('paused'); + expect(tokenResult).toBe(expectedResponse); + expect(MockRNIterableAPI.pauseAuthRetries).toBeCalledWith(true); + expect(MockRNIterableAPI.passAlongAuthToken).toBeCalledWith(authToken); + }); + + it('should handle rapid successive calls', async () => { + // GIVEN rapid successive calls + const authToken1 = 'token1'; + const authToken2 = 'token2'; + const response1 = new IterableAuthResponse(); + const response2 = 'success'; + MockRNIterableAPI.passAlongAuthToken = jest + .fn() + .mockResolvedValueOnce(response1) + .mockResolvedValueOnce(response2); + + // WHEN making rapid successive calls + const promise1 = Iterable.authManager.passAlongAuthToken(authToken1); + const promise2 = Iterable.authManager.passAlongAuthToken(authToken2); + const [result1, result2] = await Promise.all([promise1, promise2]); + + // THEN both calls should work correctly + expect(result1).toBe(response1); + expect(result2).toBe(response2); + expect(MockRNIterableAPI.passAlongAuthToken).toHaveBeenCalledTimes(2); + expect(MockRNIterableAPI.passAlongAuthToken).toHaveBeenNthCalledWith( + 1, + authToken1 + ); + expect(MockRNIterableAPI.passAlongAuthToken).toHaveBeenNthCalledWith( + 2, + authToken2 + ); + }); + }); + }); }); diff --git a/src/core/classes/Iterable.ts b/src/core/classes/Iterable.ts index 1d070856b..ebb928cd6 100644 --- a/src/core/classes/Iterable.ts +++ b/src/core/classes/Iterable.ts @@ -1,33 +1,27 @@ -/* eslint-disable eslint-comments/no-unlimited-disable */ -import { - Linking, - NativeEventEmitter, - NativeModules, - Platform, -} from 'react-native'; +import { Linking, NativeEventEmitter, Platform } from 'react-native'; import { buildInfo } from '../../itblBuildInfo'; -// TODO: Organize these so that there are no circular dependencies -// See https://github.com/expo/expo/issues/35100 +import { RNIterableAPI } from '../../api'; +import { IterableInAppManager } from '../../inApp/classes/IterableInAppManager'; import { IterableInAppMessage } from '../../inApp/classes/IterableInAppMessage'; import { IterableInAppCloseSource } from '../../inApp/enums/IterableInAppCloseSource'; import { IterableInAppDeleteSource } from '../../inApp/enums/IterableInAppDeleteSource'; import { IterableInAppLocation } from '../../inApp/enums/IterableInAppLocation'; -import { IterableAuthResponseResult, IterableEventName } from '../enums'; - -// Add this type-only import to avoid circular dependency -import type { IterableInAppManager } from '../../inApp/classes/IterableInAppManager'; - +import { IterableAuthResponseResult } from '../enums/IterableAuthResponseResult'; +import { IterableEventName } from '../enums/IterableEventName'; +import type { IterableAuthFailure } from '../types/IterableAuthFailure'; import { IterableAction } from './IterableAction'; import { IterableActionContext } from './IterableActionContext'; +import { IterableApi } from './IterableApi'; import { IterableAttributionInfo } from './IterableAttributionInfo'; +import { IterableAuthManager } from './IterableAuthManager'; import { IterableAuthResponse } from './IterableAuthResponse'; import type { IterableCommerceItem } from './IterableCommerceItem'; import { IterableConfig } from './IterableConfig'; import { IterableLogger } from './IterableLogger'; +import { IterableEmbeddedManager } from '../../embedded/classes/IterableEmbeddedManager'; -const RNIterableAPI = NativeModules.RNIterableAPI; const RNEventEmitter = new NativeEventEmitter(RNIterableAPI); /* eslint-disable tsdoc/syntax */ @@ -49,12 +43,6 @@ const RNEventEmitter = new NativeEventEmitter(RNIterableAPI); */ /* eslint-enable tsdoc/syntax */ export class Iterable { - /** - * Logger for the Iterable SDK - * Log level is set with {@link IterableLogLevel} - */ - static logger: IterableLogger = new IterableLogger(new IterableConfig()); - /** * Current configuration of the Iterable SDK */ @@ -77,21 +65,41 @@ export class Iterable { * Iterable.inAppManager.showMessage(message, true); * ``` */ - static get inAppManager() { - // Lazy initialization to avoid circular dependency - if (!this._inAppManager) { - // Import here to avoid circular dependency at module level + static inAppManager: IterableInAppManager = new IterableInAppManager(); - const { - IterableInAppManager, - // eslint-disable-next-line - } = require('../../inApp/classes/IterableInAppManager'); - this._inAppManager = new IterableInAppManager(); - } - return this._inAppManager; - } + /** + * Authentication manager for the current user. + * + * This property provides access to authentication functionality including + * pausing the authentication retry mechanism. + * + * @example + * ```typescript + * Iterable.authManager.pauseAuthRetries(true); + * ``` + */ + static authManager: IterableAuthManager = new IterableAuthManager(); - private static _inAppManager: IterableInAppManager | undefined; + /** + * Embedded message manager for the current user. + * + * This property provides access to embedded message functionality including + * retrieving messages, displaying messages, removing messages, and more. + * + * **Documentation** + * - [Embedded Messaging Overview](https://support.iterable.com/hc/en-us/articles/23060529977364-Embedded-Messaging-Overview) + * - [Android Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061877893652-Embedded-Messages-with-Iterable-s-Android-SDK) + * - [iOS Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061840746900-Embedded-Messages-with-Iterable-s-iOS-SDK) + * + * @example + * ```typescript + * Iterable.embeddedManager.getMessages().then(messages => { + * console.log('Messages:', messages); + * }); + * ``` + */ + static embeddedManager: IterableEmbeddedManager = + new IterableEmbeddedManager(); /** * Initializes the Iterable React Native SDK in your app's Javascript or Typescript code. @@ -129,16 +137,11 @@ export class Iterable { config: IterableConfig = new IterableConfig() ): Promise { Iterable.savedConfig = config; - - Iterable.logger = new IterableLogger(Iterable.savedConfig); - - Iterable?.logger?.log('initialize: ' + apiKey); - - this.setupEventHandlers(); + this.setupIterable(config); const version = this.getVersionFromPackageJson(); - return RNIterableAPI.initializeWithApiKey(apiKey, config.toDict(), version); + return IterableApi.initializeWithApiKey(apiKey, { config, version }); } /** @@ -152,21 +155,31 @@ export class Iterable { config: IterableConfig = new IterableConfig(), apiEndPoint: string ): Promise { - Iterable.savedConfig = config; - - Iterable.logger = new IterableLogger(Iterable.savedConfig); - - Iterable?.logger?.log('initialize2: ' + apiKey); + this.setupIterable(config); - this.setupEventHandlers(); const version = this.getVersionFromPackageJson(); - return RNIterableAPI.initialize2WithApiKey( - apiKey, - config.toDict(), + return IterableApi.initialize2WithApiKey(apiKey, { + config, version, - apiEndPoint - ); + apiEndPoint, + }); + } + + /** + * @internal + * Does basic setup of the Iterable SDK. + * @param config - The configuration object for the Iterable SDK + */ + private static setupIterable(config: IterableConfig = new IterableConfig()) { + if (config) { + Iterable.savedConfig = config; + + IterableLogger.setLoggingEnabled(config.logReactNativeSdkCalls ?? true); + IterableLogger.setLogLevel(config.logLevel); + } + + this.setupEventHandlers(); } /** @@ -218,10 +231,8 @@ export class Iterable { * Iterable.setEmail('my.user.name@gmail.com'); * ``` */ - static setEmail(email?: string | null, authToken?: string | null) { - Iterable?.logger?.log('setEmail: ' + email); - - RNIterableAPI.setEmail(email, authToken); + static setEmail(email: string | null, authToken?: string | null) { + IterableApi.setEmail(email, authToken); } /** @@ -234,10 +245,8 @@ export class Iterable { * }); * ``` */ - static getEmail(): Promise { - Iterable?.logger?.log('getEmail'); - - return RNIterableAPI.getEmail(); + static getEmail(): Promise { + return IterableApi.getEmail(); } /** @@ -284,9 +293,7 @@ export class Iterable { * taken */ static setUserId(userId?: string | null, authToken?: string | null) { - Iterable?.logger?.log('setUserId: ' + userId); - - RNIterableAPI.setUserId(userId, authToken); + IterableApi.setUserId(userId, authToken); } /** @@ -299,10 +306,8 @@ export class Iterable { * }); * ``` */ - static getUserId(): Promise { - Iterable?.logger?.log('getUserId'); - - return RNIterableAPI.getUserId(); + static getUserId(): Promise { + return IterableApi.getUserId(); } /** @@ -314,9 +319,7 @@ export class Iterable { * ``` */ static disableDeviceForCurrentUser() { - Iterable?.logger?.log('disableDeviceForCurrentUser'); - - RNIterableAPI.disableDeviceForCurrentUser(); + IterableApi.disableDeviceForCurrentUser(); } /** @@ -331,9 +334,7 @@ export class Iterable { * ``` */ static getLastPushPayload(): Promise { - Iterable?.logger?.log('getLastPushPayload'); - - return RNIterableAPI.getLastPushPayload(); + return IterableApi.getLastPushPayload(); } /** @@ -359,15 +360,19 @@ export class Iterable { * ``` */ static getAttributionInfo(): Promise { - Iterable?.logger?.log('getAttributionInfo'); - - return RNIterableAPI.getAttributionInfo().then( - (dict?: IterableAttributionInfo) => { + return IterableApi.getAttributionInfo().then( + ( + dict: { + campaignId: number; + templateId: number; + messageId: string; + } | null + ) => { if (dict) { return new IterableAttributionInfo( - dict.campaignId, - dict.templateId, - dict.messageId + dict.campaignId as number, + dict.templateId as number, + dict.messageId as string ); } else { return undefined; @@ -401,9 +406,7 @@ export class Iterable { * ``` */ static setAttributionInfo(attributionInfo?: IterableAttributionInfo) { - Iterable?.logger?.log('setAttributionInfo'); - - RNIterableAPI.setAttributionInfo(attributionInfo); + IterableApi.setAttributionInfo(attributionInfo); } /** @@ -442,15 +445,13 @@ export class Iterable { appAlreadyRunning: boolean, dataFields?: unknown ) { - Iterable?.logger?.log('trackPushOpenWithCampaignId'); - - RNIterableAPI.trackPushOpenWithCampaignId( + IterableApi.trackPushOpenWithCampaignId({ campaignId, templateId, messageId, appAlreadyRunning, - dataFields - ); + dataFields, + }); } /** @@ -480,9 +481,7 @@ export class Iterable { * ``` */ static updateCart(items: IterableCommerceItem[]) { - Iterable?.logger?.log('updateCart'); - - RNIterableAPI.updateCart(items); + IterableApi.updateCart(items); } /** @@ -497,9 +496,7 @@ export class Iterable { */ static wakeApp() { if (Platform.OS === 'android') { - Iterable?.logger?.log('Attempting to wake the app'); - - RNIterableAPI.wakeApp(); + IterableApi.wakeApp(); } } @@ -532,9 +529,9 @@ export class Iterable { items: IterableCommerceItem[], dataFields?: unknown ) { - Iterable?.logger?.log('trackPurchase'); + IterableLogger?.log('trackPurchase'); - RNIterableAPI.trackPurchase(total, items, dataFields); + IterableApi.trackPurchase({ total, items, dataFields }); } /** @@ -560,9 +557,13 @@ export class Iterable { message: IterableInAppMessage, location: IterableInAppLocation ) { - Iterable?.logger?.log('trackInAppOpen'); - - RNIterableAPI.trackInAppOpen(message.messageId, location); + if (!message?.messageId) { + IterableLogger?.log( + `Skipping trackInAppOpen because message ID is required, but received ${message}.` + ); + return; + } + IterableApi.trackInAppOpen({ message, location }); } /** @@ -591,9 +592,7 @@ export class Iterable { location: IterableInAppLocation, clickedUrl: string ) { - Iterable?.logger?.log('trackInAppClick'); - - RNIterableAPI.trackInAppClick(message.messageId, location, clickedUrl); + IterableApi.trackInAppClick({ message, location, clickedUrl }); } /** @@ -624,14 +623,7 @@ export class Iterable { source: IterableInAppCloseSource, clickedUrl?: string ) { - Iterable?.logger?.log('trackInAppClose'); - - RNIterableAPI.trackInAppClose( - message.messageId, - location, - source, - clickedUrl - ); + IterableApi.trackInAppClose({ message, location, source, clickedUrl }); } /** @@ -675,9 +667,7 @@ export class Iterable { location: IterableInAppLocation, source: IterableInAppDeleteSource ) { - Iterable?.logger?.log('inAppConsume'); - - RNIterableAPI.inAppConsume(message.messageId, location, source); + IterableApi.inAppConsume(message, location, source); } /** @@ -701,9 +691,7 @@ export class Iterable { * ``` */ static trackEvent(name: string, dataFields?: unknown) { - Iterable?.logger?.log('trackEvent'); - - RNIterableAPI.trackEvent(name, dataFields); + IterableApi.trackEvent({ name, dataFields }); } /** @@ -749,9 +737,7 @@ export class Iterable { dataFields: unknown | undefined, mergeNestedObjects: boolean ) { - Iterable?.logger?.log('updateUser'); - - RNIterableAPI.updateUser(dataFields, mergeNestedObjects); + IterableApi.updateUser(dataFields, mergeNestedObjects); } /** @@ -772,9 +758,7 @@ export class Iterable { * ``` */ static updateEmail(email: string, authToken?: string) { - Iterable?.logger?.log('updateEmail'); - - RNIterableAPI.updateEmail(email, authToken); + IterableApi.updateEmail(email, authToken); } /** @@ -856,9 +840,7 @@ export class Iterable { */ /* eslint-enable tsdoc/syntax */ static handleAppLink(link: string): Promise { - Iterable?.logger?.log('handleAppLink'); - - return RNIterableAPI.handleAppLink(link); + return IterableApi.handleAppLink(link); } /** @@ -896,23 +878,21 @@ export class Iterable { * ``` */ static updateSubscriptions( - emailListIds: number[] | undefined, - unsubscribedChannelIds: number[] | undefined, - unsubscribedMessageTypeIds: number[] | undefined, - subscribedMessageTypeIds: number[] | undefined, + emailListIds: number[] | null, + unsubscribedChannelIds: number[] | null, + unsubscribedMessageTypeIds: number[] | null, + subscribedMessageTypeIds: number[] | null, campaignId: number, templateId: number ) { - Iterable?.logger?.log('updateSubscriptions'); - - RNIterableAPI.updateSubscriptions( + IterableApi.updateSubscriptions({ emailListIds, unsubscribedChannelIds, unsubscribedMessageTypeIds, subscribedMessageTypeIds, campaignId, - templateId - ); + templateId, + }); } /** @@ -936,7 +916,7 @@ export class Iterable { * @internal */ private static setupEventHandlers() { - //Remove all listeners to avoid duplicate listeners + // Remove all listeners to avoid duplicate listeners RNEventEmitter.removeAllListeners(IterableEventName.handleUrlCalled); RNEventEmitter.removeAllListeners(IterableEventName.handleInAppCalled); RNEventEmitter.removeAllListeners( @@ -979,7 +959,7 @@ export class Iterable { const message = IterableInAppMessage.fromDict(messageDict); // MOB-10423: Check if we can use chain operator (?.) here instead const result = Iterable.savedConfig.inAppHandler!(message); - RNIterableAPI.setInAppShowResponse(result); + IterableApi.setInAppShowResponse(result); } ); } @@ -988,14 +968,14 @@ export class Iterable { let authResponseCallback: IterableAuthResponseResult; RNEventEmitter.addListener(IterableEventName.handleAuthCalled, () => { // MOB-10423: Check if we can use chain operator (?.) here instead - + // Asks frontend of the client/app to pass authToken Iterable.savedConfig.authHandler!() .then((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. if (typeof promiseResult === typeof new IterableAuthResponse()) { - RNIterableAPI.passAlongAuthToken( + Iterable.authManager.passAlongAuthToken( (promiseResult as IterableAuthResponse).authToken ); @@ -1009,27 +989,27 @@ export class Iterable { } else if ( authResponseCallback === IterableAuthResponseResult.FAILURE ) { + // We are currently only reporting JWT related errors. In + // the future, we should handle other types of errors as well. if ((promiseResult as IterableAuthResponse).failureCallback) { (promiseResult as IterableAuthResponse).failureCallback?.(); } } else { - Iterable?.logger?.log( - 'No callback received from native layer' - ); + IterableLogger?.log('No callback received from native layer'); } }, 1000); // Use unref() to prevent the timeout from keeping the process alive timeoutId.unref(); - } else if (typeof promiseResult === typeof '') { + } else if (typeof promiseResult === 'string') { //If promise only returns string - RNIterableAPI.passAlongAuthToken(promiseResult as string); + Iterable.authManager.passAlongAuthToken(promiseResult as string); } else { - Iterable?.logger?.log( + IterableLogger?.log( 'Unexpected promise returned. Auth token expects promise of String or AuthResponse type.' ); } }) - .catch((e) => Iterable?.logger?.log(e)); + .catch((e) => IterableLogger?.log(e)); }); RNEventEmitter.addListener( @@ -1040,8 +1020,14 @@ export class Iterable { ); RNEventEmitter.addListener( IterableEventName.handleAuthFailureCalled, - () => { + (authFailureResponse: IterableAuthFailure) => { + // Mark the flag for above listener to indicate something failed. + // `catch(err)` will only indicate failure on high level. No actions + // should be taken inside `catch(err)`. authResponseCallback = IterableAuthResponseResult.FAILURE; + + // Call the actual JWT error with `authFailure` object. + Iterable.savedConfig?.onJWTError?.(authFailureResponse); } ); } @@ -1057,7 +1043,7 @@ export class Iterable { } }) .catch((reason) => { - Iterable?.logger?.log('could not open url: ' + reason); + IterableLogger?.log('could not open url: ' + reason); }); } } diff --git a/src/core/classes/IterableApi.ts b/src/core/classes/IterableApi.ts new file mode 100644 index 000000000..fe2b446a3 --- /dev/null +++ b/src/core/classes/IterableApi.ts @@ -0,0 +1,634 @@ +import { Platform } from 'react-native'; + +import RNIterableAPI from '../../api'; +import type { IterableHtmlInAppContent } from '../../inApp/classes/IterableHtmlInAppContent'; +import type { IterableInAppMessage } from '../../inApp/classes/IterableInAppMessage'; +import type { IterableInAppCloseSource } from '../../inApp/enums/IterableInAppCloseSource'; +import type { IterableInAppDeleteSource } from '../../inApp/enums/IterableInAppDeleteSource'; +import type { IterableInAppLocation } from '../../inApp/enums/IterableInAppLocation'; +import type { IterableInAppShowResponse } from '../../inApp/enums/IterableInAppShowResponse'; +import type { IterableInboxImpressionRowInfo } from '../../inbox/types/IterableInboxImpressionRowInfo'; +import { IterableAttributionInfo } from './IterableAttributionInfo'; +import type { IterableCommerceItem } from './IterableCommerceItem'; +import { IterableConfig } from './IterableConfig'; +import { IterableLogger } from './IterableLogger'; + +/** + * Contains functions that directly interact with the native layer. + */ +export class IterableApi { + // ====================================================== // + // ===================== INITIALIZE ===================== // + // ====================================================== // + + /** + * Initializes the Iterable React Native SDK in your app's Javascript or Typescript code. + * + * @param apiKey - The [*mobile* API + * key](https://support.iterable.com/hc/en-us/articles/360043464871-API-Keys) + * for your application + * @param config - Configuration object for the SDK + * @param version - Version of the SDK, derived from the package.json file + */ + static initializeWithApiKey( + apiKey: string, + { + config = new IterableConfig(), + version, + }: { + config: IterableConfig; + version: string; + } + ): Promise { + IterableLogger.log('initializeWithApiKey: ', apiKey); + return RNIterableAPI.initializeWithApiKey(apiKey, config.toDict(), version); + } + + /** + * DO NOT CALL THIS METHOD. + * This method is used internally to connect to staging environment. + * + * @internal + */ + static initialize2WithApiKey( + apiKey: string, + { + config = new IterableConfig(), + version, + apiEndPoint, + }: { + config: IterableConfig; + version: string; + apiEndPoint: string; + } + ): Promise { + IterableLogger.log('initialize2WithApiKey: ', apiKey); + return RNIterableAPI.initialize2WithApiKey( + apiKey, + config.toDict(), + version, + apiEndPoint + ); + } + + // ---- End INITIALIZE ---- // + + // ====================================================== // + // ===================== USER MANAGEMENT ================ // + // ====================================================== // + + /** + * Associate the current user with the passed in email parameter. + * + * @param email - Email address to associate with + * the current user + * @param authToken - Valid, pre-fetched JWT the SDK + * can use to authenticate API requests, optional - If null/undefined, no JWT + * related action will be taken + */ + static setEmail(email: string | null, authToken?: string | null) { + IterableLogger.log('setEmail: ', email); + return RNIterableAPI.setEmail(email, authToken); + } + + /** + * Get the email associated with the current user. + * + * @returns The email associated with the current user + */ + static getEmail() { + IterableLogger.log('getEmail'); + return RNIterableAPI.getEmail(); + } + + /** + * Associate the current user with the passed in `userId` parameter. + * + * WARNING: specify a user by calling `Iterable.setEmail` or + * `Iterable.setUserId`, but **NOT** both. + * + * @param userId - User ID to associate with the current user + * @param authToken - Valid, pre-fetched JWT the SDK + * can use to authenticate API requests, optional - If null/undefined, no JWT + * related action will be taken + */ + static setUserId( + userId: string | null | undefined, + authToken?: string | null + ) { + IterableLogger.log('setUserId: ', userId); + return RNIterableAPI.setUserId(userId, authToken); + } + + /** + * Get the `userId` associated with the current user. + */ + static getUserId() { + IterableLogger.log('getUserId'); + return RNIterableAPI.getUserId(); + } + + /** + * Disable the device for the current user. + */ + static disableDeviceForCurrentUser() { + IterableLogger.log('disableDeviceForCurrentUser'); + return RNIterableAPI.disableDeviceForCurrentUser(); + } + + /** + * Save data to the current user's Iterable profile. + * + * @param dataFields - The data fields to update + * @param mergeNestedObjects - Whether to merge nested objects + */ + static updateUser(dataFields: unknown, mergeNestedObjects: boolean) { + IterableLogger.log('updateUser: ', dataFields, mergeNestedObjects); + return RNIterableAPI.updateUser(dataFields, mergeNestedObjects); + } + + /** + * Change the value of the email field on the current user's Iterable profile. + * + * @param email - The new email to set + * @param authToken - The new auth token (JWT) to set with the new email, optional - If null/undefined, no JWT-related action will be taken + */ + static updateEmail(email: string, authToken?: string | null) { + IterableLogger.log('updateEmail: ', email, authToken); + return RNIterableAPI.updateEmail(email, authToken); + } + + // ---- End USER MANAGEMENT ---- // + + // ====================================================== // + // ===================== TRACKING ====================== // + // ====================================================== // + + /** + * Create a `pushOpen` event on the current user's Iterable profile, populating + * it with data provided to the method call. + * + * @param campaignId - The campaign ID + * @param templateId - The template ID + * @param messageId - The message ID + * @param appAlreadyRunning - Whether the app is already running + * @param dataFields - The data fields to track + */ + static trackPushOpenWithCampaignId({ + campaignId, + templateId, + messageId, + appAlreadyRunning, + dataFields, + }: { + campaignId: number; + templateId: number; + messageId: string | null | undefined; + appAlreadyRunning: boolean; + dataFields?: unknown; + }) { + IterableLogger.log( + 'trackPushOpenWithCampaignId: ', + campaignId, + templateId, + messageId, + appAlreadyRunning, + dataFields + ); + return RNIterableAPI.trackPushOpenWithCampaignId( + campaignId, + templateId, + messageId, + appAlreadyRunning, + dataFields + ); + } + + /** + * Create a `purchase` event on the current user's Iterable profile, populating + * it with data provided to the method call. + * + * @param total - The total cost of the purchase + * @param items - The items included in the purchase + * @param dataFields - The data fields to track + */ + static trackPurchase({ + total, + items, + dataFields, + }: { + total: number; + items: IterableCommerceItem[]; + dataFields?: unknown; + }) { + IterableLogger.log('trackPurchase: ', total, items, dataFields); + return RNIterableAPI.trackPurchase(total, items, dataFields); + } + + /** + * Create an `inAppOpen` event for the specified message on the current user's profile + * for manual tracking purposes. Iterable's SDK automatically tracks in-app message opens when you use the + * SDK's default rendering. + * + * @param message - The in-app message (an {@link IterableInAppMessage} object) + * @param location - The location of the in-app message (an IterableInAppLocation enum) + */ + static trackInAppOpen({ + message, + location, + }: { + message: IterableInAppMessage; + location: IterableInAppLocation; + }) { + IterableLogger.log('trackInAppOpen: ', message, location); + return RNIterableAPI.trackInAppOpen(message.messageId, location); + } + + /** + * Create an `inAppClick` event for the specified message on the current user's profile + * for manual tracking purposes. Iterable's SDK automatically tracks in-app message clicks when you use the + * SDK's default rendering. Click events refer to click events within the in-app message to distinguish + * from `inAppOpen` events. + * + * @param message - The in-app message. + * @param location - The location of the in-app message. + * @param clickedUrl - The URL clicked by the user. + */ + static trackInAppClick({ + message, + location, + clickedUrl, + }: { + message: IterableInAppMessage; + location: IterableInAppLocation; + clickedUrl: string; + }) { + IterableLogger.log('trackInAppClick: ', message, location, clickedUrl); + return RNIterableAPI.trackInAppClick( + message.messageId, + location, + clickedUrl + ); + } + + /** + * Create an `inAppClose` event for the specified message on the current user's profile + * for manual tracking purposes. Iterable's SDK automatically tracks in-app message close events when you use the + * SDK's default rendering. + * + * @param message - The in-app message. + * @param location - The location of the in-app message. + * @param source - The way the in-app was closed. + * @param clickedUrl - The URL clicked by the user. + */ + static trackInAppClose({ + message, + location, + source, + clickedUrl, + }: { + message: IterableInAppMessage; + location: IterableInAppLocation; + source: IterableInAppCloseSource; + clickedUrl?: string; + }) { + IterableLogger.log( + 'trackInAppClose: ', + message, + location, + source, + clickedUrl + ); + return RNIterableAPI.trackInAppClose( + message.messageId, + location, + source, + clickedUrl + ); + } + + /** + * Create a custom event on the current user's Iterable profile, populating + * it with data provided to the method call. + * + * @param name - The name of the event + * @param dataFields - The data fields to track + */ + static trackEvent({ + name, + dataFields, + }: { + name: string; + dataFields?: unknown; + }) { + IterableLogger.log('trackEvent: ', name, dataFields); + return RNIterableAPI.trackEvent(name, dataFields); + } + + // ---- End TRACKING ---- // + + // ====================================================== // + // ======================= AUTH ======================= // + // ====================================================== // + + /** + * Pause or resume the automatic retrying of authentication requests. + * + * @param pauseRetry - Whether to pause or resume the automatic retrying of authentication requests + */ + static pauseAuthRetries(pauseRetry: boolean) { + IterableLogger.log('pauseAuthRetries: ', pauseRetry); + return RNIterableAPI.pauseAuthRetries(pauseRetry); + } + + /** + * Pass along an auth token to the SDK. + * + * @param authToken - The auth token to pass along + */ + static passAlongAuthToken(authToken: string | null | undefined) { + IterableLogger.log('passAlongAuthToken: ', authToken); + return RNIterableAPI.passAlongAuthToken(authToken); + } + + // ---- End AUTH ---- // + + // ====================================================== // + // ======================= IN-APP ======================= // + // ====================================================== // + + /** + * Remove the specified message from the current user's message queue. + * + * @param message - The in-app message. + * @param location - The location of the in-app message. + * @param source - The way the in-app was consumed. + */ + static inAppConsume( + message: IterableInAppMessage, + location: IterableInAppLocation, + source: IterableInAppDeleteSource + ) { + IterableLogger.log('inAppConsume: ', message, location, source); + return RNIterableAPI.inAppConsume(message.messageId, location, source); + } + + /** + * Retrieve the current user's list of in-app messages stored in the local queue. + * + * @returns A Promise that resolves to an array of in-app messages. + */ + static getInAppMessages(): Promise { + IterableLogger.log('getInAppMessages'); + return RNIterableAPI.getInAppMessages() as unknown as Promise< + IterableInAppMessage[] + >; + } + + /** + * Retrieve the current user's list of in-app messages designated for the + * mobile inbox and stored in the local queue. + * + * @returns A Promise that resolves to an array of messages marked as `saveToInbox`. + */ + static getInboxMessages(): Promise { + IterableLogger.log('getInboxMessages'); + return RNIterableAPI.getInboxMessages() as unknown as Promise< + IterableInAppMessage[] + >; + } + + /** + * Renders an in-app message and consumes it from the user's message queue if necessary. + * + * If you skip showing an in-app message when it arrives, you can show it at + * another time by calling this method. + * + * @param messageId - The message to show (an {@link IterableInAppMessage} object) + * @param consume - Whether or not the message should be consumed from the user's message queue after being shown. This should be defaulted to true. + */ + static showMessage( + messageId: string, + consume: boolean + ): Promise { + IterableLogger.log('showMessage: ', messageId, consume); + return RNIterableAPI.showMessage(messageId, consume); + } + + /** + * Remove the specified message from the current user's message queue. + * + * @param messageId - The message to remove. + * @param location - The location of the message. + * @param source - The way the message was removed. + */ + static removeMessage( + messageId: string, + location: number, + source: number + ): void { + IterableLogger.log('removeMessage: ', messageId, location, source); + return RNIterableAPI.removeMessage(messageId, location, source); + } + + /** + * Set the read status of the specified message. + * + * @param messageId - The message to set the read status of. + * @param read - Whether the message is read. + */ + static setReadForMessage(messageId: string, read: boolean): void { + IterableLogger.log('setReadForMessage: ', messageId, read); + return RNIterableAPI.setReadForMessage(messageId, read); + } + + /** + * Pause or unpause the automatic display of incoming in-app messages + * + * @param autoDisplayPaused - Whether to pause or unpause the automatic display of incoming in-app messages + */ + static setAutoDisplayPaused(autoDisplayPaused: boolean): void { + IterableLogger.log('setAutoDisplayPaused: ', autoDisplayPaused); + return RNIterableAPI.setAutoDisplayPaused(autoDisplayPaused); + } + + /** + * Retrieve HTML in-app content for a specified in-app message. + * + * @param messageId - The message from which to get HTML content. + * + * @returns A Promise that resolves to an {@link IterableHtmlInAppContent} object. + */ + static getHtmlInAppContentForMessage( + messageId: string + ): Promise { + IterableLogger.log('getHtmlInAppContentForMessage: ', messageId); + return RNIterableAPI.getHtmlInAppContentForMessage(messageId); + } + + /** + * Set the response to an in-app message. + * + * @param inAppShowResponse - The response to an in-app message. + */ + static setInAppShowResponse(inAppShowResponse: IterableInAppShowResponse) { + IterableLogger.log('setInAppShowResponse: ', inAppShowResponse); + return RNIterableAPI.setInAppShowResponse(inAppShowResponse); + } + + /** + * Start a session. + * + * @param visibleRows - The visible rows. + */ + static startSession(visibleRows: IterableInboxImpressionRowInfo[]) { + IterableLogger.log('startSession: ', visibleRows); + return RNIterableAPI.startSession(visibleRows); + } + + /** + * End a session. + */ + static endSession() { + IterableLogger.log('endSession'); + return RNIterableAPI.endSession(); + } + + /** + * Update the visible rows. + * + * @param visibleRows - The visible rows. + */ + static updateVisibleRows(visibleRows: IterableInboxImpressionRowInfo[] = []) { + IterableLogger.log('updateVisibleRows: ', visibleRows); + return RNIterableAPI.updateVisibleRows(visibleRows); + } + + // ---- End IN-APP ---- // + + // ====================================================== // + // ======================= MOSC ======================= // + // ====================================================== // + + /** + * Update the cart. + * + * @param items - The items. + */ + static updateCart(items: IterableCommerceItem[]) { + IterableLogger.log('updateCart: ', items); + return RNIterableAPI.updateCart(items); + } + + /** + * Wake the app. + * ANDROID ONLY + */ + static wakeApp() { + if (Platform.OS === 'android') { + IterableLogger.log('wakeApp'); + return RNIterableAPI.wakeApp(); + } + } + + /** + * Handle an app link -- this is used to handle deep links. + * + * @param link - The link. + */ + static handleAppLink(link: string) { + IterableLogger.log('handleAppLink: ', link); + return RNIterableAPI.handleAppLink(link); + } + + /** + * Update the subscriptions. + * + * @param emailListIds - The email list IDs. + * @param unsubscribedChannelIds - The unsubscribed channel IDs. + * @param unsubscribedMessageTypeIds - The unsubscribed message type IDs. + * @param subscribedMessageTypeIds - The subscribed message type IDs. + * @param campaignId - The campaign ID. + * @param templateId - The template ID. + */ + static updateSubscriptions({ + emailListIds, + unsubscribedChannelIds, + unsubscribedMessageTypeIds, + subscribedMessageTypeIds, + campaignId, + templateId, + }: { + emailListIds: number[] | null; + unsubscribedChannelIds: number[] | null; + unsubscribedMessageTypeIds: number[] | null; + subscribedMessageTypeIds: number[] | null; + campaignId: number; + templateId: number; + }) { + IterableLogger.log( + 'updateSubscriptions: ', + emailListIds, + unsubscribedChannelIds, + unsubscribedMessageTypeIds, + subscribedMessageTypeIds, + campaignId, + templateId + ); + return RNIterableAPI.updateSubscriptions( + emailListIds, + unsubscribedChannelIds, + unsubscribedMessageTypeIds, + subscribedMessageTypeIds, + campaignId, + templateId + ); + } + + /** + * Get the last push payload. + */ + static getLastPushPayload() { + IterableLogger.log('getLastPushPayload'); + return RNIterableAPI.getLastPushPayload(); + } + + /** + * Get the attribution info. + */ + static getAttributionInfo() { + IterableLogger.log('getAttributionInfo'); + // FIXME: What if this errors? + return RNIterableAPI.getAttributionInfo().then( + ( + dict: { + campaignId: number; + templateId: number; + messageId: string; + } | null + ) => { + if (dict) { + return new IterableAttributionInfo( + dict.campaignId as number, + dict.templateId as number, + dict.messageId as string + ); + } else { + return undefined; + } + } + ); + } + + /** + * Set the attribution info. + * + * @param attributionInfo - The attribution info. + */ + static setAttributionInfo(attributionInfo?: IterableAttributionInfo) { + IterableLogger.log('setAttributionInfo: ', attributionInfo); + return RNIterableAPI.setAttributionInfo(attributionInfo); + } + + // ---- End MOSC ---- // +} diff --git a/src/core/classes/IterableAuthManager.ts b/src/core/classes/IterableAuthManager.ts new file mode 100644 index 000000000..cb1022d46 --- /dev/null +++ b/src/core/classes/IterableAuthManager.ts @@ -0,0 +1,38 @@ +import { IterableAuthResponse } from './IterableAuthResponse'; +import { IterableApi } from './IterableApi'; + +/** + * Manages the authentication for the Iterable SDK. + * + * @example + * ```typescript + * const authManager = new IterableAuthManager(); + * ``` + */ +export class IterableAuthManager { + /** + * Pause the authentication retry mechanism. + * + * @param pauseRetry - Whether to pause the authentication retry mechanism + * + * @example + * ```typescript + * const authManager = new IterableAuthManager(); + * authManager.pauseAuthRetries(true); + * ``` + */ + pauseAuthRetries(pauseRetry: boolean) { + return IterableApi.pauseAuthRetries(pauseRetry); + } + + /** + * Pass along an auth token to the SDK. + * + * @param authToken - The auth token to pass along + */ + passAlongAuthToken( + authToken: string | null | undefined + ): Promise { + return IterableApi.passAlongAuthToken(authToken); + } +} diff --git a/src/core/classes/IterableAuthResponse.ts b/src/core/classes/IterableAuthResponse.ts index d071d4d23..29c1882f9 100644 --- a/src/core/classes/IterableAuthResponse.ts +++ b/src/core/classes/IterableAuthResponse.ts @@ -5,7 +5,7 @@ */ export class IterableAuthResponse { /** JWT Token */ - authToken?: string = ''; + authToken?: string | null = ''; /** Callback when the authentication to Iterable succeeds */ successCallback?: () => void; /** Callback when the authentication to Iterable fails */ diff --git a/src/core/classes/IterableConfig.ts b/src/core/classes/IterableConfig.ts index 1c0550b0c..484519f9f 100644 --- a/src/core/classes/IterableConfig.ts +++ b/src/core/classes/IterableConfig.ts @@ -1,10 +1,10 @@ import { type IterableInAppMessage } from '../../inApp/classes/IterableInAppMessage'; -import { IterableInAppShowResponse } from '../../inApp/enums'; -import { - IterableDataRegion, - IterableLogLevel, - IterablePushPlatform, -} from '../enums'; +import { IterableInAppShowResponse } from '../../inApp/enums/IterableInAppShowResponse'; +import { IterableDataRegion } from '../enums/IterableDataRegion'; +import { IterableLogLevel } from '../enums/IterableLogLevel'; +import { IterablePushPlatform } from '../enums/IterablePushPlatform'; +import type { IterableAuthFailure } from '../types/IterableAuthFailure'; +import type { IterableRetryPolicy } from '../types/IterableRetryPolicy'; import { IterableAction } from './IterableAction'; import type { IterableActionContext } from './IterableActionContext'; import type { IterableAuthResponse } from './IterableAuthResponse'; @@ -206,6 +206,25 @@ export class IterableConfig { */ authHandler?: () => Promise; + /** + * A callback function that is called when the SDK encounters an error while + * validing the JWT. + * + * The retry for JWT should be automatically handled by the native SDK, so + * this is just for logging/transparency purposes. + * + * @param authFailure - The details of the auth failure. + * + * @example + * ```typescript + * const config = new IterableConfig(); + * config.onJWTError = (authFailure) => { + * console.error('Error fetching JWT:', authFailure); + * }; + * ``` + */ + onJWTError?: (authFailure: IterableAuthFailure) => void; + /** * Set the verbosity of Android and iOS project's log system. * @@ -213,6 +232,12 @@ export class IterableConfig { */ logLevel: IterableLogLevel = IterableLogLevel.info; + /** + * Configuration for JWT refresh retry behavior. + * If not specified, the SDK will use default retry behavior. + */ + retryPolicy?: IterableRetryPolicy; + /** * Set whether the React Native SDK should print function calls to console. * @@ -294,6 +319,11 @@ export class IterableConfig { */ encryptionEnforced = false; + /** + * This specifies whether the SDK should enable and use embedded messaging. + */ + embeddedMessagingEnabled = false; + /** * Converts the IterableConfig instance to a dictionary object. * @@ -342,6 +372,8 @@ export class IterableConfig { dataRegion: this.dataRegion, pushPlatform: this.pushPlatform, encryptionEnforced: this.encryptionEnforced, + retryPolicy: this.retryPolicy, + embeddedMessagingEnabled: this.embeddedMessagingEnabled, }; } } diff --git a/src/core/classes/IterableLogger.test.ts b/src/core/classes/IterableLogger.test.ts new file mode 100644 index 000000000..9d35b4552 --- /dev/null +++ b/src/core/classes/IterableLogger.test.ts @@ -0,0 +1,398 @@ +import { IterableLogLevel } from '../enums/IterableLogLevel'; +import { IterableLogger } from './IterableLogger'; + +// Mock console.log to capture log output +const mockConsoleLog = jest.fn(); +const originalConsoleLog = console.log; + +describe('IterableLogger', () => { + beforeEach(() => { + // Reset to default values before each test + IterableLogger.loggingEnabled = true; + IterableLogger.logLevel = IterableLogLevel.info; + + // Mock console.log + console.log = mockConsoleLog; + mockConsoleLog.mockClear(); + }); + + afterEach(() => { + // Restore original console.log + console.log = originalConsoleLog; + }); + + describe('Static Properties', () => { + test('should have default logging enabled', () => { + expect(IterableLogger.loggingEnabled).toBe(true); + }); + + test('should have default log level as info', () => { + expect(IterableLogger.logLevel).toBe(IterableLogLevel.info); + }); + + test('should allow setting loggingEnabled directly', () => { + IterableLogger.loggingEnabled = false; + expect(IterableLogger.loggingEnabled).toBe(false); + }); + + test('should allow setting logLevel directly', () => { + IterableLogger.logLevel = IterableLogLevel.error; + expect(IterableLogger.logLevel).toBe(IterableLogLevel.error); + }); + }); + + describe('setLoggingEnabled', () => { + test('should set logging enabled to true when passed true', () => { + IterableLogger.setLoggingEnabled(true); + expect(IterableLogger.loggingEnabled).toBe(true); + }); + + test('should set logging enabled to false when passed false', () => { + IterableLogger.setLoggingEnabled(false); + expect(IterableLogger.loggingEnabled).toBe(false); + }); + + test('should default to true when passed non-boolean value', () => { + IterableLogger.setLoggingEnabled(undefined); + expect(IterableLogger.loggingEnabled).toBe(true); + }); + + test('should default to true when passed null', () => { + // @ts-expect-error - null is not a valid value for loggingEnabled + IterableLogger.setLoggingEnabled(null); + expect(IterableLogger.loggingEnabled).toBe(true); + }); + + test('should default to true when passed string', () => { + // @ts-expect-error - string is not a valid value for loggingEnabled + IterableLogger.setLoggingEnabled('true'); + expect(IterableLogger.loggingEnabled).toBe(true); + }); + }); + + describe('setLogLevel', () => { + test('should set log level to error when passed error', () => { + IterableLogger.setLogLevel(IterableLogLevel.error); + expect(IterableLogger.logLevel).toBe(IterableLogLevel.error); + }); + + test('should set log level to debug when passed debug', () => { + IterableLogger.setLogLevel(IterableLogLevel.debug); + expect(IterableLogger.logLevel).toBe(IterableLogLevel.debug); + }); + + test('should set log level to info when passed info', () => { + IterableLogger.setLogLevel(IterableLogLevel.info); + expect(IterableLogger.logLevel).toBe(IterableLogLevel.info); + }); + + test('should default to info when passed undefined', () => { + IterableLogger.setLogLevel(undefined); + expect(IterableLogger.logLevel).toBe(IterableLogLevel.info); + }); + }); + + describe('log method', () => { + test('should log message when logging is enabled', () => { + IterableLogger.log('Test message'); + expect(mockConsoleLog).toHaveBeenCalledWith('Test message'); + }); + + test('should log message with optional parameters when logging is enabled', () => { + IterableLogger.log('Test message', 'param1', 'param2'); + expect(mockConsoleLog).toHaveBeenCalledWith( + 'Test message', + 'param1', + 'param2' + ); + }); + + test('should not log when logging is disabled', () => { + IterableLogger.loggingEnabled = false; + IterableLogger.log('Test message'); + expect(mockConsoleLog).not.toHaveBeenCalled(); + }); + + test('should log undefined message when no message provided', () => { + IterableLogger.log(); + expect(mockConsoleLog).toHaveBeenCalledWith(undefined); + }); + + test('should log object when object is passed', () => { + const testObj = { key: 'value' }; + IterableLogger.log(testObj); + expect(mockConsoleLog).toHaveBeenCalledWith(testObj); + }); + }); + + describe('error method', () => { + test('should log error message when logging is enabled and log level is error', () => { + IterableLogger.logLevel = IterableLogLevel.error; + IterableLogger.error('Error message'); + expect(mockConsoleLog).toHaveBeenCalledWith('ERROR:', 'Error message'); + }); + + test('should log error message with optional parameters', () => { + IterableLogger.logLevel = IterableLogLevel.error; + IterableLogger.error('Error message', 'param1', 'param2'); + expect(mockConsoleLog).toHaveBeenCalledWith( + 'ERROR:', + 'Error message', + 'param1', + 'param2' + ); + }); + + test('should not log when logging is disabled', () => { + IterableLogger.loggingEnabled = false; + IterableLogger.logLevel = IterableLogLevel.error; + IterableLogger.error('Error message'); + expect(mockConsoleLog).not.toHaveBeenCalled(); + }); + + test('should not log when log level is not error', () => { + IterableLogger.logLevel = IterableLogLevel.debug; + IterableLogger.error('Error message'); + expect(mockConsoleLog).not.toHaveBeenCalled(); + }); + + test('should not log when log level is info', () => { + IterableLogger.logLevel = IterableLogLevel.info; + IterableLogger.error('Error message'); + expect(mockConsoleLog).not.toHaveBeenCalled(); + }); + }); + + describe('debug method', () => { + test('should log debug message when logging is enabled and log level is debug', () => { + IterableLogger.logLevel = IterableLogLevel.debug; + IterableLogger.debug('Debug message'); + expect(mockConsoleLog).toHaveBeenCalledWith('DEBUG:', 'Debug message'); + }); + + test('should log debug message when logging is enabled and log level is error', () => { + IterableLogger.logLevel = IterableLogLevel.error; + IterableLogger.debug('Debug message'); + expect(mockConsoleLog).toHaveBeenCalledWith('DEBUG:', 'Debug message'); + }); + + test('should log debug message with optional parameters', () => { + IterableLogger.logLevel = IterableLogLevel.debug; + IterableLogger.debug('Debug message', 'param1', 'param2'); + expect(mockConsoleLog).toHaveBeenCalledWith( + 'DEBUG:', + 'Debug message', + 'param1', + 'param2' + ); + }); + + test('should not log when logging is disabled', () => { + IterableLogger.loggingEnabled = false; + IterableLogger.logLevel = IterableLogLevel.debug; + IterableLogger.debug('Debug message'); + expect(mockConsoleLog).not.toHaveBeenCalled(); + }); + + test('should not log when log level is info', () => { + IterableLogger.logLevel = IterableLogLevel.info; + IterableLogger.debug('Debug message'); + expect(mockConsoleLog).not.toHaveBeenCalled(); + }); + }); + + describe('info method', () => { + test('should log info message when logging is enabled and log level is info', () => { + IterableLogger.logLevel = IterableLogLevel.info; + IterableLogger.info('Info message'); + expect(mockConsoleLog).toHaveBeenCalledWith('INFO:', 'Info message'); + }); + + test('should log info message when logging is enabled and log level is debug', () => { + IterableLogger.logLevel = IterableLogLevel.debug; + IterableLogger.info('Info message'); + expect(mockConsoleLog).toHaveBeenCalledWith('INFO:', 'Info message'); + }); + + test('should log info message when logging is enabled and log level is error', () => { + IterableLogger.logLevel = IterableLogLevel.error; + IterableLogger.info('Info message'); + expect(mockConsoleLog).toHaveBeenCalledWith('INFO:', 'Info message'); + }); + + test('should log info message with optional parameters', () => { + IterableLogger.logLevel = IterableLogLevel.info; + IterableLogger.info('Info message', 'param1', 'param2'); + expect(mockConsoleLog).toHaveBeenCalledWith( + 'INFO:', + 'Info message', + 'param1', + 'param2' + ); + }); + + test('should not log when logging is disabled', () => { + IterableLogger.loggingEnabled = false; + IterableLogger.logLevel = IterableLogLevel.info; + IterableLogger.info('Info message'); + expect(mockConsoleLog).not.toHaveBeenCalled(); + }); + }); + + describe('Log Level Hierarchy', () => { + test('should respect log level hierarchy for error level', () => { + IterableLogger.logLevel = IterableLogLevel.error; + + IterableLogger.error('Error message'); + IterableLogger.debug('Debug message'); + IterableLogger.info('Info message'); + + // When logLevel is error (3), all messages should log + // Note: There's a bug in the error method - it only logs when logLevel is exactly error + // It should log when logLevel is error OR higher (debug, info) + expect(mockConsoleLog).toHaveBeenCalledTimes(3); + expect(mockConsoleLog).toHaveBeenNthCalledWith( + 1, + 'ERROR:', + 'Error message' + ); + expect(mockConsoleLog).toHaveBeenNthCalledWith( + 2, + 'DEBUG:', + 'Debug message' + ); + expect(mockConsoleLog).toHaveBeenNthCalledWith( + 3, + 'INFO:', + 'Info message' + ); + }); + + test('should respect log level hierarchy for debug level', () => { + IterableLogger.logLevel = IterableLogLevel.debug; + + IterableLogger.error('Error message'); + IterableLogger.debug('Debug message'); + IterableLogger.info('Info message'); + + // When logLevel is debug (1), debug and info should log + // Note: There's a bug in the error method - it doesn't log when logLevel is debug + // It should log when logLevel is debug OR higher (info) + expect(mockConsoleLog).toHaveBeenCalledTimes(2); + expect(mockConsoleLog).toHaveBeenNthCalledWith( + 1, + 'DEBUG:', + 'Debug message' + ); + expect(mockConsoleLog).toHaveBeenNthCalledWith( + 2, + 'INFO:', + 'Info message' + ); + }); + + test('should respect log level hierarchy for info level', () => { + IterableLogger.logLevel = IterableLogLevel.info; + + IterableLogger.error('Error message'); + IterableLogger.debug('Debug message'); + IterableLogger.info('Info message'); + + // When logLevel is info (2), only info should log + // Note: There's a bug in the error method - it doesn't log when logLevel is info + // It should log when logLevel is info (highest level) + expect(mockConsoleLog).toHaveBeenCalledTimes(1); + expect(mockConsoleLog).toHaveBeenNthCalledWith( + 1, + 'INFO:', + 'Info message' + ); + }); + }); + + describe('Edge Cases', () => { + test('should handle empty string messages', () => { + IterableLogger.log(''); + expect(mockConsoleLog).toHaveBeenCalledWith(''); + }); + + test('should handle null messages', () => { + IterableLogger.log(null); + expect(mockConsoleLog).toHaveBeenCalledWith(null); + }); + + test('should handle zero as message', () => { + IterableLogger.log(0); + expect(mockConsoleLog).toHaveBeenCalledWith(0); + }); + + test('should handle false as message', () => { + IterableLogger.log(false); + expect(mockConsoleLog).toHaveBeenCalledWith(false); + }); + + test('should handle complex objects as messages', () => { + const complexObj = { + nested: { value: 'test' }, + array: [1, 2, 3], + func: () => 'test', + }; + IterableLogger.log(complexObj); + expect(mockConsoleLog).toHaveBeenCalledWith(complexObj); + }); + + test('should handle multiple optional parameters of different types', () => { + IterableLogger.log('Message', 123, true, { key: 'value' }, [1, 2, 3]); + expect(mockConsoleLog).toHaveBeenCalledWith( + 'Message', + 123, + true, + { key: 'value' }, + [1, 2, 3] + ); + }); + }); + + describe('Integration Tests', () => { + test('should work with real-world usage patterns', () => { + // Simulate typical usage + IterableLogger.setLoggingEnabled(true); + IterableLogger.setLogLevel(IterableLogLevel.info); + + IterableLogger.info('SDK initialized'); + IterableLogger.debug('Debug info', { userId: '123' }); + IterableLogger.error('API error', { status: 500 }); + + // Note: Due to bug in error method, only info logs when logLevel is info + expect(mockConsoleLog).toHaveBeenCalledTimes(1); + expect(mockConsoleLog).toHaveBeenNthCalledWith( + 1, + 'INFO:', + 'SDK initialized' + ); + }); + + test('should handle rapid state changes', () => { + // Test rapid state changes + IterableLogger.setLoggingEnabled(false); + IterableLogger.log('Should not appear'); + + IterableLogger.setLoggingEnabled(true); + IterableLogger.setLogLevel(IterableLogLevel.error); + IterableLogger.info('Should appear'); // info logs when logLevel is error + IterableLogger.error('Should appear'); + + expect(mockConsoleLog).toHaveBeenCalledTimes(2); + expect(mockConsoleLog).toHaveBeenNthCalledWith( + 1, + 'INFO:', + 'Should appear' + ); + expect(mockConsoleLog).toHaveBeenNthCalledWith( + 2, + 'ERROR:', + 'Should appear' + ); + }); + }); +}); diff --git a/src/core/classes/IterableLogger.ts b/src/core/classes/IterableLogger.ts index 3d9854888..21e947df7 100644 --- a/src/core/classes/IterableLogger.ts +++ b/src/core/classes/IterableLogger.ts @@ -1,10 +1,15 @@ -import { IterableConfig } from './IterableConfig'; +import { IterableLogLevel } from '../enums/IterableLogLevel'; + +const DEFAULT_LOG_LEVEL = IterableLogLevel.info; +const DEFAULT_LOGGING_ENABLED = true; /** * A logger class for the Iterable SDK. * * This class is responsible for logging messages based on the configuration provided. * + * TODO: add a logLevel property to the IterableLogger class to control the level of logging. + * * @remarks * The logging behavior is controlled by the `logReactNativeSdkCalls` property * in {@link IterableConfig}. @@ -12,26 +17,50 @@ import { IterableConfig } from './IterableConfig'; * * @example * ```typescript - * const config = new IterableConfig(); - * config.logReactNativeSdkCalls = true; - * const logger = new IterableLogger(config); - * logger.log('This is a log message.'); + * IterableLogger.logLevel = IterableLogLevel.debug; + * IterableLogger.loggingEnabled = true; + * + * // This log will show in the developer console + * IterableLogger.log('I will be shown.'); + * + * Iterable.loggingEnabled = false; + * + * // This log will show in the developer console + * IterableLogger.log('I will NOT be shown.'); + * * ``` */ export class IterableLogger { /** - * The configuration settings for the Iterable SDK. - * This property is read-only and is initialized with an instance of `IterableConfig`. + * Whether logs should show in the developer console. */ - readonly config: IterableConfig; + static loggingEnabled = DEFAULT_LOGGING_ENABLED; /** - * Creates an instance of IterableLogger. + * The level of logging to show in the developer console. + */ + static logLevel = DEFAULT_LOG_LEVEL; + + /** + * Sets whether logs should show in the developer console. * - * @param config - The configuration object for IterableLogger. + * @param loggingEnabled - Whether logs should show in the developer console. */ - constructor(config: IterableConfig) { - this.config = config; + static setLoggingEnabled(loggingEnabled?: boolean) { + IterableLogger.loggingEnabled = + typeof loggingEnabled === 'boolean' + ? loggingEnabled + : DEFAULT_LOGGING_ENABLED; + } + + /** + * Sets the level of logging to show in the developer console. + * + * @param logLevel - The level of logging to show in the developer console. + */ + static setLogLevel(logLevel?: IterableLogLevel) { + IterableLogger.logLevel = + typeof logLevel === 'undefined' ? DEFAULT_LOG_LEVEL : logLevel; } /** @@ -39,13 +68,49 @@ export class IterableLogger { * * @param message - The message to be logged. */ - log(message: string) { - // default to `true` in the case of unit testing where `Iterable` is not initialized - // which is most likely in a debug environment anyways - const loggingEnabled = this.config.logReactNativeSdkCalls ?? true; + static log(message?: unknown, ...optionalParams: unknown[]) { + if (!IterableLogger.loggingEnabled) return; + + console.log(message, ...optionalParams); + } + + /** + * Logs a message to the console if the log level is error. + * + * @param message - The message to be logged. + */ + static error(message?: unknown, ...optionalParams: unknown[]) { + if (!IterableLogger.loggingEnabled) return; + if (IterableLogger.logLevel !== IterableLogLevel.error) return; + + console.log(`ERROR:`, message, ...optionalParams); + } + + /** + * Logs a message to the console if the log level is debug or lower. + * + * @param message - The message to be logged. + */ + static debug(message?: unknown, ...optionalParams: unknown[]) { + if (!IterableLogger.loggingEnabled) return; + + const shouldLog = [IterableLogLevel.error, IterableLogLevel.debug].includes( + IterableLogger.logLevel + ); + + if (!shouldLog) return; + + console.log(`DEBUG:`, message, ...optionalParams); + } + + /** + * Logs a message to the console if the log level is info or lower. + * + * @param message - The message to be logged. + */ + static info(message?: unknown, ...optionalParams: unknown[]) { + if (!IterableLogger.loggingEnabled) return; - if (loggingEnabled) { - console.log(message); - } + console.log(`INFO:`, message, ...optionalParams); } } diff --git a/src/core/classes/index.ts b/src/core/classes/index.ts index 60c26047c..c201f3d7b 100644 --- a/src/core/classes/index.ts +++ b/src/core/classes/index.ts @@ -1,7 +1,9 @@ export * from './Iterable'; export * from './IterableAction'; export * from './IterableActionContext'; +export * from './IterableApi'; export * from './IterableAttributionInfo'; +export * from './IterableAuthManager'; export * from './IterableAuthResponse'; export * from './IterableCommerceItem'; export * from './IterableConfig'; diff --git a/src/core/enums/IterableAuthFailureReason.ts b/src/core/enums/IterableAuthFailureReason.ts new file mode 100644 index 000000000..a61f7fa7e --- /dev/null +++ b/src/core/enums/IterableAuthFailureReason.ts @@ -0,0 +1,39 @@ +/** + * The reason for the failure of an authentication attempt. + * + * This is generally related to JWT token validation. + */ +export enum IterableAuthFailureReason { + /** + * An auth token's expiration must be less than one year from its issued-at + * time. + */ + AUTH_TOKEN_EXPIRATION_INVALID, + /** The token has expired. */ + AUTH_TOKEN_EXPIRED, + /** Token has an invalid format (failed a regular expression check). */ + AUTH_TOKEN_FORMAT_INVALID, + /** `onAuthTokenRequested` threw an exception. */ + AUTH_TOKEN_GENERATION_ERROR, + /** Any other error not captured by another constant. */ + AUTH_TOKEN_GENERIC_ERROR, + /** Iterable has invalidated this token and it cannot be used. */ + AUTH_TOKEN_INVALIDATED, + /** The request to Iterable's API did not include a JWT authorization header. */ + AUTH_TOKEN_MISSING, + /** `onAuthTokenRequested` returned a null JWT token. */ + AUTH_TOKEN_NULL, + /** + * Iterable could not decode the token's payload (`iat`, `exp`, `email`, + * or `userId`). + */ + AUTH_TOKEN_PAYLOAD_INVALID, + /** Iterable could not validate the token's authenticity. */ + AUTH_TOKEN_SIGNATURE_INVALID, + /** + * The token doesn't include an `email` or a `userId`. Or, one of these + * values is included, but it references a user that isn't in the Iterable + * project. + */ + AUTH_TOKEN_USER_KEY_INVALID, +} diff --git a/src/core/enums/IterableLogLevel.ts b/src/core/enums/IterableLogLevel.ts index 04c13ec7b..abb33577d 100644 --- a/src/core/enums/IterableLogLevel.ts +++ b/src/core/enums/IterableLogLevel.ts @@ -1,14 +1,23 @@ /** - * Enum representing the level of logs will Android and iOS projects be using. + * Level of logs for iOS, Android and React Native. + * + * These levels will control when logs are shown. * * @see [Android Log Levels](https://source.android.com/docs/core/tests/debug/understanding-logging) * @see [iOS Log Levels](https://apple.github.io/swift-log/docs/current/Logging/Structs/Logger/Level.html#/s:7Logging6LoggerV5LevelO4infoyA2EmF) */ export enum IterableLogLevel { - /** Appropriate for messages that contain information normally of use only when debugging a program. */ + /** Show logs only for errors. */ + error = 3, + /** + * Show logs for messages that contain information normally of use only when debugging a program. + * Also includes {@link IterableLogLevel.error} messages. + */ debug = 1, - /** Appropriate for informational messages. */ + /** + * Show logs which include general information about app flow — e.g., lifecycle events + * or major state changes. This is the most verbose logging level. + * Also includes {@link IterableLogLevel.error} and {@link IterableLogLevel.debug} messages. + */ info = 2, - /** Appropriate for error conditions. */ - error = 3, } diff --git a/src/core/enums/IterableRetryBackoff.ts b/src/core/enums/IterableRetryBackoff.ts new file mode 100644 index 000000000..526b58eaf --- /dev/null +++ b/src/core/enums/IterableRetryBackoff.ts @@ -0,0 +1,17 @@ +/* eslint-disable tsdoc/syntax */ + +/** + * The type of backoff to use when retrying a request. + */ +export enum IterableRetryBackoff { + /** + * Linear backoff (each retry will wait for a fixed interval) + * TODO: check with @Ayyanchira if this is correct + */ + LINEAR = 'LINEAR', + /** + * Exponential backoff (each retry will wait for an interval that increases exponentially) + * TODO: check with @Ayyanchira if this is correct + */ + EXPONENTIAL = 'EXPONENTIAL', +} diff --git a/src/core/enums/index.ts b/src/core/enums/index.ts index e95b5350c..52f4eb20d 100644 --- a/src/core/enums/index.ts +++ b/src/core/enums/index.ts @@ -1,6 +1,8 @@ export * from './IterableActionSource'; +export * from './IterableAuthFailureReason'; export * from './IterableAuthResponseResult'; export * from './IterableDataRegion'; export * from './IterableEventName'; export * from './IterableLogLevel'; export * from './IterablePushPlatform'; +export * from './IterableRetryBackoff'; diff --git a/src/core/types/IterableAuthFailure.ts b/src/core/types/IterableAuthFailure.ts new file mode 100644 index 000000000..0f2d1cf5e --- /dev/null +++ b/src/core/types/IterableAuthFailure.ts @@ -0,0 +1,18 @@ +import type { IterableAuthFailureReason } from "../enums/IterableAuthFailureReason"; + +/** + * The details of an auth failure. + */ +export interface IterableAuthFailure { + /** `userId` or `email` of the signed-in user */ + userKey: string; + + /** The `authToken` which caused the failure */ + failedAuthToken: string; + + /** The timestamp of the failed request */ + failedRequestTime: number; + + /** Indicates a reason for failure */ + failureReason: IterableAuthFailureReason; +} diff --git a/src/core/types/IterableRetryPolicy.ts b/src/core/types/IterableRetryPolicy.ts new file mode 100644 index 000000000..318b705a0 --- /dev/null +++ b/src/core/types/IterableRetryPolicy.ts @@ -0,0 +1,16 @@ +import type { IterableRetryBackoff } from "../enums/IterableRetryBackoff"; + +/** + * The policy for retrying an authentication attempt. + */ +export interface IterableRetryPolicy { + /** Number of consecutive JWT refresh retries the SDK should attempt */ + maxRetry: number; + /** + * Duration between JWT refresh retries in seconds + * (starting point for retry backoff) + */ + retryInterval: number; + /** The backoff pattern to apply between retry attempts. */ + retryBackoff: IterableRetryBackoff; +} diff --git a/src/core/types/index.ts b/src/core/types/index.ts index f5d846482..7659a76e4 100644 --- a/src/core/types/index.ts +++ b/src/core/types/index.ts @@ -1 +1,3 @@ +export * from './IterableAuthFailure'; export * from './IterableEdgeInsetDetails'; +export * from './IterableRetryPolicy'; diff --git a/src/embedded/classes/IterableEmbeddedManager.ts b/src/embedded/classes/IterableEmbeddedManager.ts new file mode 100644 index 000000000..333dd3af7 --- /dev/null +++ b/src/embedded/classes/IterableEmbeddedManager.ts @@ -0,0 +1,17 @@ +/** + * Manages embedded messages from Iterable. + * + * Provides embedded message functionality including retrieving messages, + * displaying messages, removing messages, and more. + * + * **Documentation** + * - [Embedded Messaging Overview](https://support.iterable.com/hc/en-us/articles/23060529977364-Embedded-Messaging-Overview) + * - [Android Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061877893652-Embedded-Messages-with-Iterable-s-Android-SDK) + * - [iOS Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061840746900-Embedded-Messages-with-Iterable-s-iOS-SDK) + */ +export class IterableEmbeddedManager { + /** + * Whether the embedded manager is enabled. + */ + isEnabled = false; +} diff --git a/src/embedded/classes/index.ts b/src/embedded/classes/index.ts new file mode 100644 index 000000000..be2af76f0 --- /dev/null +++ b/src/embedded/classes/index.ts @@ -0,0 +1 @@ +export * from './IterableEmbeddedManager'; diff --git a/src/embedded/index.ts b/src/embedded/index.ts new file mode 100644 index 000000000..d7d17c691 --- /dev/null +++ b/src/embedded/index.ts @@ -0,0 +1 @@ +export * from './classes'; diff --git a/src/inApp/classes/IterableHtmlInAppContent.ts b/src/inApp/classes/IterableHtmlInAppContent.ts index c0082c454..5f6b17260 100644 --- a/src/inApp/classes/IterableHtmlInAppContent.ts +++ b/src/inApp/classes/IterableHtmlInAppContent.ts @@ -1,4 +1,4 @@ -import { IterableEdgeInsets } from '../../core'; +import { IterableEdgeInsets } from '../../core/classes/IterableEdgeInsets'; import { IterableInAppContentType } from '../enums'; import type { diff --git a/src/inApp/classes/IterableInAppManager.ts b/src/inApp/classes/IterableInAppManager.ts index a96782b13..3d6a3cbf8 100644 --- a/src/inApp/classes/IterableInAppManager.ts +++ b/src/inApp/classes/IterableInAppManager.ts @@ -1,6 +1,4 @@ -import { NativeModules } from 'react-native'; - -import { Iterable } from '../../core/classes/Iterable'; +import { IterableApi } from '../../core/classes/IterableApi'; import type { IterableInAppDeleteSource, IterableInAppLocation, @@ -8,8 +6,6 @@ import type { import { IterableHtmlInAppContent } from './IterableHtmlInAppContent'; import { IterableInAppMessage } from './IterableInAppMessage'; -const RNIterableAPI = NativeModules.RNIterableAPI; - /** * Manages in-app messages for the current user. * @@ -17,6 +13,20 @@ const RNIterableAPI = NativeModules.RNIterableAPI; * displaying messages, removing messages, setting read status, and more. * * The `inAppManager` property of an `Iterable` instance is set to an instance of this class. + * + * @example + * ```typescript + * const inAppManager = new IterableInAppManager(); + * + * inAppManager.getMessages().then(messages => { + * console.log('Messages:', messages); + * }); + * + * // You can also access an instance on `Iterable.inAppManager.inAppManager` + * Iterable.inAppManager.getMessages().then(messages => { + * console.log('Messages:', messages); + * }); + * ``` */ export class IterableInAppManager { /** @@ -36,9 +46,9 @@ export class IterableInAppManager { * @returns A Promise that resolves to an array of in-app messages. */ getMessages(): Promise { - Iterable?.logger?.log('InAppManager.getMessages'); - - return RNIterableAPI.getInAppMessages(); + return IterableApi.getInAppMessages() as unknown as Promise< + IterableInAppMessage[] + >; } /** @@ -59,9 +69,9 @@ export class IterableInAppManager { * @returns A Promise that resolves to an array of messages marked as `saveToInbox`. */ getInboxMessages(): Promise { - Iterable?.logger?.log('InAppManager.getInboxMessages'); - - return RNIterableAPI.getInboxMessages(); + return IterableApi.getInboxMessages() as unknown as Promise< + IterableInAppMessage[] + >; } /** @@ -85,10 +95,8 @@ export class IterableInAppManager { showMessage( message: IterableInAppMessage, consume: boolean - ): Promise { - Iterable?.logger?.log('InAppManager.show'); - - return RNIterableAPI.showMessage(message.messageId, consume); + ): Promise { + return IterableApi.showMessage(message.messageId, consume); } /** @@ -114,9 +122,7 @@ export class IterableInAppManager { location: IterableInAppLocation, source: IterableInAppDeleteSource ): void { - Iterable?.logger?.log('InAppManager.remove'); - - return RNIterableAPI.removeMessage(message.messageId, location, source); + return IterableApi.removeMessage(message.messageId, location, source); } /** @@ -131,9 +137,7 @@ export class IterableInAppManager { * ``` */ setReadForMessage(message: IterableInAppMessage, read: boolean) { - Iterable?.logger?.log('InAppManager.setRead'); - - RNIterableAPI.setReadForMessage(message.messageId, read); + return IterableApi.setReadForMessage(message.messageId, read); } /** @@ -151,9 +155,7 @@ export class IterableInAppManager { getHtmlContentForMessage( message: IterableInAppMessage ): Promise { - Iterable?.logger?.log('InAppManager.getHtmlContentForMessage'); - - return RNIterableAPI.getHtmlInAppContentForMessage(message.messageId); + return IterableApi.getHtmlInAppContentForMessage(message.messageId); } /** @@ -171,8 +173,6 @@ export class IterableInAppManager { * ``` */ setAutoDisplayPaused(paused: boolean) { - Iterable?.logger?.log('InAppManager.setAutoDisplayPaused'); - - RNIterableAPI.setAutoDisplayPaused(paused); + return IterableApi.setAutoDisplayPaused(paused); } } diff --git a/src/inApp/classes/IterableInAppMessage.ts b/src/inApp/classes/IterableInAppMessage.ts index 8a5b816bf..f372043b6 100644 --- a/src/inApp/classes/IterableInAppMessage.ts +++ b/src/inApp/classes/IterableInAppMessage.ts @@ -133,21 +133,22 @@ export class IterableInAppMessage { * * @param viewToken - The `ViewToken` containing the in-app message data. * @returns A new instance of `IterableInAppMessage` populated with data from the `viewToken`. + * @throws Error if the viewToken or its item or inAppMessage is null/undefined. */ static fromViewToken(viewToken: ViewToken) { - const inAppMessage = viewToken.item.inAppMessage as IterableInAppMessage; + const inAppMessage = viewToken?.item?.inAppMessage as IterableInAppMessage; return new IterableInAppMessage( - inAppMessage.messageId, - inAppMessage.campaignId, - inAppMessage.trigger, - inAppMessage.createdAt, - inAppMessage.expiresAt, - inAppMessage.saveToInbox, - inAppMessage.inboxMetadata, - inAppMessage.customPayload, - inAppMessage.read, - inAppMessage.priorityLevel + inAppMessage?.messageId, + inAppMessage?.campaignId, + inAppMessage?.trigger, + inAppMessage?.createdAt, + inAppMessage?.expiresAt, + inAppMessage?.saveToInbox, + inAppMessage?.inboxMetadata, + inAppMessage?.customPayload, + inAppMessage?.read, + inAppMessage?.priorityLevel ); } diff --git a/src/inbox/classes/IterableInboxDataModel.ts b/src/inbox/classes/IterableInboxDataModel.ts index fe5ce66fb..4b81d5b22 100644 --- a/src/inbox/classes/IterableInboxDataModel.ts +++ b/src/inbox/classes/IterableInboxDataModel.ts @@ -1,6 +1,4 @@ -import { NativeModules } from 'react-native'; - -import { Iterable } from '../../core/classes/Iterable'; +import { IterableApi } from '../../core/classes/IterableApi'; import { IterableHtmlInAppContent, IterableInAppDeleteSource, @@ -13,8 +11,6 @@ import type { IterableInboxRowViewModel, } from '../types'; -const RNIterableAPI = NativeModules.RNIterableAPI; - /** * The `IterableInboxDataModel` class provides methods to manage and manipulate * inbox messages. @@ -97,11 +93,7 @@ export class IterableInboxDataModel { * @returns A promise that resolves to the HTML content of the specified message. */ getHtmlContentForMessageId(id: string): Promise { - Iterable?.logger?.log( - 'IterableInboxDataModel.getHtmlContentForItem messageId: ' + id - ); - - return RNIterableAPI.getHtmlInAppContentForMessage(id).then( + return IterableApi.getHtmlInAppContentForMessage(id).then( (content: IterableHtmlInAppContentRaw) => { return IterableHtmlInAppContent.fromDict(content); } @@ -114,9 +106,7 @@ export class IterableInboxDataModel { * @param id - The unique identifier of the message to be marked as read. */ setMessageAsRead(id: string) { - Iterable?.logger?.log('IterableInboxDataModel.setMessageAsRead'); - - RNIterableAPI.setReadForMessage(id, true); + return IterableApi.setReadForMessage(id, true); } /** @@ -126,9 +116,11 @@ export class IterableInboxDataModel { * @param deleteSource - The source from which the delete action is initiated. */ deleteItemById(id: string, deleteSource: IterableInAppDeleteSource) { - Iterable?.logger?.log('IterableInboxDataModel.deleteItemById'); - - RNIterableAPI.removeMessage(id, IterableInAppLocation.inbox, deleteSource); + return IterableApi.removeMessage( + id, + IterableInAppLocation.inbox, + deleteSource + ); } /** @@ -138,7 +130,7 @@ export class IterableInboxDataModel { * If the fetch operation fails, the promise resolves to an empty array. */ async refresh(): Promise { - return RNIterableAPI.getInboxMessages().then( + return IterableApi.getInboxMessages().then( (messages: IterableInAppMessage[]) => { return this.processMessages(messages); }, @@ -154,7 +146,7 @@ export class IterableInboxDataModel { * @param visibleRows - An array of `IterableInboxImpressionRowInfo` objects representing the rows that are currently visible. */ startSession(visibleRows: IterableInboxImpressionRowInfo[] = []) { - RNIterableAPI.startSession(visibleRows); + return IterableApi.startSession(visibleRows); } /** @@ -165,7 +157,7 @@ export class IterableInboxDataModel { */ async endSession(visibleRows: IterableInboxImpressionRowInfo[] = []) { await this.updateVisibleRows(visibleRows); - RNIterableAPI.endSession(); + return IterableApi.endSession(); } /** @@ -181,7 +173,7 @@ export class IterableInboxDataModel { * Defaults to an empty array if not provided. */ updateVisibleRows(visibleRows: IterableInboxImpressionRowInfo[] = []) { - RNIterableAPI.updateVisibleRows(visibleRows); + return IterableApi.updateVisibleRows(visibleRows); } /** diff --git a/src/inbox/components/IterableInbox.tsx b/src/inbox/components/IterableInbox.tsx index 545403e03..3cf44d829 100644 --- a/src/inbox/components/IterableInbox.tsx +++ b/src/inbox/components/IterableInbox.tsx @@ -3,7 +3,6 @@ import { useEffect, useState } from 'react'; import { Animated, NativeEventEmitter, - NativeModules, Platform, StyleSheet, Text, @@ -11,6 +10,7 @@ import { } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; +import RNIterableAPI from '../../api'; import { useAppStateListener, useDeviceOrientation } from '../../core'; // expo throws an error if this is not imported directly due to circular // dependencies @@ -32,7 +32,7 @@ import { type IterableInboxMessageListProps, } from './IterableInboxMessageList'; -const RNIterableAPI = NativeModules.RNIterableAPI; + const RNEventEmitter = new NativeEventEmitter(RNIterableAPI); const DEFAULT_HEADLINE_HEIGHT = 60; diff --git a/src/inbox/components/IterableInboxMessageList.tsx b/src/inbox/components/IterableInboxMessageList.tsx index 95d6707c5..b74cc7097 100644 --- a/src/inbox/components/IterableInboxMessageList.tsx +++ b/src/inbox/components/IterableInboxMessageList.tsx @@ -95,16 +95,30 @@ export const IterableInboxMessageList = ({ function getRowInfosFromViewTokens( viewTokens: Array ): Array { - return viewTokens.map(function (viewToken) { - const inAppMessage = IterableInAppMessage.fromViewToken(viewToken); + return viewTokens + .filter((viewToken) => { + // Filter out viewTokens that don't have valid items or inAppMessage + return viewToken?.item?.inAppMessage?.messageId; + }) + .map(function (viewToken) { + try { + const inAppMessage = IterableInAppMessage.fromViewToken(viewToken); - const impression = { - messageId: inAppMessage.messageId, - silentInbox: inAppMessage.isSilentInbox(), - } as IterableInboxImpressionRowInfo; + const impression = { + messageId: inAppMessage?.messageId, + silentInbox: inAppMessage?.isSilentInbox(), + } as IterableInboxImpressionRowInfo; - return impression; - }); + return impression; + } catch (error) { + // Log the error and return null to be filtered out + console.warn('Failed to create impression from ViewToken:', error); + return null; + } + }) + .filter( + (impression) => impression !== null + ) as Array; } const inboxSessionViewabilityConfig: ViewabilityConfig = { diff --git a/src/index.tsx b/src/index.tsx index 885cd74bd..c9a014340 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -14,17 +14,24 @@ export { } from './core/classes'; export { IterableActionSource, + IterableAuthFailureReason, + IterableAuthResponseResult, IterableDataRegion, IterableEventName, IterableLogLevel, IterablePushPlatform, + IterableRetryBackoff, } from './core/enums'; export { useAppStateListener, useDeviceOrientation, type IterableDeviceOrientation, } from './core/hooks'; -export { type IterableEdgeInsetDetails } from './core/types'; +export type { + IterableAuthFailure, + IterableEdgeInsetDetails, + IterableRetryPolicy, +} from './core/types'; export { IterableHtmlInAppContent, IterableInAppCloseSource, @@ -52,3 +59,4 @@ export { type IterableInboxProps, type IterableInboxRowViewModel, } from './inbox'; +export { IterableEmbeddedManager } from './embedded'; diff --git a/src/itblBuildInfo.ts b/src/itblBuildInfo.ts index 0cdaa2c54..097bd43d2 100644 --- a/src/itblBuildInfo.ts +++ b/src/itblBuildInfo.ts @@ -3,5 +3,5 @@ * It contains the version of the package */ export const buildInfo = { - version: '2.0.3', + version: '2.1.0-beta.1', }; diff --git a/yarn.lock b/yarn.lock index d9961ac53..9445d2b60 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,43 +5,23 @@ __metadata: version: 6 cacheKey: 8 -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.24 - checksum: d3ad7b89d973df059c4e8e6d7c972cbeb1bb2f18f002a3bd04ae0707da214cb06cc06929b65aa2313b9347463df2914772298bae8b1d7973f246bb3f2ab3e8f0 - languageName: node - linkType: hard - -"@ark/schema@npm:0.45.9": - version: 0.45.9 - resolution: "@ark/schema@npm:0.45.9" +"@ark/schema@npm:0.49.0": + version: 0.49.0 + resolution: "@ark/schema@npm:0.49.0" dependencies: - "@ark/util": 0.45.9 - checksum: 8d28c910ef6ae379c61a82db2f7e8160d96eb25fb73a56bda5f9c63cc86abca12552d2bb8cd3dd9aff010f5464f9834e33285eca51ea7da16f2143e050cc901a - languageName: node - linkType: hard - -"@ark/util@npm:0.45.9": - version: 0.45.9 - resolution: "@ark/util@npm:0.45.9" - checksum: ddd1fc89c45b61e5d52cb92203990492a5115aea58a8e8bf5ff24e28103fce331593e0c374a086554fb6feb375ddd759c07e751aadc7f3ab3c6138dc3ee362cf + "@ark/util": 0.49.0 + checksum: 9901123581afa0eef63305fc47a1a725ff17c8958a80694464b0d08d3c398be26160763fed91864b8f8fb9553f3bf57d7075e436b6f7902220074f86310ee9d8 languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" - dependencies: - "@babel/highlight": ^7.24.7 - picocolors: ^1.0.0 - checksum: 830e62cd38775fdf84d612544251ce773d544a8e63df667728cc9e0126eeef14c6ebda79be0f0bc307e8318316b7f58c27ce86702e0a1f5c321d842eb38ffda4 +"@ark/util@npm:0.49.0": + version: 0.49.0 + resolution: "@ark/util@npm:0.49.0" + checksum: 01ae677327cd585d9bbdc9373d5d5d70e10a14be151976c7d86f27cc7289d6e4d51e3da3993c69aed1657f3aa4abe409834e6338a7a7391a30209fa34c066c14 languageName: node linkType: hard -"@babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.27.1": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.27.1": version: 7.27.1 resolution: "@babel/code-frame@npm:7.27.1" dependencies: @@ -52,46 +32,39 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2, @babel/compat-data@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/compat-data@npm:7.25.4" - checksum: b12a91d27c3731a4b0bdc9312a50b1911f41f7f728aaf0d4b32486e2257fd2cb2d3ea1a295e98449600c48f2c7883a3196ca77cda1cef7d97a10c2e83d037974 - languageName: node - linkType: hard - -"@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.4 + resolution: "@babel/compat-data@npm:7.28.4" + checksum: 9f6f5289bbe5a29e3f9c737577a797205a91f19371b50af8942257d9cb590d44eb950154e4f2a3d5de4105f97a49d6fbc8daebe0db1e6eee04f5a4bf73536bfc 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.25.2": - version: 7.25.2 - resolution: "@babel/core@npm:7.25.2" + version: 7.28.4 + resolution: "@babel/core@npm:7.28.4" dependencies: - "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.24.7 - "@babel/generator": ^7.25.0 - "@babel/helper-compilation-targets": ^7.25.2 - "@babel/helper-module-transforms": ^7.25.2 - "@babel/helpers": ^7.25.0 - "@babel/parser": ^7.25.0 - "@babel/template": ^7.25.0 - "@babel/traverse": ^7.25.2 - "@babel/types": ^7.25.2 + "@babel/code-frame": ^7.27.1 + "@babel/generator": ^7.28.3 + "@babel/helper-compilation-targets": ^7.27.2 + "@babel/helper-module-transforms": ^7.28.3 + "@babel/helpers": ^7.28.4 + "@babel/parser": ^7.28.4 + "@babel/template": ^7.27.2 + "@babel/traverse": ^7.28.4 + "@babel/types": ^7.28.4 + "@jridgewell/remapping": ^2.3.5 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: 9a1ef604a7eb62195f70f9370cec45472a08114e3934e3eaaedee8fd754edf0730e62347c7b4b5e67d743ce57b5bb8cf3b92459482ca94d06e06246ef021390a + checksum: f55b90b2c61a6461f5c0ccab74d32af9c67448c43c629529ba7ec3c61d87fa8c408cc9305bfb1f5b09e671d25436d44eaf75c48dee5dc0a5c5e21c01290f5134 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.4 + resolution: "@babel/eslint-parser@npm:7.28.4" dependencies: "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 eslint-visitor-keys: ^2.1.0 @@ -99,45 +72,24 @@ __metadata: peerDependencies: "@babel/core": ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - checksum: 133191a3ea312dea92abb0f2cae87bc8d36b4a02ce7dce9367473940d91a1102d0dbb53418ba4b1e955d430741c1a1ed622ad3e5973e727e0a6d8d094a65aa5c - languageName: node - linkType: hard - -"@babel/generator@npm:^7.20.0, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6, @babel/generator@npm:^7.7.2": - version: 7.25.6 - resolution: "@babel/generator@npm:7.25.6" - dependencies: - "@babel/types": ^7.25.6 - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.25 - jsesc: ^2.5.1 - checksum: b55975cd664f5602304d868bb34f4ee3bed6f5c7ce8132cd92ff27a46a53a119def28a182d91992e86f75db904f63094a81247703c4dc96e4db0c03fd04bcd68 + checksum: 32fb41c8648e169bc8570e25b4657475e165e1a49b8c6610f9bf86f311bbcc8dfa73f004977015688763aa6af17f48c690720bbc7b7b99695557adb267a9a7ff languageName: node linkType: hard -"@babel/generator@npm:^7.27.3": - 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 - languageName: node - linkType: hard - -"@babel/helper-annotate-as-pure@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" - dependencies: - "@babel/types": ^7.24.7 - checksum: 6178566099a6a0657db7a7fa601a54fb4731ca0b8614fbdccfd8e523c210c13963649bc8fdfd53ce7dd14d05e3dda2fb22dea5b30113c488b9eb1a906d60212e + 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: @@ -146,29 +98,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" - dependencies: - "@babel/traverse": ^7.24.7 - "@babel/types": ^7.24.7 - checksum: 71a6158a9fdebffb82fdc400d5555ba8f2e370cea81a0d578155877bdc4db7d5252b75c43b2fdf3f72b3f68348891f99bd35ae315542daad1b7ace8322b1abcb - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-compilation-targets@npm:7.25.2" - dependencies: - "@babel/compat-data": ^7.25.2 - "@babel/helper-validator-option": ^7.24.8 - browserslist: ^4.23.1 - lru-cache: ^5.1.1 - semver: ^6.3.1 - checksum: aed33c5496cb9db4b5e2d44e26bf8bc474074cc7f7bb5ebe1d4a20fdeb362cb3ba9e1596ca18c7484bcd6e5c3a155ab975e420d520c0ae60df81f9de04d0fd16 - languageName: node - linkType: hard - "@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" @@ -182,54 +111,24 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.24.7, @babel/helper-create-class-features-plugin@npm:^7.25.0, @babel/helper-create-class-features-plugin@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.4" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - "@babel/helper-member-expression-to-functions": ^7.24.8 - "@babel/helper-optimise-call-expression": ^7.24.7 - "@babel/helper-replace-supers": ^7.25.0 - "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 - "@babel/traverse": ^7.25.4 - semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 4544ebda4516eb25efdebd47ca024bd7bdb1eb6e7cc3ad89688c8ef8e889734c2f4411ed78981899c641394f013f246f2af63d92a0e9270f6c453309b4cb89ba - 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 - semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 406954b455e5b20924e7d1b41cf932e6e98e95c3a5224c7a70c3ad96a84e8fbde915ceff7ddbf9c7d121397c4e9274f061241648475122cf6fe54e0a95caae15 - languageName: node - linkType: hard - -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7, @babel/helper-create-regexp-features-plugin@npm:^7.25.0, @babel/helper-create-regexp-features-plugin@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.2" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - regexpu-core: ^5.3.1 + "@babel/traverse": ^7.28.3 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: df55fdc6a1f3090dd37d91347df52d9322d52affa239543808dc142f8fe35e6787e67d8612337668198fac85826fafa9e6772e6c28b7d249ec94e6fafae5da6e + checksum: 6d918e5e9c88ad1a262ab7b1a3caede1bbf95f8276c96846d8b0c1af251c85a0c868a9f1bbbaebdeb199e44dfd0e10fbe22935e56bedd1aa41ba4a7162bfa86c languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.27.1": +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.1" dependencies: @@ -242,43 +141,25 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.2": - version: 0.6.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" - dependencies: - "@babel/helper-compilation-targets": ^7.22.6 - "@babel/helper-plugin-utils": ^7.22.5 - debug: ^4.1.1 - lodash.debounce: ^4.0.8 - resolve: ^1.14.2 - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 2bba965ea9a4887ddf9c11d51d740ab473bd7597b787d042c325f6a45912dfe908c2d6bb1d837bf82f7e9fa51e6ad5150563c58131d2bb85515e63d971414a9c - languageName: node - linkType: hard - -"@babel/helper-define-polyfill-provider@npm:^0.6.3": - 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-member-expression-to-functions@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" - dependencies: - "@babel/traverse": ^7.24.8 - "@babel/types": ^7.24.8 - checksum: bf923d05d81b06857f4ca4fe9c528c9c447a58db5ea39595bb559eae2fce01a8266173db0fd6a2ec129d7bbbb9bb22f4e90008252f7c66b422c76630a878a4bc +"@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 @@ -292,16 +173,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-imports@npm:7.24.7" - dependencies: - "@babel/traverse": ^7.24.7 - "@babel/types": ^7.24.7 - checksum: 8ac15d96d262b8940bc469052a048e06430bba1296369be695fabdf6799f201dd0b00151762b56012a218464e706bc033f27c07f6cec20c6f8f5fd6543c67054 - languageName: node - linkType: hard - "@babel/helper-module-imports@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-module-imports@npm:7.27.1" @@ -312,39 +183,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.0, @babel/helper-module-transforms@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-module-transforms@npm:7.25.2" - dependencies: - "@babel/helper-module-imports": ^7.24.7 - "@babel/helper-simple-access": ^7.24.7 - "@babel/helper-validator-identifier": ^7.24.7 - "@babel/traverse": ^7.25.2 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 282d4e3308df6746289e46e9c39a0870819630af5f84d632559171e4fae6045684d771a65f62df3d569e88ccf81dc2def78b8338a449ae3a94bb421aa14fc367 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.27.1": - 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 - languageName: node - linkType: hard - -"@babel/helper-optimise-call-expression@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" - dependencies: - "@babel/types": ^7.24.7 - checksum: 280654eaf90e92bf383d7eed49019573fb35a98c9e992668f701ad099957246721044be2068cf6840cb2299e0ad393705a1981c88c23a1048096a8d59e5f79a3 + checksum: 7cf7b79da0fa626d6c84bfc7b35c079a2559caecaa2ff645b0f1db0d741507aa4df6b5b98a3283e8ac4e89094af271d805bf5701e5c4f916e622797b7c8cbb18 languageName: node linkType: hard @@ -357,33 +205,13 @@ __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.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.24.8 - resolution: "@babel/helper-plugin-utils@npm:7.24.8" - checksum: 73b1a83ba8bcee21dc94de2eb7323207391715e4369fd55844bb15cf13e3df6f3d13a40786d990e6370bf0f571d94fc31f70dec96c1d1002058258c35ca3767a - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.27.1": +"@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 languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.24.7, @babel/helper-remap-async-to-generator@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - "@babel/helper-wrap-function": ^7.25.0 - "@babel/traverse": ^7.25.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 47f3065e43fe9d6128ddb4291ffb9cf031935379265fd13de972b5f241943121f7583efb69cd2e1ecf39e3d0f76f047547d56c3fcc2c853b326fad5465da0bd7 - languageName: node - linkType: hard - "@babel/helper-remap-async-to-generator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" @@ -397,19 +225,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-replace-supers@npm:7.25.0" - dependencies: - "@babel/helper-member-expression-to-functions": ^7.24.8 - "@babel/helper-optimise-call-expression": ^7.24.7 - "@babel/traverse": ^7.25.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: f669fc2487c22d40b808f94b9c3ee41129484d5ef0ba689bdd70f216ff91e10b6b021d2f8cd37e7bdd700235a2a6ae6622526344f064528190383bf661ac65f8 - languageName: node - linkType: hard - "@babel/helper-replace-supers@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-replace-supers@npm:7.27.1" @@ -423,26 +238,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-simple-access@npm:7.24.7" - dependencies: - "@babel/traverse": ^7.24.7 - "@babel/types": ^7.24.7 - checksum: ddbf55f9dea1900213f2a1a8500fabfd21c5a20f44dcfa957e4b0d8638c730f88751c77f678644f754f1a1dc73f4eb8b766c300deb45a9daad000e4247957819 - languageName: node - linkType: hard - -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" - dependencies: - "@babel/traverse": ^7.24.7 - "@babel/types": ^7.24.7 - checksum: 11b28fe534ce2b1a67c4d8e51a7b5711a2a0a0cae802f74614eee54cca58c744d9a62f6f60103c41759e81c537d270bfd665bf368a6bea214c6052f2094f8407 - languageName: node - linkType: hard - "@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" @@ -453,13 +248,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 39b03c5119216883878655b149148dc4d2e284791e969b19467a9411fccaa33f7a713add98f4db5ed519535f70ad273cdadfd2eb54d47ebbdeac5083351328ce - languageName: node - linkType: hard - "@babel/helper-string-parser@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-string-parser@npm:7.27.1" @@ -467,13 +255,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 6799ab117cefc0ecd35cd0b40ead320c621a298ecac88686a14cffceaac89d80cdb3c178f969861bf5fa5e4f766648f9161ea0752ecfe080d8e89e3147270257 - languageName: node - linkType: hard - "@babel/helper-validator-identifier@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-identifier@npm:7.27.1" @@ -481,13 +262,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.24.7, @babel/helper-validator-option@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-validator-option@npm:7.24.8" - checksum: a52442dfa74be6719c0608fee3225bd0493c4057459f3014681ea1a4643cd38b68ff477fe867c4b356da7330d085f247f0724d300582fa4ab9a02efaf34d107c - languageName: node - linkType: hard - "@babel/helper-validator-option@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-option@npm:7.27.1" @@ -495,81 +269,35 @@ __metadata: languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-wrap-function@npm:7.25.0" - dependencies: - "@babel/template": ^7.25.0 - "@babel/traverse": ^7.25.0 - "@babel/types": ^7.25.0 - checksum: 0095b4741704066d1687f9bbd5370bb88c733919e4275e49615f70c180208148ff5f24ab58d186ce92f8f5d28eab034ec6617e9264590cc4744c75302857629c - languageName: node - 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 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.25.0": - version: 7.25.6 - resolution: "@babel/helpers@npm:7.25.6" - dependencies: - "@babel/template": ^7.25.0 - "@babel/types": ^7.25.6 - checksum: 5a548999db82049a5f7ac6de57576b4ed0d386ce07d058151698836ed411eae6230db12535487caeebb68a2ffc964491e8aead62364a5132ab0ae20e8b68e19f - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" - dependencies: - "@babel/helper-validator-identifier": ^7.24.7 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - picocolors: ^1.0.0 - checksum: 5cd3a89f143671c4ac129960024ba678b669e6fc673ce078030f5175002d1d3d52bc10b22c5b916a6faf644b5028e9a4bd2bb264d053d9b05b6a98690f1d46f1 + "@babel/template": ^7.27.2 + "@babel/traverse": ^7.28.3 + "@babel/types": ^7.28.2 + checksum: 0ebdfdc918fdd0c1cf6ff15ba4c664974d0cdf21a017af560d58b00c379df3bf2e55f13a44fe3225668bca169da174f6cb97a96c4e987fb728fdb8f9a39db302 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.25.0, @babel/parser@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/parser@npm:7.25.6" +"@babel/helpers@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/helpers@npm:7.28.4" dependencies: - "@babel/types": ^7.25.6 - bin: - parser: ./bin/babel-parser.js - checksum: 85b237ded09ee43cc984493c35f3b1ff8a83e8dbbb8026b8132e692db6567acc5a1659ec928e4baa25499ddd840d7dae9dee3062be7108fe23ec5f94a8066b1e + "@babel/template": ^7.27.2 + "@babel/types": ^7.28.4 + checksum: a8706219e0bd60c18bbb8e010aa122e9b14e7e7e67c21cc101e6f1b5e79dcb9a18d674f655997f85daaf421aa138cf284710bb04371a2255a0a3137f097430b4 languageName: node linkType: hard -"@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.25.3, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3, @babel/parser@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/parser@npm:7.28.4" dependencies: - "@babel/types": ^7.27.3 + "@babel/types": ^7.28.4 bin: parser: ./bin/babel-parser.js - checksum: 16f00a12895522c1682f1f047332010e129ba517add3a2db347a658e02f60434fc38f9105a9d6ec3fd6bfb5d1b0b70d88585c1f10e06e2b58fba29004a42d648 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.3" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/traverse": ^7.25.3 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: d3dba60f360defe70eb43e35a1b17ea9dd4a99e734249e15be3d5c288019644f96f88d7ff51990118fda0845b4ad50f6d869e0382232b1d8b054d113d4eea7e2 + checksum: d95e283fe1153039b396926ef567ca1ab114afb5c732a23bbcbbd0465ac59971aeb6a63f37593ce7671a52d34ec52b23008c999d68241b42d26928c540464063 languageName: node linkType: hard @@ -585,17 +313,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: fd56d1e6435f2c008ca9050ea906ff7eedcbec43f532f2bf2e7e905d8bf75bf5e4295ea9593f060394e2c8e45737266ccbf718050bad2dd7be4e7613c60d1b5b - languageName: node - linkType: hard - "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.27.1" @@ -607,17 +324,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 13ed301b108d85867d64226bbc4032b07dd1a23aab68e9e32452c4fe3930f2198bb65bdae9c262c4104bd5e45647bc1830d25d43d356ee9a137edd8d5fab8350 - languageName: node - linkType: hard - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.27.1" @@ -629,19 +335,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 - "@babel/plugin-transform-optional-chaining": ^7.24.7 - peerDependencies: - "@babel/core": ^7.13.0 - checksum: 07b92878ac58a98ea1fdf6a8b4ec3413ba4fa66924e28b694d63ec5b84463123fbf4d7153b56cf3cedfef4a3482c082fe3243c04f8fb2c041b32b0e29b4a9e21 - languageName: node - linkType: hard - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.27.1" @@ -655,27 +348,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/traverse": ^7.25.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: c8d08b8d6cc71451ad2a50cf7db72ab5b41c1e5e2e4d56cf6837a25a61270abd682c6b8881ab025f11a552d2024b3780519bb051459ebb71c27aed13d9917663 - 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 @@ -755,39 +436,17 @@ __metadata: linkType: hard "@babel/plugin-syntax-export-default-from@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-export-default-from@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 5572825e7c2a9d60285c2ef1d3f7ff77965393ed1f1b44b84af981b96cb5f938d630c7bdadf69fe5ebea04bd05934541d2df3fec06d2127c81d69466d1d54649 - languageName: node - linkType: hard - -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 85740478be5b0de185228e7814451d74ab8ce0a26fcca7613955262a26e99e8e15e9da58f60c754b84515d4c679b590dbd3f2148f0f58025f4ae706f1c5a5d4a - languageName: node - linkType: hard - -"@babel/plugin-syntax-flow@npm:^7.12.1, @babel/plugin-syntax-flow@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-flow@npm:7.24.7" + version: 7.27.1 + resolution: "@babel/plugin-syntax-export-default-from@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 43b78b5fcdedb2a6d80c3d02a1a564fbfde86b73b442d616a8f318f673caa6ce0151513af5a00fcae42a512f144e70ef259d368b9537ee35d40336a6c895a7d4 + checksum: d9a6a9c51f644a5ed139dbe1e8cf5a38c9b390af27ad2fc6f0eba579ac543b039efff34200744bfc8523132c06aa6de921238bd2088948bb4dce4571cea43438 languageName: node linkType: hard -"@babel/plugin-syntax-flow@npm:^7.27.1": +"@babel/plugin-syntax-flow@npm:^7.12.1, @babel/plugin-syntax-flow@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-syntax-flow@npm:7.27.1" dependencies: @@ -798,17 +457,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.24.7": - version: 7.25.6 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.6" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b3b251ace9f184c2d6369cde686ff01581050cb0796f2ff00ff4021f31cf86270b347df09579f2c0996e999e37e1dddafacec42ed1ef6aae21a265aff947e792 - languageName: node - linkType: hard - "@babel/plugin-syntax-import-assertions@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-syntax-import-assertions@npm:7.27.1" @@ -820,18 +468,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.24.7": - version: 7.25.6 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.6" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3b0928e73e42346e8a65760a3ff853c87ad693cdf11bb335a23e895e0b5b1f0601118521b3aff2a6946488a580a63afb6a5b5686153a7678b4dff0e4e4604dd7 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-attributes@npm:^7.27.1": +"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" dependencies: @@ -864,18 +501,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.24.7, @babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.24.7 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7a5ca629d8ca1e1ee78705a78e58c12920d07ed8006d7e7232b31296a384ff5e41d7b649bde5561196041037bbb9f9715be1d1c20975df87ca204f34ad15b965 - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.27.1": +"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.7.2": version: 7.27.1 resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" dependencies: @@ -974,18 +600,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.25.4 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.4" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9b89b8930cd5983f64251d75c9fcdc17a8dc73837d6de12220ff972888ecff4054a6467cf0c423cad242aa96c0f0564a39a0823073728cc02239b80d13f02230 - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.27.1": +"@babel/plugin-syntax-typescript@npm:^7.27.1, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.27.1 resolution: "@babel/plugin-syntax-typescript@npm:7.27.1" dependencies: @@ -1008,18 +623,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 707c209b5331c7dc79bd326128c6a6640dbd62a78da1653c844db20c4f36bf7b68454f1bc4d2d051b3fde9136fa291f276ec03a071bb00ee653069ff82f91010 - languageName: node - linkType: hard - -"@babel/plugin-transform-arrow-functions@npm:^7.27.1": +"@babel/plugin-transform-arrow-functions@npm:^7.24.7, @babel/plugin-transform-arrow-functions@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" dependencies: @@ -1030,47 +634,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.4" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-remap-async-to-generator": ^7.25.0 - "@babel/plugin-syntax-async-generators": ^7.8.4 - "@babel/traverse": ^7.25.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4235444735a1946f8766fe56564a8134c2c36c73e6cf83b3f2ed5624ebc84ff5979506a6a5b39acdb23aa09d442a6af471710ed408ccce533a2c4d2990b9df6a - languageName: node - linkType: hard - -"@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 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 37e8b76c992066f81cc24af11a25f296add6ae39f51f2c37da565fc004dbf3ef9733b42808acbfb86792d73f73bfbb4396338abbd364b9103146b119508b49c7 - languageName: node - linkType: hard - -"@babel/plugin-transform-async-to-generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" - dependencies: - "@babel/helper-module-imports": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-remap-async-to-generator": ^7.24.7 + "@babel/traverse": ^7.28.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 13704fb3b83effc868db2b71bfb2c77b895c56cb891954fc362e95e200afd523313b0e7cf04ce02f45b05e76017c5b5fa8070c92613727a35131bb542c253a36 + checksum: 174aaccd7a8386fd7f32240c3f65a93cf60dcc5f6a2123cfbff44c0d22b424cd41de3a0c6d136b6a2fa60a8ca01550c261677284cb18a0daeab70730b2265f1d languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.27.1": +"@babel/plugin-transform-async-to-generator@npm:^7.24.7, @babel/plugin-transform-async-to-generator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-async-to-generator@npm:7.27.1" dependencies: @@ -1083,17 +660,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 249cdcbff4e778b177245f9652b014ea4f3cd245d83297f10a7bf6d97790074089aa62bcde8c08eb299c5e68f2faed346b587d3ebac44d625ba9a83a4ee27028 - languageName: node - linkType: hard - "@babel/plugin-transform-block-scoped-functions@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.27.1" @@ -1105,122 +671,58 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" +"@babel/plugin-transform-block-scoping@npm:^7.25.0, @babel/plugin-transform-block-scoping@npm:^7.28.0": + version: 7.28.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.4" dependencies: - "@babel/helper-plugin-utils": ^7.24.8 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b1a8f932f69ad2a47ae3e02b4cedd2a876bfc2ac9cf72a503fd706cdc87272646fe9eed81e068c0fc639647033de29f7fa0c21cddd1da0026f83dbaac97316a8 + checksum: 7f62eae907c0b4f85b9cc024da949697e57d17f2107ca4a240011174762d4c546b856ccbd5ba83ecb4bc9eb50150ea46558d551a5b05d3f25aace88a65fa4e04 languageName: node linkType: hard -"@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-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" dependencies: + "@babel/helper-create-class-features-plugin": ^7.27.1 "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bd710674bebe2e90b1daee960523d06c958f060f439ce2eef6b157c780c0654168131d0312a06dd71c5b186ecc2a818334d16f8368bd273ab549d6230f074135 + checksum: 475a6e5a9454912fe1bdc171941976ca10ea4e707675d671cdb5ce6b6761d84d1791ac61b6bca81a2e5f6430cb7b9d8e4b2392404110e69c28207a754e196294 languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-class-properties@npm:7.25.4" +"@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.25.4 - "@babel/helper-plugin-utils": ^7.24.8 + "@babel/helper-create-class-features-plugin": ^7.28.3 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b73f7d968639c6c2dfc13f4c5a8fe45cefd260f0faa7890ae12e65d41211072544ff5e128c8b61a86887b29ffd3df8422dbdfbf61648488e71d4bb599c41f4a5 + "@babel/core": ^7.12.0 + checksum: 9b2feaacbf29637ab35a3aae1df35a1129adec5400a1767443739557fb0d3bf8278bf0ec90aacf43dec9a7dd91428d01375020b70528713e1bc36a72776a104c languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" +"@babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.28.3": + version: 7.28.4 + resolution: "@babel/plugin-transform-classes@npm:7.28.4" dependencies: - "@babel/helper-create-class-features-plugin": ^7.27.1 - "@babel/helper-plugin-utils": ^7.27.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 475a6e5a9454912fe1bdc171941976ca10ea4e707675d671cdb5ce6b6761d84d1791ac61b6bca81a2e5f6430cb7b9d8e4b2392404110e69c28207a754e196294 - languageName: node - linkType: hard - -"@babel/plugin-transform-class-static-block@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-class-static-block": ^7.14.5 - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 324049263504f18416f1c3e24033baebfafd05480fdd885c8ebe6f2b415b0fc8e0b98d719360f9e30743cc78ac387fabc0b3c6606d2b54135756ffb92963b382 - 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" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.27.1 - "@babel/helper-plugin-utils": ^7.27.1 - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 69688fe1641ae0ea025b916b8c2336e8b5643a5ec292e8f546ecd35d9d9d4bb301d738910822a79d867098cf687d550d92cd906ae4cda03c0f69b1ece2149a58 - languageName: node - linkType: hard - -"@babel/plugin-transform-classes@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-classes@npm:7.25.4" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - "@babel/helper-compilation-targets": ^7.25.2 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-replace-supers": ^7.25.0 - "@babel/traverse": ^7.25.4 - globals: ^11.1.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0bf20e46eeb691bd60cee5d1b01950fc37accec88018ecace25099f7c8d8509c1ac54d11b8caf9f2157c6945969520642a3bc421159c1a14e80224dc9a7611de - languageName: node - linkType: hard - -"@babel/plugin-transform-classes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-classes@npm:7.27.1" - 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.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a4275d3a9e2e4144c421baa49958191e4b33957fca6e87686ed8da0eb3240270d4f91a2a4b9491c87feb6c33f459d8aec013cec8d5f5099c794b740703802dc7 + checksum: f412e00c86584a9094cc0a2f3dd181b8108a4dced477d609c5406beddd5bf79d05a7ea74db508dc4dcb37172f042d5ef98d3d6311ade61c7ea6fbbbb70f5ec29 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/template": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0cf8c1b1e4ea57dec8d4612460d84fd4cdbf71a7499bb61ee34632cf89018a59eee818ffca88a8d99ee7057c20a4257044d7d463fda6daef9bf1db9fa81563cb - languageName: node - linkType: hard - -"@babel/plugin-transform-computed-properties@npm:^7.27.1": +"@babel/plugin-transform-computed-properties@npm:^7.24.7, @babel/plugin-transform-computed-properties@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-computed-properties@npm:7.27.1" dependencies: @@ -1232,37 +734,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0b4bd3d608979a1e5bd97d9d42acd5ad405c7fffa61efac4c7afd8e86ea6c2d91ab2d94b6a98d63919571363fe76e0b03c4ff161f0f60241b895842596e4a999 - languageName: node - linkType: hard - -"@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 - languageName: node - linkType: hard - -"@babel/plugin-transform-dotall-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 67b10fc6abb1f61f0e765288eb4c6d63d1d0f9fc0660e69f6f2170c56fa16bc74e49857afc644beda112b41771cd90cf52df0940d11e97e52617c77c7dcff171 + checksum: 5b464d6a03c6eaa1327b60ffc1630ca977db0256938b34e281e65c81c965680e930a6bac043272942d6d4bbd7d1eddded0b7231779429ba51275e092e7367859 languageName: node linkType: hard @@ -1278,17 +758,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d1da2ff85ecb56a63f4ccfd9dc9ae69400d85f0dadf44ecddd9e71c6e5c7a9178e74e3a9637555f415a2bb14551e563f09f98534ab54f53d25e8439fdde6ba2d - languageName: node - linkType: hard - "@babel/plugin-transform-duplicate-keys@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.27.1" @@ -1300,18 +769,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.0" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.25.0 - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 608d6b0e77341189508880fd1a9f605a38d0803dd6f678ea3920ab181b17b377f6d5221ae8cf0104c7a044d30d4ddb0366bd064447695671d78457a656bb264f - languageName: node - linkType: hard - "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.27.1" @@ -1324,18 +781,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 776509ff62ab40c12be814a342fc56a5cc09b91fb63032b2633414b635875fd7da03734657be0f6db2891fe6e3033b75d5ddb6f2baabd1a02e4443754a785002 - languageName: node - linkType: hard - "@babel/plugin-transform-dynamic-import@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-dynamic-import@npm:7.27.1" @@ -1347,15 +792,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" +"@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-builder-binary-assignment-operator-visitor": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/plugin-transform-destructuring": ^7.28.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 23c84a23eb56589fdd35a3540f9a1190615be069110a2270865223c03aee3ba4e0fc68fe14850800cf36f0712b26e4964d3026235261f58f0405a29fe8dac9b1 + checksum: a44140097ed4854883c426613f4e8763237cd0fdab1c780514f4315f6c148d6b528d7a57fe6fdec4dbce28a21b70393ef3507b72dfec2e30bfc8d7db1ff19474 languageName: node linkType: hard @@ -1370,18 +815,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3bd3a10038f10ae0dea1ee42137f3edcf7036b5e9e570a0d1cbd0865f03658990c6c2d84fa2475f87a754e7dc5b46766c16f7ce5c9b32c3040150b6a21233a80 - languageName: node - linkType: hard - "@babel/plugin-transform-export-namespace-from@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" @@ -1393,19 +826,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.24.7": - version: 7.25.2 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.25.2" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/plugin-syntax-flow": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9f7b96cbd374077eaf04b59e468976d2e89ec353807d7ac28f129f686945447df92aeb5b60acf906f3ec0f9ebef5d9f88735c7aa39af97033a6ab96c79c9a909 - languageName: node - linkType: hard - -"@babel/plugin-transform-flow-strip-types@npm:^7.25.2": +"@babel/plugin-transform-flow-strip-types@npm:^7.25.2, @babel/plugin-transform-flow-strip-types@npm:^7.26.5, @babel/plugin-transform-flow-strip-types@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.27.1" dependencies: @@ -1417,19 +838,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-for-of@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a53b42dc93ab4b7d1ebd3c695b52be22b3d592f6a3dbdb3dc2fea2c8e0a7e1508fe919864c455cde552aec44ce7518625fccbb70c7063373ca228d884f4f49ea - languageName: node - linkType: hard - -"@babel/plugin-transform-for-of@npm:^7.27.1": +"@babel/plugin-transform-for-of@npm:^7.24.7, @babel/plugin-transform-for-of@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-for-of@npm:7.27.1" dependencies: @@ -1441,20 +850,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.25.1": - version: 7.25.1 - resolution: "@babel/plugin-transform-function-name@npm:7.25.1" - dependencies: - "@babel/helper-compilation-targets": ^7.24.8 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/traverse": ^7.25.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 743f3ea03bbc5a90944849d5a880b6bd9243dddbde581a46952da76e53a0b74c1e2424133fe8129d7a152c1f8c872bcd27e0b6728d7caadabd1afa7bb892e1e0 - languageName: node - linkType: hard - -"@babel/plugin-transform-function-name@npm:^7.27.1": +"@babel/plugin-transform-function-name@npm:^7.25.1, @babel/plugin-transform-function-name@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-function-name@npm:7.27.1" dependencies: @@ -1467,18 +863,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-json-strings": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 88874d0b7a1ddea66c097fc0abb68801ffae194468aa44b828dde9a0e20ac5d8647943793de86092eabaa2911c96f67a6b373793d4bb9c932ef81b2711c06c2e - languageName: node - linkType: hard - "@babel/plugin-transform-json-strings@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-json-strings@npm:7.27.1" @@ -1490,18 +874,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/plugin-transform-literals@npm:7.25.2" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 70c9bb40e377a306bd8f500899fb72127e527517914466e95dc6bb53fa7a0f51479db244a54a771b5780fc1eab488fedd706669bf11097b81a23c81ab7423eb1 - languageName: node - linkType: hard - -"@babel/plugin-transform-literals@npm:^7.27.1": +"@babel/plugin-transform-literals@npm:^7.25.2, @babel/plugin-transform-literals@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-literals@npm:7.27.1" dependencies: @@ -1512,19 +885,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3367ce0be243704dc6fce23e86a592c4380f01998ee5dd9f94c54b1ef7b971ac6f8a002901eb51599ac6cbdc0d067af8d1a720224fca1c40fde8bb8aab804aac - languageName: node - linkType: hard - -"@babel/plugin-transform-logical-assignment-operators@npm:^7.27.1": +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7, @babel/plugin-transform-logical-assignment-operators@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.27.1" dependencies: @@ -1535,17 +896,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2720c57aa3bf70576146ba7d6ea03227f4611852122d76d237924f7b008dafc952e6ae61a19e5024f26c665f44384bbd378466f01b6bd1305b3564a3b7fb1a5d - languageName: node - linkType: hard - "@babel/plugin-transform-member-expression-literals@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.27.1" @@ -1557,18 +907,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" - dependencies: - "@babel/helper-module-transforms": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f1dd0fb2f46c0f8f21076b8c7ccd5b33a85ce6dcb31518ea4c648d9a5bb2474cd4bd87c9b1b752e68591e24b022e334ba0d07631fef2b6b4d8a4b85cf3d581f5 - languageName: node - linkType: hard - "@babel/plugin-transform-modules-amd@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-modules-amd@npm:7.27.1" @@ -1581,20 +919,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.24.7, @babel/plugin-transform-modules-commonjs@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" - dependencies: - "@babel/helper-module-transforms": ^7.24.8 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-simple-access": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a4cf95b1639c33382064b44558f73ee5fac023f2a94d16e549d2bb55ceebd5cbc10fcddd505d08cd5bc97f5a64af9fd155512358b7dcf7b1a0082e8945cf21c5 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-commonjs@npm:^7.27.1": +"@babel/plugin-transform-modules-commonjs@npm:^7.24.8, @babel/plugin-transform-modules-commonjs@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.27.1" dependencies: @@ -1606,20 +931,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.0" - dependencies: - "@babel/helper-module-transforms": ^7.25.0 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-validator-identifier": ^7.24.7 - "@babel/traverse": ^7.25.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fe673bec08564e491847324bb80a1e6edfb229f5c37e58a094d51e95306e7b098e1d130fc43e992d22debd93b9beac74441ffc3f6ea5d78f6b2535896efa0728 - languageName: node - linkType: hard - "@babel/plugin-transform-modules-systemjs@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.27.1" @@ -1634,18 +945,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7" - dependencies: - "@babel/helper-module-transforms": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9ff1c464892efe042952ba778468bda6131b196a2729615bdcc3f24cdc94014f016a4616ee5643c5845bade6ba698f386833e61056d7201314b13a7fd69fac88 - languageName: node - linkType: hard - "@babel/plugin-transform-modules-umd@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" @@ -1658,19 +957,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: f1c6c7b5d60a86b6d7e4dd098798e1d393d55e993a0b57a73b53640c7a94985b601a96bdacee063f809a9a700bcea3a2ff18e98fa561554484ac56b761d774bd - languageName: node - linkType: hard - -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.27.1": +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.27.1" dependencies: @@ -1682,17 +969,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-new-target@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3cb94cd1076b270f768f91fdcf9dd2f6d487f8dbfff3df7ca8d07b915900b86d02769a35ba1407d16fe49499012c8f055e1741299e2c880798b953d942a8fa1b - languageName: node - linkType: hard - "@babel/plugin-transform-new-target@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-new-target@npm:7.27.1" @@ -1704,19 +980,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4a9221356401d87762afbc37a9e8e764afc2daf09c421117537820f8cfbed6876888372ad3a7bcfae2d45c95f026651f050ab4020b777be31d3ffb00908dbdd3 - languageName: node - linkType: hard - -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" dependencies: @@ -1727,19 +991,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 561b5f1d08b2c3f92ce849f092751558b5e6cfeb7eb55c79e7375c34dd9c3066dce5e630bb439affef6adcf202b6cbcaaa23870070276fa5bb429c8f5b8c7514 - languageName: node - linkType: hard - -"@babel/plugin-transform-numeric-separator@npm:^7.27.1": +"@babel/plugin-transform-numeric-separator@npm:^7.24.7, @babel/plugin-transform-numeric-separator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-numeric-separator@npm:7.27.1" dependencies: @@ -1750,43 +1002,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" - dependencies: - "@babel/helper-compilation-targets": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 169d257b9800c13e1feb4c37fb05dae84f702e58b342bb76e19e82e6692b7b5337c9923ee89e3916a97c0dd04a3375bdeca14f5e126f110bbacbeb46d1886ca2 - languageName: node - linkType: hard - -"@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.4 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.4" 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.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 624db8badc844d3256ce9b5d062f1716f01c15ab3ed023dc971eb8083bba55e83be8dc25971b4570d2cd8979eb2c61a3b08d332bd0ec1816ee8afbf1659472bf - languageName: node - linkType: hard - -"@babel/plugin-transform-object-super@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-super@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-replace-supers": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f71e607a830ee50a22fa1a2686524d3339440cf9dea63032f6efbd865cfe4e35000e1e3f3492459e5c986f7c0c07dc36938bf3ce61fc9ba5f8ab732d0b64ab37 + checksum: 2063672ba4ac457a64b5c0c982439c7b08b4c70f0e743792b98240db5a05f1c063918d8366c92d4d6b2572e2e3452b300a23980b6668e4f54ff349f60d47ec48 languageName: node linkType: hard @@ -1802,19 +1029,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7229f3a5a4facaab40f4fdfc7faabc157dc38a67d66bed7936599f4bc509e0bff636f847ac2aa45294881fce9cf8a0a460b85d2a465b7b977de9739fce9b18f6 - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-catch-binding@npm:^7.27.1": +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7, @babel/plugin-transform-optional-catch-binding@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.27.1" dependencies: @@ -1825,20 +1040,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.24.7, @babel/plugin-transform-optional-chaining@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.8" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 45e55e3a2fffb89002d3f89aef59c141610f23b60eee41e047380bffc40290b59f64fc649aa7ec5281f73d41b2065410d788acc6afaad2a9f44cad6e8af04442 - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-chaining@npm:^7.27.1": +"@babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-optional-chaining@npm:7.27.1" dependencies: @@ -1850,25 +1052,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-parameters@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ab534b03ac2eff94bc79342b8f39a4584666f5305a6c63c1964afda0b1b004e6b861e49d1683548030defe248e3590d3ff6338ee0552cb90c064f7e1479968c3 - languageName: node - linkType: hard - -"@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 @@ -1884,33 +1075,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-private-methods@npm:7.25.4" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.25.4 - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: cb1dabfc03e2977990263d65bc8f43a9037dffbb5d9a5f825c00d05447ff68015099408c1531d9dd88f18a41a90f5062dc48f3a1d52b415d2d2ee4827dedff09 - languageName: node - linkType: hard - -"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - "@babel/helper-create-class-features-plugin": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8cee9473095305cc787bb653fd681719b49363281feabf677db8a552e8e41c94441408055d7e5fd5c7d41b315e634fa70b145ad0c7c54456216049df4ed57350 - languageName: node - linkType: hard - -"@babel/plugin-transform-private-property-in-object@npm:^7.27.1": +"@babel/plugin-transform-private-property-in-object@npm:^7.24.7, @babel/plugin-transform-private-property-in-object@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.27.1" dependencies: @@ -1923,17 +1088,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9aeefc3aab6c6bf9d1fae1cf3a2d38c7d886fd3c6c81b7c608c477f5758aee2e7abf52f32724310fe861da61af934ee2508b78a5b5f234b9740c9134e1c14437 - languageName: node - linkType: hard - "@babel/plugin-transform-property-literals@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-property-literals@npm:7.27.1" @@ -1945,25 +1099,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-display-name@npm:7.24.7" +"@babel/plugin-transform-react-display-name@npm:^7.24.7, @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.24.7 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a05bf83bf5e7b31f7a3b56da1bf8e2eeec76ef52ae44435ceff66363a1717fcda45b7b4b931a2c115982175f481fc3f2d0fab23f0a43c44e6d983afc396858f0 + checksum: 268b1a9192974439d17949e170b01cac2a2aa003c844e2fe3b8361146f42f66487178cffdfa8ce862aa9e6c814bc37f879a70300cb3f067815d15fa6aad04e6d languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.7" +"@babel/plugin-transform-react-jsx-development@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.27.1" dependencies: - "@babel/plugin-transform-react-jsx": ^7.24.7 + "@babel/plugin-transform-react-jsx": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 653d32ea5accb12d016e324ec5a584b60a8f39e60c6a5101194b73553fdefbfa3c3f06ec2410216ec2033fddae181a2f146a1d6ed59f075c488fc4570cad2e7b + checksum: b88865d5b8c018992f2332da939faa15c4d4a864c9435a5937beaff3fe43781432cc42e0a5d5631098e0bd4066fc33f5fa72203b388b074c3545fe7aaa21e474 languageName: node linkType: hard @@ -1989,22 +1143,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.24.7": - version: 7.25.2 - resolution: "@babel/plugin-transform-react-jsx@npm:7.25.2" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - "@babel/helper-module-imports": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/plugin-syntax-jsx": ^7.24.7 - "@babel/types": ^7.25.2 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 44fbde046385916de19a88d77fed9121c6cc6e25b9cdc38a43d8e514a9b18cf391ed3de25e7d6a8996d3fe4c298e395edf856ee20efffaab3b70f8ce225fffa4 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx@npm:^7.25.2": +"@babel/plugin-transform-react-jsx@npm:^7.25.2, @babel/plugin-transform-react-jsx@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-react-jsx@npm:7.27.1" dependencies: @@ -2019,38 +1158,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.7" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d859ada3cbeb829fa3d9978a29b2d36657fcc9dcc1e4c3c3af84ec5a044a8f8db26ada406baa309e5d4d512aca53d07c520d991b891ff943bec7d8f01aae0419 - languageName: node - linkType: hard - -"@babel/plugin-transform-regenerator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" +"@babel/plugin-transform-react-pure-annotations@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - regenerator-transform: ^0.15.2 + "@babel/helper-annotate-as-pure": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 20c6c3fb6fc9f407829087316653388d311e8c1816b007609bb09aeef254092a7157adace8b3aaa8f34be752503717cb85c88a5fe482180a9b11bcbd676063be + checksum: a6f591c5e85a1ab0685d4a25afe591fe8d11dc0b73c677cf9560ff8d540d036a1cce9efcb729fc9092def4d854dc304ffdc063a89a9247900b69c516bf971a4c languageName: node linkType: hard -"@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.4 + resolution: "@babel/plugin-transform-regenerator@npm:7.28.4" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d343dbe491f2b2ef953ce990761006b8f1f9231044b3c244529d34335ba8337829e6d55cae0e4e9ec6d4952bc4875097c8776eee01119cd45529bc49e90c085f + checksum: 2aa99b3a7b254a109e913fabbe1fb320ff40723988fde0e225212b7ef20f523a399a6e45077258b176c29715493b2a853cf7c130811692215adf33e5af99782b languageName: node linkType: hard @@ -2066,17 +1193,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3d5876954d5914d7270819479504f30c4bf5452a65c677f44e2dab2db50b3c9d4b47793c45dfad7abf4f377035dd79e4b3f554ae350df9f422201d370ce9f8dd - languageName: node - linkType: hard - "@babel/plugin-transform-reserved-words@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-reserved-words@npm:7.27.1" @@ -2089,33 +1205,22 @@ __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 -"@babel/plugin-transform-shorthand-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7b524245814607188212b8eb86d8c850e5974203328455a30881b4a92c364b93353fae14bc2af5b614ef16300b75b8c1d3b8f3a08355985b4794a7feb240adc3 - languageName: node - linkType: hard - -"@babel/plugin-transform-shorthand-properties@npm:^7.27.1": +"@babel/plugin-transform-shorthand-properties@npm:^7.24.7, @babel/plugin-transform-shorthand-properties@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" dependencies: @@ -2126,19 +1231,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-spread@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4c4254c8b9cceb1a8f975fa9b92257ddb08380a35c0a3721b8f4b9e13a3d82e403af2e0fba577b9f2452dd8f06bc3dea71cc53b1e2c6af595af5db52a13429d6 - languageName: node - linkType: hard - -"@babel/plugin-transform-spread@npm:^7.27.1": +"@babel/plugin-transform-spread@npm:^7.24.7, @babel/plugin-transform-spread@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-spread@npm:7.27.1" dependencies: @@ -2150,18 +1243,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 118fc7a7ebf7c20411b670c8a030535fdfe4a88bc5643bb625a584dbc4c8a468da46430a20e6bf78914246962b0f18f1b9d6a62561a7762c4f34a038a5a77179 - languageName: node - linkType: hard - -"@babel/plugin-transform-sticky-regex@npm:^7.27.1": +"@babel/plugin-transform-sticky-regex@npm:^7.24.7, @babel/plugin-transform-sticky-regex@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" dependencies: @@ -2173,24 +1255,13 @@ __metadata: linkType: hard "@babel/plugin-transform-strict-mode@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-strict-mode@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 514e847f6ba4bac825eb0e9ae697c6ae632041d887f6cc1167f9cb989924b2f8735ec040607a02083c3a03e62f1c8973ba59a2b106ca3b55c2e2c416b51e2372 - languageName: node - linkType: hard - -"@babel/plugin-transform-template-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" + version: 7.27.1 + resolution: "@babel/plugin-transform-strict-mode@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ad44e5826f5a98c1575832dbdbd033adfe683cdff195e178528ead62507564bf02f479b282976cfd3caebad8b06d5fd7349c1cdb880dec3c56daea4f1f179619 + checksum: 0c5bbc9f913b2cea1a1f5697bac320f11575016eed2eee16d2430af5ddceff5382ad3f1b70bf7158ff458db38568a903fab03b308150753453354785365667ec languageName: node linkType: hard @@ -2205,17 +1276,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.8" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8663a8e7347cedf181001d99c88cf794b6598c3d82f324098510fe8fb8bd22113995526a77aa35a3cc5d70ffd0617a59dd0d10311a9bf0e1a3a7d3e59b900c00 - languageName: node - linkType: hard - "@babel/plugin-transform-typeof-symbol@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.1" @@ -2227,44 +1287,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.24.7": - version: 7.25.2 - resolution: "@babel/plugin-transform-typescript@npm:7.25.2" +"@babel/plugin-transform-typescript@npm:^7.25.2, @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.24.7 - "@babel/helper-create-class-features-plugin": ^7.25.0 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 - "@babel/plugin-syntax-typescript": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b0267128d93560a4350919f7230a3b497e20fb8611d9f04bb3560d6b38877305ccad4c40903160263361c6930a84dbcb5b21b8ea923531bda51f67bffdc2dd0b - languageName: node - linkType: hard - -"@babel/plugin-transform-typescript@npm:^7.25.2": - version: 7.27.1 - resolution: "@babel/plugin-transform-typescript@npm:7.27.1" - 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 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-escapes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4af0a193e1ddea6ff82b2b15cc2501b872728050bd625740b813c8062fec917d32d530ff6b41de56c15e7296becdf3336a58db81f5ca8e7c445c1306c52f3e01 + checksum: 14c1024bcd57fcd469d90cf0c15c3cd4e771e2eb2cd9afee3aa79b59c8ed103654f7c5c71cdb3bfe31c1d0cb08bfad8c80f5aa1d24b4b454bd21301d5925533d languageName: node linkType: hard @@ -2277,178 +1311,49 @@ __metadata: "@babel/core": ^7.0.0-0 checksum: d817154bc10758ddd85b716e0bc1af1a1091e088400289ab6b78a1a4d609907ce3d2f1fd51a6fd0e0c8ecbb5f8e3aab4957e0747776d132d2379e85c3ef0520a languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: aae13350c50973f5802ca7906d022a6a0cc0e3aebac9122d0450bbd51e78252d4c2032ad69385e2759fcbdd3aac5d571bd7e26258907f51f8e1a51b53be626c2 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-property-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.27.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.27.1 - "@babel/helper-plugin-utils": ^7.27.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 5d99c89537d1ebaac3f526c04b162cf95a47d363d4829f78c6701a2c06ab78a48da66a94f853f85f44a3d72153410ba923e072bed4b7166fa097f503eb14131d - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1cb4e70678906e431da0a05ac3f8350025fee290304ad7482d9cfaa1ca67b2e898654de537c9268efbdad5b80d3ebadf42b4a88ea84609bd8a4cce7b11b48afd - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.27.1 - "@babel/helper-plugin-utils": ^7.27.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a34d89a2b75fb78e66d97c3dc90d4877f7e31f43316b52176f95a5dee20e9bb56ecf158eafc42a001676ddf7b393d9e67650bad6b32f5405780f25fb83cd68e3 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.4" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.25.2 - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 6d1a7e9fdde4ffc9a81c0e3f261b96a9a0dfe65da282ec96fe63b36c597a7389feac638f1df2a8a4f8c9128337bba8e984f934e9f19077930f33abf1926759ea - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-sets-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.27.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.27.1 - "@babel/helper-plugin-utils": ^7.27.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 295126074c7388ab05c82ef3ed0907a1ee4666bbdd763477ead9aba6eb2c74bdf65669416861ac93d337a4a27640963bb214acadc2697275ce95aab14868d57f - languageName: node - linkType: hard - -"@babel/preset-env@npm:^7.25.2": - version: 7.25.4 - resolution: "@babel/preset-env@npm:7.25.4" - dependencies: - "@babel/compat-data": ^7.25.4 - "@babel/helper-compilation-targets": ^7.25.2 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-validator-option": ^7.24.8 - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.25.3 - "@babel/plugin-bugfix-safari-class-field-initializer-scope": ^7.25.0 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.25.0 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.24.7 - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.25.0 - "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 - "@babel/plugin-syntax-async-generators": ^7.8.4 - "@babel/plugin-syntax-class-properties": ^7.12.13 - "@babel/plugin-syntax-class-static-block": ^7.14.5 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - "@babel/plugin-syntax-import-assertions": ^7.24.7 - "@babel/plugin-syntax-import-attributes": ^7.24.7 - "@babel/plugin-syntax-import-meta": ^7.10.4 - "@babel/plugin-syntax-json-strings": ^7.8.3 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 - "@babel/plugin-syntax-top-level-await": ^7.14.5 - "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 - "@babel/plugin-transform-arrow-functions": ^7.24.7 - "@babel/plugin-transform-async-generator-functions": ^7.25.4 - "@babel/plugin-transform-async-to-generator": ^7.24.7 - "@babel/plugin-transform-block-scoped-functions": ^7.24.7 - "@babel/plugin-transform-block-scoping": ^7.25.0 - "@babel/plugin-transform-class-properties": ^7.25.4 - "@babel/plugin-transform-class-static-block": ^7.24.7 - "@babel/plugin-transform-classes": ^7.25.4 - "@babel/plugin-transform-computed-properties": ^7.24.7 - "@babel/plugin-transform-destructuring": ^7.24.8 - "@babel/plugin-transform-dotall-regex": ^7.24.7 - "@babel/plugin-transform-duplicate-keys": ^7.24.7 - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ^7.25.0 - "@babel/plugin-transform-dynamic-import": ^7.24.7 - "@babel/plugin-transform-exponentiation-operator": ^7.24.7 - "@babel/plugin-transform-export-namespace-from": ^7.24.7 - "@babel/plugin-transform-for-of": ^7.24.7 - "@babel/plugin-transform-function-name": ^7.25.1 - "@babel/plugin-transform-json-strings": ^7.24.7 - "@babel/plugin-transform-literals": ^7.25.2 - "@babel/plugin-transform-logical-assignment-operators": ^7.24.7 - "@babel/plugin-transform-member-expression-literals": ^7.24.7 - "@babel/plugin-transform-modules-amd": ^7.24.7 - "@babel/plugin-transform-modules-commonjs": ^7.24.8 - "@babel/plugin-transform-modules-systemjs": ^7.25.0 - "@babel/plugin-transform-modules-umd": ^7.24.7 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.24.7 - "@babel/plugin-transform-new-target": ^7.24.7 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.24.7 - "@babel/plugin-transform-numeric-separator": ^7.24.7 - "@babel/plugin-transform-object-rest-spread": ^7.24.7 - "@babel/plugin-transform-object-super": ^7.24.7 - "@babel/plugin-transform-optional-catch-binding": ^7.24.7 - "@babel/plugin-transform-optional-chaining": ^7.24.8 - "@babel/plugin-transform-parameters": ^7.24.7 - "@babel/plugin-transform-private-methods": ^7.25.4 - "@babel/plugin-transform-private-property-in-object": ^7.24.7 - "@babel/plugin-transform-property-literals": ^7.24.7 - "@babel/plugin-transform-regenerator": ^7.24.7 - "@babel/plugin-transform-reserved-words": ^7.24.7 - "@babel/plugin-transform-shorthand-properties": ^7.24.7 - "@babel/plugin-transform-spread": ^7.24.7 - "@babel/plugin-transform-sticky-regex": ^7.24.7 - "@babel/plugin-transform-template-literals": ^7.24.7 - "@babel/plugin-transform-typeof-symbol": ^7.24.8 - "@babel/plugin-transform-unicode-escapes": ^7.24.7 - "@babel/plugin-transform-unicode-property-regex": ^7.24.7 - "@babel/plugin-transform-unicode-regex": ^7.24.7 - "@babel/plugin-transform-unicode-sets-regex": ^7.25.4 - "@babel/preset-modules": 0.1.6-no-external-plugins - babel-plugin-polyfill-corejs2: ^0.4.10 - babel-plugin-polyfill-corejs3: ^0.10.6 - babel-plugin-polyfill-regenerator: ^0.6.1 - core-js-compat: ^3.37.1 - semver: ^6.3.1 + linkType: hard + +"@babel/plugin-transform-unicode-property-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 752be43f0b78a2eefe5007076aed3d21b505e1c09d134b61e7de8838f1bbb1e7af81023d39adb14b6eae23727fb5a9fd23f8115a44df043319be22319be17913 + checksum: 5d99c89537d1ebaac3f526c04b162cf95a47d363d4829f78c6701a2c06ab78a48da66a94f853f85f44a3d72153410ba923e072bed4b7166fa097f503eb14131d languageName: node linkType: hard -"@babel/preset-env@npm:^7.25.3": - version: 7.27.2 - resolution: "@babel/preset-env@npm:7.27.2" +"@babel/plugin-transform-unicode-regex@npm:^7.24.7, @babel/plugin-transform-unicode-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" dependencies: - "@babel/compat-data": ^7.27.2 + "@babel/helper-create-regexp-features-plugin": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a34d89a2b75fb78e66d97c3dc90d4877f7e31f43316b52176f95a5dee20e9bb56ecf158eafc42a001676ddf7b393d9e67650bad6b32f5405780f25fb83cd68e3 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-sets-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 295126074c7388ab05c82ef3ed0907a1ee4666bbdd763477ead9aba6eb2c74bdf65669416861ac93d337a4a27640963bb214acadc2697275ce95aab14868d57f + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.25.2, @babel/preset-env@npm:^7.25.3": + version: 7.28.3 + resolution: "@babel/preset-env@npm:7.28.3" + dependencies: + "@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 @@ -2456,25 +1361,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 @@ -2491,15 +1397,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 @@ -2512,27 +1418,27 @@ __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 "@babel/preset-flow@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/preset-flow@npm:7.24.7" + version: 7.27.1 + resolution: "@babel/preset-flow@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-validator-option": ^7.24.7 - "@babel/plugin-transform-flow-strip-types": ^7.24.7 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-validator-option": ^7.27.1 + "@babel/plugin-transform-flow-strip-types": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4caca02a6e0a477eb22994d686a1fbf65b5ab0240ae77530696434dba7efff4c5dcbf9186a774168dd4c492423141a22af3f2874c356aa22429f3c83eaf34419 + checksum: f3f25b390debf72a6ff0170a2d5198aea344ba96f05eaca0bae2c7072119706fd46321604d89646bda1842527cfc6eab8828a983ec90149218d2120b9cd26596 languageName: node linkType: hard @@ -2550,64 +1456,44 @@ __metadata: linkType: hard "@babel/preset-react@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/preset-react@npm:7.24.7" + version: 7.27.1 + resolution: "@babel/preset-react@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-validator-option": ^7.24.7 - "@babel/plugin-transform-react-display-name": ^7.24.7 - "@babel/plugin-transform-react-jsx": ^7.24.7 - "@babel/plugin-transform-react-jsx-development": ^7.24.7 - "@babel/plugin-transform-react-pure-annotations": ^7.24.7 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-validator-option": ^7.27.1 + "@babel/plugin-transform-react-display-name": ^7.27.1 + "@babel/plugin-transform-react-jsx": ^7.27.1 + "@babel/plugin-transform-react-jsx-development": ^7.27.1 + "@babel/plugin-transform-react-pure-annotations": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 76d0365b6bca808be65c4ccb3f3384c0792084add15eb537f16b3e44184216b82fa37f945339b732ceee6f06e09ba1f39f75c45e69b9811ddcc479f05555ea9c + checksum: 00bc146f9c742eed804c598d3f31b7d889c1baf8c768989b7f84a93ca527dd1518d3b86781e89ca45cae6dbee136510d3a121658e01416c5578aecf751517bb5 languageName: node linkType: hard "@babel/preset-typescript@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/preset-typescript@npm:7.24.7" + version: 7.27.1 + resolution: "@babel/preset-typescript@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-validator-option": ^7.24.7 - "@babel/plugin-syntax-jsx": ^7.24.7 - "@babel/plugin-transform-modules-commonjs": ^7.24.7 - "@babel/plugin-transform-typescript": ^7.24.7 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-validator-option": ^7.27.1 + "@babel/plugin-syntax-jsx": ^7.27.1 + "@babel/plugin-transform-modules-commonjs": ^7.27.1 + "@babel/plugin-transform-typescript": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 12929b24757f3bd6548103475f86478eda4c872bc7cefd920b29591eee8f4a4f350561d888e133d632d0c9402b8615fdcec9138e5127a6567dcb22f804ff207f - languageName: node - linkType: hard - -"@babel/regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "@babel/regjsgen@npm:0.8.0" - checksum: 89c338fee774770e5a487382170711014d49a68eb281e74f2b5eac88f38300a4ad545516a7786a8dd5702e9cf009c94c2f582d200f077ac5decd74c56b973730 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.8.4": - version: 7.25.6 - resolution: "@babel/runtime@npm:7.25.6" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: ee1a69d3ac7802803f5ee6a96e652b78b8addc28c6a38c725a4ad7d61a059d9e6cb9f6550ed2f63cce67a1bd82e0b1ef66a1079d895be6bfb536a5cfbd9ccc32 + checksum: 38020f1b23e88ec4fbffd5737da455d8939244bddfb48a2516aef93fb5947bd9163fb807ce6eff3e43fa5ffe9113aa131305fef0fb5053998410bbfcfe6ce0ec languageName: node linkType: hard -"@babel/template@npm:^7.0.0, @babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0, @babel/template@npm:^7.3.3": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" - dependencies: - "@babel/code-frame": ^7.24.7 - "@babel/parser": ^7.25.0 - "@babel/types": ^7.25.0 - checksum: 3f2db568718756d0daf2a16927b78f00c425046b654cd30b450006f2e84bdccaf0cbe6dc04994aa1f5f6a4398da2f11f3640a4d3ee31722e43539c4c919c817b +"@babel/runtime@npm:^7.25.0": + version: 7.28.4 + resolution: "@babel/runtime@npm:7.28.4" + checksum: 934b0a0460f7d06637d93fcd1a44ac49adc33518d17253b5a0b55ff4cb90a45d8fe78bf034b448911dbec7aff2a90b918697559f78d21c99ff8dbadae9565b55 languageName: node linkType: hard -"@babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2": +"@babel/template@npm:^7.0.0, @babel/template@npm:^7.25.0, @babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2, @babel/template@npm:^7.3.3": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" dependencies: @@ -2618,54 +1504,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.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4": - version: 7.25.6 - resolution: "@babel/traverse@npm:7.25.6" - dependencies: - "@babel/code-frame": ^7.24.7 - "@babel/generator": ^7.25.6 - "@babel/parser": ^7.25.6 - "@babel/template": ^7.25.0 - "@babel/types": ^7.25.6 - debug: ^4.3.1 - globals: ^11.1.0 - checksum: 11ee47269aa4356f2d6633a05b9af73405b5ed72c09378daf644289b686ef852035a6ac9aa410f601991993c6bbf72006795b5478283b78eb1ca77874ada7737 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3": - 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, @babel/traverse@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/traverse@npm:7.28.4" 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.4 "@babel/template": ^7.27.2 - "@babel/types": ^7.27.3 + "@babel/types": ^7.28.4 debug: ^4.3.1 - globals: ^11.1.0 - checksum: ae0047fe786e200ffb048929347b074988e8b68decdb9fc0e2b36ca3e137d72462f349fa0e6193e44fb3cb99f9c639654515028995b44d7040707cef48ddb5c1 + checksum: d603b8ce4e55ba4fc7b28d3362cc2b1b20bc887e471c8a59fe87b2578c26803c9ef8fcd118081dd8283ea78e0e9a6df9d88c8520033c6aaf81eec30d2a669151 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.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.25.6 - resolution: "@babel/types@npm:7.25.6" - dependencies: - "@babel/helper-string-parser": ^7.24.8 - "@babel/helper-validator-identifier": ^7.24.7 - to-fast-properties: ^2.0.0 - checksum: 9b2f84ff3f874ad05b0b9bf06862c56f478b65781801f82296b4cc01bee39e79c20a7c0a06959fed0ee582c8267e1cb21638318655c5e070b0287242a844d1c9 - languageName: node - linkType: hard - -"@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3": - 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.28.4, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.28.4 + resolution: "@babel/types@npm:7.28.4" dependencies: "@babel/helper-string-parser": ^7.27.1 "@babel/helper-validator-identifier": ^7.27.1 - checksum: c3bd0984d892b0edec38fd12cf63f620bb52fba8187ec7cbe2d1aff5bee5e185e0fd86a3fb90b4d8f18b072113d07901476d0e39f58d5c988db14b231a6ea735 + checksum: a369b4fb73415a2ed902a15576b49696ae9777ddee394a7a904c62e6fbb31f43906b0147ae0b8f03ac17f20c248eac093df349e33c65c94617b12e524b759694 languageName: node linkType: hard @@ -2894,42 +1754,24 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.1 - resolution: "@eslint-community/eslint-utils@npm:4.4.1" +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0": + version: 4.9.0 + resolution: "@eslint-community/eslint-utils@npm:4.9.0" dependencies: eslint-visitor-keys: ^3.4.3 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: a7ffc838eb6a9ef594cda348458ccf38f34439ac77dc090fa1c120024bcd4eb911dfd74d5ef44d42063e7949fa7c5123ce714a015c4abb917d4124be1bd32bfe + checksum: ae9b98eea006d1354368804b0116b8b45017a4e47b486d1b9cfa048a8ed3dc69b9b074eb2b2acb14034e6897c24048fd42b6a6816d9dc8bb9daad79db7d478d2 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0": +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": version: 4.12.1 resolution: "@eslint-community/regexpp@npm:4.12.1" checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.6.1": - version: 4.11.1 - resolution: "@eslint-community/regexpp@npm:4.11.1" - checksum: 6986685529d30e33c2640973c3d8e7ddd31bef3cc8cb10ad54ddc1dea12680779a2c23a45562aa1462c488137a3570e672d122fac7da22d82294382d915cec70 - languageName: node - linkType: hard - "@eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" @@ -2955,11 +1797,11 @@ __metadata: linkType: hard "@evilmartians/lefthook@npm:^1.5.0": - version: 1.7.18 - resolution: "@evilmartians/lefthook@npm:1.7.18" + version: 1.13.6 + resolution: "@evilmartians/lefthook@npm:1.13.6" bin: lefthook: bin/index.js - checksum: 2adb3358571c2c722f20976d3846b81a989e7d9811021fde8ef15c73d395646d9be65ecbf52a53d6ec37ddb9e48f99db2ceb36e557f5f2da82ed8025f8f57548 + checksum: 6cceca3e874015678f50818ae14a74d959816cfaba6638f8852d007332404d6819b15c71538985a3650a1ef057aa6975c17fadfe43ece7a0da1aeb9faaf02946 conditions: (os=darwin | os=linux | os=win32) & (cpu=x64 | cpu=arm64 | cpu=ia32) languageName: node linkType: hard @@ -3033,9 +1875,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 @@ -3053,6 +1895,15 @@ __metadata: languageName: node linkType: hard +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: ^7.0.4 + checksum: 5d36d289960e886484362d9eb6a51d1ea28baed5f5d0140bbe62b99bac52eaf06cc01c2bc0d3575977962f84f6b2c4387b043ee632216643d4787b0999465bf2 + languageName: node + linkType: hard + "@isaacs/ttlcache@npm:^1.4.1": version: 1.4.1 resolution: "@isaacs/ttlcache@npm:1.4.1" @@ -3094,10 +1945,10 @@ __metadata: "@react-native/eslint-config": 0.79.3 "@react-native/metro-config": 0.79.3 "@react-native/typescript-config": 0.79.3 - "@react-navigation/bottom-tabs": ^6.6.1 - "@react-navigation/native": ^6.0.8 - "@react-navigation/native-stack": ^6.11.0 - "@react-navigation/stack": ^6.3.21 + "@react-navigation/bottom-tabs": ^7.0.0 + "@react-navigation/native": ^7.1.14 + "@react-navigation/native-stack": ^7.0.0 + "@react-navigation/stack": ^7.4.2 "@types/jest": ^29.5.13 "@types/react": ^19.0.0 "@types/react-test-renderer": ^19.0.0 @@ -3105,11 +1956,11 @@ __metadata: react-native: 0.79.3 react-native-builder-bob: ^0.30.2 react-native-dotenv: ^3.4.11 - react-native-gesture-handler: ^2.24.0 - react-native-safe-area-context: ^5.1.0 - react-native-screens: ^4.9.1 + react-native-gesture-handler: ^2.26.0 + react-native-safe-area-context: ^5.4.0 + react-native-screens: ^4.10.0 react-native-vector-icons: ^10.2.0 - react-native-webview: ^13.13.1 + react-native-webview: ^13.14.1 react-test-renderer: 19.0.0 languageName: unknown linkType: soft @@ -3125,7 +1976,7 @@ __metadata: "@react-native/metro-config": 0.79.3 "@react-native/typescript-config": 0.79.3 "@react-navigation/native": ^7.1.14 - "@release-it/conventional-changelog": ^9.0.2 + "@release-it/conventional-changelog": ^9.0.4 "@testing-library/jest-native": ^5.4.3 "@testing-library/react-native": ^13.3.3 "@types/jest": ^29.5.5 @@ -3136,12 +1987,13 @@ __metadata: commitlint: ^19.6.1 del-cli: ^5.1.0 eslint: ^8.51.0 - eslint-config-prettier: ^9.0.0 + eslint-config-prettier: ^10.1.8 eslint-plugin-jest: ^28.9.0 eslint-plugin-prettier: ^5.0.1 eslint-plugin-tsdoc: ^0.3.0 jest: ^29.7.0 prettier: ^3.0.3 + prettier-eslint: ^16.4.2 react: 19.0.0 react-native: 0.79.3 react-native-builder-bob: ^0.40.4 @@ -3445,14 +2297,23 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" +"@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/sourcemap-codec": ^1.5.0 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: f2105acefc433337145caa3c84bba286de954f61c0bc46279bbd85a9e6a02871089717fa060413cfb6a9d44189fe8313b2d1cabf3a2eb3284d208fd5f75c54ff + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" dependencies: - "@jridgewell/set-array": ^1.2.1 - "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/gen-mapping": ^0.3.5 "@jridgewell/trace-mapping": ^0.3.24 - checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 + checksum: 4a66a7397c3dc9c6b5c14a0024b1f98c5e1d90a0dbc1e5955b5038f2db339904df2a0ee8a66559fafb4fc23ff33700a2639fd40bbdd2e9e82b58b3bdf83738e3 languageName: node linkType: hard @@ -3463,37 +2324,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.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: "@jridgewell/resolve-uri": ^3.1.0 "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 + checksum: af8fda2431348ad507fbddf8e25f5d08c79ecc94594061ce402cf41bc5aba1a7b3e59bf0fd70a619b35f33983a3f488ceeba8faf56bff784f98bb5394a8b7d47 languageName: node linkType: hard @@ -3552,25 +2406,25 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.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 socks-proxy-agent: ^8.0.3 - checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 + checksum: e8fc25d536250ed3e669813b36e8c6d805628b472353c57afd8c4fde0fcfcf3dda4ffe22f7af8c9070812ec2e7a03fb41d7151547cef3508efe661a5a3add20f languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" dependencies: semver: ^7.3.5 - checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 + checksum: 68951c589e9a4328698a35fd82fe71909a257d6f2ede0434d236fa55634f0fbcad9bb8755553ce5849bd25ee6f019f4d435921ac715c853582c4a7f5983c8d4a languageName: node linkType: hard @@ -3706,10 +2560,10 @@ __metadata: languageName: node linkType: hard -"@pkgr/core@npm:^0.1.0": - version: 0.1.1 - resolution: "@pkgr/core@npm:0.1.1" - checksum: 6f25fd2e3008f259c77207ac9915b02f1628420403b2630c92a07ff963129238c9262afc9e84344c7a23b5cc1f3965e2cd17e3798219f5fd78a63d144d3cceba +"@pkgr/core@npm:^0.2.9": + version: 0.2.9 + resolution: "@pkgr/core@npm:0.2.9" + checksum: bb2fb86977d63f836f8f5b09015d74e6af6488f7a411dcd2bfdca79d76b5a681a9112f41c45bdf88a9069f049718efc6f3900d7f1de66a2ec966068308ae517f languageName: node linkType: hard @@ -4153,36 +3007,19 @@ __metadata: languageName: node linkType: hard -"@react-navigation/bottom-tabs@npm:^6.6.1": - version: 6.6.1 - resolution: "@react-navigation/bottom-tabs@npm:6.6.1" +"@react-navigation/bottom-tabs@npm:^7.0.0": + version: 7.4.8 + resolution: "@react-navigation/bottom-tabs@npm:7.4.8" dependencies: - "@react-navigation/elements": ^1.3.31 + "@react-navigation/elements": ^2.6.5 color: ^4.2.3 - warn-once: ^0.1.0 peerDependencies: - "@react-navigation/native": ^6.0.0 - react: "*" + "@react-navigation/native": ^7.1.18 + react: ">= 18.2.0" react-native: "*" - react-native-safe-area-context: ">= 3.0.0" - react-native-screens: ">= 3.0.0" - checksum: 07d6da4b91d7f372b67bcb9f1ff97fba96f1fe226bd95d43d7877362ce71d99c6eebe9ca41d84ea8828f055713386262e089a8207a6c849f33bae49b4df4b196 - languageName: node - linkType: hard - -"@react-navigation/core@npm:^6.4.17": - version: 6.4.17 - resolution: "@react-navigation/core@npm:6.4.17" - dependencies: - "@react-navigation/routers": ^6.1.9 - escape-string-regexp: ^4.0.0 - nanoid: ^3.1.23 - query-string: ^7.1.3 - react-is: ^16.13.0 - use-latest-callback: ^0.2.1 - peerDependencies: - react: "*" - checksum: 5e7315bb6ebff8e796eaccb0442d00696466750cc387e93f5edb5293d4ad3f409c1525ef76192894488e2d0979b762b236a1b0fbbb7500b2f065bf4745d509c0 + react-native-safe-area-context: ">= 4.0.0" + react-native-screens: ">= 4.0.0" + checksum: b983a9fbb81b88609df1947a310ebc64008eff37421b481c57262bff2dc9e68f116ff44bb7c173ab4ecdb5d0b6dcbb32928d43c9ecdd656bb11e9d97a3089d03 languageName: node linkType: hard @@ -4203,52 +3040,45 @@ __metadata: languageName: node linkType: hard -"@react-navigation/elements@npm:^1.3.31": - version: 1.3.31 - resolution: "@react-navigation/elements@npm:1.3.31" - peerDependencies: - "@react-navigation/native": ^6.0.0 - react: "*" - react-native: "*" - react-native-safe-area-context: ">= 3.0.0" - checksum: 1e4a65ccd9fab757d01bf41f605aafd6ca8301ae25ad7d3f1769320793418cca9fe2f25ac9337578ce1e0a1560bbbc3a88f18b899867aacd4d31de7a789e417e - languageName: node - linkType: hard - -"@react-navigation/native-stack@npm:^6.11.0": - version: 6.11.0 - resolution: "@react-navigation/native-stack@npm:6.11.0" +"@react-navigation/elements@npm:^2.6.5": + version: 2.6.5 + resolution: "@react-navigation/elements@npm:2.6.5" dependencies: - "@react-navigation/elements": ^1.3.31 - warn-once: ^0.1.0 + color: ^4.2.3 + use-latest-callback: ^0.2.4 + use-sync-external-store: ^1.5.0 peerDependencies: - "@react-navigation/native": ^6.0.0 - react: "*" + "@react-native-masked-view/masked-view": ">= 0.2.0" + "@react-navigation/native": ^7.1.18 + react: ">= 18.2.0" react-native: "*" - react-native-safe-area-context: ">= 3.0.0" - react-native-screens: ">= 3.0.0" - checksum: d3dd57c216f5dbe53636bdb9aa48fe27831640f868cf5c68731943a49b68cb457d81182e7868f3e3033da0564e9f193f1b06b69085b8bc5b04ccfbe12ea2bbc0 + react-native-safe-area-context: ">= 4.0.0" + peerDependenciesMeta: + "@react-native-masked-view/masked-view": + optional: true + checksum: ed6542b9dfaf04693445bb847651cc6bfdac5c2ffb687c1a5dcc473a05d12cd5e951c3ef5df854978aa93b6ced0bab1bbe94390df10cf24f2e3f9b72688661fb languageName: node linkType: hard -"@react-navigation/native@npm:^6.0.8": - version: 6.1.18 - resolution: "@react-navigation/native@npm:6.1.18" +"@react-navigation/native-stack@npm:^7.0.0": + version: 7.3.27 + resolution: "@react-navigation/native-stack@npm:7.3.27" dependencies: - "@react-navigation/core": ^6.4.17 - escape-string-regexp: ^4.0.0 - fast-deep-equal: ^3.1.3 - nanoid: ^3.1.23 + "@react-navigation/elements": ^2.6.5 + warn-once: ^0.1.1 peerDependencies: - react: "*" + "@react-navigation/native": ^7.1.18 + react: ">= 18.2.0" react-native: "*" - checksum: 82aeea67723f5dc41403e1c260f04942696f6cde95e30629c383521c3837d18d2d5c21bd78f0ade50beb81ac5edca2d7d38980dcd3a79e3acc86f45d0c09a4b8 + react-native-safe-area-context: ">= 4.0.0" + react-native-screens: ">= 4.0.0" + checksum: 7719e78b86e3465a8a51ef302a54c059aa0e7ff38d671c898f71e91265a71843f6fc17ef783ff08e80b00c4f16902cba58f41fdd06efbc735b11a090d7f371d0 languageName: node linkType: hard "@react-navigation/native@npm:^7.1.14": - version: 7.1.17 - resolution: "@react-navigation/native@npm:7.1.17" + version: 7.1.18 + resolution: "@react-navigation/native@npm:7.1.18" dependencies: "@react-navigation/core": ^7.12.4 escape-string-regexp: ^4.0.0 @@ -4258,16 +3088,7 @@ __metadata: peerDependencies: react: ">= 18.2.0" react-native: "*" - checksum: f0caa70f777c32861ce23a834d3afe6891c7829016649bf1491ba6b540fd4443dd6c5e6d8b44f58b92efed6074ea986e04b88ff84e9e19c09d68d9302ebd977a - languageName: node - linkType: hard - -"@react-navigation/routers@npm:^6.1.9": - version: 6.1.9 - resolution: "@react-navigation/routers@npm:6.1.9" - dependencies: - nanoid: ^3.1.23 - checksum: 3a3392ce095d6a2bd2aad69856f513b35774f943a3dc73d8ffb75127de6773203e3264188d87058bdea4c0c9a7d43ed28d0cbf3a1f1cdc086df3ee255d8e1e27 + checksum: c7f0f6ae439a4d74cc7f42fe693aa014acdaaf3205c07cf40448eac5ef0417a307a08da0b8ad79516028182e3377c77332e40697874ceee3bd8ec52be7f8d459 languageName: node linkType: hard @@ -4280,25 +3101,24 @@ __metadata: languageName: node linkType: hard -"@react-navigation/stack@npm:^6.3.21": - version: 6.4.1 - resolution: "@react-navigation/stack@npm:6.4.1" +"@react-navigation/stack@npm:^7.4.2": + version: 7.4.9 + resolution: "@react-navigation/stack@npm:7.4.9" dependencies: - "@react-navigation/elements": ^1.3.31 + "@react-navigation/elements": ^2.6.5 color: ^4.2.3 - warn-once: ^0.1.0 peerDependencies: - "@react-navigation/native": ^6.0.0 - react: "*" + "@react-navigation/native": ^7.1.18 + react: ">= 18.2.0" react-native: "*" - react-native-gesture-handler: ">= 1.0.0" - react-native-safe-area-context: ">= 3.0.0" - react-native-screens: ">= 3.0.0" - checksum: 09bcfb001db0f411df881da9f2551b7015c4d5259a77fcb93196de308838035d016dc4dcb654d16d9cd4cc99f09f5e48add796aa903f9a253678947c35b18199 + react-native-gesture-handler: ">= 2.0.0" + react-native-safe-area-context: ">= 4.0.0" + react-native-screens: ">= 4.0.0" + checksum: 2efe2b33cea7a789d47f4721441d3cd66036b8425dbb1abbb4551560b34b8b83e852e9a8b5747d2a6fc4d3ef8ee41c24726e3205731534bf1445e6f77736b4ce languageName: node linkType: hard -"@release-it/conventional-changelog@npm:^9.0.2": +"@release-it/conventional-changelog@npm:^9.0.4": version: 9.0.4 resolution: "@release-it/conventional-changelog@npm:9.0.4" dependencies: @@ -4478,11 +3298,11 @@ __metadata: linkType: hard "@types/babel__generator@npm:*": - version: 7.6.8 - resolution: "@types/babel__generator@npm:7.6.8" + version: 7.27.0 + resolution: "@types/babel__generator@npm:7.27.0" dependencies: "@babel/types": ^7.0.0 - checksum: 5b332ea336a2efffbdeedb92b6781949b73498606ddd4205462f7d96dafd45ff3618770b41de04c4881e333dd84388bfb8afbdf6f2764cbd98be550d85c6bb48 + checksum: e6739cacfa276c1ad38e1d8a6b4b1f816c2c11564e27f558b68151728489aaf0f4366992107ee4ed7615dfa303f6976dedcdce93df2b247116d1bcd1607ee260 languageName: node linkType: hard @@ -4497,11 +3317,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.6 - resolution: "@types/babel__traverse@npm:7.20.6" + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - "@babel/types": ^7.20.7 - checksum: 2bdc65eb62232c2d5c1086adeb0c31e7980e6fd7e50a3483b4a724a1a1029c84d9cb59749cf8de612f9afa2bc14c85b8f50e64e21f8a4398fa77eb9059a4283c + "@babel/types": ^7.28.2 + checksum: e3124e6575b2f70de338eab8a9c704d315a86c46a8e395b6ec78a0157ab7b5fd877289556a57dcf28e4ff3543714e359cc1182d4afc4bcb4f3575a0bbafa0dad languageName: node linkType: hard @@ -4564,7 +3384,7 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^29.5.13": +"@types/jest@npm:^29.5.13, @types/jest@npm:^29.5.5": version: 29.5.14 resolution: "@types/jest@npm:29.5.14" dependencies: @@ -4574,16 +3394,6 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^29.5.5": - version: 29.5.13 - resolution: "@types/jest@npm:29.5.13" - dependencies: - expect: ^29.0.0 - pretty-format: ^29.0.0 - checksum: 875ac23c2398cdcf22aa56c6ba24560f11d2afda226d4fa23936322dde6202f9fdbd2b91602af51c27ecba223d9fc3c1e33c9df7e47b3bf0e2aefc6baf13ce53 - languageName: node - linkType: hard - "@types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -4599,11 +3409,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.7.4 - resolution: "@types/node@npm:22.7.4" + version: 24.7.0 + resolution: "@types/node@npm:24.7.0" dependencies: - undici-types: ~6.19.2 - checksum: a3f4154147639369aed08fe6f8d62eff637cf87b187bb252d7bbccdc82884626007af424b08a653c53f2182adfa0340001b4888cb7cbb942cef351210fc742a5 + undici-types: ~7.14.0 + checksum: 154e6113dae3e551386d37d9e84e15bbf2a81ee14700ce42815f123ff35904363ab86a5650f98b555a892f1502b45a0aaa91666a979ec8860d95b09179d7100f languageName: node linkType: hard @@ -4643,25 +3453,18 @@ __metadata: linkType: hard "@types/react@npm:^19.0.0": - version: 19.1.6 - resolution: "@types/react@npm:19.1.6" + version: 19.2.2 + resolution: "@types/react@npm:19.2.2" dependencies: csstype: ^3.0.2 - checksum: 7f4d2e5fd0c1afa6aef956e551c982a59c3ccf37cf30b877300306dcae87e0c4bf7b28b54676b1783f4ca92e730af6fb7a4c1b7f6df27ba14579aa1617a58b09 - languageName: node - linkType: hard - -"@types/semver@npm:^7.3.12": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 + checksum: 7eb2d316dd5a6c02acb416524b50bae932c38d055d26e0f561ca23c009c686d16a2b22fcbb941eecbe2ecb167f119e29b9d0142d9d056dd381352c43413b60da languageName: node linkType: hard -"@types/semver@npm:^7.5.5": - version: 7.7.0 - resolution: "@types/semver@npm:7.7.0" - checksum: d488eaeddb23879a0a8a759bed667e1a76cb0dd4d23e3255538e24c189db387357953ca9e7a3bda2bb7f95e84cac8fe0db4fbe6b3456e893043337732d1d23cc +"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.5": + version: 7.7.1 + resolution: "@types/semver@npm:7.7.1" + checksum: 76d218e414482a398148d5c28f2bfa017108869f3fc18cda379c9d8d062348f8b9653ae2fa8642d3b5b52e211928fe8be34f22da4e1f08245c84e0e51e040673 languageName: node linkType: hard @@ -4728,25 +3531,41 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^8.13.0": - version: 8.13.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.13.0" + version: 8.46.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.46.0" dependencies: "@eslint-community/regexpp": ^4.10.0 - "@typescript-eslint/scope-manager": 8.13.0 - "@typescript-eslint/type-utils": 8.13.0 - "@typescript-eslint/utils": 8.13.0 - "@typescript-eslint/visitor-keys": 8.13.0 + "@typescript-eslint/scope-manager": 8.46.0 + "@typescript-eslint/type-utils": 8.46.0 + "@typescript-eslint/utils": 8.46.0 + "@typescript-eslint/visitor-keys": 8.46.0 graphemer: ^1.4.0 - ignore: ^5.3.1 + ignore: ^7.0.0 natural-compare: ^1.4.0 - ts-api-utils: ^1.3.0 + ts-api-utils: ^2.1.0 peerDependencies: - "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + "@typescript-eslint/parser": ^8.46.0 eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: b3a33bbdeffeefc5798abde387b440cfbc1c0ec6778ed2fe16238f10adae28193015ecf923f305bf9a67fcb108dced47216c9dbc6778736b6db5a97e71e212af + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" + dependencies: + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 42d5c14abdf97167147f3d753398cf62f44c05ae69615c2630720007a87f70aabe0440de744eb1f95eb72a6f5d3943069d4c2e030789590d7ccf7210b39d9db1 + checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 languageName: node linkType: hard @@ -4769,20 +3588,31 @@ __metadata: linkType: hard "@typescript-eslint/parser@npm:^8.13.0": - version: 8.13.0 - resolution: "@typescript-eslint/parser@npm:8.13.0" + version: 8.46.0 + resolution: "@typescript-eslint/parser@npm:8.46.0" dependencies: - "@typescript-eslint/scope-manager": 8.13.0 - "@typescript-eslint/types": 8.13.0 - "@typescript-eslint/typescript-estree": 8.13.0 - "@typescript-eslint/visitor-keys": 8.13.0 + "@typescript-eslint/scope-manager": 8.46.0 + "@typescript-eslint/types": 8.46.0 + "@typescript-eslint/typescript-estree": 8.46.0 + "@typescript-eslint/visitor-keys": 8.46.0 debug: ^4.3.4 peerDependencies: eslint: ^8.57.0 || ^9.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 5e2d5b2eb5a30c4eeb75ab05975fd793c6d809399c5f000a918747283c760201311b1df85a699fd260a3d7cff1be5f39938d59a1d2f8e92141402bf32b4ad748 + typescript: ">=4.8.4 <6.0.0" + checksum: 9447250aa770eee131d81475784404b2b07caacf9bae8cef38b9ee639d8225504849a5586b5746b575f2c5dfbc9c612eb742acd8612bb1c425245f324f574613 + languageName: node + linkType: hard + +"@typescript-eslint/project-service@npm:8.46.0": + version: 8.46.0 + resolution: "@typescript-eslint/project-service@npm:8.46.0" + dependencies: + "@typescript-eslint/tsconfig-utils": ^8.46.0 + "@typescript-eslint/types": ^8.46.0 + debug: ^4.3.4 + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: ae8365cdbae5c8ee622727295f7cb59c42ccb0a4672d72692f2f31b26a052b7a9e46f58326740ca8d471a7e85998b885858be6c21921d465ce57de1d3ea7355f languageName: node linkType: hard @@ -4796,6 +3626,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/scope-manager@npm:7.18.0" @@ -4806,13 +3646,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.13.0": - version: 8.13.0 - resolution: "@typescript-eslint/scope-manager@npm:8.13.0" +"@typescript-eslint/scope-manager@npm:8.46.0": + version: 8.46.0 + resolution: "@typescript-eslint/scope-manager@npm:8.46.0" dependencies: - "@typescript-eslint/types": 8.13.0 - "@typescript-eslint/visitor-keys": 8.13.0 - checksum: 7c80fddb07b3b4e77f05c3ad8aec9a4dda553638188618bc993352ed2b39a8db464c8f28dad8dfc4d82e06ac793fa83a9983198231a7a4711a0dc6f0955b8ad5 + "@typescript-eslint/types": 8.46.0 + "@typescript-eslint/visitor-keys": 8.46.0 + checksum: 0995be736f153314b7744594b7b5e27e63cf7b00b64b3a8cf23b4f01fc9cc01b9e652e433da438fe93efe63e505d61adb5c25319fe25e9f0ccdfea1ad7848fba + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.46.0, @typescript-eslint/tsconfig-utils@npm:^8.46.0": + version: 8.46.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.46.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: d4516fb18c577a47f614efe6233354efefc582eaa4e915ae3d20c23f3b17e098b254594aa26d9c51eec1116d18665f06d9ed51229600df3ce3daecae83c76865 languageName: node linkType: hard @@ -4833,18 +3682,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.13.0": - version: 8.13.0 - resolution: "@typescript-eslint/type-utils@npm:8.13.0" +"@typescript-eslint/type-utils@npm:8.46.0": + version: 8.46.0 + resolution: "@typescript-eslint/type-utils@npm:8.46.0" dependencies: - "@typescript-eslint/typescript-estree": 8.13.0 - "@typescript-eslint/utils": 8.13.0 + "@typescript-eslint/types": 8.46.0 + "@typescript-eslint/typescript-estree": 8.46.0 + "@typescript-eslint/utils": 8.46.0 debug: ^4.3.4 - ts-api-utils: ^1.3.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 98e369a49c4334d8871283f995f010ef38b023f80f922cfef60c21c635cf3a2992ce634613b931de129bb5f4d4939b36025f4cc5aa958bb21fee8eb4d8b78c60 + ts-api-utils: ^2.1.0 + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 864f7bc0df053089d09bc757abf4f728f6fc942e162baa727f24cf68d1d79f53ccd1dff151e74b0e43c25dc53d5ce32f916a2218786d365e1027d99c6799d6d9 languageName: node linkType: hard @@ -4855,6 +3705,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/types@npm:7.18.0" @@ -4862,10 +3719,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.13.0": - version: 8.13.0 - resolution: "@typescript-eslint/types@npm:8.13.0" - checksum: 361489858f07cba8a331d360d73b51a174a902612fd7bb212560a4d7dc2bd704daf252debc410b09e92217aedca9076c3b2892ec76bcf83a7e1575a175942c2e +"@typescript-eslint/types@npm:8.46.0, @typescript-eslint/types@npm:^8.46.0": + version: 8.46.0 + resolution: "@typescript-eslint/types@npm:8.46.0" + checksum: 71b7e0845da160cbd8ef1a5f853a1b8626f5bd00a1db56b75218eb94d5f3433f7815635e70df52118657c57109458f2e0d2bec8dcca0c620af10c66205fe54cd languageName: node linkType: hard @@ -4887,6 +3744,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + minimatch: 9.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" @@ -4906,22 +3782,23 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.13.0": - version: 8.13.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.13.0" +"@typescript-eslint/typescript-estree@npm:8.46.0": + version: 8.46.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.46.0" dependencies: - "@typescript-eslint/types": 8.13.0 - "@typescript-eslint/visitor-keys": 8.13.0 + "@typescript-eslint/project-service": 8.46.0 + "@typescript-eslint/tsconfig-utils": 8.46.0 + "@typescript-eslint/types": 8.46.0 + "@typescript-eslint/visitor-keys": 8.46.0 debug: ^4.3.4 fast-glob: ^3.3.2 is-glob: ^4.0.3 minimatch: ^9.0.4 semver: ^7.6.0 - ts-api-utils: ^1.3.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 43d33fa341b44e11f3dcd627ea38ebe4433320e569d4a502e44acb370f3a6f64609cf4f98f874eefc161aa42487e35b6e499e74ec422f3c629c7bba155c3d88a + ts-api-utils: ^2.1.0 + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 70f5523d266097c96e5de2cf28c86c5bb3c9d4f48ba129a9c13e620733d395008dc809c77f1af19fc4617133c0665bf65a6a688fbf40da29d5a6ebe137ea41ae languageName: node linkType: hard @@ -4939,17 +3816,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.13.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.13.0 - resolution: "@typescript-eslint/utils@npm:8.13.0" +"@typescript-eslint/utils@npm:8.46.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.46.0 + resolution: "@typescript-eslint/utils@npm:8.46.0" dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - "@typescript-eslint/scope-manager": 8.13.0 - "@typescript-eslint/types": 8.13.0 - "@typescript-eslint/typescript-estree": 8.13.0 + "@eslint-community/eslint-utils": ^4.7.0 + "@typescript-eslint/scope-manager": 8.46.0 + "@typescript-eslint/types": 8.46.0 + "@typescript-eslint/typescript-estree": 8.46.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 6d6ec83c4806aeeba94777bf82230a2cde9bd5aa90969ac73cd2e3ba22eb6b1e4f7d3710dbe13a1a1734857c3cd3e8522bb043a04e85cea583c91618a28cc200 + typescript: ">=4.8.4 <6.0.0" + checksum: 63c9f4df8f823ef7f83fe2c53f85fd5e278d60240d41414f69c8ecb37061fec74ad34851faf28283042a1a0b983ddca57dbd97a7e653073068c7f22e919f84ea languageName: node linkType: hard @@ -4981,6 +3859,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + eslint-visitor-keys: ^3.4.1 + checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" @@ -4991,20 +3879,20 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.13.0": - version: 8.13.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.13.0" +"@typescript-eslint/visitor-keys@npm:8.46.0": + version: 8.46.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.46.0" dependencies: - "@typescript-eslint/types": 8.13.0 - eslint-visitor-keys: ^3.4.3 - checksum: eeefa461dbf60c967bcc2905bfd80fd6f5d015e8139c7d7a44a46d8ffa9339089a3a0eb937423e3c59aff306c238ed8821bda935db1da28ae063f2ce1deafe08 + "@typescript-eslint/types": 8.46.0 + eslint-visitor-keys: ^4.2.1 + checksum: 888adc68bd8d80adb185520f2016b81a934f793db323cd62452027fad2e76a5ab64ed9500c4e5a2be2e5d2458e071776ea86a62e40e32faa4348ca4ab84dddda languageName: node linkType: hard "@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 64ed518f49c2b31f5b50f8570a1e37bde3b62f2460042c50f132430b2d869c4a6586f13aa33a58a4722715b8158c68cae2827389d6752ac54da2893c83e480fc languageName: node linkType: hard @@ -5027,10 +3915,10 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 +"abbrev@npm:^3.0.0": + version: 3.0.1 + resolution: "abbrev@npm:3.0.1" + checksum: e70b209f5f408dd3a3bbd0eec4b10a2ffd64704a4a3821d0969d84928cc490a8eb60f85b78a95622c1841113edac10161c62e52f5e7d0027aa26786a8136e02e languageName: node linkType: hard @@ -5043,7 +3931,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:^1.3.7, accepts@npm:~1.3.5, accepts@npm:~1.3.7": +"accepts@npm:^1.3.7, accepts@npm:~1.3.7": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -5062,12 +3950,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" +"acorn@npm:^8.15.0, acorn@npm:^8.9.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: 677880034aee5bdf7434cc2d25b641d7bedb0b5ef47868a78dadabedccf58e1c5457526d9d8249cd253f2df087e081c3fe7d903b448d8e19e5131a3065b83c07 + checksum: 309c6b49aedf1a2e34aaf266de06de04aab6eb097c02375c66fdeb0f64556a6a823540409914fb364d9a11bc30d79d485a2eba29af47992d3490e9886c4391c3 languageName: node linkType: hard @@ -5078,19 +3966,10 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: ^4.3.4 - checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 - languageName: node - linkType: hard - -"agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 87bb7ee54f5ecf0ccbfcba0b07473885c43ecd76cb29a8db17d6137a19d9f9cd443a2a7c5fd8a3f24d58ad8145f9eb49116344a66b107e1aeab82cf2383f4753 +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 86a7f542af277cfbd77dd61e7df8422f90bac512953709003a1c530171a9d019d072e2400eab2b59f84b49ab9dd237be44315ca663ac73e82b3922d10ea5eafa languageName: node linkType: hard @@ -5186,6 +4065,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^2.0.0": + version: 2.1.1 + resolution: "ansi-regex@npm:2.1.1" + checksum: 190abd03e4ff86794f338a31795d262c1dfe8c91f7e01d04f13f646f1dcb16c5800818f886047876f1272f065570ab86b24b99089f8b68a0e11ff19aed4ca8f1 + languageName: node + linkType: hard + "ansi-regex@npm:^4.1.0": version: 4.1.1 resolution: "ansi-regex@npm:4.1.1" @@ -5201,13 +4087,20 @@ __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.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 9b17ce2c6daecc75bcd5966b9ad672c23b184dc3ed9bf3c98a0702f0d2f736c15c10d461913568f2cf527a5e64291c7473358885dd493305c84a1cfed66ba94f + languageName: node + linkType: hard + +"ansi-styles@npm:^2.2.1": + version: 2.2.1 + resolution: "ansi-styles@npm:2.2.1" + checksum: ebc0e00381f2a29000d1dac8466a640ce11943cef3bda3cd0020dc042e31e1058ab59bf6169cd794a54c3a7338a61ebc404b7c91e004092dd20e028c432c9c2c languageName: node linkType: hard -"ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": +"ansi-styles@npm:^3.2.0": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" dependencies: @@ -5233,9 +4126,9 @@ __metadata: linkType: hard "ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: f1b0829cf048cce870a305819f65ce2adcebc097b6d6479e12e955fd6225df9b9eb8b497083b764df796d94383ff20016cc4dbbae5b40f36138fb65a9d33c2e2 languageName: node linkType: hard @@ -5273,22 +4166,22 @@ __metadata: linkType: hard "arktype@npm:^2.1.15": - version: 2.1.19 - resolution: "arktype@npm:2.1.19" + version: 2.1.22 + resolution: "arktype@npm:2.1.22" dependencies: - "@ark/schema": 0.45.9 - "@ark/util": 0.45.9 - checksum: cf656f9aa3797d56572d49a8499a4156fbbe25eacbd075f4c60770876fd1fbde6b6285f1b367de93e14858651f6a1df1db3de99d6a5f642e1fa61f421fae0712 + "@ark/schema": 0.49.0 + "@ark/util": 0.49.0 + checksum: 46947539b550912f709908bcb973114607a8d61124f7f4ea1090bcaab85ca5c49d68afd6928bf05ce80fe403b6906e7d31d58ed346b408bb8519b9ffdf08e0cb languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: - call-bind: ^1.0.5 - is-array-buffer: ^3.0.4 - checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e + call-bound: ^1.0.3 + is-array-buffer: ^3.0.5 + checksum: 0ae3786195c3211b423e5be8dd93357870e6fb66357d81da968c2c39ef43583ef6eece1f9cb1caccdae4806739c65dea832b44b8593414313cd76a89795fca63 languageName: node linkType: hard @@ -5300,16 +4193,18 @@ __metadata: linkType: hard "array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": - version: 3.1.8 - resolution: "array-includes@npm:3.1.8" + version: 3.1.9 + resolution: "array-includes@npm:3.1.9" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 define-properties: ^1.2.1 - es-abstract: ^1.23.2 - es-object-atoms: ^1.0.0 - get-intrinsic: ^1.2.4 - is-string: ^1.0.7 - checksum: eb39ba5530f64e4d8acab39297c11c1c5be2a4ea188ab2b34aba5fb7224d918f77717a9d57a3e2900caaa8440e59431bdaf5c974d5212ef65d97f132e38e2d91 + es-abstract: ^1.24.0 + es-object-atoms: ^1.1.1 + get-intrinsic: ^1.3.0 + is-string: ^1.1.1 + math-intrinsics: ^1.1.0 + checksum: b58dc526fe415252e50319eaf88336e06e75aa673e3b58d252414739a4612dbe56e7b613fdcc7c90561dc9cf9202bbe5ca029ccd8c08362746459475ae5a8f3e languageName: node linkType: hard @@ -5335,26 +4230,26 @@ __metadata: linkType: hard "array.prototype.flat@npm:^1.3.1": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: 5d6b4bf102065fb3f43764bfff6feb3295d372ce89591e6005df3d0ce388527a9f03c909af6f2a973969a4d178ab232ffc9236654149173e0e187ec3a1a6b87b + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-shim-unscopables: ^1.0.2 + checksum: 5d5a7829ab2bb271a8d30a1c91e6271cef0ec534593c0fe6d2fb9ebf8bb62c1e5326e2fddcbbcbbe5872ca04f5e6b54a1ecf092e0af704fb538da9b2bfd95b40 languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flatmap@npm:1.3.2" +"array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: ce09fe21dc0bcd4f30271f8144083aa8c13d4639074d6c8dc82054b847c7fc9a0c97f857491f4da19d4003e507172a78f4bcd12903098adac8b9cd374f734be3 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-shim-unscopables: ^1.0.2 + checksum: 11b4de09b1cf008be6031bb507d997ad6f1892e57dc9153583de6ebca0f74ea403fffe0f203461d359de05048d609f3f480d9b46fed4099652d8b62cc972f284 languageName: node linkType: hard @@ -5371,19 +4266,18 @@ __metadata: languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.3": - version: 1.0.3 - resolution: "arraybuffer.prototype.slice@npm:1.0.3" +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" dependencies: array-buffer-byte-length: ^1.0.1 - call-bind: ^1.0.5 + call-bind: ^1.0.8 define-properties: ^1.2.1 - es-abstract: ^1.22.3 - es-errors: ^1.2.1 - get-intrinsic: ^1.2.3 + es-abstract: ^1.23.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 is-array-buffer: ^3.0.4 - is-shared-array-buffer: ^1.0.2 - checksum: 352259cba534dcdd969c92ab002efd2ba5025b2e3b9bead3973150edbdf0696c629d7f4b3f061c5931511e8207bdc2306da614703c820b45dabce39e3daf7e3e + checksum: b1d1fd20be4e972a3779b1569226f6740170dca10f07aa4421d42cefeec61391e79c557cda8e771f5baefe47d878178cd4438f60916ce831813c08132bced765 languageName: node linkType: hard @@ -5417,6 +4311,20 @@ __metadata: languageName: node linkType: hard +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 9102e246d1ed9b37ac36f57f0a6ca55226876553251a31fc80677e71471f463a54c872dc78d5d7f80740c8ba624395cccbe8b60f7b690c4418f487d8e9fd1106 + 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" @@ -5507,51 +4415,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.11 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" +"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.2 + "@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: f098353ce7c7dde1a1d2710858e01b471e85689110c9e37813e009072347eb8c55d5f84d20d3bf1cab31755f20078ba90f8855fdc4686a9daa826a95ff280bd7 + checksum: d654334c1b4390d08282416144b7b6f3d74d2cab44b2bfa2b6405c828882c82907b8b67698dce1be046c218d2d4fe5bf7fb6d01879938f3129dad969e8cfc44d languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.10.6": - version: 0.10.6 - resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" - dependencies: - "@babel/helper-define-polyfill-provider": ^0.6.2 - core-js-compat: ^3.38.0 - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: f762f29f7acca576897c63149c850f0a72babd3fb9ea436a2e36f0c339161c4b912a77828541d8188ce8a91e50965c6687120cf36071eabb1b7aa92f279e2164 - 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.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" +"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.2 + "@babel/helper-define-polyfill-provider": ^0.6.5 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f + checksum: ed1932fa9a31e0752fd10ebf48ab9513a654987cab1182890839523cb898559d24ae0578fdc475d9f995390420e64eeaa4b0427045b56949dace3c725bc66dbb languageName: node linkType: hard @@ -5564,6 +4460,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:^0.28.0": + version: 0.28.1 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.28.1" + dependencies: + hermes-parser: 0.28.1 + checksum: 2cbc921e663463480ead9ccc8bb229a5196032367ba2b5ccb18a44faa3afa84b4dc493297749983b9a837a3d76b0b123664aecc06f9122618c3246f03e076a9d + languageName: node + linkType: hard + "babel-plugin-transform-flow-enums@npm:^0.0.2": version: 0.0.2 resolution: "babel-plugin-transform-flow-enums@npm:0.0.2" @@ -5574,8 +4479,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 @@ -5593,8 +4498,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 @@ -5624,6 +4529,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.8.9": + version: 2.8.14 + resolution: "baseline-browser-mapping@npm:2.8.14" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 422a3c25169ef6ffb89d2fab297f92c72496e0e87bcff6c7af3fbe917a9ee4ca3092ea8bd0ca128d915b2c1b2a0c7921edacdefb701e347d87158f2fa5b2bb1a + languageName: node + linkType: hard + "basic-ftp@npm:^5.0.2": version: 5.0.5 resolution: "basic-ftp@npm:5.0.5" @@ -5686,21 +4600,21 @@ __metadata: linkType: hard "brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" + version: 1.1.12 + resolution: "brace-expansion@npm:1.1.12" dependencies: balanced-match: ^1.0.0 concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + checksum: 12cb6d6310629e3048cadb003e1aca4d8c9bb5c67c3c321bafdd7e7a50155de081f78ea3e0ed92ecc75a9015e784f301efc8132383132f4f7904ad1ac529c562 languageName: node linkType: hard "brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" + version: 2.0.2 + resolution: "brace-expansion@npm:2.0.2" dependencies: balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + checksum: 01dff195e3646bc4b0d27b63d9bab84d2ebc06121ff5013ad6e5356daa5a9d6b60fa26cf73c74797f2dc3fbec112af13578d51f75228c1112b26c790a87b0488 languageName: node linkType: hard @@ -5713,45 +4627,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.20.4, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": - version: 4.24.0 - resolution: "browserslist@npm:4.24.0" - dependencies: - caniuse-lite: ^1.0.30001663 - electron-to-chromium: ^1.5.28 - node-releases: ^2.0.18 - update-browserslist-db: ^1.1.0 - bin: - browserslist: cli.js - checksum: de200d3eb8d6ed819dad99719099a28fb6ebeb88016a5ac42fbdc11607e910c236a84ca1b0bbf232477d4b88ab64e8ab6aa67557cdd40a73ca9c2834f92ccce0 - languageName: node - linkType: hard - -"browserslist@npm:^4.24.0": - version: 4.24.2 - resolution: "browserslist@npm:4.24.2" - dependencies: - caniuse-lite: ^1.0.30001669 - electron-to-chromium: ^1.5.41 - node-releases: ^2.0.18 - update-browserslist-db: ^1.1.1 - bin: - browserslist: cli.js - checksum: cf64085f12132d38638f38937a255edb82c7551b164a98577b055dd79719187a816112f7b97b9739e400c4954cd66479c0d7a843cb816e346f4795dc24fd5d97 - languageName: node - linkType: hard - -"browserslist@npm:^4.24.4": - version: 4.25.0 - resolution: "browserslist@npm:4.25.0" +"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.25.3": + version: 4.26.3 + resolution: "browserslist@npm:4.26.3" dependencies: - caniuse-lite: ^1.0.30001718 - electron-to-chromium: ^1.5.160 - node-releases: ^2.0.19 + 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: 0d34fa0c6e23e962598ba68ee9f4566a4b575ec550ff7e9e7287c5e94a6e0f208f75f4f7d578ccd060f843167e0e495bde8f6d278f353f0da783cd50f758e5c7 + checksum: aa5bbcda9db1eeb9952b4c2f11f9a5a2247da7bcce7fa14d3cc215e67246a93394eda2f86378a41c3f73e6e1a1561bf0e7eade93c5392cb6d37bc66f70d0c53f languageName: node linkType: hard @@ -5790,13 +4677,6 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.0.0": - version: 3.0.0 - resolution: "bytes@npm:3.0.0" - checksum: a2b386dd8188849a5325f58eef69c3b73c51801c08ffc6963eddc9be244089ba32d19347caf6d145c86f315ae1b1fc7061a32b0c1aa6379e6a719090287ed101 - languageName: node - linkType: hard - "bytes@npm:3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" @@ -5804,11 +4684,11 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" dependencies: - "@npmcli/fs": ^3.1.0 + "@npmcli/fs": ^4.0.0 fs-minipass: ^3.0.0 glob: ^10.2.2 lru-cache: ^10.0.1 @@ -5816,24 +4696,43 @@ __metadata: minipass-collect: ^2.0.1 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: b7422c113b4ec750f33beeca0f426a0024c28e3172f332218f48f963e5b970647fa1ac05679fe5bb448832c51efea9fda4456b9a95c3a1af1105fe6c1833cde2 + p-map: ^7.0.2 + ssri: ^12.0.0 + tar: ^7.4.3 + unique-filename: ^4.0.0 + checksum: e95684717de6881b4cdaa949fa7574e3171946421cd8291769dd3d2417dbf7abf4aa557d1f968cca83dcbc95bed2a281072b09abfc977c942413146ef7ed4525 languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: - es-define-property: ^1.0.0 es-errors: ^1.3.0 function-bind: ^1.1.2 + checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: ^1.0.0 + es-define-property: ^1.0.0 get-intrinsic: ^1.2.4 - set-function-length: ^1.2.1 - checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 + set-function-length: ^1.2.2 + checksum: aa2899bce917a5392fd73bd32e71799c37c0b7ab454e0ed13af7f6727549091182aade8bbb7b55f304a5bc436d543241c14090fb8a3137e9875e23f444f4f5a9 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: ^1.0.2 + get-intrinsic: ^1.3.0 + checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2 languageName: node linkType: hard @@ -5902,28 +4801,30 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001663, caniuse-lite@npm:^1.0.30001669, caniuse-lite@npm:^1.0.30001718": - version: 1.0.30001721 - resolution: "caniuse-lite@npm:1.0.30001721" - checksum: 1f1e1f5f070f97ee83a08601709413300957be624790a8f7b3aebd5746d648e8d50be4ef9572a50281198b2f7acc63fdfc1a0bc04c23bbffba0ab4b3c69d4b76 +"caniuse-lite@npm:^1.0.30001746": + version: 1.0.30001749 + resolution: "caniuse-lite@npm:1.0.30001749" + checksum: 0a2692a7d51e4f4cecd2e8714e1d3d9982479fb59fa2fc8d6a462844bb7f5243ffe0bc94b25a1ff944f63bb2372ff5f6d01ef422729ca3c262975f1b91d78c07 languageName: node linkType: hard -"chalk@npm:5.4.1, chalk@npm:^5.3.0": +"chalk@npm:5.4.1": version: 5.4.1 resolution: "chalk@npm:5.4.1" checksum: 0c656f30b782fed4d99198825c0860158901f449a6b12b818b0aabad27ec970389e7e8767d0e00762175b23620c812e70c4fd92c0210e55fc2d993638b74e86e languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" +"chalk@npm:^1.1.3": + version: 1.1.3 + resolution: "chalk@npm:1.1.3" dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + ansi-styles: ^2.2.1 + escape-string-regexp: ^1.0.2 + has-ansi: ^2.0.0 + strip-ansi: ^3.0.0 + supports-color: ^2.0.0 + checksum: 9d2ea6b98fc2b7878829eec223abcf404622db6c48396a9b9257f6d0ead2acf18231ae368d6a664a83f272b0679158da12e97b5229f794939e555cc574478acd languageName: node linkType: hard @@ -5937,6 +4838,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^5.3.0": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 4ee2d47a626d79ca27cb5299ecdcce840ef5755e287412536522344db0fc51ca0f6d6433202332c29e2288c6a90a2b31f3bd626bc8c14743b6b6ee28abd3b796 + languageName: node + linkType: hard + "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -5951,10 +4859,10 @@ __metadata: languageName: node linkType: hard -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: fd73a4bab48b79e66903fe1cafbdc208956f41ea4f856df883d0c7277b7ab29fd33ee65f93b2ec9192fc0169238f2f8307b7735d27c155821d886b84aa97aa8d languageName: node linkType: hard @@ -6001,16 +4909,16 @@ __metadata: linkType: hard "ci-info@npm:^4.1.0": - version: 4.3.0 - resolution: "ci-info@npm:4.3.0" - checksum: 77a851ec826e1fbcd993e0e3ef402e6a5e499c733c475af056b7808dea9c9ede53e560ed433020489a8efea2d824fd68ca203446c9988a0bac8475210b0d4491 + version: 4.3.1 + resolution: "ci-info@npm:4.3.1" + checksum: 66c159d92648e8a07acab0a3a0681bff6ccc39aa44916263208c4d97bbbeedbbc886d7611fd30c21df1aa624ce3c6fcdfde982e74689e3e014e064e1d0805f94 languageName: node linkType: hard "cjs-module-lexer@npm:^1.0.0": - version: 1.4.1 - resolution: "cjs-module-lexer@npm:1.4.1" - checksum: 2556807a99aec1f9daac60741af96cd613a707f343174ae7967da46402c91dced411bf830d209f2e93be4cecea46fc75cecf1f17c799d7d8a9e1dd6204bfcd22 + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 221a1661a9ff4944b472c85ac7cd5029b2f2dc7f6c5f4ecf887f261503611110b43a48acb6c07f8f04109c772d1637fdb20b31252bf27058f35aa97bf5ad8b12 languageName: node linkType: hard @@ -6222,6 +5130,13 @@ __metadata: languageName: node linkType: hard +"common-tags@npm:^1.8.2": + version: 1.8.2 + resolution: "common-tags@npm:1.8.2" + checksum: 767a6255a84bbc47df49a60ab583053bb29a7d9687066a18500a516188a062c4e4cd52de341f22de0b07062e699b1b8fe3cfa1cb55b241cb9301aeb4f45b4dff + languageName: node + linkType: hard + "compare-func@npm:^2.0.0": version: 2.0.0 resolution: "compare-func@npm:2.0.0" @@ -6232,7 +5147,7 @@ __metadata: languageName: node linkType: hard -"compressible@npm:~2.0.16": +"compressible@npm:~2.0.18": version: 2.0.18 resolution: "compressible@npm:2.0.18" dependencies: @@ -6242,17 +5157,17 @@ __metadata: linkType: hard "compression@npm:^1.7.1": - version: 1.7.4 - resolution: "compression@npm:1.7.4" + version: 1.8.1 + resolution: "compression@npm:1.8.1" dependencies: - accepts: ~1.3.5 - bytes: 3.0.0 - compressible: ~2.0.16 + bytes: 3.1.2 + compressible: ~2.0.18 debug: 2.6.9 - on-headers: ~1.0.2 - safe-buffer: 5.1.2 + negotiator: ~0.6.4 + on-headers: ~1.1.0 + safe-buffer: 5.2.1 vary: ~1.1.2 - checksum: 35c0f2eb1f28418978615dc1bc02075b34b1568f7f56c62d60f4214d4b7cc00d0f6d282b5f8a954f59872396bd770b6b15ffd8aa94c67d4bce9b8887b906999b + checksum: 906325935180cd3507d30ed898fb129deccab03689383d55536245a94610f5003923bb14c95ee6adc8d658ee13be549407eb4346ef55169045f3e41e9969808e languageName: node linkType: hard @@ -6286,14 +5201,14 @@ __metadata: linkType: hard "configstore@npm:^7.0.0": - version: 7.0.0 - resolution: "configstore@npm:7.0.0" + version: 7.1.0 + resolution: "configstore@npm:7.1.0" dependencies: atomically: ^2.0.3 dot-prop: ^9.0.0 graceful-fs: ^4.2.11 xdg-basedir: ^5.1.0 - checksum: 1f8f1ca51d10d5ef54a346e12dd82c81918d28144ff5f41af0a6eb65c394c0e3a37d0f91931516d8964efff8fd8802c6478d13a35a6c7924e7a6c83f11d19c16 + checksum: 0b5958a3e7a9eebddfea64564e49bb60d3948c9a6b4d160bddf00862316e16b4566fe1f23962cdd28cd5c05ee93776324667dfa6530d74fb92dd7e8c54719eae languageName: node linkType: hard @@ -6515,21 +5430,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.37.1, core-js-compat@npm:^3.38.0": - version: 3.38.1 - resolution: "core-js-compat@npm:3.38.1" - dependencies: - browserslist: ^4.23.3 - checksum: a0a5673bcd59f588f0cd0b59cdacd4712b82909738a87406d334dd412eb3d273ae72b275bdd8e8fef63fca9ef12b42ed651be139c7c44c8a1acb423c8906992e - languageName: node - linkType: hard - -"core-js-compat@npm:^3.40.0": - version: 3.42.0 - resolution: "core-js-compat@npm:3.42.0" +"core-js-compat@npm:^3.43.0": + version: 3.45.1 + resolution: "core-js-compat@npm:3.45.1" dependencies: - browserslist: ^4.24.4 - checksum: 4f0a7db9ed9a95c4edae0749fe9a4d4d4f8f51a53c7c3e06049887500e98763732e8afef9628d2145f875b6e262567e951a77e4d06273f9eac273f5241259fd3 + browserslist: ^4.25.3 + checksum: 817286f6b7deb90278fd1f46131664fda36b74983e2fc4859a36ae85ef9361868b307964eea0e364251763e415eab7589e9abe2a4ec4d1672c2870f03c52b1ac languageName: node linkType: hard @@ -6599,14 +5505,14 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: ^3.1.0 shebang-command: ^2.0.0 which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b languageName: node linkType: hard @@ -6631,43 +5537,43 @@ __metadata: languageName: node linkType: hard -"data-view-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-buffer@npm:1.0.1" +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" dependencies: - call-bind: ^1.0.6 + call-bound: ^1.0.3 es-errors: ^1.3.0 - is-data-view: ^1.0.1 - checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + is-data-view: ^1.0.2 + checksum: 1e1cd509c3037ac0f8ba320da3d1f8bf1a9f09b0be09394b5e40781b8cc15ff9834967ba7c9f843a425b34f9fe14ce44cf055af6662c44263424c1eb8d65659b languageName: node linkType: hard -"data-view-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-length@npm:1.0.1" +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" dependencies: - call-bind: ^1.0.7 + call-bound: ^1.0.3 es-errors: ^1.3.0 - is-data-view: ^1.0.1 - checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + is-data-view: ^1.0.2 + checksum: 3600c91ced1cfa935f19ef2abae11029e01738de8d229354d3b2a172bf0d7e4ed08ff8f53294b715569fdf72dfeaa96aa7652f479c0f60570878d88e7e8bddf6 languageName: node linkType: hard -"data-view-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "data-view-byte-offset@npm:1.0.0" +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" dependencies: - call-bind: ^1.0.6 + call-bound: ^1.0.2 es-errors: ^1.3.0 is-data-view: ^1.0.1 - checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + checksum: 8dd492cd51d19970876626b5b5169fbb67ca31ec1d1d3238ee6a71820ca8b80cafb141c485999db1ee1ef02f2cc3b99424c5eda8d59e852d9ebb79ab290eb5ee languageName: node 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 @@ -6680,27 +5586,15 @@ __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": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: ^2.1.3 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 - languageName: node - linkType: hard - -"debug@npm:^4.4.0": - version: 4.4.1 - resolution: "debug@npm:4.4.1" +"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.3 + resolution: "debug@npm:4.4.3" dependencies: ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: a43826a01cda685ee4cec00fb2d3322eaa90ccadbef60d9287debc2a886be3e835d9199c80070ede75a409ee57828c4c6cd80e4b154f2843f0dc95a570dc0729 + checksum: 4805abd570e601acdca85b6aa3757186084a45cff9b2fa6eee1f3b173caa776b45f478b2a71a572d616d2010cea9211d0ac4a02a610e4c18ac4324bde3760834 languageName: node linkType: hard @@ -6743,14 +5637,14 @@ __metadata: linkType: hard "dedent@npm:^1.0.0": - version: 1.5.3 - resolution: "dedent@npm:1.5.3" + version: 1.7.0 + resolution: "dedent@npm:1.7.0" peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - checksum: 045b595557b2a8ea2eb9b0b4623d764e9a87326486fe2b61191b4342ed93dc01245644d8a09f3108a50c0ee7965f1eedd92e4a3a503ed89ea8e810566ea27f9a + checksum: e07a21b7ae078f2c6502b46e6e9fb3f5592dc48ad8c6142d501d1a85ee04cd3add5d62260a9b20f87674a80edada2032918ca0718597752c5cb90b36ab5066ec languageName: node linkType: hard @@ -6819,7 +5713,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -6937,6 +5831,13 @@ __metadata: languageName: node linkType: hard +"dlv@npm:^1.1.3": + version: 1.1.3 + resolution: "dlv@npm:1.1.3" + checksum: d7381bca22ed11933a1ccf376db7a94bee2c57aa61e490f680124fa2d1cd27e94eba641d9f45be57caab4f9a6579de0983466f620a2cd6230d7ec93312105ae7 + languageName: node + linkType: hard + "doctrine@npm:^2.1.0": version: 2.1.0 resolution: "doctrine@npm:2.1.0" @@ -6974,9 +5875,20 @@ __metadata: linkType: hard "dotenv@npm:^16.4.5": - version: 16.4.5 - resolution: "dotenv@npm:16.4.5" - checksum: 301a12c3d44fd49888b74eb9ccf9f07a1f5df43f489e7fcb89647a2edcd84c42d6bc349dc8df099cd18f07c35c7b04685c1a4f3e6a6a9e6b30f8d48c15b7f49c + version: 16.6.1 + resolution: "dotenv@npm:16.6.1" + checksum: e8bd63c9a37f57934f7938a9cf35de698097fadf980cb6edb61d33b3e424ceccfe4d10f37130b904a973b9038627c2646a3365a904b4406514ea94d7f1816b69 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: ^1.0.1 + es-errors: ^1.3.0 + gopd: ^1.2.0 + checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 languageName: node linkType: hard @@ -6994,24 +5906,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.160": - version: 1.5.165 - resolution: "electron-to-chromium@npm:1.5.165" - checksum: 49725e9c02fcc2b1a89aa2624603d151b1da1ac7a9c017d9ab91f894f463466fea210785b46dea184bbaf3871893b2dac8e062fe05b94348d8e2853e91737e63 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.28": - version: 1.5.30 - resolution: "electron-to-chromium@npm:1.5.30" - checksum: b1a9003d32b7ef2075580941e868e1ba9a5b57e8e8e6b7a26462dea830c194d26906a00c92366b41e09bb794ff37ae73865b5c25cbe1f96ae931fc3faf6ded64 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.41": - version: 1.5.42 - resolution: "electron-to-chromium@npm:1.5.42" - checksum: 8527f6e050b7f869d0135869587b3273fefa1cc2cbb9799bff552e10586b61860139758ee9824c803cdce632e24d4897bb7f67dcecf1c2bef279977fdfa9afa1 +"electron-to-chromium@npm:^1.5.227": + version: 1.5.233 + resolution: "electron-to-chromium@npm:1.5.233" + checksum: 84c36a12b6099ef2584cee8e181f01e8efc4d1d81f1e5802c8beaae18d50ca03e9706267f6b93f3b95716ed084b5b628dfe340accf0d8b1670f714a90bccc4c0 languageName: node linkType: hard @@ -7023,9 +5921,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 @@ -7067,11 +5965,11 @@ __metadata: linkType: hard "end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" dependencies: once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + checksum: 1e0cfa6e7f49887544e03314f9dfc56a8cb6dde910cbb445983ecc2ff426fc05946df9d75d8a21a3a64f2cecfe1bf88f773952029f46756b2ed64a24e95b1fb8 languageName: node linkType: hard @@ -7090,11 +5988,11 @@ __metadata: linkType: hard "envinfo@npm:^7.13.0": - version: 7.14.0 - resolution: "envinfo@npm:7.14.0" + version: 7.17.0 + resolution: "envinfo@npm:7.17.0" bin: envinfo: dist/cli.js - checksum: 137c1dd9a4d5781c4a6cdc6b695454ba3c4ba1829f73927198aa4122f11b35b59d7b2cb7e1ceea1364925a30278897548511d22f860c14253a33797d0bebd551 + checksum: d09e6d2d5dea999f9b5e1a8c496337b5e470f843c046843603e28132a7f391eef18589735c5bc8cc529a3cd8848bd1d4750fe8851f5de7b9d0d6b1d2f415adf9 languageName: node linkType: hard @@ -7106,11 +6004,11 @@ __metadata: linkType: hard "error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" dependencies: is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + checksum: 25136c0984569c8d68417036a9a1624804314296f24675199a391e5d20b2e26fe6d9304d40901293fa86900603a229983c9a8921ea7f1d16f814c2db946ff4ef languageName: node linkType: hard @@ -7133,135 +6031,144 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0": + version: 1.24.0 + resolution: "es-abstract@npm:1.24.0" dependencies: - array-buffer-byte-length: ^1.0.1 - arraybuffer.prototype.slice: ^1.0.3 + array-buffer-byte-length: ^1.0.2 + arraybuffer.prototype.slice: ^1.0.4 available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 - data-view-buffer: ^1.0.1 - data-view-byte-length: ^1.0.1 - data-view-byte-offset: ^1.0.0 - es-define-property: ^1.0.0 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + data-view-buffer: ^1.0.2 + data-view-byte-length: ^1.0.2 + data-view-byte-offset: ^1.0.1 + es-define-property: ^1.0.1 es-errors: ^1.3.0 - es-object-atoms: ^1.0.0 - es-set-tostringtag: ^2.0.3 - es-to-primitive: ^1.2.1 - function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.4 - get-symbol-description: ^1.0.2 - globalthis: ^1.0.3 - gopd: ^1.0.1 + es-object-atoms: ^1.1.1 + es-set-tostringtag: ^2.1.0 + es-to-primitive: ^1.3.0 + function.prototype.name: ^1.1.8 + get-intrinsic: ^1.3.0 + get-proto: ^1.0.1 + get-symbol-description: ^1.1.0 + globalthis: ^1.0.4 + gopd: ^1.2.0 has-property-descriptors: ^1.0.2 - has-proto: ^1.0.3 - has-symbols: ^1.0.3 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 hasown: ^2.0.2 - internal-slot: ^1.0.7 - is-array-buffer: ^3.0.4 + internal-slot: ^1.1.0 + is-array-buffer: ^3.0.5 is-callable: ^1.2.7 - is-data-view: ^1.0.1 + is-data-view: ^1.0.2 is-negative-zero: ^2.0.3 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.3 - is-string: ^1.0.7 - is-typed-array: ^1.1.13 - is-weakref: ^1.0.2 - object-inspect: ^1.13.1 + is-regex: ^1.2.1 + is-set: ^2.0.3 + is-shared-array-buffer: ^1.0.4 + is-string: ^1.1.1 + is-typed-array: ^1.1.15 + is-weakref: ^1.1.1 + math-intrinsics: ^1.1.0 + object-inspect: ^1.13.4 object-keys: ^1.1.1 - object.assign: ^4.1.5 - regexp.prototype.flags: ^1.5.2 - safe-array-concat: ^1.1.2 - safe-regex-test: ^1.0.3 - string.prototype.trim: ^1.2.9 - string.prototype.trimend: ^1.0.8 + object.assign: ^4.1.7 + own-keys: ^1.0.1 + regexp.prototype.flags: ^1.5.4 + safe-array-concat: ^1.1.3 + safe-push-apply: ^1.0.0 + safe-regex-test: ^1.1.0 + set-proto: ^1.0.0 + stop-iteration-iterator: ^1.1.0 + string.prototype.trim: ^1.2.10 + string.prototype.trimend: ^1.0.9 string.prototype.trimstart: ^1.0.8 - typed-array-buffer: ^1.0.2 - typed-array-byte-length: ^1.0.1 - typed-array-byte-offset: ^1.0.2 - typed-array-length: ^1.0.6 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.15 - checksum: f840cf161224252512f9527306b57117192696571e07920f777cb893454e32999206198b4f075516112af6459daca282826d1735c450528470356d09eff3a9ae + typed-array-buffer: ^1.0.3 + typed-array-byte-length: ^1.0.3 + typed-array-byte-offset: ^1.0.4 + typed-array-length: ^1.0.7 + unbox-primitive: ^1.1.0 + which-typed-array: ^1.1.19 + checksum: 06b3d605e56e3da9d16d4db2629a42dac1ca31f2961a41d15c860422a266115e865b43e82d6b9da81a0fabbbb65ebc12fb68b0b755bc9dbddacb6bf7450e96df languageName: node linkType: hard -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: ^1.2.4 - checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a languageName: node linkType: hard -"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.19": - version: 1.0.19 - resolution: "es-iterator-helpers@npm:1.0.19" +"es-iterator-helpers@npm:^1.2.1": + version: 1.2.1 + resolution: "es-iterator-helpers@npm:1.2.1" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 - es-abstract: ^1.23.3 + es-abstract: ^1.23.6 es-errors: ^1.3.0 es-set-tostringtag: ^2.0.3 function-bind: ^1.1.2 - get-intrinsic: ^1.2.4 - globalthis: ^1.0.3 + get-intrinsic: ^1.2.6 + globalthis: ^1.0.4 + gopd: ^1.2.0 has-property-descriptors: ^1.0.2 - has-proto: ^1.0.3 - has-symbols: ^1.0.3 - internal-slot: ^1.0.7 - iterator.prototype: ^1.1.2 - safe-array-concat: ^1.1.2 - checksum: 7ae112b88359fbaf4b9d7d1d1358ae57c5138768c57ba3a8fb930393662653b0512bfd7917c15890d1471577fb012fee8b73b4465e59b331739e6ee94f961683 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 + internal-slot: ^1.1.0 + iterator.prototype: ^1.1.4 + safe-array-concat: ^1.1.3 + checksum: 952808dd1df3643d67ec7adf20c30b36e5eecadfbf36354e6f39ed3266c8e0acf3446ce9bc465e38723d613cb1d915c1c07c140df65bdce85da012a6e7bda62b languageName: node linkType: hard -"es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: es-errors: ^1.3.0 - checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c + checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.3": - version: 2.0.3 - resolution: "es-set-tostringtag@npm:2.0.3" +"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" dependencies: - get-intrinsic: ^1.2.4 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 has-tostringtag: ^1.0.2 - hasown: ^2.0.1 - checksum: 7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 + hasown: ^2.0.2 + checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" +"es-shim-unscopables@npm:^1.0.2": + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" dependencies: - hasown: ^2.0.0 - checksum: 432bd527c62065da09ed1d37a3f8e623c423683285e6188108286f4a1e8e164a5bcbfbc0051557c7d14633cd2a41ce24c7048e6bbb66a985413fd32f1be72626 + hasown: ^2.0.2 + checksum: 33cfb1ebcb2f869f0bf528be1a8660b4fe8b6cec8fc641f330e508db2284b58ee2980fad6d0828882d22858c759c0806076427a3673b6daa60f753e3b558ee15 languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + is-callable: ^1.2.7 + is-date-object: ^1.0.5 + is-symbol: ^1.0.4 + checksum: 966965880356486cd4d1fe9a523deda2084c81b3702d951212c098f5f2ee93605d1b7c1840062efb48a07d892641c7ed1bc194db563645c0dd2b919cb6d65b93 languageName: node linkType: hard @@ -7286,14 +6193,14 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:5.0.0": +"escape-string-regexp@npm:5.0.0, escape-string-regexp@npm:^5.0.0": version: 5.0.0 resolution: "escape-string-regexp@npm:5.0.0" checksum: 20daabe197f3cb198ec28546deebcf24b3dbb1a5a269184381b3116d12f0532e06007f4bc8da25669d6a7f8efb68db0758df4cd981f57bc5b57f521a3e12c59e languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": +"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 @@ -7332,25 +6239,25 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:^8.5.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" +"eslint-config-prettier@npm:^10.1.8": + version: 10.1.8 + resolution: "eslint-config-prettier@npm:10.1.8" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 + checksum: 9140e19f78f0dbc888b160bb72b85f8043bada7b12a548faa56cea0ba74f8ef16653250ffd014d85d9a376a88c4941c96a3cdc9d39a07eb3def6967166635bd8 languageName: node linkType: hard -"eslint-config-prettier@npm:^9.0.0": - version: 9.1.0 - resolution: "eslint-config-prettier@npm:9.1.0" +"eslint-config-prettier@npm:^8.5.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: 9229b768c879f500ee54ca05925f31b0c0bafff3d9f5521f98ff05127356de78c81deb9365c86a5ec4efa990cb72b74df8612ae15965b14136044c73e1f6a907 + checksum: a92b7e8a996e65adf79de1579524235687e9d3552d088cfab4f170da60d23762addb4276169c8ca3a9551329dda8408c59f7e414101b238a6385379ac1bc3b16 languageName: node linkType: hard @@ -7398,8 +6305,8 @@ __metadata: linkType: hard "eslint-plugin-jest@npm:^28.9.0": - version: 28.9.0 - resolution: "eslint-plugin-jest@npm:28.9.0" + version: 28.14.0 + resolution: "eslint-plugin-jest@npm:28.14.0" dependencies: "@typescript-eslint/utils": ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependencies: @@ -7411,27 +6318,27 @@ __metadata: optional: true jest: optional: true - checksum: 90863fab5f3f2f033d98042b13769dc82504c489506872ae9926a1d2b6bcc25c5dc41105e28643f5eb81943aff1aa1cd4d44ada5c1add0a43f1c7a619adbc3d2 + checksum: 7daeb0ebc360ba159474246cef8ea7f0a3e020652571d948022af73bec7a53dd436b48de81332fd4d5d5556ef1046cec0e6a2213287a461e4e81390ce76ad2e7 languageName: node linkType: hard "eslint-plugin-prettier@npm:^5.0.1": - version: 5.2.1 - resolution: "eslint-plugin-prettier@npm:5.2.1" + version: 5.5.4 + resolution: "eslint-plugin-prettier@npm:5.5.4" dependencies: prettier-linter-helpers: ^1.0.0 - synckit: ^0.9.1 + synckit: ^0.11.7 peerDependencies: "@types/eslint": ">=8.0.0" eslint: ">=8.0.0" - eslint-config-prettier: "*" + eslint-config-prettier: ">= 7.0.0 <10.0.0 || >=10.1.0" prettier: ">=3.0.0" peerDependenciesMeta: "@types/eslint": optional: true eslint-config-prettier: optional: true - checksum: 812f4d1596dcd3a55963212dfbd818a4b38f880741aac75f6869aa740dc5d934060674d3b85d10ff9fec424defa61967dbdef26b8a893a92c9b51880264ed0d9 + checksum: 0dd05ed85018ab0e98da80325b7bd4c4ab6dd684398f1270a7c8cf4261df714dd4502ba4c7f85f651aade9989da0a7d2adda03af8873b73b52014141abf385de languageName: node linkType: hard @@ -7463,30 +6370,30 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.30.1": - version: 7.37.0 - resolution: "eslint-plugin-react@npm:7.37.0" + version: 7.37.5 + resolution: "eslint-plugin-react@npm:7.37.5" dependencies: array-includes: ^3.1.8 array.prototype.findlast: ^1.2.5 - array.prototype.flatmap: ^1.3.2 + array.prototype.flatmap: ^1.3.3 array.prototype.tosorted: ^1.1.4 doctrine: ^2.1.0 - es-iterator-helpers: ^1.0.19 + es-iterator-helpers: ^1.2.1 estraverse: ^5.3.0 hasown: ^2.0.2 jsx-ast-utils: ^2.4.1 || ^3.0.0 minimatch: ^3.1.2 - object.entries: ^1.1.8 + object.entries: ^1.1.9 object.fromentries: ^2.0.8 - object.values: ^1.2.0 + object.values: ^1.2.1 prop-types: ^15.8.1 resolve: ^2.0.0-next.5 semver: ^6.3.1 - string.prototype.matchall: ^4.0.11 + string.prototype.matchall: ^4.0.12 string.prototype.repeat: ^1.0.0 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - checksum: ece92e28b34ced0fd6bddebd41234ee53187b236fd507abef4f61cc868e27edd94fb7e290f44ff546037a6862c3302e848185a5e6511e2bcdf1883a1bfaa4ffc + checksum: 8675e7558e646e3c2fcb04bb60cfe416000b831ef0b363f0117838f5bfc799156113cb06058ad4d4b39fc730903b7360b05038da11093064ca37caf76b7cf2ca languageName: node linkType: hard @@ -7510,7 +6417,7 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": +"eslint-scope@npm:^7.1.1, eslint-scope@npm:^7.2.2": version: 7.2.2 resolution: "eslint-scope@npm:7.2.2" dependencies: @@ -7534,7 +6441,14 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.51.0": +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 3a77e3f99a49109f6fb2c5b7784bc78f9743b834d238cdba4d66c602c6b52f19ed7bcd0a5c5dbbeae3a8689fd785e76c001799f53d2228b278282cf9f699fff5 + languageName: node + linkType: hard + +"eslint@npm:^8.51.0, eslint@npm:^8.57.1": version: 8.57.1 resolution: "eslint@npm:8.57.1" dependencies: @@ -7582,7 +6496,7 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": +"espree@npm:^9.3.1, espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" dependencies: @@ -7603,7 +6517,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": +"esquery@npm:^1.4.0, esquery@npm:^1.4.2": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -7728,9 +6642,9 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 7e191e3dd6edd8c56c88f2c8037c98fbb8034fe48778be53ed8cb30ccef371a061a4e999a469aab939b92f8f12698f3b426d52f4f76b7a20da5f9f98c3cbc862 languageName: node linkType: hard @@ -7759,16 +6673,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2, fast-glob@npm:^3.3.3": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": ^2.0.2 "@nodelib/fs.walk": ^1.2.3 glob-parent: ^5.1.2 merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 + micromatch: ^4.0.8 + checksum: 0704d7b85c0305fd2cef37777337dfa26230fdd072dce9fb5c82a4b03156f3ffb8ed3e636033e65d45d2a5805a4e475825369a27404c0307f2db0c8eb3366fbd languageName: node linkType: hard @@ -7787,29 +6701,29 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.2 - resolution: "fast-uri@npm:3.0.2" - checksum: ca00aadc84e0ab93a8a1700c386bc7cbeb49f47d9801083c258444eed31221fdf864d68fb48ea8acd7c512bf046b53c09e3aafd6d4bdb9449ed21be29d8d6f75 + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: daab0efd3548cc53d0db38ecc764d125773f8bd70c34552ff21abdc6530f26fa4cb1771f944222ca5e61a0a1a85d01a104848ff88c61736de445d97bd616ea7e languageName: node linkType: hard "fast-xml-parser@npm:^4.4.1": - version: 4.5.0 - resolution: "fast-xml-parser@npm:4.5.0" + version: 4.5.3 + resolution: "fast-xml-parser@npm:4.5.3" dependencies: - strnum: ^1.0.5 + strnum: ^1.1.1 bin: fxparser: src/cli/cli.js - checksum: 696dc98da46f0f48eb26dfe1640a53043ea64f2420056374e62abbb5e620f092f8df3c3ff3195505a2eefab2057db3bf0ebaac63557f277934f6cce4e7da027c + checksum: cd6a184941ec6c23f9e6b514421a3f396cfdff5f4a8c7c27bd0eff896edb4a2b55c27da16f09b789663613dfc4933602b9b71ac3e9d1d2ddcc0492fc46c8fa52 languageName: node linkType: hard "fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" + version: 1.19.1 + resolution: "fastq@npm:1.19.1" dependencies: reusify: ^1.0.4 - checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 + checksum: 7691d1794fb84ad0ec2a185f10e00f0e1713b894e2c9c4d42f0bc0ba5f8c00e6e655a202074ca0b91b9c3d977aab7c30c41a8dc069fb5368576ac0054870a0e6 languageName: node linkType: hard @@ -7822,6 +6736,18 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: bd537daa9d3cd53887eed35efa0eab2dbb1ca408790e10e024120e7a36c6e9ae2b33710cb8381e35def01bc9c1d7eaba746f886338413e68ff6ebaee07b9a6e8 + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -7930,9 +6856,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 85ae7181650bb728c221e7644cbc9f4bf28bc556f2fc89bb21266962bdf0ce1029cc7acc44bb646cd469d9baac7c317f64e841c4c4c00516afa97320cdac7f94 + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe languageName: node linkType: hard @@ -7943,22 +6869,22 @@ __metadata: languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + is-callable: ^1.2.7 + checksum: 3c986d7e11f4381237cc98baa0a2f87eabe74719eee65ed7bed275163082b940ede19268c61d04c6260e0215983b12f8d885e3c8f9aa8c2113bf07c37051745c languageName: node linkType: hard "foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" dependencies: - cross-spawn: ^7.0.0 + cross-spawn: ^7.0.6 signal-exit: ^4.0.1 - checksum: 1989698488f725b05b26bc9afc8a08f08ec41807cd7b92ad85d96004ddf8243fd3e79486b8348c64a3011ae5cc2c9f0936af989e1f28339805d8bc178a75b451 + checksum: b2c1a6fc0bf0233d645d9fefdfa999abf37db1b33e5dab172b3cbfb0662b88bfbd2c9e7ab853533d199050ec6b65c03fcf078fc212d26e4990220e98c6930eef languageName: node linkType: hard @@ -7980,17 +6906,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.2.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 - languageName: node - linkType: hard - "fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" @@ -8002,15 +6917,6 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - "fs-minipass@npm:^3.0.0": version: 3.0.3 resolution: "fs-minipass@npm:3.0.3" @@ -8053,15 +6959,17 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 functions-have-names: ^1.2.3 - checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 + hasown: ^2.0.2 + is-callable: ^1.2.7 + checksum: 3a366535dc08b25f40a322efefa83b2da3cd0f6da41db7775f2339679120ef63b6c7e967266182609e655b8f0a8f65596ed21c7fd72ad8bd5621c2340edd4010 languageName: node linkType: hard @@ -8072,6 +6980,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" @@ -8087,22 +7002,30 @@ __metadata: 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 + version: 1.4.0 + resolution: "get-east-asian-width@npm:1.4.0" + checksum: 1d9a81a8004f4217ebef5d461875047d269e4b57e039558fd65130877cd4da8e3f61e1c4eada0c8b10e2816c7baf7d5fddb7006f561da13bc6f6dd19c1e964a4 languageName: node linkType: hard -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" +"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" 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 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - hasown: ^2.0.0 - checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 + 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 languageName: node linkType: hard @@ -8113,6 +7036,16 @@ __metadata: languageName: node linkType: hard +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: ^1.0.1 + es-object-atoms: ^1.0.0 + checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + "get-stream@npm:^5.0.0": version: 5.2.0 resolution: "get-stream@npm:5.2.0" @@ -8136,26 +7069,25 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.2": - version: 1.0.2 - resolution: "get-symbol-description@npm:1.0.2" +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" dependencies: - call-bind: ^1.0.5 + call-bound: ^1.0.3 es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 + get-intrinsic: ^1.2.6 + checksum: 655ed04db48ee65ef2ddbe096540d4405e79ba0a7f54225775fef43a7e2afcb93a77d141c5f05fdef0afce2eb93bcbfb3597142189d562ac167ff183582683cd languageName: node linkType: hard "get-uri@npm:^6.0.1": - version: 6.0.3 - resolution: "get-uri@npm:6.0.3" + 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 - fs-extra: ^11.2.0 - checksum: 3eda448a59fa1ba82ad4f252e58490fec586b644f2dc9c98ba3ab20e801ecc8a1bc1784829c474c9d188edb633d4dfd81c33894ca6117a33a16e8e013b41b40f + checksum: aef94dbecde44bc9cd23f5c1b6af5bf772a3d16612c0fc37d3a4056ffd202f2cdd329746d4fdc2124813ea6c8b1c5279f3749d27226a2b161df43dbcb70082e3 languageName: node linkType: hard @@ -8233,7 +7165,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.2.2": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -8297,13 +7229,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" @@ -8313,7 +7238,7 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.3": +"globalthis@npm:^1.0.4": version: 1.0.4 resolution: "globalthis@npm:1.0.4" dependencies: @@ -8364,12 +7289,10 @@ __metadata: languageName: node linkType: hard -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 languageName: node linkType: hard @@ -8419,17 +7342,19 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b +"has-ansi@npm:^2.0.0": + version: 2.0.0 + resolution: "has-ansi@npm:2.0.0" + dependencies: + ansi-regex: ^2.0.0 + checksum: 1b51daa0214440db171ff359d0a2d17bc20061164c57e76234f614c91dbd2a79ddd68dfc8ee73629366f7be45a6df5f2ea9de83f52e1ca24433f2cc78c35d8ec languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 79730518ae02c77e4af6a1d1a0b6a2c3e1509785532771f9baf0241e83e36329542c3d7a0e723df8cbc85f74eff4f177828a2265a01ba576adbdc2d40d86538b languageName: node linkType: hard @@ -8449,21 +7374,23 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: ^1.0.0 + checksum: f55010cb94caa56308041d77967c72a02ffd71386b23f9afa8447e58bc92d49d15c19bf75173713468e92fe3fb1680b03b115da39c21c32c74886d1d50d3e7ff languageName: node linkType: hard -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": +"has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -8472,7 +7399,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": +"hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -8502,6 +7429,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.29.1": + version: 0.29.1 + resolution: "hermes-estree@npm:0.29.1" + checksum: a72fe490d99ba2f56b3e22f3d050ca7757cc8dc9ebcb9d907104e46aaabdea9d32b445f73cca724a2537090fad3dde3cce0dc733bad6d7b3930c6bcde484d45c + languageName: node + linkType: hard + "hermes-parser@npm:0.23.1": version: 0.23.1 resolution: "hermes-parser@npm:0.23.1" @@ -8529,6 +7463,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.29.1": + version: 0.29.1 + resolution: "hermes-parser@npm:0.29.1" + dependencies: + hermes-estree: 0.29.1 + checksum: 3a7cd5cbdb191579f521dcb17edf199e24631314b9f69d043007e91762b53cd1f38eeb7688571f5be378b1c118e99af42040139e5f00e74a7cfd5c52c9d262e0 + languageName: node + linkType: hard + "hoist-non-react-statics@npm:^3.3.0": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -8571,9 +7514,9 @@ __metadata: linkType: hard "http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 7a7246ddfce629f96832791176fd643589d954e6f3b49548dadb4290451961237fab8fcea41cd2008fe819d95b41c1e8b97f47d088afc0a1c81705287b4ddbcc languageName: node linkType: hard @@ -8600,17 +7543,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" - dependencies: - agent-base: ^7.0.2 - debug: 4 - checksum: 2e1a28960f13b041a50702ee74f240add8e75146a5c37fc98f1960f0496710f6918b3a9fe1e5aba41e50f58e6df48d107edd9c405c5f0d73ac260dabf2210857 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.5, https-proxy-agent@npm:^7.0.6": +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5, https-proxy-agent@npm:^7.0.6": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -8673,14 +7606,21 @@ __metadata: languageName: node linkType: hard +"ignore@npm:^7.0.0": + version: 7.0.5 + resolution: "ignore@npm:7.0.5" + checksum: d0862bf64d3d58bf34d5fb0a9f725bec9ca5ce8cd1aecc8f28034269e8f69b8009ffd79ca3eda96962a6a444687781cd5efdb8c7c8ddc0a6996e36d31c217f14 + languageName: node + linkType: hard + "image-size@npm:^1.0.2": - version: 1.1.1 - resolution: "image-size@npm:1.1.1" + version: 1.2.1 + resolution: "image-size@npm:1.2.1" dependencies: queue: 6.0.2 bin: image-size: bin/image-size.js - checksum: 23b3a515dded89e7f967d52b885b430d6a5a903da954fce703130bfb6069d738d80e6588efd29acfaf5b6933424a56535aa7bf06867e4ebd0250c2ee51f19a4a + checksum: 8601ddd4edc1db16f097f5cf585c23214e29c3b8f4d8a8f8d59b8e3bae2338c8a5073236bfff421d8541091a98a38b802ed049203c745286a69d1aac4e5bc4c7 languageName: node linkType: hard @@ -8695,12 +7635,12 @@ __metadata: linkType: hard "import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: ^1.0.0 resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + checksum: a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 languageName: node linkType: hard @@ -8717,9 +7657,9 @@ __metadata: linkType: hard "import-meta-resolve@npm:^4.0.0": - version: 4.1.0 - resolution: "import-meta-resolve@npm:4.1.0" - checksum: 6497af27bf3ee384ad4efd4e0ec3facf9a114863f35a7b35f248659f32faa5e1ae07baa74d603069f35734ae3718a78b3f66926f98dc9a62e261e7df37854a62 + version: 4.2.0 + resolution: "import-meta-resolve@npm:4.2.0" + checksum: fe5ca3258f22dc3dd4e2f2e8f6b54324c1cf0261216c7d9aae801b2eadf664bbd61e26cfb907a1238761285a3e9c8c23403321d52ca0e579c341b8d90c97fa52 languageName: node linkType: hard @@ -8745,9 +7685,9 @@ __metadata: linkType: hard "index-to-position@npm:^1.1.0": - version: 1.1.0 - resolution: "index-to-position@npm:1.1.0" - checksum: 078b05777ba4ccc2af13328cbdef8ac945c885aed7c28bf55b17b7e7722507dfb3afbdeb30b59ff224374857147d16043da1bcb2a4dc533c7924d81873ef4363 + version: 1.2.0 + resolution: "index-to-position@npm:1.2.0" + checksum: 2026188af74d4f4c19de44ca29116f093daf072ff4f4b8dda61668463bd28b097164d43f819684cb2f65ff749bc0dec14fb3956da0299a36faa68255c4eb6858 languageName: node linkType: hard @@ -8802,14 +7742,14 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.7": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" dependencies: es-errors: ^1.3.0 - hasown: ^2.0.0 - side-channel: ^1.0.4 - checksum: cadc5eea5d7d9bc2342e93aae9f31f04c196afebb11bde97448327049f492cd7081e18623ae71388aac9cd237b692ca3a105be9c68ac39c1dec679d7409e33eb + hasown: ^2.0.2 + side-channel: ^1.1.0 + checksum: 8e0991c2d048cc08dab0a91f573c99f6a4215075887517ea4fa32203ce8aea60fa03f95b177977fa27eb502e5168366d0f3e02c762b799691411d49900611861 languageName: node linkType: hard @@ -8829,13 +7769,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 @@ -8849,13 +7786,14 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - checksum: e4e3e6ef0ff2239e75371d221f74bc3c26a03564a22efb39f6bb02609b598917ddeecef4e8c877df2a25888f247a98198959842a5e73236bc7f22cabdf6351a7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: f137a2a6e77af682cdbffef1e633c140cf596f72321baf8bba0f4ef22685eb4339dde23dfe9e9ca430b5f961dee4d46577dcf12b792b68518c8449b134fb9156 languageName: node linkType: hard @@ -8867,57 +7805,52 @@ __metadata: linkType: hard "is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f + version: 0.3.4 + resolution: "is-arrayish@npm:0.3.4" + checksum: 09816634eb7b6e357067f6b49c7656b4aff6d8b25486553d086bab53ce0f929c0293906539503b2a317f3137b5a5cd7e9ea01305f6090c0037c4340d9121420d languageName: node linkType: hard "is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: e3471d95e6c014bf37cad8a93f2f4b6aac962178e0a5041e8903147166964fdc1c5c1d2ef87e86d77322c370ca18f2ea004fa7420581fa747bcaf7c223069dbd + async-function: ^1.0.0 + call-bound: ^1.0.3 + get-proto: ^1.0.1 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: 9bece45133da26636488ca127d7686b85ad3ca18927e2850cff1937a650059e90be1c71a48623f8791646bb7a241b0cabf602a0b9252dcfa5ab273f2399000e6 languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + has-bigints: ^1.0.2 + checksum: ee1544f0e664f253306786ed1dce494b8cf242ef415d6375d8545b4d8816b0f054bd9f948a8988ae2c6325d1c28260dd02978236b2f7b8fb70dfc4838a6c9fa7 languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 0415b181e8f1bfd5d3f8a20f8108e64d372a72131674eea9c2923f39d065b6ad08d654765553bdbffbd92c3746f1007986c34087db1bd89a31f71be8359ccdaa languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": - version: 2.15.1 - resolution: "is-core-module@npm:2.15.1" - dependencies: - hasown: ^2.0.2 - checksum: df134c168115690724b62018c37b2f5bba0d5745fa16960b329c5a00883a8bea6a5632fdb1e3efcce237c201826ba09f93197b7cd95577ea56b0df335be23633 - languageName: node - linkType: hard - -"is-core-module@npm:^2.16.0": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.0, is-core-module@npm:^2.5.0": version: 2.16.1 resolution: "is-core-module@npm:2.16.1" dependencies: @@ -8926,21 +7859,24 @@ __metadata: languageName: node linkType: hard -"is-data-view@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-view@npm:1.0.1" +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" dependencies: + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 is-typed-array: ^1.1.13 - checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 + checksum: 31600dd19932eae7fd304567e465709ffbfa17fa236427c9c864148e1b54eb2146357fcf3aed9b686dee13c217e1bb5a649cb3b9c479e1004c0648e9febde1b2 languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + call-bound: ^1.0.2 + has-tostringtag: ^1.0.2 + checksum: d6c36ab9d20971d65f3fc64cef940d57a4900a2ac85fb488a46d164c2072a33da1cb51eefcc039e3e5c208acbce343d3480b84ab5ff0983f617512da2742562a languageName: node linkType: hard @@ -8976,12 +7912,12 @@ __metadata: languageName: node linkType: hard -"is-finalizationregistry@npm:^1.0.2": - version: 1.0.2 - resolution: "is-finalizationregistry@npm:1.0.2" +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" dependencies: - call-bind: ^1.0.2 - checksum: 4f243a8e06228cd45bdab8608d2cb7abfc20f6f0189c8ac21ea8d603f1f196eabd531ce0bb8e08cbab047e9845ef2c191a3761c9a17ad5cabf8b35499c4ad35d + call-bound: ^1.0.3 + checksum: 38c646c506e64ead41a36c182d91639833311970b6b6c6268634f109eef0a1a9d2f1f2e499ef4cb43c744a13443c4cdd2f0812d5afdcee5e9b65b72b28c48557 languageName: node linkType: hard @@ -9007,11 +7943,15 @@ __metadata: linkType: hard "is-generator-function@npm:^1.0.10": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" dependencies: - has-tostringtag: ^1.0.0 - checksum: d54644e7dbaccef15ceb1e5d91d680eb5068c9ee9f9eb0a9e04173eb5542c9b51b5ab52c5537f5703e48d5fddfd376817c1ca07a84a407b7115b769d4bdde72b + 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: 0b81c613752a5e534939e5b3835ff722446837a5b94c3a3934af5ded36a651d9aa31c3f11f8a3453884b9658bf26dbfb7eb855e744d920b07f084bd890a43414 languageName: node linkType: hard @@ -9088,13 +8028,6 @@ __metadata: languageName: node linkType: hard -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - "is-map@npm:^2.0.3": version: 2.0.3 resolution: "is-map@npm:2.0.3" @@ -9110,18 +8043,19 @@ __metadata: linkType: hard "is-npm@npm:^6.0.0": - version: 6.0.0 - resolution: "is-npm@npm:6.0.0" - checksum: fafe1ddc772345f5460514891bb8014376904ccdbddd59eee7525c9adcc08d426933f28b087bef3e17524da7ebf35c03ef484ff3b6ba9d5fecd8c6e6a7d4bf11 + version: 6.1.0 + resolution: "is-npm@npm:6.1.0" + checksum: 54779c55419da537da77f0f41a409516148d09f1c6db9063ee6598783b309abab109ce4f540ef68c45f4dc1fec8600ed251e393029da31691fa93ce18e72243a languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 6517f0a0e8c4b197a21afb45cd3053dc711e79d45d8878aa3565de38d0102b130ca8732485122c7b336e98c27dacd5236854e3e6526e0eb30cae64956535662f languageName: node linkType: hard @@ -9174,13 +8108,15 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + call-bound: ^1.0.2 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 99ee0b6d30ef1bb61fa4b22fae7056c6c9b3c693803c0c284ff7a8570f83075a7d38cda53b06b7996d441215c27895ea5d1af62124562e13d91b3dbec41a5e13 languageName: node linkType: hard @@ -9200,21 +8136,21 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: - call-bind: ^1.0.7 - checksum: a4fff602c309e64ccaa83b859255a43bb011145a42d3f56f67d9268b55bc7e6d98a5981a1d834186ad3105d6739d21547083fe7259c76c0468483fc538e716d8 + call-bound: ^1.0.3 + checksum: 1611fedc175796eebb88f4dfc393dd969a4a8e6c69cadaff424ee9d4464f9f026399a5f84a90f7c62d6d7ee04e3626a912149726de102b0bd6c1ee6a9868fa5a languageName: node linkType: hard "is-ssh@npm:^1.4.0": - version: 1.4.0 - resolution: "is-ssh@npm:1.4.0" + version: 1.4.1 + resolution: "is-ssh@npm:1.4.1" dependencies: protocols: ^2.0.1 - checksum: 75eaa17b538bee24b661fbeb0f140226ac77e904a6039f787bea418431e2162f1f9c4c4ccad3bd169e036cd701cc631406e8c505d9fa7e20164e74b47f86f40f + checksum: 005b461ac444398eb8b7cd2f489288e49dd18c8b6cbf1eb20767f9b79f330ab6e3308b2dac8ec6ca2a950d2a368912e0e992e2474bc1b5204693abb6226c1431 languageName: node linkType: hard @@ -9232,21 +8168,24 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 2eeaaff605250f5e836ea3500d33d1a5d3aa98d008641d9d42fb941e929ffd25972326c2ef912987e54c95b6f10416281aaf1b35cdf81992cfb7524c5de8e193 languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + call-bound: ^1.0.2 + has-symbols: ^1.1.0 + safe-regex-test: ^1.1.0 + checksum: bfafacf037af6f3c9d68820b74be4ae8a736a658a3344072df9642a090016e281797ba8edbeb1c83425879aae55d1cb1f30b38bf132d703692b2570367358032 languageName: node linkType: hard @@ -9259,12 +8198,12 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.13": - version: 1.1.13 - resolution: "is-typed-array@npm:1.1.13" +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" dependencies: - which-typed-array: ^1.1.14 - checksum: 150f9ada183a61554c91e1c4290086d2c100b0dff45f60b028519be72a8db964da403c48760723bf5253979b8dffe7b544246e0e5351dcd05c5fdb1dcc1dc0f0 + which-typed-array: ^1.1.16 + checksum: ea7cfc46c282f805d19a9ab2084fd4542fed99219ee9dbfbc26284728bd713a51eac66daa74eca00ae0a43b61322920ba334793607dc39907465913e921e0892 languageName: node linkType: hard @@ -9305,22 +8244,22 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + call-bound: ^1.0.3 + checksum: 1769b9aed5d435a3a989ffc18fc4ad1947d2acdaf530eb2bd6af844861b545047ea51102f75901f89043bed0267ed61d914ee21e6e8b9aa734ec201cdfc0726f languageName: node linkType: hard "is-weakset@npm:^2.0.3": - version: 2.0.3 - resolution: "is-weakset@npm:2.0.3" + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" dependencies: - call-bind: ^1.0.7 - get-intrinsic: ^1.2.4 - checksum: 8b6a20ee9f844613ff8f10962cfee49d981d584525f2357fee0a04dfbcde9fd607ed60cb6dab626dbcc470018ae6392e1ff74c0c1aced2d487271411ad9d85ae + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: 5c6c8415a06065d78bdd5e3a771483aa1cd928df19138aa73c4c51333226f203f22117b4325df55cc8b3085a6716870a320c2d757efee92d7a7091a039082041 languageName: node linkType: hard @@ -9453,25 +8392,26 @@ __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 -"iterator.prototype@npm:^1.1.2": - version: 1.1.2 - resolution: "iterator.prototype@npm:1.1.2" +"iterator.prototype@npm:^1.1.4": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" dependencies: - define-properties: ^1.2.1 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 - reflect.getprototypeof: ^1.0.4 - set-function-name: ^2.0.1 - checksum: d8a507e2ccdc2ce762e8a1d3f4438c5669160ac72b88b648e59a688eec6bc4e64b22338e74000518418d9e693faf2a092d2af21b9ec7dbf7763b037a54701168 + define-data-property: ^1.1.4 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.6 + get-proto: ^1.0.0 + has-symbols: ^1.1.0 + set-function-name: ^2.0.2 + checksum: 7db23c42629ba4790e6e15f78b555f41dbd08818c85af306988364bd19d86716a1187cb333444f3a0036bfc078a0e9cb7ec67fef3a61662736d16410d7f77869 languageName: node linkType: hard @@ -9952,11 +8892,11 @@ __metadata: linkType: hard "jiti@npm:^2.4.1": - version: 2.4.2 - resolution: "jiti@npm:2.4.2" + version: 2.6.1 + resolution: "jiti@npm:2.6.1" bin: jiti: lib/jiti-cli.mjs - checksum: c6c30c7b6b293e9f26addfb332b63d964a9f143cdd2cf5e946dbe5143db89f7c1b50ad9223b77fb1f6ddb0b9c5ecef995fea024ecf7d2861d285d779cde66e1e + checksum: 9394e29c5e40d1ca8267923160d8d86706173c9ff30c901097883434b0c4866de2c060427b6a9a5843bb3e42fa3a3c8b5b2228531d3dd4f4f10c5c6af355bb86 languageName: node linkType: hard @@ -10010,13 +8950,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" @@ -10024,30 +8957,12 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" - bin: - jsesc: bin/jsesc - checksum: a36d3ca40574a974d9c2063bf68c2b6141c20da8f2a36bd3279fc802563f35f0527a6c828801295bdfb2803952cf2cf387786c2c90ed564f88d5782475abfe3c - languageName: node - linkType: hard - -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" +"jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: b8b44cbfc92f198ad972fba706ee6a1dfa7485321ee8c0b25f5cedd538dcb20cde3197de16a7265430fce8277a12db066219369e3d51055038946039f6e20e17 + checksum: 19c94095ea026725540c0d29da33ab03144f6bcf2d4159e4833d534976e99e0c09c38cefa9a575279a51fc36b31166f8d6d05c9fe2645d5f15851d690b41f17f languageName: node linkType: hard @@ -10115,15 +9030,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 @@ -10177,9 +9092,9 @@ __metadata: linkType: hard "ky@npm:^1.2.0": - version: 1.8.1 - resolution: "ky@npm:1.8.1" - checksum: 802f3023ae1060b1d8c11376b9866fb5be82fa5174473d82c16a25d2905b3b41bc0121a134be87d8e3b40b24d56d34920a376e653785310803cbb8ea7cd43f85 + version: 1.11.0 + resolution: "ky@npm:1.11.0" + checksum: 2d7eded44f9f7a363b264d1ecd2c7ffd83e9868ef70ea1e4cee05d36560198080008dd02fcc631841d1e9df8b23f270a4188ac5c7c085388e3b321aba7ec13f3 languageName: node linkType: hard @@ -10193,12 +9108,12 @@ __metadata: linkType: hard "launch-editor@npm:^2.9.1": - version: 2.10.0 - resolution: "launch-editor@npm:2.10.0" + version: 2.11.1 + resolution: "launch-editor@npm:2.11.1" dependencies: - picocolors: ^1.0.0 - shell-quote: ^1.8.1 - checksum: 0cd219f98a8be1cedc73119c1a18ff232eb1386dcc0f4e710b21234e62bf55513342a3e0939cd67c3d920fc7d714457876bc782a5b17e03f59acbbafd23c5f50 + picocolors: ^1.1.1 + shell-quote: ^1.8.3 + checksum: 95a2e0a50ce15425a87fd035bdef2de37e13c2aee9cd62756783efb286a6e36a341cfcbaecb0d578131a5411c6a1c74c422f9c5b6cb6f4c8284d6078967e08b4 languageName: node linkType: hard @@ -10427,6 +9342,23 @@ __metadata: languageName: node linkType: hard +"loglevel-colored-level-prefix@npm:^1.0.0": + version: 1.0.0 + resolution: "loglevel-colored-level-prefix@npm:1.0.0" + dependencies: + chalk: ^1.1.3 + loglevel: ^1.4.1 + checksum: 146aa7d0ea900d6d8523e945b2265be240e4c7c4752dae678983764dd756c44194684af1ee8ea721feff4c4f8c5771544a02a6cd8b269a663cffe9b4fcf955f1 + languageName: node + linkType: hard + +"loglevel@npm:^1.4.1": + version: 1.9.2 + resolution: "loglevel@npm:1.9.2" + checksum: 896c67b90a507bfcfc1e9a4daa7bf789a441dd70d95cd13b998d6dd46233a3bfadfb8fadb07250432bbfb53bf61e95f2520f9b11f9d3175cc460e5c251eca0af + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -10493,23 +9425,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" dependencies: - "@npmcli/agent": ^2.0.0 - cacache: ^18.0.0 + "@npmcli/agent": ^3.0.0 + cacache: ^19.0.1 http-cache-semantics: ^4.1.1 - is-lambda: ^1.0.1 minipass: ^7.0.2 - minipass-fetch: ^3.0.0 + minipass-fetch: ^4.0.0 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - proc-log: ^4.2.0 + negotiator: ^1.0.0 + proc-log: ^5.0.0 promise-retry: ^2.0.1 - ssri: ^10.0.0 - checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd + ssri: ^12.0.0 + checksum: 6fb2fee6da3d98f1953b03d315826b5c5a4ea1f908481afc113782d8027e19f080c85ae998454de4e5f27a681d3ec58d57278f0868d4e0b736f51d396b661691 languageName: node linkType: hard @@ -10553,9 +9484,16 @@ __metadata: linkType: hard "marky@npm:^1.2.2": - version: 1.2.5 - resolution: "marky@npm:1.2.5" - checksum: 823b946677749551cdfc3b5221685478b5d1b9cc0dc03eff977c6f9a615fb05c67559f9556cb3c0fcb941a9ea0e195e37befd83026443396ccee8b724f54f4c5 + version: 1.3.0 + resolution: "marky@npm:1.3.0" + checksum: c25fe1d45525e317f89d116e87a50d385cc7e7d0d418548e75334273cb97990db37228c365718b5572077c80f22a599c732ccbd3da9728cd806465d63c786eda + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 languageName: node linkType: hard @@ -10640,15 +9578,15 @@ __metadata: languageName: node linkType: hard -"metro-babel-transformer@npm:0.82.4": - version: 0.82.4 - resolution: "metro-babel-transformer@npm:0.82.4" +"metro-babel-transformer@npm:0.82.5": + version: 0.82.5 + resolution: "metro-babel-transformer@npm:0.82.5" dependencies: "@babel/core": ^7.25.2 flow-enums-runtime: ^0.0.6 - hermes-parser: 0.28.1 + hermes-parser: 0.29.1 nullthrows: ^1.1.1 - checksum: 03587a3f3e84180eb560b5652ffa62b08e89a0ff9a3bd8292e39c4ccae7836ce5e2d156f9cb33b56b3a0e9ed51453b458db626df7eee1515c02cf9dfd1cb6457 + checksum: 3a3a8a9404c74290b5687290236e242f7b4edb3bc25cad6afe2424ddab8632a657b55ccbbd49dfa9b26078b5f3184f00930b8aa8b50d7c922247fd7d63ada395 languageName: node linkType: hard @@ -10661,12 +9599,12 @@ __metadata: languageName: node linkType: hard -"metro-cache-key@npm:0.82.4": - version: 0.82.4 - resolution: "metro-cache-key@npm:0.82.4" +"metro-cache-key@npm:0.82.5": + version: 0.82.5 + resolution: "metro-cache-key@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 - checksum: a6ab3908295b5ba346d4d991595cc8baf1d22be39fbd4bdf794b617868a003a4f9925d2d01fdbc4c616ff74196783cb4ea5f98dcb6a7c1b510e72e075d9f6b24 + checksum: d5dcd86249905c7adad0375111a4bef395a5021df251a463f840eb21bf7b34f4e581ae919a88fb612a63c48a5f379ce50f104a576bd71e052693d89ae6a0d9f0 languageName: node linkType: hard @@ -10681,15 +9619,15 @@ __metadata: languageName: node linkType: hard -"metro-cache@npm:0.82.4": - version: 0.82.4 - resolution: "metro-cache@npm:0.82.4" +"metro-cache@npm:0.82.5": + version: 0.82.5 + resolution: "metro-cache@npm:0.82.5" dependencies: exponential-backoff: ^3.1.1 flow-enums-runtime: ^0.0.6 https-proxy-agent: ^7.0.5 - metro-core: 0.82.4 - checksum: 8c6d9126872fc42de66bc8ebd8e827f7ed9da6c4f421db57e3efd7f43f1b44d664bcaea97c7d5b364e1391d5e0e4fc16581681f0b1c7f94db07c19569e2f80a5 + metro-core: 0.82.5 + checksum: d0d193845063b1e1241a770d928630c68418b6bff2a25d7d14e71b88e905c640b65817ac069abf807b6e7c6db5470b8c52fe6236b3850ae55ce68e910747eb63 languageName: node linkType: hard @@ -10709,19 +9647,19 @@ __metadata: languageName: node linkType: hard -"metro-config@npm:0.82.4, metro-config@npm:^0.82.0": - version: 0.82.4 - resolution: "metro-config@npm:0.82.4" +"metro-config@npm:0.82.5, metro-config@npm:^0.82.0": + version: 0.82.5 + resolution: "metro-config@npm:0.82.5" dependencies: connect: ^3.6.5 cosmiconfig: ^5.0.5 flow-enums-runtime: ^0.0.6 jest-validate: ^29.7.0 - metro: 0.82.4 - metro-cache: 0.82.4 - metro-core: 0.82.4 - metro-runtime: 0.82.4 - checksum: 05daf4477e5db1dfda26ce5631de23510f5d893f3486bb259e00a576ab4f16b613b3e1b97eee160cf64ef75aaf4b2560cb3cc840e6149b04aa00409b27f6cbfe + metro: 0.82.5 + metro-cache: 0.82.5 + metro-core: 0.82.5 + metro-runtime: 0.82.5 + checksum: 641c88d795394e551fffe238670ad09f3c8637b45da767ee95c5b401e11b65d5a4e86694fb68bd13fde1fc148d9c4f738439a0a427fe5325bd36aa19ea7a5fc9 languageName: node linkType: hard @@ -10736,14 +9674,14 @@ __metadata: languageName: node linkType: hard -"metro-core@npm:0.82.4, metro-core@npm:^0.82.0": - version: 0.82.4 - resolution: "metro-core@npm:0.82.4" +"metro-core@npm:0.82.5, metro-core@npm:^0.82.0": + version: 0.82.5 + resolution: "metro-core@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 lodash.throttle: ^4.1.1 - metro-resolver: 0.82.4 - checksum: bb17d2f1adcd32e6402000a0a27b3a1682b2cc1835cc29f1bae0136fd31b97b37c79f1def55bd60f3a2a85028d073c671c82e72a9b1eef1465f1dae5ce02d3c8 + metro-resolver: 0.82.5 + checksum: f6f0c91240ad4ff2ebd61e5cb23f433309fc82e8042e240da1347f8edf61cc6b893bd176cabecad0dc91d214dd315d501af21cb518459aeb0ed613881619b583 languageName: node linkType: hard @@ -10770,9 +9708,9 @@ __metadata: languageName: node linkType: hard -"metro-file-map@npm:0.82.4": - version: 0.82.4 - resolution: "metro-file-map@npm:0.82.4" +"metro-file-map@npm:0.82.5": + version: 0.82.5 + resolution: "metro-file-map@npm:0.82.5" dependencies: debug: ^4.4.0 fb-watchman: ^2.0.0 @@ -10783,7 +9721,7 @@ __metadata: micromatch: ^4.0.4 nullthrows: ^1.1.1 walker: ^1.0.7 - checksum: f5f24c5bcae7acbfbd2606707df35e1178e196c3e00d2a69bb8a4443942851989918e9f07e8301a7f8fb83d3fb17e9fd2320b9de322a2acfeb6f03f565c6bbf6 + checksum: 46bda99f0ae892071c1b48b09f884f017f48d564c30b2a1f858f6fae1c6c1848bbbce20f66a5be086d7e0acfec3d8c1ddbf69699aaf2829f10954ae39d8a27d7 languageName: node linkType: hard @@ -10797,13 +9735,13 @@ __metadata: languageName: node linkType: hard -"metro-minify-terser@npm:0.82.4": - version: 0.82.4 - resolution: "metro-minify-terser@npm:0.82.4" +"metro-minify-terser@npm:0.82.5": + version: 0.82.5 + resolution: "metro-minify-terser@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 terser: ^5.15.0 - checksum: 23170c34f519ebaa57189283f51847108395f53ebfcb798e2907bf28e3fce8649f80ff4d1b3f0ed2e321287b61ea84ff825923d8879d23d36f7a9bcbbb804294 + checksum: 754c150f0928460e1254e90e4e11bd87e069a0b286d21906758cb71fb8b4ec50dc8f78337bf8a9f8a28ddbd34230f5c66dad0fecf18dbe49715bf1300e5318c2 languageName: node linkType: hard @@ -10816,12 +9754,12 @@ __metadata: languageName: node linkType: hard -"metro-resolver@npm:0.82.4": - version: 0.82.4 - resolution: "metro-resolver@npm:0.82.4" +"metro-resolver@npm:0.82.5": + version: 0.82.5 + resolution: "metro-resolver@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 - checksum: d4833712d70516930e60cfd59fa7695eacb23eb064b89819903e27f53f1350ed4acfaa02011655f8aacc63f41d15b0781489db17a167994701596192054d791e + checksum: d1f7b57687c9cbb100114474689fee2fcfb86428a1228499b28391d16378573ac0f07c750874a2d75eabe237d67eb32a5c947bbbd70cd851885f1f6b13992472 languageName: node linkType: hard @@ -10835,13 +9773,13 @@ __metadata: languageName: node linkType: hard -"metro-runtime@npm:0.82.4, metro-runtime@npm:^0.82.0": - version: 0.82.4 - resolution: "metro-runtime@npm:0.82.4" +"metro-runtime@npm:0.82.5, metro-runtime@npm:^0.82.0": + version: 0.82.5 + resolution: "metro-runtime@npm:0.82.5" dependencies: "@babel/runtime": ^7.25.0 flow-enums-runtime: ^0.0.6 - checksum: a0fa5004db83c6e132f2228c6d91aa56a31d97406c252b27b8e1bdff8f2ff6e453290cc44c4f07b4f0e458fc01eb28c3b85b7d915f6caffb3cc4d2c10f38abd9 + checksum: 931c2b581ac1527899cfec6b9c4bbbac75545c78bf192abd8efddd4dbff481b052513857c8544507e7900e7c06f08a8da75e16c864cd86ec3a8c3d6c05738dae languageName: node linkType: hard @@ -10862,21 +9800,21 @@ __metadata: languageName: node linkType: hard -"metro-source-map@npm:0.82.4, metro-source-map@npm:^0.82.0": - version: 0.82.4 - resolution: "metro-source-map@npm:0.82.4" +"metro-source-map@npm:0.82.5, metro-source-map@npm:^0.82.0": + version: 0.82.5 + resolution: "metro-source-map@npm:0.82.5" dependencies: "@babel/traverse": ^7.25.3 "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3" "@babel/types": ^7.25.2 flow-enums-runtime: ^0.0.6 invariant: ^2.2.4 - metro-symbolicate: 0.82.4 + metro-symbolicate: 0.82.5 nullthrows: ^1.1.1 - ob1: 0.82.4 + ob1: 0.82.5 source-map: ^0.5.6 vlq: ^1.0.0 - checksum: 41a5efbf6eff61db338922b5651ed69ca0cb42786100dc794c273147c9af2698ee3f3d7d967232b7591e9b8875d416c12fe7e1f10bb9cf8cb46c9d6a13c10773 + checksum: 1bb53abe636524593207c578bfd0e15f47f4e15db919793a49b89359726d043cd69107244b6e1c2c8194983b8df7faa8b56ffa73a5f81c0fefc0cc1727907177 languageName: node linkType: hard @@ -10897,19 +9835,19 @@ __metadata: languageName: node linkType: hard -"metro-symbolicate@npm:0.82.4": - version: 0.82.4 - resolution: "metro-symbolicate@npm:0.82.4" +"metro-symbolicate@npm:0.82.5": + version: 0.82.5 + resolution: "metro-symbolicate@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 invariant: ^2.2.4 - metro-source-map: 0.82.4 + metro-source-map: 0.82.5 nullthrows: ^1.1.1 source-map: ^0.5.6 vlq: ^1.0.0 bin: metro-symbolicate: src/index.js - checksum: dbe92d7eea7d71ebbfd35cc901d3e428774d7a4747d10781a8f4350a6c341edd352f3b25939a7c3f174a07deffac019a92bab04f32fe8cb7e8c3a708eab11115 + checksum: ae91be09cca42567ea3c2bee695e0db42512fc8bf28cf2aa281ae8043edc3bbddcadd0793b401b6bcb7e0cc1df1428647662462a8f515ab6c47420421b1e96f8 languageName: node linkType: hard @@ -10927,9 +9865,9 @@ __metadata: languageName: node linkType: hard -"metro-transform-plugins@npm:0.82.4": - version: 0.82.4 - resolution: "metro-transform-plugins@npm:0.82.4" +"metro-transform-plugins@npm:0.82.5": + version: 0.82.5 + resolution: "metro-transform-plugins@npm:0.82.5" dependencies: "@babel/core": ^7.25.2 "@babel/generator": ^7.25.0 @@ -10937,7 +9875,7 @@ __metadata: "@babel/traverse": ^7.25.3 flow-enums-runtime: ^0.0.6 nullthrows: ^1.1.1 - checksum: b1a04093b41a8becd700ddae93278a87424f3c35b86bc0912eb5734948ea7f9d54c2440240277315cfabffc1dd9c4d4155c5286464546a97c5656981a97ce42d + checksum: 891838d529df2c3170614de9e55025d37fb799a8d444d9e898fc203496ec33620ad8066e0ab06244b7abb806ffdae4728b84047d0d01bceee877ea5d69240d04 languageName: node linkType: hard @@ -10962,24 +9900,24 @@ __metadata: languageName: node linkType: hard -"metro-transform-worker@npm:0.82.4": - version: 0.82.4 - resolution: "metro-transform-worker@npm:0.82.4" +"metro-transform-worker@npm:0.82.5": + version: 0.82.5 + resolution: "metro-transform-worker@npm:0.82.5" dependencies: "@babel/core": ^7.25.2 "@babel/generator": ^7.25.0 "@babel/parser": ^7.25.3 "@babel/types": ^7.25.2 flow-enums-runtime: ^0.0.6 - metro: 0.82.4 - metro-babel-transformer: 0.82.4 - metro-cache: 0.82.4 - metro-cache-key: 0.82.4 - metro-minify-terser: 0.82.4 - metro-source-map: 0.82.4 - metro-transform-plugins: 0.82.4 + metro: 0.82.5 + metro-babel-transformer: 0.82.5 + metro-cache: 0.82.5 + metro-cache-key: 0.82.5 + metro-minify-terser: 0.82.5 + metro-source-map: 0.82.5 + metro-transform-plugins: 0.82.5 nullthrows: ^1.1.1 - checksum: 5d17296ba1ca6ce939c4ffbd99d7372a6033ba6f6d2da42634509a9c121055440ae5c5eea8677d9201e06d71d811729b313c3f6b54f69cb87d05c5b9f92c6334 + checksum: 653868f5fc525ad5b36181e7d1b3bb893c49ce6647791c21b585dd29cccc2f00e68d66b16e00eeb385fcb0c5f205a713aba0fe57971b1ab2bf150938cb820aaa languageName: node linkType: hard @@ -11035,9 +9973,9 @@ __metadata: languageName: node linkType: hard -"metro@npm:0.82.4, metro@npm:^0.82.0": - version: 0.82.4 - resolution: "metro@npm:0.82.4" +"metro@npm:0.82.5, metro@npm:^0.82.0": + version: 0.82.5 + resolution: "metro@npm:0.82.5" dependencies: "@babel/code-frame": ^7.24.7 "@babel/core": ^7.25.2 @@ -11054,24 +9992,24 @@ __metadata: error-stack-parser: ^2.0.6 flow-enums-runtime: ^0.0.6 graceful-fs: ^4.2.4 - hermes-parser: 0.28.1 + hermes-parser: 0.29.1 image-size: ^1.0.2 invariant: ^2.2.4 jest-worker: ^29.7.0 jsc-safe-url: ^0.2.2 lodash.throttle: ^4.1.1 - metro-babel-transformer: 0.82.4 - metro-cache: 0.82.4 - metro-cache-key: 0.82.4 - metro-config: 0.82.4 - metro-core: 0.82.4 - metro-file-map: 0.82.4 - metro-resolver: 0.82.4 - metro-runtime: 0.82.4 - metro-source-map: 0.82.4 - metro-symbolicate: 0.82.4 - metro-transform-plugins: 0.82.4 - metro-transform-worker: 0.82.4 + metro-babel-transformer: 0.82.5 + metro-cache: 0.82.5 + metro-cache-key: 0.82.5 + metro-config: 0.82.5 + metro-core: 0.82.5 + metro-file-map: 0.82.5 + metro-resolver: 0.82.5 + metro-runtime: 0.82.5 + metro-source-map: 0.82.5 + metro-symbolicate: 0.82.5 + metro-transform-plugins: 0.82.5 + metro-transform-worker: 0.82.5 mime-types: ^2.1.27 nullthrows: ^1.1.1 serialize-error: ^2.1.0 @@ -11081,11 +10019,11 @@ __metadata: yargs: ^17.6.2 bin: metro: src/cli.js - checksum: cc155f963e393f0d1c6c2f5b094e9e2f3b1a0354d5bdf5bead5a5655ddbb2457fbd16fb101ba41bb0784b44970b7f72ba980229a24d2754598eabcefcccfb13f + checksum: 391411e1be9463f4d52e804f0a9680e59be1cfc5c76ca890f3a9e9c014561da65bbf6e3ccc44f7f52601add064b3b70862b3813c963384a0df2218a345a304e5 languageName: node linkType: hard -"micromatch@npm:^4.0.4": +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -11103,9 +10041,9 @@ __metadata: linkType: hard "mime-db@npm:>= 1.43.0 < 2": - version: 1.53.0 - resolution: "mime-db@npm:1.53.0" - checksum: 3fd9380bdc0b085d0b56b580e4f89ca4fc3b823722310d795c248f0806b9a80afd5d8f4347f015ad943b9ecfa7cc0b71dffa0db96fa776d01a13474821a2c7fb + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: e99aaf2f23f5bd607deb08c83faba5dd25cf2fec90a7cc5b92d8260867ee08dab65312e1a589e60093dc7796d41e5fae013268418482f1db4c7d52d0a0960ac9 languageName: node linkType: hard @@ -11157,13 +10095,22 @@ __metadata: languageName: node linkType: hard -"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": +"min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 languageName: node linkType: hard +"minimatch@npm:9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + 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" @@ -11227,18 +10174,18 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" +"minipass-fetch@npm:^4.0.0": + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" dependencies: encoding: ^0.1.13 minipass: ^7.0.3 minipass-sized: ^1.0.3 - minizlib: ^2.1.2 + minizlib: ^3.0.1 dependenciesMeta: encoding: optional: true - checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 + checksum: 3dfca705ce887ca9ff14d73e8d8593996dea1a1ecd8101fdbb9c10549d1f9670bc8fb66ad0192769ead4c2dc01b4f9ca1cf567ded365adff17827a303b948140 languageName: node linkType: hard @@ -11285,31 +10232,23 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 languageName: node linkType: hard -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + minipass: ^7.1.2 + checksum: a15e6f0128f514b7d41a1c68ce531155447f4669e32d279bba1c1c071ef6c2abd7e4d4579bb59ccc2ed1531346749665968fdd7be8d83eb6b6ae2fe1f3d370a7 languageName: node linkType: hard -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": +"mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -11339,15 +10278,6 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.1.23": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" - bin: - nanoid: bin/nanoid.cjs - checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 - languageName: node - linkType: hard - "nanoid@npm:^3.3.11": version: 3.3.11 resolution: "nanoid@npm:3.3.11" @@ -11364,13 +10294,27 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 20ebfe79b2d2e7cf9cbc8239a72662b584f71164096e6e8896c8325055497c96f6b80cd22c258e8a2f2aa382a787795ec3ee8b37b422a302c7d4381b0d5ecfbb + languageName: node + linkType: hard + +"negotiator@npm:~0.6.4": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 7ded10aa02a0707d1d12a9973fdb5954f98547ca7beb60e31cb3a403cc6e8f11138db7a3b0128425cf836fc85d145ec4ce983b2bdf83dca436af879c2d683510 + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -11409,22 +10353,22 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" + version: 11.4.2 + resolution: "node-gyp@npm:11.4.2" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 - glob: ^10.3.10 graceful-fs: ^4.2.6 - make-fetch-happen: ^13.0.0 - nopt: ^7.0.0 - proc-log: ^4.1.0 + make-fetch-happen: ^14.0.3 + nopt: ^8.0.0 + proc-log: ^5.0.0 semver: ^7.3.5 - tar: ^6.2.1 - which: ^4.0.0 + tar: ^7.4.3 + tinyglobby: ^0.2.12 + which: ^5.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 0233759d8c19765f7fdc259a35eb046ad86c3d09e22f7384613ae2b89647dd27fcf833fdf5293d9335041e91f9b1c539494225959cdb312a5c8080b7534b926f + checksum: d8041cee7ec60c86fb2961d77c12a2d083a481fb28b08e6d9583153186c0e7766044dc30bdb1f3ac01ddc5763b83caeed3d1ea35787ec4ffd8cc4aeedfc34f2b languageName: node linkType: hard @@ -11435,17 +10379,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3 - languageName: node - linkType: hard - -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 917dbced519f48c6289a44830a0ca6dc944c3ee9243c468ebd8515a41c97c8b2c256edb7f3f750416bc37952cc9608684e6483c7b6c6f39f6bd8d86c52cfe658 +"node-releases@npm:^2.0.21": + version: 2.0.23 + resolution: "node-releases@npm:2.0.23" + checksum: dc3194ffdf04975f8525a5e175c03f5a95cecd7607b6b0e80d28aaa03900706d920722b5f2ae2e8e28e029e6ae75f0d0f7eae87e8ee2a363c704785e3118f13d languageName: node linkType: hard @@ -11456,14 +10393,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" dependencies: - abbrev: ^2.0.0 + abbrev: ^3.0.0 bin: nopt: bin/nopt.js - checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 + checksum: 49cfd3eb6f565e292bf61f2ff1373a457238804d5a5a63a8d786c923007498cba89f3648e3b952bc10203e3e7285752abf5b14eaf012edb821e84f24e881a92a languageName: node linkType: hard @@ -11531,12 +10468,12 @@ __metadata: languageName: node linkType: hard -"ob1@npm:0.82.4": - version: 0.82.4 - resolution: "ob1@npm:0.82.4" +"ob1@npm:0.82.5": + version: 0.82.5 + resolution: "ob1@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 - checksum: 8385f5a20195c5c6e61bd18528a10baebe2287dd67fcf5721efeffe89dc61c7ab2b6c56ae9c6649687dda80a20663c33c18e4fc5cc651fd53e6befed3b9d9cf1 + checksum: 3faa161e5b5307188b6bbbf7e21727b1e434b8f6c31c51386808b2efd5e7238cf85a7ce71416d9a3f073625afb5a2212f80ec267996dc88fe086944adbb525d9 languageName: node linkType: hard @@ -11547,10 +10484,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 9f850b3c045db60e0e97746e809ee4090d6ce62195af17dd1e9438ac761394a7d8ec4f7906559aea5424eaf61e35d3e53feded2ccd5f62fcc7d9670d3c8eb353 +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 582810c6a8d2ef988ea0a39e69e115a138dad8f42dd445383b394877e5816eb4268489f316a6f74ee9c4e0a984b3eab1028e3e79d62b1ed67c726661d55c7a8b languageName: node linkType: hard @@ -11561,26 +10498,29 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - call-bind: ^1.0.5 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 - has-symbols: ^1.0.3 + es-object-atoms: ^1.0.0 + has-symbols: ^1.1.0 object-keys: ^1.1.1 - checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 + checksum: 60e07d2651cf4f5528c485f1aa4dbded9b384c47d80e8187cefd11320abb1aebebf78df5483451dfa549059f8281c21f7b4bf7d19e9e5e97d8d617df0df298de languageName: node linkType: hard -"object.entries@npm:^1.1.8": - version: 1.1.8 - resolution: "object.entries@npm:1.1.8" +"object.entries@npm:^1.1.9": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 define-properties: ^1.2.1 - es-object-atoms: ^1.0.0 - checksum: 5314877cb637ef3437a30bba61d9bacdb3ce74bf73ac101518be0633c37840c8cc67407edb341f766e8093b3d7516d5c3358f25adfee4a2c697c0ec4c8491907 + es-object-atoms: ^1.1.1 + checksum: 0ab2ef331c4d6a53ff600a5d69182948d453107c3a1f7fd91bc29d387538c2aba21d04949a74f57c21907208b1f6fb175567fd1f39f1a7a4046ba1bca762fb41 languageName: node linkType: hard @@ -11596,14 +10536,15 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6, object.values@npm:^1.2.0": - version: 1.2.0 - resolution: "object.values@npm:1.2.0" +"object.values@npm:^1.1.6, object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 es-object-atoms: ^1.0.0 - checksum: 51fef456c2a544275cb1766897f34ded968b22adfc13ba13b5e4815fdaf4304a90d42a3aee114b1f1ede048a4890381d47a5594d84296f2767c6a0364b9da8fa + checksum: f9b9a2a125ccf8ded29414d7c056ae0d187b833ee74919821fc60d7e216626db220d9cb3cf33f965c84aaaa96133626ca13b80f3c158b673976dc8cfcfcd26bb languageName: node linkType: hard @@ -11625,10 +10566,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 @@ -11764,6 +10705,17 @@ __metadata: languageName: node linkType: hard +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: ^1.2.6 + object-keys: ^1.1.1 + safe-push-apply: ^1.0.0 + checksum: cc9dd7d85c4ccfbe8109fce307d581ac7ede7b26de892b537873fbce2dc6a206d89aea0630dbb98e47ce0873517cefeaa7be15fcf94aaf4764a3b34b474a5b61 + languageName: node + linkType: hard + "p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -11845,6 +10797,13 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 8c92d533acf82f0d12f7e196edccff773f384098bbb048acdd55a08778ce4fc8889d8f1bde72969487bd96f9c63212698d79744c20bedfce36c5b00b46d369f8 + languageName: node + linkType: hard + "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -11940,11 +10899,11 @@ __metadata: linkType: hard "parse-path@npm:^7.0.0": - version: 7.0.0 - resolution: "parse-path@npm:7.0.0" + version: 7.1.0 + resolution: "parse-path@npm:7.1.0" dependencies: protocols: ^2.0.0 - checksum: 244b46523a58181d251dda9b888efde35d8afb957436598d948852f416d8c76ddb4f2010f9fc94218b4be3e5c0f716aa0d2026194a781e3b8981924142009302 + checksum: 1da6535a967b14911837bba98e5f8d16acb415b28753ff6225e3121dce71167a96c79278fbb631d695210dadae37462a9eff40d93b9c659cf1ce496fd5db9bb6 languageName: node linkType: hard @@ -12037,13 +10996,6 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd - languageName: node - linkType: hard - "picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -12058,10 +11010,17 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 6817fb74eb745a71445debe1029768de55fd59a42b75606f478ee1d0dc1aa6e78b711d041a7c9d5550e042642029b7f373dc1a43b224c4b7f12d23436735dba0 + languageName: node + linkType: hard + "pirates@npm:^4.0.4": - version: 4.0.6 - resolution: "pirates@npm:4.0.6" - checksum: 46a65fefaf19c6f57460388a5af9ab81e3d7fd0e7bc44ca59d753cb5c4d0df97c6c6e583674869762101836d68675f027d60f841c105d72734df9dfca97cbcc6 + version: 4.0.7 + resolution: "pirates@npm:4.0.7" + checksum: 3dcbaff13c8b5bc158416feb6dc9e49e3c6be5fddc1ea078a05a73ef6b85d79324bbb1ef59b954cdeff000dbf000c1d39f32dc69310c7b78fbada5171b583e40 languageName: node linkType: hard @@ -12084,9 +11043,9 @@ __metadata: linkType: hard "possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: b32d403ece71e042385cc7856385cecf1cd8e144fa74d2f1de40d1e16035dba097bc189715925e79b67bdd1472796ff168d3a90d296356c9c94d272d5b95f3ae + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: cfcd4f05264eee8fd184cd4897a17890561d1d473434b43ab66ad3673d9c9128981ec01e0cb1d65a52cd6b1eebfb2eae1e53e39b2e0eca86afc823ede7a4f41b languageName: node linkType: hard @@ -12097,6 +11056,34 @@ __metadata: languageName: node linkType: hard +"prettier-eslint@npm:^16.4.2": + version: 16.4.2 + resolution: "prettier-eslint@npm:16.4.2" + dependencies: + "@typescript-eslint/parser": ^6.21.0 + common-tags: ^1.8.2 + dlv: ^1.1.3 + eslint: ^8.57.1 + indent-string: ^4.0.0 + lodash.merge: ^4.6.2 + loglevel-colored-level-prefix: ^1.0.0 + prettier: ^3.5.3 + pretty-format: ^29.7.0 + require-relative: ^0.8.7 + tslib: ^2.8.1 + vue-eslint-parser: ^9.4.3 + peerDependencies: + prettier-plugin-svelte: ^3.0.0 + svelte-eslint-parser: "*" + peerDependenciesMeta: + prettier-plugin-svelte: + optional: true + svelte-eslint-parser: + optional: true + checksum: ad420f2d3b6f0c055e0eefed2f32876e4ac29d5c0202778ae531438224c7d07b67dcfb64054bc61a0cc88f231988198f229395361a9b2112ad048d08b6d5bc80 + languageName: node + linkType: hard + "prettier-linter-helpers@npm:^1.0.0": version: 1.0.0 resolution: "prettier-linter-helpers@npm:1.0.0" @@ -12106,12 +11093,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.0.3": - version: 3.3.3 - resolution: "prettier@npm:3.3.3" +"prettier@npm:^3.0.3, prettier@npm:^3.5.3": + version: 3.6.2 + resolution: "prettier@npm:3.6.2" bin: prettier: bin/prettier.cjs - checksum: bc8604354805acfdde6106852d14b045bb20827ad76a5ffc2455b71a8257f94de93f17f14e463fe844808d2ccc87248364a5691488a3304f1031326e62d9276e + checksum: 0206f5f437892e8858f298af8850bf9d0ef1c22e21107a213ba56bfb9c2387a2020bfda244a20161d8e3dad40c6b04101609a55d370dece53d0a31893b64f861 languageName: node linkType: hard @@ -12149,10 +11136,10 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: c78b26ecef6d5cce4a7489a1e9923d7b4b1679028c8654aef0463b27f4a90b0946cd598f55799da602895c52feb085ec76381d007ab8dcceebd40b89c2f9dfe0 languageName: node linkType: hard @@ -12211,9 +11198,9 @@ __metadata: linkType: hard "protocols@npm:^2.0.0, protocols@npm:^2.0.1": - version: 2.0.1 - resolution: "protocols@npm:2.0.1" - checksum: 4a9bef6aa0449a0245ded319ac3cbfd032c3e76ebb562777037a3a832c99253d0e8bc2847f7be350236df620a11f7d4fe683ea7f59a2cc14c69f746b6259eda4 + version: 2.0.2 + resolution: "protocols@npm:2.0.2" + checksum: 031cc068eb800468a50eb7c1e1c528bf142fb8314f5df9b9ea3c3f9df1697a19f97b9915b1229cef694d156812393172d9c3051ef7878d26eaa8c6faa5cccec4 languageName: node linkType: hard @@ -12241,12 +11228,12 @@ __metadata: linkType: hard "pump@npm:^3.0.0": - version: 3.0.2 - resolution: "pump@npm:3.0.2" + version: 3.0.3 + resolution: "pump@npm:3.0.3" dependencies: end-of-stream: ^1.1.0 once: ^1.3.1 - checksum: e0c4216874b96bd25ddf31a0b61a5613e26cc7afa32379217cf39d3915b0509def3565f5f6968fafdad2894c8bbdbd67d340e84f3634b2a29b950cffb6442d9f + checksum: 52843fc933b838c0330f588388115a1b28ef2a5ffa7774709b142e35431e8ab0c2edec90de3fa34ebb72d59fef854f151eea7dfc211b6dcf586b384556bd2f39 languageName: node linkType: hard @@ -12265,11 +11252,11 @@ __metadata: linkType: hard "pupa@npm:^3.1.0": - version: 3.1.0 - resolution: "pupa@npm:3.1.0" + version: 3.3.0 + resolution: "pupa@npm:3.3.0" dependencies: escape-goat: ^4.0.0 - checksum: 0e4f4ab6bbdce600fa6d23b1833f1af57b2641246ff4cbe10f9d66e4e5479b0de2864a88d5bd629eef59524eda3c6680726acd7f3f873d9ed46b7f095d0bb5f6 + checksum: a26b57cb4ff761495628b3630ab65fd97229d19314dbd9a08133d34f3f85fdb368da478f7b4a57647660c6d2973f0dae740668f8809c5861e3ede99e938ded05 languageName: node linkType: hard @@ -12358,12 +11345,12 @@ __metadata: linkType: hard "react-devtools-core@npm:^6.1.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 @@ -12376,7 +11363,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.13.0, react-is@npm:^16.13.1, react-is@npm:^16.7.0": +"react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f @@ -12397,23 +11384,16 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^19.0.0": - version: 19.1.0 - resolution: "react-is@npm:19.1.0" - checksum: 3eb4eac7f09bf178bdc6fa98d384f5f243b85de7c99679a88b0154ead4d818ad94386ccb00ea31ec52409ffd13299057f5ec6ca2eaec06f9f7eddc1ad4832332 - languageName: node - linkType: hard - -"react-is@npm:^19.1.0": - version: 19.1.1 - resolution: "react-is@npm:19.1.1" - checksum: e60ed01c27fe4d22b08f8a31f18831d144a801d08a909ca31fb1d02721b4f4cde0759148d6341f660a4d6ce54a78e22b8b39520b67e2e76254e583885868ab43 +"react-is@npm:^19.0.0, react-is@npm:^19.1.0": + version: 19.2.0 + resolution: "react-is@npm:19.2.0" + checksum: 9a23e1c2d0bbc13b383bc59a05f54e6eb95dd87e01aec8aa92a88618364b7b0ee8a5b057ad813cf61e2f7ae7d24503b624706acb609d07c54754e5ad2c522568 languageName: node linkType: hard "react-native-builder-bob@npm:^0.30.2": - version: 0.30.2 - resolution: "react-native-builder-bob@npm:0.30.2" + version: 0.30.3 + resolution: "react-native-builder-bob@npm:0.30.3" dependencies: "@babel/core": ^7.25.2 "@babel/plugin-transform-strict-mode": ^7.24.7 @@ -12439,22 +11419,22 @@ __metadata: yargs: ^17.5.1 bin: bob: bin/bob - checksum: 880ba5c9cf45f20dc5d7423a82b6963bb61d3fa41096b1d7ac2c7a141dfaedd5386ae6d29f80861922911220b8d0d689c831e01d9c8aca06afbb53933fa0f8b5 + checksum: 32b2159559a08310656b6b2f5f591a6aeeb9595f0f2d0e8dff7602af6aa62f59ae7206b023789de0a08f231d747c9bcab19e3efc874fad124b38e40c61f1ec90 languageName: node linkType: hard "react-native-builder-bob@npm:^0.40.4": - version: 0.40.4 - resolution: "react-native-builder-bob@npm:0.40.4" + version: 0.40.13 + resolution: "react-native-builder-bob@npm:0.40.13" dependencies: "@babel/core": ^7.25.2 + "@babel/plugin-transform-flow-strip-types": ^7.26.5 "@babel/plugin-transform-strict-mode": ^7.24.7 "@babel/preset-env": ^7.25.2 - "@babel/preset-flow": ^7.24.7 "@babel/preset-react": ^7.24.7 "@babel/preset-typescript": ^7.24.7 arktype: ^2.1.15 - babel-plugin-module-resolver: ^5.0.2 + babel-plugin-syntax-hermes-parser: ^0.28.0 browserslist: ^4.20.4 cross-spawn: ^7.0.3 dedent: ^0.7.0 @@ -12465,13 +11445,13 @@ __metadata: is-git-dirty: ^2.0.1 json5: ^2.2.1 kleur: ^4.1.4 - metro-config: ^0.80.9 prompts: ^2.4.2 + react-native-monorepo-config: ^0.1.8 which: ^2.0.2 yargs: ^17.5.1 bin: bob: bin/bob - checksum: 2b3576a5b3afb142400427f51197485fd0a8d7611b2ca6edb610fbcf320279c5951846c3ebe00715904e808f91106367e1f95c4e32f29405a07fb517a87927bb + checksum: 3140749ce4c2b4362502b2074ef2a6de92e03ab1a49bdbfc8058fbea0335a000d0554d012d9ce857b18bc395a2d6796c011d922725089e4688d6760f0b56b519 languageName: node linkType: hard @@ -12486,20 +11466,6 @@ __metadata: languageName: node linkType: hard -"react-native-gesture-handler@npm:^2.24.0": - version: 2.25.0 - resolution: "react-native-gesture-handler@npm:2.25.0" - dependencies: - "@egjs/hammerjs": ^2.0.17 - hoist-non-react-statics: ^3.3.0 - invariant: ^2.2.4 - peerDependencies: - react: "*" - react-native: "*" - checksum: 51b155bcc56043b9e06bf8ded089c44348e8da297b38e73f203f2d6ce8bd51698f85a38dca8eeab3d2ab721aeddefc270acd99e16cf493b20f1f429ad02214b8 - languageName: node - linkType: hard - "react-native-gesture-handler@npm:^2.26.0": version: 2.28.0 resolution: "react-native-gesture-handler@npm:2.28.0" @@ -12514,16 +11480,6 @@ __metadata: languageName: node linkType: hard -"react-native-is-edge-to-edge@npm:^1.1.7": - version: 1.1.7 - resolution: "react-native-is-edge-to-edge@npm:1.1.7" - peerDependencies: - react: "*" - react-native: "*" - checksum: 4cdf2b2fb5b131f2015c26d2cb7688b4a0c5f3c8474b1bf0ddfa9eabb0263df440c87262ae8f812a6ecab0d5310df0373bddad4b51f53dabb2ffee01e9ef0f44 - languageName: node - linkType: hard - "react-native-is-edge-to-edge@npm:^1.2.1": version: 1.2.1 resolution: "react-native-is-edge-to-edge@npm:1.2.1" @@ -12534,13 +11490,13 @@ __metadata: languageName: node linkType: hard -"react-native-safe-area-context@npm:^5.1.0": - version: 5.4.1 - resolution: "react-native-safe-area-context@npm:5.4.1" - peerDependencies: - react: "*" - react-native: "*" - checksum: 695e2a46a988725ac7a948e2a0f52fa91dbf6cfd29e7fd8c4b9e511022279cc7530fcec5dc6430415dcb5d137c593c53dd88249d41d1e049a254c32421a12d44 +"react-native-monorepo-config@npm:^0.1.8": + version: 0.1.10 + resolution: "react-native-monorepo-config@npm:0.1.10" + dependencies: + escape-string-regexp: ^5.0.0 + fast-glob: ^3.3.3 + checksum: 9b1c6fefb4d67e4a9f3f11554d33072c2112f56d578b8e9b68becc3457383e4f487f31af00d9e85cd43f0b23996c1b22e10cbec57e80c3fb2e4557a0e3db176d languageName: node linkType: hard @@ -12568,45 +11524,18 @@ __metadata: languageName: node linkType: hard -"react-native-screens@npm:^4.9.1": - version: 4.11.1 - resolution: "react-native-screens@npm:4.11.1" - dependencies: - react-freeze: ^1.0.0 - react-native-is-edge-to-edge: ^1.1.7 - warn-once: ^0.1.0 - peerDependencies: - react: "*" - react-native: "*" - checksum: 22d3c302ef90a1cb20eed8c130b32e53d49288a19eba844f506a5e38342ef2add0d4f7a2ff5501cc05052aef6bf7f180db26a067b01f70f3cc12d3e1497329d6 - languageName: node - linkType: hard - "react-native-vector-icons@npm:^10.2.0": - version: 10.2.0 - resolution: "react-native-vector-icons@npm:10.2.0" + version: 10.3.0 + resolution: "react-native-vector-icons@npm:10.3.0" dependencies: prop-types: ^15.7.2 yargs: ^16.1.1 - bin: - fa-upgrade.sh: bin/fa-upgrade.sh - fa5-upgrade: bin/fa5-upgrade.sh - fa6-upgrade: bin/fa6-upgrade.sh - generate-icon: bin/generate-icon.js - checksum: fda930df4e63f12533268f5b339ebe4c77c691eae43503328466b3087ed868a06a4593fd246e75ac6b5ec955543eec35608c7922191bdcc3b3a94ed7f3575ef0 - languageName: node - linkType: hard - -"react-native-webview@npm:^13.13.1": - version: 13.14.1 - resolution: "react-native-webview@npm:13.14.1" - dependencies: - escape-string-regexp: ^4.0.0 - invariant: 2.2.4 - peerDependencies: - react: "*" - react-native: "*" - checksum: 3860c17dc0ccfb8df5d1bfc2f970a31dc2a28e132fb36779b0d253c5b0d3c2457b0bde071ada1c4f0ea415ccc72b6216892ad46e497d9eb879504d07b2a2f00e + bin: + fa-upgrade.sh: bin/fa-upgrade.sh + fa5-upgrade: bin/fa5-upgrade.sh + fa6-upgrade: bin/fa6-upgrade.sh + generate-icon: bin/generate-icon.js + checksum: 5c431fd9a8e6efd355e34ed28ca7fa7eed30e89362280cbd1e474e6d16148c6c37f5c950a525ec0b428c79dc74b9fb7a61171fc509b6ab253e111456f3e49b71 languageName: node linkType: hard @@ -12803,27 +11732,28 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.4": - version: 1.0.6 - resolution: "reflect.getprototypeof@npm:1.0.6" +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 define-properties: ^1.2.1 - es-abstract: ^1.23.1 + es-abstract: ^1.23.9 es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - globalthis: ^1.0.3 - which-builtin-type: ^1.1.3 - checksum: 88e9e65a7eaa0bf8e9a8bbf8ac07571363bc333ba8b6769ed5e013e0042ed7c385e97fae9049510b3b5fe4b42472d8f32de9ce8ce84902bc4297d4bbe3777dba + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.7 + get-proto: ^1.0.1 + which-builtin-type: ^1.2.1 + checksum: ccc5debeb66125e276ae73909cecb27e47c35d9bb79d9cc8d8d055f008c58010ab8cb401299786e505e4aab733a64cba9daf5f312a58e96a43df66adad221870 languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.1.0, regenerate-unicode-properties@npm:^10.2.0": - version: 10.2.0 - resolution: "regenerate-unicode-properties@npm:10.2.0" +"regenerate-unicode-properties@npm:^10.2.2": + version: 10.2.2 + resolution: "regenerate-unicode-properties@npm:10.2.2" dependencies: regenerate: ^1.4.2 - checksum: d5c5fc13f8b8d7e16e791637a4bfef741f8d70e267d51845ee7d5404a32fa14c75b181c4efba33e4bff8b0000a2f13e9773593713dfe5b66597df4259275ce63 + checksum: 7ae4c1c32460c4360e3118c45eec0621424908f430fdd6f162c9172067786bf2b1682fbc885a33b26bc85e76e06f4d3f398b52425e801b0bb0cbae147dafb0b2 languageName: node linkType: hard @@ -12841,59 +11771,31 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.14.0": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 9f57c93277b5585d3c83b0cf76be47b473ae8c6d9142a46ce8b0291a04bb2cf902059f0f8445dcabb3fb7378e5fe4bb4ea1e008876343d42e46d3b484534ce38 - languageName: node - linkType: hard - -"regenerator-transform@npm:^0.15.2": - version: 0.15.2 - resolution: "regenerator-transform@npm:0.15.2" - dependencies: - "@babel/runtime": ^7.8.4 - checksum: 20b6f9377d65954980fe044cfdd160de98df415b4bff38fbade67b3337efaf078308c4fed943067cd759827cc8cfeca9cb28ccda1f08333b85d6a2acbd022c27 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.2": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" +"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: ^1.0.6 + call-bind: ^1.0.8 define-properties: ^1.2.1 es-errors: ^1.3.0 - set-function-name: ^2.0.1 - checksum: d7f333667d5c564e2d7a97c56c3075d64c722c9bb51b2b4df6822b2e8096d623a5e63088fb4c83df919b6951ef8113841de8b47de7224872fa6838bc5d8a7d64 - languageName: node - linkType: hard - -"regexpu-core@npm:^5.3.1": - version: 5.3.2 - resolution: "regexpu-core@npm:5.3.2" - dependencies: - "@babel/regjsgen": ^0.8.0 - regenerate: ^1.4.2 - regenerate-unicode-properties: ^10.1.0 - regjsparser: ^0.9.1 - unicode-match-property-ecmascript: ^2.0.0 - unicode-match-property-value-ecmascript: ^2.1.0 - checksum: 95bb97088419f5396e07769b7de96f995f58137ad75fac5811fb5fe53737766dfff35d66a0ee66babb1eb55386ef981feaef392f9df6d671f3c124812ba24da2 + get-proto: ^1.0.1 + gopd: ^1.2.0 + set-function-name: ^2.0.2 + checksum: 18cb667e56cb328d2dda569d7f04e3ea78f2683135b866d606538cf7b1d4271f7f749f09608c877527799e6cf350e531368f3c7a20ccd1bb41048a48926bdeeb languageName: node linkType: hard "regexpu-core@npm:^6.2.0": - version: 6.2.0 - resolution: "regexpu-core@npm:6.2.0" + version: 6.4.0 + resolution: "regexpu-core@npm:6.4.0" dependencies: regenerate: ^1.4.2 - regenerate-unicode-properties: ^10.2.0 + regenerate-unicode-properties: ^10.2.2 regjsgen: ^0.8.0 - regjsparser: ^0.12.0 + regjsparser: ^0.13.0 unicode-match-property-ecmascript: ^2.0.0 - unicode-match-property-value-ecmascript: ^2.1.0 - checksum: 67d3c4a3f6c99bc80b5d690074a27e6f675be1c1739f8a9acf028fbc36f1a468472574ea65e331e217995198ba4404d7878f3cb3739a73552dd3c70d3fb7f8e6 + unicode-match-property-value-ecmascript: ^2.2.1 + checksum: a316eb988599b7fb9d77f4adb937c41c022504dc91ddd18175c11771addc7f1d9dce550f34e36038395e459a2cf9ffc0d663bfe8d3c6c186317ca000ba79a8cf languageName: node linkType: hard @@ -12922,25 +11824,14 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.12.0": - version: 0.12.0 - resolution: "regjsparser@npm:0.12.0" - dependencies: - jsesc: ~3.0.2 - bin: - regjsparser: bin/parser - checksum: 094b55b0ab3e1fd58f8ce5132a1d44dab08d91f7b0eea4132b0157b303ebb8ded20a9cbd893d25402d2aeddb23fac1f428ab4947b295d6fa51dd1c334a9e76f0 - languageName: node - linkType: hard - -"regjsparser@npm:^0.9.1": - version: 0.9.1 - resolution: "regjsparser@npm:0.9.1" +"regjsparser@npm:^0.13.0": + version: 0.13.0 + resolution: "regjsparser@npm:0.13.0" dependencies: - jsesc: ~0.5.0 + jsesc: ~3.1.0 bin: regjsparser: bin/parser - checksum: 5e1b76afe8f1d03c3beaf9e0d935dd467589c3625f6d65fb8ffa14f224d783a0fed4bf49c2c1b8211043ef92b6117313419edf055a098ed8342e340586741afc + checksum: 1cf09f6afde2b2d1c1e89e1ce3034e3ee8d9433912728dbaa48e123f5f43ce34e263b2a8ab228817dce85d676ee0c801a512101b015ac9ab80ed449cf7329d3a languageName: node linkType: hard @@ -12999,6 +11890,13 @@ __metadata: languageName: node linkType: hard +"require-relative@npm:^0.8.7": + version: 0.8.7 + resolution: "require-relative@npm:0.8.7" + checksum: f1c3be06977823bba43600344d9ea6fbf8a55bdb81ec76533126849ab4024e6c31c6666f37fa4b5cfeda9c41dee89b8e19597cac02bdefaab42255c6708661ab + languageName: node + linkType: hard + "reselect@npm:^4.1.7": version: 4.1.8 resolution: "reselect@npm:4.1.8" @@ -13037,13 +11935,13 @@ __metadata: linkType: hard "resolve.exports@npm:^2.0.0": - version: 2.0.2 - resolution: "resolve.exports@npm:2.0.2" - checksum: 1c7778ca1b86a94f8ab4055d196c7d87d1874b96df4d7c3e67bbf793140f0717fd506dcafd62785b079cd6086b9264424ad634fb904409764c3509c3df1653f2 + version: 2.0.3 + resolution: "resolve.exports@npm:2.0.3" + checksum: abfb9f98278dcd0c19b8a49bb486abfafa23df4636d49128ea270dc982053c3ef230a530aecda1fae1322873fdfa6c97674fc539651ddfdb375ac58e0b8ef6df languageName: node linkType: hard -"resolve@npm:^1.1.6": +"resolve@npm:^1.1.6, resolve@npm:^1.20.0, resolve@npm:^1.22.10, resolve@npm:^1.22.8, resolve@npm:~1.22.2": version: 1.22.10 resolution: "resolve@npm:1.22.10" dependencies: @@ -13056,19 +11954,6 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.8, resolve@npm:~1.22.2": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c - languageName: node - linkType: hard - "resolve@npm:^2.0.0-next.5": version: 2.0.0-next.5 resolution: "resolve@npm:2.0.0-next.5" @@ -13082,7 +11967,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~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, resolve@patch:resolve@~1.22.2#~builtin": version: 1.22.10 resolution: "resolve@patch:resolve@npm%3A1.22.10#~builtin::version=1.22.10&hash=c3c19d" dependencies: @@ -13095,19 +11980,6 @@ __metadata: languageName: node linkType: hard -"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.22.2#~builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 - languageName: node - linkType: hard - "resolve@patch:resolve@^2.0.0-next.5#~builtin": version: 2.0.0-next.5 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#~builtin::version=2.0.0-next.5&hash=c3c19d" @@ -13156,9 +12028,9 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 64cb3142ac5e9ad689aca289585cb41d22521f4571f73e9488af39f6b1bd62f0cbb3d65e2ecc768ec6494052523f473f1eb4b55c3e9014b3590c17fc6a03e22a languageName: node linkType: hard @@ -13174,9 +12046,9 @@ __metadata: linkType: hard "run-applescript@npm:^7.0.0": - version: 7.0.0 - resolution: "run-applescript@npm:7.0.0" - checksum: b02462454d8b182ad4117e5d4626e9e6782eb2072925c9fac582170b0627ae3c1ea92ee9b2df7daf84b5e9ffe14eb1cf5fb70bc44b15c8a0bfcdb47987e2410c + version: 7.1.0 + resolution: "run-applescript@npm:7.1.0" + checksum: 8659fb5f2717b2b37a68cbfe5f678254cf24b5a82a6df3372b180c80c7c137dcd757a4166c3887e459f59a090ca414e8ea7ca97cf3ee5123db54b3b4006d7b7a languageName: node linkType: hard @@ -13205,40 +12077,51 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.1.2": - version: 1.1.2 - resolution: "safe-array-concat@npm:1.1.2" +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" dependencies: - call-bind: ^1.0.7 - get-intrinsic: ^1.2.4 - has-symbols: ^1.0.3 + call-bind: ^1.0.8 + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 + has-symbols: ^1.1.0 isarray: ^2.0.5 - checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 + checksum: 00f6a68140e67e813f3ad5e73e6dedcf3e42a9fa01f04d44b0d3f7b1f4b257af876832a9bfc82ac76f307e8a6cc652e3cf95876048a26cbec451847cf6ae3707 + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 languageName: node linkType: hard -"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c languageName: node linkType: hard -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + isarray: ^2.0.5 + checksum: 8c11cbee6dc8ff5cc0f3d95eef7052e43494591384015902e4292aef4ae9e539908288520ed97179cee17d6ffb450fe5f05a46ce7a1749685f7524fd568ab5db languageName: node linkType: hard -"safe-regex-test@npm:^1.0.3": - version: 1.0.3 - resolution: "safe-regex-test@npm:1.0.3" +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" dependencies: - call-bind: ^1.0.6 + call-bound: ^1.0.2 es-errors: ^1.3.0 - is-regex: ^1.1.4 - checksum: 6c7d392ff1ae7a3ae85273450ed02d1d131f1d2c76e177d6b03eb88e6df8fa062639070e7d311802c1615f351f18dc58f9454501c58e28d5ffd9b8f502ba6489 + is-regex: ^1.2.1 + checksum: 3c809abeb81977c9ed6c869c83aca6873ea0f3ab0f806b8edbba5582d51713f8a6e9757d24d2b4b088f563801475ea946c8e77e7713e8c65cdd02305b6caedab languageName: node linkType: hard @@ -13256,7 +12139,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.6.3, semver@npm:^7.1.3, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -13274,12 +12157,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.6.3": - version: 7.7.2 - resolution: "semver@npm:7.7.2" +"semver@npm:^7.1.3, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.6, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": + version: 7.7.3 + resolution: "semver@npm:7.7.3" bin: semver: bin/semver.js - checksum: dd94ba8f1cbc903d8eeb4dd8bf19f46b3deb14262b6717d0de3c804b594058ae785ef2e4b46c5c3b58733c99c83339068203002f9e37cfe44f7e2cc5e3d2f621 + checksum: f013a3ee4607857bcd3503b6ac1d80165f7f8ea94f5d55e2d3e33df82fce487aa3313b987abf9b39e0793c83c9fc67b76c36c067625141a9f6f704ae0ea18db2 languageName: node linkType: hard @@ -13330,7 +12213,7 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.1": +"set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" dependencies: @@ -13344,7 +12227,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1, set-function-name@npm:^2.0.2": +"set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -13356,6 +12239,17 @@ __metadata: languageName: node linkType: hard +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + checksum: ec27cbbe334598547e99024403e96da32aca3e530583e4dba7f5db1c43cbc4affa9adfbd77c7b2c210b9b8b2e7b2e600bad2a6c44fd62e804d8233f96bbb62f4 + languageName: node + linkType: hard + "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -13379,14 +12273,7 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.6.1": - version: 1.8.1 - resolution: "shell-quote@npm:1.8.1" - checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b - languageName: node - linkType: hard - -"shell-quote@npm:^1.8.1": +"shell-quote@npm:^1.6.1, shell-quote@npm:^1.8.3": version: 1.8.3 resolution: "shell-quote@npm:1.8.3" checksum: 550dd84e677f8915eb013d43689c80bb114860649ec5298eb978f40b8f3d4bc4ccb072b82c094eb3548dc587144bb3965a8676f0d685c1cf4c40b5dc27166242 @@ -13406,15 +12293,51 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - call-bind: ^1.0.7 es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - object-inspect: ^1.13.1 - checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 + object-inspect: ^1.13.3 + checksum: 603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + checksum: 42501371cdf71f4ccbbc9c9e2eb00aaaab80a4c1c429d5e8da713fd4d39ef3b8d4a4b37ed4f275798a65260a551a7131fd87fe67e922dba4ac18586d6aab8b06 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + side-channel-map: ^1.0.1 + checksum: a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + side-channel-list: ^1.0.0 + side-channel-map: ^1.0.1 + side-channel-weakmap: ^1.0.2 + checksum: bf73d6d6682034603eb8e99c63b50155017ed78a522d27c2acec0388a792c3ede3238b878b953a08157093b85d05797217d270b7666ba1f111345fbe933380ff languageName: node linkType: hard @@ -13433,11 +12356,11 @@ __metadata: linkType: hard "simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" + version: 0.2.4 + resolution: "simple-swizzle@npm:0.2.4" dependencies: is-arrayish: ^0.3.1 - checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 + checksum: 9a2f6f39a6b9fab68f96903523bf19953ec21e5e843108154cf47a9cc0f78955dd44f64499ffb71a849ac10c758d9fab7533627c7ca3ab40b5c177117acfdc1b languageName: node linkType: hard @@ -13487,18 +12410,7 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" - dependencies: - agent-base: ^7.1.1 - debug: ^4.3.4 - socks: ^2.8.3 - checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.5": +"socks-proxy-agent@npm:^8.0.3, socks-proxy-agent@npm:^8.0.5": version: 8.0.5 resolution: "socks-proxy-agent@npm:8.0.5" dependencies: @@ -13510,12 +12422,12 @@ __metadata: linkType: hard "socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" + 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: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd + checksum: 4bbe2c88cf0eeaf49f94b7f11564a99b2571bde6fd1e714ff95b38f89e1f97858c19e0ab0e6d39eb7f6a984fa67366825895383ed563fe59962a1d57a1d55318 languageName: node linkType: hard @@ -13581,9 +12493,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.20 - resolution: "spdx-license-ids@npm:3.0.20" - checksum: 0c57750bedbcff48f3d0e266fbbdaf0aab54217e182f669542ffe0b5a902dce69e8cdfa126a131e1ddd39a9bef4662e357b2b41315d7240b4a28c0a7e782bb40 + version: 3.0.22 + resolution: "spdx-license-ids@npm:3.0.22" + checksum: 3810ce1ddd8c67d7cfa76a0af05157090a2d93e5bb93bd85bf9735f1fd8062c5b510423a4669dc7d8c34b0892b27a924b1c6f8965f85d852aa25062cceff5e29 languageName: node linkType: hard @@ -13601,13 +12513,6 @@ __metadata: languageName: node linkType: hard -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 - languageName: node - linkType: hard - "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -13615,12 +12520,12 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" dependencies: minipass: ^7.0.3 - checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 + checksum: ef4b6b0ae47b4a69896f5f1c4375f953b9435388c053c36d27998bc3d73e046969ccde61ab659e679142971a0b08e50478a1228f62edb994105b280f17900c98 languageName: node linkType: hard @@ -13641,11 +12546,11 @@ __metadata: linkType: hard "stacktrace-parser@npm:^0.1.10": - version: 0.1.10 - resolution: "stacktrace-parser@npm:0.1.10" + version: 0.1.11 + resolution: "stacktrace-parser@npm:0.1.11" dependencies: type-fest: ^0.7.1 - checksum: f4fbddfc09121d91e587b60de4beb4941108e967d71ad3a171812dc839b010ca374d064ad0a296295fed13acd103609d99a4224a25b4e67de13cae131f1901ee + checksum: 1120cf716606ec6a8e25cc9b6ada79d7b91e6a599bba1a6664e6badc8b5f37987d7df7d9ad0344f717a042781fd8e1e999de08614a5afea451b68902421036b5 languageName: node linkType: hard @@ -13670,6 +12575,16 @@ __metadata: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + internal-slot: ^1.1.0 + checksum: be944489d8829fb3bdec1a1cc4a2142c6b6eb317305eeace1ece978d286d6997778afa1ae8cb3bd70e2b274b9aa8c69f93febb1e15b94b1359b11058f9d3c3a1 + languageName: node + linkType: hard + "strict-uri-encode@npm:^2.0.0": version: 2.0.0 resolution: "strict-uri-encode@npm:2.0.0" @@ -13727,23 +12642,24 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.11": - version: 4.0.11 - resolution: "string.prototype.matchall@npm:4.0.11" +"string.prototype.matchall@npm:^4.0.12": + version: 4.0.12 + resolution: "string.prototype.matchall@npm:4.0.12" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 - es-abstract: ^1.23.2 + es-abstract: ^1.23.6 es-errors: ^1.3.0 es-object-atoms: ^1.0.0 - get-intrinsic: ^1.2.4 - gopd: ^1.0.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.7 - regexp.prototype.flags: ^1.5.2 + get-intrinsic: ^1.2.6 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + internal-slot: ^1.1.0 + regexp.prototype.flags: ^1.5.3 set-function-name: ^2.0.2 - side-channel: ^1.0.6 - checksum: 6ac6566ed065c0c8489c91156078ca077db8ff64d683fda97ae652d00c52dfa5f39aaab0a710d8243031a857fd2c7c511e38b45524796764d25472d10d7075ae + side-channel: ^1.1.0 + checksum: 98a09d6af91bfc6ee25556f3d7cd6646d02f5f08bda55d45528ed273d266d55a71af7291fe3fc76854deffb9168cc1a917d0b07a7d5a178c7e9537c99e6d2b57 languageName: node linkType: hard @@ -13757,26 +12673,30 @@ __metadata: languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.9": - version: 1.2.9 - resolution: "string.prototype.trim@npm:1.2.9" +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.2 + define-data-property: ^1.1.4 define-properties: ^1.2.1 - es-abstract: ^1.23.0 + es-abstract: ^1.23.5 es-object-atoms: ^1.0.0 - checksum: ea2df6ec1e914c9d4e2dc856fa08228e8b1be59b59e50b17578c94a66a176888f417264bb763d4aac638ad3b3dad56e7a03d9317086a178078d131aa293ba193 + has-property-descriptors: ^1.0.2 + checksum: 87659cd8561237b6c69f5376328fda934693aedde17bb7a2c57008e9d9ff992d0c253a391c7d8d50114e0e49ff7daf86a362f7961cf92f7564cd01342ca2e385 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimend@npm:1.0.8" +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.2 define-properties: ^1.2.1 es-object-atoms: ^1.0.0 - checksum: cc3bd2de08d8968a28787deba9a3cb3f17ca5f9f770c91e7e8fa3e7d47f079bad70fadce16f05dda9f261788be2c6e84a942f618c3bed31e42abc5c1084f8dfd + checksum: cb86f639f41d791a43627784be2175daa9ca3259c7cb83e7a207a729909b74f2ea0ec5d85de5761e6835e5f443e9420c6ff3f63a845378e4a61dd793177bc287 languageName: node linkType: hard @@ -13818,6 +12738,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^3.0.0": + version: 3.0.1 + resolution: "strip-ansi@npm:3.0.1" + dependencies: + ansi-regex: ^2.0.0 + checksum: 9b974de611ce5075c70629c00fa98c46144043db92ae17748fb780f706f7a789e9989fd10597b7c2053ae8d1513fd707816a91f1879b2f71e6ac0b6a863db465 + languageName: node + linkType: hard + "strip-ansi@npm:^5.0.0": version: 5.2.0 resolution: "strip-ansi@npm:5.2.0" @@ -13828,11 +12757,11 @@ __metadata: linkType: hard "strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" + version: 7.1.2 + resolution: "strip-ansi@npm:7.1.2" dependencies: ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + checksum: db0e3f9654e519c8a33c50fc9304d07df5649388e7da06d3aabf66d29e5ad65d5e6315d8519d409c15b32fa82c1df7e11ed6f8cd50b0e4404463f0c9d77c8d0b languageName: node linkType: hard @@ -13867,11 +12796,9 @@ __metadata: linkType: hard "strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" - dependencies: - min-indent: ^1.0.1 - checksum: 06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 + version: 4.1.0 + resolution: "strip-indent@npm:4.1.0" + checksum: 10cb47506bb3a73ca369c88ae07ef37a2d2fca0906abb23a6a0f9f68bbced5c492176679a44b6b4a490c804009cc6432101f16e03d1a692fa00d77b16d651695 languageName: node linkType: hard @@ -13889,10 +12816,10 @@ __metadata: languageName: node linkType: hard -"strnum@npm:^1.0.5": - version: 1.0.5 - resolution: "strnum@npm:1.0.5" - checksum: 651b2031db5da1bf4a77fdd2f116a8ac8055157c5420f5569f64879133825915ad461513e7202a16d7fec63c54fd822410d0962f8ca12385c4334891b9ae6dd2 +"strnum@npm:^1.1.1": + version: 1.1.2 + resolution: "strnum@npm:1.1.2" + checksum: a85219eda13e97151c95e343a9e5960eacfb0a0ff98104b4c9cb7a212e3008bddf0c9714c9c37c2e508be78e741a04afc80027c2dc18509d1b5ffd4c37191fc2 languageName: node linkType: hard @@ -13903,12 +12830,10 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac +"supports-color@npm:^2.0.0": + version: 2.0.0 + resolution: "supports-color@npm:2.0.0" + checksum: 602538c5812b9006404370b5a4b885d3e2a1f6567d314f8b4a41974ffe7d08e525bf92ae0f9c7030e3b4c78e4e34ace55d6a67a74f1571bc205959f5972f88f0 languageName: node linkType: hard @@ -13937,41 +12862,39 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.9.1": - version: 0.9.1 - resolution: "synckit@npm:0.9.1" +"synckit@npm:^0.11.7": + version: 0.11.11 + resolution: "synckit@npm:0.11.11" dependencies: - "@pkgr/core": ^0.1.0 - tslib: ^2.6.2 - checksum: 4042941a4d939675f1d7b01124b8405b6ac616f3e3f396d00e46c67f38d0d5b7f9a1de05bc7ceea4ce80d967b450cfa2460e5f6aca81f7cea8f1a28be9392985 + "@pkgr/core": ^0.2.9 + checksum: bc896d4320525501495654766e6b0aa394e522476ea0547af603bdd9fd7e9b65dcd6e3a237bc7eb3ab7e196376712f228bf1bf6ed1e1809f4b32dc9baf7ad413 languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.2.1": - version: 6.2.1 - resolution: "tar@npm:6.2.1" +"tar@npm:^7.4.3": + version: 7.5.1 + resolution: "tar@npm:7.5.1" dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^5.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c + "@isaacs/fs-minipass": ^4.0.0 + chownr: ^3.0.0 + minipass: ^7.1.2 + minizlib: ^3.1.0 + yallist: ^5.0.0 + checksum: dbd55d4c3bd9e3c69aed137d9dc9fcb8f86afd103c28d97d52728ca80708f4c84b07e0a01d0bf1c8e820be84d37632325debf19f672a06e0c605c57a03636fd0 languageName: node linkType: hard "terser@npm:^5.15.0": - version: 5.34.1 - resolution: "terser@npm:5.34.1" + version: 5.44.0 + resolution: "terser@npm:5.44.0" dependencies: "@jridgewell/source-map": ^0.3.3 - acorn: ^8.8.2 + acorn: ^8.15.0 commander: ^2.20.0 source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 19a6710e17ff3f20d3b0661090640a572ce5ff6f2e95c731bb5a9eb1dcc1fe563cd0f1e4a22cde89b2717667336252bc2adb8894bdfbec6d1996b3e70b44f365 + checksum: 4e1868d9662ea280dad7b49cfe61b7693187be2b529b31b1f86782db00833c03ba05f2b82fc513d928e937260f2a5fbf42a93724e86eaf55f069288f934ccdb3 languageName: node linkType: hard @@ -14031,6 +12954,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.12": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: ^6.5.0 + picomatch: ^4.0.3 + checksum: 0e33b8babff966c6ab86e9b825a350a6a98a63700fa0bb7ae6cf36a7770a508892383adc272f7f9d17aaf46a9d622b455e775b9949a3f951eaaf5dfb26331d44 + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -14047,13 +12980,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -14077,12 +13003,21 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.3.0": - version: 1.4.0 - resolution: "ts-api-utils@npm:1.4.0" +"ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": + version: 1.4.3 + resolution: "ts-api-utils@npm:1.4.3" peerDependencies: typescript: ">=4.2.0" - checksum: 477601317dc8a6d961788663ee76984005ed20c70689bd6f807eed2cad258d3731edcc4162d438ce04782ca62a05373ba51e484180fc2a081d8dab2bf693a5af + checksum: ea00dee382d19066b2a3d8929f1089888b05fec797e32e7a7004938eda1dccf2e77274ee2afcd4166f53fab9b8d7ee90ebb225a3183f9ba8817d636f688a148d + languageName: node + linkType: hard + +"ts-api-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "ts-api-utils@npm:2.1.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 5b1ef89105654d93d67582308bd8dfe4bbf6874fccbcaa729b08fbb00a940fd4c691ca6d0d2b18c3c70878d9a7e503421b7cc473dbc3d0d54258b86401d4b15d languageName: node linkType: hard @@ -14093,10 +13028,10 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.6.2": - version: 2.7.0 - resolution: "tslib@npm:2.7.0" - checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 +"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a languageName: node linkType: hard @@ -14250,55 +13185,56 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-buffer@npm:1.0.2" +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" dependencies: - call-bind: ^1.0.7 + call-bound: ^1.0.3 es-errors: ^1.3.0 - is-typed-array: ^1.1.13 - checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b + is-typed-array: ^1.1.14 + checksum: 3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "typed-array-byte-length@npm:1.0.1" +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" dependencies: - call-bind: ^1.0.7 + call-bind: ^1.0.8 for-each: ^0.3.3 - gopd: ^1.0.1 - has-proto: ^1.0.3 - is-typed-array: ^1.1.13 - checksum: f65e5ecd1cf76b1a2d0d6f631f3ea3cdb5e08da106c6703ffe687d583e49954d570cc80434816d3746e18be889ffe53c58bf3e538081ea4077c26a41055b216d + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.14 + checksum: cda9352178ebeab073ad6499b03e938ebc30c4efaea63a26839d89c4b1da9d2640b0d937fc2bd1f049eb0a38def6fbe8a061b601292ae62fe079a410ce56e3a6 languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-byte-offset@npm:1.0.2" +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" dependencies: available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 + call-bind: ^1.0.8 for-each: ^0.3.3 - gopd: ^1.0.1 - has-proto: ^1.0.3 - is-typed-array: ^1.1.13 - checksum: c8645c8794a621a0adcc142e0e2c57b1823bbfa4d590ad2c76b266aa3823895cf7afb9a893bf6685e18454ab1b0241e1a8d885a2d1340948efa4b56add4b5f67 + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.15 + reflect.getprototypeof: ^1.0.9 + checksum: 670b7e6bb1d3c2cf6160f27f9f529e60c3f6f9611c67e47ca70ca5cfa24ad95415694c49d1dbfeda016d3372cab7dfc9e38c7b3e1bb8d692cae13a63d3c144d7 languageName: node linkType: hard -"typed-array-length@npm:^1.0.6": - version: 1.0.6 - resolution: "typed-array-length@npm:1.0.6" +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" dependencies: call-bind: ^1.0.7 for-each: ^0.3.3 gopd: ^1.0.1 - has-proto: ^1.0.3 is-typed-array: ^1.1.13 possible-typed-array-names: ^1.0.0 - checksum: f0315e5b8f0168c29d390ff410ad13e4d511c78e6006df4a104576844812ee447fcc32daab1f3a76c9ef4f64eff808e134528b5b2439de335586b392e9750e5c + reflect.getprototypeof: ^1.0.6 + checksum: deb1a4ffdb27cd930b02c7030cb3e8e0993084c643208e52696e18ea6dd3953dfc37b939df06ff78170423d353dc8b10d5bae5796f3711c1b3abe52872b3774c languageName: node linkType: hard @@ -14310,11 +13246,11 @@ __metadata: linkType: hard "typedoc-plugin-coverage@npm:^3.3.0": - version: 3.3.0 - resolution: "typedoc-plugin-coverage@npm:3.3.0" + version: 3.4.1 + resolution: "typedoc-plugin-coverage@npm:3.4.1" peerDependencies: - typedoc: 0.25.x || 0.26.x - checksum: b1779429618ab4df38c6b066c4113376b455d19863f70a170fe2e3a06cdcb276b82c4205c67922ea05e926b2fb0c85d932d7e09d00a42d4c4d95689768243524 + typedoc: 0.25.x || 0.26.x || 0.27.x + checksum: 4594aa61681e7f9732ef1c7a6be88db9508ef95f6231ea93d10d81e5f68937853cb9414f92f74f418175d27b7ba516f97a94848942bc589db54478f1a2b29650 languageName: node linkType: hard @@ -14347,22 +13283,22 @@ __metadata: linkType: hard "typescript@npm:^5.2.2": - version: 5.6.2 - resolution: "typescript@npm:5.6.2" + version: 5.9.3 + resolution: "typescript@npm:5.9.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 48777e1dabd9044519f56cd012b0296e3b72bafe12b7e8e34222751d45c67e0eba5387ecdaa6c14a53871a29361127798df6dc8d1d35643a0a47cb0b1c65a33a + checksum: 0d0ffb84f2cd072c3e164c79a2e5a1a1f4f168e84cb2882ff8967b92afe1def6c2a91f6838fb58b168428f9458c57a2ba06a6737711fdd87a256bbe83e9a217f languageName: node linkType: hard "typescript@patch:typescript@^5.2.2#~builtin": - version: 5.6.2 - resolution: "typescript@patch:typescript@npm%3A5.6.2#~builtin::version=5.6.2&hash=14eedb" + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#~builtin::version=5.9.3&hash=14eedb" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: c084ee1ab865f108c787e6233a5f63c126c482c0c8e87ec998ac5288a2ad54b603e1ea8b8b272355823b833eb31b9fabb99e8c6152283e1cb47e3a76bd6faf6c + checksum: 8bb8d86819ac86a498eada254cad7fb69c5f74778506c700c2a712daeaff21d3a6f51fd0d534fe16903cb010d1b74f89437a3d02d4d0ff5ca2ba9a4660de8497 languageName: node linkType: hard @@ -14382,15 +13318,15 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" dependencies: - call-bind: ^1.0.2 + call-bound: ^1.0.3 has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + has-symbols: ^1.1.0 + which-boxed-primitive: ^1.1.1 + checksum: 729f13b84a5bfa3fead1d8139cee5c38514e63a8d6a437819a473e241ba87eeb593646568621c7fc7f133db300ef18d65d1a5a60dc9c7beb9000364d93c581df languageName: node linkType: hard @@ -14401,10 +13337,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.2": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 +"undici-types@npm:~7.14.0": + version: 7.14.0 + resolution: "undici-types@npm:7.14.0" + checksum: bd28cb36b33a51359f02c27b84bfe8563cdad57bdab0aa6ac605ce64d51aff49fd0aa4cb2d3b043caaa93c3ec42e96b5757df5d2d9bcc06a5f3e71899c765035 languageName: node linkType: hard @@ -14425,17 +13361,17 @@ __metadata: languageName: node linkType: hard -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.2.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.2.0" - checksum: 9e3151e1d0bc6be35c4cef105e317c04090364173e8462005b5cde08a1e7c858b6586486cfebac39dc2c6c8c9ee24afb245de6d527604866edfa454fe2a35fae +"unicode-match-property-value-ecmascript@npm:^2.2.1": + version: 2.2.1 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.1" + checksum: e6c73e07bb4dc4aa399797a14b170e84a30ed290bcf97cc4305cf67dde8744119721ce17cef03f4f9d4ff48654bfa26eadc7fe1e8dd4b71b8f3b2e9a9742f013 languageName: node linkType: hard "unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.1.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" - checksum: 243524431893649b62cc674d877bd64ef292d6071dd2fd01ab4d5ad26efbc104ffcd064f93f8a06b7e4ec54c172bf03f6417921a0d8c3a9994161fe1f88f815b + version: 2.2.0 + resolution: "unicode-property-aliases-ecmascript@npm:2.2.0" + checksum: 0dd0f6e70130c59b4a841bac206758f70227b113145e4afe238161e3e8540e8eb79963e7a228cd90ad13d499e96f7ef4ee8940835404b2181ad9bf9c174818e3 languageName: node linkType: hard @@ -14446,21 +13382,21 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + unique-slug: ^5.0.0 + checksum: 6a62094fcac286b9ec39edbd1f8f64ff92383baa430af303dfed1ffda5e47a08a6b316408554abfddd9730c78b6106bef4ca4d02c1231a735ddd56ced77573df languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" dependencies: imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + checksum: 222d0322bc7bbf6e45c08967863212398313ef73423f4125e075f893a02405a5ffdbaaf150f7dd1e99f8861348a486dd079186d27c5f2c60e465b7dcbb1d3e5b languageName: node linkType: hard @@ -14492,20 +13428,6 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0, update-browserslist-db@npm:^1.1.1": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" - dependencies: - escalade: ^3.2.0 - picocolors: ^1.1.0 - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 2ea11bd2562122162c3e438d83a1f9125238c0844b6d16d366e3276d0c0acac6036822dc7df65fc5a89c699cdf9f174acf439c39bedf3f9a2f3983976e4b4c3e - languageName: node - linkType: hard - "update-browserslist-db@npm:^1.1.3": version: 1.1.3 resolution: "update-browserslist-db@npm:1.1.3" @@ -14554,30 +13476,21 @@ __metadata: languageName: node linkType: hard -"use-latest-callback@npm:^0.2.1": - version: 0.2.1 - resolution: "use-latest-callback@npm:0.2.1" - peerDependencies: - react: ">=16.8" - checksum: da5718eda625738cc7dac8fb502d0f8f2039435eb71203565a72c32e0f5769e7b8ddac074e650066636e7f4b29b45524f751cb18a2b430856d98879bbb10d274 - languageName: node - linkType: hard - "use-latest-callback@npm:^0.2.4": - version: 0.2.4 - resolution: "use-latest-callback@npm:0.2.4" + version: 0.2.5 + resolution: "use-latest-callback@npm:0.2.5" peerDependencies: react: ">=16.8" - checksum: 60c3a6b1b6567e1794f9e48cd86b8cde8a149485cc2fed60570f69ec3b157f6812e0ff0a877f0b971592fb9254b1363cc21c120fd1fc993b1dad1406c69211df + checksum: 8008a9c6635fa107ea3e84aba53c8f5334ea81bfe25a6866d76294045f53a34f9ad81ea7e2db595ceb1acf75064050b9cb7e800adee02e8a833b2f17ccdef88e languageName: node 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 @@ -14630,6 +13543,23 @@ __metadata: languageName: node linkType: hard +"vue-eslint-parser@npm:^9.4.3": + version: 9.4.3 + resolution: "vue-eslint-parser@npm:9.4.3" + dependencies: + debug: ^4.3.4 + eslint-scope: ^7.1.1 + eslint-visitor-keys: ^3.3.0 + espree: ^9.3.1 + esquery: ^1.4.0 + lodash: ^4.17.21 + semver: ^7.3.6 + peerDependencies: + eslint: ">=6.0.0" + checksum: 8d5b7ef7c5ee264ca2ba78da4b95ac7a66175a458d153a35e92cd7c55b794db0f2c31a8fdd40021bab4496f2f64ab80d7dbb6dccff4103beb4564c439a88fa42 + languageName: node + linkType: hard + "walker@npm:^1.0.7, walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -14639,7 +13569,7 @@ __metadata: languageName: node linkType: hard -"warn-once@npm:^0.1.0": +"warn-once@npm:^0.1.0, warn-once@npm:^0.1.1": version: 0.1.1 resolution: "warn-once@npm:0.1.1" checksum: e6a5a1f5a8dba7744399743d3cfb571db4c3947897875d4962a7c5b1bf2195ab4518c838cb4cea652e71729f21bba2e98dc75686f5fccde0fabbd894e2ed0c0d @@ -14669,36 +13599,37 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + is-bigint: ^1.1.0 + is-boolean-object: ^1.2.1 + is-number-object: ^1.1.1 + is-string: ^1.1.1 + is-symbol: ^1.1.1 + checksum: ee41d0260e4fd39551ad77700c7047d3d281ec03d356f5e5c8393fe160ba0db53ef446ff547d05f76ffabfd8ad9df7c9a827e12d4cccdbc8fccf9239ff8ac21e languageName: node linkType: hard -"which-builtin-type@npm:^1.1.3": - version: 1.1.4 - resolution: "which-builtin-type@npm:1.1.4" +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" dependencies: + call-bound: ^1.0.2 function.prototype.name: ^1.1.6 has-tostringtag: ^1.0.2 is-async-function: ^2.0.0 - is-date-object: ^1.0.5 - is-finalizationregistry: ^1.0.2 + is-date-object: ^1.1.0 + is-finalizationregistry: ^1.1.0 is-generator-function: ^1.0.10 - is-regex: ^1.1.4 + is-regex: ^1.2.1 is-weakref: ^1.0.2 isarray: ^2.0.5 - which-boxed-primitive: ^1.0.2 + which-boxed-primitive: ^1.1.0 which-collection: ^1.0.2 - which-typed-array: ^1.1.15 - checksum: 1f413025250072534de2a2ee25139a24d477512b532b05c85fb9aa05aef04c6e1ca8e2668acf971b777e602721dbdec4b9d6a4f37c6b9ff8f026ad030352707f + which-typed-array: ^1.1.16 + checksum: 7a3617ba0e7cafb795f74db418df889867d12bce39a477f3ee29c6092aa64d396955bf2a64eae3726d8578440e26777695544057b373c45a8bcf5fbe920bf633 languageName: node linkType: hard @@ -14721,16 +13652,18 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": - version: 1.1.15 - resolution: "which-typed-array@npm:1.1.15" +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" dependencies: available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 - for-each: ^0.3.3 - gopd: ^1.0.1 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + for-each: ^0.3.5 + get-proto: ^1.0.1 + gopd: ^1.2.0 has-tostringtag: ^1.0.2 - checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 + checksum: 162d2a07f68ea323f88ed9419861487ce5d02cb876f2cf9dd1e428d04a63133f93a54f89308f337b27cabd312ee3d027cae4a79002b2f0a85b79b9ef4c190670 languageName: node linkType: hard @@ -14745,14 +13678,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" dependencies: isexe: ^3.1.1 bin: node-which: bin/which.js - checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + checksum: 6ec99e89ba32c7e748b8a3144e64bfc74aa63e2b2eacbb61a0060ad0b961eb1a632b08fb1de067ed59b002cec3e21de18299216ebf2325ef0f78e0f121e14e90 languageName: node linkType: hard @@ -14829,13 +13762,13 @@ __metadata: linkType: hard "wrap-ansi@npm:^9.0.0": - version: 9.0.0 - resolution: "wrap-ansi@npm:9.0.0" + version: 9.0.2 + resolution: "wrap-ansi@npm:9.0.2" dependencies: ansi-styles: ^6.2.1 string-width: ^7.0.0 strip-ansi: ^7.1.0 - checksum: b2d43b76b3d8dcbdd64768165e548aad3e54e1cae4ecd31bac9966faaa7cf0b0345677ad6879db10ba58eb446ba8fa44fb82b4951872fd397f096712467a809f + checksum: 9827bf8bbb341d2d15f26d8507d98ca2695279359073422fe089d374b30e233d24ab95beca55cf9ab8dcb89face00e919be4158af50d4b6d8eab5ef4ee399e0c languageName: node linkType: hard @@ -14922,16 +13855,14 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.2.1": - version: 2.5.1 - resolution: "yaml@npm:2.5.1" - bin: - yaml: bin.mjs - checksum: 31275223863fbd0b47ba9d2b248fbdf085db8d899e4ca43fff8a3a009497c5741084da6871d11f40e555d61360951c4c910b98216c1325d2c94753c0036d8172 +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: eba51182400b9f35b017daa7f419f434424410691bbc5de4f4240cc830fdef906b504424992700dc047f16b4d99100a6f8b8b11175c193f38008e9c96322b6a5 languageName: node linkType: hard -"yaml@npm:^2.8.1": +"yaml@npm:^2.2.1, yaml@npm:^2.8.1": version: 2.8.1 resolution: "yaml@npm:2.8.1" bin: @@ -15028,8 +13959,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