From 716eafe6be8d48bdf845dc5b33f5eb6234bdbac1 Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Thu, 19 Mar 2026 10:22:09 -0400 Subject: [PATCH 01/22] initial commit --- .../react-native-webcrypto-bridge/README.md | 5 ++ .../package.json | 46 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 packages/react-native-webcrypto-bridge/README.md create mode 100644 packages/react-native-webcrypto-bridge/package.json diff --git a/packages/react-native-webcrypto-bridge/README.md b/packages/react-native-webcrypto-bridge/README.md new file mode 100644 index 0000000..0b66c2e --- /dev/null +++ b/packages/react-native-webcrypto-bridge/README.md @@ -0,0 +1,5 @@ +# React Native WebCrypto Bridge + +This library is meant to provide a polyfill for the [WebCrypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) in a React Native environment. You're welcome to consume this library for your own needs, however the main purpose of this library is to provide the required [WebCrypto](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) methods to support `@okta/react-native-platform`. + +Feature requests against this library will not be accepted, however contributions will be. \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/package.json b/packages/react-native-webcrypto-bridge/package.json new file mode 100644 index 0000000..0eccf7c --- /dev/null +++ b/packages/react-native-webcrypto-bridge/package.json @@ -0,0 +1,46 @@ +{ + "name": "@okta/react-native-webcrypto-bridge", + "version": "0.7.0", + "type": "module", + "main": "dist/esm/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "author": "jared.perreault@okta.com", + "license": "Apache-2.0", + "private": true, + "engines": { + "node": ">=20.11.0" + }, + "files": [ + "./LICENSE", + "./dist", + "*.md", + "package.json" + ], + "scripts": { + }, + "peerDependencies": { + "@okta/auth-foundation": "*" + }, + "devDependencies": { + "@repo/eslint-config": "*", + "@repo/rollup-config": "*", + "@repo/typescript-config": "*", + "eslint": "^8.56.0", + "rollup": "^4.52.4", + "jest": "^29.7.0", + "typescript": "^5.9.2" + }, + "devEngines": { + "runtime": { + "name": "node", + "version": ">=22.13.1", + "onFail": "warn" + }, + "packageManager": { + "name": "yarn", + "version": ">=1.19.0", + "onFail": "warn" + } + } +} From 43e995cc83856fe6f09f88c4e39ff85f904ab2fe Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Thu, 19 Mar 2026 15:36:42 -0400 Subject: [PATCH 02/22] progress --- .../.eslintrc.cjs | 19 + .../android/build.gradle | 55 +++ .../android/main/AndroidManifest.xml | 4 + .../webcryptobridge/WebCryptoBridgeModule.kt | 327 ++++++++++++++++ .../webcryptobridge/WebCryptoBridgePackage.kt | 16 + .../ios/WebCryptoBridge.h | 12 + .../ios/WebCryptoBridge.swift | 361 ++++++++++++++++++ .../jest.config.js | 26 ++ .../package.json | 46 ++- .../react-native-webcrypto-bridge.podspec | 18 + .../react-native.config.js | 10 + .../rollup.config.mjs | 16 + .../src/bridge.ts | 61 +++ .../src/index.ts | 7 + .../react-native-webcrypto-bridge/src/lib.ts | 4 + .../src/polyfill.ts | 155 ++++++++ .../test/jest.setup.js | 35 ++ .../test/spec/polyfill.spec.ts | 34 ++ .../tsconfig.json | 24 ++ 19 files changed, 1227 insertions(+), 3 deletions(-) create mode 100644 packages/react-native-webcrypto-bridge/.eslintrc.cjs create mode 100644 packages/react-native-webcrypto-bridge/android/build.gradle create mode 100644 packages/react-native-webcrypto-bridge/android/main/AndroidManifest.xml create mode 100644 packages/react-native-webcrypto-bridge/android/main/java/com/okta/webcryptobridge/WebCryptoBridgeModule.kt create mode 100644 packages/react-native-webcrypto-bridge/android/main/java/com/okta/webcryptobridge/WebCryptoBridgePackage.kt create mode 100644 packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h create mode 100644 packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift create mode 100644 packages/react-native-webcrypto-bridge/jest.config.js create mode 100644 packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec create mode 100644 packages/react-native-webcrypto-bridge/react-native.config.js create mode 100644 packages/react-native-webcrypto-bridge/rollup.config.mjs create mode 100644 packages/react-native-webcrypto-bridge/src/bridge.ts create mode 100644 packages/react-native-webcrypto-bridge/src/index.ts create mode 100644 packages/react-native-webcrypto-bridge/src/lib.ts create mode 100644 packages/react-native-webcrypto-bridge/src/polyfill.ts create mode 100644 packages/react-native-webcrypto-bridge/test/jest.setup.js create mode 100644 packages/react-native-webcrypto-bridge/test/spec/polyfill.spec.ts create mode 100644 packages/react-native-webcrypto-bridge/tsconfig.json diff --git a/packages/react-native-webcrypto-bridge/.eslintrc.cjs b/packages/react-native-webcrypto-bridge/.eslintrc.cjs new file mode 100644 index 0000000..ea1599a --- /dev/null +++ b/packages/react-native-webcrypto-bridge/.eslintrc.cjs @@ -0,0 +1,19 @@ +module.exports = { + extends: ["@repo/eslint-config/sdk.js"], + root: true, + parser: "@typescript-eslint/parser", + env: { + 'react-native/react-native': true + }, + plugins: ['react', 'react-native'], + rules: { + 'react-native/no-unused-styles': 'warn', + 'react-native/no-inline-styles': 'warn', + 'react-native/no-color-literals': 'warn', + }, + settings: { + react: { + version: 'detect' + } + } +}; diff --git a/packages/react-native-webcrypto-bridge/android/build.gradle b/packages/react-native-webcrypto-bridge/android/build.gradle new file mode 100644 index 0000000..c242f10 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/android/build.gradle @@ -0,0 +1,55 @@ +buildscript { + ext.kotlin_version = '1.9.0' + + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +def safeExtGet(prop, fallback) { + rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback +} + +android { + compileSdkVersion safeExtGet('compileSdkVersion', 33) + + defaultConfig { + minSdkVersion safeExtGet('minSdkVersion', 23) + targetSdkVersion safeExtGet('targetSdkVersion', 33) + versionCode 1 + versionName "1.0" + } + + buildTypes { + release { + minifyEnabled false + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = '11' + } +} + +repositories { + google() + mavenCentral() +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'com.facebook.react:react-native:+' +} \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/android/main/AndroidManifest.xml b/packages/react-native-webcrypto-bridge/android/main/AndroidManifest.xml new file mode 100644 index 0000000..560c218 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/android/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/android/main/java/com/okta/webcryptobridge/WebCryptoBridgeModule.kt b/packages/react-native-webcrypto-bridge/android/main/java/com/okta/webcryptobridge/WebCryptoBridgeModule.kt new file mode 100644 index 0000000..f76dddd --- /dev/null +++ b/packages/react-native-webcrypto-bridge/android/main/java/com/okta/webcryptobridge/WebCryptoBridgeModule.kt @@ -0,0 +1,327 @@ +package com.okta.webcryptobridge + +import com.facebook.react.bridge.* +import com.facebook.react.module.annotations.ReactModule +import org.json.JSONObject +import java.math.BigInteger +import java.security.* +import java.security.spec.RSAPublicKeySpec +import java.util.* + +@ReactModule(name = WebCryptoBridgeModule.NAME) +class WebCryptoBridgeModule(reactContext: ReactApplicationContext) : + ReactContextBaseJavaModule(reactContext) { + + companion object { + const val NAME = "WebCryptoBridge" + private val keyStore = mutableMapOf() + } + + data class KeyPairEntry( + val publicKey: PublicKey, + val privateKey: PrivateKey, + val extractable: Boolean + ) + + override fun getName(): String = NAME + + // MARK: - Helper Methods + + private fun readableArrayToByteArray(array: ReadableArray): ByteArray { + val bytes = ByteArray(array.size()) + for (i in 0 until array.size()) { + bytes[i] = array.getInt(i).toByte() + } + return bytes + } + + private fun byteArrayToWritableArray(bytes: ByteArray): WritableArray { + val array = Arguments.createArray() + bytes.forEach { array.pushInt(it.toInt() and 0xFF) } + return array + } + + private fun toUnsignedByteArray(value: BigInteger): ByteArray { + val bytes = value.toByteArray() + // Remove leading zero byte if present (for positive numbers) + return if (bytes[0].toInt() == 0 && bytes.size > 1) { + bytes.copyOfRange(1, bytes.size) + } else { + bytes + } + } + + // MARK: - Synchronous Methods + + @ReactMethod(isBlockingSynchronousMethod = true) + fun getRandomValues(length: Double): WritableArray { + val len = length.toInt() + val random = SecureRandom() + val bytes = ByteArray(len) + random.nextBytes(bytes) + return byteArrayToWritableArray(bytes) + } + + @ReactMethod(isBlockingSynchronousMethod = true) + fun randomUUID(): String { + return UUID.randomUUID().toString() + } + + // MARK: - Async Methods + + @ReactMethod + fun digest( + algorithm: String, + data: ReadableArray, + promise: Promise + ) { + try { + if (algorithm != "SHA-256") { + promise.reject("unsupported_algorithm", "Only SHA-256 is supported") + return + } + + val inputData = readableArrayToByteArray(data) + val digest = MessageDigest.getInstance("SHA-256") + val hash = digest.digest(inputData) + val result = byteArrayToWritableArray(hash) + + promise.resolve(result) + } catch (e: Exception) { + promise.reject("digest_failed", "Failed to compute digest", e) + } + } + + @ReactMethod + fun generateKey( + algorithmJson: String, + extractable: Boolean, + keyUsages: ReadableArray, + promise: Promise + ) { + try { + val algorithm = JSONObject(algorithmJson) + val algorithmName = algorithm.getString("name") + + if (algorithmName != "RSASSA-PKCS1-v1_5") { + promise.reject("unsupported_algorithm", "Only RSASSA-PKCS1-v1_5 is supported") + return + } + + val modulusLength = algorithm.getInt("modulusLength") + if (modulusLength != 2048) { + promise.reject("invalid_modulus", "Only 2048-bit keys are supported") + return + } + + val keyPairGenerator = KeyPairGenerator.getInstance("RSA") + keyPairGenerator.initialize(2048, SecureRandom()) + val keyPair = keyPairGenerator.generateKeyPair() + + val keyId = UUID.randomUUID().toString() + + synchronized(keyStore) { + keyStore[keyId] = KeyPairEntry( + publicKey = keyPair.public, + privateKey = keyPair.private, + extractable = extractable + ) + } + + val result = JSONObject().apply { + put("id", keyId) + } + + promise.resolve(result.toString()) + } catch (e: Exception) { + promise.reject("key_generation_failed", "Failed to generate key pair", e) + } + } + + @ReactMethod + fun exportKey( + format: String, + keyId: String, + keyType: String, + promise: Promise + ) { + try { + if (format != "jwk") { + promise.reject("unsupported_format", "Only JWK format is supported") + return + } + + val keyPairEntry = keyStore[keyId] + if (keyPairEntry == null) { + promise.reject("key_not_found", "Key not found") + return + } + + val key = if (keyType == "public") { + keyPairEntry.publicKey + } else { + keyPairEntry.privateKey + } + + val jwk = when (key) { + is java.security.interfaces.RSAPublicKey -> { + JSONObject().apply { + put("kty", "RSA") + put("alg", "RS256") + put("n", android.util.Base64.encodeToString( + toUnsignedByteArray(key.modulus), + android.util.Base64.NO_WRAP + )) + put("e", android.util.Base64.encodeToString( + toUnsignedByteArray(key.publicExponent), + android.util.Base64.NO_WRAP + )) + } + } + is java.security.interfaces.RSAPrivateKey -> { + // For private keys, we need the CRT parameters + // This is a simplified version + JSONObject().apply { + put("kty", "RSA") + put("alg", "RS256") + put("n", android.util.Base64.encodeToString( + toUnsignedByteArray(key.modulus), + android.util.Base64.NO_WRAP + )) + // Private key components would go here in a full implementation + } + } + else -> { + promise.reject("unsupported_key_type", "Unsupported key type") + return + } + } + + promise.resolve(jwk.toString()) + } catch (e: Exception) { + promise.reject("export_failed", "Failed to export key", e) + } + } + + @ReactMethod + fun importKey( + format: String, + keyDataJson: String, + algorithmJson: String, + extractable: Boolean, + keyUsages: ReadableArray, + promise: Promise + ) { + try { + if (format != "jwk") { + promise.reject("unsupported_format", "Only JWK format is supported") + return + } + + val jwk = JSONObject(keyDataJson) + val kty = jwk.getString("kty") + + if (kty != "RSA") { + promise.reject("unsupported_key_type", "Only RSA keys are supported") + return + } + + // Decode modulus and exponent from standard base64 + val modulusBytes = android.util.Base64.decode(jwk.getString("n"), android.util.Base64.NO_WRAP) + val exponentBytes = android.util.Base64.decode(jwk.getString("e"), android.util.Base64.NO_WRAP) + + val modulus = BigInteger(1, modulusBytes) + val exponent = BigInteger(1, exponentBytes) + + // Determine if this is a public or private key + val keyUsagesList = mutableListOf() + for (i in 0 until keyUsages.size()) { + keyUsagesList.add(keyUsages.getString(i) ?: "") + } + val isPrivateKey = keyUsagesList.contains("sign") + + val keyFactory = KeyFactory.getInstance("RSA") + + if (isPrivateKey) { + // For private key import, we'd need the private exponent (d) + promise.reject("not_implemented", "Private key import not yet implemented") + return + } else { + // Import public key + val keySpec = RSAPublicKeySpec(modulus, exponent) + val publicKey = keyFactory.generatePublic(keySpec) + + val keyId = UUID.randomUUID().toString() + + synchronized(keyStore) { + keyStore[keyId] = KeyPairEntry( + publicKey = publicKey, + privateKey = publicKey as PrivateKey, // Placeholder - won't be used + extractable = extractable + ) + } + + promise.resolve(keyId) + } + } catch (e: Exception) { + promise.reject("import_failed", "Failed to import key", e) + } + } + + @ReactMethod + fun sign( + algorithmJson: String, + keyId: String, + data: ReadableArray, + promise: Promise + ) { + try { + val keyPairEntry = keyStore[keyId] + if (keyPairEntry == null) { + promise.reject("key_not_found", "Key not found") + return + } + + val inputData = readableArrayToByteArray(data) + + val signature = Signature.getInstance("SHA256withRSA") + signature.initSign(keyPairEntry.privateKey) + signature.update(inputData) + val signatureBytes = signature.sign() + + val result = byteArrayToWritableArray(signatureBytes) + promise.resolve(result) + } catch (e: Exception) { + promise.reject("signing_failed", "Failed to sign data", e) + } + } + + @ReactMethod + fun verify( + algorithmJson: String, + keyId: String, + signatureArray: ReadableArray, + data: ReadableArray, + promise: Promise + ) { + try { + val keyPairEntry = keyStore[keyId] + if (keyPairEntry == null) { + promise.reject("key_not_found", "Key not found") + return + } + + val inputData = readableArrayToByteArray(data) + val signatureBytes = readableArrayToByteArray(signatureArray) + + val signature = Signature.getInstance("SHA256withRSA") + signature.initVerify(keyPairEntry.publicKey) + signature.update(inputData) + val verified = signature.verify(signatureBytes) + + promise.resolve(verified) + } catch (e: Exception) { + promise.reject("verification_failed", "Failed to verify signature", e) + } + } +} \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/android/main/java/com/okta/webcryptobridge/WebCryptoBridgePackage.kt b/packages/react-native-webcrypto-bridge/android/main/java/com/okta/webcryptobridge/WebCryptoBridgePackage.kt new file mode 100644 index 0000000..2efc0c6 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/android/main/java/com/okta/webcryptobridge/WebCryptoBridgePackage.kt @@ -0,0 +1,16 @@ +package com.okta.webcryptobridge + +import com.facebook.react.ReactPackage +import com.facebook.react.bridge.NativeModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.uimanager.ViewManager + +class WebCryptoBridgePackage : ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): List { + return listOf(WebCryptoBridgeModule(reactContext)) + } + + override fun createViewManagers(reactContext: ReactApplicationContext): List> { + return emptyList() + } +} \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h new file mode 100644 index 0000000..4e20f45 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h @@ -0,0 +1,12 @@ +#import + +#ifdef RCT_NEW_ARCH_ENABLED +#import +#import "RNWebCryptoBridgeSpec.h" + +@interface WebCryptoBridge : NSObject +#else +@interface WebCryptoBridge : NSObject +#endif + +@end \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift new file mode 100644 index 0000000..eb99a75 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift @@ -0,0 +1,361 @@ +import Foundation +import Security +import CommonCrypto +import React + +@objc(WebCryptoBridge) +class WebCryptoBridge: NSObject { + + @objc + static func requiresMainQueueSetup() -> Bool { + return false + } + + // MARK: - Helper Methods + + private func byteArrayToData(_ byteArray: [NSNumber]) -> Data { + var data = Data(capacity: byteArray.count) + for byte in byteArray { + data.append(byte.uint8Value) + } + return data + } + + private func dataToByteArray(_ data: Data) -> [NSNumber] { + return data.map { NSNumber(value: $0) } + } + + // MARK: - Synchronous Methods + + @objc(getRandomValues:) + func getRandomValues(_ length: Double) -> [NSNumber] { + let len = Int(length) + var randomData = Data(count: len) + + let result = randomData.withUnsafeMutableBytes { bytes -> Int32 in + guard let baseAddress = bytes.baseAddress else { + return errSecParam + } + return SecRandomCopyBytes(kSecRandomDefault, len, baseAddress) + } + + if result != errSecSuccess { + return [] + } + + return dataToByteArray(randomData) + } + + @objc + func randomUUID() -> String { + return UUID().uuidString.lowercased() + } + + // MARK: - Async Methods + + @objc(digest:data:resolve:reject:) + func digest( + _ algorithm: String, + data: [NSNumber], + resolve: @escaping RCTPromiseResolveBlock, + reject: @escaping RCTPromiseRejectBlock + ) { + guard algorithm == "SHA-256" else { + reject("unsupported_algorithm", "Only SHA-256 is supported", nil) + return + } + + let inputData = byteArrayToData(data) + + var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH)) + inputData.withUnsafeBytes { bytes in + _ = CC_SHA256(bytes.baseAddress, CC_LONG(inputData.count), &hash) + } + + let hashData = Data(hash) + let result = dataToByteArray(hashData) + + resolve(result) + } + + @objc(generateKey:extractable:keyUsages:resolve:reject:) + func generateKey( + _ algorithmJson: String, + extractable: Bool, + keyUsages: [String], + resolve: @escaping RCTPromiseResolveBlock, + reject: @escaping RCTPromiseRejectBlock + ) { + guard let algorithmData = algorithmJson.data(using: .utf8), + let algorithm = try? JSONSerialization.jsonObject(with: algorithmData) as? [String: Any], + algorithm["name"] as? String == "RSASSA-PKCS1-v1_5" else { + reject("unsupported_algorithm", "Only RSASSA-PKCS1-v1_5 is supported", nil) + return + } + + let attributes: [String: Any] = [ + kSecAttrKeyType as String: kSecAttrKeyTypeRSA, + kSecAttrKeySizeInBits as String: 2048, + kSecPrivateKeyAttrs as String: [ + kSecAttrIsPermanent as String: false + ], + kSecPublicKeyAttrs as String: [ + kSecAttrIsPermanent as String: false + ] + ] + + var error: Unmanaged? + guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else { + let err = error?.takeRetainedValue() + reject("key_generation_failed", err?.localizedDescription ?? "Unknown error", err as? Error) + return + } + + guard let publicKey = SecKeyCopyPublicKey(privateKey) else { + reject("key_generation_failed", "Failed to get public key", nil) + return + } + + let keyId = UUID().uuidString + + Self.keyStoreLock.lock() + Self.keyStore[keyId] = [ + "publicKey": publicKey, + "privateKey": privateKey, + "extractable": extractable + ] + Self.keyStoreLock.unlock() + + let result = ["id": keyId] + if let jsonData = try? JSONSerialization.data(withJSONObject: result), + let jsonString = String(data: jsonData, encoding: .utf8) { + resolve(jsonString) + } else { + reject("serialization_failed", "Failed to serialize result", nil) + } + } + + @objc(exportKey:keyId:keyType:resolve:reject:) + func exportKey( + _ format: String, + keyId: String, + keyType: String, + resolve: @escaping RCTPromiseResolveBlock, + reject: @escaping RCTPromiseRejectBlock + ) { + guard format == "jwk" else { + reject("unsupported_format", "Only JWK format is supported", nil) + return + } + + Self.keyStoreLock.lock() + let keyPair = Self.keyStore[keyId] + Self.keyStoreLock.unlock() + + guard let keyPair = keyPair, + let key = keyPair[keyType == "public" ? "publicKey" : "privateKey"] as? SecKey else { + reject("key_not_found", "Key not found", nil) + return + } + + var error: Unmanaged? + guard let keyData = SecKeyCopyExternalRepresentation(key, &error) as Data? else { + let err = error?.takeRetainedValue() + reject("export_failed", err?.localizedDescription ?? "Export failed", err as? Error) + return + } + + // Create JWK (simplified - proper ASN.1 parsing would be better) + var jwk: [String: Any] = [ + "kty": "RSA", + "alg": "RS256" + ] + + // Extract RSA components (simplified) + if keyType == "public" { + let modulus = extractModulus(from: keyData) + let exponent = Data([0x01, 0x00, 0x01]) // Standard exponent (65537) + + jwk["n"] = modulus.base64EncodedString() + jwk["e"] = exponent.base64EncodedString() + } + + if let jsonData = try? JSONSerialization.data(withJSONObject: jwk), + let jsonString = String(data: jsonData, encoding: .utf8) { + resolve(jsonString) + } else { + reject("serialization_failed", "Failed to serialize JWK", nil) + } + } + + @objc(importKey:keyData:algorithm:extractable:keyUsages:resolve:reject:) + func importKey( + _ format: String, + keyData: String, + algorithm: String, + extractable: Bool, + keyUsages: [String], + resolve: @escaping RCTPromiseResolveBlock, + reject: @escaping RCTPromiseRejectBlock + ) { + guard format == "jwk" else { + reject("unsupported_format", "Only JWK format is supported", nil) + return + } + + guard let jwkData = keyData.data(using: .utf8), + let jwk = try? JSONSerialization.jsonObject(with: jwkData) as? [String: Any], + jwk["kty"] as? String == "RSA" else { + reject("invalid_jwk", "Invalid JWK format", nil) + return + } + + guard let nString = jwk["n"] as? String, + let eString = jwk["e"] as? String, + let modulusData = Data(base64Encoded: nString), + let exponentData = Data(base64Encoded: eString) else { + reject("invalid_jwk", "Invalid JWK components", nil) + return + } + + // Build RSA public key data (simplified) + let isPrivateKey = keyUsages.contains("sign") + + let keyId = UUID().uuidString + + // For now, reject private key import as it requires more complex handling + if isPrivateKey { + reject("not_implemented", "Private key import not yet implemented", nil) + return + } + + // Import public key + var error: Unmanaged? + let attributes: [String: Any] = [ + kSecAttrKeyType as String: kSecAttrKeyTypeRSA, + kSecAttrKeyClass as String: kSecAttrKeyClassPublic, + kSecAttrKeySizeInBits as String: modulusData.count * 8 + ] + + // Construct key data (simplified - proper ASN.1 encoding needed) + let keyData = constructRSAPublicKeyData(modulus: modulusData, exponent: exponentData) + + guard let publicKey = SecKeyCreateWithData(keyData as CFData, attributes as CFDictionary, &error) else { + let err = error?.takeRetainedValue() + reject("import_failed", err?.localizedDescription ?? "Import failed", err as? Error) + return + } + + Self.keyStoreLock.lock() + Self.keyStore[keyId] = [ + "publicKey": publicKey, + "extractable": extractable + ] + Self.keyStoreLock.unlock() + + resolve(keyId) + } + + @objc(sign:keyId:data:resolve:reject:) + func sign( + _ algorithmJson: String, + keyId: String, + data: [NSNumber], + resolve: @escaping RCTPromiseResolveBlock, + reject: @escaping RCTPromiseRejectBlock + ) { + Self.keyStoreLock.lock() + let keyPair = Self.keyStore[keyId] + Self.keyStoreLock.unlock() + + guard let keyPair = keyPair, + let privateKey = keyPair["privateKey"] as? SecKey else { + reject("key_not_found", "Private key not found", nil) + return + } + + let inputData = byteArrayToData(data) + + var error: Unmanaged? + guard let signature = SecKeyCreateSignature( + privateKey, + .rsaSignatureMessagePKCS1v15SHA256, + inputData as CFData, + &error + ) as Data? else { + let err = error?.takeRetainedValue() + reject("signing_failed", err?.localizedDescription ?? "Signing failed", err as? Error) + return + } + + let result = dataToByteArray(signature) + resolve(result) + } + + @objc(verify:keyId:signature:data:resolve:reject:) + func verify( + _ algorithmJson: String, + keyId: String, + signature: [NSNumber], + data: [NSNumber], + resolve: @escaping RCTPromiseResolveBlock, + reject: @escaping RCTPromiseRejectBlock + ) { + Self.keyStoreLock.lock() + let keyPair = Self.keyStore[keyId] + Self.keyStoreLock.unlock() + + guard let keyPair = keyPair, + let publicKey = keyPair["publicKey"] as? SecKey else { + reject("key_not_found", "Public key not found", nil) + return + } + + let inputData = byteArrayToData(data) + let signatureData = byteArrayToData(signature) + + var error: Unmanaged? + let verified = SecKeyVerifySignature( + publicKey, + .rsaSignatureMessagePKCS1v15SHA256, + inputData as CFData, + signatureData as CFData, + &error + ) + + if let err = error?.takeRetainedValue() { + reject("verification_failed", err.localizedDescription, err as Error) + return + } + + resolve(verified) + } + + // MARK: - Helper Methods for RSA Key Handling + + private func extractModulus(from keyData: Data) -> Data { + // Simplified extraction - skip ASN.1 header + // In production, use proper ASN.1 parsing + let offset = min(24, keyData.count) + let length = min(256, keyData.count - offset) + return keyData.subdata(in: offset..<(offset + length)) + } + + private func constructRSAPublicKeyData(modulus: Data, exponent: Data) -> Data { + // Simplified RSA public key construction + // In production, use proper ASN.1 encoding + var keyData = Data() + + // Add modulus + keyData.append(modulus) + + // Add exponent + keyData.append(exponent) + + return keyData + } +} + +#ifdef RCT_NEW_ARCH_ENABLED +extension WebCryptoBridge: NativeWebCryptoBridgeSpec {} +#endif \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/jest.config.js b/packages/react-native-webcrypto-bridge/jest.config.js new file mode 100644 index 0000000..9f9d97e --- /dev/null +++ b/packages/react-native-webcrypto-bridge/jest.config.js @@ -0,0 +1,26 @@ +const config = { + preset: 'react-native', + modulePathIgnorePatterns: [ + '/dist/', + '/lib/', + ], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], + testMatch: [ + '**/__tests__/**/*.test.ts', + '**/__tests__/**/*.test.tsx', + ], + transform: { + '^.+\\.(js|jsx|ts|tsx)$': 'babel-jest', + }, + transformIgnorePatterns: [ + 'node_modules/(?!(react-native|@react-native|@okta)/)', + ], + setupFiles: ['/jest.setup.js'], + collectCoverageFrom: [ + 'src/**/*.{ts,tsx}', + '!src/**/__tests__/**', + '!src/**/types.ts', + ], +}; + +export default config; diff --git a/packages/react-native-webcrypto-bridge/package.json b/packages/react-native-webcrypto-bridge/package.json index 0eccf7c..f544222 100644 --- a/packages/react-native-webcrypto-bridge/package.json +++ b/packages/react-native-webcrypto-bridge/package.json @@ -1,10 +1,13 @@ { "name": "@okta/react-native-webcrypto-bridge", "version": "0.7.0", + "description": "WebCrypto API polyfill for React Native with native iOS and Android bridge", "type": "module", "main": "dist/esm/index.js", "module": "dist/esm/index.js", "types": "dist/types/index.d.ts", + "react-native": "src/index.ts", + "source": "src/index.ts", "author": "jared.perreault@okta.com", "license": "Apache-2.0", "private": true, @@ -14,21 +17,50 @@ "files": [ "./LICENSE", "./dist", + "./src", + "./ios", + "./android", + "./cpp", "*.md", - "package.json" + "package.json", + "react-native-webcrypto-bridge.podspec" ], + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "import": "./dist/esm/index.js" + }, + "./package.json": "./package.json" + }, "scripts": { + "lint": "eslint --ext .js,.ts,.tsx .", + "build": "yarn build:esm && yarn build:types", + "build:watch": "rollup -c --watch & tsc --watch", + "build:esm": "rollup -c", + "build:types": "tsc", + "test": "yarn test:unit", + "test:unit": "jest", + "test:watch": "jest --watchAll", + "prepack": "yarn build" + }, + "dependencies": { }, "peerDependencies": { + "react": "*", + "react-native": "*", "@okta/auth-foundation": "*" }, "devDependencies": { "@repo/eslint-config": "*", "@repo/rollup-config": "*", "@repo/typescript-config": "*", + "@types/react": "^18.0.0", + "@types/react-native": "^0.73.0", "eslint": "^8.56.0", - "rollup": "^4.52.4", "jest": "^29.7.0", + "react": "^18.2.0", + "react-native": "^0.73.0", + "rollup": "^4.52.4", "typescript": "^5.9.2" }, "devEngines": { @@ -42,5 +74,13 @@ "version": ">=1.19.0", "onFail": "warn" } + }, + "codegenConfig": { + "name": "RNWebCryptoBridgeSpec", + "type": "modules", + "jsSrcsDir": "src", + "android": { + "javaPackageName": "com.okta.webcryptobridge" + } } -} +} \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec b/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec new file mode 100644 index 0000000..f22d4a5 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec @@ -0,0 +1,18 @@ +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "package.json"))) + +Pod::Spec.new do |s| + s.name = "react-native-webcrypto-bridge" + s.version = package["version"] + s.summary = package["description"] + s.homepage = "https://github.com/okta/okta-client-javascript" + s.license = package["license"] + s.authors = { "Okta" => "jared.perreault@okta.com" } + s.platforms = { :ios => "13.0" } + s.source = { :git => "https://github.com/okta/okta-client-javascript.git", :tag => "#{s.version}" } + + s.source_files = "ios/**/*.{h,m,mm,swift}" + + install_modules_dependencies(s) +end \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/react-native.config.js b/packages/react-native-webcrypto-bridge/react-native.config.js new file mode 100644 index 0000000..d05964d --- /dev/null +++ b/packages/react-native-webcrypto-bridge/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + packageImportPath: 'import com.okta.webcryptobridge.WebCryptoBridgePackage;', + packageInstance: 'new WebCryptoBridgePackage()', + }, + }, + }, +}; \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/rollup.config.mjs b/packages/react-native-webcrypto-bridge/rollup.config.mjs new file mode 100644 index 0000000..5708ed2 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/rollup.config.mjs @@ -0,0 +1,16 @@ +import baseConfig from '@repo/rollup-config/sdk'; +import ts from 'typescript'; +import pkg from './package.json' with { type: 'json' }; + +const base = baseConfig(ts, pkg); + +export default { + ...base, + input: 'src/index.ts', + external: [ + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), + 'react-native', + 'react', + ], +}; diff --git a/packages/react-native-webcrypto-bridge/src/bridge.ts b/packages/react-native-webcrypto-bridge/src/bridge.ts new file mode 100644 index 0000000..75b8b6a --- /dev/null +++ b/packages/react-native-webcrypto-bridge/src/bridge.ts @@ -0,0 +1,61 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + /** + * Generate SHA-256 digest (async) + */ + digest(algorithm: string, data: number[]): Promise; + + /** + * Generate RSA key pair (async) + */ + generateKey( + algorithm: string, + extractable: boolean, + keyUsages: string[] + ): Promise; + + /** + * Export a key to JWK format (async) + */ + exportKey(format: string, keyId: string, keyType: string): Promise; + + /** + * Import a key from JWK format (async) + */ + importKey( + format: string, + keyData: string, + algorithm: string, + extractable: boolean, + keyUsages: string[] + ): Promise; + + /** + * Sign data with a private key (async) + */ + sign(algorithm: string, keyId: string, data: number[]): Promise; + + /** + * Verify a signature (async) + */ + verify( + algorithm: string, + keyId: string, + signature: number[], + data: number[] + ): Promise; + + /** + * Generate cryptographically secure random values (sync) + */ + getRandomValues(length: number): number[]; + + /** + * Generate a random UUID v4 (sync) + */ + randomUUID(): string; +} + +export default TurboModuleRegistry.getEnforcing('WebCryptoBridge'); \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/src/index.ts b/packages/react-native-webcrypto-bridge/src/index.ts new file mode 100644 index 0000000..2e9bbca --- /dev/null +++ b/packages/react-native-webcrypto-bridge/src/index.ts @@ -0,0 +1,7 @@ +/** + * @module @okta/react-native-webcrypto-bridge + */ + + +export { installWebCryptoPolyfill } from './polyfill.ts'; +export * from './lib.ts'; diff --git a/packages/react-native-webcrypto-bridge/src/lib.ts b/packages/react-native-webcrypto-bridge/src/lib.ts new file mode 100644 index 0000000..8a4750b --- /dev/null +++ b/packages/react-native-webcrypto-bridge/src/lib.ts @@ -0,0 +1,4 @@ +import { AuthSdkError } from '@okta/auth-foundation/core'; + + +export class WebCryptoBridgeError extends AuthSdkError {} diff --git a/packages/react-native-webcrypto-bridge/src/polyfill.ts b/packages/react-native-webcrypto-bridge/src/polyfill.ts new file mode 100644 index 0000000..123de17 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/src/polyfill.ts @@ -0,0 +1,155 @@ +/** + * WebCrypto API polyfill for React Native + * + * Uses crypto utilities from @okta/auth-foundation for encoding/decoding + */ + +import NativeWebCryptoBridge from './bridge.ts'; +import { WebCryptoBridgeError } from './lib.ts'; + +// NOTE: Does not use `buf` or `b64` from `auth-foundation` because converting +// to a byte array (number[]) makes the bridge code much simplier and avoids +// doing any string encoding in the native code +type ByteArray = number[]; + +/** + * Converts a `BufferSource` instance to an `ArrayBuffer` + */ +function toArrayBuffer (source: BufferSource): ArrayBuffer { + if (source instanceof ArrayBuffer) { + // If it is already an ArrayBuffer, return it directly. + return source; + } else if (ArrayBuffer.isView(source)) { + // If it is an ArrayBufferView (Uint8Array, DataView, Buffer, etc.): + const typedArray = source; + + // For a Node.js Buffer or a standard typed array, the .buffer property + // gives the underlying ArrayBuffer. + // Use .slice() to create a *copy* of only the relevant bytes if the view + // does not span the entire underlying buffer's length. This is crucial for + // Node.js Buffers which might share a larger memory pool. + return typedArray.buffer.slice(typedArray.byteOffset, typedArray.byteOffset + typedArray.byteLength); + } else { + // Handle other potential cases or throw an error if the type is unexpected + throw new Error("Unsupported BufferSource type."); + } +} + +/** + * Convert ArrayBuffer to byte array for native bridge + */ +function arrayBufferToByteArray(buffer: ArrayBuffer): ByteArray { + return Array.from(new Uint8Array(buffer)); +} + +/** + * Convert byte array from native bridge to ArrayBuffer + */ +function byteArrayToArrayBuffer(bytes: ByteArray): ArrayBuffer { + return new Uint8Array(bytes).buffer; +} + +const digest: SubtleCrypto['digest'] = async (algorithm, data) => { + if (algorithm !== 'SHA-256') { + throw new WebCryptoBridgeError(`Unsupported algorithm: ${algorithm}`); + } + + // Convert ArrayBuffer to byte array for native bridge + const bytes = arrayBufferToByteArray(toArrayBuffer(data)); + const resultBytes = await NativeWebCryptoBridge.digest('SHA-256', bytes); + return byteArrayToArrayBuffer(resultBytes); +} + +const importKey: SubtleCrypto['importKey'] = async ( + format, + keyData, + algorithm, + extractable, + keyUsages +) => { + if (format !== 'jwk') { + throw new WebCryptoBridgeError(`Unsupported format: ${format}`); + } + + // TODO: how to store `keyData`? + + return { + algorithm, + extractable, // TODO: can extractable even be set to `true` and be used in a bridge? + type: 'secret', // TODO: A string identifying whether the key is a symmetric ('secret') or asymmetric ('private' or 'public') key. + usages: keyUsages + } satisfies CryptoKey +}; + +// TODO: DPoP +const exportKey: SubtleCrypto['exportKey'] = async (format, key) => { + throw new Error('Not Implemented'); +} + +// TODO: DPoP +const sign: SubtleCrypto['sign'] = async (algorithm, key, data) => { + throw new Error('Not Implemented'); +} + +// TODO: DPoP +const generateKey: SubtleCrypto['generateKey'] = async ( + algorithm, extractable, keyUsages +) => { + throw new Error('Not Implemented'); +} + +const verify: SubtleCrypto['verify'] = async (algorithm, key, signature, data) => { + return false; +} + +/** + * SubtleCrypto implementation + */ +const subtle: Partial = { + digest, + importKey, + exportKey, + sign, + generateKey, + verify +}; + +/** + * Crypto implementation + */ +const cryptoPolyfill: Crypto = { + subtle, + + // TODO: replace + getRandomValues(array: T): T { + // For synchronous random values, we'll use Math.random as a fallback + // In production, you might want to pre-generate random values or use a sync native module + const uint8Array = new Uint8Array(array.buffer, array.byteOffset, array.byteLength); + + const randomBytes = NativeWebCryptoBridge.getRandomValues(uint8Array.length); + + for (let i = 0; i < randomBytes.length; i++) { + uint8Array[i] = randomBytes[i]; + } + + return array; + }, + randomUUID (): string { + return NativeWebCryptoBridge.randomUUID(); + } +}; + +/** + * Install the WebCrypto polyfill globally + */ +export function installWebCryptoPolyfill(): void { + if (typeof global !== 'undefined') { + // @ts-expect-error - Adding crypto to global + global.crypto = cryptoPolyfill; + } + + if (typeof window !== 'undefined') { + // @ts-expect-error - Adding crypto to window + window.crypto = cryptoPolyfill; + } +} \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/test/jest.setup.js b/packages/react-native-webcrypto-bridge/test/jest.setup.js new file mode 100644 index 0000000..9af6522 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/test/jest.setup.js @@ -0,0 +1,35 @@ +// Mock the native module for Jest tests +jest.mock('./src/NativeWebCryptoBridge', () => ({ + default: { + digest: jest.fn(async (algorithm, data) => data), + generateKey: jest.fn(async () => JSON.stringify({ id: 'test-key-id' })), + exportKey: jest.fn(async () => JSON.stringify({ kty: 'RSA', n: 'test', e: 'AQAB' })), + importKey: jest.fn(async () => 'imported-key-id'), + sign: jest.fn(async () => 'signature'), + verify: jest.fn(async () => true), + getRandomValues: jest.fn(async (length) => { + return Buffer.from(Array(length).fill(0).map(() => Math.floor(Math.random() * 256))).toString('base64url'); + }), + }, +})); + +// Polyfill global crypto for tests +global.crypto = { + getRandomValues: (arr) => { + for (let i = 0; i < arr.length; i++) { + arr[i] = Math.floor(Math.random() * 256); + } + return arr; + }, +}; + +// Mock React Native modules +jest.mock('react-native', () => ({ + NativeModules: { + WebCryptoBridge: {}, + }, + Platform: { + OS: 'ios', + select: jest.fn((obj) => obj.ios || obj.default), + }, +})); diff --git a/packages/react-native-webcrypto-bridge/test/spec/polyfill.spec.ts b/packages/react-native-webcrypto-bridge/test/spec/polyfill.spec.ts new file mode 100644 index 0000000..e80e6af --- /dev/null +++ b/packages/react-native-webcrypto-bridge/test/spec/polyfill.spec.ts @@ -0,0 +1,34 @@ +import { installWebCryptoPolyfill } from 'src/WebCryptoPolyfill'; + +describe('@okta/react-native-webcrypto-bridge', () => { + beforeAll(() => { + installWebCryptoPolyfill(); + }); + + it('should install crypto global', () => { + expect(global.crypto).toBeDefined(); + expect(global.crypto.subtle).toBeDefined(); + expect(global.crypto.getRandomValues).toBeDefined(); + }); + + it('should have SubtleCrypto methods', () => { + expect(typeof global.crypto.subtle.digest).toBe('function'); + expect(typeof global.crypto.subtle.generateKey).toBe('function'); + expect(typeof global.crypto.subtle.exportKey).toBe('function'); + expect(typeof global.crypto.subtle.importKey).toBe('function'); + expect(typeof global.crypto.subtle.sign).toBe('function'); + expect(typeof global.crypto.subtle.verify).toBe('function'); + }); + + it('should generate random values', () => { + const array = new Uint8Array(32); + const result = global.crypto.getRandomValues(array); + + expect(result).toBe(array); + expect(result.length).toBe(32); + + // Check that values are not all zeros + const hasNonZero = Array.from(result).some(v => v !== 0); + expect(hasNonZero).toBe(true); + }); +}); diff --git a/packages/react-native-webcrypto-bridge/tsconfig.json b/packages/react-native-webcrypto-bridge/tsconfig.json new file mode 100644 index 0000000..0219e68 --- /dev/null +++ b/packages/react-native-webcrypto-bridge/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "@repo/typescript-config/base.json", + "compilerOptions": { + "rootDir": "./src", + "baseUrl": "./", + "outDir": "./dist/types", + "jsx": "react-native" + }, + "lib": [ + "dom" + ], + "files": [ + "package.json" + ], + "include": [ + "./src/**/*.ts", + "./src/**/*.tsx" + ], + "exclude": [ + "node_modules", + "dist", + "**/__tests__/**" + ] +} \ No newline at end of file From 43e82671ffb79373cfaa0a5fab96974ef1f4800d Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Fri, 20 Mar 2026 11:52:21 -0400 Subject: [PATCH 03/22] progress --- .../react-native-webcrypto-bridge/LICENSE | 189 ++++++++++++++++++ .../ios/WebCryptoBridge.swift | 4 + .../src/bridge.ts | 17 +- .../src/polyfill.ts | 86 ++++++-- .../test/spec/polyfill.spec.ts | 2 +- 5 files changed, 276 insertions(+), 22 deletions(-) create mode 100644 packages/react-native-webcrypto-bridge/LICENSE diff --git a/packages/react-native-webcrypto-bridge/LICENSE b/packages/react-native-webcrypto-bridge/LICENSE new file mode 100644 index 0000000..eeca71e --- /dev/null +++ b/packages/react-native-webcrypto-bridge/LICENSE @@ -0,0 +1,189 @@ +Okta Auth SDK License + +The Okta software accompanied by this notice is provided pursuant to the +following terms: + +Copyright © 2015-present, Okta, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0. Unless required by +applicable law or agreed to in writing, software distributed under the License +is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. + +The Okta software accompanied by this notice has build dependencies on certain +third party software licensed under separate terms ("Third Party Components") +located in THIRD_PARTY_NOTICES. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and +configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object +code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice that is +included in or attached to the work (an example is provided in the Appendix +below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor for +inclusion in the Work by the copyright owner or by an individual or Legal +Entity authorized to submit on behalf of the copyright owner. For the purposes +of this definition, "submitted" means any form of electronic, verbal, or +written communication sent to the Licensor or its representatives, including +but not limited to communication on electronic mailing lists, source code +control systems, and issue tracking systems that are managed by, or on behalf +of, the Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise designated in +writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this +License, each Contributor hereby grants to You a perpetual, worldwide, +non-exclusive, no-charge, royalty-free, irrevocable copyright license to +reproduce, prepare Derivative Works of, publicly display, publicly perform, +sublicense, and distribute the Work and such Derivative Works in Source or +Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this +License, each Contributor hereby grants to You a perpetual, worldwide, +non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this +section) patent license to make, have made, use, offer to sell, sell, import, +and otherwise transfer the Work, where such license applies only to those +patent claims licensable by such Contributor that are necessarily infringed by +their Contribution(s) alone or by combination of their Contribution(s) with the +Work to which such Contribution(s) was submitted. If You institute patent +litigation against any entity (including a cross-claim or counterclaim in a +lawsuit) alleging that the Work or a Contribution incorporated within the Work +constitutes direct or contributory patent infringement, then any patent +licenses granted to You under this License for that Work shall terminate as of +the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or +Derivative Works thereof in any medium, with or without modifications, and in +Source or Object form, provided that You meet the following conditions: + +(a) You must give any other recipients of the Work or Derivative Works a copy +of this License; and + +(b) You must cause any modified files to carry prominent notices stating that +You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works that You +distribute, all copyright, patent, trademark, and attribution notices from the +Source form of the Work, excluding those notices that do not pertain to any +part of the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its distribution, then +any Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. + +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a +whole, provided Your use, reproduction, and distribution of the Work otherwise +complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any +Contribution intentionally submitted for inclusion in the Work by You to the +Licensor shall be under the terms and conditions of this License, without any +additional terms or conditions. Notwithstanding the above, nothing herein shall +supersede or modify the terms of any separate license agreement you may have +executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, +trademarks, service marks, or product names of the Licensor, except as required +for reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in +writing, Licensor provides the Work (and each Contributor provides its +Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied, including, without limitation, any warranties +or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any risks +associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in +tort (including negligence), contract, or otherwise, unless required by +applicable law (such as deliberate and grossly negligent acts) or agreed to in +writing, shall any Contributor be liable to You for damages, including any +direct, indirect, special, incidental, or consequential damages of any +character arising as a result of this License or out of the use or inability to +use the Work (including but not limited to damages for loss of goodwill, work +stoppage, computer failure or malfunction, or any and all other commercial +damages or losses), even if such Contributor has been advised of the +possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or +Derivative Works thereof, You may choose to offer, and charge a fee for, +acceptance of support, warranty, indemnity, or other liability obligations +and/or rights consistent with this License. However, in accepting such +obligations, You may act only on Your own behalf and on Your sole +responsibility, not on behalf of any other Contributor, and only if You agree +to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification +within third-party archives. diff --git a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift index eb99a75..a273db0 100644 --- a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift +++ b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift @@ -6,6 +6,10 @@ import React @objc(WebCryptoBridge) class WebCryptoBridge: NSObject { + // Key storage + private static var keyStore: [String: [String: Any]] = [:] + private static let keyStoreLock = NSLock() + @objc static func requiresMainQueueSetup() -> Bool { return false diff --git a/packages/react-native-webcrypto-bridge/src/bridge.ts b/packages/react-native-webcrypto-bridge/src/bridge.ts index 75b8b6a..4844aef 100644 --- a/packages/react-native-webcrypto-bridge/src/bridge.ts +++ b/packages/react-native-webcrypto-bridge/src/bridge.ts @@ -1,16 +1,17 @@ import type { TurboModule } from 'react-native'; import { TurboModuleRegistry } from 'react-native'; + export interface Spec extends TurboModule { /** * Generate SHA-256 digest (async) */ - digest(algorithm: string, data: number[]): Promise; + digest (algorithm: string, data: number[]): Promise; /** * Generate RSA key pair (async) */ - generateKey( + generateKey ( algorithm: string, extractable: boolean, keyUsages: string[] @@ -19,12 +20,12 @@ export interface Spec extends TurboModule { /** * Export a key to JWK format (async) */ - exportKey(format: string, keyId: string, keyType: string): Promise; + exportKey (format: string, keyId: string, keyType: string): Promise; /** * Import a key from JWK format (async) */ - importKey( + importKey ( format: string, keyData: string, algorithm: string, @@ -35,12 +36,12 @@ export interface Spec extends TurboModule { /** * Sign data with a private key (async) */ - sign(algorithm: string, keyId: string, data: number[]): Promise; + sign (algorithm: string, keyId: string, data: number[]): Promise; /** * Verify a signature (async) */ - verify( + verify ( algorithm: string, keyId: string, signature: number[], @@ -50,12 +51,12 @@ export interface Spec extends TurboModule { /** * Generate cryptographically secure random values (sync) */ - getRandomValues(length: number): number[]; + getRandomValues (length: number): number[]; /** * Generate a random UUID v4 (sync) */ - randomUUID(): string; + randomUUID (): string; } export default TurboModuleRegistry.getEnforcing('WebCryptoBridge'); \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/src/polyfill.ts b/packages/react-native-webcrypto-bridge/src/polyfill.ts index 123de17..4b1f9ad 100644 --- a/packages/react-native-webcrypto-bridge/src/polyfill.ts +++ b/packages/react-native-webcrypto-bridge/src/polyfill.ts @@ -12,6 +12,14 @@ import { WebCryptoBridgeError } from './lib.ts'; // doing any string encoding in the native code type ByteArray = number[]; +/** + * @internal + * Maps `CryptoKey` instances to the id assigned by the native code + */ +const cryptoKeyMap = new WeakMap(); + +// MARK: - ArryBuffer Converters + /** * Converts a `BufferSource` instance to an `ArrayBuffer` */ @@ -49,6 +57,20 @@ function byteArrayToArrayBuffer(bytes: ByteArray): ArrayBuffer { return new Uint8Array(bytes).buffer; } +function getCryptoAlg (alg: string) { + switch (alg) { + case 'RS256': + return { + name: 'RSASSA-PKCS1-v1_5', + hash: { name: 'SHA-256' } + }; + default: + throw new WebCryptoBridgeError('Unknown crypto algorithm', { context: { alg } }); + } +} + +// MARK: - SubtleCrypto Methods + const digest: SubtleCrypto['digest'] = async (algorithm, data) => { if (algorithm !== 'SHA-256') { throw new WebCryptoBridgeError(`Unsupported algorithm: ${algorithm}`); @@ -66,19 +88,35 @@ const importKey: SubtleCrypto['importKey'] = async ( algorithm, extractable, keyUsages -) => { + ) => { if (format !== 'jwk') { throw new WebCryptoBridgeError(`Unsupported format: ${format}`); } - // TODO: how to store `keyData`? - - return { + const keyDataJson = JSON.stringify(keyData); + const algorithmJson = JSON.stringify({ + name: algorithm.name, + hash: algorithm.hash, + }); + + const keyId = await NativeWebCryptoBridge.importKey( + format, + keyDataJson, + algorithmJson, + extractable, + keyUsages + ); + + const key: CryptoKey = { algorithm, extractable, // TODO: can extractable even be set to `true` and be used in a bridge? - type: 'secret', // TODO: A string identifying whether the key is a symmetric ('secret') or asymmetric ('private' or 'public') key. + type: 'public', // TODO: A string identifying whether the key is a symmetric ('secret') or asymmetric ('private' or 'public') key. usages: keyUsages - } satisfies CryptoKey + }; + + cryptoKeyMap.set(key, keyId); + + return key; }; // TODO: DPoP @@ -99,9 +137,29 @@ const generateKey: SubtleCrypto['generateKey'] = async ( } const verify: SubtleCrypto['verify'] = async (algorithm, key, signature, data) => { - return false; + const keyId = cryptoKeyMap.get(key); + if (!keyId) { + throw new WebCryptoBridgeError('Unable to locate key'); + } + + if (algorithm !== 'jwk') { + throw new WebCryptoBridgeError('Unsupported algorithm'); + } + + const algorithmJson = JSON.stringify(key.algorithm); + const signatureBytes = arrayBufferToByteArray(toArrayBuffer(signature)); + const dataBytes = arrayBufferToByteArray(toArrayBuffer(data)); + + return await NativeWebCryptoBridge.verify( + algorithmJson, + keyId, + signatureBytes, + dataBytes + ); } +// MARK: - Types & Exports + /** * SubtleCrypto implementation */ @@ -114,16 +172,18 @@ const subtle: Partial = { verify }; +export interface WebCryptoPolyfill { + subtle: Partial; + getRandomValues: Crypto['getRandomValues'] + randomUUID: Crypto['randomUUID'] +} + /** * Crypto implementation */ -const cryptoPolyfill: Crypto = { +const cryptoPolyfill: WebCryptoPolyfill = { subtle, - - // TODO: replace getRandomValues(array: T): T { - // For synchronous random values, we'll use Math.random as a fallback - // In production, you might want to pre-generate random values or use a sync native module const uint8Array = new Uint8Array(array.buffer, array.byteOffset, array.byteLength); const randomBytes = NativeWebCryptoBridge.getRandomValues(uint8Array.length); @@ -134,7 +194,7 @@ const cryptoPolyfill: Crypto = { return array; }, - randomUUID (): string { + randomUUID () { return NativeWebCryptoBridge.randomUUID(); } }; diff --git a/packages/react-native-webcrypto-bridge/test/spec/polyfill.spec.ts b/packages/react-native-webcrypto-bridge/test/spec/polyfill.spec.ts index e80e6af..a4273c8 100644 --- a/packages/react-native-webcrypto-bridge/test/spec/polyfill.spec.ts +++ b/packages/react-native-webcrypto-bridge/test/spec/polyfill.spec.ts @@ -1,4 +1,4 @@ -import { installWebCryptoPolyfill } from 'src/WebCryptoPolyfill'; +import { installWebCryptoPolyfill } from 'src/polyfill'; describe('@okta/react-native-webcrypto-bridge', () => { beforeAll(() => { From 302e2d47e68cc1b3568dec7a6b5133dc7027aebc Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Sat, 21 Mar 2026 09:25:03 -0400 Subject: [PATCH 04/22] progress --- e2e/apps/react-native-oidc/app/_layout.tsx | 40 +- e2e/apps/react-native-oidc/package.json | 1 + .../ios/WebCryptoBridge.h | 4 +- .../ios/WebCryptoBridge.swift | 7 +- .../package.json | 10 +- .../rollup.config.mjs | 1 + .../{bridge.ts => NativeWebCryptoBridge.ts} | 0 .../src/{polyfill.ts => WebCryptoPolyfill.ts} | 10 +- .../src/index.ts | 2 +- yarn.lock | 463 ++++++++++++++++++ 10 files changed, 502 insertions(+), 36 deletions(-) rename packages/react-native-webcrypto-bridge/src/{bridge.ts => NativeWebCryptoBridge.ts} (100%) rename packages/react-native-webcrypto-bridge/src/{polyfill.ts => WebCryptoPolyfill.ts} (97%) diff --git a/e2e/apps/react-native-oidc/app/_layout.tsx b/e2e/apps/react-native-oidc/app/_layout.tsx index 436a5af..e6611d9 100644 --- a/e2e/apps/react-native-oidc/app/_layout.tsx +++ b/e2e/apps/react-native-oidc/app/_layout.tsx @@ -3,31 +3,33 @@ import { useFonts } from 'expo-font'; import { Stack } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import 'react-native-reanimated'; +import { installWebCryptoPolyfill } from '@okta/react-native-webcrypto-bridge'; -import * as Crypto from 'expo-crypto'; +// import * as Crypto from 'expo-crypto'; import { useColorScheme } from '@/hooks/useColorScheme'; // temp polyfill crypto libs -global.crypto = { - // @ts-ignore - getRandomValues (typedArray: Uint8Array) { - return Crypto.getRandomValues(typedArray); - }, - // @ts-ignore - randomUUID () { - return Crypto.randomUUID(); - }, - // @ts-ignore - subtle: { - digest (alg, data) { - // @ts-ignore - return Crypto.digest(alg, data); - } - } -} - +// global.crypto = { +// // @ts-ignore +// getRandomValues (typedArray: Uint8Array) { +// return Crypto.getRandomValues(typedArray); +// }, +// // @ts-ignore +// randomUUID () { +// return Crypto.randomUUID(); +// }, +// // @ts-ignore +// subtle: { +// digest (alg, data) { +// // @ts-ignore +// return Crypto.digest(alg, data); +// } +// } +// } + +installWebCryptoPolyfill(); export default function RootLayout() { diff --git a/e2e/apps/react-native-oidc/package.json b/e2e/apps/react-native-oidc/package.json index 858a7da..c02bd11 100644 --- a/e2e/apps/react-native-oidc/package.json +++ b/e2e/apps/react-native-oidc/package.json @@ -14,6 +14,7 @@ "@expo/vector-icons": "^14.1.0", "@okta/auth-foundation": "*", "@okta/oauth2-flows": "*", + "@okta/react-native-webcrypto-bridge": "*", "@react-navigation/bottom-tabs": "^7.3.10", "@react-navigation/elements": "^2.3.8", "@react-navigation/native": "^7.1.6", diff --git a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h index 4e20f45..3dc3c0d 100644 --- a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h +++ b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h @@ -2,9 +2,9 @@ #ifdef RCT_NEW_ARCH_ENABLED #import -#import "RNWebCryptoBridgeSpec.h" +#import "RNWebCryptoBridge.h" -@interface WebCryptoBridge : NSObject +@interface WebCryptoBridge : NSObject #else @interface WebCryptoBridge : NSObject #endif diff --git a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift index a273db0..7d69350 100644 --- a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift +++ b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift @@ -360,6 +360,7 @@ class WebCryptoBridge: NSObject { } } -#ifdef RCT_NEW_ARCH_ENABLED -extension WebCryptoBridge: NativeWebCryptoBridgeSpec {} -#endif \ No newline at end of file +// Swift uses #if instead of #ifdef +#if RCT_NEW_ARCH_ENABLED +extension WebCryptoBridge: NativeRNWebCryptoBridgeSpec {} +#endif diff --git a/packages/react-native-webcrypto-bridge/package.json b/packages/react-native-webcrypto-bridge/package.json index f544222..4e65392 100644 --- a/packages/react-native-webcrypto-bridge/package.json +++ b/packages/react-native-webcrypto-bridge/package.json @@ -17,7 +17,6 @@ "files": [ "./LICENSE", "./dist", - "./src", "./ios", "./android", "./cpp", @@ -54,12 +53,11 @@ "@repo/eslint-config": "*", "@repo/rollup-config": "*", "@repo/typescript-config": "*", - "@types/react": "^18.0.0", - "@types/react-native": "^0.73.0", + "@types/react": "^19.2.14", "eslint": "^8.56.0", "jest": "^29.7.0", - "react": "^18.2.0", - "react-native": "^0.73.0", + "react": "^19.2.4", + "react-native": "^0.83.1", "rollup": "^4.52.4", "typescript": "^5.9.2" }, @@ -76,7 +74,7 @@ } }, "codegenConfig": { - "name": "RNWebCryptoBridgeSpec", + "name": "RNWebCryptoBridge", "type": "modules", "jsSrcsDir": "src", "android": { diff --git a/packages/react-native-webcrypto-bridge/rollup.config.mjs b/packages/react-native-webcrypto-bridge/rollup.config.mjs index 5708ed2..4a4d42a 100644 --- a/packages/react-native-webcrypto-bridge/rollup.config.mjs +++ b/packages/react-native-webcrypto-bridge/rollup.config.mjs @@ -12,5 +12,6 @@ export default { ...Object.keys(pkg.peerDependencies || {}), 'react-native', 'react', + '@okta/auth-foundation/core' ], }; diff --git a/packages/react-native-webcrypto-bridge/src/bridge.ts b/packages/react-native-webcrypto-bridge/src/NativeWebCryptoBridge.ts similarity index 100% rename from packages/react-native-webcrypto-bridge/src/bridge.ts rename to packages/react-native-webcrypto-bridge/src/NativeWebCryptoBridge.ts diff --git a/packages/react-native-webcrypto-bridge/src/polyfill.ts b/packages/react-native-webcrypto-bridge/src/WebCryptoPolyfill.ts similarity index 97% rename from packages/react-native-webcrypto-bridge/src/polyfill.ts rename to packages/react-native-webcrypto-bridge/src/WebCryptoPolyfill.ts index 4b1f9ad..3ab1da9 100644 --- a/packages/react-native-webcrypto-bridge/src/polyfill.ts +++ b/packages/react-native-webcrypto-bridge/src/WebCryptoPolyfill.ts @@ -4,7 +4,7 @@ * Uses crypto utilities from @okta/auth-foundation for encoding/decoding */ -import NativeWebCryptoBridge from './bridge.ts'; +import NativeWebCryptoBridge from './NativeWebCryptoBridge.ts'; import { WebCryptoBridgeError } from './lib.ts'; // NOTE: Does not use `buf` or `b64` from `auth-foundation` because converting @@ -185,17 +185,17 @@ const cryptoPolyfill: WebCryptoPolyfill = { subtle, getRandomValues(array: T): T { const uint8Array = new Uint8Array(array.buffer, array.byteOffset, array.byteLength); - + const randomBytes = NativeWebCryptoBridge.getRandomValues(uint8Array.length); - + for (let i = 0; i < randomBytes.length; i++) { uint8Array[i] = randomBytes[i]; } - + return array; }, randomUUID () { - return NativeWebCryptoBridge.randomUUID(); + return NativeWebCryptoBridge.randomUUID() as ReturnType; } }; diff --git a/packages/react-native-webcrypto-bridge/src/index.ts b/packages/react-native-webcrypto-bridge/src/index.ts index 2e9bbca..04e91c2 100644 --- a/packages/react-native-webcrypto-bridge/src/index.ts +++ b/packages/react-native-webcrypto-bridge/src/index.ts @@ -3,5 +3,5 @@ */ -export { installWebCryptoPolyfill } from './polyfill.ts'; +export { installWebCryptoPolyfill } from './WebCryptoPolyfill.ts'; export * from './lib.ts'; diff --git a/yarn.lock b/yarn.lock index 8265de8..0d7e734 100644 --- a/yarn.lock +++ b/yarn.lock @@ -218,6 +218,15 @@ js-tokens "^4.0.0" picocolors "^1.1.1" +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" @@ -343,6 +352,17 @@ "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" +"@babel/generator@^7.29.0", "@babel/generator@^7.29.1": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.24.6": version "7.24.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz#517af93abc77924f9b2514c407bbef527fb8938d" @@ -679,6 +699,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" @@ -788,6 +813,13 @@ dependencies: "@babel/types" "^7.28.4" +"@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" + integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== + dependencies: + "@babel/types" "^7.29.0" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" @@ -1718,6 +1750,15 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" +"@babel/template@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== + dependencies: + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" + "@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": version "7.27.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.4.tgz#b0045ac7023c8472c3d35effd7cc9ebd638da6ea" @@ -1789,6 +1830,19 @@ "@babel/types" "^7.28.4" debug "^4.3.1" +"@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + debug "^4.3.1" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" @@ -1831,6 +1885,14 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -3090,6 +3152,11 @@ resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.79.2.tgz#731963e664c8543f5b277e56c058bde612b69f50" integrity sha512-5h2Z7/+/HL/0h88s0JHOdRCW4CXMCJoROxqzHqxdrjGL6EBD1DdaB4ZqkCOEVSW4Vjhir5Qb97C8i/MPWEYPtg== +"@react-native/assets-registry@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.83.4.tgz#48408565f1a6a40cc91e4bbff38e07665d31fbd6" + integrity sha512-aqKtpbJDSQeSX/Dwv0yMe1/Rd2QfXi12lnyZDXNn/OEKz59u6+LuPBVgO/9CRyclHmdlvwg8c7PJ9eX2ZMnjWg== + "@react-native/babel-plugin-codegen@0.79.3": version "0.79.3" resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.3.tgz#acad4acaead398a8c8bcdecbe44040aa0c2dc2d7" @@ -3171,6 +3238,19 @@ nullthrows "^1.1.1" yargs "^17.6.2" +"@react-native/codegen@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.83.4.tgz#79cb20c904f885d44100549816364cceb72c263c" + integrity sha512-CJ7XutzIqJPz3Lp/5TOiRWlU/JAjTboMT1BHNLSXjYHXwTmgHM3iGEbpCOtBMjWvsojRTJyRO/G3ghInIIXEYg== + dependencies: + "@babel/core" "^7.25.2" + "@babel/parser" "^7.25.3" + glob "^7.1.1" + hermes-parser "0.32.0" + invariant "^2.2.4" + nullthrows "^1.1.1" + yargs "^17.6.2" + "@react-native/community-cli-plugin@0.79.2": version "0.79.2" resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.2.tgz#d3a0efbdfb554cf3a7e9bfb27865a7caeeeaa1b3" @@ -3185,6 +3265,19 @@ metro-core "^0.82.0" semver "^7.1.3" +"@react-native/community-cli-plugin@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.4.tgz#133a202d3087c3ef433e54192480dc799635f843" + integrity sha512-8os0weQEnjUhWy7Db881+JKRwNHVGM40VtTRvltAyA/YYkrGg4kPCqiTybMxQDEcF3rnviuxHyI+ITiglfmgmQ== + dependencies: + "@react-native/dev-middleware" "0.83.4" + debug "^4.4.0" + invariant "^2.2.4" + metro "^0.83.3" + metro-config "^0.83.3" + metro-core "^0.83.3" + semver "^7.1.3" + "@react-native/debugger-frontend@0.79.2": version "0.79.2" resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.79.2.tgz#1377de6d9cabe5455bf332e06408167da5f60c19" @@ -3195,6 +3288,19 @@ resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.79.3.tgz#9cb57d8e88c22552194ab5f6f257605b151bc5b3" integrity sha512-ImNDuEeKH6lEsLXms3ZsgIrNF94jymfuhPcVY5L0trzaYNo9ZFE9Ni2/18E1IbfXxdeIHrCSBJlWD6CTm7wu5A== +"@react-native/debugger-frontend@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.83.4.tgz#78f531b9f591e1e034f6a0eb0c745a4fc992af6c" + integrity sha512-mCE2s/S7SEjax3gZb6LFAraAI3x13gRVWJWqT0HIm71e4ITObENNTDuMw4mvZ/wr4Gz2wv4FcBH5/Nla9LXOcg== + +"@react-native/debugger-shell@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/debugger-shell/-/debugger-shell-0.83.4.tgz#376239508acb46062196740747a0bdec73273202" + integrity sha512-FtAnrvXqy1xeZ+onwilvxEeeBsvBlhtfrHVIC2R/BOJAK9TbKEtFfjio0wsn3DQIm+UZq48DSa+p9jJZ2aJUww== + dependencies: + cross-spawn "^7.0.6" + fb-dotslash "0.5.8" + "@react-native/dev-middleware@0.79.2": version "0.79.2" resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.79.2.tgz#f09f1a75b4cd0b56dfd82a07bf41157a9c45619c" @@ -3229,21 +3335,54 @@ serve-static "^1.16.2" ws "^6.2.3" +"@react-native/dev-middleware@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.83.4.tgz#59f9488c19769f6a7da966fc55739832c6d2ef97" + integrity sha512-3s9nXZc/kj986nI2RPqxiIJeTS3o7pvZDxbHu7GE9WVIGX9YucA1l/tEiXd7BAm3TBFOfefDOT08xD46wH+R3Q== + dependencies: + "@isaacs/ttlcache" "^1.4.1" + "@react-native/debugger-frontend" "0.83.4" + "@react-native/debugger-shell" "0.83.4" + chrome-launcher "^0.15.2" + chromium-edge-launcher "^0.2.0" + connect "^3.6.5" + debug "^4.4.0" + invariant "^2.2.4" + nullthrows "^1.1.1" + open "^7.0.3" + serve-static "^1.16.2" + ws "^7.5.10" + "@react-native/gradle-plugin@0.79.2": version "0.79.2" resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.79.2.tgz#d41d4e2c63baf688a2b47652c6260f2a2f1ec091" integrity sha512-6MJFemrwR0bOT0QM+2BxX9k3/pvZQNmJ3Js5pF/6owsA0cUDiCO57otiEU8Fz+UywWEzn1FoQfOfQ8vt2GYmoA== +"@react-native/gradle-plugin@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.83.4.tgz#13fe82da3a43c1ad0205e38236d351ec61ec7175" + integrity sha512-AhaSWw2k3eMKqZ21IUdM7rpyTYOpAfsBbIIiom1QQii3QccX0uW2AWTcRhfuWRxqr2faGFaOBYedWl2fzp5hgw== + "@react-native/js-polyfills@0.79.2": version "0.79.2" resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.79.2.tgz#15eb4da0fe9e8d61d2980d08fd06b5f49e133b0f" integrity sha512-IaY87Ckd4GTPMkO1/Fe8fC1IgIx3vc3q9Tyt/6qS3Mtk9nC0x9q4kSR5t+HHq0/MuvGtu8HpdxXGy5wLaM+zUw== +"@react-native/js-polyfills@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.83.4.tgz#63244c915773d39bfc56527c1a062054db0c01dd" + integrity sha512-wYUdv0rt4MjhKhQloO1AnGDXhZQOFZHDxm86dEtEA0WcsCdVrFdRULFM+rKUC/QQtJW2rS6WBqtBusgtrsDADg== + "@react-native/normalize-colors@0.79.2": version "0.79.2" resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.79.2.tgz#9ab70ca257c7411e4ab74cf7f91332c27d39cc6f" integrity sha512-+b+GNrupWrWw1okHnEENz63j7NSMqhKeFMOyzYLBwKcprG8fqJQhDIGXfizKdxeIa5NnGSAevKL1Ev1zJ56X8w== +"@react-native/normalize-colors@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.83.4.tgz#211fd38a7f067ede9eeace504f0e45c090a383d4" + integrity sha512-9ezxaHjxqTkTOLg62SGg7YhFaE+fxa/jlrWP0nwf7eGFHlGOiTAaRR2KUfiN3K05e+EMbEhgcH/c7bgaXeGyJw== + "@react-native/normalize-colors@^0.74.1": version "0.74.89" resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz#b8ac17d1bbccd3ef9a1f921665d04d42cff85976" @@ -3257,6 +3396,14 @@ invariant "^2.2.4" nullthrows "^1.1.1" +"@react-native/virtualized-lists@0.83.4": + version "0.83.4" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.83.4.tgz#11353cf121007782d05be9fd726aaf182fe2b495" + integrity sha512-vNF/8kokMW8JEjG4n+j7veLTjHRRABlt4CaTS6+wtqzvWxCJHNIC8fhCqrDPn9fIn8sNePd8DyiFVX5L9TBBRA== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" + "@react-navigation/bottom-tabs@^7.3.10": version "7.3.14" resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.3.14.tgz#9ee02baea86ab24abe267726665bc69c6df0bf4c" @@ -4037,6 +4184,13 @@ "@types/prop-types" "*" csstype "^3.0.2" +"@types/react@^19.2.14": + version "19.2.14" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.14.tgz#39604929b5e3957e3a6fa0001dafb17c7af70bad" + integrity sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w== + dependencies: + csstype "^3.2.2" + "@types/react@~19.0.10": version "19.0.14" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.14.tgz#f2f62035290afd755095cb6644e10b599db72f4e" @@ -5280,6 +5434,13 @@ babel-plugin-syntax-hermes-parser@0.25.1, babel-plugin-syntax-hermes-parser@^0.2 dependencies: hermes-parser "0.25.1" +babel-plugin-syntax-hermes-parser@0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz#06f7452bf91adf6cafd7c98e7467404d4eb65cec" + integrity sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg== + dependencies: + hermes-parser "0.32.0" + babel-plugin-transform-flow-enums@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz#d1d0cc9bdc799c850ca110d0ddc9f21b9ec3ef25" @@ -6213,6 +6374,11 @@ csstype@^3.0.2, csstype@^3.1.3: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +csstype@^3.2.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== + data-uri-to-buffer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" @@ -7801,6 +7967,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fb-dotslash@0.5.8: + version "0.5.8" + resolved "https://registry.yarnpkg.com/fb-dotslash/-/fb-dotslash-0.5.8.tgz#c5ef3dacd75e1ddb2197c367052464ddde0115f5" + integrity sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA== + fb-watchman@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" @@ -8529,6 +8700,11 @@ hast-util-whitespace@^3.0.0: dependencies: "@types/hast" "^3.0.0" +hermes-compiler@0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/hermes-compiler/-/hermes-compiler-0.14.1.tgz#5381d2bb88454027d16736b8cb7fddaaf1556538" + integrity sha512-+RPPQlayoZ9n6/KXKt5SFILWXCGJ/LV5d24L5smXrvTDrPS4L6dSctPczXauuvzFP3QEJbD1YO7Z3Ra4a+4IhA== + hermes-estree@0.25.1: version "0.25.1" resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" @@ -8539,6 +8715,16 @@ hermes-estree@0.28.1: resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.28.1.tgz#631e6db146b06e62fc1c630939acf4a3c77d1b24" integrity sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ== +hermes-estree@0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.32.0.tgz#bb7da6613ab8e67e334a1854ea1e209f487d307b" + integrity sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ== + +hermes-estree@0.33.3: + version "0.33.3" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.33.3.tgz#6d6b593d4b471119772c82bdb0212dfadabb6f17" + integrity sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg== + hermes-parser@0.25.1: version "0.25.1" resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1" @@ -8553,6 +8739,20 @@ hermes-parser@0.28.1: dependencies: hermes-estree "0.28.1" +hermes-parser@0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.32.0.tgz#7916984ef6fdce62e7415d354cf35392061cd303" + integrity sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw== + dependencies: + hermes-estree "0.32.0" + +hermes-parser@0.33.3: + version "0.33.3" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.33.3.tgz#da50ababb7a5ab636d339e7b2f6e3848e217e09d" + integrity sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA== + dependencies: + hermes-estree "0.33.3" + hoist-non-react-statics@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -10377,6 +10577,16 @@ metro-babel-transformer@0.82.4: hermes-parser "0.28.1" nullthrows "^1.1.1" +metro-babel-transformer@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.83.5.tgz#91f3fa269171ad5189ebba625f1f0aa124ce06ea" + integrity sha512-d9FfmgUEVejTiSb7bkQeLRGl6aeno2UpuPm3bo3rCYwxewj03ymvOn8s8vnS4fBqAPQ+cE9iQM40wh7nGXR+eA== + dependencies: + "@babel/core" "^7.25.2" + flow-enums-runtime "^0.0.6" + hermes-parser "0.33.3" + nullthrows "^1.1.1" + metro-cache-key@0.82.4: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.82.4.tgz#21f850008fa2570a51e3958574ea5a791574752e" @@ -10384,6 +10594,13 @@ metro-cache-key@0.82.4: dependencies: flow-enums-runtime "^0.0.6" +metro-cache-key@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.83.5.tgz#96896a1768f0494a375e1d5957b7ad487e508a4c" + integrity sha512-Ycl8PBajB7bhbAI7Rt0xEyiF8oJ0RWX8EKkolV1KfCUlC++V/GStMSGpPLwnnBZXZWkCC5edBPzv1Hz1Yi0Euw== + dependencies: + flow-enums-runtime "^0.0.6" + metro-cache@0.82.4: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.82.4.tgz#f44557f8b33f5d7b7ba4ccba2880c111e9884329" @@ -10394,6 +10611,16 @@ metro-cache@0.82.4: https-proxy-agent "^7.0.5" metro-core "0.82.4" +metro-cache@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.83.5.tgz#5675f4ad56905aa78fff3dec1b6bf213e0b6c86d" + integrity sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng== + dependencies: + exponential-backoff "^3.1.1" + flow-enums-runtime "^0.0.6" + https-proxy-agent "^7.0.5" + metro-core "0.83.5" + metro-config@0.82.4, metro-config@^0.82.0: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.82.4.tgz#d42fa8b6a4d53493c34d217bbc6c13ee4817355c" @@ -10408,6 +10635,20 @@ metro-config@0.82.4, metro-config@^0.82.0: metro-core "0.82.4" metro-runtime "0.82.4" +metro-config@0.83.5, metro-config@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.83.5.tgz#a3dd20fc5d5582aa4ad3704678e52abcf4d46b2b" + integrity sha512-JQ/PAASXH7yczgV6OCUSRhZYME+NU8NYjI2RcaG5ga4QfQ3T/XdiLzpSb3awWZYlDCcQb36l4Vl7i0Zw7/Tf9w== + dependencies: + connect "^3.6.5" + flow-enums-runtime "^0.0.6" + jest-validate "^29.7.0" + metro "0.83.5" + metro-cache "0.83.5" + metro-core "0.83.5" + metro-runtime "0.83.5" + yaml "^2.6.1" + metro-core@0.82.4, metro-core@^0.82.0: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.82.4.tgz#f7f498929ac066dafe704c3598a990eeb2acdc8c" @@ -10417,6 +10658,15 @@ metro-core@0.82.4, metro-core@^0.82.0: lodash.throttle "^4.1.1" metro-resolver "0.82.4" +metro-core@0.83.5, metro-core@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.83.5.tgz#1592033633034feb5d368d22bf18e38052146970" + integrity sha512-YcVcLCrf0ed4mdLa82Qob0VxYqfhmlRxUS8+TO4gosZo/gLwSvtdeOjc/Vt0pe/lvMNrBap9LlmvZM8FIsMgJQ== + dependencies: + flow-enums-runtime "^0.0.6" + lodash.throttle "^4.1.1" + metro-resolver "0.83.5" + metro-file-map@0.82.4: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.82.4.tgz#186d737088433dd290c5974d9d96d7e62d36e4f9" @@ -10432,6 +10682,21 @@ metro-file-map@0.82.4: nullthrows "^1.1.1" walker "^1.0.7" +metro-file-map@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.83.5.tgz#394aa61d54b3822f10e68c18cbd1318f18865d20" + integrity sha512-ZEt8s3a1cnYbn40nyCD+CsZdYSlwtFh2kFym4lo+uvfM+UMMH+r/BsrC6rbNClSrt+B7rU9T+Te/sh/NL8ZZKQ== + dependencies: + debug "^4.4.0" + fb-watchman "^2.0.0" + flow-enums-runtime "^0.0.6" + graceful-fs "^4.2.4" + invariant "^2.2.4" + jest-worker "^29.7.0" + micromatch "^4.0.4" + nullthrows "^1.1.1" + walker "^1.0.7" + metro-minify-terser@0.82.4: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.82.4.tgz#3750c14e7a25eba591f6c75eed995f6751030618" @@ -10440,6 +10705,14 @@ metro-minify-terser@0.82.4: flow-enums-runtime "^0.0.6" terser "^5.15.0" +metro-minify-terser@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.83.5.tgz#ee43a11a9d3442760781434c599d45eb1274e6fd" + integrity sha512-Toe4Md1wS1PBqbvB0cFxBzKEVyyuYTUb0sgifAZh/mSvLH84qA1NAWik9sISWatzvfWf3rOGoUoO5E3f193a3Q== + dependencies: + flow-enums-runtime "^0.0.6" + terser "^5.15.0" + metro-resolver@0.82.4: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.82.4.tgz#936a2300fa577183a1e0e6f7cc405e52f9276f0e" @@ -10447,6 +10720,13 @@ metro-resolver@0.82.4: dependencies: flow-enums-runtime "^0.0.6" +metro-resolver@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.5.tgz#72340ca8071941eafe92ff2dcb8e33c581870ef7" + integrity sha512-7p3GtzVUpbAweJeCcUJihJeOQl1bDuimO5ueo1K0BUpUtR41q5EilbQ3klt16UTPPMpA+tISWBtsrqU556mY1A== + dependencies: + flow-enums-runtime "^0.0.6" + metro-runtime@0.82.4, metro-runtime@^0.82.0: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.82.4.tgz#70e0b871683fdb594f2a7c03403b6350deca086b" @@ -10455,6 +10735,14 @@ metro-runtime@0.82.4, metro-runtime@^0.82.0: "@babel/runtime" "^7.25.0" flow-enums-runtime "^0.0.6" +metro-runtime@0.83.5, metro-runtime@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.83.5.tgz#52c1edafc6cc82e57729cc9c21700ab1e53a1777" + integrity sha512-f+b3ue9AWTVlZe2Xrki6TAoFtKIqw30jwfk7GQ1rDUBQaE0ZQ+NkiMEtb9uwH7uAjJ87U7Tdx1Jg1OJqUfEVlA== + dependencies: + "@babel/runtime" "^7.25.0" + flow-enums-runtime "^0.0.6" + metro-source-map@0.82.4, metro-source-map@^0.82.0: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.82.4.tgz#ddd9bdf3a5864ee8f0b296ed11e46bdc2de321ac" @@ -10471,6 +10759,21 @@ metro-source-map@0.82.4, metro-source-map@^0.82.0: source-map "^0.5.6" vlq "^1.0.0" +metro-source-map@0.83.5, metro-source-map@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.83.5.tgz#384f311f83fa2bf51cbec08d77210aa951bf9ee3" + integrity sha512-VT9bb2KO2/4tWY9Z2yeZqTUao7CicKAOps9LUg2aQzsz+04QyuXL3qgf1cLUVRjA/D6G5u1RJAlN1w9VNHtODQ== + dependencies: + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" + flow-enums-runtime "^0.0.6" + invariant "^2.2.4" + metro-symbolicate "0.83.5" + nullthrows "^1.1.1" + ob1 "0.83.5" + source-map "^0.5.6" + vlq "^1.0.0" + metro-symbolicate@0.82.4: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.82.4.tgz#76603b0ec2ad8fe5f174aa76485cc46228547a91" @@ -10483,6 +10786,18 @@ metro-symbolicate@0.82.4: source-map "^0.5.6" vlq "^1.0.0" +metro-symbolicate@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.83.5.tgz#62167db423be6c68b4b9f39935c9cb7330cc9526" + integrity sha512-EMIkrjNRz/hF+p0RDdxoE60+dkaTLPN3vaaGkFmX5lvFdO6HPfHA/Ywznzkev+za0VhPQ5KSdz49/MALBRteHA== + dependencies: + flow-enums-runtime "^0.0.6" + invariant "^2.2.4" + metro-source-map "0.83.5" + nullthrows "^1.1.1" + source-map "^0.5.6" + vlq "^1.0.0" + metro-transform-plugins@0.82.4: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.82.4.tgz#9d3bb855126e0a63ac2ccf012ed2bc7829209e8c" @@ -10495,6 +10810,18 @@ metro-transform-plugins@0.82.4: flow-enums-runtime "^0.0.6" nullthrows "^1.1.1" +metro-transform-plugins@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.83.5.tgz#ba21c6a5fa9bf6c5c2c222e2c8e7a668ffb3d341" + integrity sha512-KxYKzZL+lt3Os5H2nx7YkbkWVduLZL5kPrE/Yq+Prm/DE1VLhpfnO6HtPs8vimYFKOa58ncl60GpoX0h7Wm0Vw== + dependencies: + "@babel/core" "^7.25.2" + "@babel/generator" "^7.29.1" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + flow-enums-runtime "^0.0.6" + nullthrows "^1.1.1" + metro-transform-worker@0.82.4: version "0.82.4" resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.82.4.tgz#cf7db4ef89301ab6658f7a0988fd030e28f86b28" @@ -10514,6 +10841,25 @@ metro-transform-worker@0.82.4: metro-transform-plugins "0.82.4" nullthrows "^1.1.1" +metro-transform-worker@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.83.5.tgz#8616b54282e727027fdb5c475aade719394a8e8a" + integrity sha512-8N4pjkNXc6ytlP9oAM6MwqkvUepNSW39LKYl9NjUMpRDazBQ7oBpQDc8Sz4aI8jnH6AGhF7s1m/ayxkN1t04yA== + dependencies: + "@babel/core" "^7.25.2" + "@babel/generator" "^7.29.1" + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + flow-enums-runtime "^0.0.6" + metro "0.83.5" + metro-babel-transformer "0.83.5" + metro-cache "0.83.5" + metro-cache-key "0.83.5" + metro-minify-terser "0.83.5" + metro-source-map "0.83.5" + metro-transform-plugins "0.83.5" + nullthrows "^1.1.1" + metro@0.82.4, metro@^0.82.0: version "0.82.4" resolved "https://registry.yarnpkg.com/metro/-/metro-0.82.4.tgz#e4fb4552f1387610b0b2873ed07d4cd59754d636" @@ -10560,6 +10906,52 @@ metro@0.82.4, metro@^0.82.0: ws "^7.5.10" yargs "^17.6.2" +metro@0.83.5, metro@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.83.5.tgz#f5441075d5211c980ac8c79109e9e6fa2df68924" + integrity sha512-BgsXevY1MBac/3ZYv/RfNFf/4iuW9X7f4H8ZNkiH+r667HD9sVujxcmu4jvEzGCAm4/WyKdZCuyhAcyhTHOucQ== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/core" "^7.25.2" + "@babel/generator" "^7.29.1" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" + accepts "^2.0.0" + chalk "^4.0.0" + ci-info "^2.0.0" + connect "^3.6.5" + debug "^4.4.0" + error-stack-parser "^2.0.6" + flow-enums-runtime "^0.0.6" + graceful-fs "^4.2.4" + hermes-parser "0.33.3" + 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.83.5" + metro-cache "0.83.5" + metro-cache-key "0.83.5" + metro-config "0.83.5" + metro-core "0.83.5" + metro-file-map "0.83.5" + metro-resolver "0.83.5" + metro-runtime "0.83.5" + metro-source-map "0.83.5" + metro-symbolicate "0.83.5" + metro-transform-plugins "0.83.5" + metro-transform-worker "0.83.5" + mime-types "^3.0.1" + nullthrows "^1.1.1" + serialize-error "^2.1.0" + source-map "^0.5.6" + throat "^5.0.0" + ws "^7.5.10" + yargs "^17.6.2" + micromark-util-character@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.0.tgz#31320ace16b4644316f6bf057531689c71e2aee1" @@ -10950,6 +11342,13 @@ ob1@0.82.4: dependencies: flow-enums-runtime "^0.0.6" +ob1@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.83.5.tgz#f9c289d759142b76577948eea7fd1f07d36f825f" + integrity sha512-vNKPYC8L5ycVANANpF/S+WZHpfnRWKx/F3AYP4QMn6ZJTh+l2HOrId0clNkEmua58NB9vmI9Qh7YOoV/4folYg== + dependencies: + flow-enums-runtime "^0.0.6" + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -11786,6 +12185,14 @@ react-devtools-core@^6.1.1: shell-quote "^1.6.1" ws "^7" +react-devtools-core@^6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-6.1.5.tgz#c5eca79209dab853a03b2158c034c5166975feee" + integrity sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA== + dependencies: + shell-quote "^1.6.1" + ws "^7" + react-dom@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -11940,6 +12347,47 @@ react-native@0.79.2: ws "^6.2.3" yargs "^17.6.2" +react-native@^0.83.1: + version "0.83.4" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.83.4.tgz#5c3103a8523eee46559b6e6228ff9ac9d907ee1f" + integrity sha512-H5Wco3UJyY6zZsjoBayY8RM9uiAEQ3FeG4G2NAt+lr9DO43QeqPlVe9xxxYEukMkEmeIhNjR70F6bhXuWArOMQ== + dependencies: + "@jest/create-cache-key-function" "^29.7.0" + "@react-native/assets-registry" "0.83.4" + "@react-native/codegen" "0.83.4" + "@react-native/community-cli-plugin" "0.83.4" + "@react-native/gradle-plugin" "0.83.4" + "@react-native/js-polyfills" "0.83.4" + "@react-native/normalize-colors" "0.83.4" + "@react-native/virtualized-lists" "0.83.4" + abort-controller "^3.0.0" + anser "^1.4.9" + ansi-regex "^5.0.0" + babel-jest "^29.7.0" + babel-plugin-syntax-hermes-parser "0.32.0" + base64-js "^1.5.1" + commander "^12.0.0" + flow-enums-runtime "^0.0.6" + glob "^7.1.1" + hermes-compiler "0.14.1" + invariant "^2.2.4" + jest-environment-node "^29.7.0" + memoize-one "^5.0.0" + metro-runtime "^0.83.3" + metro-source-map "^0.83.3" + nullthrows "^1.1.1" + pretty-format "^29.7.0" + promise "^8.3.0" + react-devtools-core "^6.1.5" + react-refresh "^0.14.0" + regenerator-runtime "^0.13.2" + scheduler "0.27.0" + semver "^7.1.3" + stacktrace-parser "^0.1.10" + whatwg-fetch "^3.0.0" + ws "^7.5.10" + yargs "^17.6.2" + react-refresh@^0.14.0, react-refresh@^0.14.2: version "0.14.2" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" @@ -11972,6 +12420,11 @@ react@19.0.1: resolved "https://registry.yarnpkg.com/react/-/react-19.0.1.tgz#0fb9523201af5f8c7aee753a825d1d9d2f9769db" integrity sha512-nVRaZCuEyvu69sWrkdwjP6QY57C+lY+uMNNMyWUFJb9Z/JlaBOQus7mSMfGYsblv7R691u6SSJA/dX9IRnyyLQ== +react@^19.2.4: + version "19.2.4" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.4.tgz#438e57baa19b77cb23aab516cf635cd0579ee09a" + integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== + read-pkg-up@10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-10.0.0.tgz#0542d21ff1001d2bfff1f6eac8b4d1d1dc486617" @@ -12532,6 +12985,11 @@ scheduler@0.25.0, scheduler@^0.25.0: resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015" integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== +scheduler@0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" + integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== + scheduler@^0.23.0: version "0.23.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" @@ -14661,6 +15119,11 @@ yallist@^5.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== +yaml@^2.6.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" + integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== + yaml@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" From 51df65b291b640648098fab80c15e511a72e2eb1 Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Sun, 22 Mar 2026 09:32:23 -0400 Subject: [PATCH 05/22] progress --- e2e/apps/react-native-oidc/app.config.ts | 15 +++++++++++- e2e/apps/react-native-oidc/metro.config.js | 3 +++ e2e/apps/react-native-oidc/package.json | 1 + .../react-native-oidc/react-native.config.js | 9 ++++++++ .../react-native-webcrypto-bridge.podspec | 6 +++++ .../src/NativeWebCryptoBridge.ts | 16 ++++++------- yarn.lock | 23 +++++++++++++++++++ 7 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 e2e/apps/react-native-oidc/react-native.config.js diff --git a/e2e/apps/react-native-oidc/app.config.ts b/e2e/apps/react-native-oidc/app.config.ts index 7856dac..d0604d3 100644 --- a/e2e/apps/react-native-oidc/app.config.ts +++ b/e2e/apps/react-native-oidc/app.config.ts @@ -17,5 +17,18 @@ export default ({ config }: ConfigContext) => ({ ...config, extra: { env - } + }, + "plugins": [ + [ + "expo-build-properties", + { + "ios": { + "newArchEnabled": true + }, + "android": { + "newArchEnabled": true + } + } + ] + ] }); \ No newline at end of file diff --git a/e2e/apps/react-native-oidc/metro.config.js b/e2e/apps/react-native-oidc/metro.config.js index 462ef71..b587ad5 100644 --- a/e2e/apps/react-native-oidc/metro.config.js +++ b/e2e/apps/react-native-oidc/metro.config.js @@ -25,4 +25,7 @@ config.resolver.nodeModulesPaths = [ path.resolve(monorepoRoot, 'node_modules'), ]; +// Ensure workspace packages are resolved +config.resolver.disableHierarchicalLookup = false; + module.exports = config; diff --git a/e2e/apps/react-native-oidc/package.json b/e2e/apps/react-native-oidc/package.json index c02bd11..cf5cb8f 100644 --- a/e2e/apps/react-native-oidc/package.json +++ b/e2e/apps/react-native-oidc/package.json @@ -49,6 +49,7 @@ "@types/react": "~19.0.10", "eslint": "^9.25.0", "eslint-config-expo": "~9.2.0", + "expo-build-properties": "^1.0.10", "typescript": "~5.8.3" }, "private": true diff --git a/e2e/apps/react-native-oidc/react-native.config.js b/e2e/apps/react-native-oidc/react-native.config.js new file mode 100644 index 0000000..30ea1c7 --- /dev/null +++ b/e2e/apps/react-native-oidc/react-native.config.js @@ -0,0 +1,9 @@ +const path = require('path'); + +module.exports = { + dependencies: { + '@okta/react-native-webcrypto-bridge': { + root: path.resolve(__dirname, '../../packages/react-native-webcrypto-bridge'), + }, + }, +}; diff --git a/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec b/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec index f22d4a5..7ec36e2 100644 --- a/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec +++ b/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec @@ -13,6 +13,12 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/okta/okta-client-javascript.git", :tag => "#{s.version}" } s.source_files = "ios/**/*.{h,m,mm,swift}" + s.swift_version = "5.0" + + # This tells CocoaPods to look for the Codegen output + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + } install_modules_dependencies(s) end \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/src/NativeWebCryptoBridge.ts b/packages/react-native-webcrypto-bridge/src/NativeWebCryptoBridge.ts index 4844aef..797cde7 100644 --- a/packages/react-native-webcrypto-bridge/src/NativeWebCryptoBridge.ts +++ b/packages/react-native-webcrypto-bridge/src/NativeWebCryptoBridge.ts @@ -6,12 +6,12 @@ export interface Spec extends TurboModule { /** * Generate SHA-256 digest (async) */ - digest (algorithm: string, data: number[]): Promise; + digest(algorithm: string, data: number[]): Promise; /** * Generate RSA key pair (async) */ - generateKey ( + generateKey( algorithm: string, extractable: boolean, keyUsages: string[] @@ -20,12 +20,12 @@ export interface Spec extends TurboModule { /** * Export a key to JWK format (async) */ - exportKey (format: string, keyId: string, keyType: string): Promise; + exportKey(format: string, keyId: string, keyType: string): Promise; /** * Import a key from JWK format (async) */ - importKey ( + importKey( format: string, keyData: string, algorithm: string, @@ -36,12 +36,12 @@ export interface Spec extends TurboModule { /** * Sign data with a private key (async) */ - sign (algorithm: string, keyId: string, data: number[]): Promise; + sign(algorithm: string, keyId: string, data: number[]): Promise; /** * Verify a signature (async) */ - verify ( + verify( algorithm: string, keyId: string, signature: number[], @@ -51,12 +51,12 @@ export interface Spec extends TurboModule { /** * Generate cryptographically secure random values (sync) */ - getRandomValues (length: number): number[]; + getRandomValues(length: number): number[]; /** * Generate a random UUID v4 (sync) */ - randomUUID (): string; + randomUUID(): string; } export default TurboModuleRegistry.getEnforcing('WebCryptoBridge'); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 0d7e734..5ca51a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5012,6 +5012,16 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.4.1" +ajv@^8.11.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc" + integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + algoliasearch@^5.14.2: version "5.35.0" resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.35.0.tgz#ce12d1d287d6f4a80b9998568f806c92dabba566" @@ -7642,6 +7652,14 @@ expo-blur@~14.1.4: resolved "https://registry.yarnpkg.com/expo-blur/-/expo-blur-14.1.4.tgz#d246c0a224ce63321d022edfc0e6a8c5fa2cc865" integrity sha512-55P9tK/RjJZEcu2tU7BqX3wmIOrGMOOkmHztJMMws+ZGHzvtjnPmT7dsQxhOU9vPj77oHnKetYHU2sik3iBcCw== +expo-build-properties@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/expo-build-properties/-/expo-build-properties-1.0.10.tgz#2c3fb4248f78828e952defa636635a653e3ad546" + integrity sha512-mFCZbrbrv0AP5RB151tAoRzwRJelqM7bCJzCkxpu+owOyH+p/rFC/q7H5q8B9EpVWj8etaIuszR+gKwohpmu1Q== + dependencies: + ajv "^8.11.0" + semver "^7.6.0" + expo-constants@~17.1.5, expo-constants@~17.1.6: version "17.1.6" resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-17.1.6.tgz#a31b019216f7f7bb4907aeffa2d6bf856751985e" @@ -7960,6 +7978,11 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-uri@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" From 944accfc9162fb47b36a2338d86a6f21be670c7a Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Sun, 22 Mar 2026 10:18:35 -0400 Subject: [PATCH 06/22] progress --- e2e/apps/react-native-oidc/app.config.ts | 6 +++ e2e/apps/react-native-oidc/babel.config.js | 10 ++++ e2e/apps/react-native-oidc/metro.config.js | 6 +++ e2e/apps/react-native-oidc/package.json | 1 + package.json | 2 - yarn.lock | 59 +++++++++++++++++++--- 6 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 e2e/apps/react-native-oidc/babel.config.js diff --git a/e2e/apps/react-native-oidc/app.config.ts b/e2e/apps/react-native-oidc/app.config.ts index d0604d3..1a9dab2 100644 --- a/e2e/apps/react-native-oidc/app.config.ts +++ b/e2e/apps/react-native-oidc/app.config.ts @@ -18,6 +18,12 @@ export default ({ config }: ConfigContext) => ({ extra: { env }, + "android": { + "package": "com.anonymous.reporeactnativeoidc" + }, + "ios": { + "bundleIdentifier": "com.anonymous.reporeactnativeoidc" + }, "plugins": [ [ "expo-build-properties", diff --git a/e2e/apps/react-native-oidc/babel.config.js b/e2e/apps/react-native-oidc/babel.config.js new file mode 100644 index 0000000..8c0e3d1 --- /dev/null +++ b/e2e/apps/react-native-oidc/babel.config.js @@ -0,0 +1,10 @@ +module.exports = function (api) { + api.cache(true); + + return { + presets: ['babel-preset-expo'], + plugins: [ + '@babel/plugin-transform-class-static-block', + ], + }; +}; diff --git a/e2e/apps/react-native-oidc/metro.config.js b/e2e/apps/react-native-oidc/metro.config.js index b587ad5..bf313e2 100644 --- a/e2e/apps/react-native-oidc/metro.config.js +++ b/e2e/apps/react-native-oidc/metro.config.js @@ -28,4 +28,10 @@ config.resolver.nodeModulesPaths = [ // Ensure workspace packages are resolved config.resolver.disableHierarchicalLookup = false; +// Don't try to transform react-native internals +config.resolver.blockList = [ + // Exclude react-native source files that shouldn't be transformed + /.*\/react-native\/.*\/node_modules\/.*/, +]; + module.exports = config; diff --git a/e2e/apps/react-native-oidc/package.json b/e2e/apps/react-native-oidc/package.json index cf5cb8f..87de56b 100644 --- a/e2e/apps/react-native-oidc/package.json +++ b/e2e/apps/react-native-oidc/package.json @@ -45,6 +45,7 @@ }, "devDependencies": { "@babel/core": "^7.25.2", + "@babel/plugin-transform-class-static-block": "^7.28.6", "@repo/env": "*", "@types/react": "~19.0.10", "eslint": "^9.25.0", diff --git a/package.json b/package.json index 13a80e3..f5ba926 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,6 @@ "**/expo-*/**", "**/@expo/**", "**/@expo/**/**", - "**/react-native", - "**/react-native/**", "**/@react-navigation/**", "react-native-oidc/@okta/*", "react-native-oidc/@okta/**" diff --git a/yarn.lock b/yarn.lock index 5ca51a7..9f011fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -436,6 +436,19 @@ "@babel/traverse" "^7.28.3" semver "^6.3.1" +"@babel/helper-create-class-features-plugin@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz#611ff5482da9ef0db6291bcd24303400bca170fb" + integrity sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-member-expression-to-functions" "^7.28.5" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/helper-replace-supers" "^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/traverse" "^7.28.6" + semver "^6.3.1" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz#05b0882d97ba1d4d03519e4bce615d70afa18c53" @@ -531,6 +544,14 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" +"@babel/helper-member-expression-to-functions@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" + integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== + dependencies: + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" + "@babel/helper-module-imports@^7.24.3": version "7.24.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" @@ -606,6 +627,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz#fa02a32410a15a6e8f8185bcbf608f10528d2a24" integrity sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg== +"@babel/helper-plugin-utils@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" + integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== + "@babel/helper-remap-async-to-generator@^7.24.6": version "7.24.6" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz#c96ceb9846e877d806ce82a1521230ea7e0fc354" @@ -633,6 +659,15 @@ "@babel/helper-optimise-call-expression" "^7.27.1" "@babel/traverse" "^7.27.1" +"@babel/helper-replace-supers@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz#94aa9a1d7423a00aead3f204f78834ce7d53fe44" + integrity sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.28.5" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/traverse" "^7.28.6" + "@babel/helper-simple-access@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" @@ -1122,6 +1157,14 @@ "@babel/helper-create-class-features-plugin" "^7.28.3" "@babel/helper-plugin-utils" "^7.27.1" +"@babel/plugin-transform-class-static-block@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz#1257491e8259c6d125ac4d9a6f39f9d2bf3dba70" + integrity sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" + "@babel/plugin-transform-classes@^7.0.0-0", "@babel/plugin-transform-classes@^7.25.4": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz#03bb04bea2c7b2f711f0db7304a8da46a85cced4" @@ -1830,7 +1873,7 @@ "@babel/types" "^7.28.4" debug "^4.3.1" -"@babel/traverse@^7.29.0": +"@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== @@ -1885,7 +1928,7 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" -"@babel/types@^7.28.6", "@babel/types@^7.29.0": +"@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== @@ -11354,9 +11397,9 @@ nullthrows@^1.1.1: integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== nwsapi@^2.2.16: - version "2.2.22" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.22.tgz#109f9530cda6c156d6a713cdf5939e9f0de98b9d" - integrity sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ== + version "2.2.23" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.23.tgz#59712c3a88e6de2bb0b6ccc1070397267019cf6c" + integrity sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ== ob1@0.82.4: version "0.82.4" @@ -15071,9 +15114,9 @@ ws@^8.12.1: integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ== ws@^8.18.0: - version "8.18.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + version "8.20.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.0.tgz#4cd9532358eba60bc863aad1623dfb045a4d4af8" + integrity sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA== ws@^8.8.0: version "8.17.0" From d0d664987f7571d944c84cdc58cb53982463489a Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Mon, 23 Mar 2026 09:35:21 -0400 Subject: [PATCH 07/22] progress --- e2e/apps/react-native-oidc/metro.config.js | 4 +- e2e/apps/react-native-oidc/package.json | 49 +- package.json | 2 + .../ios/WebCryptoBridge.h | 3 +- .../ios/WebCryptoBridge.swift | 29 +- .../ios/WebCryptoBridgeModule.m | 47 + .../react-native-webcrypto-bridge.podspec | 24 +- yarn.lock | 2006 ++++++++++------- 8 files changed, 1260 insertions(+), 904 deletions(-) create mode 100644 packages/react-native-webcrypto-bridge/ios/WebCryptoBridgeModule.m diff --git a/e2e/apps/react-native-oidc/metro.config.js b/e2e/apps/react-native-oidc/metro.config.js index bf313e2..590e2ac 100644 --- a/e2e/apps/react-native-oidc/metro.config.js +++ b/e2e/apps/react-native-oidc/metro.config.js @@ -30,8 +30,8 @@ config.resolver.disableHierarchicalLookup = false; // Don't try to transform react-native internals config.resolver.blockList = [ - // Exclude react-native source files that shouldn't be transformed - /.*\/react-native\/.*\/node_modules\/.*/, + // Block nested node_modules in workspace packages + /packages\/[^/]+\/node_modules\/.*/, ]; module.exports = config; diff --git a/e2e/apps/react-native-oidc/package.json b/e2e/apps/react-native-oidc/package.json index 87de56b..668f2e6 100644 --- a/e2e/apps/react-native-oidc/package.json +++ b/e2e/apps/react-native-oidc/package.json @@ -18,30 +18,31 @@ "@react-navigation/bottom-tabs": "^7.3.10", "@react-navigation/elements": "^2.3.8", "@react-navigation/native": "^7.1.6", - "expo": "~53.0.10", - "expo-blur": "~14.1.4", - "expo-constants": "~17.1.6", - "expo-crypto": "~14.1.4", - "expo-dev-client": "~5.1.8", - "expo-font": "~13.3.1", - "expo-haptics": "~14.1.4", - "expo-image": "~2.1.7", - "expo-linking": "~7.1.5", - "expo-router": "~5.0.6", - "expo-splash-screen": "~0.30.8", - "expo-status-bar": "~2.2.3", - "expo-symbols": "~0.4.4", - "expo-system-ui": "~5.0.7", - "expo-web-browser": "~14.1.6", - "react": "19.0.1", - "react-dom": "19.0.1", - "react-native": "0.79.2", - "react-native-gesture-handler": "~2.24.0", - "react-native-reanimated": "~3.17.4", - "react-native-safe-area-context": "5.4.0", - "react-native-screens": "~4.10.0", - "react-native-web": "~0.20.0", - "react-native-webview": "13.13.5" + "expo": "^54.0.0", + "expo-blur": "~15.0.7", + "expo-constants": "~18.0.10", + "expo-crypto": "~15.0.7", + "expo-dev-client": "~6.0.18", + "expo-font": "~14.0.9", + "expo-haptics": "~15.0.7", + "expo-image": "~3.0.10", + "expo-linking": "~8.0.9", + "expo-router": "~6.0.15", + "expo-splash-screen": "~31.0.11", + "expo-status-bar": "~3.0.8", + "expo-symbols": "~1.0.7", + "expo-system-ui": "~6.0.8", + "expo-web-browser": "~15.0.9", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-gesture-handler": "~2.28.0", + "react-native-reanimated": "~4.1.1", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-web": "^0.21.0", + "react-native-webview": "13.15.0", + "react-native-worklets": "0.5.1" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/package.json b/package.json index f5ba926..0c272b5 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,8 @@ "**/@expo/**", "**/@expo/**/**", "**/@react-navigation/**", + "react", + "react-native", "react-native-oidc/@okta/*", "react-native-oidc/@okta/**" ] diff --git a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h index 3dc3c0d..d9ec15e 100644 --- a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h +++ b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.h @@ -1,10 +1,9 @@ #import #ifdef RCT_NEW_ARCH_ENABLED -#import #import "RNWebCryptoBridge.h" -@interface WebCryptoBridge : NSObject +@interface WebCryptoBridge : NSObject #else @interface WebCryptoBridge : NSObject #endif diff --git a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift index 7d69350..3096e85 100644 --- a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift +++ b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridge.swift @@ -3,6 +3,7 @@ import Security import CommonCrypto import React + @objc(WebCryptoBridge) class WebCryptoBridge: NSObject { @@ -14,6 +15,16 @@ class WebCryptoBridge: NSObject { static func requiresMainQueueSetup() -> Bool { return false } + + @objc + static func moduleName() -> String! { + return "WebCryptoBridge" + } + + @objc + func constantsToExport() -> [AnyHashable : Any]! { + return [:] + } // MARK: - Helper Methods @@ -111,7 +122,7 @@ class WebCryptoBridge: NSObject { var error: Unmanaged? guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else { let err = error?.takeRetainedValue() - reject("key_generation_failed", err?.localizedDescription ?? "Unknown error", err as? Error) + reject("key_generation_failed", err?.localizedDescription ?? "Unknown error", err) return } @@ -157,7 +168,7 @@ class WebCryptoBridge: NSObject { Self.keyStoreLock.unlock() guard let keyPair = keyPair, - let key = keyPair[keyType == "public" ? "publicKey" : "privateKey"] as? SecKey else { + let key = keyPair[keyType == "public" ? "publicKey" : "privateKey"] as! SecKey? else { reject("key_not_found", "Key not found", nil) return } @@ -165,7 +176,7 @@ class WebCryptoBridge: NSObject { var error: Unmanaged? guard let keyData = SecKeyCopyExternalRepresentation(key, &error) as Data? else { let err = error?.takeRetainedValue() - reject("export_failed", err?.localizedDescription ?? "Export failed", err as? Error) + reject("export_failed", err?.localizedDescription ?? "Export failed", err) return } @@ -246,7 +257,7 @@ class WebCryptoBridge: NSObject { guard let publicKey = SecKeyCreateWithData(keyData as CFData, attributes as CFDictionary, &error) else { let err = error?.takeRetainedValue() - reject("import_failed", err?.localizedDescription ?? "Import failed", err as? Error) + reject("import_failed", err?.localizedDescription ?? "Import failed", err) return } @@ -273,7 +284,7 @@ class WebCryptoBridge: NSObject { Self.keyStoreLock.unlock() guard let keyPair = keyPair, - let privateKey = keyPair["privateKey"] as? SecKey else { + let privateKey = keyPair["privateKey"] as! SecKey? else { reject("key_not_found", "Private key not found", nil) return } @@ -288,7 +299,7 @@ class WebCryptoBridge: NSObject { &error ) as Data? else { let err = error?.takeRetainedValue() - reject("signing_failed", err?.localizedDescription ?? "Signing failed", err as? Error) + reject("signing_failed", err?.localizedDescription ?? "Signing failed", err) return } @@ -310,7 +321,7 @@ class WebCryptoBridge: NSObject { Self.keyStoreLock.unlock() guard let keyPair = keyPair, - let publicKey = keyPair["publicKey"] as? SecKey else { + let publicKey = keyPair["publicKey"] as! SecKey? else { reject("key_not_found", "Public key not found", nil) return } @@ -360,7 +371,3 @@ class WebCryptoBridge: NSObject { } } -// Swift uses #if instead of #ifdef -#if RCT_NEW_ARCH_ENABLED -extension WebCryptoBridge: NativeRNWebCryptoBridgeSpec {} -#endif diff --git a/packages/react-native-webcrypto-bridge/ios/WebCryptoBridgeModule.m b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridgeModule.m new file mode 100644 index 0000000..3d9f2be --- /dev/null +++ b/packages/react-native-webcrypto-bridge/ios/WebCryptoBridgeModule.m @@ -0,0 +1,47 @@ +#import + +@interface RCT_EXTERN_MODULE(WebCryptoBridge, NSObject) + +RCT_EXTERN_METHOD(digest:(NSString *)algorithm + data:(NSArray *)data + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(generateKey:(NSString *)algorithm + extractable:(BOOL)extractable + keyUsages:(NSArray *)keyUsages + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(exportKey:(NSString *)format + keyId:(NSString *)keyId + keyType:(NSString *)keyType + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(importKey:(NSString *)format + keyData:(NSString *)keyData + algorithm:(NSString *)algorithm + extractable:(BOOL)extractable + keyUsages:(NSArray *)keyUsages + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(sign:(NSString *)algorithm + keyId:(NSString *)keyId + data:(NSArray *)data + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(verify:(NSString *)algorithm + keyId:(NSString *)keyId + signature:(NSArray *)signature + data:(NSArray *)data + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(getRandomValues:(double)length) + +RCT_EXTERN_METHOD(randomUUID) + +@end \ No newline at end of file diff --git a/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec b/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec index 7ec36e2..32d111b 100644 --- a/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec +++ b/packages/react-native-webcrypto-bridge/react-native-webcrypto-bridge.podspec @@ -1,6 +1,7 @@ require "json" package = JSON.parse(File.read(File.join(__dir__, "package.json"))) +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' Pod::Spec.new do |s| s.name = "react-native-webcrypto-bridge" @@ -9,16 +10,29 @@ Pod::Spec.new do |s| s.homepage = "https://github.com/okta/okta-client-javascript" s.license = package["license"] s.authors = { "Okta" => "jared.perreault@okta.com" } - s.platforms = { :ios => "13.0" } + s.platforms = { :ios => "13.4" } s.source = { :git => "https://github.com/okta/okta-client-javascript.git", :tag => "#{s.version}" } s.source_files = "ios/**/*.{h,m,mm,swift}" s.swift_version = "5.0" - # This tells CocoaPods to look for the Codegen output - s.pod_target_xcconfig = { - 'DEFINES_MODULE' => 'YES', - } + # New Architecture support + if ENV['RCT_NEW_ARCH_ENABLED'] == '1' + s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1" + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + 'HEADER_SEARCH_PATHS' => [ + '"$(PODS_ROOT)/Headers/Private/React-Codegen/react/renderer/components"', + '"$(PODS_TARGET_SRCROOT)/../../../ios/build/generated/ios"', + '"${PODS_CONFIGURATION_BUILD_DIR}/React-Codegen/React_Codegen.framework/Headers"' + ].join(' '), + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17' + } + else + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES' + } + end install_modules_dependencies(s) end \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 9f011fa..d6a080f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -201,6 +201,15 @@ "@babel/highlight" "^7.24.2" picocolors "^1.0.0" +"@babel/code-frame@^7.20.0", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.24.6": version "7.24.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2" @@ -218,15 +227,6 @@ js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" - integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== - dependencies: - "@babel/helper-validator-identifier" "^7.28.5" - js-tokens "^4.0.0" - picocolors "^1.1.1" - "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" @@ -822,18 +822,18 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== -"@babel/parser@^7.20.0", "@babel/parser@^7.25.3", "@babel/parser@^7.27.2", "@babel/parser@^7.27.3", "@babel/parser@^7.27.4": +"@babel/parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" + integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== + +"@babel/parser@^7.25.3", "@babel/parser@^7.27.2", "@babel/parser@^7.27.3", "@babel/parser@^7.27.4": version "7.27.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.4.tgz#f92e89e4f51847be05427285836fc88341c956df" integrity sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g== dependencies: "@babel/types" "^7.27.3" -"@babel/parser@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" - integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== - "@babel/parser@^7.28.0": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" @@ -1149,6 +1149,14 @@ "@babel/helper-create-class-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" +"@babel/plugin-transform-class-static-block@^7.27.1", "@babel/plugin-transform-class-static-block@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz#1257491e8259c6d125ac4d9a6f39f9d2bf3dba70" + integrity sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" + "@babel/plugin-transform-class-static-block@^7.28.3": version "7.28.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz#d1b8e69b54c9993bc558203e1f49bfc979bfd852" @@ -1157,14 +1165,6 @@ "@babel/helper-create-class-features-plugin" "^7.28.3" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-class-static-block@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz#1257491e8259c6d125ac4d9a6f39f9d2bf3dba70" - integrity sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-transform-classes@^7.0.0-0", "@babel/plugin-transform-classes@^7.25.4": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz#03bb04bea2c7b2f711f0db7304a8da46a85cced4" @@ -1895,14 +1895,6 @@ "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" -"@babel/types@^7.20.0", "@babel/types@^7.25.2", "@babel/types@^7.27.1", "@babel/types@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.3.tgz#c0257bedf33aad6aad1f406d35c44758321eb3ec" - integrity sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/types@^7.24.6": version "7.24.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912" @@ -1912,6 +1904,22 @@ "@babel/helper-validator-identifier" "^7.24.6" to-fast-properties "^2.0.0" +"@babel/types@^7.25.2", "@babel/types@^7.27.1", "@babel/types@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.3.tgz#c0257bedf33aad6aad1f406d35c44758321eb3ec" + integrity sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@babel/types@^7.26.0", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/types@^7.28.0": version "7.28.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" @@ -1928,14 +1936,6 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" -"@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" - integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -2371,29 +2371,30 @@ "@eslint/core" "^0.14.0" levn "^0.4.1" -"@expo/cli@0.24.14": - version "0.24.14" - resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.24.14.tgz#af2e7ea5a08e3574e868cb0ec2110e68d32672e0" - integrity sha512-o+QYyfIBhSRTgaywKTLJhm2Fg5PrSeUVCXS+uQySamgoMjLNhHa8QwE64mW/FmJr5hZLiqUEQxb60FK4JcyqXg== +"@expo/cli@54.0.23": + version "54.0.23" + resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-54.0.23.tgz#e8a7dc4e1f2a8a5361afd80bcc352014b57a87ac" + integrity sha512-km0h72SFfQCmVycH/JtPFTVy69w6Lx1cHNDmfLfQqgKFYeeHTjx7LVDP4POHCtNxFP2UeRazrygJhlh4zz498g== dependencies: "@0no-co/graphql.web" "^1.0.8" - "@babel/runtime" "^7.20.0" - "@expo/code-signing-certificates" "^0.0.5" - "@expo/config" "~11.0.10" - "@expo/config-plugins" "~10.0.2" - "@expo/devcert" "^1.1.2" - "@expo/env" "~1.0.5" - "@expo/image-utils" "^0.7.4" - "@expo/json-file" "^9.1.4" - "@expo/metro-config" "~0.20.14" - "@expo/osascript" "^2.2.4" - "@expo/package-manager" "^1.8.4" - "@expo/plist" "^0.3.4" - "@expo/prebuild-config" "^9.0.6" + "@expo/code-signing-certificates" "^0.0.6" + "@expo/config" "~12.0.13" + "@expo/config-plugins" "~54.0.4" + "@expo/devcert" "^1.2.1" + "@expo/env" "~2.0.8" + "@expo/image-utils" "^0.8.8" + "@expo/json-file" "^10.0.8" + "@expo/metro" "~54.2.0" + "@expo/metro-config" "~54.0.14" + "@expo/osascript" "^2.3.8" + "@expo/package-manager" "^1.9.10" + "@expo/plist" "^0.4.8" + "@expo/prebuild-config" "^54.0.8" + "@expo/schema-utils" "^0.1.8" "@expo/spawn-async" "^1.7.2" "@expo/ws-tunnel" "^1.0.1" "@expo/xcpretty" "^4.3.0" - "@react-native/dev-middleware" "0.79.3" + "@react-native/dev-middleware" "0.81.5" "@urql/core" "^5.0.6" "@urql/exchange-retry" "^1.3.0" accepts "^1.3.8" @@ -2407,12 +2408,13 @@ connect "^3.7.0" debug "^4.3.4" env-editor "^0.4.1" + expo-server "^1.0.5" freeport-async "^2.0.0" getenv "^2.0.0" - glob "^10.4.2" + glob "^13.0.0" lan-network "^0.1.6" minimatch "^9.0.0" - node-forge "^1.3.1" + node-forge "^1.3.3" npm-package-arg "^11.0.0" ora "^3.4.0" picomatch "^3.0.1" @@ -2432,33 +2434,32 @@ source-map-support "~0.5.21" stacktrace-parser "^0.1.10" structured-headers "^0.4.1" - tar "^7.4.3" + tar "^7.5.2" terminal-link "^2.1.1" undici "^6.18.2" wrap-ansi "^7.0.0" ws "^8.12.1" -"@expo/code-signing-certificates@^0.0.5": - version "0.0.5" - resolved "https://registry.yarnpkg.com/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz#a693ff684fb20c4725dade4b88a6a9f96b02496c" - integrity sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw== +"@expo/code-signing-certificates@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz#6b7b22830cb69c77a45e357c2f3aa7ab436ac772" + integrity sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w== dependencies: - node-forge "^1.2.1" - nullthrows "^1.1.1" + node-forge "^1.3.3" -"@expo/config-plugins@~10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-10.0.2.tgz#040867991e9c8c527b4f5c13a47bcf040a7479fe" - integrity sha512-TzUn3pPdpwCS0yYaSlZOClgDmCX8N4I2lfgitX5oStqmvpPtB+vqtdyqsVM02fQ2tlJIAqwBW+NHaHqqy8Jv7g== +"@expo/config-plugins@~54.0.4": + version "54.0.4" + resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-54.0.4.tgz#b31cb16f6651342abcdafba600118245ecd9fb00" + integrity sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q== dependencies: - "@expo/config-types" "^53.0.3" - "@expo/json-file" "~9.1.4" - "@expo/plist" "^0.3.4" + "@expo/config-types" "^54.0.10" + "@expo/json-file" "~10.0.8" + "@expo/plist" "^0.4.8" "@expo/sdk-runtime-versions" "^1.0.0" chalk "^4.1.2" debug "^4.3.5" - getenv "^1.0.0" - glob "^10.4.2" + getenv "^2.0.0" + glob "^13.0.0" resolve-from "^5.0.0" semver "^7.5.4" slash "^3.0.0" @@ -2466,180 +2467,205 @@ xcode "^3.0.1" xml2js "0.6.0" -"@expo/config-types@^53.0.3", "@expo/config-types@^53.0.4": - version "53.0.4" - resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-53.0.4.tgz#fe64fac734531ae883d18529b32586c23ffb1ceb" - integrity sha512-0s+9vFx83WIToEr0Iwy4CcmiUXa5BgwBmEjylBB2eojX5XAMm9mJvw9KpjAb8m7zq2G0Q6bRbeufkzgbipuNQg== +"@expo/config-types@^54.0.10": + version "54.0.10" + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-54.0.10.tgz#688f4338255d2fdea970f44e2dfd8e8d37dec292" + integrity sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA== -"@expo/config@~11.0.10", "@expo/config@~11.0.9": - version "11.0.10" - resolved "https://registry.yarnpkg.com/@expo/config/-/config-11.0.10.tgz#559d9425a4e0de4fab96ccac01ff40f5cebbc04b" - integrity sha512-8S8Krr/c5lnl0eF03tA2UGY9rGBhZcbWKz2UWw5dpL/+zstwUmog8oyuuC8aRcn7GiTQLlbBkxcMeT8sOGlhbA== +"@expo/config@~12.0.11", "@expo/config@~12.0.13": + version "12.0.13" + resolved "https://registry.yarnpkg.com/@expo/config/-/config-12.0.13.tgz#8e696e6121c3c364e1dd527f595cf0a1d9386828" + integrity sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ== dependencies: "@babel/code-frame" "~7.10.4" - "@expo/config-plugins" "~10.0.2" - "@expo/config-types" "^53.0.4" - "@expo/json-file" "^9.1.4" + "@expo/config-plugins" "~54.0.4" + "@expo/config-types" "^54.0.10" + "@expo/json-file" "^10.0.8" deepmerge "^4.3.1" - getenv "^1.0.0" - glob "^10.4.2" + getenv "^2.0.0" + glob "^13.0.0" require-from-string "^2.0.2" resolve-from "^5.0.0" resolve-workspace-root "^2.0.0" semver "^7.6.0" slugify "^1.3.4" - sucrase "3.35.0" + sucrase "~3.35.1" -"@expo/devcert@^1.1.2": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@expo/devcert/-/devcert-1.2.0.tgz#7b32c2d959e36baaa0649433395e5170c808b44f" - integrity sha512-Uilcv3xGELD5t/b0eM4cxBFEKQRIivB3v7i+VhWLV/gL98aw810unLKKJbGAxAIhY6Ipyz8ChWibFsKFXYwstA== +"@expo/devcert@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@expo/devcert/-/devcert-1.2.1.tgz#1a687985bea1670866e54d5ba7c0ced963c354f4" + integrity sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA== dependencies: "@expo/sudo-prompt" "^9.3.1" debug "^3.1.0" - glob "^10.4.2" -"@expo/env@~1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@expo/env/-/env-1.0.5.tgz#b3b1aa18ab9838d8f40468e0321affc4c54377a2" - integrity sha512-dtEZ4CAMaVrFu2+tezhU3FoGWtbzQl50xV+rNJE5lYVRjUflWiZkVHlHkWUlPAwDPifLy4TuissVfScGGPWR5g== +"@expo/devtools@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@expo/devtools/-/devtools-0.1.8.tgz#bc5b297698f78b3b67037f04593a31e688330a7a" + integrity sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ== + dependencies: + chalk "^4.1.2" + +"@expo/env@~2.0.8": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@expo/env/-/env-2.0.11.tgz#3a10d9142b1833566bdfb39de1c062f7a8b8ac38" + integrity sha512-xV+ps6YCW7XIPVUwFVCRN2nox09dnRwy8uIjwHWTODu0zFw4kp4omnVkl0OOjuu2XOe7tdgAHxikrkJt9xB/7Q== dependencies: chalk "^4.0.0" debug "^4.3.4" dotenv "~16.4.5" dotenv-expand "~11.0.6" - getenv "^1.0.0" + getenv "^2.0.0" -"@expo/fingerprint@0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.13.0.tgz#5f5600122940ac381ed697743c10bdbddf6c55c1" - integrity sha512-3IwpH0p3uO8jrJSLOUNDzJVh7VEBod0emnCBq0hD72sy6ICmzauM6Xf4he+2Tip7fzImCJRd63GaehV+CCtpvA== +"@expo/fingerprint@0.15.4": + version "0.15.4" + resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.15.4.tgz#578bd1e1179a13313f7de682ebaaacb703b2b7ac" + integrity sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng== dependencies: "@expo/spawn-async" "^1.7.2" arg "^5.0.2" chalk "^4.1.2" debug "^4.3.4" - find-up "^5.0.0" getenv "^2.0.0" + glob "^13.0.0" ignore "^5.3.1" minimatch "^9.0.0" p-limit "^3.1.0" resolve-from "^5.0.0" semver "^7.6.0" -"@expo/image-utils@^0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.7.4.tgz#8f19e53cfc3b66293d9b0749f703e667080895d0" - integrity sha512-LcZ82EJy/t/a1avwIboeZbO6hlw8CvsIRh2k6SWPcAOvW0RqynyKFzUJsvnjWlhUzfBEn4oI7y/Pu5Xkw3KkkA== +"@expo/image-utils@^0.8.8": + version "0.8.12" + resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.8.12.tgz#56e34b9555745ad4d11c972fe0d1ce71c7c64c41" + integrity sha512-3KguH7kyKqq7pNwLb9j6BBdD/bjmNwXZG/HPWT6GWIXbwrvAJt2JNyYTP5agWJ8jbbuys1yuCzmkX+TU6rmI7A== dependencies: "@expo/spawn-async" "^1.7.2" chalk "^4.0.0" - getenv "^1.0.0" + getenv "^2.0.0" jimp-compact "0.16.1" parse-png "^2.1.0" resolve-from "^5.0.0" semver "^7.6.0" - temp-dir "~2.0.0" - unique-string "~2.0.0" -"@expo/json-file@^9.1.4", "@expo/json-file@~9.1.4": - version "9.1.4" - resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-9.1.4.tgz#e719d092c08afb3234643f9285e57c6a24989327" - integrity sha512-7Bv86X27fPERGhw8aJEZvRcH9sk+9BenDnEmrI3ZpywKodYSBgc8lX9Y32faNVQ/p0YbDK9zdJ0BfAKNAOyi0A== +"@expo/json-file@^10.0.12", "@expo/json-file@^10.0.8", "@expo/json-file@~10.0.8": + version "10.0.12" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-10.0.12.tgz#411216996ab6df6765d463de22283b3f30e49ccb" + integrity sha512-inbDycp1rMAelAofg7h/mMzIe+Owx6F7pur3XdQ3EPTy00tme+4P6FWgHKUcjN8dBSrnbRNpSyh5/shzHyVCyQ== dependencies: - "@babel/code-frame" "~7.10.4" + "@babel/code-frame" "^7.20.0" json5 "^2.2.3" -"@expo/metro-config@0.20.14", "@expo/metro-config@~0.20.14": - version "0.20.14" - resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-0.20.14.tgz#5abf8cd6454fe7f75c1f8529cf79619da32af82d" - integrity sha512-tYDDubuZycK+NX00XN7BMu73kBur/evOPcKfxc+UBeFfgN2EifOITtdwSUDdRsbtJ2OnXwMY1HfRUG3Lq3l4cw== +"@expo/metro-config@54.0.14", "@expo/metro-config@~54.0.14": + version "54.0.14" + resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-54.0.14.tgz#e455dfb2bae9473ec665bc830d651baa709c1e8a" + integrity sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA== dependencies: + "@babel/code-frame" "^7.20.0" "@babel/core" "^7.20.0" "@babel/generator" "^7.20.5" - "@babel/parser" "^7.20.0" - "@babel/types" "^7.20.0" - "@expo/config" "~11.0.9" - "@expo/env" "~1.0.5" - "@expo/json-file" "~9.1.4" + "@expo/config" "~12.0.13" + "@expo/env" "~2.0.8" + "@expo/json-file" "~10.0.8" + "@expo/metro" "~54.2.0" "@expo/spawn-async" "^1.7.2" + browserslist "^4.25.0" chalk "^4.1.0" debug "^4.3.2" dotenv "~16.4.5" dotenv-expand "~11.0.6" - getenv "^1.0.0" - glob "^10.4.2" + getenv "^2.0.0" + glob "^13.0.0" + hermes-parser "^0.29.1" jsc-safe-url "^0.2.4" - lightningcss "~1.27.0" + lightningcss "^1.30.1" minimatch "^9.0.0" postcss "~8.4.32" resolve-from "^5.0.0" -"@expo/metro-runtime@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@expo/metro-runtime/-/metro-runtime-5.0.4.tgz#0ea7a7ecf27e3f159289705ef5160328b9fdde42" - integrity sha512-r694MeO+7Vi8IwOsDIDzH/Q5RPMt1kUDYbiTJwnO15nIqiDwlE8HU55UlRhffKZy6s5FmxQsZ8HA+T8DqUW8cQ== +"@expo/metro-runtime@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz#5a4ff117df6115f9c9d4dcc561065e16d69c078b" + integrity sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g== + dependencies: + anser "^1.4.9" + pretty-format "^29.7.0" + stacktrace-parser "^0.1.10" + whatwg-fetch "^3.0.0" -"@expo/osascript@^2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@expo/osascript/-/osascript-2.2.4.tgz#4414d97f91e29260a9b361529d20875430dc0af5" - integrity sha512-Q+Oyj+1pdRiHHpev9YjqfMZzByFH8UhKvSszxa0acTveijjDhQgWrq4e9T/cchBHi0GWZpGczWyiyJkk1wM1dg== +"@expo/metro@~54.2.0": + version "54.2.0" + resolved "https://registry.yarnpkg.com/@expo/metro/-/metro-54.2.0.tgz#6ecf4a77ae7553b73daca4206854728de76c854d" + integrity sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w== + dependencies: + metro "0.83.3" + metro-babel-transformer "0.83.3" + metro-cache "0.83.3" + metro-cache-key "0.83.3" + metro-config "0.83.3" + metro-core "0.83.3" + metro-file-map "0.83.3" + metro-minify-terser "0.83.3" + metro-resolver "0.83.3" + metro-runtime "0.83.3" + metro-source-map "0.83.3" + metro-symbolicate "0.83.3" + metro-transform-plugins "0.83.3" + metro-transform-worker "0.83.3" + +"@expo/osascript@^2.3.8": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@expo/osascript/-/osascript-2.4.2.tgz#fe341cff1eb2c939da43cf58ade5504c8a5d77ca" + integrity sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw== dependencies: "@expo/spawn-async" "^1.7.2" - exec-async "^2.2.0" -"@expo/package-manager@^1.8.4": - version "1.8.4" - resolved "https://registry.yarnpkg.com/@expo/package-manager/-/package-manager-1.8.4.tgz#6126d93b25bbfec515436833e6f6ca5677b7e8bd" - integrity sha512-8H8tLga/NS3iS7QaX/NneRPqbObnHvVCfMCo0ShudreOFmvmgqhYjRlkZTRstSyFqefai8ONaT4VmnLHneRYYg== +"@expo/package-manager@^1.9.10": + version "1.10.3" + resolved "https://registry.yarnpkg.com/@expo/package-manager/-/package-manager-1.10.3.tgz#151fafc1c30de3e75df78f7c0424915210779288" + integrity sha512-ZuXiK/9fCrIuLjPSe1VYmfp0Sa85kCMwd8QQpgyi5ufppYKRtLBg14QOgUqj8ZMbJTxE0xqzd0XR7kOs3vAK9A== dependencies: - "@expo/json-file" "^9.1.4" + "@expo/json-file" "^10.0.12" "@expo/spawn-async" "^1.7.2" chalk "^4.0.0" npm-package-arg "^11.0.0" ora "^3.4.0" resolve-workspace-root "^2.0.0" -"@expo/plist@^0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.3.4.tgz#0c48eeff2158cf26c5c9ed4f681d24997ccfbeca" - integrity sha512-MhBLaUJNe9FQDDU2xhSNS4SAolr6K2wuyi4+A79vYuXLkAoICsbTwcGEQJN5jPY6D9izO/jsXh5k0h+mIWQMdw== +"@expo/plist@^0.4.8": + version "0.4.8" + resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.4.8.tgz#e014511a4a5008cf2b832b91caa8e9f2704127cc" + integrity sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ== dependencies: "@xmldom/xmldom" "^0.8.8" base64-js "^1.2.3" xmlbuilder "^15.1.1" -"@expo/prebuild-config@^9.0.5", "@expo/prebuild-config@^9.0.6": - version "9.0.6" - resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-9.0.6.tgz#f634e7b8f9ebebeaf2e7d2f2be46926c23834d2b" - integrity sha512-HDTdlMkTQZ95rd6EpvuLM+xkZV03yGLc38FqI37qKFLJtUN1WnYVaWsuXKoljd1OrVEVsHe6CfqKwaPZ52D56Q== - dependencies: - "@expo/config" "~11.0.9" - "@expo/config-plugins" "~10.0.2" - "@expo/config-types" "^53.0.4" - "@expo/image-utils" "^0.7.4" - "@expo/json-file" "^9.1.4" - "@react-native/normalize-colors" "0.79.2" +"@expo/prebuild-config@^54.0.8": + version "54.0.8" + resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz#509410345489cc52d1e6ece52742384efe7ad7c6" + integrity sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg== + dependencies: + "@expo/config" "~12.0.13" + "@expo/config-plugins" "~54.0.4" + "@expo/config-types" "^54.0.10" + "@expo/image-utils" "^0.8.8" + "@expo/json-file" "^10.0.8" + "@react-native/normalize-colors" "0.81.5" debug "^4.3.1" resolve-from "^5.0.0" semver "^7.6.0" xml2js "0.6.0" +"@expo/schema-utils@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@expo/schema-utils/-/schema-utils-0.1.8.tgz#8b9543d77fc4ac4954196e3fa00f8fcedd71426a" + integrity sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A== + "@expo/sdk-runtime-versions@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== -"@expo/server@^0.6.2": - version "0.6.2" - resolved "https://registry.yarnpkg.com/@expo/server/-/server-0.6.2.tgz#22986441f25f39aa75b679a84ee1de7ab01a5323" - integrity sha512-ko+dq+1WEC126/iGVv3g+ChFCs9wGyKtGlnYphwrOQbFBBqX19sn6UV0oUks6UdhD+MyzUv+w/TOdktdcI0Cgg== - dependencies: - abort-controller "^3.0.0" - debug "^4.3.4" - source-map-support "~0.5.21" - undici "^6.18.2 || ^7.0.0" - "@expo/spawn-async@^1.7.2": version "1.7.2" resolved "https://registry.yarnpkg.com/@expo/spawn-async/-/spawn-async-1.7.2.tgz#fcfe66c3e387245e72154b1a7eae8cada6a47f58" @@ -2652,11 +2678,16 @@ resolved "https://registry.yarnpkg.com/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz#0fd2813402a42988e49145cab220e25bea74b308" integrity sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw== -"@expo/vector-icons@^14.0.0", "@expo/vector-icons@^14.1.0": +"@expo/vector-icons@^14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-14.1.0.tgz#d3dddad8b6ea60502e0fe5485b86751827606ce4" integrity sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ== +"@expo/vector-icons@^15.0.3": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-15.1.1.tgz#4b1d2c60493c0b0536972f0a5babd5f5c85b48f4" + integrity sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw== + "@expo/ws-tunnel@^1.0.1": version "1.0.6" resolved "https://registry.yarnpkg.com/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz#92b70e7264ad42ea07f28a20f2f540b91d07bdd9" @@ -3178,11 +3209,126 @@ unbzip2-stream "1.4.3" yargs "17.7.2" +"@radix-ui/primitive@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.3.tgz#e2dbc13bdc5e4168f4334f75832d7bdd3e2de5ba" + integrity sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg== + +"@radix-ui/react-collection@1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.7.tgz#d05c25ca9ac4695cc19ba91f42f686e3ea2d9aec" + integrity sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-compose-refs@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz#a2c4c47af6337048ee78ff6dc0d090b390d2bb30" integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== +"@radix-ui/react-context@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.2.tgz#61628ef269a433382c364f6f1e3788a6dc213a36" + integrity sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA== + +"@radix-ui/react-dialog@^1.1.1": + version "1.1.15" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz#1de3d7a7e9a17a9874d29c07f5940a18a119b632" + integrity sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.11" + "@radix-ui/react-focus-guards" "1.1.3" + "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-presence" "1.1.5" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-use-controllable-state" "1.2.2" + aria-hidden "^1.2.4" + react-remove-scroll "^2.6.3" + +"@radix-ui/react-direction@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.1.tgz#39e5a5769e676c753204b792fbe6cf508e550a14" + integrity sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw== + +"@radix-ui/react-dismissable-layer@1.1.11": + version "1.1.11" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz#e33ab6f6bdaa00f8f7327c408d9f631376b88b37" + integrity sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-use-escape-keydown" "1.1.1" + +"@radix-ui/react-focus-guards@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz#2a5669e464ad5fde9f86d22f7fdc17781a4dfa7f" + integrity sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw== + +"@radix-ui/react-focus-scope@1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz#dfe76fc103537d80bf42723a183773fd07bfb58d" + integrity sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + +"@radix-ui/react-id@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.1.tgz#1404002e79a03fe062b7e3864aa01e24bd1471f7" + integrity sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-portal@1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.9.tgz#14c3649fe48ec474ac51ed9f2b9f5da4d91c4472" + integrity sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ== + dependencies: + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-presence@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.5.tgz#5d8f28ac316c32f078afce2996839250c10693db" + integrity sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-primitive@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz#db9b8bcff49e01be510ad79893fb0e4cda50f1bc" + integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== + dependencies: + "@radix-ui/react-slot" "1.2.3" + +"@radix-ui/react-roving-focus@1.1.11": + version "1.1.11" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz#ef54384b7361afc6480dcf9907ef2fedb5080fd9" + integrity sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-slot@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.2.0.tgz#57727fc186ddb40724ccfbe294e1a351d92462ba" @@ -3190,28 +3336,81 @@ dependencies: "@radix-ui/react-compose-refs" "1.1.2" -"@react-native/assets-registry@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.79.2.tgz#731963e664c8543f5b277e56c058bde612b69f50" - integrity sha512-5h2Z7/+/HL/0h88s0JHOdRCW4CXMCJoROxqzHqxdrjGL6EBD1DdaB4ZqkCOEVSW4Vjhir5Qb97C8i/MPWEYPtg== +"@radix-ui/react-slot@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.2.3.tgz#502d6e354fc847d4169c3bc5f189de777f68cfe1" + integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + +"@radix-ui/react-tabs@^1.1.12": + version "1.1.13" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz#3537ce379d7e7ff4eeb6b67a0973e139c2ac1f15" + integrity sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-presence" "1.1.5" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-roving-focus" "1.1.11" + "@radix-ui/react-use-controllable-state" "1.2.2" + +"@radix-ui/react-use-callback-ref@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz#62a4dba8b3255fdc5cc7787faeac1c6e4cc58d40" + integrity sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg== + +"@radix-ui/react-use-controllable-state@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz#905793405de57d61a439f4afebbb17d0645f3190" + integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg== + dependencies: + "@radix-ui/react-use-effect-event" "0.0.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-use-effect-event@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz#090cf30d00a4c7632a15548512e9152217593907" + integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-use-escape-keydown@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz#b3fed9bbea366a118f40427ac40500aa1423cc29" + integrity sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.1" + +"@radix-ui/react-use-layout-effect@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz#0c4230a9eed49d4589c967e2d9c0d9d60a23971e" + integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== + +"@react-native/assets-registry@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.81.5.tgz#d22c924fa6f6d4a463c5af34ce91f38756c0fa7d" + integrity sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w== "@react-native/assets-registry@0.83.4": version "0.83.4" resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.83.4.tgz#48408565f1a6a40cc91e4bbff38e07665d31fbd6" integrity sha512-aqKtpbJDSQeSX/Dwv0yMe1/Rd2QfXi12lnyZDXNn/OEKz59u6+LuPBVgO/9CRyclHmdlvwg8c7PJ9eX2ZMnjWg== -"@react-native/babel-plugin-codegen@0.79.3": - version "0.79.3" - resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.3.tgz#acad4acaead398a8c8bcdecbe44040aa0c2dc2d7" - integrity sha512-Zb8F4bSEKKZfms5n1MQ0o5mudDcpAINkKiFuFTU0PErYGjY3kZ+JeIP+gS6KCXsckxCfMEKQwqKicP/4DWgsZQ== +"@react-native/babel-plugin-codegen@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz#328d03f42c32b5a8cc2dee1aa84a7c48dddc5f18" + integrity sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ== dependencies: "@babel/traverse" "^7.25.3" - "@react-native/codegen" "0.79.3" + "@react-native/codegen" "0.81.5" -"@react-native/babel-preset@0.79.3": - version "0.79.3" - resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.79.3.tgz#8ad6c149cd488fbc18d62983119bdcbfc15ff651" - integrity sha512-VHGNP02bDD2Ul1my0pLVwe/0dsEBHxR343ySpgnkCNEEm9C1ANQIL2wvnJrHZPcqfAkWfFQ8Ln3t+6fdm4A/Dg== +"@react-native/babel-preset@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.81.5.tgz#e8b7969d21f87ef4e41e603248e8a70c44b4a5bb" + integrity sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA== dependencies: "@babel/core" "^7.25.2" "@babel/plugin-proposal-export-default-from" "^7.24.7" @@ -3254,29 +3453,20 @@ "@babel/plugin-transform-typescript" "^7.25.2" "@babel/plugin-transform-unicode-regex" "^7.24.7" "@babel/template" "^7.25.0" - "@react-native/babel-plugin-codegen" "0.79.3" - babel-plugin-syntax-hermes-parser "0.25.1" + "@react-native/babel-plugin-codegen" "0.81.5" + babel-plugin-syntax-hermes-parser "0.29.1" babel-plugin-transform-flow-enums "^0.0.2" react-refresh "^0.14.0" -"@react-native/codegen@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.79.2.tgz#75270d8162e78c02b0272396a3c6942e39e8703d" - integrity sha512-8JTlGLuLi1p8Jx2N/enwwEd7/2CfrqJpv90Cp77QLRX3VHF2hdyavRIxAmXMwN95k+Me7CUuPtqn2X3IBXOWYg== - dependencies: - glob "^7.1.1" - hermes-parser "0.25.1" - invariant "^2.2.4" - nullthrows "^1.1.1" - yargs "^17.6.2" - -"@react-native/codegen@0.79.3": - version "0.79.3" - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.79.3.tgz#49689132718c81a3b25426769bc6fd8fd2a0469f" - integrity sha512-CZejXqKch/a5/s/MO5T8mkAgvzCXgsTkQtpCF15kWR9HN8T+16k0CsN7TXAxXycltoxiE3XRglOrZNEa/TiZUQ== +"@react-native/codegen@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.81.5.tgz#d4dec668c94b9d58a5c2dbdbf026db331e1b6b27" + integrity sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g== dependencies: + "@babel/core" "^7.25.2" + "@babel/parser" "^7.25.3" glob "^7.1.1" - hermes-parser "0.25.1" + hermes-parser "0.29.1" invariant "^2.2.4" nullthrows "^1.1.1" yargs "^17.6.2" @@ -3294,18 +3484,17 @@ nullthrows "^1.1.1" yargs "^17.6.2" -"@react-native/community-cli-plugin@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.2.tgz#d3a0efbdfb554cf3a7e9bfb27865a7caeeeaa1b3" - integrity sha512-E+YEY2dL+68HyR2iahsZdyBKBUi9QyPyaN9vsnda1jNgCjNpSPk2yAF5cXsho+zKK5ZQna3JSeE1Kbi2IfGJbw== +"@react-native/community-cli-plugin@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.5.tgz#617789cda4da419d03dda00e2a78c36188b4391e" + integrity sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw== dependencies: - "@react-native/dev-middleware" "0.79.2" - chalk "^4.0.0" - debug "^2.2.0" + "@react-native/dev-middleware" "0.81.5" + debug "^4.4.0" invariant "^2.2.4" - metro "^0.82.0" - metro-config "^0.82.0" - metro-core "^0.82.0" + metro "^0.83.1" + metro-config "^0.83.1" + metro-core "^0.83.1" semver "^7.1.3" "@react-native/community-cli-plugin@0.83.4": @@ -3321,15 +3510,10 @@ metro-core "^0.83.3" semver "^7.1.3" -"@react-native/debugger-frontend@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.79.2.tgz#1377de6d9cabe5455bf332e06408167da5f60c19" - integrity sha512-cGmC7X6kju76DopSBNc+PRAEetbd7TWF9J9o84hOp/xL3ahxR2kuxJy0oJX8Eg8oehhGGEXTuMKHzNa3rDBeSg== - -"@react-native/debugger-frontend@0.79.3": - version "0.79.3" - resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.79.3.tgz#9cb57d8e88c22552194ab5f6f257605b151bc5b3" - integrity sha512-ImNDuEeKH6lEsLXms3ZsgIrNF94jymfuhPcVY5L0trzaYNo9ZFE9Ni2/18E1IbfXxdeIHrCSBJlWD6CTm7wu5A== +"@react-native/debugger-frontend@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz#82ece0181e9a7a3dcbdfa86cf9decd654e13f81f" + integrity sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w== "@react-native/debugger-frontend@0.83.4": version "0.83.4" @@ -3344,34 +3528,17 @@ cross-spawn "^7.0.6" fb-dotslash "0.5.8" -"@react-native/dev-middleware@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.79.2.tgz#f09f1a75b4cd0b56dfd82a07bf41157a9c45619c" - integrity sha512-9q4CpkklsAs1L0Bw8XYCoqqyBSrfRALGEw4/r0EkR38Y/6fVfNfdsjSns0pTLO6h0VpxswK34L/hm4uK3MoLHw== +"@react-native/dev-middleware@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz#81e8ac545d7736ef6ebb2e59fdbaebc5cf9aedec" + integrity sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA== dependencies: "@isaacs/ttlcache" "^1.4.1" - "@react-native/debugger-frontend" "0.79.2" + "@react-native/debugger-frontend" "0.81.5" chrome-launcher "^0.15.2" chromium-edge-launcher "^0.2.0" connect "^3.6.5" - debug "^2.2.0" - invariant "^2.2.4" - nullthrows "^1.1.1" - open "^7.0.3" - serve-static "^1.16.2" - ws "^6.2.3" - -"@react-native/dev-middleware@0.79.3": - version "0.79.3" - resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.79.3.tgz#3e315ef7516ebad60a4202b4094d84fedecb4064" - integrity sha512-x88+RGOyG71+idQefnQg7wLhzjn/Scs+re1O5vqCkTVzRAc/f7SdHMlbmECUxJPd08FqMcOJr7/X3nsJBrNuuw== - dependencies: - "@isaacs/ttlcache" "^1.4.1" - "@react-native/debugger-frontend" "0.79.3" - chrome-launcher "^0.15.2" - chromium-edge-launcher "^0.2.0" - connect "^3.6.5" - debug "^2.2.0" + debug "^4.4.0" invariant "^2.2.4" nullthrows "^1.1.1" open "^7.0.3" @@ -3396,30 +3563,30 @@ serve-static "^1.16.2" ws "^7.5.10" -"@react-native/gradle-plugin@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.79.2.tgz#d41d4e2c63baf688a2b47652c6260f2a2f1ec091" - integrity sha512-6MJFemrwR0bOT0QM+2BxX9k3/pvZQNmJ3Js5pF/6owsA0cUDiCO57otiEU8Fz+UywWEzn1FoQfOfQ8vt2GYmoA== +"@react-native/gradle-plugin@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.81.5.tgz#a58830f38789f6254b64449a17fe57455b589d00" + integrity sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg== "@react-native/gradle-plugin@0.83.4": version "0.83.4" resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.83.4.tgz#13fe82da3a43c1ad0205e38236d351ec61ec7175" integrity sha512-AhaSWw2k3eMKqZ21IUdM7rpyTYOpAfsBbIIiom1QQii3QccX0uW2AWTcRhfuWRxqr2faGFaOBYedWl2fzp5hgw== -"@react-native/js-polyfills@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.79.2.tgz#15eb4da0fe9e8d61d2980d08fd06b5f49e133b0f" - integrity sha512-IaY87Ckd4GTPMkO1/Fe8fC1IgIx3vc3q9Tyt/6qS3Mtk9nC0x9q4kSR5t+HHq0/MuvGtu8HpdxXGy5wLaM+zUw== +"@react-native/js-polyfills@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.81.5.tgz#2ca68188c8fff9b951f507b1dec7efe928848274" + integrity sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w== "@react-native/js-polyfills@0.83.4": version "0.83.4" resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.83.4.tgz#63244c915773d39bfc56527c1a062054db0c01dd" integrity sha512-wYUdv0rt4MjhKhQloO1AnGDXhZQOFZHDxm86dEtEA0WcsCdVrFdRULFM+rKUC/QQtJW2rS6WBqtBusgtrsDADg== -"@react-native/normalize-colors@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.79.2.tgz#9ab70ca257c7411e4ab74cf7f91332c27d39cc6f" - integrity sha512-+b+GNrupWrWw1okHnEENz63j7NSMqhKeFMOyzYLBwKcprG8fqJQhDIGXfizKdxeIa5NnGSAevKL1Ev1zJ56X8w== +"@react-native/normalize-colors@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz#1ca6cb6772bb7324df2b11aab35227eacd6bdfe7" + integrity sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g== "@react-native/normalize-colors@0.83.4": version "0.83.4" @@ -3431,10 +3598,10 @@ resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz#b8ac17d1bbccd3ef9a1f921665d04d42cff85976" integrity sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg== -"@react-native/virtualized-lists@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.79.2.tgz#ed5a419a30b7ddec978b7816ff698a9d85507e15" - integrity sha512-9G6ROJeP+rdw9Bvr5ruOlag11ET7j1z/En1riFFNo6W3xZvJY+alCuH1ttm12y9+zBm4n8jwCk4lGhjYaV4dKw== +"@react-native/virtualized-lists@0.81.5": + version "0.81.5" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.81.5.tgz#24123fded16992d7e46ecc4ccd473be939ea8c1b" + integrity sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw== dependencies: invariant "^2.2.4" nullthrows "^1.1.1" @@ -3455,6 +3622,15 @@ "@react-navigation/elements" "^2.4.3" color "^4.2.3" +"@react-navigation/bottom-tabs@^7.4.0": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.15.6.tgz#e1a86a7128b11ff037ff5e07b4b294e42a2cc1aa" + integrity sha512-olB+s0ApMzWN9t5Bk5Mj6ntSlVRz3B8v+1LtwGS/29lyC311G5es0kgxyzpGKE9gy6Ef8W526QH5cIka2jh0kQ== + dependencies: + "@react-navigation/elements" "^2.9.11" + color "^4.2.3" + sf-symbols-typescript "^2.1.0" + "@react-navigation/core@^7.10.0": version "7.10.0" resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.10.0.tgz#8205ea6b84ce34b2fc2c196701b4cd9b434211b9" @@ -3468,6 +3644,20 @@ use-latest-callback "^0.2.3" use-sync-external-store "^1.5.0" +"@react-navigation/core@^7.16.2": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.16.2.tgz#d35c0fd6ffe18f62294908122b44cdd49fc6ba2e" + integrity sha512-0dbCC2aTjNW7MvG1fY7zeq6eYvmmaFCEnBDXPuMPJ8uKgfs9lFGXIQFIfBdmcBVX6vHhS+K213VCsuHSIv5jYw== + dependencies: + "@react-navigation/routers" "^7.5.3" + escape-string-regexp "^4.0.0" + fast-deep-equal "^3.1.3" + nanoid "^3.3.11" + query-string "^7.1.3" + react-is "^19.1.0" + use-latest-callback "^0.2.4" + use-sync-external-store "^1.5.0" + "@react-navigation/elements@^2.3.8", "@react-navigation/elements@^2.4.3": version "2.4.3" resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.4.3.tgz#cc1dde4c98739d35a0c9c23872316063962cfaee" @@ -3475,12 +3665,23 @@ dependencies: color "^4.2.3" -"@react-navigation/native-stack@^7.3.10": - version "7.3.14" - resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-7.3.14.tgz#d1c90f2e50cd13bbced923991cf2faee8083f725" - integrity sha512-45Sf7ReqSCIySXS5nrKtLGmNlFXm5x+u32YQMwKDONCqVGOBCfo4ryKqeQq1EMJ7Py6IDyOwHMhA+jhNOxnfPw== +"@react-navigation/elements@^2.9.11": + version "2.9.11" + resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.9.11.tgz#7be3cdf1adb9e65f38bf8a3d91460181f7c042f3" + integrity sha512-O5KiwaVCcEVuqZgQ77xiBFSl1sha77rNMTFlLWYnom33ZHPDarV3bM9WNyVnMZxU8ZVTi02X3+ZhO0fSn5QYyg== dependencies: - "@react-navigation/elements" "^2.4.3" + color "^4.2.3" + use-latest-callback "^0.2.4" + use-sync-external-store "^1.5.0" + +"@react-navigation/native-stack@^7.3.16": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-7.14.6.tgz#928d857d8b9278eb1e2b3dcc8070bd88d760a734" + integrity sha512-VRlC5mLanRPHK0E15Cild6U01Z5TDPBlmt5YcXRBc+hQTAMbMT9XcSTobf3sJXNY0zzDD1IpSs3Ynex/GU225g== + dependencies: + "@react-navigation/elements" "^2.9.11" + color "^4.2.3" + sf-symbols-typescript "^2.1.0" warn-once "^0.1.1" "@react-navigation/native@^7.1.6": @@ -3494,6 +3695,17 @@ nanoid "^3.3.11" use-latest-callback "^0.2.3" +"@react-navigation/native@^7.1.8": + version "7.1.34" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-7.1.34.tgz#25c09241a4a1313e39c866c16dc279a3352e5068" + integrity sha512-zzQ0mKAhLsjTIsaoLfILKZVMObJzE0F+bOi0hl2Glt+1Rd2GtaWJ1Z024c3yLmX+Oc79pqoCQLBXpyxtrZu9NQ== + dependencies: + "@react-navigation/core" "^7.16.2" + escape-string-regexp "^4.0.0" + fast-deep-equal "^3.1.3" + nanoid "^3.3.11" + use-latest-callback "^0.2.4" + "@react-navigation/routers@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.4.0.tgz#5bace799713ac163310c18711b98dfbe418c6b36" @@ -3501,6 +3713,13 @@ dependencies: nanoid "^3.3.11" +"@react-navigation/routers@^7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.5.3.tgz#8002930ef5f62351be2475d0dffde3ffaee174d7" + integrity sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg== + dependencies: + nanoid "^3.3.11" + "@remix-run/router@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.17.1.tgz#bf93997beb81863fde042ebd05013a2618471362" @@ -4145,7 +4364,7 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -4497,6 +4716,11 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@ungap/structured-clone@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + "@unrs/resolver-binding-darwin-arm64@1.7.8": version "1.7.8" resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.8.tgz#d78b964ed64e16103b5324b50dcb4277afeda4d7" @@ -5011,30 +5235,6 @@ agent-base@^7.1.2: resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -5045,7 +5245,7 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: +ajv@^8.0.1: version "8.13.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== @@ -5202,6 +5402,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-hidden@^1.2.4: + version "1.2.6" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.6.tgz#73051c9b088114c795b1ea414e9c0fff874ffc1a" + integrity sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA== + dependencies: + tslib "^2.0.0" + aria-query@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" @@ -5475,17 +5682,24 @@ babel-plugin-polyfill-regenerator@^0.6.5: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.5" -babel-plugin-react-native-web@~0.19.13: - version "0.19.13" - resolved "https://registry.yarnpkg.com/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz#bf919bd6f18c4689dd1a528a82bda507363b953d" - integrity sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ== +babel-plugin-react-compiler@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz#bdf7360a23a4d5ebfca090255da3893efd07425f" + integrity sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw== + dependencies: + "@babel/types" "^7.26.0" + +babel-plugin-react-native-web@~0.21.0: + version "0.21.2" + resolved "https://registry.yarnpkg.com/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz#d2f7fd673278da82577aa583457edb55d9cccbe0" + integrity sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA== -babel-plugin-syntax-hermes-parser@0.25.1, babel-plugin-syntax-hermes-parser@^0.25.1: - version "0.25.1" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz#58b539df973427fcfbb5176a3aec7e5dee793cb0" - integrity sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ== +babel-plugin-syntax-hermes-parser@0.29.1, babel-plugin-syntax-hermes-parser@^0.29.1: + version "0.29.1" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz#09ca9ecb0330eba1ef939b6d3f1f55bb06a9dc33" + integrity sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA== dependencies: - hermes-parser "0.25.1" + hermes-parser "0.29.1" babel-plugin-syntax-hermes-parser@0.32.0: version "0.32.0" @@ -5519,15 +5733,16 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-expo@~13.2.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-13.2.0.tgz#d4540009d07242e3c3d63184b7a34efda95e8e64" - integrity sha512-oNUeUZPMNRPmx/2jaKJLSQFP/MFI1M91vP+Gp+j8/FPl9p/ps603DNwCaRdcT/Vj3FfREdlIwRio1qDCjY0oAA== +babel-preset-expo@~54.0.10: + version "54.0.10" + resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz#3b70f4af3a5f65f945d7957ef511ee016e8f2fd6" + integrity sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw== dependencies: "@babel/helper-module-imports" "^7.25.9" "@babel/plugin-proposal-decorators" "^7.12.9" "@babel/plugin-proposal-export-default-from" "^7.24.7" "@babel/plugin-syntax-export-default-from" "^7.24.7" + "@babel/plugin-transform-class-static-block" "^7.27.1" "@babel/plugin-transform-export-namespace-from" "^7.25.9" "@babel/plugin-transform-flow-strip-types" "^7.25.2" "@babel/plugin-transform-modules-commonjs" "^7.24.8" @@ -5538,12 +5753,12 @@ babel-preset-expo@~13.2.0: "@babel/plugin-transform-runtime" "^7.24.7" "@babel/preset-react" "^7.22.15" "@babel/preset-typescript" "^7.23.0" - "@react-native/babel-preset" "0.79.3" - babel-plugin-react-native-web "~0.19.13" - babel-plugin-syntax-hermes-parser "^0.25.1" + "@react-native/babel-preset" "0.81.5" + babel-plugin-react-compiler "^1.0.0" + babel-plugin-react-native-web "~0.21.0" + babel-plugin-syntax-hermes-parser "^0.29.1" babel-plugin-transform-flow-enums "^0.0.2" debug "^4.3.4" - react-refresh "^0.14.2" resolve-from "^5.0.0" babel-preset-jest@^29.6.3: @@ -5559,6 +5774,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + bare-events@^2.0.0, bare-events@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" @@ -5597,6 +5817,11 @@ base64-js@^1.2.3, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +baseline-browser-mapping@^2.9.0: + version "2.10.10" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz#e74bd066724c1d8d7d8ea75fc3be25389a7a5c56" + integrity sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ== + basic-ftp@^5.0.2: version "5.0.5" resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" @@ -5689,6 +5914,13 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +brace-expansion@^5.0.2: + version "5.0.4" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" + integrity sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg== + dependencies: + balanced-match "^4.0.2" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -5733,6 +5965,17 @@ browserslist@^4.24.4: node-releases "^2.0.19" update-browserslist-db "^1.1.3" +browserslist@^4.25.0: + version "4.28.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== + dependencies: + baseline-browser-mapping "^2.9.0" + caniuse-lite "^1.0.30001759" + electron-to-chromium "^1.5.263" + node-releases "^2.0.27" + update-browserslist-db "^1.2.0" + browserslist@^4.25.3: version "4.25.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.4.tgz#ebdd0e1d1cf3911834bab3a6cd7b917d9babf5af" @@ -5853,25 +6096,6 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: call-bind-apply-helpers "^1.0.2" get-intrinsic "^1.3.0" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -5907,6 +6131,11 @@ caniuse-lite@^1.0.30001737: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz#67fb92953edc536442f3c9da74320774aa523143" integrity sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw== +caniuse-lite@^1.0.30001759: + version "1.0.30001780" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz#0e413de292808868a62ed9118822683fa120a110" + integrity sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ== + ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" @@ -6299,16 +6528,6 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^5.0.5: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - cosmiconfig@^8.1.3: version "8.3.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" @@ -6392,11 +6611,6 @@ cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - css-in-js-utils@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" @@ -6509,7 +6723,7 @@ date-format@4.0.3: resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.3.tgz#f63de5dc08dc02efd8ef32bf2a6918e486f35873" integrity sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ== -debug@2.6.9, debug@^2.2.0, debug@^2.6.9: +debug@2.6.9, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -6648,16 +6862,21 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== +detect-libc@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + devlop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" @@ -6811,6 +7030,11 @@ electron-to-chromium@^1.5.211: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.217.tgz#71285850356ef48bc08275b26f0f355721e0f17d" integrity sha512-Pludfu5iBxp9XzNl0qq2G87hdD17ZV7h5T4n6rQXDi3nCyloBV3jreE9+8GC6g4X/5yxqVgXEURpcLtM0WS4jA== +electron-to-chromium@^1.5.263: + version "1.5.321" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz#57a80554e2e7fd65e3689d320f52a64723472d5d" + integrity sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ== + electron-to-chromium@^1.5.28: version "1.5.35" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.35.tgz#1d38d386186c72b1fa6e74c3a7de5f888b503100" @@ -7607,7 +7831,7 @@ etag@^1.8.1, etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -event-target-shim@^5.0.0, event-target-shim@^5.0.1: +event-target-shim@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== @@ -7617,11 +7841,6 @@ events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -exec-async@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/exec-async/-/exec-async-2.2.0.tgz#c7c5ad2eef3478d38390c6dd3acfe8af0efc8301" - integrity sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw== - execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -7682,18 +7901,18 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -expo-asset@~11.1.5: - version "11.1.5" - resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-11.1.5.tgz#5cad3d781c9d0edec31b9b3adbba574eb4d5dd3e" - integrity sha512-GEQDCqC25uDBoXHEnXeBuwpeXvI+3fRGvtzwwt0ZKKzWaN+TgeF8H7c76p3Zi4DfBMFDcduM0CmOvJX+yCCLUQ== +expo-asset@~12.0.12: + version "12.0.12" + resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-12.0.12.tgz#15eb7d92cd43cc81c37149e5bbcdc3091875a85b" + integrity sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ== dependencies: - "@expo/image-utils" "^0.7.4" - expo-constants "~17.1.5" + "@expo/image-utils" "^0.8.8" + expo-constants "~18.0.12" -expo-blur@~14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/expo-blur/-/expo-blur-14.1.4.tgz#d246c0a224ce63321d022edfc0e6a8c5fa2cc865" - integrity sha512-55P9tK/RjJZEcu2tU7BqX3wmIOrGMOOkmHztJMMws+ZGHzvtjnPmT7dsQxhOU9vPj77oHnKetYHU2sik3iBcCw== +expo-blur@~15.0.7: + version "15.0.8" + resolved "https://registry.yarnpkg.com/expo-blur/-/expo-blur-15.0.8.tgz#846cea275a6644639c5c338987b4cca54cf93eca" + integrity sha512-rWyE1NBRZEu9WD+X+5l7gyPRszw7n12cW3IRNAb5i6KFzaBp8cxqT5oeaphJapqURvcqhkOZn2k5EtBSbsuU7w== expo-build-properties@^1.0.10: version "1.0.10" @@ -7703,203 +7922,217 @@ expo-build-properties@^1.0.10: ajv "^8.11.0" semver "^7.6.0" -expo-constants@~17.1.5, expo-constants@~17.1.6: - version "17.1.6" - resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-17.1.6.tgz#a31b019216f7f7bb4907aeffa2d6bf856751985e" - integrity sha512-q5mLvJiLtPcaZ7t2diSOlQ2AyxIO8YMVEJsEfI/ExkGj15JrflNQ7CALEW6IF/uNae/76qI/XcjEuuAyjdaCNw== +expo-constants@~18.0.10, expo-constants@~18.0.12, expo-constants@~18.0.13: + version "18.0.13" + resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-18.0.13.tgz#0117f1f3d43be7b645192c0f4f431fb4efc4803d" + integrity sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ== dependencies: - "@expo/config" "~11.0.9" - "@expo/env" "~1.0.5" + "@expo/config" "~12.0.13" + "@expo/env" "~2.0.8" -expo-crypto@~14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/expo-crypto/-/expo-crypto-14.1.4.tgz#4d43a52930f359875b6880775688d6d6c0815c1d" - integrity sha512-RmKhB3FgvKE5aNFBw4+hifOkyE0tywsDQVksdHA3jFRzcU9toFiJAz6nhPsBKDf5JlzJiIXhbNMtydoWtuuE7w== +expo-crypto@~15.0.7: + version "15.0.8" + resolved "https://registry.yarnpkg.com/expo-crypto/-/expo-crypto-15.0.8.tgz#339198aae149b3ccc0b44f7150d7261a3a1f5287" + integrity sha512-aF7A914TB66WIlTJvl5J6/itejfY78O7dq3ibvFltL9vnTALJ/7LYHvLT4fwmx9yUNS6ekLBtDGWivFWnj2Fcw== dependencies: base64-js "^1.3.0" -expo-dev-client@~5.1.8: - version "5.1.8" - resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-5.1.8.tgz#53380ec440f26af65b94bcd8e66df3f448ff9bf7" - integrity sha512-IopYPgBi3JflksO5ieTphbKsbYHy9iIVdT/d69It++y0iBMSm0oBIoDmUijrHKjE3fV6jnrwrm8luU13/mzIQQ== - dependencies: - expo-dev-launcher "5.1.11" - expo-dev-menu "6.1.10" - expo-dev-menu-interface "1.10.0" - expo-manifests "~0.16.4" - expo-updates-interface "~1.1.0" - -expo-dev-launcher@5.1.11: - version "5.1.11" - resolved "https://registry.yarnpkg.com/expo-dev-launcher/-/expo-dev-launcher-5.1.11.tgz#059e09152f94593e09b8adff853234565604433b" - integrity sha512-bN0+nv5H038s8Gzf8i16hwCyD3sWDmHp7vb+QbL1i6B3XNnICCKS/H/3VH6H3PRMvCmoLGPlg+ODDqGlf0nu3g== - dependencies: - ajv "8.11.0" - expo-dev-menu "6.1.10" - expo-manifests "~0.16.4" - resolve-from "^5.0.0" +expo-dev-client@~6.0.18: + version "6.0.20" + resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-6.0.20.tgz#d5b65974785100ae7f2538e16701fa1ef55f5fad" + integrity sha512-5XjoVlj1OxakNxy55j/AUaGPrDOlQlB6XdHLLWAw61w5ffSpUDHDnuZzKzs9xY1eIaogOqTOQaAzZ2ddBkdXLA== + dependencies: + expo-dev-launcher "6.0.20" + expo-dev-menu "7.0.18" + expo-dev-menu-interface "2.0.0" + expo-manifests "~1.0.10" + expo-updates-interface "~2.0.0" -expo-dev-menu-interface@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/expo-dev-menu-interface/-/expo-dev-menu-interface-1.10.0.tgz#04671bda3c163d1d7b9438ce7095c3913a3f53f9" - integrity sha512-NxtM/qot5Rh2cY333iOE87dDg1S8CibW+Wu4WdLua3UMjy81pXYzAGCZGNOeY7k9GpNFqDPNDXWyBSlk9r2pBg== +expo-dev-launcher@6.0.20: + version "6.0.20" + resolved "https://registry.yarnpkg.com/expo-dev-launcher/-/expo-dev-launcher-6.0.20.tgz#b2ce90ff6af4c4de28bc1ea595b0b504ed9b467d" + integrity sha512-a04zHEeT9sB0L5EB38fz7sNnUKJ2Ar1pXpcyl60Ki8bXPNCs9rjY7NuYrDkP/irM8+1DklMBqHpyHiLyJ/R+EA== + dependencies: + ajv "^8.11.0" + expo-dev-menu "7.0.18" + expo-manifests "~1.0.10" -expo-dev-menu@6.1.10: - version "6.1.10" - resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-6.1.10.tgz#7970c03748d08cab12222eec0b7da6bc0aa90232" - integrity sha512-LaI0Bw5zzw5XefjYSX6YaMydzk0YBysjqQoxzj6ufDyKgwAfPmFwOLkZ03DOSerc9naezGLNAGgTEN6QTgMmgQ== +expo-dev-menu-interface@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/expo-dev-menu-interface/-/expo-dev-menu-interface-2.0.0.tgz#c0d6db65eb4abc44a2701bc2303744619ad05ca6" + integrity sha512-BvAMPt6x+vyXpThsyjjOYyjwfjREV4OOpQkZ0tNl+nGpsPfcY9mc6DRACoWnH9KpLzyIt3BOgh3cuy/h/OxQjw== + +expo-dev-menu@7.0.18: + version "7.0.18" + resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-7.0.18.tgz#4f3e2dc20b82fc495afb602301b83fa16430f6b8" + integrity sha512-4kTdlHrnZCAWCT6tZRQHSSjZ7vECFisL4T+nsG/GJDo/jcHNaOVGV5qPV9wzlTxyMk3YOPggRw4+g7Ownrg5eA== dependencies: - expo-dev-menu-interface "1.10.0" + expo-dev-menu-interface "2.0.0" -expo-file-system@~18.1.10: - version "18.1.10" - resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-18.1.10.tgz#22f3bcc2c9a7edcd6bba5ece3c90a8467fda47be" - integrity sha512-SyaWg+HitScLuyEeSG9gMSDT0hIxbM9jiZjSBP9l9zMnwZjmQwsusE6+7qGiddxJzdOhTP4YGUfvEzeeS0YL3Q== +expo-file-system@~19.0.21: + version "19.0.21" + resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-19.0.21.tgz#e96a68107fb629cf0dd1906fe7b46b566ff13e10" + integrity sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg== -expo-font@~13.3.1: - version "13.3.1" - resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-13.3.1.tgz#ed69ae14f263a4c447efb2615b60d9e045372e68" - integrity sha512-d+xrHYvSM9WB42wj8vP9OOFWyxed5R1evphfDb6zYBmC1dA9Hf89FpT7TNFtj2Bk3clTnpmVqQTCYbbA2P3CLg== +expo-font@~14.0.11, expo-font@~14.0.9: + version "14.0.11" + resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-14.0.11.tgz#198743d17332520545107df026d8a261e6b2732f" + integrity sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg== dependencies: fontfaceobserver "^2.1.0" -expo-haptics@~14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/expo-haptics/-/expo-haptics-14.1.4.tgz#442f48b1bdf83484d4fcadc653445aaae6049b70" - integrity sha512-QZdE3NMX74rTuIl82I+n12XGwpDWKb8zfs5EpwsnGi/D/n7O2Jd4tO5ivH+muEG/OCJOMq5aeaVDqqaQOhTkcA== +expo-haptics@~15.0.7: + version "15.0.8" + resolved "https://registry.yarnpkg.com/expo-haptics/-/expo-haptics-15.0.8.tgz#f93f895ac5d76fe0c5ac26b3644e1dbb097833f3" + integrity sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g== -expo-image@~2.1.7: - version "2.1.7" - resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-2.1.7.tgz#c64cf29363c87762c9f4b16a016a59ac15998bc2" - integrity sha512-p2Gr8fP/YakFHHo4rbpJbRWwKNrZp1GzSD91WEG3ZYAbTVdTjheJ6gUxXgggFaxEbaY+4WeQ0c5j9tZq8+3cEg== +expo-image@~3.0.10: + version "3.0.11" + resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-3.0.11.tgz#54195565dc710e632c10414c3609deebb7149ac5" + integrity sha512-4TudfUCLgYgENv+f48omnU8tjS2S0Pd9EaON5/s1ZUBRwZ7K8acEr4NfvLPSaeXvxW24iLAiyQ7sV7BXQH3RoA== expo-json-utils@~0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/expo-json-utils/-/expo-json-utils-0.15.0.tgz#6723574814b9e6b0a90e4e23662be76123ab6ae9" integrity sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ== -expo-keep-awake@~14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-14.1.4.tgz#80197728563e0e17523e5a606fbd6fbed9639503" - integrity sha512-wU9qOnosy4+U4z/o4h8W9PjPvcFMfZXrlUoKTMBW7F4pLqhkkP/5G4EviPZixv4XWFMjn1ExQ5rV6BX8GwJsWA== +expo-keep-awake@~15.0.8: + version "15.0.8" + resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz#911c5effeba9baff2ccde79ef0ff5bf856215f8d" + integrity sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ== -expo-linking@~7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-7.1.5.tgz#99633892712d5442ddb1c6c3857346eb7a67119b" - integrity sha512-8g20zOpROW78bF+bLI4a3ZWj4ntLgM0rCewKycPL0jk9WGvBrBtFtwwADJgOiV1EurNp3lcquerXGlWS+SOQyA== +expo-linking@~8.0.9: + version "8.0.11" + resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-8.0.11.tgz#b13ca9fc409ef0536352443221eb50e5e2bee366" + integrity sha512-+VSaNL5om3kOp/SSKO5qe6cFgfSIWnnQDSbA7XLs3ECkYzXRquk5unxNS3pg7eK5kNUmQ4kgLI7MhTggAEUBLA== dependencies: - expo-constants "~17.1.6" + expo-constants "~18.0.12" invariant "^2.2.4" -expo-manifests@~0.16.4: - version "0.16.5" - resolved "https://registry.yarnpkg.com/expo-manifests/-/expo-manifests-0.16.5.tgz#bb57ceff3db4eb74679d4a155b2ca2050375ce10" - integrity sha512-zLUeJogn2C7qOE75Zz7jcmJorMfIbSRR35ctspN0OK/Hq/+PAAptA8p9jNVC8xp/91uP9uI8f3xPhh+A11eR2A== +expo-manifests@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/expo-manifests/-/expo-manifests-1.0.10.tgz#5dfb3db1cdf6b46fee349f1d68a25edf5e087994" + integrity sha512-oxDUnURPcL4ZsOBY6X1DGWGuoZgVAFzp6PISWV7lPP2J0r8u1/ucuChBgpK7u1eLGFp6sDIPwXyEUCkI386XSQ== dependencies: - "@expo/config" "~11.0.10" + "@expo/config" "~12.0.11" expo-json-utils "~0.15.0" -expo-modules-autolinking@2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-2.1.11.tgz#efc2e756ccc8b9e0b927596ba074aefe31b5cbe4" - integrity sha512-KrWQo+cE4gWYNePBBhmHGVzf63gYV19ZLXe9EIH3GHTkViVzIX+Lp618H/7GxfawpN5kbhvilATH1QEKKnUUww== +expo-modules-autolinking@3.0.24: + version "3.0.24" + resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz#55fdfe1ef5a053d5cc287582170a5f6d69ab0e30" + integrity sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ== dependencies: "@expo/spawn-async" "^1.7.2" chalk "^4.1.0" commander "^7.2.0" - find-up "^5.0.0" - glob "^10.4.2" require-from-string "^2.0.2" resolve-from "^5.0.0" -expo-modules-core@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-2.4.0.tgz#3081d62fadff913090cc5abfe46d9ec6b0e75789" - integrity sha512-Ko5eHBdvuMykjw9P9C9PF54/wBSsGOxaOjx92I5BwgKvEmUwN3UrXFV4CXzlLVbLfSYUQaLcB220xmPfgvT7Fg== +expo-modules-core@3.0.29: + version "3.0.29" + resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-3.0.29.tgz#99287eba52f21784bcb2e4f4edd4fc4c21b5b265" + integrity sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q== dependencies: invariant "^2.2.4" -expo-router@~5.0.6: - version "5.0.7" - resolved "https://registry.yarnpkg.com/expo-router/-/expo-router-5.0.7.tgz#032c1de9d06237664169959f7178a818d7b0e677" - integrity sha512-NlEgRXCKtseDuIHBp87UfkvqsuVrc0MYG+zg33dopaN6wik4RkrWWxUYdNPHub0s/7qMye6zZBY4ZCrXwd/xpA== +expo-router@~6.0.15: + version "6.0.23" + resolved "https://registry.yarnpkg.com/expo-router/-/expo-router-6.0.23.tgz#480fbcb4901fd692f9d11762f33894280dcbd75a" + integrity sha512-qCxVAiCrCyu0npky6azEZ6dJDMt77OmCzEbpF6RbUTlfkaCA417LvY14SBkk0xyGruSxy/7pvJOI6tuThaUVCA== dependencies: - "@expo/metro-runtime" "5.0.4" - "@expo/server" "^0.6.2" + "@expo/metro-runtime" "^6.1.2" + "@expo/schema-utils" "^0.1.8" "@radix-ui/react-slot" "1.2.0" - "@react-navigation/bottom-tabs" "^7.3.10" - "@react-navigation/native" "^7.1.6" - "@react-navigation/native-stack" "^7.3.10" + "@radix-ui/react-tabs" "^1.1.12" + "@react-navigation/bottom-tabs" "^7.4.0" + "@react-navigation/native" "^7.1.8" + "@react-navigation/native-stack" "^7.3.16" client-only "^0.0.1" + debug "^4.3.4" + escape-string-regexp "^4.0.0" + expo-server "^1.0.5" + fast-deep-equal "^3.1.3" invariant "^2.2.4" + nanoid "^3.3.8" + query-string "^7.1.3" react-fast-compare "^3.2.2" react-native-is-edge-to-edge "^1.1.6" - schema-utils "^4.0.1" semver "~7.6.3" server-only "^0.0.1" + sf-symbols-typescript "^2.1.0" shallowequal "^1.1.0" + use-latest-callback "^0.2.1" + vaul "^1.1.2" -expo-splash-screen@~0.30.8: - version "0.30.8" - resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.30.8.tgz#2e960ccff053bc8ace85eb56f7d6745e4ddfc6b6" - integrity sha512-2eh+uA543brfeG5HILXmtNKA7E2/pfywKzNumzy3Ef6OtDjYy6zJUGNSbhnZRbVEjUZo3/QNRs0JRBfY80okZg== +expo-server@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/expo-server/-/expo-server-1.0.5.tgz#2d52002199a2af99c2c8771d0657916004345ca9" + integrity sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA== + +expo-splash-screen@~31.0.11: + version "31.0.13" + resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-31.0.13.tgz#f41f1a4c8bb1ae7fcc52b760e7dd485d7ddec642" + integrity sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA== dependencies: - "@expo/prebuild-config" "^9.0.5" + "@expo/prebuild-config" "^54.0.8" -expo-status-bar@~2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/expo-status-bar/-/expo-status-bar-2.2.3.tgz#09385a866732328e0af3b4588c4f349a15fd7cd0" - integrity sha512-+c8R3AESBoduunxTJ8353SqKAKpxL6DvcD8VKBuh81zzJyUUbfB4CVjr1GufSJEKsMzNPXZU+HJwXx7Xh7lx8Q== +expo-status-bar@~3.0.8: + version "3.0.9" + resolved "https://registry.yarnpkg.com/expo-status-bar/-/expo-status-bar-3.0.9.tgz#87cfc803fa614f09a985b8e75e3dd7abd51ce2cb" + integrity sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw== dependencies: - react-native-edge-to-edge "1.6.0" - react-native-is-edge-to-edge "^1.1.6" + react-native-is-edge-to-edge "^1.2.1" -expo-symbols@~0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/expo-symbols/-/expo-symbols-0.4.4.tgz#3aff3c9001eb69bb5a10cc6280bd5bdfb8563296" - integrity sha512-ZVTBdm48MUZsO/sRLrxezB37aazynn8pzpsIUwMqI7V5JtBPPb2gU7LRVPITRc0CqOA+OL01/PqFE3ifBUIP4A== +expo-symbols@~1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/expo-symbols/-/expo-symbols-1.0.8.tgz#a46ae8fb46eb07ae9974c445595d2f342ed4dd30" + integrity sha512-7bNjK350PaQgxBf0owpmSYkdZIpdYYmaPttDBb2WIp6rIKtcEtdzdfmhsc2fTmjBURHYkg36+eCxBFXO25/1hw== dependencies: sf-symbols-typescript "^2.0.0" -expo-system-ui@~5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/expo-system-ui/-/expo-system-ui-5.0.7.tgz#ccf047a689ab488d9bcda375afd063419578f494" - integrity sha512-ijSnSFA4VfuQc84N6WyCUNsKKTIyQb6QuC8q2zGvYC/sBXTMrOtZg0zrisQGzCRW+WhritQTiVqHlp3Ix9xDmQ== +expo-system-ui@~6.0.8: + version "6.0.9" + resolved "https://registry.yarnpkg.com/expo-system-ui/-/expo-system-ui-6.0.9.tgz#09b4a4301ab25ec594ae39beb7d24197c231a30c" + integrity sha512-eQTYGzw1V4RYiYHL9xDLYID3Wsec2aZS+ypEssmF64D38aDrqbDgz1a2MSlHLQp2jHXSs3FvojhZ9FVela1Zcg== dependencies: - "@react-native/normalize-colors" "0.79.2" + "@react-native/normalize-colors" "0.81.5" debug "^4.3.2" -expo-updates-interface@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/expo-updates-interface/-/expo-updates-interface-1.1.0.tgz#62497d4647b381da9fdb68868ed180203ae737ef" - integrity sha512-DeB+fRe0hUDPZhpJ4X4bFMAItatFBUPjw/TVSbJsaf3Exeami+2qbbJhWkcTMoYHOB73nOIcaYcWXYJnCJXO0w== +expo-updates-interface@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/expo-updates-interface/-/expo-updates-interface-2.0.0.tgz#7721cb64c37bcb46b23827b2717ef451a9378749" + integrity sha512-pTzAIufEZdVPKql6iMi5ylVSPqV1qbEopz9G6TSECQmnNde2nwq42PxdFBaUEd8IZJ/fdJLQnOT3m6+XJ5s7jg== -expo-web-browser@~14.1.6: - version "14.1.6" - resolved "https://registry.yarnpkg.com/expo-web-browser/-/expo-web-browser-14.1.6.tgz#26d66e641e6e96d155be6fa513e7e667a719a0b0" - integrity sha512-/4P8eWqRyfXIMZna3acg320LXNA+P2cwyEVbjDX8vHnWU+UnOtyRKWy3XaAIyMPQ9hVjBNUQTh4MPvtnPRzakw== +expo-web-browser@~15.0.9: + version "15.0.10" + resolved "https://registry.yarnpkg.com/expo-web-browser/-/expo-web-browser-15.0.10.tgz#ee7fb59b4f143f262c13c020433a83444181f1a3" + integrity sha512-fvDhW4bhmXAeWFNFiInmsGCK83PAqAcQaFyp/3pE/jbdKmFKoRCWr46uZGIfN4msLK/OODhaQ/+US7GSJNDHJg== -expo@~53.0.10: - version "53.0.11" - resolved "https://registry.yarnpkg.com/expo/-/expo-53.0.11.tgz#66053862520ce2a6700d13346ebaf8210a68f24b" - integrity sha512-+QtvU+6VPd7/o4vmtwuRE/Li2rAiJtD25I6BOnoQSxphaWWaD0PdRQnIV3VQ0HESuJYRuKJ3DkAHNJ3jI6xwzA== +expo@^54.0.0: + version "54.0.33" + resolved "https://registry.yarnpkg.com/expo/-/expo-54.0.33.tgz#f7d572857323f5a8250a9afe245a487d2ee2735f" + integrity sha512-3yOEfAKqo+gqHcV8vKcnq0uA5zxlohnhA3fu4G43likN8ct5ZZ3LjAh9wDdKteEkoad3tFPvwxmXW711S5OHUw== dependencies: "@babel/runtime" "^7.20.0" - "@expo/cli" "0.24.14" - "@expo/config" "~11.0.10" - "@expo/config-plugins" "~10.0.2" - "@expo/fingerprint" "0.13.0" - "@expo/metro-config" "0.20.14" - "@expo/vector-icons" "^14.0.0" - babel-preset-expo "~13.2.0" - expo-asset "~11.1.5" - expo-constants "~17.1.6" - expo-file-system "~18.1.10" - expo-font "~13.3.1" - expo-keep-awake "~14.1.4" - expo-modules-autolinking "2.1.11" - expo-modules-core "2.4.0" - react-native-edge-to-edge "1.6.0" + "@expo/cli" "54.0.23" + "@expo/config" "~12.0.13" + "@expo/config-plugins" "~54.0.4" + "@expo/devtools" "0.1.8" + "@expo/fingerprint" "0.15.4" + "@expo/metro" "~54.2.0" + "@expo/metro-config" "54.0.14" + "@expo/vector-icons" "^15.0.3" + "@ungap/structured-clone" "^1.3.0" + babel-preset-expo "~54.0.10" + expo-asset "~12.0.12" + expo-constants "~18.0.13" + expo-file-system "~19.0.21" + expo-font "~14.0.11" + expo-keep-awake "~15.0.8" + expo-modules-autolinking "3.0.24" + expo-modules-core "3.0.29" + pretty-format "^29.7.0" + react-refresh "^0.14.2" whatwg-url-without-unicode "8.0.0-3" exponential-backoff@^3.1.1: @@ -8075,6 +8308,11 @@ fdir@^6.4.4: resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.5.tgz#328e280f3a23699362f95f2e82acf978a0c0cb49" integrity sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw== +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" @@ -8427,6 +8665,11 @@ get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@ hasown "^2.0.2" math-intrinsics "^1.1.0" +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -8497,11 +8740,6 @@ get-uri@^6.0.1: debug "^4.3.4" fs-extra "^11.2.0" -getenv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" - integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== - getenv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/getenv/-/getenv-2.0.0.tgz#b1698c7b0f29588f4577d06c42c73a5b475c69e0" @@ -8548,17 +8786,14 @@ glob@^10.3.10: minipass "^7.0.4" path-scurry "^1.11.0" -glob@^10.4.2: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== +glob@^13.0.0: + version "13.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" + integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" + minimatch "^10.2.2" + minipass "^7.1.3" + path-scurry "^2.0.2" glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@~7.2.0: version "7.2.3" @@ -8771,15 +9006,10 @@ hermes-compiler@0.14.1: resolved "https://registry.yarnpkg.com/hermes-compiler/-/hermes-compiler-0.14.1.tgz#5381d2bb88454027d16736b8cb7fddaaf1556538" integrity sha512-+RPPQlayoZ9n6/KXKt5SFILWXCGJ/LV5d24L5smXrvTDrPS4L6dSctPczXauuvzFP3QEJbD1YO7Z3Ra4a+4IhA== -hermes-estree@0.25.1: - version "0.25.1" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" - integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== - -hermes-estree@0.28.1: - version "0.28.1" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.28.1.tgz#631e6db146b06e62fc1c630939acf4a3c77d1b24" - integrity sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ== +hermes-estree@0.29.1: + version "0.29.1" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.29.1.tgz#043c7db076e0e8ef8c5f6ed23828d1ba463ebcc5" + integrity sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ== hermes-estree@0.32.0: version "0.32.0" @@ -8791,19 +9021,12 @@ hermes-estree@0.33.3: resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.33.3.tgz#6d6b593d4b471119772c82bdb0212dfadabb6f17" integrity sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg== -hermes-parser@0.25.1: - version "0.25.1" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1" - integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== +hermes-parser@0.29.1, hermes-parser@^0.29.1: + version "0.29.1" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.29.1.tgz#436b24bcd7bb1e71f92a04c396ccc0716c288d56" + integrity sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA== dependencies: - hermes-estree "0.25.1" - -hermes-parser@0.28.1: - version "0.28.1" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.28.1.tgz#17b9e6377f334b6870a1f6da2e123fdcd0b605ac" - integrity sha512-nf8o+hE8g7UJWParnccljHumE9Vlq8F7MqIdeahl+4x0tvCUJYRrT0L7h0MMg/X9YJmkNwsfbaNNrzPtFXOscg== - dependencies: - hermes-estree "0.28.1" + hermes-estree "0.29.1" hermes-parser@0.32.0: version "0.32.0" @@ -8969,14 +9192,6 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -9215,11 +9430,6 @@ is-date-object@^1.1.0: call-bound "^1.0.2" has-tostringtag "^1.0.2" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -10071,11 +10281,6 @@ json-buffer@3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -10227,73 +10432,79 @@ lighthouse-logger@^1.0.0: debug "^2.6.9" marky "^1.2.2" -lightningcss-darwin-arm64@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz#565bd610533941cba648a70e105987578d82f996" - integrity sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ== - -lightningcss-darwin-x64@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz#c906a267237b1c7fe08bff6c5ac032c099bc9482" - integrity sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg== - -lightningcss-freebsd-x64@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz#a7c3c4d6ee18dffeb8fa69f14f8f9267f7dc0c34" - integrity sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA== - -lightningcss-linux-arm-gnueabihf@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz#c7c16432a571ec877bf734fe500e4a43d48c2814" - integrity sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA== - -lightningcss-linux-arm64-gnu@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz#cfd9e18df1cd65131da286ddacfa3aee6862a752" - integrity sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A== - -lightningcss-linux-arm64-musl@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz#6682ff6b9165acef9a6796bd9127a8e1247bb0ed" - integrity sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg== - -lightningcss-linux-x64-gnu@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz#714221212ad184ddfe974bbb7dbe9300dfde4bc0" - integrity sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A== - -lightningcss-linux-x64-musl@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz#247958daf622a030a6dc2285afa16b7184bdf21e" - integrity sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA== - -lightningcss-win32-arm64-msvc@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz#64cfe473c264ef5dc275a4d57a516d77fcac6bc9" - integrity sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ== - -lightningcss-win32-x64-msvc@1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz#237d0dc87d9cdc9cf82536bcbc07426fa9f3f422" - integrity sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw== - -lightningcss@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.27.0.tgz#d4608e63044343836dd9769f6c8b5d607867649a" - integrity sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ== - dependencies: - detect-libc "^1.0.3" +lightningcss-android-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" + integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== + +lightningcss-darwin-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" + integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== + +lightningcss-darwin-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" + integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== + +lightningcss-freebsd-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" + integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== + +lightningcss-linux-arm-gnueabihf@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" + integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== + +lightningcss-linux-arm64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" + integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== + +lightningcss-linux-arm64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" + integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== + +lightningcss-linux-x64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz#0b7803af4eb21cfd38dd39fe2abbb53c7dd091f6" + integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA== + +lightningcss-linux-x64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz#88dc8ba865ddddb1ac5ef04b0f161804418c163b" + integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== + +lightningcss-win32-arm64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" + integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== + +lightningcss-win32-x64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a" + integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== + +lightningcss@^1.30.1: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.32.0.tgz#b85aae96486dcb1bf49a7c8571221273f4f1e4a9" + integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ== + dependencies: + detect-libc "^2.0.3" optionalDependencies: - lightningcss-darwin-arm64 "1.27.0" - lightningcss-darwin-x64 "1.27.0" - lightningcss-freebsd-x64 "1.27.0" - lightningcss-linux-arm-gnueabihf "1.27.0" - lightningcss-linux-arm64-gnu "1.27.0" - lightningcss-linux-arm64-musl "1.27.0" - lightningcss-linux-x64-gnu "1.27.0" - lightningcss-linux-x64-musl "1.27.0" - lightningcss-win32-arm64-msvc "1.27.0" - lightningcss-win32-x64-msvc "1.27.0" + lightningcss-android-arm64 "1.32.0" + lightningcss-darwin-arm64 "1.32.0" + lightningcss-darwin-x64 "1.32.0" + lightningcss-freebsd-x64 "1.32.0" + lightningcss-linux-arm-gnueabihf "1.32.0" + lightningcss-linux-arm64-gnu "1.32.0" + lightningcss-linux-arm64-musl "1.32.0" + lightningcss-linux-x64-gnu "1.32.0" + lightningcss-linux-x64-musl "1.32.0" + lightningcss-win32-arm64-msvc "1.32.0" + lightningcss-win32-x64-msvc "1.32.0" lines-and-columns@^1.1.6: version "1.2.4" @@ -10484,6 +10695,11 @@ lru-cache@^10.4.3: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^11.0.0: + version "11.2.7" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.7.tgz#9127402617f34cd6767b96daee98c28e74458d35" + integrity sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -10633,14 +10849,14 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metro-babel-transformer@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.82.4.tgz#1ac029add8f75d0048c54efc266c0a78791f52b2" - integrity sha512-4juJahGRb1gmNbQq48lNinB6WFNfb6m0BQqi/RQibEltNiqTCxew/dBspI2EWA4xVCd3mQWGfw0TML4KurQZnQ== +metro-babel-transformer@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz#d8c134615530c9ee61364526d44ca4bb0c5343ea" + integrity sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g== dependencies: "@babel/core" "^7.25.2" flow-enums-runtime "^0.0.6" - hermes-parser "0.28.1" + hermes-parser "0.32.0" nullthrows "^1.1.1" metro-babel-transformer@0.83.5: @@ -10653,10 +10869,10 @@ metro-babel-transformer@0.83.5: hermes-parser "0.33.3" nullthrows "^1.1.1" -metro-cache-key@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.82.4.tgz#21f850008fa2570a51e3958574ea5a791574752e" - integrity sha512-2JCTqcpF+f2OghOpe/+x+JywfzDkrHdAqinPFWmK2ezNAU/qX0jBFaTETogPibFivxZJil37w9Yp6syX8rFUng== +metro-cache-key@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.83.3.tgz#ae6c5d4eb1ad8d06a92bf7294ca730a8d880b573" + integrity sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw== dependencies: flow-enums-runtime "^0.0.6" @@ -10667,15 +10883,15 @@ metro-cache-key@0.83.5: dependencies: flow-enums-runtime "^0.0.6" -metro-cache@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.82.4.tgz#f44557f8b33f5d7b7ba4ccba2880c111e9884329" - integrity sha512-vX0ylSMGtORKiZ4G8uP6fgfPdDiCWvLZUGZ5zIblSGylOX6JYhvExl0Zg4UA9pix/SSQu5Pnp9vdODMFsNIxhw== +metro-cache@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.83.3.tgz#f1245cc48570c47d8944495e61d67f0228f10172" + integrity sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q== dependencies: exponential-backoff "^3.1.1" flow-enums-runtime "^0.0.6" https-proxy-agent "^7.0.5" - metro-core "0.82.4" + metro-core "0.83.3" metro-cache@0.83.5: version "0.83.5" @@ -10687,21 +10903,21 @@ metro-cache@0.83.5: https-proxy-agent "^7.0.5" metro-core "0.83.5" -metro-config@0.82.4, metro-config@^0.82.0: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.82.4.tgz#d42fa8b6a4d53493c34d217bbc6c13ee4817355c" - integrity sha512-Ki3Wumr3hKHGDS7RrHsygmmRNc/PCJrvkLn0+BWWxmbOmOcMMJDSmSI+WRlT8jd5VPZFxIi4wg+sAt5yBXAK0g== +metro-config@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.83.3.tgz#a30e7a69b5cf8c4ac4c4b68b1b4c33649ae129a2" + integrity sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA== dependencies: connect "^3.6.5" - cosmiconfig "^5.0.5" flow-enums-runtime "^0.0.6" jest-validate "^29.7.0" - metro "0.82.4" - metro-cache "0.82.4" - metro-core "0.82.4" - metro-runtime "0.82.4" + metro "0.83.3" + metro-cache "0.83.3" + metro-core "0.83.3" + metro-runtime "0.83.3" + yaml "^2.6.1" -metro-config@0.83.5, metro-config@^0.83.3: +metro-config@0.83.5, metro-config@^0.83.1, metro-config@^0.83.3: version "0.83.5" resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.83.5.tgz#a3dd20fc5d5582aa4ad3704678e52abcf4d46b2b" integrity sha512-JQ/PAASXH7yczgV6OCUSRhZYME+NU8NYjI2RcaG5ga4QfQ3T/XdiLzpSb3awWZYlDCcQb36l4Vl7i0Zw7/Tf9w== @@ -10715,16 +10931,16 @@ metro-config@0.83.5, metro-config@^0.83.3: metro-runtime "0.83.5" yaml "^2.6.1" -metro-core@0.82.4, metro-core@^0.82.0: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.82.4.tgz#f7f498929ac066dafe704c3598a990eeb2acdc8c" - integrity sha512-Xo4ozbxPg2vfgJGCgXZ8sVhC2M0lhTqD+tsKO2q9aelq/dCjnnSb26xZKcQO80CQOQUL7e3QWB7pLFGPjZm31A== +metro-core@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.83.3.tgz#007e93f7d1983777da8988dfb103ad897c9835b8" + integrity sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw== dependencies: flow-enums-runtime "^0.0.6" lodash.throttle "^4.1.1" - metro-resolver "0.82.4" + metro-resolver "0.83.3" -metro-core@0.83.5, metro-core@^0.83.3: +metro-core@0.83.5, metro-core@^0.83.1, metro-core@^0.83.3: version "0.83.5" resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.83.5.tgz#1592033633034feb5d368d22bf18e38052146970" integrity sha512-YcVcLCrf0ed4mdLa82Qob0VxYqfhmlRxUS8+TO4gosZo/gLwSvtdeOjc/Vt0pe/lvMNrBap9LlmvZM8FIsMgJQ== @@ -10733,10 +10949,10 @@ metro-core@0.83.5, metro-core@^0.83.3: lodash.throttle "^4.1.1" metro-resolver "0.83.5" -metro-file-map@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.82.4.tgz#186d737088433dd290c5974d9d96d7e62d36e4f9" - integrity sha512-eO7HD1O3aeNsbEe6NBZvx1lLJUrxgyATjnDmb7bm4eyF6yWOQot9XVtxTDLNifECuvsZ4jzRiTInrbmIHkTdGA== +metro-file-map@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.83.3.tgz#3d79fbb1d379ab178dd895ce54cb5ecb183d74a2" + integrity sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA== dependencies: debug "^4.4.0" fb-watchman "^2.0.0" @@ -10763,10 +10979,10 @@ metro-file-map@0.83.5: nullthrows "^1.1.1" walker "^1.0.7" -metro-minify-terser@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.82.4.tgz#3750c14e7a25eba591f6c75eed995f6751030618" - integrity sha512-W79Mi6BUwWVaM8Mc5XepcqkG+TSsCyyo//dmTsgYfJcsmReQorRFodil3bbJInETvjzdnS1mCsUo9pllNjT1Hg== +metro-minify-terser@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz#c1c70929c86b14c8bf03e6321b4f9310bc8dbe87" + integrity sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ== dependencies: flow-enums-runtime "^0.0.6" terser "^5.15.0" @@ -10779,10 +10995,10 @@ metro-minify-terser@0.83.5: flow-enums-runtime "^0.0.6" terser "^5.15.0" -metro-resolver@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.82.4.tgz#936a2300fa577183a1e0e6f7cc405e52f9276f0e" - integrity sha512-uWoHzOBGQTPT5PjippB8rRT3iI9CTgFA9tRiLMzrseA5o7YAlgvfTdY9vFk2qyk3lW3aQfFKWkmqENryPRpu+Q== +metro-resolver@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.3.tgz#06207bdddc280b9335722a8c992aeec017413942" + integrity sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ== dependencies: flow-enums-runtime "^0.0.6" @@ -10793,15 +11009,15 @@ metro-resolver@0.83.5: dependencies: flow-enums-runtime "^0.0.6" -metro-runtime@0.82.4, metro-runtime@^0.82.0: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.82.4.tgz#70e0b871683fdb594f2a7c03403b6350deca086b" - integrity sha512-vVyFO7H+eLXRV2E7YAUYA7aMGBECGagqxmFvC2hmErS7oq90BbPVENfAHbUWq1vWH+MRiivoRxdxlN8gBoF/dw== +metro-runtime@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.83.3.tgz#ff504df5d93f38b1af396715b327e589ba8d184d" + integrity sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw== dependencies: "@babel/runtime" "^7.25.0" flow-enums-runtime "^0.0.6" -metro-runtime@0.83.5, metro-runtime@^0.83.3: +metro-runtime@0.83.5, metro-runtime@^0.83.1, metro-runtime@^0.83.3: version "0.83.5" resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.83.5.tgz#52c1edafc6cc82e57729cc9c21700ab1e53a1777" integrity sha512-f+b3ue9AWTVlZe2Xrki6TAoFtKIqw30jwfk7GQ1rDUBQaE0ZQ+NkiMEtb9uwH7uAjJ87U7Tdx1Jg1OJqUfEVlA== @@ -10809,23 +11025,23 @@ metro-runtime@0.83.5, metro-runtime@^0.83.3: "@babel/runtime" "^7.25.0" flow-enums-runtime "^0.0.6" -metro-source-map@0.82.4, metro-source-map@^0.82.0: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.82.4.tgz#ddd9bdf3a5864ee8f0b296ed11e46bdc2de321ac" - integrity sha512-9jzDQJ0FPas1FuQFtwmBHsez2BfhFNufMowbOMeG3ZaFvzeziE8A0aJwILDS3U+V5039ssCQFiQeqDgENWvquA== +metro-source-map@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.83.3.tgz#04bb464f7928ea48bcdfd18912c8607cf317c898" + integrity sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg== dependencies: "@babel/traverse" "^7.25.3" "@babel/traverse--for-generate-function-map" "npm:@babel/traverse@^7.25.3" "@babel/types" "^7.25.2" flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-symbolicate "0.82.4" + metro-symbolicate "0.83.3" nullthrows "^1.1.1" - ob1 "0.82.4" + ob1 "0.83.3" source-map "^0.5.6" vlq "^1.0.0" -metro-source-map@0.83.5, metro-source-map@^0.83.3: +metro-source-map@0.83.5, metro-source-map@^0.83.1, metro-source-map@^0.83.3: version "0.83.5" resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.83.5.tgz#384f311f83fa2bf51cbec08d77210aa951bf9ee3" integrity sha512-VT9bb2KO2/4tWY9Z2yeZqTUao7CicKAOps9LUg2aQzsz+04QyuXL3qgf1cLUVRjA/D6G5u1RJAlN1w9VNHtODQ== @@ -10840,14 +11056,14 @@ metro-source-map@0.83.5, metro-source-map@^0.83.3: source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.82.4.tgz#76603b0ec2ad8fe5f174aa76485cc46228547a91" - integrity sha512-LwEwAtdsx7z8rYjxjpLWxuFa2U0J6TS6ljlQM4WAATKa4uzV8unmnRuN2iNBWTmRqgNR77mzmI2vhwD4QSCo+w== +metro-symbolicate@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz#67af03950f0dfe19a7c059e3983e39a31e95d03a" + integrity sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw== dependencies: flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-source-map "0.82.4" + metro-source-map "0.83.3" nullthrows "^1.1.1" source-map "^0.5.6" vlq "^1.0.0" @@ -10864,10 +11080,10 @@ metro-symbolicate@0.83.5: source-map "^0.5.6" vlq "^1.0.0" -metro-transform-plugins@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.82.4.tgz#9d3bb855126e0a63ac2ccf012ed2bc7829209e8c" - integrity sha512-NoWQRPHupVpnDgYguiEcm7YwDhnqW02iWWQjO2O8NsNP09rEMSq99nPjARWfukN7+KDh6YjLvTIN20mj3dk9kw== +metro-transform-plugins@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz#2c59ba841e269363cf3acb13138cb992f0c75013" + integrity sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.25.0" @@ -10888,23 +11104,23 @@ metro-transform-plugins@0.83.5: flow-enums-runtime "^0.0.6" nullthrows "^1.1.1" -metro-transform-worker@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.82.4.tgz#cf7db4ef89301ab6658f7a0988fd030e28f86b28" - integrity sha512-kPI7Ad/tdAnI9PY4T+2H0cdgGeSWWdiPRKuytI806UcN4VhFL6OmYa19/4abYVYF+Cd2jo57CDuwbaxRfmXDhw== +metro-transform-worker@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz#ca6ae4a02b0f61b33299e6e56bacaba32dcd607f" + integrity sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.25.0" "@babel/parser" "^7.25.3" "@babel/types" "^7.25.2" flow-enums-runtime "^0.0.6" - metro "0.82.4" - metro-babel-transformer "0.82.4" - metro-cache "0.82.4" - metro-cache-key "0.82.4" - metro-minify-terser "0.82.4" - metro-source-map "0.82.4" - metro-transform-plugins "0.82.4" + metro "0.83.3" + metro-babel-transformer "0.83.3" + metro-cache "0.83.3" + metro-cache-key "0.83.3" + metro-minify-terser "0.83.3" + metro-source-map "0.83.3" + metro-transform-plugins "0.83.3" nullthrows "^1.1.1" metro-transform-worker@0.83.5: @@ -10926,10 +11142,10 @@ metro-transform-worker@0.83.5: metro-transform-plugins "0.83.5" nullthrows "^1.1.1" -metro@0.82.4, metro@^0.82.0: - version "0.82.4" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.82.4.tgz#e4fb4552f1387610b0b2873ed07d4cd59754d636" - integrity sha512-/gFmw3ux9CPG5WUmygY35hpyno28zi/7OUn6+OFfbweA8l0B+PPqXXLr0/T6cf5nclCcH0d22o+02fICaShVxw== +metro@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.83.3.tgz#1e7e04c15519af746f8932c7f9c553d92c39e922" + integrity sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q== dependencies: "@babel/code-frame" "^7.24.7" "@babel/core" "^7.25.2" @@ -10946,24 +11162,24 @@ metro@0.82.4, metro@^0.82.0: 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.32.0" image-size "^1.0.2" invariant "^2.2.4" jest-worker "^29.7.0" jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.82.4" - metro-cache "0.82.4" - metro-cache-key "0.82.4" - metro-config "0.82.4" - metro-core "0.82.4" - metro-file-map "0.82.4" - metro-resolver "0.82.4" - metro-runtime "0.82.4" - metro-source-map "0.82.4" - metro-symbolicate "0.82.4" - metro-transform-plugins "0.82.4" - metro-transform-worker "0.82.4" + metro-babel-transformer "0.83.3" + metro-cache "0.83.3" + metro-cache-key "0.83.3" + metro-config "0.83.3" + metro-core "0.83.3" + metro-file-map "0.83.3" + metro-resolver "0.83.3" + metro-runtime "0.83.3" + metro-source-map "0.83.3" + metro-symbolicate "0.83.3" + metro-transform-plugins "0.83.3" + metro-transform-worker "0.83.3" mime-types "^2.1.27" nullthrows "^1.1.1" serialize-error "^2.1.0" @@ -10972,7 +11188,7 @@ metro@0.82.4, metro@^0.82.0: ws "^7.5.10" yargs "^17.6.2" -metro@0.83.5, metro@^0.83.3: +metro@0.83.5, metro@^0.83.1, metro@^0.83.3: version "0.83.5" resolved "https://registry.yarnpkg.com/metro/-/metro-0.83.5.tgz#f5441075d5211c980ac8c79109e9e6fa2df68924" integrity sha512-BgsXevY1MBac/3ZYv/RfNFf/4iuW9X7f4H8ZNkiH+r667HD9sVujxcmu4jvEzGCAm4/WyKdZCuyhAcyhTHOucQ== @@ -11120,6 +11336,13 @@ mimic-response@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== +minimatch@^10.2.2: + version "10.2.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde" + integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== + dependencies: + brace-expansion "^5.0.2" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -11170,15 +11393,20 @@ minipass@^7.1.2: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== +minipass@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + minisearch@^7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-7.1.2.tgz#296ee8d1906cc378f7e57a3a71f07e5205a75df5" integrity sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA== -minizlib@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.2.tgz#f33d638eb279f664439aa38dc5f91607468cb574" - integrity sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA== +minizlib@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.1.0.tgz#6ad76c3a8f10227c9b51d1c9ac8e30b27f5a251c" + integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw== dependencies: minipass "^7.1.2" @@ -11209,7 +11437,7 @@ mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^3.0.1, mkdirp@~3.0.0: +mkdirp@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== @@ -11248,7 +11476,7 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.11: +nanoid@^3.3.11, nanoid@^3.3.8: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== @@ -11322,10 +11550,10 @@ node-fetch@^3.3.2: fetch-blob "^3.1.4" formdata-polyfill "^4.0.10" -node-forge@^1.2.1, node-forge@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +node-forge@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.3.tgz#0ad80f6333b3a0045e827ac20b7f735f93716751" + integrity sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg== node-int64@^0.4.0: version "0.4.0" @@ -11347,6 +11575,11 @@ node-releases@^2.0.19: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== +node-releases@^2.0.27: + version "2.0.36" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" + integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== + normalize-package-data@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.1.tgz#fa69e9452210f0fabf4d79ee08d0c2870c51ed88" @@ -11401,10 +11634,10 @@ nwsapi@^2.2.16: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.23.tgz#59712c3a88e6de2bb0b6ccc1070397267019cf6c" integrity sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ== -ob1@0.82.4: - version "0.82.4" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.82.4.tgz#60f04f61b8ab96e1f818eb856b35c97bbef44726" - integrity sha512-n9S8e4l5TvkrequEAMDidl4yXesruWTNTzVkeaHSGywoTOIwTzZzKw7Z670H3eaXDZui5MJXjWGNzYowVZIxCA== +ob1@0.83.3: + version "0.83.3" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.83.3.tgz#2208e20c9070e9beff3ad067f2db458fa6b07014" + integrity sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA== dependencies: flow-enums-runtime "^0.0.6" @@ -11717,11 +11950,6 @@ pac-resolver@^7.0.0: degenerator "^5.0.0" netmask "^2.0.2" -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - package-name-regex@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/package-name-regex/-/package-name-regex-2.0.6.tgz#b54bcb04d950e38082b7bb38fa558e01c1679334" @@ -11739,14 +11967,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -11856,6 +12076,14 @@ path-scurry@^1.11.0, path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-scurry@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + path-to-regexp@^8.0.0: version "8.2.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" @@ -11921,6 +12149,11 @@ picomatch@^4.0.2: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -12243,14 +12476,6 @@ rc@~1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-devtools-core@^6.1.1: - version "6.1.2" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-6.1.2.tgz#bf4030c4012be8a9201dc1f8a36238c9a5078c98" - integrity sha512-ldFwzufLletzCikNJVYaxlxMLu7swJ3T2VrGfzXlMsVhZhPDKXA38DEROidaYZVgMAmQnIjymrmqto5pyfrwPA== - dependencies: - shell-quote "^1.6.1" - ws "^7" - react-devtools-core@^6.1.5: version "6.1.5" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-6.1.5.tgz#c5eca79209dab853a03b2158c034c5166975feee" @@ -12267,12 +12492,12 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-dom@19.0.1: - version "19.0.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.1.tgz#b856cbfe38e002b485803d5a0692ee600832edbd" - integrity sha512-3TJg51HSbJiLVYCS6vWwWsyqoS36aGEOCmtLLHxROlSZZ5Bk10xpxHFbrCu4DdqgR85DDc9Vucxqhai3g2xjtA== +react-dom@19.1.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.0.tgz#133558deca37fa1d682708df8904b25186793623" + integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== dependencies: - scheduler "^0.25.0" + scheduler "^0.26.0" react-fast-compare@^3.2.2: version "3.2.2" @@ -12299,60 +12524,51 @@ react-is@^19.1.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.1.0.tgz#805bce321546b7e14c084989c77022351bbdd11b" integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg== -react-native-edge-to-edge@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/react-native-edge-to-edge/-/react-native-edge-to-edge-1.6.0.tgz#2ba63b941704a7f713e298185c26cde4d9e4b973" - integrity sha512-2WCNdE3Qd6Fwg9+4BpbATUxCLcouF6YRY7K+J36KJ4l3y+tWN6XCqAC4DuoGblAAbb2sLkhEDp4FOlbOIot2Og== - -react-native-gesture-handler@~2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.24.0.tgz#b6e1f13ec9bf8dfa5f4911854b6e0d73d882a81a" - integrity sha512-ZdWyOd1C8axKJHIfYxjJKCcxjWEpUtUWgTOVY2wynbiveSQDm8X/PDyAKXSer/GOtIpjudUbACOndZXCN3vHsw== +react-native-gesture-handler@~2.28.0: + version "2.28.0" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz#07fb4f5eae72f810aac3019b060d26c1835bfd0c" + integrity sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A== dependencies: "@egjs/hammerjs" "^2.0.17" hoist-non-react-statics "^3.3.0" invariant "^2.2.4" -react-native-is-edge-to-edge@1.1.7, react-native-is-edge-to-edge@^1.1.6: +react-native-is-edge-to-edge@^1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.7.tgz#28947688f9fafd584e73a4f935ea9603bd9b1939" integrity sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w== -react-native-reanimated@~3.17.4: - version "3.17.5" - resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.17.5.tgz#09ebe3c9e3379c5c0c588b7ab30c131ea29b60f0" - integrity sha512-SxBK7wQfJ4UoWoJqQnmIC7ZjuNgVb9rcY5Xc67upXAFKftWg0rnkknTw6vgwnjRcvYThrjzUVti66XoZdDJGtw== +react-native-is-edge-to-edge@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz#feb9a6a8faf0874298947edd556e5af22044e139" + integrity sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA== + +react-native-reanimated@~4.1.1: + version "4.1.7" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-4.1.7.tgz#b4e8524503a1b6ec1b5a40c460ee807a6a9fd2cf" + integrity sha512-Q4H6xA3Tn7QL0/E/KjI86I1KK4tcf+ErRE04LH34Etka2oVQhW6oXQ+Q8ZcDCVxiWp5vgbBH6XcH8BOo4w/Rhg== dependencies: - "@babel/plugin-transform-arrow-functions" "^7.0.0-0" - "@babel/plugin-transform-class-properties" "^7.0.0-0" - "@babel/plugin-transform-classes" "^7.0.0-0" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0" - "@babel/plugin-transform-optional-chaining" "^7.0.0-0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0-0" - "@babel/plugin-transform-template-literals" "^7.0.0-0" - "@babel/plugin-transform-unicode-regex" "^7.0.0-0" - "@babel/preset-typescript" "^7.16.7" - convert-source-map "^2.0.0" - invariant "^2.2.4" - react-native-is-edge-to-edge "1.1.7" + react-native-is-edge-to-edge "^1.2.1" + semver "^7.7.2" -react-native-safe-area-context@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.4.0.tgz#04b51940408c114f75628a12a93569d30c525454" - integrity sha512-JaEThVyJcLhA+vU0NU8bZ0a1ih6GiF4faZ+ArZLqpYbL6j7R3caRqj+mE3lEtKCuHgwjLg3bCxLL1GPUJZVqUA== +react-native-safe-area-context@~5.6.0: + version "5.6.2" + resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz#283e006f5b434fb247fcb4be0971ad7473d5c560" + integrity sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg== -react-native-screens@~4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-4.10.0.tgz#40634aead590c6b7034ded6a9f92465d1d611906" - integrity sha512-Tw21NGuXm3PbiUGtZd0AnXirUixaAbPXDjNR0baBH7/WJDaDTTELLcQ7QRXuqAWbmr/EVCrKj1348ei1KFIr8A== +react-native-screens@~4.16.0: + version "4.16.0" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-4.16.0.tgz#efa42e77a092aa0b5277c9ae41391ea0240e0870" + integrity sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q== dependencies: react-freeze "^1.0.0" + react-native-is-edge-to-edge "^1.2.1" warn-once "^0.1.0" -react-native-web@~0.20.0: - version "0.20.0" - resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.20.0.tgz#3fb0591999ed4b54d7822a2785547415e8a5c031" - integrity sha512-OOSgrw+aON6R3hRosCau/xVxdLzbjEcsLysYedka0ZON4ZZe6n9xgeN9ZkoejhARM36oTlUgHIQqxGutEJ9Wxg== +react-native-web@^0.21.0: + version "0.21.2" + resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.21.2.tgz#0f6983dfea600d9cc1c66fda87ff9ca585eaa647" + integrity sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg== dependencies: "@babel/runtime" "^7.18.6" "@react-native/normalize-colors" "^0.74.1" @@ -12363,50 +12579,65 @@ react-native-web@~0.20.0: postcss-value-parser "^4.2.0" styleq "^0.1.3" -react-native-webview@13.13.5: - version "13.13.5" - resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.13.5.tgz#4ef5f9310ddff5747f884a6655228ec9c7d52c73" - integrity sha512-MfC2B+woL4Hlj2WCzcb1USySKk+SteXnUKmKktOk/H/AQy5+LuVdkPKm8SknJ0/RxaxhZ48WBoTRGaqgR137hw== +react-native-webview@13.15.0: + version "13.15.0" + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.15.0.tgz#b6d2f8d8dd65897db76659ddd8198d2c74ec5a79" + integrity sha512-Vzjgy8mmxa/JO6l5KZrsTC7YemSdq+qB01diA0FqjUTaWGAGwuykpJ73MDj3+mzBSlaDxAEugHzTtkUQkQEQeQ== dependencies: escape-string-regexp "^4.0.0" invariant "2.2.4" -react-native@0.79.2: - version "0.79.2" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.79.2.tgz#f1a53099701c1736d09e441eb79f97cfc90dd202" - integrity sha512-AnGzb56JvU5YCL7cAwg10+ewDquzvmgrMddiBM0GAWLwQM/6DJfGd2ZKrMuKKehHerpDDZgG+EY64gk3x3dEkw== +react-native-worklets@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/react-native-worklets/-/react-native-worklets-0.5.1.tgz#d153242655e3757b6c62a474768831157316ad33" + integrity sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w== + dependencies: + "@babel/plugin-transform-arrow-functions" "^7.0.0-0" + "@babel/plugin-transform-class-properties" "^7.0.0-0" + "@babel/plugin-transform-classes" "^7.0.0-0" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0" + "@babel/plugin-transform-optional-chaining" "^7.0.0-0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0-0" + "@babel/plugin-transform-template-literals" "^7.0.0-0" + "@babel/plugin-transform-unicode-regex" "^7.0.0-0" + "@babel/preset-typescript" "^7.16.7" + convert-source-map "^2.0.0" + semver "7.7.2" + +react-native@0.81.5: + version "0.81.5" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.81.5.tgz#6c963f137d3979b22aef2d8482067775c8fe2fed" + integrity sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw== dependencies: "@jest/create-cache-key-function" "^29.7.0" - "@react-native/assets-registry" "0.79.2" - "@react-native/codegen" "0.79.2" - "@react-native/community-cli-plugin" "0.79.2" - "@react-native/gradle-plugin" "0.79.2" - "@react-native/js-polyfills" "0.79.2" - "@react-native/normalize-colors" "0.79.2" - "@react-native/virtualized-lists" "0.79.2" + "@react-native/assets-registry" "0.81.5" + "@react-native/codegen" "0.81.5" + "@react-native/community-cli-plugin" "0.81.5" + "@react-native/gradle-plugin" "0.81.5" + "@react-native/js-polyfills" "0.81.5" + "@react-native/normalize-colors" "0.81.5" + "@react-native/virtualized-lists" "0.81.5" abort-controller "^3.0.0" anser "^1.4.9" ansi-regex "^5.0.0" babel-jest "^29.7.0" - babel-plugin-syntax-hermes-parser "0.25.1" + babel-plugin-syntax-hermes-parser "0.29.1" base64-js "^1.5.1" - chalk "^4.0.0" commander "^12.0.0" - event-target-shim "^5.0.1" flow-enums-runtime "^0.0.6" glob "^7.1.1" invariant "^2.2.4" jest-environment-node "^29.7.0" memoize-one "^5.0.0" - metro-runtime "^0.82.0" - metro-source-map "^0.82.0" + metro-runtime "^0.83.1" + metro-source-map "^0.83.1" nullthrows "^1.1.1" pretty-format "^29.7.0" promise "^8.3.0" - react-devtools-core "^6.1.1" + react-devtools-core "^6.1.5" react-refresh "^0.14.0" regenerator-runtime "^0.13.2" - scheduler "0.25.0" + scheduler "0.26.0" semver "^7.1.3" stacktrace-parser "^0.1.10" whatwg-fetch "^3.0.0" @@ -12459,6 +12690,25 @@ react-refresh@^0.14.0, react-refresh@^0.14.2: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== +react-remove-scroll-bar@^2.3.7: + version "2.3.8" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz#99c20f908ee467b385b68a3469b4a3e750012223" + integrity sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q== + dependencies: + react-style-singleton "^2.2.2" + tslib "^2.0.0" + +react-remove-scroll@^2.6.3: + version "2.7.2" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz#6442da56791117661978ae99cd29be9026fecca0" + integrity sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q== + dependencies: + react-remove-scroll-bar "^2.3.7" + react-style-singleton "^2.2.3" + tslib "^2.1.0" + use-callback-ref "^1.3.3" + use-sidecar "^1.1.3" + react-router-dom@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.24.1.tgz#b1a22f7d6c5a1bfce30732bd370713f991ab4de4" @@ -12474,6 +12724,14 @@ react-router@6.24.1, react-router@^6.24.1: dependencies: "@remix-run/router" "1.17.1" +react-style-singleton@^2.2.2, react-style-singleton@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz#4265608be69a4d70cfe3047f2c6c88b2c3ace388" + integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== + dependencies: + get-nonce "^1.0.0" + tslib "^2.0.0" + react@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -12481,10 +12739,10 @@ react@18.2.0: dependencies: loose-envify "^1.1.0" -react@19.0.1: - version "19.0.1" - resolved "https://registry.yarnpkg.com/react/-/react-19.0.1.tgz#0fb9523201af5f8c7aee753a825d1d9d2f9769db" - integrity sha512-nVRaZCuEyvu69sWrkdwjP6QY57C+lY+uMNNMyWUFJb9Z/JlaBOQus7mSMfGYsblv7R691u6SSJA/dX9IRnyyLQ== +react@19.1.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75" + integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== react@^19.2.4: version "19.2.4" @@ -12707,11 +12965,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -13046,10 +13299,10 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@0.25.0, scheduler@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015" - integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== +scheduler@0.26.0, scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== scheduler@0.27.0: version "0.27.0" @@ -13063,15 +13316,10 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -schema-utils@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" +semver@7.7.2, semver@^7.1.3, semver@^7.7.1, semver@^7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== semver@^5.6.0: version "5.7.2" @@ -13083,11 +13331,6 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.1.3, semver@^7.7.1, semver@^7.7.2: - version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - semver@^7.2.1, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" @@ -13236,6 +13479,11 @@ sf-symbols-typescript@^2.0.0: resolved "https://registry.yarnpkg.com/sf-symbols-typescript/-/sf-symbols-typescript-2.1.0.tgz#50a2d7b36edd6809606f0b0a36322fc1fdd7cfde" integrity sha512-ezT7gu/SHTPIOEEoG6TF+O0m5eewl0ZDAO4AtdBi5HjsrUI6JdCG17+Q8+aKp0heM06wZKApRCn5olNbs0Wb/A== +sf-symbols-typescript@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz#926d6e0715e3d8784cadf7658431e36581254208" + integrity sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw== + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -13808,7 +14056,7 @@ styleq@^0.1.3: resolved "https://registry.yarnpkg.com/styleq/-/styleq-0.1.3.tgz#8efb2892debd51ce7b31dc09c227ad920decab71" integrity sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA== -sucrase@3.35.0, sucrase@^3.20.3: +sucrase@^3.20.3: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== @@ -13821,6 +14069,19 @@ sucrase@3.35.0, sucrase@^3.20.3: pirates "^4.0.1" ts-interface-checker "^0.1.9" +sucrase@~3.35.1: + version "3.35.1" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.1.tgz#4619ea50393fe8bd0ae5071c26abd9b2e346bfe1" + integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + tinyglobby "^0.2.11" + ts-interface-checker "^0.1.9" + superjson@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.2.2.tgz#9d52bf0bf6b5751a3c3472f1292e714782ba3173" @@ -13917,23 +14178,17 @@ tar-stream@^3.0.0, tar-stream@^3.1.5: fast-fifo "^1.2.0" streamx "^2.15.0" -tar@^7.4.3: - version "7.4.3" - resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571" - integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== +tar@^7.5.2: + version "7.5.12" + resolved "https://registry.yarnpkg.com/tar/-/tar-7.5.12.tgz#f8705c00ca1001b8b60bc44db1ab26573736b871" + integrity sha512-9TsuLcdhOn4XztcQqhNyq1KOwOOED/3k58JAvtULiYqbO8B/0IBAAIE1hj0Svmm58k27TmcigyDI0deMlgG3uw== 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" -temp-dir@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== - terminal-link@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -13990,6 +14245,14 @@ through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tinyglobby@^0.2.11: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + tinyglobby@^0.2.13: version "0.2.14" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" @@ -14136,7 +14399,7 @@ tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -14449,11 +14712,6 @@ undici@^6.18.2: resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.3.tgz#185752ad92c3d0efe7a7d1f6854a50f83b552d7a" integrity sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw== -"undici@^6.18.2 || ^7.0.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-7.10.0.tgz#8ae17a976acc6593b13c9ff3342840bea9b24670" - integrity sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw== - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -14477,13 +14735,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unique-string@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - unist-util-is@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" @@ -14592,6 +14843,14 @@ update-browserslist-db@^1.1.3: escalade "^3.2.0" picocolors "^1.1.1" +update-browserslist-db@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -14599,11 +14858,31 @@ uri-js@^4.2.2, uri-js@^4.4.1: dependencies: punycode "^2.1.0" +use-callback-ref@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz#98d9fab067075841c5b2c6852090d5d0feabe2bf" + integrity sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg== + dependencies: + tslib "^2.0.0" + +use-latest-callback@^0.2.1, use-latest-callback@^0.2.4: + version "0.2.6" + resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.6.tgz#e5ea752808c86219acc179ace0ae3c1203255e77" + integrity sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg== + use-latest-callback@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.3.tgz#2d644d3063040b9bc2d4c55bb525a13ae3de9e16" integrity sha512-7vI3fBuyRcP91pazVboc4qu+6ZqM8izPWX9k7cRnT8hbD5svslcknsh3S9BUhaK11OmgTV4oWZZVSeQAiV53SQ== +use-sidecar@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.3.tgz#10e7fd897d130b896e2c546c63a5e8233d00efdb" + integrity sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + use-sync-external-store@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz#55122e2a3edd2a6c106174c27485e0fd59bcfca0" @@ -14666,6 +14945,13 @@ vary@^1.1.2, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vaul@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vaul/-/vaul-1.1.2.tgz#c959f8b9dc2ed4f7d99366caee433fbef91f5ba9" + integrity sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA== + dependencies: + "@radix-ui/react-dialog" "^1.1.1" + vfile-message@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" From 7987ca3c508d637889fb423ed50a3fa3aa4d2e46 Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Mon, 23 Mar 2026 11:02:20 -0400 Subject: [PATCH 08/22] progress --- e2e/apps/react-native-oidc/app.config.ts | 3 + e2e/apps/react-native-oidc/app/_layout.tsx | 2 +- .../components/ui/TabBarBackground.ios.tsx | 7 ++- e2e/apps/react-native-oidc/index.js | 16 ++++++ e2e/apps/react-native-oidc/metro.config.js | 3 +- e2e/apps/react-native-oidc/package.json | 8 +-- e2e/apps/react-native-oidc/tsconfig.json | 3 +- packages/auth-foundation/src/oauth2/client.ts | 2 +- yarn.lock | 56 ------------------- 9 files changed, 34 insertions(+), 66 deletions(-) create mode 100644 e2e/apps/react-native-oidc/index.js diff --git a/e2e/apps/react-native-oidc/app.config.ts b/e2e/apps/react-native-oidc/app.config.ts index 1a9dab2..897733a 100644 --- a/e2e/apps/react-native-oidc/app.config.ts +++ b/e2e/apps/react-native-oidc/app.config.ts @@ -24,7 +24,10 @@ export default ({ config }: ConfigContext) => ({ "ios": { "bundleIdentifier": "com.anonymous.reporeactnativeoidc" }, + scheme: "com.oktapreview.jperreault-test", "plugins": [ + "expo-font", + "expo-router", [ "expo-build-properties", { diff --git a/e2e/apps/react-native-oidc/app/_layout.tsx b/e2e/apps/react-native-oidc/app/_layout.tsx index e6611d9..421c3cb 100644 --- a/e2e/apps/react-native-oidc/app/_layout.tsx +++ b/e2e/apps/react-native-oidc/app/_layout.tsx @@ -29,7 +29,7 @@ import { useColorScheme } from '@/hooks/useColorScheme'; // } // } -installWebCryptoPolyfill(); +// installWebCryptoPolyfill(); export default function RootLayout() { diff --git a/e2e/apps/react-native-oidc/components/ui/TabBarBackground.ios.tsx b/e2e/apps/react-native-oidc/components/ui/TabBarBackground.ios.tsx index 495b2d4..86e5425 100644 --- a/e2e/apps/react-native-oidc/components/ui/TabBarBackground.ios.tsx +++ b/e2e/apps/react-native-oidc/components/ui/TabBarBackground.ios.tsx @@ -15,5 +15,10 @@ export default function BlurTabBarBackground() { } export function useBottomTabOverflow() { - return useBottomTabBarHeight(); + try { + return useBottomTabBarHeight(); + } + catch { + return 0; + } } diff --git a/e2e/apps/react-native-oidc/index.js b/e2e/apps/react-native-oidc/index.js new file mode 100644 index 0000000..9f1e471 --- /dev/null +++ b/e2e/apps/react-native-oidc/index.js @@ -0,0 +1,16 @@ +import '@expo/metro-runtime'; +import 'expo-router/entry'; + +import { Platform } from '@okta/auth-foundation/core'; +import { PlatformDefaults } from '@okta/auth-foundation/internal'; + +Platform.registerDefaultsLoader(() => PlatformDefaults); + +import { installWebCryptoPolyfill } from '@okta/react-native-webcrypto-bridge'; +console.log("TESTSSSSSS"); + +installWebCryptoPolyfill(); + +console.log("globalThis.crypto", globalThis.crypto); +console.log('Plat', Platform, Platform.TimeCoordinator) +// global.crypto = global.crypto ?? globalThis.crypto; diff --git a/e2e/apps/react-native-oidc/metro.config.js b/e2e/apps/react-native-oidc/metro.config.js index 590e2ac..087de6e 100644 --- a/e2e/apps/react-native-oidc/metro.config.js +++ b/e2e/apps/react-native-oidc/metro.config.js @@ -18,9 +18,10 @@ const monorepoRoot = path.resolve(projectRoot, '../../..'); const config = getDefaultConfig(projectRoot); // 1. Watch all files within the monorepo -config.watchFolders = [monorepoRoot]; +config.watchFolders = [...config.watchFolders, monorepoRoot]; // 2. Let Metro know where to resolve packages and in what order config.resolver.nodeModulesPaths = [ + ...config.resolver.nodeModulesPaths, path.resolve(projectRoot, 'node_modules'), path.resolve(monorepoRoot, 'node_modules'), ]; diff --git a/e2e/apps/react-native-oidc/package.json b/e2e/apps/react-native-oidc/package.json index 668f2e6..b6f474c 100644 --- a/e2e/apps/react-native-oidc/package.json +++ b/e2e/apps/react-native-oidc/package.json @@ -1,6 +1,6 @@ { "name": "@repo/react-native-oidc", - "main": "expo-router/entry", + "main": "index.js", "version": "1.0.0", "scripts": { "start": "expo start", @@ -11,13 +11,11 @@ "lint": "expo lint" }, "dependencies": { - "@expo/vector-icons": "^14.1.0", + "@expo/metro-runtime": "^6.1.2", + "@expo/vector-icons": "^15.0.3", "@okta/auth-foundation": "*", "@okta/oauth2-flows": "*", "@okta/react-native-webcrypto-bridge": "*", - "@react-navigation/bottom-tabs": "^7.3.10", - "@react-navigation/elements": "^2.3.8", - "@react-navigation/native": "^7.1.6", "expo": "^54.0.0", "expo-blur": "~15.0.7", "expo-constants": "~18.0.10", diff --git a/e2e/apps/react-native-oidc/tsconfig.json b/e2e/apps/react-native-oidc/tsconfig.json index fc3e146..78bcfd9 100644 --- a/e2e/apps/react-native-oidc/tsconfig.json +++ b/e2e/apps/react-native-oidc/tsconfig.json @@ -10,6 +10,7 @@ }, "include": [ "**/*.ts", - "**/*.tsx" + "**/*.tsx", + "index.js" ] } diff --git a/packages/auth-foundation/src/oauth2/client.ts b/packages/auth-foundation/src/oauth2/client.ts index 751ac27..5c95005 100644 --- a/packages/auth-foundation/src/oauth2/client.ts +++ b/packages/auth-foundation/src/oauth2/client.ts @@ -115,7 +115,7 @@ export class OAuth2Client e if (parsedDate.toString() !== 'Invalid Date') { const serverTime = Timestamp.from(parsedDate); const skew = Math.round(serverTime.timeSince(Date.now() / 1000)); - Platform.TimeCoordinator.clockSkew = skew; + // Platform.TimeCoordinator.clockSkew = skew; } } } diff --git a/yarn.lock b/yarn.lock index d6a080f..b5cf834 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2678,11 +2678,6 @@ resolved "https://registry.yarnpkg.com/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz#0fd2813402a42988e49145cab220e25bea74b308" integrity sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw== -"@expo/vector-icons@^14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-14.1.0.tgz#d3dddad8b6ea60502e0fe5485b86751827606ce4" - integrity sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ== - "@expo/vector-icons@^15.0.3": version "15.1.1" resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-15.1.1.tgz#4b1d2c60493c0b0536972f0a5babd5f5c85b48f4" @@ -3614,14 +3609,6 @@ invariant "^2.2.4" nullthrows "^1.1.1" -"@react-navigation/bottom-tabs@^7.3.10": - version "7.3.14" - resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.3.14.tgz#9ee02baea86ab24abe267726665bc69c6df0bf4c" - integrity sha512-s2qinJggS2HYZdCOey9A+fN+bNpWeEKwiL/FjAVOTcv+uofxPWN6CtEZUZGPEjfRjis/srURBmCmpNZSI6sQ9Q== - dependencies: - "@react-navigation/elements" "^2.4.3" - color "^4.2.3" - "@react-navigation/bottom-tabs@^7.4.0": version "7.15.6" resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.15.6.tgz#e1a86a7128b11ff037ff5e07b4b294e42a2cc1aa" @@ -3631,19 +3618,6 @@ color "^4.2.3" sf-symbols-typescript "^2.1.0" -"@react-navigation/core@^7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.10.0.tgz#8205ea6b84ce34b2fc2c196701b4cd9b434211b9" - integrity sha512-qZBA5gGm+9liT4+EHk+kl9apwvqh7HqhLF1XeX6SQRmC/n2QI0u1B8OevKc+EPUDEM9Od15IuwT/GRbSs7/Umw== - dependencies: - "@react-navigation/routers" "^7.4.0" - escape-string-regexp "^4.0.0" - nanoid "^3.3.11" - query-string "^7.1.3" - react-is "^19.1.0" - use-latest-callback "^0.2.3" - use-sync-external-store "^1.5.0" - "@react-navigation/core@^7.16.2": version "7.16.2" resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.16.2.tgz#d35c0fd6ffe18f62294908122b44cdd49fc6ba2e" @@ -3658,13 +3632,6 @@ use-latest-callback "^0.2.4" use-sync-external-store "^1.5.0" -"@react-navigation/elements@^2.3.8", "@react-navigation/elements@^2.4.3": - version "2.4.3" - resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.4.3.tgz#cc1dde4c98739d35a0c9c23872316063962cfaee" - integrity sha512-psoNmnZ0DQIt9nxxPITVLtYW04PGCAfnmd/Pcd3yhiBs93aj+HYKH+SDZDpUnXMf3BN7Wvo4+jPI+/Xjqb+m9w== - dependencies: - color "^4.2.3" - "@react-navigation/elements@^2.9.11": version "2.9.11" resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.9.11.tgz#7be3cdf1adb9e65f38bf8a3d91460181f7c042f3" @@ -3684,17 +3651,6 @@ sf-symbols-typescript "^2.1.0" warn-once "^0.1.1" -"@react-navigation/native@^7.1.6": - version "7.1.10" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-7.1.10.tgz#768f674f7c09b6a57215762052aa62a7dc107402" - integrity sha512-Ug4IML0DkAxZTMF/E7lyyLXSclkGAYElY2cxZWITwfBjtlVeda0NjsdnTWY5EGjnd7bwvhTIUC+CO6qSlrDn5A== - dependencies: - "@react-navigation/core" "^7.10.0" - escape-string-regexp "^4.0.0" - fast-deep-equal "^3.1.3" - nanoid "^3.3.11" - use-latest-callback "^0.2.3" - "@react-navigation/native@^7.1.8": version "7.1.34" resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-7.1.34.tgz#25c09241a4a1313e39c866c16dc279a3352e5068" @@ -3706,13 +3662,6 @@ nanoid "^3.3.11" use-latest-callback "^0.2.4" -"@react-navigation/routers@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.4.0.tgz#5bace799713ac163310c18711b98dfbe418c6b36" - integrity sha512-th5THnuWKJlmr7GGHiicy979di11ycDWub9iIXbEDvQwmwmsRzppmVbfs2nD8bC/MgyMgqWu/gxfys+HqN+kcw== - dependencies: - nanoid "^3.3.11" - "@react-navigation/routers@^7.5.3": version "7.5.3" resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.5.3.tgz#8002930ef5f62351be2475d0dffde3ffaee174d7" @@ -14870,11 +14819,6 @@ use-latest-callback@^0.2.1, use-latest-callback@^0.2.4: resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.6.tgz#e5ea752808c86219acc179ace0ae3c1203255e77" integrity sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg== -use-latest-callback@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.3.tgz#2d644d3063040b9bc2d4c55bb525a13ae3de9e16" - integrity sha512-7vI3fBuyRcP91pazVboc4qu+6ZqM8izPWX9k7cRnT8hbD5svslcknsh3S9BUhaK11OmgTV4oWZZVSeQAiV53SQ== - use-sidecar@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.3.tgz#10e7fd897d130b896e2c546c63a5e8233d00efdb" From 79af38e50e8923667a789e7ca13a36229d1c8369 Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Mon, 23 Mar 2026 12:19:37 -0400 Subject: [PATCH 09/22] progress --- e2e/apps/react-native-oidc/index.js | 10 ++++++---- packages/auth-foundation/src/core.ts | 2 ++ packages/auth-foundation/src/index.ts | 4 ++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/e2e/apps/react-native-oidc/index.js b/e2e/apps/react-native-oidc/index.js index 9f1e471..70099ff 100644 --- a/e2e/apps/react-native-oidc/index.js +++ b/e2e/apps/react-native-oidc/index.js @@ -1,10 +1,8 @@ -import '@expo/metro-runtime'; -import 'expo-router/entry'; - +import '@okta/auth-foundation'; import { Platform } from '@okta/auth-foundation/core'; import { PlatformDefaults } from '@okta/auth-foundation/internal'; -Platform.registerDefaultsLoader(() => PlatformDefaults); +// Platform.registerDefaultsLoader(() => PlatformDefaults); import { installWebCryptoPolyfill } from '@okta/react-native-webcrypto-bridge'; console.log("TESTSSSSSS"); @@ -14,3 +12,7 @@ installWebCryptoPolyfill(); console.log("globalThis.crypto", globalThis.crypto); console.log('Plat', Platform, Platform.TimeCoordinator) // global.crypto = global.crypto ?? globalThis.crypto; + +import '@expo/metro-runtime'; +import 'expo-router/entry'; + diff --git a/packages/auth-foundation/src/core.ts b/packages/auth-foundation/src/core.ts index f7f11bb..008e7fb 100644 --- a/packages/auth-foundation/src/core.ts +++ b/packages/auth-foundation/src/core.ts @@ -2,6 +2,8 @@ * @module Core */ +console.log('auth-foundation imported'); + // types export * from './types/index.ts'; diff --git a/packages/auth-foundation/src/index.ts b/packages/auth-foundation/src/index.ts index c8d387c..0d66b51 100644 --- a/packages/auth-foundation/src/index.ts +++ b/packages/auth-foundation/src/index.ts @@ -8,9 +8,13 @@ import { Platform } from './platform/Platform.ts'; // eslint-disable-next-line no-restricted-imports import { PlatformDefaults } from './platform/defaults.ts'; +console.log('main index imported') + /** * @internal * Registers all default implementations of Platform dependencies. This will include them all in any * output bundle. Use `core.ts` if this is undesirable. */ Platform.registerDefaultsLoader(() => PlatformDefaults); + +console.log('platform: ', PlatformDefaults, Platform.TimeCoordinator) \ No newline at end of file From 48c49ea55e269f24f6178cb473b7b276dacbf812 Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Mon, 23 Mar 2026 15:39:02 -0400 Subject: [PATCH 10/22] functional baseline --- .../react-native-oidc/app/(login)/token.tsx | 2 +- e2e/apps/react-native-oidc/app/_layout.tsx | 26 ----- e2e/apps/react-native-oidc/auth.ts | 95 +++++++++++-------- e2e/apps/react-native-oidc/hooks/useAuth.ts | 2 +- e2e/apps/react-native-oidc/index.js | 37 ++++++-- packages/auth-foundation/package.json | 5 +- packages/auth-foundation/src/Token.ts | 5 + packages/auth-foundation/src/index.ts | 4 +- .../auth-foundation/src/platform/Platform.ts | 9 +- 9 files changed, 103 insertions(+), 82 deletions(-) diff --git a/e2e/apps/react-native-oidc/app/(login)/token.tsx b/e2e/apps/react-native-oidc/app/(login)/token.tsx index 2992061..0080b02 100644 --- a/e2e/apps/react-native-oidc/app/(login)/token.tsx +++ b/e2e/apps/react-native-oidc/app/(login)/token.tsx @@ -3,7 +3,7 @@ import { Button, StyleSheet } from 'react-native'; import { Image } from 'expo-image'; import { useRouter } from 'expo-router'; import Constants from 'expo-constants'; -import { Credential, Token } from '@okta/auth-foundation'; +import { Credential, Token } from '@okta/auth-foundation/core'; import { useAuth } from '@/hooks/useAuth'; import ParallaxScrollView from '@/components/ParallaxScrollView'; diff --git a/e2e/apps/react-native-oidc/app/_layout.tsx b/e2e/apps/react-native-oidc/app/_layout.tsx index 421c3cb..4a9dd45 100644 --- a/e2e/apps/react-native-oidc/app/_layout.tsx +++ b/e2e/apps/react-native-oidc/app/_layout.tsx @@ -3,35 +3,9 @@ import { useFonts } from 'expo-font'; import { Stack } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import 'react-native-reanimated'; -import { installWebCryptoPolyfill } from '@okta/react-native-webcrypto-bridge'; - -// import * as Crypto from 'expo-crypto'; - import { useColorScheme } from '@/hooks/useColorScheme'; -// temp polyfill crypto libs -// global.crypto = { -// // @ts-ignore -// getRandomValues (typedArray: Uint8Array) { -// return Crypto.getRandomValues(typedArray); -// }, -// // @ts-ignore -// randomUUID () { -// return Crypto.randomUUID(); -// }, -// // @ts-ignore -// subtle: { -// digest (alg, data) { -// // @ts-ignore -// return Crypto.digest(alg, data); -// } -// } -// } - -// installWebCryptoPolyfill(); - - export default function RootLayout() { const colorScheme = useColorScheme(); const [loaded] = useFonts({ diff --git a/e2e/apps/react-native-oidc/auth.ts b/e2e/apps/react-native-oidc/auth.ts index 3d2f628..5e95a11 100644 --- a/e2e/apps/react-native-oidc/auth.ts +++ b/e2e/apps/react-native-oidc/auth.ts @@ -1,6 +1,6 @@ import { fetch as expoFetch, FetchResponse } from 'expo/fetch'; import Constants from 'expo-constants'; -import OAuth2Client from '@okta/auth-foundation/client'; +import { OAuth2Client } from '@okta/auth-foundation/core'; console.log('fetch: ', fetch); console.log('Res.json', Response.json); @@ -12,45 +12,6 @@ export const client = new OAuth2Client({ // scopes: ['openid', 'email', 'profile', 'offline_access'], scopes: ['offline_access'], dpop: false, -}, -{ - // fetchImpl: async (input: string | URL | Request, init?: RequestInit) => { - // // const { body, ...rest } = { body: undefined, ...init }; - // // const request = input instanceof Request ? input : new Request(input, rest); - // const request = input instanceof Request ? input : new Request(input, init); - // // TODO: expand additional request options - // const { url, method, headers } = request; - // console.log('url', url); - // // console.log('body', request.body, init?.body) - - // //console.log('typeof body', typeof body, typeof request.body); - // // const response = await expoFetch(url, { method, headers, body: body === null ? undefined: body }); - // // const json = await response.json(); - // // const { status, statusText } = response; - // // console.log(Response); - // // return Response.json(json, { status, statusText, headers: response.headers }); - - // const response = await expoFetch(url, { method, headers }); - // console.log('typeof response', response instanceof Response); - // if (method.toLocaleUpperCase() === 'POST') { - // console.log('post request') - // const body = await response.json(); - // console.log(body); - // } - // return response; - - // // const request = input instanceof Request ? input : new Request(input, init); - // // if (request.body && request.body instanceof URLSearchParams) { - // // request.body = request.body.toString(); - // // } - // }, - - - // NOTE: this isn't doing anything. The problem seems to be within `URLSearchParams` - // passing it directly to `fetch` wasn't converting the body to the correct format. - // directly calling `body: params.toString()` seems to be working fine for now - // (Fix in oauth2-flows/AuthCodeFlow/prepare) - fetchImpl: async (input: string | URL | Request, init?: RequestInit) => { // const { body, ...rest } = { body: undefined, ...init }; // const request = input instanceof Request ? input : new Request(input, rest); @@ -64,5 +25,57 @@ export const client = new OAuth2Client({ console.log(response.body); return response; } -} +}, +// { +// // fetchImpl: async (input: string | URL | Request, init?: RequestInit) => { +// // // const { body, ...rest } = { body: undefined, ...init }; +// // // const request = input instanceof Request ? input : new Request(input, rest); +// // const request = input instanceof Request ? input : new Request(input, init); +// // // TODO: expand additional request options +// // const { url, method, headers } = request; +// // console.log('url', url); +// // // console.log('body', request.body, init?.body) + +// // //console.log('typeof body', typeof body, typeof request.body); +// // // const response = await expoFetch(url, { method, headers, body: body === null ? undefined: body }); +// // // const json = await response.json(); +// // // const { status, statusText } = response; +// // // console.log(Response); +// // // return Response.json(json, { status, statusText, headers: response.headers }); + +// // const response = await expoFetch(url, { method, headers }); +// // console.log('typeof response', response instanceof Response); +// // if (method.toLocaleUpperCase() === 'POST') { +// // console.log('post request') +// // const body = await response.json(); +// // console.log(body); +// // } +// // return response; + +// // // const request = input instanceof Request ? input : new Request(input, init); +// // // if (request.body && request.body instanceof URLSearchParams) { +// // // request.body = request.body.toString(); +// // // } +// // }, + + +// // NOTE: this isn't doing anything. The problem seems to be within `URLSearchParams` +// // passing it directly to `fetch` wasn't converting the body to the correct format. +// // directly calling `body: params.toString()` seems to be working fine for now +// // (Fix in oauth2-flows/AuthCodeFlow/prepare) + +// fetchImpl: async (input: string | URL | Request, init?: RequestInit) => { +// // const { body, ...rest } = { body: undefined, ...init }; +// // const request = input instanceof Request ? input : new Request(input, rest); +// const request = input instanceof Request ? input : new Request(input, init); +// console.log('request', request); +// console.log('url: ', request.url); +// console.log('bdoy: ', typeof request.body, request.body instanceof URLSearchParams); +// console.log('body', request.body) +// // const { url, body, method, headers } = request; +// const response = await fetch(request); +// console.log(response.body); +// return response; +// } +// } ); diff --git a/e2e/apps/react-native-oidc/hooks/useAuth.ts b/e2e/apps/react-native-oidc/hooks/useAuth.ts index d698490..0cd7e21 100644 --- a/e2e/apps/react-native-oidc/hooks/useAuth.ts +++ b/e2e/apps/react-native-oidc/hooks/useAuth.ts @@ -2,7 +2,7 @@ import { useCallback } from 'react'; import { useRouter, type Router } from 'expo-router'; import { openAuthSessionAsync } from 'expo-web-browser'; import { AuthorizationCodeFlow, SessionLogoutFlow, AuthTransaction } from '@okta/oauth2-flows'; -import { Credential } from '@okta/auth-foundation'; +import { Credential } from '@okta/auth-foundation/core'; import { client } from '@/auth'; diff --git a/e2e/apps/react-native-oidc/index.js b/e2e/apps/react-native-oidc/index.js index 70099ff..8711174 100644 --- a/e2e/apps/react-native-oidc/index.js +++ b/e2e/apps/react-native-oidc/index.js @@ -1,18 +1,37 @@ +import '@expo/metro-runtime'; +import 'expo-router/entry'; + +// Import auth-foundation which auto-registers platform defaults +console.log('[index.js] Loading...'); +// import * as AuthFoundation from '@okta/auth-foundation'; import '@okta/auth-foundation'; -import { Platform } from '@okta/auth-foundation/core'; -import { PlatformDefaults } from '@okta/auth-foundation/internal'; +console.log('[index.js] auth-foundation loaded'); +import { Platform } from '@okta/auth-foundation'; -// Platform.registerDefaultsLoader(() => PlatformDefaults); +console.log("Platform loaded:", Platform); +console.log("TimeCoordinator:", Platform.TimeCoordinator); +console.log("TimeCoordinator type:", typeof Platform.TimeCoordinator); +console.log("TimeCoordinator keys:", Object.keys(Platform.TimeCoordinator)); +console.log("TimeCoordinator.now type:", typeof Platform.TimeCoordinator?.now); -import { installWebCryptoPolyfill } from '@okta/react-native-webcrypto-bridge'; -console.log("TESTSSSSSS"); +// Try to call now() and log the error +try { + const now = Platform.TimeCoordinator.now(); + console.log("now() result:", now); +} catch (e) { + console.error("Error calling now():", e); + console.error("TimeCoordinator full:", JSON.stringify(Platform.TimeCoordinator, null, 2)); +} +console.log('Plat', Platform, Platform.TimeCoordinator) + +// Install WebCrypto polyfill +import { installWebCryptoPolyfill } from '@okta/react-native-webcrypto-bridge'; installWebCryptoPolyfill(); -console.log("globalThis.crypto", globalThis.crypto); + console.log('Plat', Platform, Platform.TimeCoordinator) -// global.crypto = global.crypto ?? globalThis.crypto; -import '@expo/metro-runtime'; -import 'expo-router/entry'; +console.log("globalThis.crypto", globalThis.crypto); +// global.crypto = global.crypto ?? globalThis.crypto; diff --git a/packages/auth-foundation/package.json b/packages/auth-foundation/package.json index b36c0c0..694d955 100644 --- a/packages/auth-foundation/package.json +++ b/packages/auth-foundation/package.json @@ -37,7 +37,10 @@ "./package.json": "./package.json" }, "sideEffects": [ - "./src/oktaUserAgent.ts" + "./src/index.ts", + "./src/oktaUserAgent.ts", + "./dist/esm/index.js", + "./dist/esm/oktaUserAgent.ts" ], "scripts": { "lint": "eslint --ext .js,.ts,.jsx .", diff --git a/packages/auth-foundation/src/Token.ts b/packages/auth-foundation/src/Token.ts index ab885a0..bad20cc 100644 --- a/packages/auth-foundation/src/Token.ts +++ b/packages/auth-foundation/src/Token.ts @@ -109,6 +109,11 @@ export class Token implements JSONSerializable, Expires, RequestAuthorizer { * The constructor of Token */ constructor (obj: TokenInit) { + console.log('[Token constructor] About to access Platform.TimeCoordinator'); + console.log('[Token constructor] Platform instance:', Platform); + console.log('[Token constructor] Platform.TimeCoordinator:', Platform.TimeCoordinator); + + const id = obj?.id ?? shortID(); this.id = id; this.issuedAt = obj?.issuedAt ? new Date(obj?.issuedAt) : Platform.TimeCoordinator.now().asDate; diff --git a/packages/auth-foundation/src/index.ts b/packages/auth-foundation/src/index.ts index 0d66b51..1a6a56c 100644 --- a/packages/auth-foundation/src/index.ts +++ b/packages/auth-foundation/src/index.ts @@ -15,6 +15,6 @@ console.log('main index imported') * Registers all default implementations of Platform dependencies. This will include them all in any * output bundle. Use `core.ts` if this is undesirable. */ +console.log('[auth-foundation/index.ts] Before Platform registration'); Platform.registerDefaultsLoader(() => PlatformDefaults); - -console.log('platform: ', PlatformDefaults, Platform.TimeCoordinator) \ No newline at end of file +console.log('[auth-foundation/index.ts] After Platform registration'); diff --git a/packages/auth-foundation/src/platform/Platform.ts b/packages/auth-foundation/src/platform/Platform.ts index 4dca311..3e8f55b 100644 --- a/packages/auth-foundation/src/platform/Platform.ts +++ b/packages/auth-foundation/src/platform/Platform.ts @@ -91,7 +91,9 @@ export class PlatformRegistry implements PlatformDependencies { * ``` */ public registerDefaultsLoader(loader: () => PlatformDependencies): void { + console.log('[Platform.registerDefaultsLoader] Called. Instance:', this); this.#defaultsLoader = loader; + console.log('[Platform.registerDefaultsLoader] Loader set:', !!this.#defaultsLoader); } /** @@ -115,12 +117,16 @@ export class PlatformRegistry implements PlatformDependencies { * Override in subclasses to provide platform-specific defaults */ protected getDefaults (): PlatformDependencies { + console.log('[Platform.getDefaults] Called. Loader exists:', !!this.#defaultsLoader); if (!this.#defaultsLoader) { throw new PlatformRegistryError( `No platform defaults available. Import from "@okta/auth-foundation" directly or call Platform.registerDefaultsLoader()` ); } - return this.#defaultsLoader(); + // return this.#defaultsLoader(); + const defaults = this.#defaultsLoader(); + console.log('[Platform.getDefaults] Returning defaults:', defaults); + return defaults; } /** @@ -130,6 +136,7 @@ export class PlatformRegistry implements PlatformDependencies { * Returns configured override or factory default */ public get TimeCoordinator (): TimeCoordinator { + console.log('[Platform.TimeCoordinator] Accessing TimeCoordinator. Resolved:', this.resolved); return this.resolved.TimeCoordinator; } From 474b9da14ff55c00b86b47b05963dea0df8eba46 Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Mon, 23 Mar 2026 22:31:18 -0400 Subject: [PATCH 11/22] cleanup --- e2e/apps/react-native-oidc/auth.ts | 57 +------------------ .../components/ui/TabBarBackground.ios.tsx | 7 +-- e2e/apps/react-native-oidc/index.js | 23 -------- packages/auth-foundation/src/Token.ts | 5 -- packages/auth-foundation/src/core.ts | 1 - packages/auth-foundation/src/index.ts | 3 - packages/auth-foundation/src/oauth2/client.ts | 2 +- .../auth-foundation/src/platform/Platform.ts | 9 +-- 8 files changed, 4 insertions(+), 103 deletions(-) diff --git a/e2e/apps/react-native-oidc/auth.ts b/e2e/apps/react-native-oidc/auth.ts index 5e95a11..cbcd3fb 100644 --- a/e2e/apps/react-native-oidc/auth.ts +++ b/e2e/apps/react-native-oidc/auth.ts @@ -2,8 +2,6 @@ import { fetch as expoFetch, FetchResponse } from 'expo/fetch'; import Constants from 'expo-constants'; import { OAuth2Client } from '@okta/auth-foundation/core'; -console.log('fetch: ', fetch); -console.log('Res.json', Response.json); export const client = new OAuth2Client({ baseURL: Constants?.expoConfig?.extra?.env.ISSUER, @@ -25,57 +23,4 @@ export const client = new OAuth2Client({ console.log(response.body); return response; } -}, -// { -// // fetchImpl: async (input: string | URL | Request, init?: RequestInit) => { -// // // const { body, ...rest } = { body: undefined, ...init }; -// // // const request = input instanceof Request ? input : new Request(input, rest); -// // const request = input instanceof Request ? input : new Request(input, init); -// // // TODO: expand additional request options -// // const { url, method, headers } = request; -// // console.log('url', url); -// // // console.log('body', request.body, init?.body) - -// // //console.log('typeof body', typeof body, typeof request.body); -// // // const response = await expoFetch(url, { method, headers, body: body === null ? undefined: body }); -// // // const json = await response.json(); -// // // const { status, statusText } = response; -// // // console.log(Response); -// // // return Response.json(json, { status, statusText, headers: response.headers }); - -// // const response = await expoFetch(url, { method, headers }); -// // console.log('typeof response', response instanceof Response); -// // if (method.toLocaleUpperCase() === 'POST') { -// // console.log('post request') -// // const body = await response.json(); -// // console.log(body); -// // } -// // return response; - -// // // const request = input instanceof Request ? input : new Request(input, init); -// // // if (request.body && request.body instanceof URLSearchParams) { -// // // request.body = request.body.toString(); -// // // } -// // }, - - -// // NOTE: this isn't doing anything. The problem seems to be within `URLSearchParams` -// // passing it directly to `fetch` wasn't converting the body to the correct format. -// // directly calling `body: params.toString()` seems to be working fine for now -// // (Fix in oauth2-flows/AuthCodeFlow/prepare) - -// fetchImpl: async (input: string | URL | Request, init?: RequestInit) => { -// // const { body, ...rest } = { body: undefined, ...init }; -// // const request = input instanceof Request ? input : new Request(input, rest); -// const request = input instanceof Request ? input : new Request(input, init); -// console.log('request', request); -// console.log('url: ', request.url); -// console.log('bdoy: ', typeof request.body, request.body instanceof URLSearchParams); -// console.log('body', request.body) -// // const { url, body, method, headers } = request; -// const response = await fetch(request); -// console.log(response.body); -// return response; -// } -// } -); +}); diff --git a/e2e/apps/react-native-oidc/components/ui/TabBarBackground.ios.tsx b/e2e/apps/react-native-oidc/components/ui/TabBarBackground.ios.tsx index 86e5425..495b2d4 100644 --- a/e2e/apps/react-native-oidc/components/ui/TabBarBackground.ios.tsx +++ b/e2e/apps/react-native-oidc/components/ui/TabBarBackground.ios.tsx @@ -15,10 +15,5 @@ export default function BlurTabBarBackground() { } export function useBottomTabOverflow() { - try { - return useBottomTabBarHeight(); - } - catch { - return 0; - } + return useBottomTabBarHeight(); } diff --git a/e2e/apps/react-native-oidc/index.js b/e2e/apps/react-native-oidc/index.js index 8711174..0587980 100644 --- a/e2e/apps/react-native-oidc/index.js +++ b/e2e/apps/react-native-oidc/index.js @@ -1,37 +1,14 @@ import '@expo/metro-runtime'; import 'expo-router/entry'; -// Import auth-foundation which auto-registers platform defaults -console.log('[index.js] Loading...'); -// import * as AuthFoundation from '@okta/auth-foundation'; import '@okta/auth-foundation'; -console.log('[index.js] auth-foundation loaded'); import { Platform } from '@okta/auth-foundation'; -console.log("Platform loaded:", Platform); -console.log("TimeCoordinator:", Platform.TimeCoordinator); -console.log("TimeCoordinator type:", typeof Platform.TimeCoordinator); -console.log("TimeCoordinator keys:", Object.keys(Platform.TimeCoordinator)); -console.log("TimeCoordinator.now type:", typeof Platform.TimeCoordinator?.now); - -// Try to call now() and log the error -try { - const now = Platform.TimeCoordinator.now(); - console.log("now() result:", now); -} catch (e) { - console.error("Error calling now():", e); - console.error("TimeCoordinator full:", JSON.stringify(Platform.TimeCoordinator, null, 2)); -} - -console.log('Plat', Platform, Platform.TimeCoordinator) - // Install WebCrypto polyfill import { installWebCryptoPolyfill } from '@okta/react-native-webcrypto-bridge'; installWebCryptoPolyfill(); - console.log('Plat', Platform, Platform.TimeCoordinator) - console.log("globalThis.crypto", globalThis.crypto); // global.crypto = global.crypto ?? globalThis.crypto; diff --git a/packages/auth-foundation/src/Token.ts b/packages/auth-foundation/src/Token.ts index bad20cc..ab885a0 100644 --- a/packages/auth-foundation/src/Token.ts +++ b/packages/auth-foundation/src/Token.ts @@ -109,11 +109,6 @@ export class Token implements JSONSerializable, Expires, RequestAuthorizer { * The constructor of Token */ constructor (obj: TokenInit) { - console.log('[Token constructor] About to access Platform.TimeCoordinator'); - console.log('[Token constructor] Platform instance:', Platform); - console.log('[Token constructor] Platform.TimeCoordinator:', Platform.TimeCoordinator); - - const id = obj?.id ?? shortID(); this.id = id; this.issuedAt = obj?.issuedAt ? new Date(obj?.issuedAt) : Platform.TimeCoordinator.now().asDate; diff --git a/packages/auth-foundation/src/core.ts b/packages/auth-foundation/src/core.ts index 008e7fb..a9a02c4 100644 --- a/packages/auth-foundation/src/core.ts +++ b/packages/auth-foundation/src/core.ts @@ -2,7 +2,6 @@ * @module Core */ -console.log('auth-foundation imported'); // types export * from './types/index.ts'; diff --git a/packages/auth-foundation/src/index.ts b/packages/auth-foundation/src/index.ts index 1a6a56c..0f04317 100644 --- a/packages/auth-foundation/src/index.ts +++ b/packages/auth-foundation/src/index.ts @@ -8,13 +8,10 @@ import { Platform } from './platform/Platform.ts'; // eslint-disable-next-line no-restricted-imports import { PlatformDefaults } from './platform/defaults.ts'; -console.log('main index imported') /** * @internal * Registers all default implementations of Platform dependencies. This will include them all in any * output bundle. Use `core.ts` if this is undesirable. */ -console.log('[auth-foundation/index.ts] Before Platform registration'); Platform.registerDefaultsLoader(() => PlatformDefaults); -console.log('[auth-foundation/index.ts] After Platform registration'); diff --git a/packages/auth-foundation/src/oauth2/client.ts b/packages/auth-foundation/src/oauth2/client.ts index 5c95005..751ac27 100644 --- a/packages/auth-foundation/src/oauth2/client.ts +++ b/packages/auth-foundation/src/oauth2/client.ts @@ -115,7 +115,7 @@ export class OAuth2Client e if (parsedDate.toString() !== 'Invalid Date') { const serverTime = Timestamp.from(parsedDate); const skew = Math.round(serverTime.timeSince(Date.now() / 1000)); - // Platform.TimeCoordinator.clockSkew = skew; + Platform.TimeCoordinator.clockSkew = skew; } } } diff --git a/packages/auth-foundation/src/platform/Platform.ts b/packages/auth-foundation/src/platform/Platform.ts index 3e8f55b..4dca311 100644 --- a/packages/auth-foundation/src/platform/Platform.ts +++ b/packages/auth-foundation/src/platform/Platform.ts @@ -91,9 +91,7 @@ export class PlatformRegistry implements PlatformDependencies { * ``` */ public registerDefaultsLoader(loader: () => PlatformDependencies): void { - console.log('[Platform.registerDefaultsLoader] Called. Instance:', this); this.#defaultsLoader = loader; - console.log('[Platform.registerDefaultsLoader] Loader set:', !!this.#defaultsLoader); } /** @@ -117,16 +115,12 @@ export class PlatformRegistry implements PlatformDependencies { * Override in subclasses to provide platform-specific defaults */ protected getDefaults (): PlatformDependencies { - console.log('[Platform.getDefaults] Called. Loader exists:', !!this.#defaultsLoader); if (!this.#defaultsLoader) { throw new PlatformRegistryError( `No platform defaults available. Import from "@okta/auth-foundation" directly or call Platform.registerDefaultsLoader()` ); } - // return this.#defaultsLoader(); - const defaults = this.#defaultsLoader(); - console.log('[Platform.getDefaults] Returning defaults:', defaults); - return defaults; + return this.#defaultsLoader(); } /** @@ -136,7 +130,6 @@ export class PlatformRegistry implements PlatformDependencies { * Returns configured override or factory default */ public get TimeCoordinator (): TimeCoordinator { - console.log('[Platform.TimeCoordinator] Accessing TimeCoordinator. Resolved:', this.resolved); return this.resolved.TimeCoordinator; } From 572e58904016497c120aa68bb62bf419f854b244 Mon Sep 17 00:00:00 2001 From: Jared Perreault Date: Wed, 25 Mar 2026 13:57:35 -0400 Subject: [PATCH 12/22] progress: WORKING --- .../react-native-oidc/app/(login)/index.tsx | 41 +- .../react-native-oidc/app/(login)/token.tsx | 2 + e2e/apps/react-native-oidc/auth.ts | 4 +- e2e/apps/react-native-oidc/package.json | 1 + .../ios/WebCryptoBridge.swift | 132 +++-- .../src/WebCryptoPolyfill.ts | 5 +- yarn.lock | 537 +++++++++++++++++- 7 files changed, 660 insertions(+), 62 deletions(-) diff --git a/e2e/apps/react-native-oidc/app/(login)/index.tsx b/e2e/apps/react-native-oidc/app/(login)/index.tsx index 13dcace..e3fd92d 100644 --- a/e2e/apps/react-native-oidc/app/(login)/index.tsx +++ b/e2e/apps/react-native-oidc/app/(login)/index.tsx @@ -1,5 +1,5 @@ -import { useEffect } from 'react'; -import { StyleSheet } from 'react-native'; +import { useCallback, useEffect, useState } from 'react'; +import { StyleSheet, Button } from 'react-native'; import { Image } from 'expo-image'; import Constants from 'expo-constants'; import { useAuth } from '@/hooks/useAuth'; @@ -12,12 +12,42 @@ import { HelloWave } from '@/components/HelloWave'; export default function LoginScreen () { const { signIn } = useAuth(); + const [ authError, setAuthError ] = useState(null); + + const signInFunc = useCallback(async () => { + try { + await signIn('/(login)/token'); + } + catch (err) { + setAuthError(err as Error); + } + }, [signIn, setAuthError]); useEffect(() => { (async () => { - await signIn('/(login)/token'); + await signInFunc(); })(); - }, [signIn]); + }, [signInFunc]); + + let view = ( + <> + Loading... + + + ); + + if (authError) { + view = ( + <> + Error + {authError.message} +