diff --git a/Rive.podspec b/Rive.podspec index 78392d41..9c4ddd9f 100644 --- a/Rive.podspec +++ b/Rive.podspec @@ -43,6 +43,7 @@ Pod::Spec.new do |s| s.source_files = "ios/**/*.{h,m,mm,swift}" + s.public_header_files = ['ios/RCTSwiftLog.h'] load 'nitrogen/generated/ios/Rive+autolinking.rb' add_nitrogen_files(s) diff --git a/android/src/main/java/com/margelo/nitro/rive/HybridRiveFile.kt b/android/src/main/java/com/margelo/nitro/rive/HybridRiveFile.kt index a56d7776..e636013a 100644 --- a/android/src/main/java/com/margelo/nitro/rive/HybridRiveFile.kt +++ b/android/src/main/java/com/margelo/nitro/rive/HybridRiveFile.kt @@ -3,11 +3,23 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import app.rive.runtime.kotlin.core.File import com.facebook.proguard.annotations.DoNotStrip +import com.margelo.nitro.NitroModules +import java.lang.ref.WeakReference +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch @Keep @DoNotStrip class HybridRiveFile : HybridRiveFileSpec() { var riveFile: File? = null + var referencedAssetCache: ReferencedAssetCache? = null + var assetLoader: ReferencedAssetLoader? = null + private val weakViews = mutableListOf>() + private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) override val viewModelCount: Double? get() = riveFile?.viewModelCount?.toDouble() @@ -37,8 +49,50 @@ class HybridRiveFile : HybridRiveFileSpec() { } } + fun registerView(view: HybridRiveView) { + weakViews.add(WeakReference(view)) + } + + fun unregisterView(view: HybridRiveView) { + weakViews.removeAll { it.get() == view } + } + + private fun refreshAfterAssetChange() { + weakViews.removeAll { it.get() == null } + + for (weakView in weakViews) { + weakView.get()?.refreshAfterAssetChange() + } + } + + override fun updateReferencedAssets(referencedAssets: ReferencedAssetsType) { + val assetsData = referencedAssets.data ?: return + val cache = referencedAssetCache ?: return + val loader = assetLoader ?: return + val context = NitroModules.applicationContext ?: return + + val loadJobs = mutableListOf>() + + for ((key, assetData) in assetsData) { + val asset = cache[key] ?: continue + loadJobs.add(loader.updateAsset(assetData, asset, context)) + } + + if (loadJobs.isNotEmpty()) { + scope.launch { + loadJobs.awaitAll() + refreshAfterAssetChange() + } + } + } + override fun release() { + scope.cancel() + assetLoader?.dispose() + assetLoader = null riveFile?.release() riveFile = null + referencedAssetCache?.clear() + referencedAssetCache = null } } diff --git a/android/src/main/java/com/margelo/nitro/rive/HybridRiveFileFactory.kt b/android/src/main/java/com/margelo/nitro/rive/HybridRiveFileFactory.kt index 6e390af2..bee73739 100644 --- a/android/src/main/java/com/margelo/nitro/rive/HybridRiveFileFactory.kt +++ b/android/src/main/java/com/margelo/nitro/rive/HybridRiveFileFactory.kt @@ -3,6 +3,7 @@ package com.margelo.nitro.rive import android.annotation.SuppressLint import androidx.annotation.Keep import app.rive.runtime.kotlin.core.File +import app.rive.runtime.kotlin.core.Rive import com.facebook.proguard.annotations.DoNotStrip import com.margelo.nitro.core.ArrayBuffer import com.margelo.nitro.core.Promise @@ -13,21 +14,46 @@ import java.io.File as JavaFile import java.net.URI import java.net.URL +data class FileAndCache( + val file: File, + val cache: ReferencedAssetCache, + val loader: ReferencedAssetLoader? +) + @Keep @DoNotStrip class HybridRiveFileFactory : HybridRiveFileFactorySpec() { - override fun fromURL(url: String, loadCdn: Boolean): Promise { + private fun buildRiveFile( + data: ByteArray, + referencedAssets: ReferencedAssetsType? + ): FileAndCache { + val cache = mutableMapOf() + val loader = ReferencedAssetLoader() + val customLoader = loader.createCustomLoader(referencedAssets, cache) + + // TODO: The File object in Android does not have the concept of loading CDN assets + val riveFile = if (customLoader != null) { + File(data, Rive.defaultRendererType, customLoader) + } else { + File(data) + } + + return FileAndCache(riveFile, cache, if (customLoader != null) loader else null) + } + + override fun fromURL(url: String, loadCdn: Boolean, referencedAssets: ReferencedAssetsType?): Promise { return Promise.async { try { - val riveFile = withContext(Dispatchers.IO) { + val fileAndCache = withContext(Dispatchers.IO) { val urlObj = URL(url) val riveData = urlObj.readBytes() - // TODO: The File object in Android does not have the concept of loading CDN assets - File(riveData) + buildRiveFile(riveData, referencedAssets) } val hybridRiveFile = HybridRiveFile() - hybridRiveFile.riveFile = riveFile + hybridRiveFile.riveFile = fileAndCache.file + hybridRiveFile.referencedAssetCache = fileAndCache.cache + hybridRiveFile.assetLoader = fileAndCache.loader hybridRiveFile } catch (e: Exception) { throw Error("Failed to download Rive file: ${e.message}") @@ -35,7 +61,7 @@ class HybridRiveFileFactory : HybridRiveFileFactorySpec() { } } - override fun fromFileURL(fileURL: String, loadCdn: Boolean): Promise { + override fun fromFileURL(fileURL: String, loadCdn: Boolean, referencedAssets: ReferencedAssetsType?): Promise { if (!fileURL.startsWith("file://")) { throw Error("fromFileURL: URL must be a file URL: $fileURL") } @@ -45,14 +71,16 @@ class HybridRiveFileFactory : HybridRiveFileFactorySpec() { val uri = URI(fileURL) val path = uri.path ?: throw Error("fromFileURL: Invalid URL: $fileURL") - val riveFile = withContext(Dispatchers.IO) { + val fileAndCache = withContext(Dispatchers.IO) { val file = JavaFile(path) val riveData = file.readBytes() - File(riveData) + buildRiveFile(riveData, referencedAssets) } val hybridRiveFile = HybridRiveFile() - hybridRiveFile.riveFile = riveFile + hybridRiveFile.riveFile = fileAndCache.file + hybridRiveFile.referencedAssetCache = fileAndCache.cache + hybridRiveFile.assetLoader = fileAndCache.loader hybridRiveFile } catch (e: Exception) { throw Error("Failed to load Rive file: ${e.message}") @@ -61,23 +89,25 @@ class HybridRiveFileFactory : HybridRiveFileFactorySpec() { } @SuppressLint("DiscouragedApi") - override fun fromResource(resource: String, loadCdn: Boolean): Promise { + override fun fromResource(resource: String, loadCdn: Boolean, referencedAssets: ReferencedAssetsType?): Promise { return Promise.async { try { val context = NitroModules.applicationContext ?: throw Error("Could not load Rive file ($resource) from resource. No application context.") - val riveFile = withContext(Dispatchers.IO) { + val fileAndCache = withContext(Dispatchers.IO) { val resourceId = context.resources.getIdentifier(resource, "raw", context.packageName) if (resourceId == 0) { throw Error("Could not find Rive file: $resource.riv") } val inputStream = context.resources.openRawResource(resourceId) val riveData = inputStream.readBytes() - File(riveData) + buildRiveFile(riveData, referencedAssets) } val hybridRiveFile = HybridRiveFile() - hybridRiveFile.riveFile = riveFile + hybridRiveFile.riveFile = fileAndCache.file + hybridRiveFile.referencedAssetCache = fileAndCache.cache + hybridRiveFile.assetLoader = fileAndCache.loader hybridRiveFile } catch (e: Exception) { throw Error("Failed to load Rive file: ${e.message}") @@ -85,15 +115,17 @@ class HybridRiveFileFactory : HybridRiveFileFactorySpec() { } } - override fun fromBytes(bytes: ArrayBuffer, loadCdn: Boolean): Promise { - val buffer = bytes.getBuffer(false) // Use false to avoid creating a read-only buffer + override fun fromBytes(bytes: ArrayBuffer, loadCdn: Boolean, referencedAssets: ReferencedAssetsType?): Promise { + val buffer = bytes.getBuffer(false) return Promise.async { try { val byteArray = ByteArray(buffer.remaining()) buffer.get(byteArray) - val riveFile = File(byteArray) + val fileAndCache = buildRiveFile(byteArray, referencedAssets) val hybridRiveFile = HybridRiveFile() - hybridRiveFile.riveFile = riveFile + hybridRiveFile.riveFile = fileAndCache.file + hybridRiveFile.referencedAssetCache = fileAndCache.cache + hybridRiveFile.assetLoader = fileAndCache.loader hybridRiveFile } catch (e: Exception) { throw Error("Failed to load Rive file from bytes: ${e.message}") diff --git a/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt b/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt index 2f72c0b6..f18d8a04 100644 --- a/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt +++ b/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt @@ -25,6 +25,7 @@ class HybridRiveView(val context: ThemedReactContext) : HybridRiveViewSpec() { //region State override val view: RiveReactNativeView = RiveReactNativeView(context) private var needsReload = false + private var registeredFile: HybridRiveFile? = null //endregion //region View Props @@ -46,6 +47,10 @@ class HybridRiveView(val context: ThemedReactContext) : HybridRiveViewSpec() { } override var file: HybridRiveFileSpec = HybridRiveFile() set(value) { + if (field != value) { + registeredFile?.unregisterView(this) + registeredFile = null + } changed(field, value) { field = it } } override var alignment: Alignment? = null @@ -99,8 +104,13 @@ class HybridRiveView(val context: ThemedReactContext) : HybridRiveViewSpec() { //endregion //region Update + fun refreshAfterAssetChange() { + afterUpdate() + } + override fun afterUpdate() { - val riveFile = (file as? HybridRiveFile)?.riveFile ?: return + val hybridFile = file as? HybridRiveFile + val riveFile = hybridFile?.riveFile ?: return val config = ViewConfiguration( artboardName = artboardName, @@ -113,6 +123,12 @@ class HybridRiveView(val context: ThemedReactContext) : HybridRiveViewSpec() { layoutScaleFactor = layoutScaleFactor?.toFloat() ?: DefaultConfiguration.LAYOUTSCALEFACTOR, ) view.configure(config, needsReload) + + if (needsReload && hybridFile != null) { + hybridFile.registerView(this) + registeredFile = hybridFile + } + needsReload = false super.afterUpdate() } diff --git a/android/src/main/java/com/margelo/nitro/rive/ReferencedAssetLoader.kt b/android/src/main/java/com/margelo/nitro/rive/ReferencedAssetLoader.kt new file mode 100644 index 00000000..339c39ac --- /dev/null +++ b/android/src/main/java/com/margelo/nitro/rive/ReferencedAssetLoader.kt @@ -0,0 +1,254 @@ +package com.margelo.nitro.rive + +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.Resources +import android.net.Uri +import android.util.Log +import app.rive.runtime.kotlin.core.* +import com.margelo.nitro.NitroModules +import kotlinx.coroutines.* +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import java.io.File as JavaFile +import java.io.IOException +import java.net.URI +import java.net.URL + +typealias ReferencedAssetCache = MutableMap + +class ReferencedAssetLoader { + private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) + + private fun logError(message: String) { + Log.e("ReferencedAssetLoader", message) + } + + private fun isValidUrl(url: String): Boolean { + return try { + URL(url) + true + } catch (e: Exception) { + false + } + } + + private fun constructFilePath(filename: String, path: String): String { + return if (path.endsWith("/")) "$path$filename" else "$path/$filename" + } + + @SuppressLint("DiscouragedApi") + private fun getResourceId(source: String, context: Context): Int { + val resourceTypes = listOf("raw", "drawable") + + for (type in resourceTypes) { + val resourceId = context.resources.getIdentifier(source, type, context.packageName) + if (resourceId != 0) { + return resourceId + } + } + + return 0 + } + + private fun readAssetBytes(context: Context, fileName: String): ByteArray? { + val assetManager = context.assets + return try { + assetManager.open(fileName).use { inputStream -> + inputStream.readBytes() + } + } catch (e: IOException) { + logError("Unable to read file from assets: $fileName - ${e.message}") + null + } + } + + private fun downloadUrlAsset(url: String, listener: (ByteArray?) -> Unit) { + if (!isValidUrl(url)) { + logError("Invalid URL: $url") + listener(null) + return + } + + scope.launch { + try { + val uri = URI(url) + val bytes = when (uri.scheme) { + "file" -> { + val file = JavaFile(uri.path) + if (!file.exists()) { + throw IOException("File not found: ${uri.path}") + } + if (!file.canRead()) { + throw IOException("Permission denied: ${uri.path}") + } + file.readBytes() + } + "http", "https" -> { + URL(url).readBytes() + } + else -> { + logError("Unsupported URL scheme: ${uri.scheme}") + withContext(Dispatchers.Main) { + listener(null) + } + return@launch + } + } + + withContext(Dispatchers.Main) { + listener(bytes) + } + } catch (e: Exception) { + logError("Unable to download asset from URL: $url - ${e.message}") + withContext(Dispatchers.Main) { + listener(null) + } + } + } + } + + private fun loadResourceAsset( + sourceAssetId: String, + context: Context, + listener: (ByteArray?) -> Unit + ) { + scope.launch { + try { + val scheme = runCatching { Uri.parse(sourceAssetId).scheme }.getOrNull() + + if (scheme != null) { + downloadUrlAsset(sourceAssetId, listener) + return@launch + } + + val resourceId = getResourceId(sourceAssetId, context) + + if (resourceId != 0) { + val bytes = context.resources.openRawResource(resourceId).use { inputStream -> + inputStream.readBytes() + } + withContext(Dispatchers.Main) { + listener(bytes) + } + } else { + logError("Resource not found: $sourceAssetId") + withContext(Dispatchers.Main) { + listener(null) + } + } + } catch (e: IOException) { + logError("IO Exception while reading resource: $sourceAssetId - ${e.message}") + withContext(Dispatchers.Main) { + listener(null) + } + } catch (e: Resources.NotFoundException) { + logError("Resource not found: $sourceAssetId - ${e.message}") + withContext(Dispatchers.Main) { + listener(null) + } + } catch (e: Exception) { + logError("Unexpected error while processing resource: $sourceAssetId - ${e.message}") + withContext(Dispatchers.Main) { + listener(null) + } + } + } + } + + private fun loadBundledAsset( + sourceAsset: String, + path: String?, + context: Context, + listener: (ByteArray?) -> Unit + ) { + scope.launch { + try { + val fullPath = if (path == null) sourceAsset else constructFilePath(sourceAsset, path) + val bytes = readAssetBytes(context, fullPath) + + withContext(Dispatchers.Main) { + listener(bytes) + } + } catch (e: Exception) { + logError("Error loading bundled asset: $sourceAsset - ${e.message}") + withContext(Dispatchers.Main) { + listener(null) + } + } + } + } + + private fun processAssetBytes(bytes: ByteArray, asset: FileAsset) { + when (asset) { + is ImageAsset -> asset.image = RiveRenderImage.make(bytes) + is FontAsset -> asset.font = RiveFont.make(bytes) + is AudioAsset -> asset.audio = RiveAudio.make(bytes) + } + } + + private fun loadAsset(assetData: ResolvedReferencedAsset, asset: FileAsset, context: Context): Deferred { + val deferred = CompletableDeferred() + val listener: (ByteArray?) -> Unit = { bytes -> + if (bytes != null) { + processAssetBytes(bytes, asset) + } + deferred.complete(Unit) + } + + when { + assetData.sourceAssetId != null -> { + loadResourceAsset(assetData.sourceAssetId, context, listener) + } + assetData.sourceUrl != null -> { + downloadUrlAsset(assetData.sourceUrl, listener) + } + assetData.sourceAsset != null -> { + loadBundledAsset(assetData.sourceAsset, assetData.path, context, listener) + } + else -> { + deferred.complete(Unit) + } + } + + return deferred + } + + fun updateAsset(assetData: ResolvedReferencedAsset, asset: FileAsset, context: Context): Deferred { + return loadAsset(assetData, asset, context) + } + + fun createCustomLoader( + referencedAssets: ReferencedAssetsType?, + cache: ReferencedAssetCache + ): FileAssetLoader? { + val assetsData = referencedAssets?.data ?: return null + val context = NitroModules.applicationContext ?: return null + + return object : FileAssetLoader() { + override fun loadContents(asset: FileAsset, inBandBytes: ByteArray): Boolean { + var key = asset.uniqueFilename.substringBeforeLast(".") + var assetData = assetsData[key] + + if (assetData == null) { + key = asset.name + assetData = assetsData[asset.name] + } + + if (assetData == null) { + return false + } + + cache[key] = asset + + loadAsset(assetData, asset, context) + + return true + } + } + } + + fun dispose() { + scope.cancel() + } +} diff --git a/example/assets/audio/referenced_audio-2929340.wav b/example/assets/audio/referenced_audio-2929340.wav new file mode 100644 index 00000000..4bfcc159 Binary files /dev/null and b/example/assets/audio/referenced_audio-2929340.wav differ diff --git a/example/assets/fonts/Inter-594377.ttf b/example/assets/fonts/Inter-594377.ttf new file mode 100644 index 00000000..f5a2ed31 Binary files /dev/null and b/example/assets/fonts/Inter-594377.ttf differ diff --git a/example/assets/rive/out_of_band.riv b/example/assets/rive/out_of_band.riv new file mode 100644 index 00000000..1b509e8e Binary files /dev/null and b/example/assets/rive/out_of_band.riv differ diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 5dd96353..77139433 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -8,7 +8,7 @@ PODS: - hermes-engine (0.79.2): - hermes-engine/Pre-built (= 0.79.2) - hermes-engine/Pre-built (0.79.2) - - NitroModules (0.31.3): + - NitroModules (0.31.4): - DoubleConversion - glog - hermes-engine @@ -1357,7 +1357,7 @@ PODS: - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - react-native-safe-area-context (5.4.0): + - react-native-safe-area-context (5.6.2): - DoubleConversion - glog - hermes-engine @@ -1372,8 +1372,8 @@ PODS: - React-hermes - React-ImageManager - React-jsi - - react-native-safe-area-context/common (= 5.4.0) - - react-native-safe-area-context/fabric (= 5.4.0) + - react-native-safe-area-context/common (= 5.6.2) + - react-native-safe-area-context/fabric (= 5.6.2) - React-NativeModulesApple - React-RCTFabric - React-renderercss @@ -1383,7 +1383,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-safe-area-context/common (5.4.0): + - react-native-safe-area-context/common (5.6.2): - DoubleConversion - glog - hermes-engine @@ -1407,7 +1407,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-safe-area-context/fabric (5.4.0): + - react-native-safe-area-context/fabric (5.6.2): - DoubleConversion - glog - hermes-engine @@ -1781,7 +1781,31 @@ PODS: - RiveRuntime (= 6.12.0) - Yoga - RiveRuntime (6.12.0) - - RNGestureHandler (2.25.0): + - RNCPicker (2.11.4): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNGestureHandler (2.29.1): - DoubleConversion - glog - hermes-engine @@ -1883,6 +1907,7 @@ DEPENDENCIES: - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - Rive (from `../..`) + - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -2037,6 +2062,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" Rive: :path: "../.." + RNCPicker: + :path: "../node_modules/@react-native-picker/picker" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" Yoga: @@ -2050,7 +2077,7 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe - NitroModules: bb52372447b073b536ecc728f79fbd1242547738 + NitroModules: 8229091083785ae690dc9071f07fc412e0cb8243 RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809 RCTDeprecation: 83ffb90c23ee5cea353bd32008a7bca100908f8c RCTRequired: eb7c0aba998009f47a540bec9e9d69a54f68136e @@ -2082,7 +2109,7 @@ SPEC CHECKSUMS: React-logger: 368570a253f00879a1e4fea24ed4047e72e7bbf3 React-Mapbuffer: c04fcda1c6281fc0a6824c7dcc1633dd217ac1ec React-microtasksnativemodule: ca2804a25fdcefffa0aa942aa23ab53b99614a34 - react-native-safe-area-context: 00d03dc688ba86664be66f9e3f203fc7d747d899 + react-native-safe-area-context: bc59472155ffb889a1ffe16c19a04c0cd451562b React-NativeModulesApple: 452b86b29fae99ed0a4015dca3ad9cd222f88abf React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c React-perflogger: 6fd2f6811533e9c19a61e855c3033eecbf4ad2a0 @@ -2114,9 +2141,10 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: d5dcc564f129632276bd3184e60f053fcd574d6b ReactCodegen: fda99a79c866370190e162083a35602fdc314e5d ReactCommon: 4d0da92a5eb8da86c08e3ec34bd23ab439fb2461 - Rive: 3bd6bb2febc263defec083afd3a4fb29b82efeb9 + Rive: b83a5c913ae79218b9e33f22bbe77d860de54eec RiveRuntime: 8d819993126145fbf5a73089e7634b14b9aa577f - RNGestureHandler: 5d8431415d4b8518e86e289e9ad5bb9be78f6dba + RNCPicker: 83c74db2de8274d8a8f3e18d91dea174a708f8c4 + RNGestureHandler: bff91bb5ab5688265c70f74180ef718b94f33fe3 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: 9f110fc4b7aa538663cba3c14cbb1c335f43c13f diff --git a/example/package.json b/example/package.json index c474acf9..4b18e335 100644 --- a/example/package.json +++ b/example/package.json @@ -10,6 +10,7 @@ "build:ios": "react-native build-ios --mode Debug" }, "dependencies": { + "@react-native-picker/picker": "^2.11.4", "@react-navigation/native": "^7.1.9", "@react-navigation/stack": "^7.3.2", "react": "19.0.0", diff --git a/example/src/App.tsx b/example/src/App.tsx index b38f1dee..d326dd55 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -13,6 +13,7 @@ import TemplatePage from './pages/TemplatePage'; import EventsExample from './pages/RiveEventsExample'; import StateMachineInputsExample from './pages/RiveStateMachineInputsExample'; import TextRunExample from './pages/RiveTextRunExample'; +import OutOfBandAssets from './pages/OutOfBandAssets'; type RootStackParamList = { Home: undefined; @@ -22,6 +23,7 @@ type RootStackParamList = { RiveStateMachineInputs: undefined; RiveTextRun: undefined; Template: undefined; + OutOfBandAssets: undefined; }; const Stack = createStackNavigator(); @@ -63,6 +65,12 @@ function HomeScreen({ navigation }: { navigation: any }) { > Rive Text Run Example + navigation.navigate('OutOfBandAssets')} + > + Out of band assets + navigation.navigate('Template')} @@ -118,6 +126,11 @@ export default function App() { component={TextRunExample} options={{ title: 'Rive Text Runs' }} /> + ; + } else if (error != null) { + return ( + + Error loading Rive file + + ); + } + + return ( + + + {/* + onError={(riveError: RNRiveError) => { + console.log(riveError); + }} + */ + /* + Load in an external asset from a URL, or bundled asset on the native + platform, or as a source loaded directly from JavaScript. + */} + + + + setUri(value)} + mode={'dropdown'} + style={styles.picker} + > + {[ + 'https://picsum.photos/id/372/500/500', + 'https://picsum.photos/id/373/500/500', + ].map((key) => ( + + ))} + + + + + + ); +} + +const styles = StyleSheet.create({ + safeAreaViewContainer: { + flex: 1, + }, + container: { + flexGrow: 1, + alignItems: 'center', + justifyContent: 'flex-start', + }, + animation: { + width: '100%', + height: 400, + }, + picker: { + flex: 1, + width: '100%', + }, + pickerWrapper: { + borderWidth: 1, + borderColor: 'black', + borderRadius: 5, + alignItems: 'center', + margin: 16, + }, + pickersWrapper: { + flex: 1, + padding: 16, + alignSelf: 'stretch', + }, +}); diff --git a/ios/HybridRiveFile.swift b/ios/HybridRiveFile.swift index 1f8c74fb..b3109e8b 100644 --- a/ios/HybridRiveFile.swift +++ b/ios/HybridRiveFile.swift @@ -1,11 +1,34 @@ import RiveRuntime -class HybridRiveFile: HybridRiveFileSpec { +typealias ReferencedAssetCache = [String: RiveFileAsset] + +class HybridRiveFile: HybridRiveFileSpec, RiveViewSource { var riveFile: RiveFile? - + var referencedAssetCache: ReferencedAssetCache? + var assetLoader: ReferencedAssetLoader? + var cachedFactory: RiveFactory? + private var weakViews: [Weak] = [] + public func setRiveFile(_ riveFile: RiveFile) { self.riveFile = riveFile } + + func registerView(_ view: RiveReactNativeView) { + weakViews.append(Weak(view)) + } + + func unregisterView(_ view: RiveReactNativeView) { + weakViews.removeAll { $0.value === view } + } + + private func refreshAfterAssetChange() { + weakViews = weakViews.filter { $0.value != nil } + + for weakView in weakViews { + guard let view = weakView.value else { continue } + view.refreshAfterAssetChange() + } + } var viewModelCount: Double? { guard let count = riveFile?.viewModelCount else { return nil } @@ -45,6 +68,37 @@ class HybridRiveFile: HybridRiveFileSpec { return HybridViewModel(viewModel: vm) } + func updateReferencedAssets(referencedAssets: ReferencedAssetsType) { + guard let assetsData = referencedAssets.data, + let cache = referencedAssetCache, + let loader = assetLoader, + let _ = riveFile else { + return + } + + let dispatchGroup = DispatchGroup() + var hasChanged = false + + for (key, assetData) in assetsData { + guard let asset = cache[key] else { continue } + if let riveFactory = cachedFactory { + dispatchGroup.enter() + loader.loadAsset(source: assetData, asset: asset, factory: riveFactory) { + dispatchGroup.leave() + } + } else { + RCTLogError("[RiveFile] no factory available for update") + } + hasChanged = true + } + + if hasChanged { + dispatchGroup.notify(queue: .main) { [weak self] in + self?.refreshAfterAssetChange() + } + } + } + func release() throws { // iOS does not need to release the Rive file. riveFile = nil diff --git a/ios/HybridRiveFileFactory.swift b/ios/HybridRiveFileFactory.swift index 80e7d512..9030d93d 100644 --- a/ios/HybridRiveFileFactory.swift +++ b/ios/HybridRiveFileFactory.swift @@ -1,23 +1,58 @@ import NitroModules import RiveRuntime -class HybridRiveFileFactory: HybridRiveFileFactorySpec { - // MARK: Public Methods - func fromURL(url: String, loadCdn: Bool) throws -> Promise<(any HybridRiveFileSpec)> { - // TODO: should we make use of the underlying Rive iOS URL asset loading instead +final class HybridRiveFileFactory: HybridRiveFileFactorySpec, @unchecked Sendable { + let assetLoader = ReferencedAssetLoader() + + /// Asynchronously creates a `HybridRiveFileSpec` by performing the following steps: + /// 1. Executes `check()` to validate or fetch initial data. + /// 2. Processes the result with `prepare()`. + /// 3. If a custom asset loader is available, loads the file using `fileWithCustomAssetLoader(prepared, assetLoader)`. + /// Otherwise, loads the file using `file(prepared)`. + /// 4. Handles referenced assets and caches as needed. + /// - Parameters: + /// - check: Closure to validate or fetch initial data. + /// - prepare: Closure to process the checked result. + /// - fileWithCustomAssetLoader: Closure to load the file with a custom asset loader. + /// - file: Closure to load the file without a custom asset loader. + /// - referencedAssets: Optional referenced assets. + /// - Returns: A promise resolving to a `HybridRiveFileSpec`. + /// - Throws: Runtime errors if any step fails. + func genericFrom( + check: @escaping () throws -> CheckResult, + prepare: @escaping (CheckResult) throws -> Prepared, + fileWithCustomAssetLoader: @escaping (Prepared, @escaping LoadAsset) throws -> RiveFile, + file: @escaping (Prepared) throws -> RiveFile, + referencedAssets: ReferencedAssetsType? + ) throws -> Promise<(any HybridRiveFileSpec)> { return Promise.async { do { - guard let url = URL(string: url) else { - throw RuntimeError.error(withMessage: "Invalid URL: \(url)") - } - - let riveFile = try await withCheckedThrowingContinuation { continuation in + let checked = try check() + + let result = try await withCheckedThrowingContinuation { continuation in DispatchQueue.global(qos: .userInitiated).async { do { - let riveData = try Data(contentsOf: url) - let riveFile = try RiveFile(data: riveData, loadCdn: true) + let prepared = try prepare(checked) + + let referencedAssetCache = SendableRef(ReferencedAssetCache()) + let factoryCache: SendableRef = .init(nil) + let customLoader = self.assetLoader.createCustomLoader( + referencedAssets: referencedAssets, cache: referencedAssetCache, + factory: factoryCache) + + let riveFile = + if let customLoader = customLoader { + try fileWithCustomAssetLoader(prepared, customLoader) + } else { + try file(prepared) + } + + let result = ( + file: riveFile, cache: referencedAssetCache.value, factory: factoryCache.value, + loader: customLoader != nil ? self.assetLoader : nil + ) DispatchQueue.main.async { - continuation.resume(returning: riveFile) + continuation.resume(returning: result) } } catch { DispatchQueue.main.async { @@ -26,117 +61,102 @@ class HybridRiveFileFactory: HybridRiveFileFactorySpec { } } } - + let hybridRiveFile = HybridRiveFile() - hybridRiveFile.riveFile = riveFile + hybridRiveFile.riveFile = result.file + hybridRiveFile.referencedAssetCache = result.cache + if let factory = result.factory { + hybridRiveFile.cachedFactory = factory + } + hybridRiveFile.assetLoader = result.loader return hybridRiveFile } catch let error as NSError { - throw RuntimeError.error(withMessage: "Failed to download Rive file: \(error.localizedDescription)") + throw RuntimeError.error( + withMessage: "Failed to download Rive file: \(error.localizedDescription)") } catch { throw RuntimeError.error(withMessage: "Unknown error occurred while downloading Rive file") } } } - - func fromFileURL(fileURL: String, loadCdn: Bool) throws -> Promise<(any HybridRiveFileSpec)> { - guard let url = URL(string:fileURL) else { - throw RuntimeError.error(withMessage: "fromFileURL: Invalid URL: \(fileURL)") - } - - guard url.isFileURL else { - throw RuntimeError.error(withMessage: "fromFileURL: URL must be a file URL: \(fileURL)") - } - - return Promise.async { - do { - let riveFile = try await withCheckedThrowingContinuation { continuation in - DispatchQueue.global(qos: .userInitiated).async { - do { - let data = try Data(contentsOf: url) - - let riveFile = try RiveFile(data: data, loadCdn: loadCdn) - DispatchQueue.main.async { - continuation.resume(returning: riveFile) - } - } catch { - DispatchQueue.main.async { - continuation.resume(throwing: error) - } - } - } + + // MARK: Public Methods + func fromURL(url: String, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws + -> Promise<(any HybridRiveFileSpec)> + { + return try genericFrom( + check: { + guard let url = URL(string: url) else { + throw RuntimeError.error(withMessage: "Invalid URL: \(url)") } - - let hybridRiveFile = HybridRiveFile() - hybridRiveFile.riveFile = riveFile - return hybridRiveFile - } catch let error as NSError { - throw RuntimeError.error(withMessage: "Failed to load Rive file: \(error.localizedDescription)") - } catch { - throw RuntimeError.error(withMessage: "Unknown error occurred while loading Rive file") - } - } + return url + }, + prepare: { url in try Data(contentsOf: url) }, + fileWithCustomAssetLoader: { (data, loader) in + try RiveFile(data: data, loadCdn: loadCdn, customAssetLoader: loader) + }, + file: { (data) in try RiveFile(data: data, loadCdn: loadCdn) }, + referencedAssets: referencedAssets + ) } - - func fromResource(resource: String, loadCdn: Bool) throws -> Promise<(any HybridRiveFileSpec)> { - guard let _ = Bundle.main.path(forResource: resource, ofType: "riv") else { - throw RuntimeError.error(withMessage: "Could not find Rive file: \(resource).riv") - } - - return Promise.async { - do { - let riveFile = try await withCheckedThrowingContinuation { continuation in - DispatchQueue.global(qos: .userInitiated).async { - do { - let riveFile = try RiveFile(resource: resource, loadCdn: loadCdn) - DispatchQueue.main.async { - continuation.resume(returning: riveFile) - } - } catch { - DispatchQueue.main.async { - continuation.resume(throwing: error) - } - } - } + + func fromFileURL(fileURL: String, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws + -> Promise<(any HybridRiveFileSpec)> + { + return try genericFrom( + check: { + guard let url = URL(string: fileURL) else { + throw RuntimeError.error(withMessage: "Invalid URL: \(fileURL)") } - - let hybridRiveFile = HybridRiveFile() - hybridRiveFile.riveFile = riveFile - return hybridRiveFile - } catch let error as NSError { - throw RuntimeError.error(withMessage: "Failed to load Rive file: \(error.localizedDescription)") - } catch { - throw RuntimeError.error(withMessage: "Unknown error occurred while loading Rive file") - } - } + guard url.isFileURL else { + throw RuntimeError.error(withMessage: "fromFileURL: URL must be a file URL: \(fileURL)") + } + return url + }, + prepare: { url in try Data(contentsOf: url) }, + fileWithCustomAssetLoader: { (data, loader) in + try RiveFile(data: data, loadCdn: loadCdn, customAssetLoader: loader) + }, + file: { (data) in try RiveFile(data: data, loadCdn: loadCdn) }, + referencedAssets: referencedAssets + ) } - - func fromBytes(bytes: ArrayBufferHolder, loadCdn: Bool) throws -> Promise<(any HybridRiveFileSpec)> { - let data = bytes.toData(copyIfNeeded: false) - return Promise.async { - do { - let riveFile = try await withCheckedThrowingContinuation { continuation in - DispatchQueue.global(qos: .userInitiated).async { - do { - let riveFile = try RiveFile(data: data, loadCdn: loadCdn) - DispatchQueue.main.async { - continuation.resume(returning: riveFile) - } - } catch { - DispatchQueue.main.async { - continuation.resume(throwing: error) - } - } - } + + func fromResource(resource: String, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws + -> Promise<(any HybridRiveFileSpec)> + { + return try genericFrom( + check: { + guard Bundle.main.path(forResource: resource, ofType: "riv") != nil else { + throw RuntimeError.error(withMessage: "Could not find Rive file: \(resource).riv") } - - let hybridRiveFile = HybridRiveFile() - hybridRiveFile.riveFile = riveFile - return hybridRiveFile - } catch let error as NSError { - throw RuntimeError.error(withMessage: "Failed to load Rive file from bytes: \(error.localizedDescription)") - } catch { - throw RuntimeError.error(withMessage: "Unknown error occurred while loading Rive file from bytes") - } - } + return resource + }, + prepare: { $0 }, + fileWithCustomAssetLoader: { (resource, loader) in + try RiveFile(resource: resource, loadCdn: loadCdn, customAssetLoader: loader) + }, + file: { (resource) in try RiveFile(resource: resource, loadCdn: loadCdn) }, + referencedAssets: referencedAssets + ) + } + + func fromResource(resource: String, loadCdn: Bool) throws -> Promise<(any HybridRiveFileSpec)> { + return try fromResource(resource: resource, loadCdn: loadCdn, referencedAssets: nil) + } + + func fromBytes(bytes: ArrayBufferHolder, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) + throws -> Promise< + (any HybridRiveFileSpec) + > + { + return try genericFrom( + check: { bytes.toData(copyIfNeeded: false) }, + prepare: { $0 }, + fileWithCustomAssetLoader: { (data, loader) in + try RiveFile(data: data, loadCdn: loadCdn, customAssetLoader: loader) + }, + file: { (data) in try RiveFile(data: data, loadCdn: loadCdn) }, + referencedAssets: referencedAssets + ) } } diff --git a/ios/HybridRiveView.swift b/ios/HybridRiveView.swift index c3cabc05..c4abac0e 100644 --- a/ios/HybridRiveView.swift +++ b/ios/HybridRiveView.swift @@ -83,19 +83,21 @@ class HybridRiveView : HybridRiveViewSpec { // MARK: Update func afterUpdate() { - guard let file = (file as? HybridRiveFile)?.riveFile else { return } - + guard let hybridFile = file as? HybridRiveFile, + let file = hybridFile.riveFile else { return } + let config = ViewConfiguration( artboardName: artboardName, stateMachineName: stateMachineName, autoBind: autoBind ?? DefaultConfiguration.autoBind, autoPlay: autoPlay ?? DefaultConfiguration.autoPlay, riveFile: file, + viewSource: hybridFile, alignment: convertAlignment(alignment) ?? DefaultConfiguration.alignment, fit: convertFit(fit) ?? DefaultConfiguration.fit, layoutScaleFactor: layoutScaleFactor ?? DefaultConfiguration.layoutScaleFactor ) - + try? getRiveView().configure(config, reload: needsReload) needsReload = false } diff --git a/ios/RCTLog.swift b/ios/RCTLog.swift new file mode 100644 index 00000000..5065eb6d --- /dev/null +++ b/ios/RCTLog.swift @@ -0,0 +1,29 @@ +func RCTLogError(_ message: String, _ file: String=#file, _ line: UInt=#line) { + DispatchQueue.main.async { + RCTSwiftLog.error(message, file: file, line: line) + } +} + +func RCTLogWarn(_ message: String, _ file: String=#file, _ line: UInt=#line) { + DispatchQueue.main.async { + RCTSwiftLog.warn(message, file: file, line: line) + } +} + +func RCTLogInfo(_ message: String, _ file: String=#file, _ line: UInt=#line) { + DispatchQueue.main.async { + RCTSwiftLog.info(message, file: file, line: line) + } +} + +func RCTLog(_ message: String, _ file: String=#file, _ line: UInt=#line) { + DispatchQueue.main.async { + RCTSwiftLog.log(message, file: file, line: line) + } +} + +func RCTLogTrace(_ message: String, _ file: String=#file, _ line: UInt=#line) { + DispatchQueue.main.async { + RCTSwiftLog.trace(message, file: file, line: line) + } +} diff --git a/ios/RCTSwiftLog.h b/ios/RCTSwiftLog.h new file mode 100644 index 00000000..8f9deab7 --- /dev/null +++ b/ios/RCTSwiftLog.h @@ -0,0 +1,11 @@ +#import + +@interface RCTSwiftLog : NSObject + ++ (void)error:(NSString * _Nonnull)message file:(NSString * _Nonnull)file line:(NSUInteger)line; ++ (void)warn:(NSString * _Nonnull)message file:(NSString * _Nonnull)file line:(NSUInteger)line; ++ (void)info:(NSString * _Nonnull)message file:(NSString * _Nonnull)file line:(NSUInteger)line; ++ (void)log:(NSString * _Nonnull)message file:(NSString * _Nonnull)file line:(NSUInteger)line; ++ (void)trace:(NSString * _Nonnull)message file:(NSString * _Nonnull)file line:(NSUInteger)line; + +@end diff --git a/ios/RCTSwiftLog.m b/ios/RCTSwiftLog.m new file mode 100644 index 00000000..4f19b2e0 --- /dev/null +++ b/ios/RCTSwiftLog.m @@ -0,0 +1,38 @@ +// +// RCTSwiftLog.m +// +// +// + +#import + +#import "RCTSwiftLog.h" + +@implementation RCTSwiftLog + ++ (void)info:(NSString *)message file:(NSString *)file line:(NSUInteger)line +{ + _RCTLogNativeInternal(RCTLogLevelInfo, file.UTF8String, (int)line, @"%@", message); +} + ++ (void)warn:(NSString *)message file:(NSString *)file line:(NSUInteger)line +{ + _RCTLogNativeInternal(RCTLogLevelWarning, file.UTF8String, (int)line, @"%@", message); +} + ++ (void)error:(NSString *)message file:(NSString *)file line:(NSUInteger)line +{ + _RCTLogNativeInternal(RCTLogLevelError, file.UTF8String, (int)line, @"%@", message); +} + ++ (void)log:(NSString *)message file:(NSString *)file line:(NSUInteger)line +{ + _RCTLogNativeInternal(RCTLogLevelInfo, file.UTF8String, (int)line, @"%@", message); +} + ++ (void)trace:(NSString *)message file:(NSString *)file line:(NSUInteger)line +{ + _RCTLogNativeInternal(RCTLogLevelTrace, file.UTF8String, (int)line, @"%@", message); +} + +@end \ No newline at end of file diff --git a/ios/ReferencedAssetLoader.swift b/ios/ReferencedAssetLoader.swift new file mode 100644 index 00000000..0939a524 --- /dev/null +++ b/ios/ReferencedAssetLoader.swift @@ -0,0 +1,256 @@ +import NitroModules +import RiveRuntime + +struct FileAndCache { + var file: RiveFile + var cache: [String: RiveFileAsset] +} + +private func isValidUrl(_ url: String) -> Bool { + if let url = URL(string: url) { + return url.scheme == "file" || url.scheme == "http" || url.scheme == "https" + } else { + return false + } +} + +func createIncorrectRiveURL(_ url: String) -> NSError { + return NSError( + domain: RiveErrorDomain, code: 900, + userInfo: [ + NSLocalizedDescriptionKey: "Unable to download Rive file from: \(url)", + "name": "IncorrectRiveFileURL", + ]) +} + +func createAssetFileError(_ assetName: String) -> NSError { + return NSError( + domain: RiveErrorDomain, code: 801, + userInfo: [ + NSLocalizedDescriptionKey: "Could not load Rive asset: \(assetName)", "name": "FileNotFound", + ]) +} + +final class ReferencedAssetLoader { + private func handleRiveError(error: NSError) { + // TODO allow user to specify onError callback + RCTLogError(error.localizedDescription) + } + + private func handleInvalidUrlError(url: String) { + handleRiveError(error: createIncorrectRiveURL(url)) + } + + private func downloadUrlAsset( + url: String, listener: @escaping (Data) -> Void, onError: @escaping () -> Void + ) { + guard isValidUrl(url) else { + handleInvalidUrlError(url: url) + onError() + return + } + if let fileUrl = URL(string: url), fileUrl.scheme == "file" { + do { + let data = try Data(contentsOf: fileUrl) + listener(data) + } catch { + handleInvalidUrlError(url: url) + onError() + } + return + } + + let queue = URLSession.shared + guard let requestUrl = URL(string: url) else { + handleInvalidUrlError(url: url) + onError() + return + } + + let request = URLRequest(url: requestUrl) + let task = queue.dataTask(with: request) { [weak self] data, response, error in + if error != nil { + self?.handleInvalidUrlError(url: url) + onError() + } else if let data = data { + listener(data) + } else { + onError() + } + } + + task.resume() + } + + private func processAssetBytes( + _ data: Data, asset: RiveFileAsset, factory: RiveFactory, completion: @escaping () -> Void + ) { + if data.isEmpty == true { + completion() + return + } + DispatchQueue.global(qos: .background).async { + switch asset { + case let imageAsset as RiveImageAsset: + let decodedImage = factory.decodeImage(data) + DispatchQueue.main.async { + imageAsset.renderImage(decodedImage) + completion() + } + case let fontAsset as RiveFontAsset: + let decodedFont = factory.decodeFont(data) + DispatchQueue.main.async { + fontAsset.font(decodedFont) + completion() + } + case let audioAsset as RiveAudioAsset: + guard let decodedAudio = factory.decodeAudio(data) else { + DispatchQueue.main.async { + completion() + } + return + } + DispatchQueue.main.async { + audioAsset.audio(decodedAudio) + completion() + } + default: + DispatchQueue.main.async { + completion() + } + } + } + } + + private func handleSourceAssetId( + _ sourceAssetId: String, asset: RiveFileAsset, factory: RiveFactory, + completion: @escaping () -> Void + ) { + guard URL(string: sourceAssetId) != nil else { + completion() + return + } + + downloadUrlAsset( + url: sourceAssetId, + listener: { [weak self] data in + self?.processAssetBytes(data, asset: asset, factory: factory, completion: completion) + }, onError: completion) + } + + private func handleSourceUrl( + _ sourceUrl: String, asset: RiveFileAsset, factory: RiveFactory, + completion: @escaping () -> Void + ) { + downloadUrlAsset( + url: sourceUrl, + listener: { [weak self] data in + self?.processAssetBytes(data, asset: asset, factory: factory, completion: completion) + }, onError: completion) + } + + private func splitFileNameAndExtension(fileName: String) -> (name: String?, ext: String?)? { + let components = fileName.split(separator: ".") + let name = (fileName as NSString).deletingPathExtension + let fileExtension = (fileName as NSString).pathExtension + guard components.count == 2 else { return nil } + return (name: name, ext: fileExtension) + } + + private func loadResourceAsset( + sourceAsset: String, path: String?, listener: @escaping (Data) -> Void, + onError: @escaping () -> Void + ) { + guard let splitSourceAssetName = splitFileNameAndExtension(fileName: sourceAsset), + let name = splitSourceAssetName.name, + let ext = splitSourceAssetName.ext + else { + handleRiveError(error: createAssetFileError(sourceAsset)) + onError() + return + } + + guard let folderUrl = Bundle.main.url(forResource: name, withExtension: ext) else { + handleRiveError(error: createAssetFileError(sourceAsset)) + onError() + return + } + + DispatchQueue.global(qos: .background).async { [weak self] in + do { + let fileData = try Data(contentsOf: folderUrl) + DispatchQueue.main.async { + listener(fileData) + } + } catch { + DispatchQueue.main.async { + self?.handleRiveError(error: createAssetFileError(sourceAsset)) + onError() + } + } + } + } + + private func handleSourceAsset( + _ sourceAsset: String, path: String?, asset: RiveFileAsset, factory: RiveFactory, + completion: @escaping () -> Void + ) { + loadResourceAsset( + sourceAsset: sourceAsset, path: path, + listener: { [weak self] data in + self?.processAssetBytes(data, asset: asset, factory: factory, completion: completion) + }, onError: completion) + } + + private func loadAssetInternal( + source: ResolvedReferencedAsset, asset: RiveFileAsset, factory: RiveFactory, + completion: @escaping () -> Void + ) { + let sourceAssetId = source.sourceAssetId + let sourceUrl = source.sourceUrl + let sourceAsset = source.sourceAsset + + if let sourceAssetId = sourceAssetId { + handleSourceAssetId(sourceAssetId, asset: asset, factory: factory, completion: completion) + } else if let sourceUrl = sourceUrl { + handleSourceUrl(sourceUrl, asset: asset, factory: factory, completion: completion) + } else if let sourceAsset = sourceAsset { + handleSourceAsset( + sourceAsset, path: source.path, asset: asset, factory: factory, completion: completion) + } else { + completion() + } + } + + func loadAsset( + source: ResolvedReferencedAsset, asset: RiveFileAsset, factory: RiveFactory, + completion: @escaping () -> Void + ) { + loadAssetInternal(source: source, asset: asset, factory: factory, completion: completion) + } + + func createCustomLoader( + referencedAssets: ReferencedAssetsType?, cache: SendableRef, + factory factoryOut: SendableRef + ) + -> LoadAsset? + { + guard let referencedAssets = referencedAssets, let referencedAssets = referencedAssets.data + else { + return nil + } + return { (asset: RiveFileAsset, data: Data, factory: RiveFactory) -> Bool in + let assetByUniqueName = referencedAssets[asset.uniqueName()] + guard let assetData = assetByUniqueName ?? referencedAssets[asset.name()] else { + return false + } + + cache.value[asset.uniqueName()] = asset + factoryOut.value = factory + + self.loadAssetInternal(source: assetData, asset: asset, factory: factory, completion: {}) + + return true + } + } +} diff --git a/ios/RiveReactNativeView.swift b/ios/RiveReactNativeView.swift index f6ee5340..18a04acb 100644 --- a/ios/RiveReactNativeView.swift +++ b/ios/RiveReactNativeView.swift @@ -2,12 +2,18 @@ import UIKit import RiveRuntime import NitroModules +protocol RiveViewSource: AnyObject { + func registerView(_ view: RiveReactNativeView) + func unregisterView(_ view: RiveReactNativeView) +} + struct ViewConfiguration { let artboardName: String? let stateMachineName: String? let autoBind: Bool let autoPlay: Bool let riveFile: RiveFile + let viewSource: RiveViewSource? let alignment: RiveRuntime.RiveAlignment let fit: RiveRuntime.RiveFit let layoutScaleFactor: Double @@ -20,7 +26,8 @@ class RiveReactNativeView: UIView, RiveStateMachineDelegate { private var eventListeners: [(UnifiedRiveEvent) -> Void] = [] private var viewReadyContinuation: CheckedContinuation? private var isViewReady = false - + private weak var viewSource: RiveViewSource? + // MARK: Public Config Properties var autoPlay: Bool = true @@ -42,13 +49,18 @@ class RiveReactNativeView: UIView, RiveStateMachineDelegate { let model = RiveModel(riveFile: config.riveFile) baseViewModel = RiveViewModel(model, autoPlay: config.autoPlay) createViewFromViewModel() + + if let viewSource = config.viewSource { + self.viewSource = viewSource + viewSource.registerView(self) + } } - + baseViewModel?.alignment = config.alignment baseViewModel?.fit = config.fit baseViewModel?.autoPlay = config.autoPlay baseViewModel?.layoutScaleFactor = config.layoutScaleFactor - + if !isViewReady { isViewReady = true viewReadyContinuation?.resume() @@ -67,7 +79,13 @@ class RiveReactNativeView: UIView, RiveStateMachineDelegate { func pause() { baseViewModel?.pause() } - + + func refreshAfterAssetChange() { + if baseViewModel?.isPlaying == false { + baseViewModel?.play() + } + } + func addEventListener(_ onEvent: @escaping (UnifiedRiveEvent) -> Void) { eventListeners.append(onEvent) } @@ -157,6 +175,10 @@ class RiveReactNativeView: UIView, RiveStateMachineDelegate { riveView?.stateMachineDelegate = nil riveView = nil baseViewModel = nil + if let viewSource = viewSource { + viewSource.unregisterView(self) + self.viewSource = nil + } } @objc func onRiveEventReceived(onRiveEvent riveEvent: RiveRuntime.RiveEvent) { diff --git a/ios/Utils.swift b/ios/Utils.swift new file mode 100644 index 00000000..ad8ed6a8 --- /dev/null +++ b/ios/Utils.swift @@ -0,0 +1,15 @@ +final class Weak { + weak var value: T? + + init(_ value: T) { + self.value = value + } +} + +final class SendableRef: @unchecked Sendable { + var value: T + + init(_ value: T) { + self.value = value + } +} diff --git a/jest-setup.js b/jest-setup.js new file mode 100644 index 00000000..9883d1cd --- /dev/null +++ b/jest-setup.js @@ -0,0 +1,20 @@ +/* global jest */ +const mockRiveFileFactory = { + fromURL: jest.fn(), + fromResource: jest.fn(), + fromSource: jest.fn(), + fromBytes: jest.fn(), +}; + +jest.mock('react-native-nitro-modules', () => ({ + NitroModules: { + createHybridObject: jest.fn(() => mockRiveFileFactory), + }, + getHostComponent: jest.fn(() => 'RiveView'), +})); + +jest.mock('./nitrogen/generated/shared/json/RiveViewConfig.json', () => ({}), { + virtual: true, +}); + +global.mockRiveFileFactory = mockRiveFileFactory; diff --git a/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.cpp b/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.cpp index 2e214051..b77851e2 100644 --- a/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.cpp +++ b/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.cpp @@ -9,6 +9,10 @@ // Forward declaration of `HybridRiveFileSpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridRiveFileSpec; } +// Forward declaration of `ReferencedAssetsType` to properly resolve imports. +namespace margelo::nitro::rive { struct ReferencedAssetsType; } +// Forward declaration of `ResolvedReferencedAsset` to properly resolve imports. +namespace margelo::nitro::rive { struct ResolvedReferencedAsset; } #include #include "HybridRiveFileSpec.hpp" @@ -16,6 +20,12 @@ namespace margelo::nitro::rive { class HybridRiveFileSpec; } #include #include "JHybridRiveFileSpec.hpp" #include +#include "ReferencedAssetsType.hpp" +#include +#include "JReferencedAssetsType.hpp" +#include "ResolvedReferencedAsset.hpp" +#include +#include "JResolvedReferencedAsset.hpp" #include #include #include @@ -52,9 +62,9 @@ namespace margelo::nitro::rive { // Methods - std::shared_ptr>> JHybridRiveFileFactorySpec::fromURL(const std::string& url, bool loadCdn) { - static const auto method = javaClassStatic()->getMethod(jni::alias_ref /* url */, jboolean /* loadCdn */)>("fromURL"); - auto __result = method(_javaPart, jni::make_jstring(url), loadCdn); + std::shared_ptr>> JHybridRiveFileFactorySpec::fromURL(const std::string& url, bool loadCdn, const std::optional& referencedAssets) { + static const auto method = javaClassStatic()->getMethod(jni::alias_ref /* url */, jboolean /* loadCdn */, jni::alias_ref /* referencedAssets */)>("fromURL"); + auto __result = method(_javaPart, jni::make_jstring(url), loadCdn, referencedAssets.has_value() ? JReferencedAssetsType::fromCpp(referencedAssets.value()) : nullptr); return [&]() { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { @@ -68,9 +78,9 @@ namespace margelo::nitro::rive { return __promise; }(); } - std::shared_ptr>> JHybridRiveFileFactorySpec::fromFileURL(const std::string& fileURL, bool loadCdn) { - static const auto method = javaClassStatic()->getMethod(jni::alias_ref /* fileURL */, jboolean /* loadCdn */)>("fromFileURL"); - auto __result = method(_javaPart, jni::make_jstring(fileURL), loadCdn); + std::shared_ptr>> JHybridRiveFileFactorySpec::fromFileURL(const std::string& fileURL, bool loadCdn, const std::optional& referencedAssets) { + static const auto method = javaClassStatic()->getMethod(jni::alias_ref /* fileURL */, jboolean /* loadCdn */, jni::alias_ref /* referencedAssets */)>("fromFileURL"); + auto __result = method(_javaPart, jni::make_jstring(fileURL), loadCdn, referencedAssets.has_value() ? JReferencedAssetsType::fromCpp(referencedAssets.value()) : nullptr); return [&]() { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { @@ -84,9 +94,9 @@ namespace margelo::nitro::rive { return __promise; }(); } - std::shared_ptr>> JHybridRiveFileFactorySpec::fromResource(const std::string& resource, bool loadCdn) { - static const auto method = javaClassStatic()->getMethod(jni::alias_ref /* resource */, jboolean /* loadCdn */)>("fromResource"); - auto __result = method(_javaPart, jni::make_jstring(resource), loadCdn); + std::shared_ptr>> JHybridRiveFileFactorySpec::fromResource(const std::string& resource, bool loadCdn, const std::optional& referencedAssets) { + static const auto method = javaClassStatic()->getMethod(jni::alias_ref /* resource */, jboolean /* loadCdn */, jni::alias_ref /* referencedAssets */)>("fromResource"); + auto __result = method(_javaPart, jni::make_jstring(resource), loadCdn, referencedAssets.has_value() ? JReferencedAssetsType::fromCpp(referencedAssets.value()) : nullptr); return [&]() { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { @@ -100,9 +110,9 @@ namespace margelo::nitro::rive { return __promise; }(); } - std::shared_ptr>> JHybridRiveFileFactorySpec::fromBytes(const std::shared_ptr& bytes, bool loadCdn) { - static const auto method = javaClassStatic()->getMethod(jni::alias_ref /* bytes */, jboolean /* loadCdn */)>("fromBytes"); - auto __result = method(_javaPart, JArrayBuffer::wrap(bytes), loadCdn); + std::shared_ptr>> JHybridRiveFileFactorySpec::fromBytes(const std::shared_ptr& bytes, bool loadCdn, const std::optional& referencedAssets) { + static const auto method = javaClassStatic()->getMethod(jni::alias_ref /* bytes */, jboolean /* loadCdn */, jni::alias_ref /* referencedAssets */)>("fromBytes"); + auto __result = method(_javaPart, JArrayBuffer::wrap(bytes), loadCdn, referencedAssets.has_value() ? JReferencedAssetsType::fromCpp(referencedAssets.value()) : nullptr); return [&]() { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { diff --git a/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.hpp b/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.hpp index 63f95a3e..1e71e1a0 100644 --- a/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.hpp @@ -54,10 +54,10 @@ namespace margelo::nitro::rive { public: // Methods - std::shared_ptr>> fromURL(const std::string& url, bool loadCdn) override; - std::shared_ptr>> fromFileURL(const std::string& fileURL, bool loadCdn) override; - std::shared_ptr>> fromResource(const std::string& resource, bool loadCdn) override; - std::shared_ptr>> fromBytes(const std::shared_ptr& bytes, bool loadCdn) override; + std::shared_ptr>> fromURL(const std::string& url, bool loadCdn, const std::optional& referencedAssets) override; + std::shared_ptr>> fromFileURL(const std::string& fileURL, bool loadCdn, const std::optional& referencedAssets) override; + std::shared_ptr>> fromResource(const std::string& resource, bool loadCdn, const std::optional& referencedAssets) override; + std::shared_ptr>> fromBytes(const std::shared_ptr& bytes, bool loadCdn, const std::optional& referencedAssets) override; private: friend HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridRiveFileSpec.cpp b/nitrogen/generated/android/c++/JHybridRiveFileSpec.cpp index dc839e84..c9470562 100644 --- a/nitrogen/generated/android/c++/JHybridRiveFileSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridRiveFileSpec.cpp @@ -13,6 +13,10 @@ namespace margelo::nitro::rive { class HybridViewModelSpec; } namespace margelo::nitro::rive { struct ArtboardBy; } // Forward declaration of `ArtboardByTypes` to properly resolve imports. namespace margelo::nitro::rive { enum class ArtboardByTypes; } +// Forward declaration of `ReferencedAssetsType` to properly resolve imports. +namespace margelo::nitro::rive { struct ReferencedAssetsType; } +// Forward declaration of `ResolvedReferencedAsset` to properly resolve imports. +namespace margelo::nitro::rive { struct ResolvedReferencedAsset; } #include #include @@ -23,6 +27,11 @@ namespace margelo::nitro::rive { enum class ArtboardByTypes; } #include "JArtboardBy.hpp" #include "ArtboardByTypes.hpp" #include "JArtboardByTypes.hpp" +#include "ReferencedAssetsType.hpp" +#include "JReferencedAssetsType.hpp" +#include "ResolvedReferencedAsset.hpp" +#include +#include "JResolvedReferencedAsset.hpp" namespace margelo::nitro::rive { @@ -79,5 +88,9 @@ namespace margelo::nitro::rive { static const auto method = javaClassStatic()->getMethod("release"); method(_javaPart); } + void JHybridRiveFileSpec::updateReferencedAssets(const ReferencedAssetsType& referencedAssets) { + static const auto method = javaClassStatic()->getMethod /* referencedAssets */)>("updateReferencedAssets"); + method(_javaPart, JReferencedAssetsType::fromCpp(referencedAssets)); + } } // namespace margelo::nitro::rive diff --git a/nitrogen/generated/android/c++/JHybridRiveFileSpec.hpp b/nitrogen/generated/android/c++/JHybridRiveFileSpec.hpp index 16d211f0..a64a62d7 100644 --- a/nitrogen/generated/android/c++/JHybridRiveFileSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveFileSpec.hpp @@ -58,6 +58,7 @@ namespace margelo::nitro::rive { std::optional> viewModelByName(const std::string& name) override; std::optional> defaultArtboardViewModel(const std::optional& artboardBy) override; void release() override; + void updateReferencedAssets(const ReferencedAssetsType& referencedAssets) override; private: friend HybridBase; diff --git a/nitrogen/generated/android/c++/JReferencedAssetsType.hpp b/nitrogen/generated/android/c++/JReferencedAssetsType.hpp new file mode 100644 index 00000000..560c496b --- /dev/null +++ b/nitrogen/generated/android/c++/JReferencedAssetsType.hpp @@ -0,0 +1,74 @@ +/// +/// JReferencedAssetsType.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "ReferencedAssetsType.hpp" + +#include "JResolvedReferencedAsset.hpp" +#include "ResolvedReferencedAsset.hpp" +#include +#include +#include + +namespace margelo::nitro::rive { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ struct "ReferencedAssetsType" and the the Kotlin data class "ReferencedAssetsType". + */ + struct JReferencedAssetsType final: public jni::JavaClass { + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ReferencedAssetsType;"; + + public: + /** + * Convert this Java/Kotlin-based struct to the C++ struct ReferencedAssetsType by copying all values to C++. + */ + [[maybe_unused]] + [[nodiscard]] + ReferencedAssetsType toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldData = clazz->getField>("data"); + jni::local_ref> data = this->getFieldValue(fieldData); + return ReferencedAssetsType( + data != nullptr ? std::make_optional([&]() { + std::unordered_map __map; + __map.reserve(data->size()); + for (const auto& __entry : *data) { + __map.emplace(__entry.first->toStdString(), __entry.second->toCpp()); + } + return __map; + }()) : std::nullopt + ); + } + + public: + /** + * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java. + */ + [[maybe_unused]] + static jni::local_ref fromCpp(const ReferencedAssetsType& value) { + using JSignature = JReferencedAssetsType(jni::alias_ref>); + static const auto clazz = javaClassStatic(); + static const auto create = clazz->getStaticMethod("fromCpp"); + return create( + clazz, + value.data.has_value() ? [&]() -> jni::local_ref> { + auto __map = jni::JHashMap::create(value.data.value().size()); + for (const auto& __entry : value.data.value()) { + __map->put(jni::make_jstring(__entry.first), JResolvedReferencedAsset::fromCpp(__entry.second)); + } + return __map; + }() : nullptr + ); + } + }; + +} // namespace margelo::nitro::rive diff --git a/nitrogen/generated/android/c++/JResolvedReferencedAsset.hpp b/nitrogen/generated/android/c++/JResolvedReferencedAsset.hpp new file mode 100644 index 00000000..181a27ba --- /dev/null +++ b/nitrogen/generated/android/c++/JResolvedReferencedAsset.hpp @@ -0,0 +1,70 @@ +/// +/// JResolvedReferencedAsset.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "ResolvedReferencedAsset.hpp" + +#include +#include + +namespace margelo::nitro::rive { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ struct "ResolvedReferencedAsset" and the the Kotlin data class "ResolvedReferencedAsset". + */ + struct JResolvedReferencedAsset final: public jni::JavaClass { + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ResolvedReferencedAsset;"; + + public: + /** + * Convert this Java/Kotlin-based struct to the C++ struct ResolvedReferencedAsset by copying all values to C++. + */ + [[maybe_unused]] + [[nodiscard]] + ResolvedReferencedAsset toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldSourceUrl = clazz->getField("sourceUrl"); + jni::local_ref sourceUrl = this->getFieldValue(fieldSourceUrl); + static const auto fieldSourceAsset = clazz->getField("sourceAsset"); + jni::local_ref sourceAsset = this->getFieldValue(fieldSourceAsset); + static const auto fieldSourceAssetId = clazz->getField("sourceAssetId"); + jni::local_ref sourceAssetId = this->getFieldValue(fieldSourceAssetId); + static const auto fieldPath = clazz->getField("path"); + jni::local_ref path = this->getFieldValue(fieldPath); + return ResolvedReferencedAsset( + sourceUrl != nullptr ? std::make_optional(sourceUrl->toStdString()) : std::nullopt, + sourceAsset != nullptr ? std::make_optional(sourceAsset->toStdString()) : std::nullopt, + sourceAssetId != nullptr ? std::make_optional(sourceAssetId->toStdString()) : std::nullopt, + path != nullptr ? std::make_optional(path->toStdString()) : std::nullopt + ); + } + + public: + /** + * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java. + */ + [[maybe_unused]] + static jni::local_ref fromCpp(const ResolvedReferencedAsset& value) { + using JSignature = JResolvedReferencedAsset(jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref); + static const auto clazz = javaClassStatic(); + static const auto create = clazz->getStaticMethod("fromCpp"); + return create( + clazz, + value.sourceUrl.has_value() ? jni::make_jstring(value.sourceUrl.value()) : nullptr, + value.sourceAsset.has_value() ? jni::make_jstring(value.sourceAsset.value()) : nullptr, + value.sourceAssetId.has_value() ? jni::make_jstring(value.sourceAssetId.value()) : nullptr, + value.path.has_value() ? jni::make_jstring(value.path.value()) : nullptr + ); + } + }; + +} // namespace margelo::nitro::rive diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileFactorySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileFactorySpec.kt index a8c24d52..36568914 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileFactorySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileFactorySpec.kt @@ -49,19 +49,19 @@ abstract class HybridRiveFileFactorySpec: HybridObject() { // Methods @DoNotStrip @Keep - abstract fun fromURL(url: String, loadCdn: Boolean): Promise + abstract fun fromURL(url: String, loadCdn: Boolean, referencedAssets: ReferencedAssetsType?): Promise @DoNotStrip @Keep - abstract fun fromFileURL(fileURL: String, loadCdn: Boolean): Promise + abstract fun fromFileURL(fileURL: String, loadCdn: Boolean, referencedAssets: ReferencedAssetsType?): Promise @DoNotStrip @Keep - abstract fun fromResource(resource: String, loadCdn: Boolean): Promise + abstract fun fromResource(resource: String, loadCdn: Boolean, referencedAssets: ReferencedAssetsType?): Promise @DoNotStrip @Keep - abstract fun fromBytes(bytes: ArrayBuffer, loadCdn: Boolean): Promise + abstract fun fromBytes(bytes: ArrayBuffer, loadCdn: Boolean, referencedAssets: ReferencedAssetsType?): Promise private external fun initHybrid(): HybridData diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileSpec.kt index c87729ec..03f89d8d 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileSpec.kt @@ -62,6 +62,10 @@ abstract class HybridRiveFileSpec: HybridObject() { @DoNotStrip @Keep abstract fun release(): Unit + + @DoNotStrip + @Keep + abstract fun updateReferencedAssets(referencedAssets: ReferencedAssetsType): Unit private external fun initHybrid(): HybridData diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ReferencedAssetsType.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ReferencedAssetsType.kt new file mode 100644 index 00000000..651c7692 --- /dev/null +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ReferencedAssetsType.kt @@ -0,0 +1,38 @@ +/// +/// ReferencedAssetsType.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.rive + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip + + +/** + * Represents the JavaScript object/struct "ReferencedAssetsType". + */ +@DoNotStrip +@Keep +data class ReferencedAssetsType( + @DoNotStrip + @Keep + val data: Map? +) { + /* primary constructor */ + + private companion object { + /** + * Constructor called from C++ + */ + @DoNotStrip + @Keep + @Suppress("unused") + @JvmStatic + private fun fromCpp(data: Map?): ReferencedAssetsType { + return ReferencedAssetsType(data) + } + } +} diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ResolvedReferencedAsset.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ResolvedReferencedAsset.kt new file mode 100644 index 00000000..1ac8fa33 --- /dev/null +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ResolvedReferencedAsset.kt @@ -0,0 +1,47 @@ +/// +/// ResolvedReferencedAsset.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.rive + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip + + +/** + * Represents the JavaScript object/struct "ResolvedReferencedAsset". + */ +@DoNotStrip +@Keep +data class ResolvedReferencedAsset( + @DoNotStrip + @Keep + val sourceUrl: String?, + @DoNotStrip + @Keep + val sourceAsset: String?, + @DoNotStrip + @Keep + val sourceAssetId: String?, + @DoNotStrip + @Keep + val path: String? +) { + /* primary constructor */ + + private companion object { + /** + * Constructor called from C++ + */ + @DoNotStrip + @Keep + @Suppress("unused") + @JvmStatic + private fun fromCpp(sourceUrl: String?, sourceAsset: String?, sourceAssetId: String?, path: String?): ResolvedReferencedAsset { + return ResolvedReferencedAsset(sourceUrl, sourceAsset, sourceAssetId, path) + } + } +} diff --git a/nitrogen/generated/ios/Rive-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/Rive-Swift-Cxx-Bridge.hpp index 0491a7a5..fbda282f 100644 --- a/nitrogen/generated/ios/Rive-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/Rive-Swift-Cxx-Bridge.hpp @@ -42,6 +42,10 @@ namespace margelo::nitro::rive { class HybridViewModelSpec; } namespace margelo::nitro::rive { class HybridViewModelStringPropertySpec; } // Forward declaration of `HybridViewModelTriggerPropertySpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridViewModelTriggerPropertySpec; } +// Forward declaration of `ReferencedAssetsType` to properly resolve imports. +namespace margelo::nitro::rive { struct ReferencedAssetsType; } +// Forward declaration of `ResolvedReferencedAsset` to properly resolve imports. +namespace margelo::nitro::rive { struct ResolvedReferencedAsset; } // Forward declaration of `RiveEventType` to properly resolve imports. namespace margelo::nitro::rive { enum class RiveEventType; } // Forward declaration of `UnifiedRiveEvent` to properly resolve imports. @@ -93,6 +97,8 @@ namespace Rive { class HybridViewModelTriggerPropertySpec_cxx; } #include "HybridViewModelSpec.hpp" #include "HybridViewModelStringPropertySpec.hpp" #include "HybridViewModelTriggerPropertySpec.hpp" +#include "ReferencedAssetsType.hpp" +#include "ResolvedReferencedAsset.hpp" #include "RiveEventType.hpp" #include "UnifiedRiveEvent.hpp" #include @@ -205,6 +211,46 @@ namespace margelo::nitro::rive::bridge::swift { return *optional; } + // pragma MARK: std::unordered_map + /** + * Specialized version of `std::unordered_map`. + */ + using std__unordered_map_std__string__ResolvedReferencedAsset_ = std::unordered_map; + inline std::unordered_map create_std__unordered_map_std__string__ResolvedReferencedAsset_(size_t size) noexcept { + std::unordered_map map; + map.reserve(size); + return map; + } + inline std::vector get_std__unordered_map_std__string__ResolvedReferencedAsset__keys(const std__unordered_map_std__string__ResolvedReferencedAsset_& map) noexcept { + std::vector keys; + keys.reserve(map.size()); + for (const auto& entry : map) { + keys.push_back(entry.first); + } + return keys; + } + inline ResolvedReferencedAsset get_std__unordered_map_std__string__ResolvedReferencedAsset__value(const std__unordered_map_std__string__ResolvedReferencedAsset_& map, const std::string& key) noexcept { + return map.find(key)->second; + } + inline void emplace_std__unordered_map_std__string__ResolvedReferencedAsset_(std__unordered_map_std__string__ResolvedReferencedAsset_& map, const std::string& key, const ResolvedReferencedAsset& value) noexcept { + map.emplace(key, value); + } + + // pragma MARK: std::optional> + /** + * Specialized version of `std::optional>`. + */ + using std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__ = std::optional>; + inline std::optional> create_std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__(const std::unordered_map& value) noexcept { + return std::optional>(value); + } + inline bool has_value_std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__(const std::optional>& optional) noexcept { + return optional.has_value(); + } + inline std::unordered_map get_std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__(const std::optional>& optional) noexcept { + return *optional; + } + // pragma MARK: std::shared_ptr /** * Specialized version of `std::shared_ptr`. @@ -291,6 +337,21 @@ namespace margelo::nitro::rive::bridge::swift { return Func_void_std__exception_ptr_Wrapper(std::move(value)); } + // pragma MARK: std::optional + /** + * Specialized version of `std::optional`. + */ + using std__optional_ReferencedAssetsType_ = std::optional; + inline std::optional create_std__optional_ReferencedAssetsType_(const ReferencedAssetsType& value) noexcept { + return std::optional(value); + } + inline bool has_value_std__optional_ReferencedAssetsType_(const std::optional& optional) noexcept { + return optional.has_value(); + } + inline ReferencedAssetsType get_std__optional_ReferencedAssetsType_(const std::optional& optional) noexcept { + return *optional; + } + // pragma MARK: std::shared_ptr /** * Specialized version of `std::shared_ptr`. diff --git a/nitrogen/generated/ios/Rive-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/Rive-Swift-Cxx-Umbrella.hpp index 92fc9cb3..b56d547e 100644 --- a/nitrogen/generated/ios/Rive-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/Rive-Swift-Cxx-Umbrella.hpp @@ -42,6 +42,10 @@ namespace margelo::nitro::rive { class HybridViewModelSpec; } namespace margelo::nitro::rive { class HybridViewModelStringPropertySpec; } // Forward declaration of `HybridViewModelTriggerPropertySpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridViewModelTriggerPropertySpec; } +// Forward declaration of `ReferencedAssetsType` to properly resolve imports. +namespace margelo::nitro::rive { struct ReferencedAssetsType; } +// Forward declaration of `ResolvedReferencedAsset` to properly resolve imports. +namespace margelo::nitro::rive { struct ResolvedReferencedAsset; } // Forward declaration of `RiveEventType` to properly resolve imports. namespace margelo::nitro::rive { enum class RiveEventType; } // Forward declaration of `UnifiedRiveEvent` to properly resolve imports. @@ -65,6 +69,8 @@ namespace margelo::nitro::rive { struct UnifiedRiveEvent; } #include "HybridViewModelSpec.hpp" #include "HybridViewModelStringPropertySpec.hpp" #include "HybridViewModelTriggerPropertySpec.hpp" +#include "ReferencedAssetsType.hpp" +#include "ResolvedReferencedAsset.hpp" #include "RiveEventType.hpp" #include "UnifiedRiveEvent.hpp" #include diff --git a/nitrogen/generated/ios/c++/HybridRiveFileFactorySpecSwift.hpp b/nitrogen/generated/ios/c++/HybridRiveFileFactorySpecSwift.hpp index ea715f39..098ab3ea 100644 --- a/nitrogen/generated/ios/c++/HybridRiveFileFactorySpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridRiveFileFactorySpecSwift.hpp @@ -14,6 +14,10 @@ namespace Rive { class HybridRiveFileFactorySpec_cxx; } // Forward declaration of `HybridRiveFileSpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridRiveFileSpec; } +// Forward declaration of `ReferencedAssetsType` to properly resolve imports. +namespace margelo::nitro::rive { struct ReferencedAssetsType; } +// Forward declaration of `ResolvedReferencedAsset` to properly resolve imports. +namespace margelo::nitro::rive { struct ResolvedReferencedAsset; } // Forward declaration of `ArrayBufferHolder` to properly resolve imports. namespace NitroModules { class ArrayBufferHolder; } @@ -21,6 +25,10 @@ namespace NitroModules { class ArrayBufferHolder; } #include "HybridRiveFileSpec.hpp" #include #include +#include "ReferencedAssetsType.hpp" +#include +#include "ResolvedReferencedAsset.hpp" +#include #include #include @@ -68,32 +76,32 @@ namespace margelo::nitro::rive { public: // Methods - inline std::shared_ptr>> fromURL(const std::string& url, bool loadCdn) override { - auto __result = _swiftPart.fromURL(url, std::forward(loadCdn)); + inline std::shared_ptr>> fromURL(const std::string& url, bool loadCdn, const std::optional& referencedAssets) override { + auto __result = _swiftPart.fromURL(url, std::forward(loadCdn), referencedAssets); if (__result.hasError()) [[unlikely]] { std::rethrow_exception(__result.error()); } auto __value = std::move(__result.value()); return __value; } - inline std::shared_ptr>> fromFileURL(const std::string& fileURL, bool loadCdn) override { - auto __result = _swiftPart.fromFileURL(fileURL, std::forward(loadCdn)); + inline std::shared_ptr>> fromFileURL(const std::string& fileURL, bool loadCdn, const std::optional& referencedAssets) override { + auto __result = _swiftPart.fromFileURL(fileURL, std::forward(loadCdn), referencedAssets); if (__result.hasError()) [[unlikely]] { std::rethrow_exception(__result.error()); } auto __value = std::move(__result.value()); return __value; } - inline std::shared_ptr>> fromResource(const std::string& resource, bool loadCdn) override { - auto __result = _swiftPart.fromResource(resource, std::forward(loadCdn)); + inline std::shared_ptr>> fromResource(const std::string& resource, bool loadCdn, const std::optional& referencedAssets) override { + auto __result = _swiftPart.fromResource(resource, std::forward(loadCdn), referencedAssets); if (__result.hasError()) [[unlikely]] { std::rethrow_exception(__result.error()); } auto __value = std::move(__result.value()); return __value; } - inline std::shared_ptr>> fromBytes(const std::shared_ptr& bytes, bool loadCdn) override { - auto __result = _swiftPart.fromBytes(ArrayBufferHolder(bytes), std::forward(loadCdn)); + inline std::shared_ptr>> fromBytes(const std::shared_ptr& bytes, bool loadCdn, const std::optional& referencedAssets) override { + auto __result = _swiftPart.fromBytes(ArrayBufferHolder(bytes), std::forward(loadCdn), referencedAssets); if (__result.hasError()) [[unlikely]] { std::rethrow_exception(__result.error()); } diff --git a/nitrogen/generated/ios/c++/HybridRiveFileSpecSwift.hpp b/nitrogen/generated/ios/c++/HybridRiveFileSpecSwift.hpp index 48d1b295..e2dae7ae 100644 --- a/nitrogen/generated/ios/c++/HybridRiveFileSpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridRiveFileSpecSwift.hpp @@ -18,6 +18,10 @@ namespace margelo::nitro::rive { class HybridViewModelSpec; } namespace margelo::nitro::rive { struct ArtboardBy; } // Forward declaration of `ArtboardByTypes` to properly resolve imports. namespace margelo::nitro::rive { enum class ArtboardByTypes; } +// Forward declaration of `ReferencedAssetsType` to properly resolve imports. +namespace margelo::nitro::rive { struct ReferencedAssetsType; } +// Forward declaration of `ResolvedReferencedAsset` to properly resolve imports. +namespace margelo::nitro::rive { struct ResolvedReferencedAsset; } #include #include @@ -25,6 +29,9 @@ namespace margelo::nitro::rive { enum class ArtboardByTypes; } #include #include "ArtboardBy.hpp" #include "ArtboardByTypes.hpp" +#include "ReferencedAssetsType.hpp" +#include "ResolvedReferencedAsset.hpp" +#include #include "Rive-Swift-Cxx-Umbrella.hpp" @@ -103,6 +110,12 @@ namespace margelo::nitro::rive { std::rethrow_exception(__result.error()); } } + inline void updateReferencedAssets(const ReferencedAssetsType& referencedAssets) override { + auto __result = _swiftPart.updateReferencedAssets(std::forward(referencedAssets)); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + } private: Rive::HybridRiveFileSpec_cxx _swiftPart; diff --git a/nitrogen/generated/ios/swift/HybridRiveFileFactorySpec.swift b/nitrogen/generated/ios/swift/HybridRiveFileFactorySpec.swift index c944d7c8..0364fea8 100644 --- a/nitrogen/generated/ios/swift/HybridRiveFileFactorySpec.swift +++ b/nitrogen/generated/ios/swift/HybridRiveFileFactorySpec.swift @@ -15,10 +15,10 @@ public protocol HybridRiveFileFactorySpec_protocol: HybridObject { // Methods - func fromURL(url: String, loadCdn: Bool) throws -> Promise<(any HybridRiveFileSpec)> - func fromFileURL(fileURL: String, loadCdn: Bool) throws -> Promise<(any HybridRiveFileSpec)> - func fromResource(resource: String, loadCdn: Bool) throws -> Promise<(any HybridRiveFileSpec)> - func fromBytes(bytes: ArrayBuffer, loadCdn: Bool) throws -> Promise<(any HybridRiveFileSpec)> + func fromURL(url: String, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws -> Promise<(any HybridRiveFileSpec)> + func fromFileURL(fileURL: String, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws -> Promise<(any HybridRiveFileSpec)> + func fromResource(resource: String, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws -> Promise<(any HybridRiveFileSpec)> + func fromBytes(bytes: ArrayBuffer, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws -> Promise<(any HybridRiveFileSpec)> } public extension HybridRiveFileFactorySpec_protocol { diff --git a/nitrogen/generated/ios/swift/HybridRiveFileFactorySpec_cxx.swift b/nitrogen/generated/ios/swift/HybridRiveFileFactorySpec_cxx.swift index f08a5d25..7a1fd7df 100644 --- a/nitrogen/generated/ios/swift/HybridRiveFileFactorySpec_cxx.swift +++ b/nitrogen/generated/ios/swift/HybridRiveFileFactorySpec_cxx.swift @@ -119,9 +119,9 @@ open class HybridRiveFileFactorySpec_cxx { // Methods @inline(__always) - public final func fromURL(url: std.string, loadCdn: Bool) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec____ { + public final func fromURL(url: std.string, loadCdn: Bool, referencedAssets: bridge.std__optional_ReferencedAssetsType_) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec____ { do { - let __result = try self.__implementation.fromURL(url: String(url), loadCdn: loadCdn) + let __result = try self.__implementation.fromURL(url: String(url), loadCdn: loadCdn, referencedAssets: referencedAssets.value) let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___ in let __promise = bridge.create_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___() let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___(__promise) @@ -141,9 +141,9 @@ open class HybridRiveFileFactorySpec_cxx { } @inline(__always) - public final func fromFileURL(fileURL: std.string, loadCdn: Bool) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec____ { + public final func fromFileURL(fileURL: std.string, loadCdn: Bool, referencedAssets: bridge.std__optional_ReferencedAssetsType_) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec____ { do { - let __result = try self.__implementation.fromFileURL(fileURL: String(fileURL), loadCdn: loadCdn) + let __result = try self.__implementation.fromFileURL(fileURL: String(fileURL), loadCdn: loadCdn, referencedAssets: referencedAssets.value) let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___ in let __promise = bridge.create_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___() let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___(__promise) @@ -163,9 +163,9 @@ open class HybridRiveFileFactorySpec_cxx { } @inline(__always) - public final func fromResource(resource: std.string, loadCdn: Bool) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec____ { + public final func fromResource(resource: std.string, loadCdn: Bool, referencedAssets: bridge.std__optional_ReferencedAssetsType_) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec____ { do { - let __result = try self.__implementation.fromResource(resource: String(resource), loadCdn: loadCdn) + let __result = try self.__implementation.fromResource(resource: String(resource), loadCdn: loadCdn, referencedAssets: referencedAssets.value) let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___ in let __promise = bridge.create_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___() let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___(__promise) @@ -185,9 +185,9 @@ open class HybridRiveFileFactorySpec_cxx { } @inline(__always) - public final func fromBytes(bytes: ArrayBuffer, loadCdn: Bool) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec____ { + public final func fromBytes(bytes: ArrayBuffer, loadCdn: Bool, referencedAssets: bridge.std__optional_ReferencedAssetsType_) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec____ { do { - let __result = try self.__implementation.fromBytes(bytes: bytes, loadCdn: loadCdn) + let __result = try self.__implementation.fromBytes(bytes: bytes, loadCdn: loadCdn, referencedAssets: referencedAssets.value) let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___ in let __promise = bridge.create_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___() let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__shared_ptr_HybridRiveFileSpec___(__promise) diff --git a/nitrogen/generated/ios/swift/HybridRiveFileSpec.swift b/nitrogen/generated/ios/swift/HybridRiveFileSpec.swift index d6b3f16e..d5f652ca 100644 --- a/nitrogen/generated/ios/swift/HybridRiveFileSpec.swift +++ b/nitrogen/generated/ios/swift/HybridRiveFileSpec.swift @@ -18,6 +18,7 @@ public protocol HybridRiveFileSpec_protocol: HybridObject { func viewModelByName(name: String) throws -> (any HybridViewModelSpec)? func defaultArtboardViewModel(artboardBy: ArtboardBy?) throws -> (any HybridViewModelSpec)? func release() throws -> Void + func updateReferencedAssets(referencedAssets: ReferencedAssetsType) throws -> Void } public extension HybridRiveFileSpec_protocol { diff --git a/nitrogen/generated/ios/swift/HybridRiveFileSpec_cxx.swift b/nitrogen/generated/ios/swift/HybridRiveFileSpec_cxx.swift index 456ee101..210149f4 100644 --- a/nitrogen/generated/ios/swift/HybridRiveFileSpec_cxx.swift +++ b/nitrogen/generated/ios/swift/HybridRiveFileSpec_cxx.swift @@ -201,4 +201,15 @@ open class HybridRiveFileSpec_cxx { return bridge.create_Result_void_(__exceptionPtr) } } + + @inline(__always) + public final func updateReferencedAssets(referencedAssets: ReferencedAssetsType) -> bridge.Result_void_ { + do { + try self.__implementation.updateReferencedAssets(referencedAssets: referencedAssets) + return bridge.create_Result_void_() + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_void_(__exceptionPtr) + } + } } diff --git a/nitrogen/generated/ios/swift/ReferencedAssetsType.swift b/nitrogen/generated/ios/swift/ReferencedAssetsType.swift new file mode 100644 index 00000000..658e8e81 --- /dev/null +++ b/nitrogen/generated/ios/swift/ReferencedAssetsType.swift @@ -0,0 +1,74 @@ +/// +/// ReferencedAssetsType.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Represents an instance of `ReferencedAssetsType`, backed by a C++ struct. + */ +public typealias ReferencedAssetsType = margelo.nitro.rive.ReferencedAssetsType + +public extension ReferencedAssetsType { + private typealias bridge = margelo.nitro.rive.bridge.swift + + /** + * Create a new instance of `ReferencedAssetsType`. + */ + init(data: Dictionary?) { + self.init({ () -> bridge.std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__ in + if let __unwrappedValue = data { + return bridge.create_std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__({ () -> bridge.std__unordered_map_std__string__ResolvedReferencedAsset_ in + var __map = bridge.create_std__unordered_map_std__string__ResolvedReferencedAsset_(__unwrappedValue.count) + for (__k, __v) in __unwrappedValue { + bridge.emplace_std__unordered_map_std__string__ResolvedReferencedAsset_(&__map, std.string(__k), __v) + } + return __map + }()) + } else { + return .init() + } + }()) + } + + var data: Dictionary? { + @inline(__always) + get { + return { () -> Dictionary? in + if bridge.has_value_std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__(self.__data) { + let __unwrapped = bridge.get_std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__(self.__data) + return { () -> Dictionary in + var __dictionary = Dictionary(minimumCapacity: __unwrapped.size()) + let __keys = bridge.get_std__unordered_map_std__string__ResolvedReferencedAsset__keys(__unwrapped) + for __key in __keys { + let __value = bridge.get_std__unordered_map_std__string__ResolvedReferencedAsset__value(__unwrapped, __key) + __dictionary[String(__key)] = __value + } + return __dictionary + }() + } else { + return nil + } + }() + } + @inline(__always) + set { + self.__data = { () -> bridge.std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__ in + if let __unwrappedValue = newValue { + return bridge.create_std__optional_std__unordered_map_std__string__ResolvedReferencedAsset__({ () -> bridge.std__unordered_map_std__string__ResolvedReferencedAsset_ in + var __map = bridge.create_std__unordered_map_std__string__ResolvedReferencedAsset_(__unwrappedValue.count) + for (__k, __v) in __unwrappedValue { + bridge.emplace_std__unordered_map_std__string__ResolvedReferencedAsset_(&__map, std.string(__k), __v) + } + return __map + }()) + } else { + return .init() + } + }() + } + } +} diff --git a/nitrogen/generated/ios/swift/ResolvedReferencedAsset.swift b/nitrogen/generated/ios/swift/ResolvedReferencedAsset.swift new file mode 100644 index 00000000..bc80cb35 --- /dev/null +++ b/nitrogen/generated/ios/swift/ResolvedReferencedAsset.swift @@ -0,0 +1,144 @@ +/// +/// ResolvedReferencedAsset.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Represents an instance of `ResolvedReferencedAsset`, backed by a C++ struct. + */ +public typealias ResolvedReferencedAsset = margelo.nitro.rive.ResolvedReferencedAsset + +public extension ResolvedReferencedAsset { + private typealias bridge = margelo.nitro.rive.bridge.swift + + /** + * Create a new instance of `ResolvedReferencedAsset`. + */ + init(sourceUrl: String?, sourceAsset: String?, sourceAssetId: String?, path: String?) { + self.init({ () -> bridge.std__optional_std__string_ in + if let __unwrappedValue = sourceUrl { + return bridge.create_std__optional_std__string_(std.string(__unwrappedValue)) + } else { + return .init() + } + }(), { () -> bridge.std__optional_std__string_ in + if let __unwrappedValue = sourceAsset { + return bridge.create_std__optional_std__string_(std.string(__unwrappedValue)) + } else { + return .init() + } + }(), { () -> bridge.std__optional_std__string_ in + if let __unwrappedValue = sourceAssetId { + return bridge.create_std__optional_std__string_(std.string(__unwrappedValue)) + } else { + return .init() + } + }(), { () -> bridge.std__optional_std__string_ in + if let __unwrappedValue = path { + return bridge.create_std__optional_std__string_(std.string(__unwrappedValue)) + } else { + return .init() + } + }()) + } + + var sourceUrl: String? { + @inline(__always) + get { + return { () -> String? in + if bridge.has_value_std__optional_std__string_(self.__sourceUrl) { + let __unwrapped = bridge.get_std__optional_std__string_(self.__sourceUrl) + return String(__unwrapped) + } else { + return nil + } + }() + } + @inline(__always) + set { + self.__sourceUrl = { () -> bridge.std__optional_std__string_ in + if let __unwrappedValue = newValue { + return bridge.create_std__optional_std__string_(std.string(__unwrappedValue)) + } else { + return .init() + } + }() + } + } + + var sourceAsset: String? { + @inline(__always) + get { + return { () -> String? in + if bridge.has_value_std__optional_std__string_(self.__sourceAsset) { + let __unwrapped = bridge.get_std__optional_std__string_(self.__sourceAsset) + return String(__unwrapped) + } else { + return nil + } + }() + } + @inline(__always) + set { + self.__sourceAsset = { () -> bridge.std__optional_std__string_ in + if let __unwrappedValue = newValue { + return bridge.create_std__optional_std__string_(std.string(__unwrappedValue)) + } else { + return .init() + } + }() + } + } + + var sourceAssetId: String? { + @inline(__always) + get { + return { () -> String? in + if bridge.has_value_std__optional_std__string_(self.__sourceAssetId) { + let __unwrapped = bridge.get_std__optional_std__string_(self.__sourceAssetId) + return String(__unwrapped) + } else { + return nil + } + }() + } + @inline(__always) + set { + self.__sourceAssetId = { () -> bridge.std__optional_std__string_ in + if let __unwrappedValue = newValue { + return bridge.create_std__optional_std__string_(std.string(__unwrappedValue)) + } else { + return .init() + } + }() + } + } + + var path: String? { + @inline(__always) + get { + return { () -> String? in + if bridge.has_value_std__optional_std__string_(self.__path) { + let __unwrapped = bridge.get_std__optional_std__string_(self.__path) + return String(__unwrapped) + } else { + return nil + } + }() + } + @inline(__always) + set { + self.__path = { () -> bridge.std__optional_std__string_ in + if let __unwrappedValue = newValue { + return bridge.create_std__optional_std__string_(std.string(__unwrappedValue)) + } else { + return .init() + } + }() + } + } +} diff --git a/nitrogen/generated/shared/c++/HybridRiveFileFactorySpec.hpp b/nitrogen/generated/shared/c++/HybridRiveFileFactorySpec.hpp index b84d85d7..c8367768 100644 --- a/nitrogen/generated/shared/c++/HybridRiveFileFactorySpec.hpp +++ b/nitrogen/generated/shared/c++/HybridRiveFileFactorySpec.hpp @@ -15,11 +15,15 @@ // Forward declaration of `HybridRiveFileSpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridRiveFileSpec; } +// Forward declaration of `ReferencedAssetsType` to properly resolve imports. +namespace margelo::nitro::rive { struct ReferencedAssetsType; } #include #include "HybridRiveFileSpec.hpp" #include #include +#include "ReferencedAssetsType.hpp" +#include #include namespace margelo::nitro::rive { @@ -53,10 +57,10 @@ namespace margelo::nitro::rive { public: // Methods - virtual std::shared_ptr>> fromURL(const std::string& url, bool loadCdn) = 0; - virtual std::shared_ptr>> fromFileURL(const std::string& fileURL, bool loadCdn) = 0; - virtual std::shared_ptr>> fromResource(const std::string& resource, bool loadCdn) = 0; - virtual std::shared_ptr>> fromBytes(const std::shared_ptr& bytes, bool loadCdn) = 0; + virtual std::shared_ptr>> fromURL(const std::string& url, bool loadCdn, const std::optional& referencedAssets) = 0; + virtual std::shared_ptr>> fromFileURL(const std::string& fileURL, bool loadCdn, const std::optional& referencedAssets) = 0; + virtual std::shared_ptr>> fromResource(const std::string& resource, bool loadCdn, const std::optional& referencedAssets) = 0; + virtual std::shared_ptr>> fromBytes(const std::shared_ptr& bytes, bool loadCdn, const std::optional& referencedAssets) = 0; protected: // Hybrid Setup diff --git a/nitrogen/generated/shared/c++/HybridRiveFileSpec.cpp b/nitrogen/generated/shared/c++/HybridRiveFileSpec.cpp index dbfb192e..7f69b5b2 100644 --- a/nitrogen/generated/shared/c++/HybridRiveFileSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridRiveFileSpec.cpp @@ -19,6 +19,7 @@ namespace margelo::nitro::rive { prototype.registerHybridMethod("viewModelByName", &HybridRiveFileSpec::viewModelByName); prototype.registerHybridMethod("defaultArtboardViewModel", &HybridRiveFileSpec::defaultArtboardViewModel); prototype.registerHybridMethod("release", &HybridRiveFileSpec::release); + prototype.registerHybridMethod("updateReferencedAssets", &HybridRiveFileSpec::updateReferencedAssets); }); } diff --git a/nitrogen/generated/shared/c++/HybridRiveFileSpec.hpp b/nitrogen/generated/shared/c++/HybridRiveFileSpec.hpp index 63d4ac9c..fc91d675 100644 --- a/nitrogen/generated/shared/c++/HybridRiveFileSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridRiveFileSpec.hpp @@ -17,12 +17,15 @@ namespace margelo::nitro::rive { class HybridViewModelSpec; } // Forward declaration of `ArtboardBy` to properly resolve imports. namespace margelo::nitro::rive { struct ArtboardBy; } +// Forward declaration of `ReferencedAssetsType` to properly resolve imports. +namespace margelo::nitro::rive { struct ReferencedAssetsType; } #include #include #include "HybridViewModelSpec.hpp" #include #include "ArtboardBy.hpp" +#include "ReferencedAssetsType.hpp" namespace margelo::nitro::rive { @@ -59,6 +62,7 @@ namespace margelo::nitro::rive { virtual std::optional> viewModelByName(const std::string& name) = 0; virtual std::optional> defaultArtboardViewModel(const std::optional& artboardBy) = 0; virtual void release() = 0; + virtual void updateReferencedAssets(const ReferencedAssetsType& referencedAssets) = 0; protected: // Hybrid Setup diff --git a/nitrogen/generated/shared/c++/ReferencedAssetsType.hpp b/nitrogen/generated/shared/c++/ReferencedAssetsType.hpp new file mode 100644 index 00000000..1e4f4b5f --- /dev/null +++ b/nitrogen/generated/shared/c++/ReferencedAssetsType.hpp @@ -0,0 +1,79 @@ +/// +/// ReferencedAssetsType.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `ResolvedReferencedAsset` to properly resolve imports. +namespace margelo::nitro::rive { struct ResolvedReferencedAsset; } + +#include +#include "ResolvedReferencedAsset.hpp" +#include +#include + +namespace margelo::nitro::rive { + + /** + * A struct which can be represented as a JavaScript object (ReferencedAssetsType). + */ + struct ReferencedAssetsType { + public: + std::optional> data SWIFT_PRIVATE; + + public: + ReferencedAssetsType() = default; + explicit ReferencedAssetsType(std::optional> data): data(data) {} + }; + +} // namespace margelo::nitro::rive + +namespace margelo::nitro { + + // C++ ReferencedAssetsType <> JS ReferencedAssetsType (object) + template <> + struct JSIConverter final { + static inline margelo::nitro::rive::ReferencedAssetsType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return margelo::nitro::rive::ReferencedAssetsType( + JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "data")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::rive::ReferencedAssetsType& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "data", JSIConverter>>::toJSI(runtime, arg.data)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!nitro::isPlainObject(runtime, obj)) { + return false; + } + if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, "data"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/ResolvedReferencedAsset.hpp b/nitrogen/generated/shared/c++/ResolvedReferencedAsset.hpp new file mode 100644 index 00000000..99815eee --- /dev/null +++ b/nitrogen/generated/shared/c++/ResolvedReferencedAsset.hpp @@ -0,0 +1,88 @@ +/// +/// ResolvedReferencedAsset.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include +#include + +namespace margelo::nitro::rive { + + /** + * A struct which can be represented as a JavaScript object (ResolvedReferencedAsset). + */ + struct ResolvedReferencedAsset { + public: + std::optional sourceUrl SWIFT_PRIVATE; + std::optional sourceAsset SWIFT_PRIVATE; + std::optional sourceAssetId SWIFT_PRIVATE; + std::optional path SWIFT_PRIVATE; + + public: + ResolvedReferencedAsset() = default; + explicit ResolvedReferencedAsset(std::optional sourceUrl, std::optional sourceAsset, std::optional sourceAssetId, std::optional path): sourceUrl(sourceUrl), sourceAsset(sourceAsset), sourceAssetId(sourceAssetId), path(path) {} + }; + +} // namespace margelo::nitro::rive + +namespace margelo::nitro { + + // C++ ResolvedReferencedAsset <> JS ResolvedReferencedAsset (object) + template <> + struct JSIConverter final { + static inline margelo::nitro::rive::ResolvedReferencedAsset fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return margelo::nitro::rive::ResolvedReferencedAsset( + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "sourceUrl")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "sourceAsset")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "sourceAssetId")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "path")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::rive::ResolvedReferencedAsset& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "sourceUrl", JSIConverter>::toJSI(runtime, arg.sourceUrl)); + obj.setProperty(runtime, "sourceAsset", JSIConverter>::toJSI(runtime, arg.sourceAsset)); + obj.setProperty(runtime, "sourceAssetId", JSIConverter>::toJSI(runtime, arg.sourceAssetId)); + obj.setProperty(runtime, "path", JSIConverter>::toJSI(runtime, arg.path)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!nitro::isPlainObject(runtime, obj)) { + return false; + } + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "sourceUrl"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "sourceAsset"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "sourceAssetId"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "path"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/package.json b/package.json index 221f1c60..c5229f05 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,8 @@ "@react-native/babel-preset": "0.79.2", "@react-native/eslint-config": "^0.78.0", "@release-it/conventional-changelog": "^9.0.2", + "@testing-library/react-hooks": "^8.0.1", + "@testing-library/react-native": "^13.3.3", "@types/jest": "^29.5.5", "@types/react": "^19.0.0", "commitlint": "^19.6.1", @@ -89,6 +91,7 @@ "react-native": "0.79.2", "react-native-builder-bob": "^0.40.10", "react-native-nitro-modules": "^0.31.3", + "react-test-renderer": "19.0.0", "release-it": "^17.10.0", "turbo": "^1.10.7", "typescript": "^5.2.2" @@ -104,10 +107,18 @@ "packageManager": "yarn@3.6.1", "jest": { "preset": "react-native", + "setupFilesAfterEnv": ["/jest-setup.js"], + "testMatch": [ + "/src/**/__tests__/**/*.{js,jsx,ts,tsx}", + "/src/**/*.{spec,test}.{js,jsx,ts,tsx}" + ], "modulePathIgnorePatterns": [ "/example/node_modules", "/lib/" - ] + ], + "moduleNameMapper": { + "^../nitrogen/generated/shared/json/RiveViewConfig\\.json$": "/jest-setup.js" + } }, "commitlint": { "extends": [ diff --git a/src/core/RiveFile.ts b/src/core/RiveFile.ts index cdebe93a..8be1ccfe 100644 --- a/src/core/RiveFile.ts +++ b/src/core/RiveFile.ts @@ -7,6 +7,7 @@ import type { // This import path isn't handled by @types/react-native // @ts-ignore import resolveAssetSource from 'react-native/Libraries/Image/resolveAssetSource'; +import type { ResolvedReferencedAssets } from '../hooks/useRiveFile'; const RiveFileInternal = NitroModules.createHybridObject('RiveFileFactory'); @@ -24,22 +25,32 @@ export namespace RiveFileFactory { */ export async function fromURL( url: string, + referencedAssets: ResolvedReferencedAssets | undefined, loadCdn: boolean = true ): Promise { - return RiveFileInternal.fromURL(url, loadCdn); + return RiveFileInternal.fromURL( + url, + loadCdn, + referencedAssets ? { data: referencedAssets } : undefined + ); } /** * Creates a RiveFile instance from a local file path URL. - * @param pathURL - The local file path of the Rive graphic file + * @param pathURL - The local file path of the Rive animation file * @param loadCdn - Whether to load from CDN (default: true) * @returns Promise that resolves to a RiveFile instance */ export async function fromFileURL( fileURL: string, + referencedAssets: ResolvedReferencedAssets | undefined = undefined, loadCdn: boolean = true ): Promise { - return RiveFileInternal.fromFileURL(fileURL, loadCdn); + return RiveFileInternal.fromFileURL( + fileURL, + loadCdn, + referencedAssets ? { data: referencedAssets } : undefined + ); } /** @@ -50,9 +61,14 @@ export namespace RiveFileFactory { */ export async function fromResource( resource: string, + referencedAssets: ResolvedReferencedAssets | undefined, loadCdn: boolean = true ): Promise { - return RiveFileInternal.fromResource(resource, loadCdn); + return RiveFileInternal.fromResource( + resource, + loadCdn, + referencedAssets ? { data: referencedAssets } : undefined + ); } /** @@ -63,9 +79,14 @@ export namespace RiveFileFactory { */ export async function fromBytes( bytes: ArrayBuffer, + referencedAssets: ResolvedReferencedAssets | undefined, loadCdn: boolean = true ): Promise { - return RiveFileInternal.fromBytes(bytes, loadCdn); + return RiveFileInternal.fromBytes( + bytes, + loadCdn, + referencedAssets ? { data: referencedAssets } : undefined + ); } /** @@ -92,6 +113,7 @@ export namespace RiveFileFactory { */ export async function fromSource( source: number | { uri: string }, + referencedAssets: ResolvedReferencedAssets | undefined, loadCdn: boolean = true ): Promise { const assetID = typeof source === 'number' ? source : null; @@ -108,16 +130,16 @@ export namespace RiveFileFactory { try { // handle http address and dev server if (assetURI.match(/https?:\/\//)) { - return RiveFileFactory.fromURL(assetURI, loadCdn); + return RiveFileFactory.fromURL(assetURI, referencedAssets, loadCdn); } // handle iOS bundled asset if (assetURI.match(/file:\/\//)) { - return RiveFileFactory.fromFileURL(assetURI, loadCdn); + return RiveFileFactory.fromFileURL(assetURI, referencedAssets, loadCdn); } // handle Android bundled asset or resource name uri - return RiveFileFactory.fromResource(assetURI, loadCdn); + return RiveFileFactory.fromResource(assetURI, referencedAssets, loadCdn); } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : String(error); diff --git a/src/hooks/__tests__/useRiveFile.test.ts b/src/hooks/__tests__/useRiveFile.test.ts new file mode 100644 index 00000000..cf69cbb4 --- /dev/null +++ b/src/hooks/__tests__/useRiveFile.test.ts @@ -0,0 +1,119 @@ +import { renderHook, waitFor } from '@testing-library/react-native'; +import { useRiveFile } from '../useRiveFile'; +import type { RiveFile } from '../../specs/RiveFile.nitro'; + +jest.mock('react-native/Libraries/Image/Image', () => ({ + resolveAssetSource: jest.fn((source: number) => ({ + uri: `asset://resolved/${source}`, + })), +})); + +describe('useRiveFile - updateReferencedAssets', () => { + const mockRiveFile: RiveFile = { + release: jest.fn(), + updateReferencedAssets: jest.fn(), + viewModelCount: 0, + viewModelByIndex: jest.fn(), + viewModelByName: jest.fn(), + defaultArtboardViewModel: jest.fn(), + } as any; + + beforeEach(() => { + jest.clearAllMocks(); + (global as any).mockRiveFileFactory.fromURL.mockResolvedValue(mockRiveFile); + (global as any).mockRiveFileFactory.fromResource.mockResolvedValue( + mockRiveFile + ); + }); + + it('should call updateReferencedAssets when referencedAssets change', async () => { + const initialAssets = { + 'asset-1': { source: { uri: 'https://example.com/image1.png' } }, + }; + + const { result, rerender } = renderHook( + (props: { referencedAssets: any }) => + useRiveFile('https://example.com/animation.riv', { + referencedAssets: props.referencedAssets, + }), + { initialProps: { referencedAssets: initialAssets } } + ); + + await waitFor(() => { + expect((result.current as any).isLoading).toBe(false); + }); + + expect(mockRiveFile.updateReferencedAssets).not.toHaveBeenCalled(); + + const updatedAssets = { + 'asset-1': { source: { uri: 'https://example.com/image2.png' } }, + }; + + rerender({ referencedAssets: updatedAssets }); + + await waitFor(() => { + expect(mockRiveFile.updateReferencedAssets).toHaveBeenCalledWith({ + data: { + 'asset-1': { sourceUrl: 'https://example.com/image2.png' }, + }, + }); + }); + }); + + it('should handle multiple asset changes', async () => { + const initialAssets = { + 'asset-1': { source: { uri: 'https://example.com/image1.png' } }, + 'asset-2': { source: { uri: 'https://example.com/image2.png' } }, + }; + + const { result, rerender } = renderHook( + (props: { referencedAssets: any }) => + useRiveFile('https://example.com/animation.riv', { + referencedAssets: props.referencedAssets, + }), + { initialProps: { referencedAssets: initialAssets } } + ); + + await waitFor(() => { + expect((result.current as any).isLoading).toBe(false); + }); + + const updatedAssets = { + 'asset-1': { source: { uri: 'https://example.com/image1-new.png' } }, + 'asset-2': { source: { uri: 'https://example.com/image2-new.png' } }, + }; + + rerender({ referencedAssets: updatedAssets }); + + await waitFor(() => { + expect(mockRiveFile.updateReferencedAssets).toHaveBeenCalledWith({ + data: { + 'asset-1': { sourceUrl: 'https://example.com/image1-new.png' }, + 'asset-2': { sourceUrl: 'https://example.com/image2-new.png' }, + }, + }); + }); + }); + + it('should not call updateReferencedAssets if assets have not changed', async () => { + const assets = { + 'asset-1': { source: { uri: 'https://example.com/image1.png' } }, + }; + + const { result, rerender } = renderHook( + (props: { referencedAssets: any }) => + useRiveFile('https://example.com/animation.riv', { + referencedAssets: props.referencedAssets, + }), + { initialProps: { referencedAssets: assets } } + ); + + await waitFor(() => { + expect((result.current as any).isLoading).toBe(false); + }); + + rerender({ referencedAssets: assets }); + + expect(mockRiveFile.updateReferencedAssets).not.toHaveBeenCalled(); + }); +}); diff --git a/src/hooks/useRiveFile.ts b/src/hooks/useRiveFile.ts index 51fe9253..5eea5525 100644 --- a/src/hooks/useRiveFile.ts +++ b/src/hooks/useRiveFile.ts @@ -1,50 +1,146 @@ -import { useState, useEffect } from 'react'; -import { RiveFileFactory, type RiveFile } from 'react-native-rive'; +import { useState, useEffect, useMemo, useRef } from 'react'; +import { Image } from 'react-native'; +import { RiveFileFactory, type RiveFile } from '../index'; +import type { ResolvedReferencedAsset } from '../specs/RiveFile.nitro'; export type RiveFileInput = number | { uri: string } | string | ArrayBuffer; -export function useRiveFile(input?: RiveFileInput) { - const [riveFile, setRiveFile] = useState(null); - const [isLoading, setIsLoading] = useState(true); - const [error, setError] = useState(null); +type ReferencedAsset = { source: number | { uri: string } }; - useEffect(() => { - if (!input) { - setRiveFile(null); - setIsLoading(false); - return; +export interface ReferencedAssets { + [assetName: string]: ReferencedAsset; +} + +export type ResolvedReferencedAssets = { + [assetName: string]: ResolvedReferencedAsset; +}; + +export type UseRiveFileOptions = { + referencedAssets?: ReferencedAssets; +}; + +function parsePossibleSources( + source: ReferencedAsset['source'] +): ResolvedReferencedAsset { + if (typeof source === 'number') { + const resolvedAsset = Image.resolveAssetSource(source); + if (resolvedAsset && resolvedAsset.uri) { + return { sourceAssetId: resolvedAsset.uri }; + } else { + throw new Error('Invalid asset source provided.'); } + } + + const uri = (source as any).uri; + if (typeof source === 'object' && uri) { + return { sourceUrl: uri }; + } + + const asset = (source as any).fileName; + const path = (source as any).path; + + if (typeof source === 'object' && asset) { + const result: ResolvedReferencedAsset = { sourceAsset: asset }; + + if (path) { + result.path = path; + } + + return result; + } + + throw new Error('Invalid source provided.'); +} +function transformFilesHandledMapping( + mapping?: ReferencedAssets +): ResolvedReferencedAssets | undefined { + const transformedMapping: ResolvedReferencedAssets = {}; + if (mapping === undefined) { + return undefined; + } + + Object.entries(mapping).forEach(([key, option]) => { + transformedMapping[key] = parsePossibleSources(option.source); + }); + + return transformedMapping; +} + +type RiveFileHookResult = + | { riveFile: RiveFile; isLoading: false; error: null } + | { riveFile: null; isLoading: true; error: null } + | { riveFile: null; isLoading: false; error: string }; + +export function useRiveFile( + input: RiveFileInput | undefined, + options: UseRiveFileOptions = {} +): RiveFileHookResult { + const [result, setResult] = useState({ + riveFile: null, + isLoading: true, + error: null, + }); + const referencedAssets = useMemo( + () => transformFilesHandledMapping(options.referencedAssets), + [options.referencedAssets] + ); + const initialReferencedAssets = useRef(referencedAssets); + const initialInput = useRef(input); + + useEffect(() => { let currentFile: RiveFile | null = null; const loadRiveFile = async () => { try { const currentInput = input; + if (currentInput == null) { + setResult({ + riveFile: null, + isLoading: false, + error: 'No Rive file input provided.', + }); + return; + } if (typeof currentInput === 'string') { if ( currentInput.startsWith('http://') || currentInput.startsWith('https://') ) { - currentFile = await RiveFileFactory.fromURL(currentInput); + currentFile = await RiveFileFactory.fromURL( + currentInput, + initialReferencedAssets.current + ); } else { - currentFile = await RiveFileFactory.fromResource(currentInput); + currentFile = await RiveFileFactory.fromResource( + currentInput, + initialReferencedAssets.current + ); } } else if (typeof currentInput === 'number' || 'uri' in currentInput) { - currentFile = await RiveFileFactory.fromSource(currentInput); + currentFile = await RiveFileFactory.fromSource( + currentInput, + initialReferencedAssets.current + ); } else if (currentInput instanceof ArrayBuffer) { - currentFile = await RiveFileFactory.fromBytes(currentInput); + currentFile = await RiveFileFactory.fromBytes( + currentInput, + initialReferencedAssets.current + ); } - setRiveFile(currentFile); - setIsLoading(false); - setError(null); + setResult({ riveFile: currentFile!, isLoading: false, error: null }); } catch (err) { console.error(err); - setError( - err instanceof Error ? err.message : 'Failed to load Rive file' - ); - setIsLoading(false); + setResult({ + riveFile: null, + isLoading: false, + error: + err instanceof Error + ? err.message || 'Unknown error' + : 'Failed to load Rive file', + }); } }; @@ -57,5 +153,25 @@ export function useRiveFile(input?: RiveFileInput) { }; }, [input]); - return { riveFile, isLoading, error }; + const { riveFile } = result; + useEffect(() => { + if (initialReferencedAssets.current !== referencedAssets) { + if (riveFile && referencedAssets) { + riveFile.updateReferencedAssets({ data: referencedAssets }); + initialReferencedAssets.current = referencedAssets; + } + } + }, [referencedAssets, riveFile]); + + if (initialInput.current !== input) { + console.warn( + 'useRiveFile: Changing input after initial render is not supported.' + ); + } + + return { + riveFile: result.riveFile, + isLoading: result.isLoading, + error: result.error, + } as RiveFileHookResult; } diff --git a/src/specs/RiveFile.nitro.ts b/src/specs/RiveFile.nitro.ts index 9db60746..f014bc89 100644 --- a/src/specs/RiveFile.nitro.ts +++ b/src/specs/RiveFile.nitro.ts @@ -2,6 +2,17 @@ import type { HybridObject } from 'react-native-nitro-modules'; import type { ViewModel } from './ViewModel.nitro'; import type { ArtboardBy } from './ArtboardBy'; +export type ResolvedReferencedAsset = { + sourceUrl?: string; + sourceAsset?: string; + sourceAssetId?: string; + path?: string; +}; + +export type ReferencedAssetsType = { + data?: Record; +}; + /** * A Rive file (.riv) as created in the Rive editor. */ @@ -16,13 +27,30 @@ export interface RiveFile /** Returns the default view model for the provided artboard */ defaultArtboardViewModel(artboardBy?: ArtboardBy): ViewModel | null; /** Release the Rive file. Important to call when done with the file to free resources. */ - release(): void; // TODO: Switch to `dispose`: https://github.com/mrousavy/nitro/issues/668 + release(): void; // TODO: Switch to `dispose`: https://github.com/mrousavy/nio + updateReferencedAssets(referencedAssets: ReferencedAssetsType): void; } export interface RiveFileFactory extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { - fromURL(url: string, loadCdn: boolean): Promise; - fromFileURL(fileURL: string, loadCdn: boolean): Promise; - fromResource(resource: string, loadCdn: boolean): Promise; - fromBytes(bytes: ArrayBuffer, loadCdn: boolean): Promise; + fromURL( + url: string, + loadCdn: boolean, + referencedAssets?: ReferencedAssetsType + ): Promise; + fromFileURL( + fileURL: string, + loadCdn: boolean, + referencedAssets?: ReferencedAssetsType + ): Promise; + fromResource( + resource: string, + loadCdn: boolean, + referencedAssets?: ReferencedAssetsType + ): Promise; + fromBytes( + bytes: ArrayBuffer, + loadCdn: boolean, + referencedAssets?: ReferencedAssetsType + ): Promise; } diff --git a/yarn.lock b/yarn.lock index 2a825f9d..027877cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,29 +5,19 @@ __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.46.0": - version: 0.46.0 - resolution: "@ark/schema@npm:0.46.0" +"@ark/schema@npm:0.53.0": + version: 0.53.0 + resolution: "@ark/schema@npm:0.53.0" dependencies: - "@ark/util": 0.46.0 - checksum: a4e7bc0e1c23009c7702ada7cfcbb1638af76f9721c43f96432844ec8616da6fc8121057fb87b0b80142558cf5c3e6141f40443cf43dd026ada8fd4acd635565 + "@ark/util": 0.53.0 + checksum: bea15e638bf63f56dee9a2bdeaf746232dd2c4b25663e47538376aa14d25a45b519f84271af9155b2618529cb4ad6701399e1f01153e3386cd3c38629ffc4c88 languageName: node linkType: hard -"@ark/util@npm:0.46.0": - version: 0.46.0 - resolution: "@ark/util@npm:0.46.0" - checksum: 0c0ceeb10aa0806860f7a7922586a05cda2945f7f598b414b4ebf268a6b45b00f9a854d6afd6b59df58c733e90d00b230194dd6a180a3a23d0eb64612be1b0e0 +"@ark/util@npm:0.53.0": + version: 0.53.0 + resolution: "@ark/util@npm:0.53.0" + checksum: 16d1a7393d310078083b333022dacfe2575cce8133b7348b566f20021605710aa93ffadc2d8c1a499f0e5ac533e610f204e77564db3bf82b1b5799f29988b27d languageName: node linkType: hard @@ -42,39 +32,39 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/compat-data@npm:7.27.2" - checksum: 8d4066324e5f1275adc43f2e22110cac29ee09fe926260c43f0eaa432c148859367df4152574a28ee02dbb3e3d11dd57145eed345d49cc07f9b6e11fee06535f +"@babel/compat-data@npm:^7.27.2, @babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/compat-data@npm:7.28.5" + checksum: d7bcb3ee713752dc27b89800bfb39f9ac5f3edc46b4f5bb9906e1fe6b6110c7b245dd502602ea66f93790480c228605e9a601f27c07016f24b56772e97bedbdf 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.27.1 - resolution: "@babel/core@npm:7.27.1" +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.25.2": + version: 7.28.5 + resolution: "@babel/core@npm:7.28.5" dependencies: - "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.27.1 - "@babel/generator": ^7.27.1 - "@babel/helper-compilation-targets": ^7.27.1 - "@babel/helper-module-transforms": ^7.27.1 - "@babel/helpers": ^7.27.1 - "@babel/parser": ^7.27.1 - "@babel/template": ^7.27.1 - "@babel/traverse": ^7.27.1 - "@babel/types": ^7.27.1 + "@babel/generator": ^7.28.5 + "@babel/helper-compilation-targets": ^7.27.2 + "@babel/helper-module-transforms": ^7.28.3 + "@babel/helpers": ^7.28.4 + "@babel/parser": ^7.28.5 + "@babel/template": ^7.27.2 + "@babel/traverse": ^7.28.5 + "@babel/types": ^7.28.5 + "@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: fce205f9eea387ed8a9c6de64e5a8f50256359bfc8f1352c576c843b4c148a6c2ef187cfe8d729453e520fdcc997f65920aca6cb8911fb25dfd2286966b9b914 + checksum: 1ee35b20448f73e9d531091ad4f9e8198dc8f0cebb783263fbff1807342209882ddcaf419be04111326b6f0e494222f7055d71da316c437a6a784d230c11ab9f languageName: node linkType: hard "@babel/eslint-parser@npm:^7.25.1": - version: 7.27.1 - resolution: "@babel/eslint-parser@npm:7.27.1" + version: 7.28.5 + resolution: "@babel/eslint-parser@npm:7.28.5" dependencies: "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 eslint-visitor-keys: ^2.1.0 @@ -82,33 +72,33 @@ __metadata: peerDependencies: "@babel/core": ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - checksum: 0e8aa37fe03e5e5f2db35e1e628c02012a9ea9aa14429495eacdb0418e8ebeaf7b6308f9f8931ee3fe64a61fd6ac7637c8ffcc2c0d85eee246b6115198418bc2 + checksum: 8daaf6f24d3f78c18bc4cf2bf1bedda3d829f330f385b85acf630adde3de7a703abf0d2615afea09244caa713dded01aa3c00f3637ea70568b2e8c547067fb99 languageName: node linkType: hard -"@babel/generator@npm:^7.20.0, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.27.1, @babel/generator@npm:^7.7.2": - version: 7.27.1 - resolution: "@babel/generator@npm:7.27.1" +"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.28.5, @babel/generator@npm:^7.7.2": + version: 7.28.5 + resolution: "@babel/generator@npm:7.28.5" dependencies: - "@babel/parser": ^7.27.1 - "@babel/types": ^7.27.1 - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.25 + "@babel/parser": ^7.28.5 + "@babel/types": ^7.28.5 + "@jridgewell/gen-mapping": ^0.3.12 + "@jridgewell/trace-mapping": ^0.3.28 jsesc: ^3.0.2 - checksum: d5e220eb20aca1d93aef85c4c716237f84c5aab7d3ed8dfeb7060dcd73d20c593a687fe74cfb6d3dc1604ef9faff2ca24e6cfdb1af18e03e3a5f9f63a04c0bdc + checksum: 3e86fa0197bb33394a85a73dbbca92bb1b3f250a30294c7e327359c0978ad90f36f3d71c7f2965a3fc349cfa82becc8f87e7421c75796c8bc48dd9010dd866d1 languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.27.1": - version: 7.27.1 - resolution: "@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: - "@babel/types": ^7.27.1 - checksum: 3f8e4d591458d6c0621a3d670f8798b8895580214287390126e3e621ddf3df0bd07cbcc9500c2671b9ec10162c2f9feb1194da5cf039d40df8cb69d181fc0cd8 + "@babel/types": ^7.27.3 + checksum: 63863a5c936ef82b546ca289c9d1b18fabfc24da5c4ee382830b124e2e79b68d626207febc8d4bffc720f50b2ee65691d7d12cc0308679dee2cd6bdc926b7190 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": version: 7.27.2 resolution: "@babel/helper-compilation-targets@npm:7.27.2" dependencies: @@ -121,58 +111,65 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-create-class-features-plugin@npm:7.27.1" +"@babel/helper-create-class-features-plugin@npm:^7.27.1, @babel/helper-create-class-features-plugin@npm:^7.28.3, @babel/helper-create-class-features-plugin@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.5" dependencies: - "@babel/helper-annotate-as-pure": ^7.27.1 - "@babel/helper-member-expression-to-functions": ^7.27.1 + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-member-expression-to-functions": ^7.28.5 "@babel/helper-optimise-call-expression": ^7.27.1 "@babel/helper-replace-supers": ^7.27.1 "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 - "@babel/traverse": ^7.27.1 + "@babel/traverse": ^7.28.5 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 406954b455e5b20924e7d1b41cf932e6e98e95c3a5224c7a70c3ad96a84e8fbde915ceff7ddbf9c7d121397c4e9274f061241648475122cf6fe54e0a95caae15 + checksum: 98f94a27bcde0cf0b847c41e1307057a1caddd131fb5fa0b1566e0c15ccc20b0ebab9667d782bffcd3eac9262226b18e86dcf30ab0f4dc5d14b1e1bf243aba49 languageName: node linkType: hard "@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" + version: 7.28.5 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.28.5" dependencies: - "@babel/helper-annotate-as-pure": ^7.27.1 - regexpu-core: ^6.2.0 + "@babel/helper-annotate-as-pure": ^7.27.3 + regexpu-core: ^6.3.1 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 2ede6bbad0016a9262fd281ce8f1a5d69e6179dcec4ea282830e924c29a29b66b0544ecb92e4ef4acdaf2c4c990931d7dc442dbcd6a8bcec4bad73923ef70934 + checksum: de202103e6ff8cd8da0d62eb269fcceb29857f3fa16173f0ff38188fd514e9ad4901aef1d590ff8ba25381644b42eaf70ad9ba91fda59fe7aa6a5e694cdde267 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.3, @babel/helper-define-polyfill-provider@npm:^0.6.4": - version: 0.6.4 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.4" +"@babel/helper-define-polyfill-provider@npm:^0.6.5": + version: 0.6.5 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.5" dependencies: - "@babel/helper-compilation-targets": ^7.22.6 - "@babel/helper-plugin-utils": ^7.22.5 - debug: ^4.1.1 + "@babel/helper-compilation-targets": ^7.27.2 + "@babel/helper-plugin-utils": ^7.27.1 + debug: ^4.4.1 lodash.debounce: ^4.0.8 - resolve: ^1.14.2 + resolve: ^1.22.10 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: bfbcb41f005ba11497b459cf801650af558b533f383b2f57034e9ccce592a0af699b585898deef93598ed3d9bd14502327e18dfc8a92a3db48b2a49ae2886f86 + checksum: 9fd3b09b209c8ed0d3d8bc1f494f1368b9e1f6e46195af4ce948630fe97d7dafde4882eedace270b319bf6555ddf35e220c77505f6d634f621766cdccbba0aae languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-member-expression-to-functions@npm:7.27.1" +"@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 + +"@babel/helper-member-expression-to-functions@npm:^7.27.1, @babel/helper-member-expression-to-functions@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" dependencies: - "@babel/traverse": ^7.27.1 - "@babel/types": ^7.27.1 - checksum: b13a3d120015a6fd2f6e6c2ff789cd12498745ef028710cba612cfb751b91ace700c3f96c1689228d1dcb41e9d4cf83d6dff8627dcb0c8da12d79440e783c6b8 + "@babel/traverse": ^7.28.5 + "@babel/types": ^7.28.5 + checksum: 447d385233bae2eea713df1785f819b5a5ca272950740da123c42d23f491045120f0fbbb5609c091f7a9bbd40f289a442846dde0cb1bf0c59440fa093690cf7c languageName: node linkType: hard @@ -186,16 +183,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-module-transforms@npm:7.27.1" +"@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.1 + "@babel/traverse": ^7.28.3 peerDependencies: "@babel/core": ^7.0.0 - checksum: 816dd166f0a850616d01ca198715d78fef052a834dc155dd57e4405d702f288071077be3ed58e13c86ac9e63ca560e876cc6d70cf5ef0f1f62bd9321084d4c06 + checksum: 7cf7b79da0fa626d6c84bfc7b35c079a2559caecaa2ff645b0f1db0d741507aa4df6b5b98a3283e8ac4e89094af271d805bf5701e5c4f916e622797b7c8cbb18 languageName: node linkType: hard @@ -208,7 +205,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.27.1 resolution: "@babel/helper-plugin-utils@npm:7.27.1" checksum: 5d715055301badab62bdb2336075a77f8dc8bd290cad2bc1b37ea3bf1b3efc40594d308082229f239deb4d6b5b80b0a73bce000e595ea74416e0339c11037047 @@ -258,10 +255,10 @@ __metadata: 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" - checksum: 3c7e8391e59d6c85baeefe9afb86432f2ab821c6232b00ea9082a51d3e7e95a2f3fb083d74dc1f49ac82cf238e1d2295dafcb001f7b0fab479f3f56af5eaaa47 +"@babel/helper-validator-identifier@npm:^7.27.1, @babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 5a251a6848e9712aea0338f659a1a3bd334d26219d5511164544ca8ec20774f098c3a6661e9da65a0d085c745c00bb62c8fada38a62f08fa1f8053bc0aeb57e4 languageName: node linkType: hard @@ -273,46 +270,46 @@ __metadata: linkType: hard "@babel/helper-wrap-function@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-wrap-function@npm:7.27.1" + version: 7.28.3 + resolution: "@babel/helper-wrap-function@npm:7.28.3" dependencies: - "@babel/template": ^7.27.1 - "@babel/traverse": ^7.27.1 - "@babel/types": ^7.27.1 - checksum: b0427765766494cb5455a188d4cdef5e6167f2835a8ed76f3c25fa3bbe2ec2a716588fa326c52fab0d184a9537200d76e48656e516580a914129d74528322821 + "@babel/template": ^7.27.2 + "@babel/traverse": ^7.28.3 + "@babel/types": ^7.28.2 + checksum: 0ebdfdc918fdd0c1cf6ff15ba4c664974d0cdf21a017af560d58b00c379df3bf2e55f13a44fe3225668bca169da174f6cb97a96c4e987fb728fdb8f9a39db302 languageName: node linkType: hard -"@babel/helpers@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helpers@npm:7.27.1" +"@babel/helpers@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/helpers@npm:7.28.4" dependencies: - "@babel/template": ^7.27.1 - "@babel/types": ^7.27.1 - checksum: 19ede1e996cbd295fb3a881ff70bc0f91c5133ebac256441e9ecd69dfba89456e75cf7ecf06cd276c638a4de7bd6eff21151961c78038d0b23d94b4d23415ee4 + "@babel/template": ^7.27.2 + "@babel/types": ^7.28.4 + checksum: a8706219e0bd60c18bbb8e010aa122e9b14e7e7e67c21cc101e6f1b5e79dcb9a18d674f655997f85daaf421aa138cf284710bb04371a2255a0a3137f097430b4 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.3, @babel/parser@npm:^7.27.1, @babel/parser@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/parser@npm:7.27.2" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @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.5": + version: 7.28.5 + resolution: "@babel/parser@npm:7.28.5" dependencies: - "@babel/types": ^7.27.1 + "@babel/types": ^7.28.5 bin: parser: ./bin/babel-parser.js - checksum: 1ac70a75028f1cc10eefb10ed2d83cf700ca3e1ddb4cf556a003fc5c4ca53ae83350bbb8065020fcc70d476fcf7bf1c17191b72384f719614ae18397142289cf + checksum: 5c2456e3f26c70d4a3ce1a220b529a91a2df26c54a2894fd0dea2342699ea1067ffdda9f0715eeab61da46ff546fd5661bc70be6d8d11977cbe21f5f0478819a languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.27.1" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.28.5" dependencies: "@babel/helper-plugin-utils": ^7.27.1 - "@babel/traverse": ^7.27.1 + "@babel/traverse": ^7.28.5 peerDependencies: "@babel/core": ^7.0.0 - checksum: 72f24b9487e445fa61cf8be552aad394a648c2bb445c38d39d1df003186d9685b87dd8d388c950f438ea0ca44c82099d9c49252fb681c719cc72edf02bbe0304 + checksum: 749b40a963d5633f554cad0336245cb6c1c1393c70a3fddcf302d86a1a42b35efdd2ed62056b88db66f3900887ae1cee9a3eeec89799c22e0cf65059f0dfd142 languageName: node linkType: hard @@ -351,15 +348,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.27.1" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.3" dependencies: "@babel/helper-plugin-utils": ^7.27.1 - "@babel/traverse": ^7.27.1 + "@babel/traverse": ^7.28.3 peerDependencies: "@babel/core": ^7.0.0 - checksum: 4d6792ccade2d6b9d5577b0a879ab22d05ac8a1206b1a636b6ffdb53a0c0bacaf0f7947e46de254f228ffd75456f4b95ccd82fdeaefc0b92d88af3c5991863ad + checksum: c810e5d36030df6861ced35f0adbda7b4b41ac3e984422b32bee906564fd49374435f0a7a1a42eb0a9e6a5170c255f0ab31c163d5fc51fa5a816aa0420311029 languageName: node linkType: hard @@ -637,16 +634,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.25.4, @babel/plugin-transform-async-generator-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.27.1" +"@babel/plugin-transform-async-generator-functions@npm:^7.25.4, @babel/plugin-transform-async-generator-functions@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": ^7.27.1 "@babel/helper-remap-async-to-generator": ^7.27.1 - "@babel/traverse": ^7.27.1 + "@babel/traverse": ^7.28.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 37e8b76c992066f81cc24af11a25f296add6ae39f51f2c37da565fc004dbf3ef9733b42808acbfb86792d73f73bfbb4396338abbd364b9103146b119508b49c7 + checksum: 174aaccd7a8386fd7f32240c3f65a93cf60dcc5f6a2123cfbff44c0d22b424cd41de3a0c6d136b6a2fa60a8ca01550c261677284cb18a0daeab70730b2265f1d languageName: node linkType: hard @@ -674,14 +671,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.0, @babel/plugin-transform-block-scoping@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-block-scoping@npm:7.27.1" +"@babel/plugin-transform-block-scoping@npm:^7.25.0, @babel/plugin-transform-block-scoping@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.5" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 490773ee111fd298d74bd0ba454c941ae23a39db5cd08bf4258997f44f7584399fc4214a7c3816ee70f0273c263fe2ea4e11bb07939e57845702ba05258a9cb0 + checksum: 2cbc11c9b61097b61806c279211a4c4f5e85a5ca7fd52228efbf3a729178d330142a00a93695dbacc2898477e5fa9e34e7637f18323247ebebb84f43005560f3 languageName: node linkType: hard @@ -697,31 +694,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-class-static-block@npm:7.27.1" +"@babel/plugin-transform-class-static-block@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.3" dependencies: - "@babel/helper-create-class-features-plugin": ^7.27.1 + "@babel/helper-create-class-features-plugin": ^7.28.3 "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.12.0 - checksum: 69688fe1641ae0ea025b916b8c2336e8b5643a5ec292e8f546ecd35d9d9d4bb301d738910822a79d867098cf687d550d92cd906ae4cda03c0f69b1ece2149a58 + checksum: 9b2feaacbf29637ab35a3aae1df35a1129adec5400a1767443739557fb0d3bf8278bf0ec90aacf43dec9a7dd91428d01375020b70528713e1bc36a72776a104c languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-classes@npm:7.27.1" +"@babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/plugin-transform-classes@npm:7.28.4" 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 @@ -737,14 +734,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.24.8, @babel/plugin-transform-destructuring@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-destructuring@npm:7.27.1" +"@babel/plugin-transform-destructuring@npm:^7.24.8, @babel/plugin-transform-destructuring@npm:^7.28.0, @babel/plugin-transform-destructuring@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.5" dependencies: "@babel/helper-plugin-utils": ^7.27.1 + "@babel/traverse": ^7.28.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 492013fc4befd5f3554853f983b82cfa748dd2004a525f1f16a37f841ac402a51e891cac2084b03e2b89553f0e1e685cf5bf8bf9df8fed82114c580b3c567bb6 + checksum: 74a06e55e715cfda0fdd8be53d2655d64dfdc28dffaede329d42548fd5b1449ad26a4ce43a24c3fd277b96f8b2010c7b3915afa8297911cda740cc5cc3a81f38 languageName: node linkType: hard @@ -794,14 +792,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.27.1" +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.0" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/plugin-transform-destructuring": ^7.28.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a44140097ed4854883c426613f4e8763237cd0fdab1c780514f4315f6c148d6b528d7a57fe6fdec4dbce28a21b70393ef3507b72dfec2e30bfc8d7db1ff19474 + languageName: node + linkType: hard + +"@babel/plugin-transform-exponentiation-operator@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.28.5" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4ff4a0f30babc457a5ae8564deda209599627c2ce647284a0e8e66f65b44f6d968cf77761a4cc31b45b61693f0810479248c79e681681d8ccb39d0c52944c1fd + checksum: da9bb5acd35c9fba92b802641f9462b82334158a149c78a739a04576a1e62be41057a201a41c022dda263bb73ac1a26521bbc997c7fc067f54d487af297995f4 languageName: node linkType: hard @@ -875,14 +885,14 @@ __metadata: languageName: node linkType: hard -"@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" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7, @babel/plugin-transform-logical-assignment-operators@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.28.5" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2757955d81d65cc4701c17b83720745f6858f7a1d1d58117e379c204f47adbeb066b778596b6168bdbf4a22c229aab595d79a9abc261d0c6bfd62d4419466e73 + checksum: c76778f4b186cc4f0b7e3658d91c690678bdb2b9d032f189213016d6177f2564709b79b386523b022b7d52e52331fd91f280f7c7bf85d835e0758b4b0d371447 languageName: node linkType: hard @@ -921,17 +931,17 @@ __metadata: 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" +"@babel/plugin-transform-modules-systemjs@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.28.5" dependencies: - "@babel/helper-module-transforms": ^7.27.1 + "@babel/helper-module-transforms": ^7.28.3 "@babel/helper-plugin-utils": ^7.27.1 - "@babel/helper-validator-identifier": ^7.27.1 - "@babel/traverse": ^7.27.1 + "@babel/helper-validator-identifier": ^7.28.5 + "@babel/traverse": ^7.28.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7c17a8973676c18525d87f277944616596f1b154cc2b9263bfd78ecdbf5f4288ec46c7f58017321ca3e3d6dfeb96875467b95311a39719b475d42a157525d87f + checksum: 646748dcf968c107fedfbff38aa37f7a9ebf2ccdf51fd9f578c6cd323371db36bbc5fe0d995544db168f39be9bca32a85fbf3bfff4742d2bed22e21c2847fa46 languageName: node linkType: hard @@ -992,17 +1002,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.27.2" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.28.4": + 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.1 - "@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: 6d518c21cddfa436029d72409aac8f680d3ba3a10eb94477112869132226498474a61218893ac9958f8bc079109af0f684d1347d5036fee8e9b477daecf2d8f3 + checksum: 2063672ba4ac457a64b5c0c982439c7b08b4c70f0e743792b98240db5a05f1c063918d8366c92d4d6b2572e2e3452b300a23980b6668e4f54ff349f60d47ec48 languageName: node linkType: hard @@ -1029,26 +1040,26 @@ __metadata: languageName: node linkType: hard -"@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" +"@babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.5" dependencies: "@babel/helper-plugin-utils": ^7.27.1 "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c4428d31f182d724db6f10575669aad3dbccceb0dea26aa9071fa89f11b3456278da3097fcc78937639a13c105a82cd452dc0218ce51abdbcf7626a013b928a5 + checksum: 78c2be52b32e893c992aca52ef84130b3540e2ca0e1ff0e45f8d2ccc213b3c6e2b43f8dd2c86a0976acf3cdff97d4488c23b86d7a3e67daa517013089f44af1d languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-parameters@npm:7.27.1" +"@babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/plugin-transform-parameters@npm:7.27.7" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 52dd9db2be63ca954dbf86bba3f1dedce5f8bcf0cbc2b9ab26981b6f9c3ad5ea3a1b7ba286d18ae05d7487763f2bd086533826ee82f7b8d76873265569e45125 + checksum: d51f195e1d6ac5d9fce583e9a70a5bfe403e62386e5eb06db9fbc6533f895a98ff7e7c3dcaa311a8e6fa7a9794466e81cdabcba6af9f59d787fb767bfe7868b4 languageName: node linkType: hard @@ -1088,14 +1099,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.24.7, @babel/plugin-transform-react-display-name@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-display-name@npm:7.27.1" +"@babel/plugin-transform-react-display-name@npm:^7.24.7, @babel/plugin-transform-react-display-name@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-react-display-name@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9fb5fae6283f612983dac4df51a6cd41e085e698008146e046357fe324e6e8264cedf8426ea5a188326f6d3cd1e7a3d3174e15d510851e93e9ef7ceeba380dc2 + checksum: 268b1a9192974439d17949e170b01cac2a2aa003c844e2fe3b8361146f42f66487178cffdfa8ce862aa9e6c814bc37f879a70300cb3f067815d15fa6aad04e6d languageName: node linkType: hard @@ -1159,14 +1170,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.24.7, @babel/plugin-transform-regenerator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-regenerator@npm:7.27.1" +"@babel/plugin-transform-regenerator@npm:^7.24.7, @babel/plugin-transform-regenerator@npm:^7.28.4": + 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: e1e28e08abf1c8fcdeaa8af5ab44cfda83bebc0ba6ebc155afdae243c51a2e941dd8ff6c51affb0447deb07a6bc66424fbf04482b050c061e272bc75c15853bf + checksum: 2aa99b3a7b254a109e913fabbe1fb320ff40723988fde0e225212b7ef20f523a399a6e45077258b176c29715493b2a853cf7c130811692215adf33e5af99782b languageName: node linkType: hard @@ -1194,18 +1205,18 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.24.7": - version: 7.27.1 - resolution: "@babel/plugin-transform-runtime@npm:7.27.1" + version: 7.28.5 + resolution: "@babel/plugin-transform-runtime@npm:7.28.5" 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: 9328060b54e430732883cac672cfd4c952c2bf2d9fb5268c675ae01f74ccb224ecdf105f5ad52b6277ad8b34b6df1e7cec6d1c02a0d17be54414265414e8ac88 + checksum: 5bb66f366c5bb22d0c890667ecd0f1fde9db86ac04df62b21fc2bbf58531eb84068bb0bf38fb1c496c8f78a917c59a884f6c1f8b205b8689d155e72fcf1d442d languageName: node linkType: hard @@ -1276,18 +1287,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.25.2, @babel/plugin-transform-typescript@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-typescript@npm:7.27.1" +"@babel/plugin-transform-typescript@npm:^7.25.2, @babel/plugin-transform-typescript@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-typescript@npm:7.28.5" dependencies: - "@babel/helper-annotate-as-pure": ^7.27.1 - "@babel/helper-create-class-features-plugin": ^7.27.1 + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-create-class-features-plugin": ^7.28.5 "@babel/helper-plugin-utils": ^7.27.1 "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 "@babel/plugin-syntax-typescript": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0037db32fedaacf42b5b3df774263bb7176d455859f77322f57135f7e50e457e5c95151280fc83bb9942fc1839e785489b098d73c9539d0f3c7dc9d42b3a8e86 + checksum: 202785e9cc6fb04efba091b3d5560cc8089cdc54df12fafa3d32ed7089e8d7a95b92b2fb1b53ec3e4db3bbafe56e8b32a3530cac004b3e493e902def8666001d languageName: node linkType: hard @@ -1339,61 +1350,62 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.25.2, @babel/preset-env@npm:^7.25.3": - version: 7.27.2 - resolution: "@babel/preset-env@npm:7.27.2" + version: 7.28.5 + resolution: "@babel/preset-env@npm:7.28.5" dependencies: - "@babel/compat-data": ^7.27.2 + "@babel/compat-data": ^7.28.5 "@babel/helper-compilation-targets": ^7.27.2 "@babel/helper-plugin-utils": ^7.27.1 "@babel/helper-validator-option": ^7.27.1 - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.27.1 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.28.5 "@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.5 "@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.4 "@babel/plugin-transform-computed-properties": ^7.27.1 - "@babel/plugin-transform-destructuring": ^7.27.1 + "@babel/plugin-transform-destructuring": ^7.28.5 "@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-exponentiation-operator": ^7.27.1 + "@babel/plugin-transform-explicit-resource-management": ^7.28.0 + "@babel/plugin-transform-exponentiation-operator": ^7.28.5 "@babel/plugin-transform-export-namespace-from": ^7.27.1 "@babel/plugin-transform-for-of": ^7.27.1 "@babel/plugin-transform-function-name": ^7.27.1 "@babel/plugin-transform-json-strings": ^7.27.1 "@babel/plugin-transform-literals": ^7.27.1 - "@babel/plugin-transform-logical-assignment-operators": ^7.27.1 + "@babel/plugin-transform-logical-assignment-operators": ^7.28.5 "@babel/plugin-transform-member-expression-literals": ^7.27.1 "@babel/plugin-transform-modules-amd": ^7.27.1 "@babel/plugin-transform-modules-commonjs": ^7.27.1 - "@babel/plugin-transform-modules-systemjs": ^7.27.1 + "@babel/plugin-transform-modules-systemjs": ^7.28.5 "@babel/plugin-transform-modules-umd": ^7.27.1 "@babel/plugin-transform-named-capturing-groups-regex": ^7.27.1 "@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.4 "@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-optional-chaining": ^7.28.5 + "@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.4 "@babel/plugin-transform-regexp-modifiers": ^7.27.1 "@babel/plugin-transform-reserved-words": ^7.27.1 "@babel/plugin-transform-shorthand-properties": ^7.27.1 @@ -1406,14 +1418,14 @@ __metadata: "@babel/plugin-transform-unicode-regex": ^7.27.1 "@babel/plugin-transform-unicode-sets-regex": ^7.27.1 "@babel/preset-modules": 0.1.6-no-external-plugins - babel-plugin-polyfill-corejs2: ^0.4.10 - babel-plugin-polyfill-corejs3: ^0.11.0 - babel-plugin-polyfill-regenerator: ^0.6.1 - core-js-compat: ^3.40.0 + babel-plugin-polyfill-corejs2: ^0.4.14 + babel-plugin-polyfill-corejs3: ^0.13.0 + babel-plugin-polyfill-regenerator: ^0.6.5 + core-js-compat: ^3.43.0 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 318b123c8783ac3833bde5a5ff315970967ccd4c1e5c97e0843c0199fe9eab48a8cb40b367b784ae19a33667bee63eb8533eb924dab05bfc92ff9ef436109001 + checksum: 9e17ba89c5d8cbea0fde564ea29e6dc17ad43f6ebf1c11347af69a04cf69dbc62c3124d2afe46412bfa41dddde3aaabfeffc0d68bed96f6ea0c4d8fbf652e761 languageName: node linkType: hard @@ -1431,44 +1443,44 @@ __metadata: linkType: hard "@babel/preset-react@npm:^7.24.7": - version: 7.27.1 - resolution: "@babel/preset-react@npm:7.27.1" + version: 7.28.5 + resolution: "@babel/preset-react@npm:7.28.5" dependencies: "@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-display-name": ^7.28.0 "@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: 00bc146f9c742eed804c598d3f31b7d889c1baf8c768989b7f84a93ca527dd1518d3b86781e89ca45cae6dbee136510d3a121658e01416c5578aecf751517bb5 + checksum: 13bc1fe4dde0a29d00323e46749e5beb457844507cb3afa2fefbd85d283c2d4836f9e4a780be735de58a44c505870476dc2838f1f8faf9d6f056481e65f1a0fb languageName: node linkType: hard "@babel/preset-typescript@npm:^7.24.7": - version: 7.27.1 - resolution: "@babel/preset-typescript@npm:7.27.1" + version: 7.28.5 + resolution: "@babel/preset-typescript@npm:7.28.5" dependencies: "@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 + "@babel/plugin-transform-typescript": ^7.28.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 38020f1b23e88ec4fbffd5737da455d8939244bddfb48a2516aef93fb5947bd9163fb807ce6eff3e43fa5ffe9113aa131305fef0fb5053998410bbfcfe6ce0ec + checksum: 22f889835d9db1e627846e71ca2f02e2d24e2eb9ebcf9845b3b1d37bd3a53787967bafabbbcb342f06aaf7627399a7102ba6ca18f9a0e17066c865d680d2ceb9 languageName: node linkType: hard -"@babel/runtime@npm:^7.25.0": - version: 7.27.1 - resolution: "@babel/runtime@npm:7.27.1" - checksum: 11339838a54783e5b14e04d94d7a4d032e9965c5823f3f687e41556fa40344ae7aeb57c535720b7a74ab3e8217def7834a6f1a665ee55bbb3befede141419913 +"@babel/runtime@npm:^7.12.5, @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.0.0, @babel/template@npm:^7.25.0, @babel/template@npm:^7.27.1, @babel/template@npm:^7.3.3": +"@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: @@ -1479,28 +1491,28 @@ __metadata: languageName: node linkType: hard -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/traverse@npm:7.27.1" +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @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, @babel/traverse@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/traverse@npm:7.28.5" dependencies: "@babel/code-frame": ^7.27.1 - "@babel/generator": ^7.27.1 - "@babel/parser": ^7.27.1 - "@babel/template": ^7.27.1 - "@babel/types": ^7.27.1 + "@babel/generator": ^7.28.5 + "@babel/helper-globals": ^7.28.0 + "@babel/parser": ^7.28.5 + "@babel/template": ^7.27.2 + "@babel/types": ^7.28.5 debug: ^4.3.1 - globals: ^11.1.0 - checksum: 7ea3ec36a65e734f2921f5dba6f417f5dd0c90eb44a60f6addbacbbedb44e8c82eba415a74feb7d6df58e351519b81b11b6ca3c0c7c41a3f73ebeaf6895a826c + checksum: e028ee9654f44be7c2a2df268455cee72d5c424c9ae536785f8f7c8680356f7b977c77ad76909d07eeed09ff1e125ce01cf783011f66b56c838791a85fa6af04 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.27.1, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.27.1 - resolution: "@babel/types@npm:7.27.1" +"@babel/types@npm:^7.0.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.28.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.28.5 + resolution: "@babel/types@npm:7.28.5" dependencies: "@babel/helper-string-parser": ^7.27.1 - "@babel/helper-validator-identifier": ^7.27.1 - checksum: 357c13f37aaa2f2e2cfcdb63f986d5f7abc9f38df20182b620ace34387d2460620415770fe5856eb54d70c9f0ba2f71230d29465e789188635a948476b830ae4 + "@babel/helper-validator-identifier": ^7.28.5 + checksum: 5bc266af9e55ff92f9ddf33d83a42c9de1a87f9579d0ed62ef94a741a081692dd410a4fbbab18d514b83e135083ff05bc0e37003834801c9514b9d8ad748070d languageName: node linkType: hard @@ -1729,60 +1741,64 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.7.0 - resolution: "@eslint-community/eslint-utils@npm:4.7.0" +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.8.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: b177e3b75c0b8d0e5d71f1c532edb7e40b31313db61f0c879f9bf19c3abb2783c6c372b5deb2396dab4432f2946b9972122ac682e77010376c029dfd0149c681 + checksum: ae9b98eea006d1354368804b0116b8b45017a4e47b486d1b9cfa048a8ed3dc69b9b074eb2b2acb14034e6897c24048fd42b6a6816d9dc8bb9daad79db7d478d2 languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": - version: 4.12.1 - resolution: "@eslint-community/regexpp@npm:4.12.1" - checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 1770bc81f676a72f65c7200b5675ff7a349786521f30e66125faaf767fde1ba1c19c3790e16ba8508a62a3933afcfc806a893858b3b5906faf693d862b9e4120 languageName: node linkType: hard "@eslint/compat@npm:^1.2.7": - version: 1.2.9 - resolution: "@eslint/compat@npm:1.2.9" + version: 1.4.1 + resolution: "@eslint/compat@npm:1.4.1" + dependencies: + "@eslint/core": ^0.17.0 peerDependencies: - eslint: ^9.10.0 + eslint: ^8.40 || 9 peerDependenciesMeta: eslint: optional: true - checksum: 5c1b792cba07caa274987517ed69461b9c91728021f65a49248bec41d3f715090c6d6266479d20b0aa646f269d5e58c9f7f4d9eeb086ec45caebc80e704d2378 + checksum: 2389344cf1fe6b34f14977cb449ab24214e3342cdf99fc045896bb1063343e6009765ee3ca0bf7b893e94b476bb569ddf4d5e79a957054a246d610355acbbb75 languageName: node linkType: hard -"@eslint/config-array@npm:^0.20.0": - version: 0.20.0 - resolution: "@eslint/config-array@npm:0.20.0" +"@eslint/config-array@npm:^0.21.1": + version: 0.21.1 + resolution: "@eslint/config-array@npm:0.21.1" dependencies: - "@eslint/object-schema": ^2.1.6 + "@eslint/object-schema": ^2.1.7 debug: ^4.3.1 minimatch: ^3.1.2 - checksum: 55824ea31f0502166a6fea97176c9c25089a0354474cdc72a5f739b1cf6925f44f667bf8f4f3a9dabf1112ab0fa671778ca3f96f1499f31ec42caf84cae55005 + checksum: fc5b57803b059f7c1f62950ef83baf045a01887fc00551f9e87ac119246fcc6d71c854a7f678accc79cbf829ed010e8135c755a154b0f54b129c538950cd7e6a languageName: node linkType: hard -"@eslint/config-helpers@npm:^0.2.1": - version: 0.2.2 - resolution: "@eslint/config-helpers@npm:0.2.2" - checksum: 8a4091a2c8af5366513647ccad720f184c1b723f04c086755797a3a5cac69dc9013bc8a75453d9fc188fc4364460f0eae9f1584b77b28082e0d26bf48356ae8f +"@eslint/config-helpers@npm:^0.4.2": + version: 0.4.2 + resolution: "@eslint/config-helpers@npm:0.4.2" + dependencies: + "@eslint/core": ^0.17.0 + checksum: 63ff6a0730c9fff2edb80c89b39b15b28d6a635a1c3f32cf0d7eb3e2625f2efbc373c5531ae84e420ae36d6e37016dd40c365b6e5dee6938478e9907aaadae0b languageName: node linkType: hard -"@eslint/core@npm:^0.14.0": - version: 0.14.0 - resolution: "@eslint/core@npm:0.14.0" +"@eslint/core@npm:^0.17.0": + version: 0.17.0 + resolution: "@eslint/core@npm:0.17.0" dependencies: "@types/json-schema": ^7.0.15 - checksum: d68b8282b6f38c5145234f812f18f491d12d716240875591bd54bf5ac32858d979bdf6d38e521997a6e01f2c4223a3e66049714151da7278d0a95ff15b5d46c8 + checksum: ff9b5b4987f0bae4f2a4cfcdc7ae584ad3b0cb58526ca562fb281d6837700a04c7f3c86862e95126462318f33f60bf38e1cb07ed0e2449532d4b91cd5f4ab1f2 languageName: node linkType: hard @@ -1803,36 +1819,36 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.27.0, @eslint/js@npm:^9.22.0": - version: 9.27.0 - resolution: "@eslint/js@npm:9.27.0" - checksum: b31cfd61bb64e187f8758d13c893bf710f0500c29ced5dd6958c4fda254059489f1cee69567c20ba21608ce51224019b1fd10975b09d41adf16616d875da6ea4 +"@eslint/js@npm:9.39.1, @eslint/js@npm:^9.22.0": + version: 9.39.1 + resolution: "@eslint/js@npm:9.39.1" + checksum: b651930aec03a5aef97bc144627aebb05070afec5364cd3c5fd7c5dbb97f4fd82faf1b200b3be17572d5ebb7f8805211b655f463be96f2b02202ec7250868048 languageName: node linkType: hard -"@eslint/object-schema@npm:^2.1.6": - version: 2.1.6 - resolution: "@eslint/object-schema@npm:2.1.6" - checksum: e32e565319f6544d36d3fa69a3e163120722d12d666d1a4525c9a6f02e9b54c29d9b1f03139e25d7e759e08dda8da433590bc23c09db8d511162157ef1b86a4c +"@eslint/object-schema@npm:^2.1.7": + version: 2.1.7 + resolution: "@eslint/object-schema@npm:2.1.7" + checksum: fc5708f192476956544def13455d60fd1bafbf8f062d1e05ec5c06dd470b02078eaf721e696a8b31c1c45d2056723a514b941ae5eea1398cc7e38eba6711a775 languageName: node linkType: hard -"@eslint/plugin-kit@npm:^0.3.1": - version: 0.3.1 - resolution: "@eslint/plugin-kit@npm:0.3.1" +"@eslint/plugin-kit@npm:^0.4.1": + version: 0.4.1 + resolution: "@eslint/plugin-kit@npm:0.4.1" dependencies: - "@eslint/core": ^0.14.0 + "@eslint/core": ^0.17.0 levn: ^0.4.1 - checksum: 8de2438456d9a741c909dd22a60454793c0147e1a13833717e4109c46f5a6b090780e8d9e940a3b3b9bf3643d01a0e726cc74f28ccd7caac95053bb39c2e6c04 + checksum: 3f4492e02a3620e05d46126c5cfeff5f651ecf33466c8f88efb4812ae69db5f005e8c13373afabc070ecca7becd319b656d6670ad5093f05ca63c2a8841d99ba languageName: node linkType: hard "@evilmartians/lefthook@npm:^1.5.0": - version: 1.11.13 - resolution: "@evilmartians/lefthook@npm:1.11.13" + version: 1.13.6 + resolution: "@evilmartians/lefthook@npm:1.13.6" bin: lefthook: bin/index.js - checksum: 94d85f52e85c80094f0128e76ae18785e7d7b4950a11de1203f33d9deea14964c86db04d4d6f673ff96cd36d9376d4f231758e8afcce4caf06efdb5552c20a03 + checksum: 6cceca3e874015678f50818ae14a74d959816cfaba6638f8852d007332404d6819b15c71538985a3650a1ef057aa6975c17fadfe43ece7a0da1aeb9faaf02946 conditions: (os=darwin | os=linux | os=win32) & (cpu=x64 | cpu=arm64 | cpu=ia32) languageName: node linkType: hard @@ -1861,12 +1877,12 @@ __metadata: linkType: hard "@humanfs/node@npm:^0.16.6": - version: 0.16.6 - resolution: "@humanfs/node@npm:0.16.6" + version: 0.16.7 + resolution: "@humanfs/node@npm:0.16.7" dependencies: "@humanfs/core": ^0.19.1 - "@humanwhocodes/retry": ^0.3.0 - checksum: f9cb52bb235f8b9c6fcff43a7e500669a38f8d6ce26593404a9b56365a1644e0ed60c720dc65ff6a696b1f85f3563ab055bb554ec8674f2559085ba840e47710 + "@humanwhocodes/retry": ^0.4.0 + checksum: 7d2a396a94d80158ce320c0fd7df9aebb82edb8b667e5aaf8f87f4ca50518d0941ca494e0cd68e06b061e777ce5f7d26c45f93ac3fa9f7b11fd1ff26e3cd1440 languageName: node linkType: hard @@ -1877,14 +1893,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/retry@npm:^0.3.0": - version: 0.3.1 - resolution: "@humanwhocodes/retry@npm:0.3.1" - checksum: 7e5517bb51dbea3e02ab6cacef59a8f4b0ca023fc4b0b8cbc40de0ad29f46edd50b897c6e7fba79366a0217e3f48e2da8975056f6c35cfe19d9cc48f1d03c1dd - languageName: node - linkType: hard - -"@humanwhocodes/retry@npm:^0.4.2": +"@humanwhocodes/retry@npm:^0.4.0, @humanwhocodes/retry@npm:^0.4.2": version: 0.4.3 resolution: "@humanwhocodes/retry@npm:0.4.3" checksum: d423455b9d53cf01f778603404512a4246fb19b83e74fe3e28c70d9a80e9d4ae147d2411628907ca983e91a855a52535859a8bb218050bc3f6dbd7a553b7b442 @@ -1906,9 +1915,9 @@ __metadata: linkType: hard "@inquirer/figures@npm:^1.0.3": - version: 1.0.11 - resolution: "@inquirer/figures@npm:1.0.11" - checksum: 6be2867050f5c179d9fcc389a4a3e9aca6ac45fd02106918eba2d6c27a7251a48693ac13fcf9f084e25bf963eb51045c23ca9e87c523e318b0e286d4173449a9 + version: 1.0.14 + resolution: "@inquirer/figures@npm:1.0.14" + checksum: 37eec986f119eabb6c231c8c1481c6a48ab2347e9f57b2d6442161f7b83936678221fccb7ead60582026c2ae20d457467d0727c485ff53aee2cf965077b0f51b languageName: node linkType: hard @@ -2042,6 +2051,13 @@ __metadata: languageName: node linkType: hard +"@jest/diff-sequences@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/diff-sequences@npm:30.0.1" + checksum: e5f931ca69c15a9b3a9b23b723f51ffc97f031b2f3ca37f901333dab99bd4dfa1ad4192a5cd893cd1272f7602eb09b9cfb5fc6bb62a0232c96fb8b5e96094970 + languageName: node + linkType: hard + "@jest/environment@npm:^29.7.0": version: 29.7.0 resolution: "@jest/environment@npm:29.7.0" @@ -2087,6 +2103,13 @@ __metadata: languageName: node linkType: hard +"@jest/get-type@npm:30.1.0": + version: 30.1.0 + resolution: "@jest/get-type@npm:30.1.0" + checksum: e2a95fbb49ce2d15547db8af5602626caf9b05f62a5e583b4a2de9bd93a2bfe7175f9bbb2b8a5c3909ce261d467b6991d7265bb1d547cb60e7e97f571f361a70 + languageName: node + linkType: hard + "@jest/globals@npm:^29.7.0": version: 29.7.0 resolution: "@jest/globals@npm:29.7.0" @@ -2136,6 +2159,15 @@ __metadata: languageName: node linkType: hard +"@jest/schemas@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/schemas@npm:30.0.5" + dependencies: + "@sinclair/typebox": ^0.34.0 + checksum: 7a4fc4166f688947c22d81e61aaf2cb22f178dbf6ee806b0931b75136899d426a72a8330762f27f0cf6f79da0d2a56f49a22fe09f5f80df95a683ed237a0f3b0 + languageName: node + linkType: hard + "@jest/schemas@npm:^29.6.3": version: 29.6.3 resolution: "@jest/schemas@npm:29.6.3" @@ -2230,14 +2262,23 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.8 - resolution: "@jridgewell/gen-mapping@npm:0.3.8" +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: - "@jridgewell/set-array": ^1.2.1 - "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/sourcemap-codec": ^1.5.0 "@jridgewell/trace-mapping": ^0.3.24 - checksum: c0687b5227461717aa537fe71a42e356bcd1c43293b3353796a148bf3b0d6f59109def46c22f05b60e29a46f19b2e4676d027959a7c53a6c92b9d5b0d87d0420 + checksum: f2105acefc433337145caa3c84bba286de954f61c0bc46279bbd85a9e6a02871089717fa060413cfb6a9d44189fe8313b2d1cabf3a2eb3284d208fd5f75c54ff + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: 4a66a7397c3dc9c6b5c14a0024b1f98c5e1d90a0dbc1e5955b5038f2db339904df2a0ee8a66559fafb4fc23ff33700a2639fd40bbdd2e9e82b58b3bdf83738e3 languageName: node linkType: hard @@ -2248,37 +2289,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 @@ -2348,8 +2382,8 @@ __metadata: linkType: hard "@octokit/core@npm:^5.0.2": - version: 5.2.1 - resolution: "@octokit/core@npm:5.2.1" + version: 5.2.2 + resolution: "@octokit/core@npm:5.2.2" dependencies: "@octokit/auth-token": ^4.0.0 "@octokit/graphql": ^7.1.0 @@ -2358,7 +2392,7 @@ __metadata: "@octokit/types": ^13.0.0 before-after-hook: ^2.2.0 universal-user-agent: ^6.0.0 - checksum: a7076095ec1109bb9273764a2b561b323368e96ea2c1257cef1d48107fe6493f363cfa84539da2d182b065831667c1baa85b00e99712079e299e06b46ba8693b + checksum: d4303d808c6b8eca32ce03381db5f6230440c1c6cfd9d73376ed583973094abd8ca56d9a64d490e6b0045f827a8f913b619bd90eae99c2cba682487720dc8002 languageName: node linkType: hard @@ -2472,10 +2506,10 @@ __metadata: languageName: node linkType: hard -"@pkgr/core@npm:^0.2.4": - version: 0.2.4 - resolution: "@pkgr/core@npm:0.2.4" - checksum: 8544f0346c3f7035b9e2fdf60179c68b12d3c76b3fba9533844099af67cf5c0ce5257538f5faa05953d48cc1536d046f003231f321b2f75b3fb449db8410a2b7 +"@pkgr/core@npm:^0.2.9": + version: 0.2.9 + resolution: "@pkgr/core@npm:0.2.9" + checksum: bb2fb86977d63f836f8f5b09015d74e6af6488f7a411dcd2bfdca79d76b5a681a9112f41c45bdf88a9069f049718efc6f3900d7f1de66a2ec966068308ae517f languageName: node linkType: hard @@ -2684,6 +2718,16 @@ __metadata: languageName: node linkType: hard +"@react-native-picker/picker@npm:^2.11.4": + version: 2.11.4 + resolution: "@react-native-picker/picker@npm:2.11.4" + peerDependencies: + react: "*" + react-native: "*" + checksum: 03c34770ce137a149f2aea54cef38fa871df2d5207089d7041c12beff20d1ca4340eb3fa8aed09e1a7d5899c813187cf5c217571789482061fee5e4e4a0e4e34 + languageName: node + linkType: hard + "@react-native/assets-registry@npm:0.79.2": version: 0.79.2 resolution: "@react-native/assets-registry@npm:0.79.2" @@ -2819,12 +2863,12 @@ __metadata: linkType: hard "@react-native/eslint-config@npm:^0.78.0": - version: 0.78.2 - resolution: "@react-native/eslint-config@npm:0.78.2" + version: 0.78.3 + resolution: "@react-native/eslint-config@npm:0.78.3" dependencies: "@babel/core": ^7.25.2 "@babel/eslint-parser": ^7.25.1 - "@react-native/eslint-plugin": 0.78.2 + "@react-native/eslint-plugin": 0.78.3 "@typescript-eslint/eslint-plugin": ^7.1.1 "@typescript-eslint/parser": ^7.1.1 eslint-config-prettier: ^8.5.0 @@ -2837,14 +2881,14 @@ __metadata: peerDependencies: eslint: ">=8" prettier: ">=2" - checksum: 4cbdf40717a3f51432f685364ad81a2fd8bf7746d9dcb1e285900ddafdea777b058c931daf2a23916f909498ae756f0f1baab4636596a90653cd9a0e59ac9b84 + checksum: 92aaa23067b99ed6783f28ff51d7e39b8e7363b173d5a449ecb101b84913ea6224649a76729eb805ab9003843d2ce674acf61db14dc95475b9070748a382386f languageName: node linkType: hard -"@react-native/eslint-plugin@npm:0.78.2": - version: 0.78.2 - resolution: "@react-native/eslint-plugin@npm:0.78.2" - checksum: d79285f702e25e467525cb55ae824c50c7333138cce1295b4a1c046f11c68e7bd43ffa0c78fb0e5b1a59be92a5cf44e59c2bfc16e6c2e5b2550ea251f3cb65c6 +"@react-native/eslint-plugin@npm:0.78.3": + version: 0.78.3 + resolution: "@react-native/eslint-plugin@npm:0.78.3" + checksum: b14a613641a2f79db83268661aa2bf82ab97cf13c6a00e30745d7c689d4b3551b05109d1fe833b58659b728b411b37255f221d9a91d9cd58f2badbc68c4bdcec languageName: node linkType: hard @@ -2919,80 +2963,83 @@ __metadata: languageName: node linkType: hard -"@react-navigation/core@npm:^7.9.2": - version: 7.9.2 - resolution: "@react-navigation/core@npm:7.9.2" +"@react-navigation/core@npm:^7.13.0": + version: 7.13.0 + resolution: "@react-navigation/core@npm:7.13.0" dependencies: - "@react-navigation/routers": ^7.3.7 + "@react-navigation/routers": ^7.5.1 escape-string-regexp: ^4.0.0 + fast-deep-equal: ^3.1.3 nanoid: ^3.3.11 query-string: ^7.1.3 react-is: ^19.1.0 - use-latest-callback: ^0.2.3 + use-latest-callback: ^0.2.4 use-sync-external-store: ^1.5.0 peerDependencies: react: ">= 18.2.0" - checksum: 346040b232b8e9dae6930cc8dd306020d3c6779d0aaf704947ca7279b7862aa0fc2e91abdcd8cc25b373d98435d787149539ca86e314317e7a5465df1e640239 + checksum: e6c99df003b274aacd9c39121ad5497574efb316af6b584b739ff134fc39726b59825245a6afdea62100fa51622af78c431907112d07f62e6e3a9c8d16332023 languageName: node linkType: hard -"@react-navigation/elements@npm:^2.4.2": - version: 2.4.2 - resolution: "@react-navigation/elements@npm:2.4.2" +"@react-navigation/elements@npm:^2.8.1": + version: 2.8.1 + resolution: "@react-navigation/elements@npm:2.8.1" dependencies: color: ^4.2.3 + use-latest-callback: ^0.2.4 + use-sync-external-store: ^1.5.0 peerDependencies: "@react-native-masked-view/masked-view": ">= 0.2.0" - "@react-navigation/native": ^7.1.9 + "@react-navigation/native": ^7.1.19 react: ">= 18.2.0" react-native: "*" react-native-safe-area-context: ">= 4.0.0" peerDependenciesMeta: "@react-native-masked-view/masked-view": optional: true - checksum: 5fee0e6601d50512256028c5de9da924ab17e5edbdfbf84963c1e95b0a3da05eb09aa753111453f3a9701b7d123dbb14c2ce2bff888ec9488fcc893872e2e079 + checksum: 82e2d4ae99ef0dad3f8a8a70fe8678d7ee41e4e216859ec78e720a0816efdb370940ccbfc7f75874fcd98207336b09cbc44e6a4d38192f7474ef330052bb9195 languageName: node linkType: hard "@react-navigation/native@npm:^7.1.9": - version: 7.1.9 - resolution: "@react-navigation/native@npm:7.1.9" + version: 7.1.19 + resolution: "@react-navigation/native@npm:7.1.19" dependencies: - "@react-navigation/core": ^7.9.2 + "@react-navigation/core": ^7.13.0 escape-string-regexp: ^4.0.0 fast-deep-equal: ^3.1.3 nanoid: ^3.3.11 - use-latest-callback: ^0.2.3 + use-latest-callback: ^0.2.4 peerDependencies: react: ">= 18.2.0" react-native: "*" - checksum: 3dd504d6d7c4482612c48909754d051a68b36d5d7cdf1ae610333da99c1309e194b65cd4e79ed343dd12cbbb55a3fb856453830d6cb45b54f6f3fe88464667cd + checksum: 3215388017fef5ec6ecca19a128ef11d8b535f7534bfff15f931773b6849b2ee4ed0914c69eb264132e597700368df97d8991cf19d84f7d18ef1a0abd3ec6db6 languageName: node linkType: hard -"@react-navigation/routers@npm:^7.3.7": - version: 7.3.7 - resolution: "@react-navigation/routers@npm:7.3.7" +"@react-navigation/routers@npm:^7.5.1": + version: 7.5.1 + resolution: "@react-navigation/routers@npm:7.5.1" dependencies: nanoid: ^3.3.11 - checksum: cc3fb52957220adb8486c5546c78e4a9a92863f44368e5aeec74e6d3a31a9930d24e0cf022d91a7074a8e7d779690e11994f8f1254aaf0035d0d55b1656d8a3f + checksum: 49f04894f7e8b8e2c16abb96bbc1a9775a02341bb00fb9c0d9ce97f8d82613c27570921f2b854f8fd1639c29309df05345aa734124d48bdbcb5a934055b8af12 languageName: node linkType: hard "@react-navigation/stack@npm:^7.3.2": - version: 7.3.2 - resolution: "@react-navigation/stack@npm:7.3.2" + version: 7.6.2 + resolution: "@react-navigation/stack@npm:7.6.2" dependencies: - "@react-navigation/elements": ^2.4.2 + "@react-navigation/elements": ^2.8.1 color: ^4.2.3 peerDependencies: - "@react-navigation/native": ^7.1.9 + "@react-navigation/native": ^7.1.19 react: ">= 18.2.0" react-native: "*" react-native-gesture-handler: ">= 2.0.0" react-native-safe-area-context: ">= 4.0.0" react-native-screens: ">= 4.0.0" - checksum: 418c86f5b24915a834e9fbf9bb3603967058ae70d3cfcc9f8be17770e0a56fe78518e3ff421f224014608f2d272c04fe45b7b4532c998cb6fac0f1c9bb1c08c9 + checksum: 4b9fa85d3c6f34aa645af1e497ff9005142998fbad2a0891ed4bb8f266148581235ac172081d38729ab2b7ba3138706d7df165ae0f6da2c2be0a6be83ef2e2ec languageName: node linkType: hard @@ -3041,6 +3088,13 @@ __metadata: languageName: node linkType: hard +"@sinclair/typebox@npm:^0.34.0": + version: 0.34.41 + resolution: "@sinclair/typebox@npm:0.34.41" + checksum: dbcfdc55caef47ef5b728c2bc6979e50d00ee943b63eaaf604551be9a039187cdd256d810b790e61fdf63131df54b236149aef739d83bfe9a594a9863ac28115 + languageName: node + linkType: hard + "@sindresorhus/merge-streams@npm:^2.1.0": version: 2.3.0 resolution: "@sindresorhus/merge-streams@npm:2.3.0" @@ -3066,6 +3120,48 @@ __metadata: languageName: node linkType: hard +"@testing-library/react-hooks@npm:^8.0.1": + version: 8.0.1 + resolution: "@testing-library/react-hooks@npm:8.0.1" + dependencies: + "@babel/runtime": ^7.12.5 + react-error-boundary: ^3.1.0 + peerDependencies: + "@types/react": ^16.9.0 || ^17.0.0 + react: ^16.9.0 || ^17.0.0 + react-dom: ^16.9.0 || ^17.0.0 + react-test-renderer: ^16.9.0 || ^17.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + react-dom: + optional: true + react-test-renderer: + optional: true + checksum: 7fe44352e920deb5cb1876f80d64e48615232072c9d5382f1e0284b3aab46bb1c659a040b774c45cdf084a5257b8fe463f7e08695ad8480d8a15635d4d3d1f6d + languageName: node + linkType: hard + +"@testing-library/react-native@npm:^13.3.3": + version: 13.3.3 + resolution: "@testing-library/react-native@npm:13.3.3" + dependencies: + jest-matcher-utils: ^30.0.5 + picocolors: ^1.1.1 + pretty-format: ^30.0.5 + redent: ^3.0.0 + peerDependencies: + jest: ">=29.0.0" + react: ">=18.2.0" + react-native: ">=0.71" + react-test-renderer: ">=18.2.0" + peerDependenciesMeta: + jest: + optional: true + checksum: 5688918384ce834e3667a56b72c8b776a2f9a5afae0a2738e7d0077f342b3ade7eca628cbe122943201caee75f3718379ef7b3ca00cd50c4ee607b4131d09505 + languageName: node + linkType: hard + "@tootallnate/quickjs-emscripten@npm:^0.23.0": version: 0.23.0 resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" @@ -3117,27 +3213,27 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.7 - resolution: "@types/babel__traverse@npm:7.20.7" + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - "@babel/types": ^7.20.7 - checksum: 2a2e5ad29c34a8b776162b0fe81c9ccb6459b2b46bf230f756ba0276a0258fcae1cbcfdccbb93a1e8b1df44f4939784ee8a1a269f95afe0c78b24b9cb6d50dd1 + "@babel/types": ^7.28.2 + checksum: e3124e6575b2f70de338eab8a9c704d315a86c46a8e395b6ec78a0157ab7b5fd877289556a57dcf28e4ff3543714e359cc1182d4afc4bcb4f3575a0bbafa0dad languageName: node linkType: hard "@types/conventional-commits-parser@npm:^5.0.0": - version: 5.0.1 - resolution: "@types/conventional-commits-parser@npm:5.0.1" + version: 5.0.2 + resolution: "@types/conventional-commits-parser@npm:5.0.2" dependencies: "@types/node": "*" - checksum: b4eb4f22051d42e7ed9fd3bffe6ea0cf62ae493a3c6c775a16babbad977c934f4c09ec3fa93020894de2073d63cfcd3a27dd5f00984966161da6797dd88a0f0d + checksum: bd05e0f0619737c6bb7e663e6274adf41f7c7d5742ec297b4b6095b3dcf328f81dab60668ba38cf51aff83c6e8135666b418e533ce4a2724053f40b82a5d4ca9 languageName: node linkType: hard "@types/estree@npm:^1.0.6": - version: 1.0.7 - resolution: "@types/estree@npm:1.0.7" - checksum: d9312b7075bdd08f3c9e1bb477102f5458aaa42a8eec31a169481ce314ca99ac716645cff4fca81ea65a2294b0276a0de63159d1baca0f8e7b5050a92de950ad + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: bd93e2e415b6f182ec4da1074e1f36c480f1d26add3e696d54fb30c09bc470897e41361c8fd957bf0985024f8fbf1e6e2aff977d79352ef7eb93a5c6dcff6c11 languageName: node linkType: hard @@ -3207,11 +3303,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.15.20 - resolution: "@types/node@npm:22.15.20" + version: 24.10.0 + resolution: "@types/node@npm:24.10.0" dependencies: - undici-types: ~6.21.0 - checksum: e672d7c630c3ade5988e7933dabe06b7a98648764e84023a345aecf6f810adb049637b392bdfe00b3773ef2cc905da87e9e43b5fceddd064a4a93c0da2ad3b64 + undici-types: ~7.16.0 + checksum: 268c843faae02ba88be2441759c26e73038583a7e221fa3000f2c1d7fdc1d06b28cb514fc5367f7cb147c3519cd25ddafdfa1f8566829b91fb096262ebe3f7bb languageName: node linkType: hard @@ -3223,18 +3319,18 @@ __metadata: linkType: hard "@types/react@npm:^19.0.0": - version: 19.1.4 - resolution: "@types/react@npm:19.1.4" + version: 19.2.2 + resolution: "@types/react@npm:19.2.2" dependencies: csstype: ^3.0.2 - checksum: 36dcbd7a2e78b011e61cddc3e97b5e8556d789a404a2e4847f9b88aaf46189a35d1c5becf93baa1bab89258a1cc1102ef295ffe3c1d008cfa95c4d4e1036606f + checksum: 7eb2d316dd5a6c02acb416524b50bae932c38d055d26e0f561ca23c009c686d16a2b22fcbb941eecbe2ecb167f119e29b9d0142d9d056dd381352c43413b60da languageName: node linkType: hard "@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.5": - version: 7.7.0 - resolution: "@types/semver@npm:7.7.0" - checksum: d488eaeddb23879a0a8a759bed667e1a76cb0dd4d23e3255538e24c189db387357953ca9e7a3bda2bb7f95e84cac8fe0db4fbe6b3456e893043337732d1d23cc + version: 7.7.1 + resolution: "@types/semver@npm:7.7.1" + checksum: 76d218e414482a398148d5c28f2bfa017108869f3fc18cda379c9d8d062348f8b9653ae2fa8642d3b5b52e211928fe8be34f22da4e1f08245c84e0e51e040673 languageName: node linkType: hard @@ -3262,11 +3358,11 @@ __metadata: linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.33 - resolution: "@types/yargs@npm:17.0.33" + version: 17.0.34 + resolution: "@types/yargs@npm:17.0.34" dependencies: "@types/yargs-parser": "*" - checksum: ee013f257472ab643cb0584cf3e1ff9b0c44bca1c9ba662395300a7f1a6c55fa9d41bd40ddff42d99f5d95febb3907c9ff600fbcb92dadbec22c6a76de7e1236 + checksum: 8f39dad7e345236b1c92ddc20dcee74b01d5322639054fe0c494b3d870ce0d784f8fd6ed81f5d010671625ae95b216ac9df13662c079afd112503b0ffd949e5e languageName: node linkType: hard @@ -3505,12 +3601,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.14.0": - version: 8.14.1 - resolution: "acorn@npm:8.14.1" +"acorn@npm:^8.15.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: 260d9bb6017a1b6e42d31364687f0258f78eb20210b36ef2baad38fd619d78d4e95ff7dde9b3dbe0d81f137f79a8d651a845363a26e6985997f7b71145dc5e94 + checksum: 309c6b49aedf1a2e34aaf266de06de04aab6eb097c02375c66fdeb0f64556a6a823540409914fb364d9a11bc30d79d485a2eba29af47992d3490e9886c4391c3 languageName: node linkType: hard @@ -3522,9 +3618,9 @@ __metadata: linkType: hard "agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 87bb7ee54f5ecf0ccbfcba0b07473885c43ecd76cb29a8db17d6137a19d9f9cd443a2a7c5fd8a3f24d58ad8145f9eb49116344a66b107e1aeab82cf2383f4753 + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 86a7f542af277cfbd77dd61e7df8422f90bac512953709003a1c530171a9d019d072e2400eab2b59f84b49ab9dd237be44315ca663ac73e82b3922d10ea5eafa languageName: node linkType: hard @@ -3623,9 +3719,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 9b17ce2c6daecc75bcd5966b9ad672c23b184dc3ed9bf3c98a0702f0d2f736c15c10d461913568f2cf527a5e64291c7473358885dd493305c84a1cfed66ba94f languageName: node linkType: hard @@ -3647,7 +3743,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^5.0.0": +"ansi-styles@npm:^5.0.0, ansi-styles@npm:^5.2.0": version: 5.2.0 resolution: "ansi-styles@npm:5.2.0" checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 @@ -3655,9 +3751,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 @@ -3694,13 +3790,23 @@ __metadata: languageName: node linkType: hard +"arkregex@npm:0.0.2": + version: 0.0.2 + resolution: "arkregex@npm:0.0.2" + dependencies: + "@ark/util": 0.53.0 + checksum: 5b6780b885398a89352f4278a6afb7d4d93820839fb00bfe5eb92a90fd282810750a4f00b025a1924b56654357e70ca5c5ec2ced01302d0e76c011704c4bb596 + languageName: node + linkType: hard + "arktype@npm:^2.1.15": - version: 2.1.20 - resolution: "arktype@npm:2.1.20" + version: 2.1.25 + resolution: "arktype@npm:2.1.25" dependencies: - "@ark/schema": 0.46.0 - "@ark/util": 0.46.0 - checksum: 5c02dda98606b83b35bbc66934259e3f30c4b4486c32e470e199da533c0af568951502173d7d7a5e64a2e53667eb36d10d772ce46c0bff204fab759430614c9b + "@ark/schema": 0.53.0 + "@ark/util": 0.53.0 + arkregex: 0.0.2 + checksum: f06ee4792cfb7eb991b523e4e88d4fbfb4329b36311cc761337dab46c59392dececd8584905327290cd6926ec748313b8479ccadd435fa5b70966e316b4e6c05 languageName: node linkType: hard @@ -3722,16 +3828,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 @@ -3845,6 +3953,13 @@ __metadata: languageName: node linkType: hard +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 74a71a4a2dd7afd06ebb612f6d612c7f4766a351bedffde466023bf6dae629e46b0d2cd38786239e0fbf245de0c7df76035465e16d1213774a0efb22fec0d713 + languageName: node + linkType: hard + "async-limiter@npm:~1.0.0": version: 1.0.1 resolution: "async-limiter@npm:1.0.1" @@ -3862,12 +3977,12 @@ __metadata: linkType: hard "atomically@npm:^2.0.3": - version: 2.0.3 - resolution: "atomically@npm:2.0.3" + version: 2.1.0 + resolution: "atomically@npm:2.1.0" dependencies: - stubborn-fs: ^1.2.5 - when-exit: ^2.1.1 - checksum: 4ee528fe35b4bc84cd626f6414cd2b51f04f94c2f6e8ab5c97d056779ef507bdd1e2671056957a031e6b487571fcc0a8627e8660645e6d61c84e561ae71cc8b6 + stubborn-fs: ^2.0.0 + when-exit: ^2.1.4 + checksum: 5ee3f88b6096c045e545a6ce8f9c9ec7d88ae1e547ab6c6f1b9d95fb85ff5faf49a8f1fe9197f8e439b253e49602db802fc40f8529816887707e457a43898f0e languageName: node linkType: hard @@ -3922,39 +4037,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.13 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.13" +"babel-plugin-polyfill-corejs2@npm:^0.4.14": + version: 0.4.14 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.14" dependencies: - "@babel/compat-data": ^7.22.6 - "@babel/helper-define-polyfill-provider": ^0.6.4 + "@babel/compat-data": ^7.27.7 + "@babel/helper-define-polyfill-provider": ^0.6.5 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 553b64eb11bad2cfc220e94f1fb2449755b5c7d54886dca6d8053b13b6e910f349a38bbc75aafd610f88217699db499548919bb5df653d635b9cdeb39d34a68d + checksum: d654334c1b4390d08282416144b7b6f3d74d2cab44b2bfa2b6405c828882c82907b8b67698dce1be046c218d2d4fe5bf7fb6d01879938f3129dad969e8cfc44d languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.11.0": - version: 0.11.1 - resolution: "babel-plugin-polyfill-corejs3@npm:0.11.1" +"babel-plugin-polyfill-corejs3@npm:^0.13.0": + version: 0.13.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" dependencies: - "@babel/helper-define-polyfill-provider": ^0.6.3 - core-js-compat: ^3.40.0 + "@babel/helper-define-polyfill-provider": ^0.6.5 + core-js-compat: ^3.43.0 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: ee39440475ef377a1570ccbc06b1a1d274cbfbbe2e7c3d4c60f38781a47f00a28bd10d8e23430828b965820c41beb2c93c84596baf72583a2c9c3fdfa4397994 + checksum: cf526031acd97ff2124e7c10e15047e6eeb0620d029c687f1dca99916a8fe6cac0e634b84c913db6cb68b7a024f82492ba8fdcc2a6266e7b05bdac2cba0c2434 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.4 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.4" +"babel-plugin-polyfill-regenerator@npm:^0.6.5": + version: 0.6.5 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.5" dependencies: - "@babel/helper-define-polyfill-provider": ^0.6.4 + "@babel/helper-define-polyfill-provider": ^0.6.5 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: f4d4a803834ffa72713579d696586d8cc654c0025cbd5ec775fc5d37faa00381dcb80e5b97d4b16059443352653585596d87848b5590b1d8670c235408e73fb3 + checksum: ed1932fa9a31e0752fd10ebf48ab9513a654987cab1182890839523cb898559d24ae0578fdc475d9f995390420e64eeaa4b0427045b56949dace3c725bc66dbb languageName: node linkType: hard @@ -3986,8 +4101,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 @@ -4005,8 +4120,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 @@ -4036,6 +4151,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.8.19": + version: 2.8.24 + resolution: "baseline-browser-mapping@npm:2.8.24" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 426df57ec914b3934e8d5ee294e84a8dfc0430acfda075cc2f6e321018ed9f8ebc4d416457c434da41c15d36ab2077fadad32f8b92a3266f1d59daa4278e8874 + languageName: node + linkType: hard + "basic-ftp@npm:^5.0.2": version: 5.0.5 resolution: "basic-ftp@npm:5.0.5" @@ -4098,21 +4222,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 @@ -4125,17 +4249,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.24.4": - version: 4.24.5 - resolution: "browserslist@npm:4.24.5" +"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.26.3": + version: 4.27.0 + resolution: "browserslist@npm:4.27.0" dependencies: - caniuse-lite: ^1.0.30001716 - electron-to-chromium: ^1.5.149 - node-releases: ^2.0.19 - update-browserslist-db: ^1.1.3 + baseline-browser-mapping: ^2.8.19 + caniuse-lite: ^1.0.30001751 + electron-to-chromium: ^1.5.238 + node-releases: ^2.0.26 + update-browserslist-db: ^1.1.4 bin: browserslist: cli.js - checksum: 69310ade58b0cb2b2871022fdaba8388902f9a2d17a6fa05f383d046d6da87fd9f83018a66fe1c6296648ca7d52e3208c3fc68c82f17a0fd4bf12a452c036247 + checksum: 01dc8428f5deb018bf99d3d8da1dd41bb0ca8a65af0b371e3b5386f5eef11f0c15ec741fc0686ca0d85aafc8f20036c4330e37bcc6b448a7424012128ded8c96 languageName: node linkType: hard @@ -4298,14 +4423,14 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001716": - version: 1.0.30001718 - resolution: "caniuse-lite@npm:1.0.30001718" - checksum: c6598b6eb2c4358fc9f8ead8982bf5f9efdc1f29bb74948b9481d314ced10675bd0beb99771094ac52d56c2cec121049d1f18e9405cab7d81807816d1836b38a +"caniuse-lite@npm:^1.0.30001751": + version: 1.0.30001753 + resolution: "caniuse-lite@npm:1.0.30001753" + checksum: d38b17895a99bf1ba9f1a8076233e3d4a606cd0121ccdb381ea94c651aaea0e1587ba3922b11dde4eb153b6741ac3e129fc670df0a7251987ed8619f09059b8a 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 @@ -4322,6 +4447,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" @@ -4386,9 +4518,9 @@ __metadata: linkType: hard "ci-info@npm:^4.1.0": - version: 4.2.0 - resolution: "ci-info@npm:4.2.0" - checksum: 0e3726721526f54c5b17cf44ab2ed69b842c756bcb4d2b26ce279e595a80a856aec9fb38a2986a2baca3de73d15895f3a01d2771c4aad93c898aae7e3ca0ceb1 + version: 4.3.1 + resolution: "ci-info@npm:4.3.1" + checksum: 66c159d92648e8a07acab0a3a0681bff6ccc39aa44916263208c4d97bbbeedbbc886d7611fd30c21df1aa624ce3c6fcdfde982e74689e3e014e064e1d0805f94 languageName: node linkType: hard @@ -4509,9 +4641,9 @@ __metadata: linkType: hard "collect-v8-coverage@npm:^1.0.0": - version: 1.0.2 - resolution: "collect-v8-coverage@npm:1.0.2" - checksum: c10f41c39ab84629d16f9f6137bc8a63d332244383fc368caf2d2052b5e04c20cd1fd70f66fcf4e2422b84c8226598b776d39d5f2d2a51867cc1ed5d1982b4da + version: 1.0.3 + resolution: "collect-v8-coverage@npm:1.0.3" + checksum: ed1d1ebc9c05e7263fffa3ad6440031db6a1fdd9f574435aa689effcdfe9f2b93aba8ec600f9c7b99124cd6ff5d9415c17961d84ae829a72251a4fe668a49b63 languageName: node linkType: hard @@ -4634,17 +4766,17 @@ __metadata: linkType: hard "compression@npm:^1.7.1": - version: 1.8.0 - resolution: "compression@npm:1.8.0" + version: 1.8.1 + resolution: "compression@npm:1.8.1" dependencies: bytes: 3.1.2 compressible: ~2.0.18 debug: 2.6.9 negotiator: ~0.6.4 - on-headers: ~1.0.2 + on-headers: ~1.1.0 safe-buffer: 5.2.1 vary: ~1.1.2 - checksum: 12ca3e326b4ccb6b6e51e1d14d96fafd058ddb3be08fe888487d367d42fb4f81f25d4bf77acc517ba724370e7d74469280688baf2da8cad61062bdf62eb9fd45 + checksum: 906325935180cd3507d30ed898fb129deccab03689383d55536245a94610f5003923bb14c95ee6adc8d658ee13be549407eb4346ef55169045f3e41e9969808e languageName: node linkType: hard @@ -4678,14 +4810,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 @@ -4718,11 +4850,11 @@ __metadata: linkType: hard "conventional-changelog-angular@npm:^8.0.0": - version: 8.0.0 - resolution: "conventional-changelog-angular@npm:8.0.0" + version: 8.1.0 + resolution: "conventional-changelog-angular@npm:8.1.0" dependencies: compare-func: ^2.0.0 - checksum: 71f492cb4dccd46174430517177054be2e2097f1264c55419a79aa94fe4d163f98aeab7da6836473470fbfc920051a9554f46498989bdd6438648c2d7e32b42c + checksum: 1f14b235ab09b74e658353aa8ce559ec99de34f6c3e54923fee327291373baa720143a3172d12ae17cc3d9634b34a7bee57559c211354c9557d33743e5245f75 languageName: node linkType: hard @@ -4821,8 +4953,8 @@ __metadata: linkType: hard "conventional-changelog-writer@npm:^8.0.0": - version: 8.1.0 - resolution: "conventional-changelog-writer@npm:8.1.0" + version: 8.2.0 + resolution: "conventional-changelog-writer@npm:8.2.0" dependencies: conventional-commits-filter: ^5.0.0 handlebars: ^4.7.7 @@ -4830,7 +4962,7 @@ __metadata: semver: ^7.5.2 bin: conventional-changelog-writer: dist/cli/index.js - checksum: cf3122058186f1e0ceaaa321fdad22c4ff2cbd830115747a695be153184692800e4bf51e54487884c3809c87b52f7933a968b53f44e2a25ad56993ffc2034cf1 + checksum: 0a7b62fdc06dbe3e8f0feff2c51295ebc03d8046db73111b3c6a595472885551adf9ef2eeb741c43794466e58c1f23a055160c8aef08cacfe769b86ea2b7c611 languageName: node linkType: hard @@ -4875,13 +5007,13 @@ __metadata: linkType: hard "conventional-commits-parser@npm:^6.0.0": - version: 6.1.0 - resolution: "conventional-commits-parser@npm:6.1.0" + version: 6.2.1 + resolution: "conventional-commits-parser@npm:6.2.1" dependencies: meow: ^13.0.0 bin: conventional-commits-parser: dist/cli/index.js - checksum: c9b660b3aaa48576ee3a1fdf21f4c236d7f19991e8a8a121e24105b3470b15440310e5b3cbf4dd51fb4a0185e66bee7ee875354d29f47c234719629ecf40ac77 + checksum: 9d0fe3a7800bb3c6f2f7582724841990b44a21e944de584ef811591330d3c0fe9a19ba488234dde896b7d1331fbf63b18f43dc64579bf0805aad28bed4ce879a languageName: node linkType: hard @@ -4907,32 +5039,25 @@ __metadata: 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.46.0 + resolution: "core-js-compat@npm:3.46.0" dependencies: - browserslist: ^4.24.4 - checksum: 4f0a7db9ed9a95c4edae0749fe9a4d4d4f8f51a53c7c3e06049887500e98763732e8afef9628d2145f875b6e262567e951a77e4d06273f9eac273f5241259fd3 - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 + browserslist: ^4.26.3 + checksum: 16d381c51e34d38ecc65d429d5a5c1dbd198f70b5a0a6256a3a41dcb8523e07f0a8682f6349298a55ff6e9d039e131d67b07fe863047a28672ae5f10373c57cf languageName: node linkType: hard "cosmiconfig-typescript-loader@npm:^6.1.0": - version: 6.1.0 - resolution: "cosmiconfig-typescript-loader@npm:6.1.0" + version: 6.2.0 + resolution: "cosmiconfig-typescript-loader@npm:6.2.0" dependencies: - jiti: ^2.4.1 + jiti: ^2.6.1 peerDependencies: "@types/node": "*" cosmiconfig: ">=9" typescript: ">=5" - checksum: 45114854faaa97178abd2ccad511363faa57c03321c7e39ad16619c63842b3f6147dd20118f9f07c9530a242a39c3107c791708bb0b987dad374e71f23f9468b + checksum: 2680bb585de1185aa23ba678cb0426cba1be8fa0a9d286f71c2ce5bd63f23e5b8f726161673a16babb2aa0e7d033fda8774268a025fb63f548d1c75977292212 languageName: node linkType: hard @@ -5048,9 +5173,9 @@ __metadata: linkType: hard "dayjs@npm:^1.8.15": - version: 1.11.13 - resolution: "dayjs@npm:1.11.13" - checksum: f388db88a6aa93956c1f6121644e783391c7b738b73dbc54485578736565c8931bdfba4bb94e9b1535c6e509c97d5deb918bbe1ae6b34358d994de735055cca9 + version: 1.11.19 + resolution: "dayjs@npm:1.11.19" + checksum: dfafcca2c67cc6e542fd880d77f1d91667efd323edc28f0487b470b184a11cc97696163ed5be1142ea2a031045b27a0d0555e72f60a63275e0e0401ac24bea5d languageName: node linkType: hard @@ -5063,15 +5188,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, 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 @@ -5114,14 +5239,14 @@ __metadata: linkType: hard "dedent@npm:^1.0.0": - version: 1.6.0 - resolution: "dedent@npm:1.6.0" + version: 1.7.0 + resolution: "dedent@npm:1.7.0" peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - checksum: ecaa83968b3db4ffeadf8f679c01280f8679ec79993d7e203c0281d7926e883bb79f42b263ba0df1f78e146e4b0be1b9a5b922b1fe040cb89b09977bc9c25b38 + checksum: e07a21b7ae078f2c6502b46e6e9fb3f5592dc48ad8c6142d501d1a85ee04cd3add5d62260a9b20f87674a80edada2032918ca0718597752c5cb90b36ab5066ec languageName: node linkType: hard @@ -5257,13 +5382,6 @@ __metadata: languageName: node linkType: hard -"denodeify@npm:^1.2.1": - version: 1.2.1 - resolution: "denodeify@npm:1.2.1" - checksum: a85c8f7fce5626e311edd897c27ad571b29393c4a739dc29baee48328e09edd82364ff697272dd612462c67e48b4766389642b5bdfaea0dc114b7c6a276c0eae - languageName: node - linkType: hard - "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -5360,10 +5478,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.149": - version: 1.5.155 - resolution: "electron-to-chromium@npm:1.5.155" - checksum: 6e8f666d4ea0b70e1dd94e2ae588a4e38545beab1d9de7875e19a771f333549cf304fe6cbf19d773d7ac79dffae1c479b9d4291cf6f1523e5d24109ae79f610c +"electron-to-chromium@npm:^1.5.238": + version: 1.5.245 + resolution: "electron-to-chromium@npm:1.5.245" + checksum: 6262655d0dec8663df58056559a8f1f47648657debf0c868e49d8e3b5f866318c4a9105261272a5aaa529fc6140f4401e0e2c5fadbd24ed50cf9b5cd7e961bfc languageName: node linkType: hard @@ -5375,9 +5493,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.6.0 + resolution: "emoji-regex@npm:10.6.0" + checksum: 8785f6a7ec4559c931bd6640f748fe23791f5af4c743b131d458c5551b4aa7da2a9cd882518723cb3859e8b0b59b0cc08f2ce0f8e65c61a026eed71c2dc407d5 languageName: node linkType: hard @@ -5419,11 +5537,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 @@ -5435,11 +5553,11 @@ __metadata: linkType: hard "envinfo@npm:^7.13.0": - version: 7.14.0 - resolution: "envinfo@npm:7.14.0" + version: 7.20.0 + resolution: "envinfo@npm:7.20.0" bin: envinfo: dist/cli.js - checksum: 137c1dd9a4d5781c4a6cdc6b695454ba3c4ba1829f73927198aa4122f11b35b59d7b2cb7e1ceea1364925a30278897548511d22f860c14253a33797d0bebd551 + checksum: 5e7e7a4ec5b445939efd2634a8f2d7f926d6f79ae872acf5d7ebd46387f74b7c700667b2ffa795c109e53e70389e46c38726f24a834448dbddfc53f63376f5cb languageName: node linkType: hard @@ -5451,11 +5569,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 @@ -5478,26 +5596,26 @@ __metadata: languageName: node linkType: hard -"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": - version: 1.23.9 - resolution: "es-abstract@npm:1.23.9" +"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.2 arraybuffer.prototype.slice: ^1.0.4 available-typed-arrays: ^1.0.7 call-bind: ^1.0.8 - call-bound: ^1.0.3 + 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-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.2.7 - get-proto: ^1.0.0 + get-intrinsic: ^1.3.0 + get-proto: ^1.0.1 get-symbol-description: ^1.1.0 globalthis: ^1.0.4 gopd: ^1.2.0 @@ -5509,21 +5627,24 @@ __metadata: is-array-buffer: ^3.0.5 is-callable: ^1.2.7 is-data-view: ^1.0.2 + is-negative-zero: ^2.0.3 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.0 + is-weakref: ^1.1.1 math-intrinsics: ^1.1.0 - object-inspect: ^1.13.3 + object-inspect: ^1.13.4 object-keys: ^1.1.1 object.assign: ^4.1.7 own-keys: ^1.0.1 - regexp.prototype.flags: ^1.5.3 + 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 @@ -5532,8 +5653,8 @@ __metadata: typed-array-byte-offset: ^1.0.4 typed-array-length: ^1.0.7 unbox-primitive: ^1.1.0 - which-typed-array: ^1.1.18 - checksum: f3ee2614159ca197f97414ab36e3f406ee748ce2f97ffbf09e420726db5a442ce13f1e574601468bff6e6eb81588e6c9ce1ac6c03868a37c7cd48ac679f8485a + which-typed-array: ^1.1.19 + checksum: 06b3d605e56e3da9d16d4db2629a42dac1ca31f2961a41d15c860422a266115e865b43e82d6b9da81a0fabbbb65ebc12fb68b0b755bc9dbddacb6bf7450e96df languageName: node linkType: hard @@ -5684,24 +5805,24 @@ __metadata: linkType: hard "eslint-config-prettier@npm:^10.1.1": - version: 10.1.5 - resolution: "eslint-config-prettier@npm:10.1.5" + 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: 6d8eb41c716fc2b073bfd9daede0c87c4c2b29055f15c94618eec00a19c5499024ddb89902d6793b5ac9102075e4739d7cc2d4d58c7e7ed4cc2dcf79e3fbcacc + checksum: 9140e19f78f0dbc888b160bb72b85f8043bada7b12a548faa56cea0ba74f8ef16653250ffd014d85d9a376a88c4941c96a3cdc9d39a07eb3def6967166635bd8 languageName: node linkType: hard "eslint-config-prettier@npm:^8.5.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" + version: 8.10.2 + resolution: "eslint-config-prettier@npm:8.10.2" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 + checksum: a92b7e8a996e65adf79de1579524235687e9d3552d088cfab4f170da60d23762addb4276169c8ca3a9551329dda8408c59f7e414101b238a6385379ac1bc3b16 languageName: node linkType: hard @@ -5749,11 +5870,11 @@ __metadata: linkType: hard "eslint-plugin-prettier@npm:^5.2.3": - version: 5.4.0 - resolution: "eslint-plugin-prettier@npm:5.4.0" + version: 5.5.4 + resolution: "eslint-plugin-prettier@npm:5.5.4" dependencies: prettier-linter-helpers: ^1.0.0 - synckit: ^0.11.0 + synckit: ^0.11.7 peerDependencies: "@types/eslint": ">=8.0.0" eslint: ">=8.0.0" @@ -5764,7 +5885,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: 1d71d4fb42b8f9654232c6f9c6805549f7e9da6ee3207069dac122ab1c55eae90a0840f5c109e821e3a5145ec223dbbdfa7cfd3c3a28267316d08d55d5812e21 + checksum: 0dd05ed85018ab0e98da80325b7bd4c4ab6dd684398f1270a7c8cf4261df714dd4502ba4c7f85f651aade9989da0a7d2adda03af8873b73b52014141abf385de languageName: node linkType: hard @@ -5833,13 +5954,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^8.3.0": - version: 8.3.0 - resolution: "eslint-scope@npm:8.3.0" +"eslint-scope@npm:^8.4.0": + version: 8.4.0 + resolution: "eslint-scope@npm:8.4.0" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: 57a58b6716533e25d527089826c4add89a047aecf75e4a88fee05f113ef5a72b85392b304a69bf670646cc3e068354aec70361b9718c2453949a05fc4d9bfe73 + checksum: cf88f42cd5e81490d549dc6d350fe01e6fe420f9d9ea34f134bb359b030e3c4ef888d36667632e448937fe52449f7181501df48c08200e3d3b0fee250d05364e languageName: node linkType: hard @@ -5857,38 +5978,37 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.2.0": - version: 4.2.0 - resolution: "eslint-visitor-keys@npm:4.2.0" - checksum: 779c604672b570bb4da84cef32f6abb085ac78379779c1122d7879eade8bb38ae715645324597cf23232d03cef06032c9844d25c73625bc282a5bfd30247e5b5 +"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:^9.22.0": - version: 9.27.0 - resolution: "eslint@npm:9.27.0" + version: 9.39.1 + resolution: "eslint@npm:9.39.1" dependencies: - "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/eslint-utils": ^4.8.0 "@eslint-community/regexpp": ^4.12.1 - "@eslint/config-array": ^0.20.0 - "@eslint/config-helpers": ^0.2.1 - "@eslint/core": ^0.14.0 + "@eslint/config-array": ^0.21.1 + "@eslint/config-helpers": ^0.4.2 + "@eslint/core": ^0.17.0 "@eslint/eslintrc": ^3.3.1 - "@eslint/js": 9.27.0 - "@eslint/plugin-kit": ^0.3.1 + "@eslint/js": 9.39.1 + "@eslint/plugin-kit": ^0.4.1 "@humanfs/node": ^0.16.6 "@humanwhocodes/module-importer": ^1.0.1 "@humanwhocodes/retry": ^0.4.2 "@types/estree": ^1.0.6 - "@types/json-schema": ^7.0.15 ajv: ^6.12.4 chalk: ^4.0.0 cross-spawn: ^7.0.6 debug: ^4.3.2 escape-string-regexp: ^4.0.0 - eslint-scope: ^8.3.0 - eslint-visitor-keys: ^4.2.0 - espree: ^10.3.0 + eslint-scope: ^8.4.0 + eslint-visitor-keys: ^4.2.1 + espree: ^10.4.0 esquery: ^1.5.0 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 @@ -5910,18 +6030,18 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 7e2f220574466a6dcd4ebbec19d47a39c3d964bad5bb96706dee7e814d2000d6da78b4515a368515979e1addd59546e24841090101585e5d816c9819077f753c + checksum: 35583d4d93f431ea2716e18c912e0b10980e27377a89d2c644a3a755921e42a2665dfd7367b8e9b54c7e4e9f193dea4126ce503c866f5795b170934ffd3f1dd9 languageName: node linkType: hard -"espree@npm:^10.0.1, espree@npm:^10.3.0": - version: 10.3.0 - resolution: "espree@npm:10.3.0" +"espree@npm:^10.0.1, espree@npm:^10.4.0": + version: 10.4.0 + resolution: "espree@npm:10.4.0" dependencies: - acorn: ^8.14.0 + acorn: ^8.15.0 acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^4.2.0 - checksum: 63e8030ff5a98cea7f8b3e3a1487c998665e28d674af08b9b3100ed991670eb3cbb0e308c4548c79e03762753838fbe530c783f17309450d6b47a889fee72bef + eslint-visitor-keys: ^4.2.1 + checksum: 5f9d0d7c81c1bca4bfd29a55270067ff9d575adb8c729a5d7f779c2c7b910bfc68ccf8ec19b29844b707440fc159a83868f22c8e87bbf7cbcb225ed067df6c85 languageName: node linkType: hard @@ -6060,9 +6180,9 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.2 - resolution: "exponential-backoff@npm:3.1.2" - checksum: 7e191e3dd6edd8c56c88f2c8037c98fbb8034fe48778be53ed8cb30ccef371a061a4e999a469aab939b92f8f12698f3b426d52f4f76b7a20da5f9f98c3cbc862 + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 471fdb70fd3d2c08a74a026973bdd4105b7832911f610ca67bbb74e39279411c1eed2f2a110c9d41c2edd89459ba58fdaba1c174beed73e7a42d773882dcff82 languageName: node linkType: hard @@ -6119,9 +6239,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.6 - resolution: "fast-uri@npm:3.0.6" - checksum: 7161ba2a7944778d679ba8e5f00d6a2bb479a2142df0982f541d67be6c979b17808f7edbb0ce78161c85035974bde3fa52b5137df31da46c0828cb629ba67c4e + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: daab0efd3548cc53d0db38ecc764d125773f8bd70c34552ff21abdc6530f26fa4cb1771f944222ca5e61a0a1a85d01a104848ff88c61736de445d97bd616ea7e languageName: node linkType: hard @@ -6154,18 +6274,6 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.4": - version: 6.4.4 - resolution: "fdir@npm:6.4.4" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 79043610236579ffbd0647c508b43bd030a2d034a17c43cf96813a00e8e92e51acdb115c6ddecef3b5812cc2692b976155b4f6413e51e3761f1e772fa019a321 - languageName: node - linkType: hard - "fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" @@ -6391,6 +6499,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" @@ -6406,27 +6521,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.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": - version: 1.3.0 - resolution: "get-intrinsic@npm:1.3.0" + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" dependencies: + async-function: ^1.0.0 + async-generator-function: ^1.0.0 call-bind-apply-helpers: ^1.0.2 es-define-property: ^1.0.1 es-errors: ^1.3.0 es-object-atoms: ^1.1.1 function-bind: ^1.1.2 + generator-function: ^2.0.0 get-proto: ^1.0.1 gopd: ^1.2.0 has-symbols: ^1.1.0 hasown: ^2.0.2 math-intrinsics: ^1.1.0 - checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d + checksum: c02b3b6a445f9cd53e14896303794ac60f9751f58a69099127248abdb0251957174c6524245fc68579dc8e6a35161d3d94c93e665f808274716f4248b269436a languageName: node linkType: hard @@ -6482,13 +6600,13 @@ __metadata: linkType: hard "get-uri@npm:^6.0.1": - version: 6.0.4 - resolution: "get-uri@npm:6.0.4" + version: 6.0.5 + resolution: "get-uri@npm:6.0.5" dependencies: basic-ftp: ^5.0.2 data-uri-to-buffer: ^6.0.2 debug: ^4.3.4 - checksum: 7eae81655e0c8cee250d29c189e09030f37a2d37987298325709affb9408de448bf2dc43ee9a59acd21c1f100c3ca711d0446b4e689e9590c25774ecc59f0442 + checksum: aef94dbecde44bc9cd23f5c1b6af5bf772a3d16612c0fc37d3a4056ffd202f2cdd329746d4fdc2124813ea6c8b1c5279f3749d27226a2b161df43dbcb70082e3 languageName: node linkType: hard @@ -6618,13 +6736,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:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -6793,13 +6904,6 @@ __metadata: languageName: node linkType: hard -"hermes-estree@npm:0.23.1": - version: 0.23.1 - resolution: "hermes-estree@npm:0.23.1" - checksum: 0f63edc365099304f4cd8e91a3666a4fb5a2a47baee751dc120df9201640112865944cae93617f554af71be9827e96547f9989f4972d6964ecc121527295fec6 - languageName: node - linkType: hard - "hermes-estree@npm:0.25.1": version: 0.25.1 resolution: "hermes-estree@npm:0.25.1" @@ -6814,12 +6918,10 @@ __metadata: languageName: node linkType: hard -"hermes-parser@npm:0.23.1": - version: 0.23.1 - resolution: "hermes-parser@npm:0.23.1" - dependencies: - hermes-estree: 0.23.1 - checksum: a08008928aea9ea9a2cab2c0fac3cffa21f7869ab3fabb68e5add0fe057737a0c352d7a446426f7956172ccc8f2d4a215b4fc20d1d08354fc8dc16772c248fce +"hermes-estree@npm:0.29.1": + version: 0.29.1 + resolution: "hermes-estree@npm:0.29.1" + checksum: a72fe490d99ba2f56b3e22f3d050ca7757cc8dc9ebcb9d907104e46aaabdea9d32b445f73cca724a2537090fad3dde3cce0dc733bad6d7b3930c6bcde484d45c languageName: node linkType: hard @@ -6841,6 +6943,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" @@ -7012,9 +7123,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 @@ -7040,9 +7151,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 @@ -7124,13 +7235,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 @@ -7163,9 +7271,9 @@ __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 @@ -7208,7 +7316,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.0, is-core-module@npm:^2.5.0": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.1, is-core-module@npm:^2.5.0": version: 2.16.1 resolution: "is-core-module@npm:2.16.1" dependencies: @@ -7301,14 +7409,15 @@ __metadata: linkType: hard "is-generator-function@npm:^1.0.10": - version: 1.1.0 - resolution: "is-generator-function@npm:1.1.0" + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" dependencies: - call-bound: ^1.0.3 - get-proto: ^1.0.0 + call-bound: ^1.0.4 + generator-function: ^2.0.0 + get-proto: ^1.0.1 has-tostringtag: ^1.0.2 safe-regex-test: ^1.1.0 - checksum: f7f7276131bdf7e28169b86ac55a5b080012a597f9d85a0cbef6fe202a7133fa450a3b453e394870e3cb3685c5a764c64a9f12f614684b46969b1e6f297bed6b + checksum: 0b81c613752a5e534939e5b3835ff722446837a5b94c3a3934af5ded36a651d9aa31c3f11f8a3453884b9658bf26dbfb7eb855e744d920b07f084bd890a43414 languageName: node linkType: hard @@ -7392,10 +7501,17 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd + languageName: node + 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 @@ -7518,7 +7634,7 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.7, is-string@npm:^1.1.1": +"is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" dependencies: @@ -7594,7 +7710,7 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": version: 1.1.1 resolution: "is-weakref@npm:1.1.1" dependencies: @@ -7652,13 +7768,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -7742,12 +7851,12 @@ __metadata: linkType: hard "istanbul-reports@npm:^3.1.3": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" + version: 3.2.0 + resolution: "istanbul-reports@npm:3.2.0" dependencies: html-escaper: ^2.0.0 istanbul-lib-report: ^3.0.0 - checksum: 2072db6e07bfbb4d0eb30e2700250636182398c1af811aea5032acb219d2080f7586923c09fa194029efd6b92361afb3dcbe1ebcc3ee6651d13340f7c6c4ed95 + checksum: 72b4c8525276147908d28b0917bc675b1019836b638e50875521ca3b8ec63672681aa98dbab88a6f49ef798c08fe041d428abdcf84f4f3fcff5844eee54af65a languageName: node linkType: hard @@ -7881,6 +7990,18 @@ __metadata: languageName: node linkType: hard +"jest-diff@npm:30.2.0": + version: 30.2.0 + resolution: "jest-diff@npm:30.2.0" + dependencies: + "@jest/diff-sequences": 30.0.1 + "@jest/get-type": 30.1.0 + chalk: ^4.1.2 + pretty-format: 30.2.0 + checksum: 62fd17d3174316bf0140c2d342ac5ad84574763fa78fc4dd4e5ee605f121699033c9bfb7507ba8f1c5cc7fa95539a19abab13d3909a5aec1b447ab14d03c5386 + languageName: node + linkType: hard + "jest-diff@npm:^29.7.0": version: 29.7.0 resolution: "jest-diff@npm:29.7.0" @@ -7981,6 +8102,18 @@ __metadata: languageName: node linkType: hard +"jest-matcher-utils@npm:^30.0.5": + version: 30.2.0 + resolution: "jest-matcher-utils@npm:30.2.0" + dependencies: + "@jest/get-type": 30.1.0 + chalk: ^4.1.2 + jest-diff: 30.2.0 + pretty-format: 30.2.0 + checksum: 33154f3fc10b19608af7f8bc91eec129f9aba0a3d89f74ffbae659159c8e2dea69c85ef1d742b1d5dd6a8be57503d77d37351edc86ce9ef3f57ecc8585e0b154 + languageName: node + linkType: hard + "jest-message-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-message-util@npm:29.7.0" @@ -8156,7 +8289,7 @@ __metadata: languageName: node linkType: hard -"jest-validate@npm:^29.6.3, jest-validate@npm:^29.7.0": +"jest-validate@npm:^29.7.0": version: 29.7.0 resolution: "jest-validate@npm:29.7.0" dependencies: @@ -8186,7 +8319,7 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.6.3, jest-worker@npm:^29.7.0": +"jest-worker@npm:^29.7.0": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" dependencies: @@ -8217,12 +8350,12 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.4.1": - version: 2.4.2 - resolution: "jiti@npm:2.4.2" +"jiti@npm:^2.6.1": + version: 2.6.1 + resolution: "jiti@npm:2.6.1" bin: jiti: lib/jiti-cli.mjs - checksum: c6c30c7b6b293e9f26addfb332b63d964a9f143cdd2cf5e946dbe5143db89f7c1b50ad9223b77fb1f6ddb0b9c5ecef995fea024ecf7d2861d285d779cde66e1e + checksum: 9394e29c5e40d1ca8267923160d8d86706173c9ff30c901097883434b0c4866de2c060427b6a9a5843bb3e42fa3a3c8b5b2228531d3dd4f4f10c5c6af355bb86 languageName: node linkType: hard @@ -8269,13 +8402,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" @@ -8283,7 +8409,7 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^3.0.2": +"jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" bin: @@ -8292,15 +8418,6 @@ __metadata: languageName: node linkType: hard -"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 - "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -8365,15 +8482,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 @@ -8427,9 +8544,9 @@ __metadata: linkType: hard "ky@npm:^1.2.0": - version: 1.8.1 - resolution: "ky@npm:1.8.1" - checksum: 802f3023ae1060b1d8c11376b9866fb5be82fa5174473d82c16a25d2905b3b41bc0121a134be87d8e3b40b24d56d34920a376e653785310803cbb8ea7cd43f85 + version: 1.14.0 + resolution: "ky@npm:1.14.0" + checksum: e4a3d7651953d823dc17021277349d0b61deb300d0cd77bbb495491e1d76cb3322a4aa6bc78d08146b696ba797d7367f7dcd4a42505399380f333ff74db38916 languageName: node linkType: hard @@ -8443,12 +8560,12 @@ __metadata: linkType: hard "launch-editor@npm:^2.9.1": - version: 2.10.0 - resolution: "launch-editor@npm:2.10.0" + version: 2.12.0 + resolution: "launch-editor@npm:2.12.0" dependencies: - picocolors: ^1.0.0 - shell-quote: ^1.8.1 - checksum: 0cd219f98a8be1cedc73119c1a18ff232eb1386dcc0f4e710b21234e62bf55513342a3e0939cd67c3d920fc7d714457876bc782a5b17e03f59acbbafd23c5f50 + picocolors: ^1.1.1 + shell-quote: ^1.8.3 + checksum: b1aa1b92ef4e720d1edd7f80affb90b2fa1cc2c41641cf80158940698c18a4b6a67e2a7cb060547712e858f0ec1a7c8c39f605e0eb299f516a6184f4e680ffc8 languageName: node linkType: hard @@ -8702,9 +8819,9 @@ __metadata: linkType: hard "macos-release@npm:^3.1.0": - version: 3.3.0 - resolution: "macos-release@npm:3.3.0" - checksum: 78a8ba70033a6a546537a04ba4a8a7e6daf00378d0a6cbdb7e8d09abdfab79f61a0da52fe6875d833c090e1d42a80964c349c96a735117b3a2bb1d278a86e563 + version: 3.4.0 + resolution: "macos-release@npm:3.4.0" + checksum: f4c0cb8b3f93b05d73c502b4bbe2b811c44facfc9bd072c13a30ff2a8ba1cad5d9de517d10be8b31e2b917643245a81587a2eec8300e66a7364419d11402ab02 languageName: node linkType: hard @@ -8835,151 +8952,69 @@ __metadata: languageName: node linkType: hard -"metro-babel-transformer@npm:0.80.12": - version: 0.80.12 - resolution: "metro-babel-transformer@npm:0.80.12" - dependencies: - "@babel/core": ^7.20.0 - flow-enums-runtime: ^0.0.6 - hermes-parser: 0.23.1 - nullthrows: ^1.1.1 - checksum: 1ea8bce0c169f3d8bf46f56da126ca52f4c8ba5ca9ffeaca987c34d269b0a3e2a54d0544bd44bfa5d0322e37f0171a52d2a2160defcbcd91ec1fd96f62b0eece - languageName: node - linkType: hard - -"metro-babel-transformer@npm:0.82.3": - version: 0.82.3 - resolution: "metro-babel-transformer@npm:0.82.3" +"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: 0285de63ac0324297d0909241f8a9b793da1540287b15793157605a1d1d4ff62cd8b73caee50e8b0994083b961431c89cd7cd4c0ad8a0e6e1ae58d306c6602d1 - languageName: node - linkType: hard - -"metro-cache-key@npm:0.80.12": - version: 0.80.12 - resolution: "metro-cache-key@npm:0.80.12" - dependencies: - flow-enums-runtime: ^0.0.6 - checksum: 7a06601180604361339d19eb833d61b79cc188a4e6ebe73188cc10fbf3a33e711d74c81d1d19a14b6581bd9dfeebe1b253684360682d033ab55909c9995b6a18 - languageName: node - linkType: hard - -"metro-cache-key@npm:0.82.3": - version: 0.82.3 - resolution: "metro-cache-key@npm:0.82.3" - dependencies: - flow-enums-runtime: ^0.0.6 - checksum: fdb3c4e4b8c665cc5b74227b714201abff55dcff3039a83010088744362444bc6ae7cf16b6673125914120c0af91f6767de36569c202ca2539fafbc403bea082 + checksum: 3a3a8a9404c74290b5687290236e242f7b4edb3bc25cad6afe2424ddab8632a657b55ccbbd49dfa9b26078b5f3184f00930b8aa8b50d7c922247fd7d63ada395 languageName: node linkType: hard -"metro-cache@npm:0.80.12": - version: 0.80.12 - resolution: "metro-cache@npm:0.80.12" +"metro-cache-key@npm:0.82.5": + version: 0.82.5 + resolution: "metro-cache-key@npm:0.82.5" dependencies: - exponential-backoff: ^3.1.1 flow-enums-runtime: ^0.0.6 - metro-core: 0.80.12 - checksum: 724e33fdda6a3568572c36a3f2d3465ad1b5f3e8ded5ec116b98e0038826187ebdadd05f77e91ddc17fa71ff4dd91281793a940e7b619cac36044ed868abc01d + checksum: d5dcd86249905c7adad0375111a4bef395a5021df251a463f840eb21bf7b34f4e581ae919a88fb612a63c48a5f379ce50f104a576bd71e052693d89ae6a0d9f0 languageName: node linkType: hard -"metro-cache@npm:0.82.3": - version: 0.82.3 - resolution: "metro-cache@npm:0.82.3" +"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.3 - checksum: 4d54317d65d95f5d6fae7c6403a8e1ca4c472e4b165f73cf462e883aa0bb754c3a38fbe6167283d6b57f0e3453cdb99ac0a286df3ed57a69cea6692adabb0b4b + metro-core: 0.82.5 + checksum: d0d193845063b1e1241a770d928630c68418b6bff2a25d7d14e71b88e905c640b65817ac069abf807b6e7c6db5470b8c52fe6236b3850ae55ce68e910747eb63 languageName: node linkType: hard -"metro-config@npm:0.80.12, metro-config@npm:^0.80.9": - version: 0.80.12 - resolution: "metro-config@npm:0.80.12" - dependencies: - connect: ^3.6.5 - cosmiconfig: ^5.0.5 - flow-enums-runtime: ^0.0.6 - jest-validate: ^29.6.3 - metro: 0.80.12 - metro-cache: 0.80.12 - metro-core: 0.80.12 - metro-runtime: 0.80.12 - checksum: 49496d2bc875fbb8c89639979753377888f5ce779742a4ef487d812e7c5f3f6c87dd6ae129727f614d2fe3210f7fde08041055d29772b8c86c018e2ef08e7785 - languageName: node - linkType: hard - -"metro-config@npm:0.82.3, metro-config@npm:^0.82.0": - version: 0.82.3 - resolution: "metro-config@npm:0.82.3" +"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.3 - metro-cache: 0.82.3 - metro-core: 0.82.3 - metro-runtime: 0.82.3 - checksum: 6dfafbc3de630e17799d742c672303e57dea7a2ee3eaf3404ce3692c50afd943d27e887ac02eeef3e733efddad7b594b2c644c2078f51afa95f611301021895a + 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 -"metro-core@npm:0.80.12": - version: 0.80.12 - resolution: "metro-core@npm:0.80.12" +"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.80.12 - checksum: 319f3965fa76fc08987cbd0228024bdbb0eaad7406e384e48929674188f1066cbc7a233053615ebd84b3ce1bbae28f59c114885fd0a0c179a580319ed69f717e - languageName: node - linkType: hard - -"metro-core@npm:0.82.3, metro-core@npm:^0.82.0": - version: 0.82.3 - resolution: "metro-core@npm:0.82.3" - dependencies: - flow-enums-runtime: ^0.0.6 - lodash.throttle: ^4.1.1 - metro-resolver: 0.82.3 - checksum: e61d316b6ff511d1524f923addbf8fb1bc8f0999ae3be7518a1cbdf39b0905d36e47d13cbebe029b5a1f0e88e8bd77bf75142af876e270af9de42d4dc1fe72e4 - languageName: node - linkType: hard - -"metro-file-map@npm:0.80.12": - version: 0.80.12 - resolution: "metro-file-map@npm:0.80.12" - dependencies: - anymatch: ^3.0.3 - debug: ^2.2.0 - fb-watchman: ^2.0.0 - flow-enums-runtime: ^0.0.6 - fsevents: ^2.3.2 - graceful-fs: ^4.2.4 - invariant: ^2.2.4 - jest-worker: ^29.6.3 - micromatch: ^4.0.4 - node-abort-controller: ^3.1.1 - nullthrows: ^1.1.1 - walker: ^1.0.7 - dependenciesMeta: - fsevents: - optional: true - checksum: 5e6eafcfafe55fd8a9a6e5613394a20ed2a0ad433a394dcb830f017b8fc9d82ddcd715391e36abe5e98c651c074b99a806d3b04d76f2cadb225f9f5b1c92daef + metro-resolver: 0.82.5 + checksum: f6f0c91240ad4ff2ebd61e5cb23f433309fc82e8042e240da1347f8edf61cc6b893bd176cabecad0dc91d214dd315d501af21cb518459aeb0ed613881619b583 languageName: node linkType: hard -"metro-file-map@npm:0.82.3": - version: 0.82.3 - resolution: "metro-file-map@npm:0.82.3" +"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 @@ -8990,153 +9025,76 @@ __metadata: micromatch: ^4.0.4 nullthrows: ^1.1.1 walker: ^1.0.7 - checksum: 3a8f3022f1d8245ca1da5102134566c9096f1e3e320b50b73166f399bc19a811e86a6399c23e6515fbd90f37dc6ff2d3132ad5b3a017afa4b2c0966a1d4517fa + checksum: 46bda99f0ae892071c1b48b09f884f017f48d564c30b2a1f858f6fae1c6c1848bbbce20f66a5be086d7e0acfec3d8c1ddbf69699aaf2829f10954ae39d8a27d7 languageName: node linkType: hard -"metro-minify-terser@npm:0.80.12": - version: 0.80.12 - resolution: "metro-minify-terser@npm:0.80.12" +"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: ff527b3f04c5814db139e55ceb7689aaaf0af5c7fbb0eb5d4a6f22044932dfb10bd385d388fa7b352acd03a2d078edaf43a6b5cd11cbc87a7c5502a34fc12735 + checksum: 754c150f0928460e1254e90e4e11bd87e069a0b286d21906758cb71fb8b4ec50dc8f78337bf8a9f8a28ddbd34230f5c66dad0fecf18dbe49715bf1300e5318c2 languageName: node linkType: hard -"metro-minify-terser@npm:0.82.3": - version: 0.82.3 - resolution: "metro-minify-terser@npm:0.82.3" +"metro-resolver@npm:0.82.5": + version: 0.82.5 + resolution: "metro-resolver@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 - terser: ^5.15.0 - checksum: 4f425549e5617e3dc39923c6e8ebb792da59bf9274934adaf8be90ea4fc9575780879fe4dc2802a5b2b75c2eb08761d8baf08d006384eb304e680e8e283d1a9e - languageName: node - linkType: hard - -"metro-resolver@npm:0.80.12": - version: 0.80.12 - resolution: "metro-resolver@npm:0.80.12" - dependencies: - flow-enums-runtime: ^0.0.6 - checksum: a520030a65afab2f3282604ef6dec802051899a356910606b8ffbc5b82a722008d9d416c8ba3d9ef9527912206586b713733b776803a6b76adac72bcb31870cd - languageName: node - linkType: hard - -"metro-resolver@npm:0.82.3": - version: 0.82.3 - resolution: "metro-resolver@npm:0.82.3" - dependencies: - flow-enums-runtime: ^0.0.6 - checksum: 910827413c331a7074a6d8530b5c976c1680a7c53c82c414b517832892977488f651b68dc08bd998de50cc41fb9dd416a17287926e5d78dd0e4739c3b4a247b1 + checksum: d1f7b57687c9cbb100114474689fee2fcfb86428a1228499b28391d16378573ac0f07c750874a2d75eabe237d67eb32a5c947bbbd70cd851885f1f6b13992472 languageName: node linkType: hard -"metro-runtime@npm:0.80.12": - version: 0.80.12 - resolution: "metro-runtime@npm:0.80.12" +"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: 11a6d36c7dcf9d221f7de6989556f45d4d64cd1cdd225ec96273b584138b4aa77b7afdc9e9a9488d1dc9a3d90f8e94bb68ab149079cc6ebdb8f8f8b03462cb4f - languageName: node - linkType: hard - -"metro-runtime@npm:0.82.3, metro-runtime@npm:^0.82.0": - version: 0.82.3 - resolution: "metro-runtime@npm:0.82.3" - dependencies: - "@babel/runtime": ^7.25.0 - flow-enums-runtime: ^0.0.6 - checksum: 6f7d9cd0cc5656dd22d6fa4409e278babf96937253045a0aa51fdb7f1c5d7259325583e27b81cc398bc847e1fe4ff6784e07df98633fd0368e07c2e289a088a7 - languageName: node - linkType: hard - -"metro-source-map@npm:0.80.12": - version: 0.80.12 - resolution: "metro-source-map@npm:0.80.12" - dependencies: - "@babel/traverse": ^7.20.0 - "@babel/types": ^7.20.0 - flow-enums-runtime: ^0.0.6 - invariant: ^2.2.4 - metro-symbolicate: 0.80.12 - nullthrows: ^1.1.1 - ob1: 0.80.12 - source-map: ^0.5.6 - vlq: ^1.0.0 - checksum: 39575bff8666abd0944ec71e01a0c0eacbeab48277528608e894ffa6691c4267c389ee51ad86d5cd8e96f13782b66e1f693a3c60786bb201268678232dce6130 + checksum: 931c2b581ac1527899cfec6b9c4bbbac75545c78bf192abd8efddd4dbff481b052513857c8544507e7900e7c06f08a8da75e16c864cd86ec3a8c3d6c05738dae languageName: node linkType: hard -"metro-source-map@npm:0.82.3, metro-source-map@npm:^0.82.0": - version: 0.82.3 - resolution: "metro-source-map@npm:0.82.3" +"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.3 + metro-symbolicate: 0.82.5 nullthrows: ^1.1.1 - ob1: 0.82.3 + ob1: 0.82.5 source-map: ^0.5.6 vlq: ^1.0.0 - checksum: 2222c9f970a48e8c8d4c001ef035c42d92bdadb10baeee3112774db4598fed4c861ae57f586b1d96508534f1c79dfd842f3c8493146088d10f224e549c48271a + checksum: 1bb53abe636524593207c578bfd0e15f47f4e15db919793a49b89359726d043cd69107244b6e1c2c8194983b8df7faa8b56ffa73a5f81c0fefc0cc1727907177 languageName: node linkType: hard -"metro-symbolicate@npm:0.80.12": - version: 0.80.12 - resolution: "metro-symbolicate@npm:0.80.12" +"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.80.12 + metro-source-map: 0.82.5 nullthrows: ^1.1.1 source-map: ^0.5.6 - through2: ^2.0.1 vlq: ^1.0.0 bin: metro-symbolicate: src/index.js - checksum: b775e4613deec421f6287918d0055c50bb2a38fe3f72581eb70b9441e4497c9c7413c2929c579b24fb76893737b6d5af83a5f6cd8c032e2a83957091f82ec5de - languageName: node - linkType: hard - -"metro-symbolicate@npm:0.82.3": - version: 0.82.3 - resolution: "metro-symbolicate@npm:0.82.3" - dependencies: - flow-enums-runtime: ^0.0.6 - invariant: ^2.2.4 - metro-source-map: 0.82.3 - nullthrows: ^1.1.1 - source-map: ^0.5.6 - vlq: ^1.0.0 - bin: - metro-symbolicate: src/index.js - checksum: a9563f71ca944ead08a1bdfa9e64778990ee9107af8dcb2ac5788cbcb78ac6478ef86da00db8e389b2253976d9b7ae4eae79d9c8a06a99d08b4e0ab1d7da2ffd - languageName: node - linkType: hard - -"metro-transform-plugins@npm:0.80.12": - version: 0.80.12 - resolution: "metro-transform-plugins@npm:0.80.12" - dependencies: - "@babel/core": ^7.20.0 - "@babel/generator": ^7.20.0 - "@babel/template": ^7.0.0 - "@babel/traverse": ^7.20.0 - flow-enums-runtime: ^0.0.6 - nullthrows: ^1.1.1 - checksum: 85c99c367d6c0b9721af744fc980372329c6d37711177660e2d5e2dbe5e92e2cd853604eb8a513ad824eafbed84663472fa304cbbe2036957ee8688b72c2324c + checksum: ae91be09cca42567ea3c2bee695e0db42512fc8bf28cf2aa281ae8043edc3bbddcadd0793b401b6bcb7e0cc1df1428647662462a8f515ab6c47420421b1e96f8 languageName: node linkType: hard -"metro-transform-plugins@npm:0.82.3": - version: 0.82.3 - resolution: "metro-transform-plugins@npm:0.82.3" +"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 @@ -9144,107 +9102,34 @@ __metadata: "@babel/traverse": ^7.25.3 flow-enums-runtime: ^0.0.6 nullthrows: ^1.1.1 - checksum: 66761639b7ceb6a6130332b3cd7ab124dac661e060f8f676c4abc1c132f35ce27f0a17ea993d7f053702833d61619e091418974fafaa3a130a707eb722268e1f + checksum: 891838d529df2c3170614de9e55025d37fb799a8d444d9e898fc203496ec33620ad8066e0ab06244b7abb806ffdae4728b84047d0d01bceee877ea5d69240d04 languageName: node linkType: hard -"metro-transform-worker@npm:0.80.12": - version: 0.80.12 - resolution: "metro-transform-worker@npm:0.80.12" - dependencies: - "@babel/core": ^7.20.0 - "@babel/generator": ^7.20.0 - "@babel/parser": ^7.20.0 - "@babel/types": ^7.20.0 - flow-enums-runtime: ^0.0.6 - metro: 0.80.12 - metro-babel-transformer: 0.80.12 - metro-cache: 0.80.12 - metro-cache-key: 0.80.12 - metro-minify-terser: 0.80.12 - metro-source-map: 0.80.12 - metro-transform-plugins: 0.80.12 - nullthrows: ^1.1.1 - checksum: 90684b1f1163bfc84b11bfc01082a38de2a5dd9f7bcabc524bc84f1faff32222954f686a60bc0f464d3e46e86c4c01435111e2ed0e9767a5efbfaf205f55245e - languageName: node - linkType: hard - -"metro-transform-worker@npm:0.82.3": - version: 0.82.3 - resolution: "metro-transform-worker@npm:0.82.3" +"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.3 - metro-babel-transformer: 0.82.3 - metro-cache: 0.82.3 - metro-cache-key: 0.82.3 - metro-minify-terser: 0.82.3 - metro-source-map: 0.82.3 - metro-transform-plugins: 0.82.3 + 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: 51ef31541c69caa07f90a2bc261326af7b88cfc54f4d238d71bf392a954dabad895d5f0125fa8d62d75041c09a20d0db15e4f76938b3750a7e2c293617080f21 + checksum: 653868f5fc525ad5b36181e7d1b3bb893c49ce6647791c21b585dd29cccc2f00e68d66b16e00eeb385fcb0c5f205a713aba0fe57971b1ab2bf150938cb820aaa languageName: node linkType: hard -"metro@npm:0.80.12": - version: 0.80.12 - resolution: "metro@npm:0.80.12" - dependencies: - "@babel/code-frame": ^7.0.0 - "@babel/core": ^7.20.0 - "@babel/generator": ^7.20.0 - "@babel/parser": ^7.20.0 - "@babel/template": ^7.0.0 - "@babel/traverse": ^7.20.0 - "@babel/types": ^7.20.0 - accepts: ^1.3.7 - chalk: ^4.0.0 - ci-info: ^2.0.0 - connect: ^3.6.5 - debug: ^2.2.0 - denodeify: ^1.2.1 - error-stack-parser: ^2.0.6 - flow-enums-runtime: ^0.0.6 - graceful-fs: ^4.2.4 - hermes-parser: 0.23.1 - image-size: ^1.0.2 - invariant: ^2.2.4 - jest-worker: ^29.6.3 - jsc-safe-url: ^0.2.2 - lodash.throttle: ^4.1.1 - metro-babel-transformer: 0.80.12 - metro-cache: 0.80.12 - metro-cache-key: 0.80.12 - metro-config: 0.80.12 - metro-core: 0.80.12 - metro-file-map: 0.80.12 - metro-resolver: 0.80.12 - metro-runtime: 0.80.12 - metro-source-map: 0.80.12 - metro-symbolicate: 0.80.12 - metro-transform-plugins: 0.80.12 - metro-transform-worker: 0.80.12 - mime-types: ^2.1.27 - nullthrows: ^1.1.1 - serialize-error: ^2.1.0 - source-map: ^0.5.6 - strip-ansi: ^6.0.0 - throat: ^5.0.0 - ws: ^7.5.10 - yargs: ^17.6.2 - bin: - metro: src/cli.js - checksum: 8016f7448e6e0947bd38633c01c3daad47b5a29d4a7294ebe922fa3c505430f78861d85965ecfc6f41d9b209e2663cac0f23c99a80a3f941a19de564203fcdb8 - languageName: node - linkType: hard - -"metro@npm:0.82.3, metro@npm:^0.82.0": - version: 0.82.3 - resolution: "metro@npm:0.82.3" +"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 @@ -9261,24 +9146,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.3 - metro-cache: 0.82.3 - metro-cache-key: 0.82.3 - metro-config: 0.82.3 - metro-core: 0.82.3 - metro-file-map: 0.82.3 - metro-resolver: 0.82.3 - metro-runtime: 0.82.3 - metro-source-map: 0.82.3 - metro-symbolicate: 0.82.3 - metro-transform-plugins: 0.82.3 - metro-transform-worker: 0.82.3 + 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 @@ -9288,7 +9173,7 @@ __metadata: yargs: ^17.6.2 bin: metro: src/cli.js - checksum: edd6647b20cfd0b9ca4b71a913acc76e0b11d93d960fdace97e1af550bfbcb3cbbcb77c6c2cbf0d5ee4072c3d566919ba33d22d29e0e2f35c4668848a8db4766 + checksum: 391411e1be9463f4d52e804f0a9680e59be1cfc5c76ca890f3a9e9c014561da65bbf6e3ccc44f7f52601add064b3b70862b3813c963384a0df2218a345a304e5 languageName: node linkType: hard @@ -9364,7 +9249,7 @@ __metadata: languageName: node linkType: hard -"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 @@ -9372,11 +9257,11 @@ __metadata: linkType: hard "minimatch@npm:^10.0.1": - version: 10.0.3 - resolution: "minimatch@npm:10.0.3" + version: 10.1.1 + resolution: "minimatch@npm:10.1.1" dependencies: "@isaacs/brace-expansion": ^5.0.0 - checksum: 20bfb708095a321cb43c20b78254e484cb7d23aad992e15ca3234a3331a70fa9cd7a50bc1a7c7b2b9c9890c37ff0685f8380028fcc28ea5e6de75b1d4f9374aa + checksum: 8820c0be92994f57281f0a7a2cc4268dcc4b610f9a1ab666685716b4efe4b5898b43c835a8f22298875b31c7a278a5e3b7e253eee7c886546bb0b61fb94bca6b languageName: node linkType: hard @@ -9492,12 +9377,12 @@ __metadata: languageName: node linkType: hard -"minizlib@npm:^3.0.1": - version: 3.0.2 - resolution: "minizlib@npm:3.0.2" +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" dependencies: minipass: ^7.1.2 - checksum: 493bed14dcb6118da7f8af356a8947cf1473289c09658e5aabd69a737800a8c3b1736fb7d7931b722268a9c9bc038a6d53c049b6a6af24b34a121823bb709996 + checksum: a15e6f0128f514b7d41a1c68ce531155447f4669e32d279bba1c1c071ef6c2abd7e4d4579bb59ccc2ed1531346749665968fdd7be8d83eb6b6ae2fe1f3d370a7 languageName: node linkType: hard @@ -9510,15 +9395,6 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^3.0.1": - version: 3.0.1 - resolution: "mkdirp@npm:3.0.1" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: 972deb188e8fb55547f1e58d66bd6b4a3623bf0c7137802582602d73e6480c1c2268dcbafbfb1be466e00cc7e56ac514d7fd9334b7cf33e3e2ab547c16f83a8d - languageName: node - linkType: hard - "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -9601,17 +9477,17 @@ __metadata: linkType: hard "nitrogen@npm:^0.31.3": - version: 0.31.3 - resolution: "nitrogen@npm:0.31.3" + version: 0.31.4 + resolution: "nitrogen@npm:0.31.4" dependencies: chalk: ^5.3.0 - react-native-nitro-modules: ^0.31.3 + react-native-nitro-modules: ^0.31.4 ts-morph: ^27.0.0 yargs: ^18.0.0 zod: ^4.0.5 bin: nitrogen: lib/index.js - checksum: 502be866220912eefbfc87108ae917c5325a37731b821d3da3c8de20d364395b570efa5c1fb89780853d866800a5c7b3ef05a3b17a477c54201622ba83c28b0b + checksum: 566abe01767d03860834b7b95093f1de5d7d7e010a556508e727afafc7476765d146452047adeee3aeaa5b0d361c504762695d8d3d6386e77f0091ff53e00d9c languageName: node linkType: hard @@ -9622,16 +9498,9 @@ __metadata: languageName: node linkType: hard -"node-abort-controller@npm:^3.1.1": - version: 3.1.1 - resolution: "node-abort-controller@npm:3.1.1" - checksum: 2c340916af9710328b11c0828223fc65ba320e0d082214a211311bf64c2891028e42ef276b9799188c4ada9e6e1c54cf7a0b7c05dd9d59fcdc8cd633304c8047 - languageName: node - linkType: hard - "node-gyp@npm:latest": - version: 11.2.0 - resolution: "node-gyp@npm:11.2.0" + version: 11.5.0 + resolution: "node-gyp@npm:11.5.0" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 @@ -9645,7 +9514,7 @@ __metadata: which: ^5.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 2536282ba81f8a94b29482d3622b6ab298611440619e46de4512a6f32396a68b5530357c474b859787069d84a4c537d99e0c71078cce5b9f808bf84eeb78e8fb + checksum: 6cc29b9d454d9a684c8fe299668db618875bb4282e37717ca5b79689cc5ce99cd553c70944bb367979f2eba40ad6a50afaf7b12a6b214172edc7377384efa051 languageName: node linkType: hard @@ -9656,10 +9525,10 @@ __metadata: 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.26": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: a9a54079d894704c2ec728a690b41fbc779a710f5d47b46fa3e460acff08a3e7dfa7108e5599b2db390aa31dac062c47c5118317201f12784188dc5b415f692d languageName: node linkType: hard @@ -9736,21 +9605,12 @@ __metadata: languageName: node linkType: hard -"ob1@npm:0.80.12": - version: 0.80.12 - resolution: "ob1@npm:0.80.12" +"ob1@npm:0.82.5": + version: 0.82.5 + resolution: "ob1@npm:0.82.5" dependencies: flow-enums-runtime: ^0.0.6 - checksum: c78af51d6ecf47ba5198bc7eb27d0456a287589533f1445e6d595e2d067f6f8038da02a98e5faa4a6c3d0c04f77c570bc9b29c652fec55518884c40c73212f17 - languageName: node - linkType: hard - -"ob1@npm:0.82.3": - version: 0.82.3 - resolution: "ob1@npm:0.82.3" - dependencies: - flow-enums-runtime: ^0.0.6 - checksum: 353bf489624f90c5029128ecd3ca5f8fbb68d334bcb27de06611e4a5b09b90473b860514aaa54eba2238b37b5fd53d51032a24d80494cd0b77e4d9b7f7a86553 + checksum: 3faa161e5b5307188b6bbbf7e21727b1e434b8f6c31c51386808b2efd5e7238cf85a7ce71416d9a3f073625afb5a2212f80ec267996dc88fe086944adbb525d9 languageName: node linkType: hard @@ -9761,7 +9621,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.3": +"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 @@ -9843,10 +9703,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 @@ -10264,7 +10124,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": +"picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -10278,13 +10138,6 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: a7a5188c954f82c6585720e9143297ccd0e35ad8072231608086ca950bee672d51b0ef676254af0788205e59bd4e4deb4e7708769226bed725bf13370a7d1464 - languageName: node - linkType: hard - "picomatch@npm:^4.0.3": version: 4.0.3 resolution: "picomatch@npm:4.0.3" @@ -10332,11 +10185,22 @@ __metadata: linkType: hard "prettier@npm:^3.0.3": - version: 3.5.3 - resolution: "prettier@npm:3.5.3" + version: 3.6.2 + resolution: "prettier@npm:3.6.2" bin: prettier: bin/prettier.cjs - checksum: 61e97bb8e71a95d8f9c71f1fd5229c9aaa9d1e184dedb12399f76aa802fb6fdc8954ecac9df25a7f82ee7311cf8ddbd06baf5507388fc98e5b44036cc6a88a1b + checksum: 0206f5f437892e8858f298af8850bf9d0ef1c22e21107a213ba56bfb9c2387a2020bfda244a20161d8e3dad40c6b04101609a55d370dece53d0a31893b64f861 + languageName: node + linkType: hard + +"pretty-format@npm:30.2.0, pretty-format@npm:^30.0.5": + version: 30.2.0 + resolution: "pretty-format@npm:30.2.0" + dependencies: + "@jest/schemas": 30.0.5 + ansi-styles: ^5.2.0 + react-is: ^18.3.1 + checksum: 4c54f5ed8bcf450df9d5d70726c3373f26896845a9704f5a4a835913dacea794fabb5de4ab19fabb0d867de496f9fc8bf854ccdb661c45af334026308557d622 languageName: node linkType: hard @@ -10370,13 +10234,6 @@ __metadata: languageName: node linkType: hard -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf - languageName: node - linkType: hard - "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -10455,12 +10312,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 @@ -10472,11 +10329,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 @@ -10565,12 +10422,23 @@ __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 + +"react-error-boundary@npm:^3.1.0": + version: 3.1.4 + resolution: "react-error-boundary@npm:3.1.4" + dependencies: + "@babel/runtime": ^7.12.5 + peerDependencies: + react: ">=16.13.1" + checksum: f36270a5d775a25c8920f854c0d91649ceea417b15b5bc51e270a959b0476647bb79abb4da3be7dd9a4597b029214e8fe43ea914a7f16fa7543c91f784977f1b languageName: node linkType: hard @@ -10588,23 +10456,23 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": +"react-is@npm:^18.0.0, react-is@npm:^18.3.1": version: 18.3.1 resolution: "react-is@npm:18.3.1" checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 languageName: node linkType: hard -"react-is@npm:^19.1.0": - version: 19.1.0 - resolution: "react-is@npm:19.1.0" - checksum: 3eb4eac7f09bf178bdc6fa98d384f5f243b85de7c99679a88b0154ead4d818ad94386ccb00ea31ec52409ffd13299057f5ec6ca2eaec06f9f7eddc1ad4832332 +"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.40.10": - version: 0.40.11 - resolution: "react-native-builder-bob@npm:0.40.11" + version: 0.40.14 + resolution: "react-native-builder-bob@npm:0.40.14" dependencies: "@babel/core": ^7.25.2 "@babel/plugin-transform-flow-strip-types": ^7.26.5 @@ -10624,20 +10492,19 @@ __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: a165c284bb9a938238c7fee526399b06d831dc6ce01762db466f79f768708536f34f0c01e01f49fae732bc160d6198a5499200fdb254b317ce04b69e1c814fdc + checksum: f7a95477535ccf749affb79f539faf925ff23a3864b0ad4fd4eb0e729f246e1c6357b392857156695d22005a60aa9f9f7bb773e2582f0e06b5c3f77e5258f00d languageName: node linkType: hard "react-native-gesture-handler@npm:^2.25.0": - version: 2.25.0 - resolution: "react-native-gesture-handler@npm:2.25.0" + version: 2.29.1 + resolution: "react-native-gesture-handler@npm:2.29.1" dependencies: "@egjs/hammerjs": ^2.0.17 hoist-non-react-statics: ^3.3.0 @@ -10645,27 +10512,27 @@ __metadata: peerDependencies: react: "*" react-native: "*" - checksum: 51b155bcc56043b9e06bf8ded089c44348e8da297b38e73f203f2d6ce8bd51698f85a38dca8eeab3d2ab721aeddefc270acd99e16cf493b20f1f429ad02214b8 + checksum: dddabdb12ce31d68ef71796e8fcaa57acd4608cca14412f36ce36fee14911fb629f325f0ced86bea1336a64673a434e34cde32a63be8d33f29d9a7bed292c5b2 languageName: node linkType: hard "react-native-monorepo-config@npm:^0.1.8": - version: 0.1.9 - resolution: "react-native-monorepo-config@npm:0.1.9" + 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: 6356c362c517c49e17d54ee764c3566ba71491fa0d755618ecf2ca548348668e84fe448c24066645983acbc2bd4c0ed47594f9b3ec9dcc0558c0fd9594d2391e + checksum: 9b1c6fefb4d67e4a9f3f11554d33072c2112f56d578b8e9b68becc3457383e4f487f31af00d9e85cd43f0b23996c1b22e10cbec57e80c3fb2e4557a0e3db176d languageName: node linkType: hard -"react-native-nitro-modules@npm:^0.31.3": - version: 0.31.3 - resolution: "react-native-nitro-modules@npm:0.31.3" +"react-native-nitro-modules@npm:^0.31.3, react-native-nitro-modules@npm:^0.31.4": + version: 0.31.4 + resolution: "react-native-nitro-modules@npm:0.31.4" peerDependencies: react: "*" react-native: "*" - checksum: e7d87edc84a664d0aeb80fa1b01e53befc2ec86bd694ecd5f35bc9c97bdb050029b3396dc411fdd5ce7639e5d8c8c31bc3d7bd0804c640a7c44c963ceea5086a + checksum: 9d251ec788eafb5c66033a1f376e2a8f9dfc8962a22e8511f6451bc50bf324549fd4e5113ee5bed59a993c0afc3288e8722d854239a33c00faae26848a211fde languageName: node linkType: hard @@ -10679,6 +10546,7 @@ __metadata: "@react-native-community/cli": 18.0.0 "@react-native-community/cli-platform-android": 18.0.0 "@react-native-community/cli-platform-ios": 18.0.0 + "@react-native-picker/picker": ^2.11.4 "@react-native/babel-preset": 0.79.2 "@react-native/metro-config": 0.79.2 "@react-native/typescript-config": 0.79.2 @@ -10706,6 +10574,8 @@ __metadata: "@react-native/babel-preset": 0.79.2 "@react-native/eslint-config": ^0.78.0 "@release-it/conventional-changelog": ^9.0.2 + "@testing-library/react-hooks": ^8.0.1 + "@testing-library/react-native": ^13.3.3 "@types/jest": ^29.5.5 "@types/react": ^19.0.0 commitlint: ^19.6.1 @@ -10720,6 +10590,7 @@ __metadata: react-native: 0.79.2 react-native-builder-bob: ^0.40.10 react-native-nitro-modules: ^0.31.3 + react-test-renderer: 19.0.0 release-it: ^17.10.0 turbo: ^1.10.7 typescript: ^5.2.2 @@ -10731,12 +10602,12 @@ __metadata: linkType: soft "react-native-safe-area-context@npm:^5.4.0": - version: 5.4.0 - resolution: "react-native-safe-area-context@npm:5.4.0" + version: 5.6.2 + resolution: "react-native-safe-area-context@npm:5.6.2" peerDependencies: react: "*" react-native: "*" - checksum: 7d7f9a8278048650fd207d436798bd062d6f78d771cb0665b92aef69dba870251339e6812e1d669fd1958345288bd0f9ac98fbfe353c13958d18b58dc946c341 + checksum: 7b15cdd07df4f3650cf443fb322ee2d51b3ab45c652789cbea4cb48a8e6fd2b66e2be01e9f63e614ceaf28d9d228af681ca8857b2ed8dabe48f23964076d40c3 languageName: node linkType: hard @@ -10799,6 +10670,18 @@ __metadata: languageName: node linkType: hard +"react-test-renderer@npm:19.0.0": + version: 19.0.0 + resolution: "react-test-renderer@npm:19.0.0" + dependencies: + react-is: ^19.0.0 + scheduler: ^0.25.0 + peerDependencies: + react: ^19.0.0 + checksum: 2e1e527588c69e822b7aa25262c9f4a48161ede9cee5109b88228ecafbd91ce82f7afed176645efcba903ba5a43d05842a8229cdde220049e42a0cf679715dbc + languageName: node + linkType: hard + "react@npm:19.0.0": version: 19.0.0 resolution: "react@npm:19.0.0" @@ -10864,21 +10747,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:~2.3.6": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: ~1.0.0 - inherits: ~2.0.3 - isarray: ~1.0.0 - process-nextick-args: ~2.0.0 - safe-buffer: ~5.1.1 - string_decoder: ~1.1.1 - util-deprecate: ~1.0.1 - checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 - languageName: node - linkType: hard - "rechoir@npm:^0.6.2": version: 0.6.2 resolution: "rechoir@npm:0.6.2" @@ -10888,6 +10756,16 @@ __metadata: languageName: node linkType: hard +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: ^4.0.0 + strip-indent: ^3.0.0 + checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b + languageName: node + linkType: hard + "redent@npm:^4.0.0": version: 4.0.0 resolution: "redent@npm:4.0.0" @@ -10914,12 +10792,12 @@ __metadata: languageName: node linkType: hard -"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 @@ -10937,7 +10815,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.3": +"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: @@ -10951,17 +10829,17 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^6.2.0": - version: 6.2.0 - resolution: "regexpu-core@npm:6.2.0" +"regexpu-core@npm:^6.3.1": + 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 @@ -10990,14 +10868,14 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.12.0": - version: 0.12.0 - resolution: "regjsparser@npm:0.12.0" +"regjsparser@npm:^0.13.0": + version: 0.13.0 + resolution: "regjsparser@npm:0.13.0" dependencies: - jsesc: ~3.0.2 + jsesc: ~3.1.0 bin: regjsparser: bin/parser - checksum: 094b55b0ab3e1fd58f8ce5132a1d44dab08d91f7b0eea4132b0157b303ebb8ded20a9cbd893d25402d2aeddb23fac1f428ab4947b295d6fa51dd1c334a9e76f0 + checksum: 1cf09f6afde2b2d1c1e89e1ce3034e3ee8d9433912728dbaa48e123f5f43ce34e263b2a8ab228817dce85d676ee0c801a512101b015ac9ab80ed449cf7329d3a languageName: node linkType: hard @@ -11093,16 +10971,16 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.14.2, resolve@npm:^1.20.0": - version: 1.22.10 - resolution: "resolve@npm:1.22.10" +"resolve@npm:^1.1.6, resolve@npm:^1.20.0, resolve@npm:^1.22.10": + version: 1.22.11 + resolution: "resolve@npm:1.22.11" dependencies: - is-core-module: ^2.16.0 + is-core-module: ^2.16.1 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: ab7a32ff4046fcd7c6fdd525b24a7527847d03c3650c733b909b01b757f92eb23510afa9cc3e9bf3f26a3e073b48c88c706dfd4c1d2fb4a16a96b73b6328ddcf + checksum: 6d5baa2156b95a65ac431e7642e21106584e9f4194da50871cae8bc1bbd2b53bb7cee573c92543d83bb999620b224a087f62379d800ed1ccb189da6df5d78d50 languageName: node linkType: hard @@ -11119,16 +10997,16 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin": - version: 1.22.10 - resolution: "resolve@patch:resolve@npm%3A1.22.10#~builtin::version=1.22.10&hash=c3c19d" +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.10#~builtin": + version: 1.22.11 + resolution: "resolve@patch:resolve@npm%3A1.22.11#~builtin::version=1.22.11&hash=c3c19d" dependencies: - is-core-module: ^2.16.0 + is-core-module: ^2.16.1 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 8aac1e4e4628bd00bf4b94b23de137dd3fe44097a8d528fd66db74484be929936e20c696e1a3edf4488f37e14180b73df6f600992baea3e089e8674291f16c9d + checksum: 1462da84ac3410d7c2e12e4f5f25c1423d8a174c3b4245c43eafea85e7bbe6af3eb7ec10a4850b5e518e8531608604742b8cbd761e1acd7ad1035108b7c98013 languageName: node linkType: hard @@ -11198,9 +11076,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 @@ -11249,13 +11127,6 @@ __metadata: languageName: node linkType: hard -"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-push-apply@npm:^1.0.0": version: 1.0.0 resolution: "safe-push-apply@npm:1.0.0" @@ -11284,7 +11155,7 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:0.25.0": +"scheduler@npm:0.25.0, scheduler@npm:^0.25.0": version: 0.25.0 resolution: "scheduler@npm:0.25.0" checksum: b7bb9fddbf743e521e9aaa5198a03ae823f5e104ebee0cb9ec625392bb7da0baa1c28ab29cee4b1e407a94e76acc6eee91eeb749614f91f853efda2613531566 @@ -11310,11 +11181,11 @@ __metadata: linkType: hard "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.7.2 - resolution: "semver@npm:7.7.2" + version: 7.7.3 + resolution: "semver@npm:7.7.3" bin: semver: bin/semver.js - checksum: dd94ba8f1cbc903d8eeb4dd8bf19f46b3deb14262b6717d0de3c804b594058ae785ef2e4b46c5c3b58733c99c83339068203002f9e37cfe44f7e2cc5e3d2f621 + checksum: f013a3ee4607857bcd3503b6ac1d80165f7f8ea94f5d55e2d3e33df82fce487aa3313b987abf9b39e0793c83c9fc67b76c36c067625141a9f6f704ae0ea18db2 languageName: node linkType: hard @@ -11425,10 +11296,10 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.6.1, shell-quote@npm:^1.8.1": - version: 1.8.2 - resolution: "shell-quote@npm:1.8.2" - checksum: 1e97b62ced1c4c5135015978ebf273bed1f425a68cf84163e83fbb0f34b3ff9471e656720dab2b7cbb4ae0f58998e686d17d166c28dfb3662acd009e8bd7faed +"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 languageName: node linkType: hard @@ -11508,11 +11379,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 @@ -11574,12 +11445,12 @@ __metadata: linkType: hard "socks@npm:^2.8.3": - version: 2.8.4 - resolution: "socks@npm:2.8.4" + 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: cd1edc924475d5dfde534adf66038df7e62c7343e6b8c0113e52dc9bb6a0a10e25b2f136197f379d695f18e8f0f2b7f6e42977bf720ddbee912a851201c396ad + checksum: 4bbe2c88cf0eeaf49f94b7f11564a99b2571bde6fd1e714ff95b38f89e1f97858c19e0ab0e6d39eb7f6a984fa67366825895383ed563fe59962a1d57a1d55318 languageName: node linkType: hard @@ -11645,9 +11516,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.21 - resolution: "spdx-license-ids@npm:3.0.21" - checksum: 681dfe26d250f48cc725c9118adf1eb0a175e3c298cd8553c039bfae37ed21bea30a27bc02dbb99b4a0d3a25c644c5dda952090e11ef4b3093f6ec7db4b93b58 + version: 3.0.22 + resolution: "spdx-license-ids@npm:3.0.22" + checksum: 3810ce1ddd8c67d7cfa76a0af05157090a2d93e5bb93bd85bf9735f1fd8062c5b510423a4669dc7d8c34b0892b27a924b1c6f8965f85d852aa25062cceff5e29 languageName: node linkType: hard @@ -11665,13 +11536,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" @@ -11734,6 +11598,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" @@ -11869,15 +11743,6 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: ~5.1.0 - checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b - languageName: node - linkType: hard - "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -11897,11 +11762,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 @@ -11926,12 +11791,19 @@ __metadata: languageName: node linkType: hard -"strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" dependencies: - min-indent: ^1.0.1 - checksum: 06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 + min-indent: ^1.0.0 + checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + +"strip-indent@npm:^4.0.0": + version: 4.1.1 + resolution: "strip-indent@npm:4.1.1" + checksum: d322bfdc59855006791a4aebe2a66e0892eab7004a5c064d74b86a0c6ecff2818974c9a5eda54b16d8af6aadbc90a6c02635ffcbec11ab33dd8979b1a6346fc0 languageName: node linkType: hard @@ -11956,10 +11828,19 @@ __metadata: languageName: node linkType: hard -"stubborn-fs@npm:^1.2.5": - version: 1.2.5 - resolution: "stubborn-fs@npm:1.2.5" - checksum: 28d197afec1ec21ce7ffb06a42f01db19beecdf491694c53393ff5d92ec8a300df9c357e09a16d5cf55747ee2a70bc3c788b9e5577696061ffb9ae279655a600 +"stubborn-fs@npm:^2.0.0": + version: 2.0.0 + resolution: "stubborn-fs@npm:2.0.0" + dependencies: + stubborn-utils: ^1.0.1 + checksum: ead3401b9487d6fba35625e7349b36bda0c1850bf3c14cac96bd61e520dc4bc326e3e45f4ec1a4fa74f6c5688ba1690b8bae25baeedd1c3f4803bd39f7fbd935 + languageName: node + linkType: hard + +"stubborn-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "stubborn-utils@npm:1.0.2" + checksum: 49f6b5b0f7c5565b0946905c4200f6b58dc614f9c52d7e246fac43f061b4e68e0ba274366a6d6d080e796c014da0de2ceb04b0046e5aea9cfe26365a9dac4190 languageName: node linkType: hard @@ -11988,40 +11869,39 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.11.0": - version: 0.11.6 - resolution: "synckit@npm:0.11.6" +"synckit@npm:^0.11.7": + version: 0.11.11 + resolution: "synckit@npm:0.11.11" dependencies: - "@pkgr/core": ^0.2.4 - checksum: ce910d27ee1b30ff961905e5d63d60e2cede4f33cd3dc7b46988989f83ac33b3020a193ec8121af9c999b68aa90c01ec42121ebf9fe4356cc6406b9ff037f180 + "@pkgr/core": ^0.2.9 + checksum: bc896d4320525501495654766e6b0aa394e522476ea0547af603bdd9fd7e9b65dcd6e3a237bc7eb3ab7e196376712f228bf1bf6ed1e1809f4b32dc9baf7ad413 languageName: node linkType: hard "tar@npm:^7.4.3": - version: 7.4.3 - resolution: "tar@npm:7.4.3" + version: 7.5.2 + resolution: "tar@npm:7.5.2" dependencies: "@isaacs/fs-minipass": ^4.0.0 chownr: ^3.0.0 minipass: ^7.1.2 - minizlib: ^3.0.1 - mkdirp: ^3.0.1 + minizlib: ^3.1.0 yallist: ^5.0.0 - checksum: 8485350c0688331c94493031f417df069b778aadb25598abdad51862e007c39d1dd5310702c7be4a6784731a174799d8885d2fde0484269aea205b724d7b2ffa + checksum: 192559b0e7af17d57c7747592ef22c14d5eba2d9c35996320ccd20c3e2038160fe8d928fc5c08b2aa1b170c4d0a18c119441e81eae8f227ca2028d5bcaa6bf23 languageName: node linkType: hard "terser@npm:^5.15.0": - version: 5.39.2 - resolution: "terser@npm:5.39.2" + version: 5.44.0 + resolution: "terser@npm:5.44.0" dependencies: "@jridgewell/source-map": ^0.3.3 - acorn: ^8.14.0 + acorn: ^8.15.0 commander: ^2.20.0 source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 986a47896503c5bc6475c751d9445d4326de2e6f8b0be2c943b7726426ad0fe2385aacb9dce1dbc3aee13171595a0234411479bc855e6c730a51f23175132c84 + checksum: 4e1868d9662ea280dad7b49cfe61b7693187be2b529b31b1f86782db00833c03ba05f2b82fc513d928e937260f2a5fbf42a93724e86eaf55f069288f934ccdb3 languageName: node linkType: hard @@ -12050,16 +11930,6 @@ __metadata: languageName: node linkType: hard -"through2@npm:^2.0.1": - version: 2.0.5 - resolution: "through2@npm:2.0.5" - dependencies: - readable-stream: ~2.3.6 - xtend: ~4.0.1 - checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50 - languageName: node - linkType: hard - "through@npm:>=2.2.7 <3": version: 2.3.8 resolution: "through@npm:2.3.8" @@ -12068,23 +11938,13 @@ __metadata: linkType: hard "tinyexec@npm:^1.0.0": - version: 1.0.1 - resolution: "tinyexec@npm:1.0.1" - checksum: 40f5219abf891884863b085ebe5e8c8bf95bde802f6480f279588b355835ad1604fa01eada2afe90063b48b53cd4b0be5c37393980e23f06fd10689d92fb9586 - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.12": - version: 0.2.13 - resolution: "tinyglobby@npm:0.2.13" - dependencies: - fdir: ^6.4.4 - picomatch: ^4.0.2 - checksum: 3a2e87a2518cb3616057b0aa58be4f17771ae78c6890556516ae1e631f8ce4cfee1ba1dcb62fcc54a64e2bdd6c3104f4f3d021e1a3e3f8fb0875bca380b913e5 + version: 1.0.2 + resolution: "tinyexec@npm:1.0.2" + checksum: af22de2191cc70bb782eef29bbba7cf6ac16664e550b547b0db68804f988eeb2c70e12fbb7d2d688ee994b28ba831d746e9eded98c3d10042fd3a9b8de208514 languageName: node linkType: hard -"tinyglobby@npm:^0.2.14": +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" dependencies: @@ -12370,22 +12230,22 @@ __metadata: linkType: hard "typescript@npm:^5.2.2": - version: 5.8.3 - resolution: "typescript@npm:5.8.3" + version: 5.9.3 + resolution: "typescript@npm:5.9.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: cb1d081c889a288b962d3c8ae18d337ad6ee88a8e81ae0103fa1fecbe923737f3ba1dbdb3e6d8b776c72bc73bfa6d8d850c0306eed1a51377d2fccdfd75d92c4 + checksum: 0d0ffb84f2cd072c3e164c79a2e5a1a1f4f168e84cb2882ff8967b92afe1def6c2a91f6838fb58b168428f9458c57a2ba06a6737711fdd87a256bbe83e9a217f languageName: node linkType: hard "typescript@patch:typescript@^5.2.2#~builtin": - version: 5.8.3 - resolution: "typescript@patch:typescript@npm%3A5.8.3#~builtin::version=5.8.3&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: 1b503525a88ff0ff5952e95870971c4fb2118c17364d60302c21935dedcd6c37e6a0a692f350892bafcef6f4a16d09073fe461158547978d2f16fbe4cb18581c + checksum: 8bb8d86819ac86a498eada254cad7fb69c5f74778506c700c2a712daeaff21d3a6f51fd0d534fe16903cb010d1b74f89437a3d02d4d0ff5ca2ba9a4660de8497 languageName: node linkType: hard @@ -12417,10 +12277,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.21.0": - version: 6.21.0 - resolution: "undici-types@npm:6.21.0" - checksum: 46331c7d6016bf85b3e8f20c159d62f5ae471aba1eb3dc52fff35a0259d58dcc7d592d4cc4f00c5f9243fa738a11cfa48bd20203040d4a9e6bc25e807fab7ab3 +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 1ef68fc6c5bad200c8b6f17de8e5bc5cfdcadc164ba8d7208cd087cfa8583d922d8316a7fd76c9a658c22b4123d3ff847429185094484fbc65377d695c905857 languageName: node linkType: hard @@ -12441,17 +12301,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 @@ -12508,9 +12368,9 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.3": - version: 1.1.3 - resolution: "update-browserslist-db@npm:1.1.3" +"update-browserslist-db@npm:^1.1.4": + version: 1.1.4 + resolution: "update-browserslist-db@npm:1.1.4" dependencies: escalade: ^3.2.0 picocolors: ^1.1.1 @@ -12518,7 +12378,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 7b6d8d08c34af25ee435bccac542bedcb9e57c710f3c42421615631a80aa6dd28b0a81c9d2afbef53799d482fb41453f714b8a7a0a8003e3b4ec8fb1abb819af + checksum: b757805a63d7954985753c97a48e313abd2d35f2bb10d2bffa65d73a4b81ec9e1305a7b06296819bac8a6b4db8e7be88582487fae2ad7e24731e4ee372b919a6 languageName: node linkType: hard @@ -12556,25 +12416,25 @@ __metadata: languageName: node linkType: hard -"use-latest-callback@npm:^0.2.3": - version: 0.2.3 - resolution: "use-latest-callback@npm:0.2.3" +"use-latest-callback@npm:^0.2.4": + version: 0.2.6 + resolution: "use-latest-callback@npm:0.2.6" peerDependencies: react: ">=16.8" - checksum: 5db2dc0d414508c768ba4d1a337bd73dd0fb2a77eccc9dd7051517b28cd71c849c5e9230b5c97fc76a3811c1500f210cb4e4ebb95fe20347e5f910509a8e533c + checksum: 67a245bf91b23ef0d2d2c8a52845da62e006867bd9d93a99ca4d2f859101fcd54c7afd4f5a3b8bb5d24283f516e7e41bd8226250ee39affc33bd1cfd622a5cfb 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 -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": +"util-deprecate@npm:^1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 @@ -12648,10 +12508,10 @@ __metadata: languageName: node linkType: hard -"when-exit@npm:^2.1.1": - version: 2.1.4 - resolution: "when-exit@npm:2.1.4" - checksum: d77635a0ed43bb63b3b41930637db16fb1e4e8630f5c6efd4aa669322c32b36ba750b7484991f806d3ac56f4e21cdf3925f82fff289b90706cc21e6745038a26 +"when-exit@npm:^2.1.4": + version: 2.1.5 + resolution: "when-exit@npm:2.1.5" + checksum: 94f0ca73dcbaac51e61bcf178268e82bd5b29c3ed45fc154807893d803b220bb15e234cf18b5f392c88e87acf33f0b72dc27c265f8cfdf371121c30d49686966 languageName: node linkType: hard @@ -12708,7 +12568,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18": +"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: @@ -12818,13 +12678,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 @@ -12876,13 +12736,6 @@ __metadata: languageName: node linkType: hard -"xtend@npm:~4.0.1": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a - languageName: node - linkType: hard - "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -12919,11 +12772,11 @@ __metadata: linkType: hard "yaml@npm:^2.2.1": - version: 2.8.0 - resolution: "yaml@npm:2.8.0" + version: 2.8.1 + resolution: "yaml@npm:2.8.1" bin: yaml: bin.mjs - checksum: 66f103ca5a2f02dac0526895cc7ae7626d91aa8c43aad6fdcff15edf68b1199be4012140b390063877913441aaa5288fdf57eca30e06268a8282dd741525e626 + checksum: 35b46150d48bc1da2fd5b1521a48a4fa36d68deaabe496f3c3fa9646d5796b6b974f3930a02c4b5aee6c85c860d7d7f79009416724465e835f40b87898c36de4 languageName: node linkType: hard @@ -13021,9 +12874,9 @@ __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