diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 4914875..e3507d1 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -34,20 +34,6 @@ jobs: working-directory: app run: yarn install --immutable - - name: Cache bcsc-core build output - uses: actions/cache@v3 - with: - path: packages/bcsc-core/lib - # Cache will be invalidated if any source file changes - key: ${{ runner.os }}-bcsc-core-build-${{ hashFiles('packages/bcsc-core/src/**') }} - restore-keys: | - ${{ runner.os }}-bcsc-core-build- - - # Note: The `bcsc-core` package must be built before type checking. - - name: Build bcsc-core - working-directory: packages/bcsc-core - run: yarn build - - name: Check style working-directory: app run: | @@ -58,12 +44,9 @@ jobs: working-directory: app run: yarn lint - # TEMPORARILY DISABLED: TypeScript check - # TODO: Re-enable after fixing theme.ts type errors in separate PR - # - name: Check types - # working-directory: app - # # Note: To pass the type check, the `bcsc-core` package must be built first. - # run: yarn typecheck + - name: Check types + working-directory: app + run: yarn typecheck test: runs-on: ubuntu-22.04 diff --git a/.gitignore b/.gitignore index 23a1687..098aa2e 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,9 @@ aries-oca-bundles/ credo-ts/ app/vendor/ +# Android native build cache +app/android/app/.cxx/ + # Android keystore release.keystore *.keystore.old diff --git a/.yarn/patches/@animo-id-expo-secure-environment-npm-0.1.5-3c2a8f1b94.patch b/.yarn/patches/@animo-id-expo-secure-environment-npm-0.1.5-3c2a8f1b94.patch new file mode 100644 index 0000000..2628a93 --- /dev/null +++ b/.yarn/patches/@animo-id-expo-secure-environment-npm-0.1.5-3c2a8f1b94.patch @@ -0,0 +1,18 @@ +diff --git a/android/build.gradle b/android/build.gradle +index cde6a970a43cc930546e59a80e8716a0980bc503..f7dc11cd461beedda314f3700dc42623d82a4029 100644 +--- a/android/build.gradle ++++ b/android/build.gradle +@@ -40,6 +40,13 @@ + lintOptions { + abortOnError false + } ++ compileOptions { ++ sourceCompatibility JavaVersion.VERSION_17 ++ targetCompatibility JavaVersion.VERSION_17 ++ } ++ kotlinOptions { ++ jvmTarget = "17" ++ } + } + + dependencies { diff --git a/.yarn/patches/@credo-ts-anoncreds-npm-0.5.17-9f101d8e96.patch b/.yarn/patches/@credo-ts-anoncreds-npm-0.5.17-9f101d8e96.patch deleted file mode 100644 index 656cc45..0000000 --- a/.yarn/patches/@credo-ts-anoncreds-npm-0.5.17-9f101d8e96.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff --git a/build/utils/proofRequest.js b/build/utils/proofRequest.js -index f4ce51a890f0ac41ed1d9806f0350a2114890625..10d02bd809b4e6311618664b0ec4ad0ada8034dc 100644 ---- a/build/utils/proofRequest.js -+++ b/build/utils/proofRequest.js -@@ -7,12 +7,27 @@ function proofRequestUsesUnqualifiedIdentifiers(proofRequest) { - return [ - ...Object.values(proofRequest.requested_attributes), - ...Object.values(proofRequest.requested_predicates), -- ].some((attribute) => attribute.restrictions?.some((restriction) => (restriction.cred_def_id && (0, indyIdentifiers_1.isUnqualifiedCredentialDefinitionId)(restriction.cred_def_id)) || -- (restriction.schema_id && (0, indyIdentifiers_1.isUnqualifiedSchemaId)(restriction.schema_id)) || -- (restriction.issuer_did && (0, indyIdentifiers_1.isUnqualifiedIndyDid)(restriction.issuer_did)) || -- (restriction.issuer_id && (0, indyIdentifiers_1.isUnqualifiedIndyDid)(restriction.issuer_id)) || -- (restriction.schema_issuer_did && (0, indyIdentifiers_1.isUnqualifiedIndyDid)(restriction.schema_issuer_did)) || -- (restriction.schema_issuer_id && (0, indyIdentifiers_1.isUnqualifiedIndyDid)(restriction.schema_issuer_id)) || -- (restriction.rev_reg_id && (0, indyIdentifiers_1.isUnqualifiedRevocationRegistryId)(restriction.rev_reg_id)))); -+ ].some((attribute) => { -+ var _a; -+ return (_a = attribute.restrictions) === null || _a === void 0 ? void 0 : _a.some((restriction) => ( -+ // no qualified identifiers -+ !restriction.cred_def_id && -+ !restriction.schema_id && -+ !restriction.issuer_did && -+ !restriction.issuer_id && -+ !restriction.schema_issuer_did && -+ !restriction.schema_issuer_id && -+ !restriction.rev_reg_id -+ ) || -+ // any unqualified identifiers -+ (restriction.cred_def_id && (0, indyIdentifiers_1.isUnqualifiedCredentialDefinitionId)(restriction.cred_def_id)) || -+ (restriction.schema_id && (0, indyIdentifiers_1.isUnqualifiedSchemaId)(restriction.schema_id)) || -+ (restriction.issuer_did && (0, indyIdentifiers_1.isUnqualifiedIndyDid)(restriction.issuer_did)) || -+ (restriction.issuer_id && (0, indyIdentifiers_1.isUnqualifiedIndyDid)(restriction.issuer_id)) || -+ (restriction.schema_issuer_did && (0, indyIdentifiers_1.isUnqualifiedIndyDid)(restriction.schema_issuer_did)) || -+ (restriction.schema_issuer_id && (0, indyIdentifiers_1.isUnqualifiedIndyDid)(restriction.schema_issuer_id)) || -+ (restriction.rev_reg_id && (0, indyIdentifiers_1.isUnqualifiedRevocationRegistryId)(restriction.rev_reg_id)) -+ ) -+ }) - } - //# sourceMappingURL=proofRequest.js.map -\ No newline at end of file diff --git a/.yarn/patches/@credo-ts-core-npm-0.5.17-c528a69dd8.patch b/.yarn/patches/@credo-ts-core-npm-0.5.17-c528a69dd8.patch deleted file mode 100644 index 6c413d5..0000000 --- a/.yarn/patches/@credo-ts-core-npm-0.5.17-c528a69dd8.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/build/modules/dif-presentation-exchange/DifPresentationExchangeService.js b/build/modules/dif-presentation-exchange/DifPresentationExchangeService.js -index f1723e774dc337b8ceae11cf5765d222fd07ea24..556fcef6877b0248134182551e6b46ebe9a758e4 100644 ---- a/build/modules/dif-presentation-exchange/DifPresentationExchangeService.js -+++ b/build/modules/dif-presentation-exchange/DifPresentationExchangeService.js -@@ -177,7 +177,18 @@ let DifPresentationExchangeService = class DifPresentationExchangeService { - presentationSubmission.descriptor_map.push(...descriptorMap); - }); - return { -- verifiablePresentations: verifiablePresentationResultsWithFormat.flatMap((resultWithFormat) => resultWithFormat.verifiablePresentationResult.verifiablePresentations.map((vp) => (0, utils_2.getVerifiablePresentationFromEncoded)(agentContext, vp))), -+ verifiablePresentations: verifiablePresentationResultsWithFormat.flatMap((resultWithFormat) => { -+ if (resultWithFormat.verifiablePresentationResult.verifiablePresentations) { -+ return resultWithFormat.verifiablePresentationResult.verifiablePresentations.map((vp) => -+ (0, utils_2.getVerifiablePresentationFromEncoded)(agentContext, vp) -+ ) -+ } else { -+ return (0, utils_2.getVerifiablePresentationFromEncoded)( -+ agentContext, -+ resultWithFormat.verifiablePresentationResult.verifiablePresentation -+ ) -+ } -+ }), - presentationSubmission, - presentationSubmissionLocation: verifiablePresentationResultsWithFormat[0].verifiablePresentationResult.presentationSubmissionLocation, - }; diff --git a/.yarn/patches/@credo-ts-core-npm-0.6.3-28b59086b0.patch b/.yarn/patches/@credo-ts-core-npm-0.6.3-28b59086b0.patch new file mode 100644 index 0000000..88a098e --- /dev/null +++ b/.yarn/patches/@credo-ts-core-npm-0.6.3-28b59086b0.patch @@ -0,0 +1,69 @@ +diff --git a/build/modules/vc/models/credential/W3cCredential.d.mts b/build/modules/vc/models/credential/W3cCredential.d.mts +index 6ecceb006c81a8f7dba8500b18e217c3d6b8c192..6df40bc454dec759ac878f20cb4eec9e74b742d0 100644 +--- a/build/modules/vc/models/credential/W3cCredential.d.mts ++++ b/build/modules/vc/models/credential/W3cCredential.d.mts +@@ -10,7 +10,7 @@ interface W3cCredentialOptions { + id?: string; + type: Array; + issuer: string | W3cIssuerOptions; +- issuanceDate: string; ++ issuanceDate?: string; + expirationDate?: string; + credentialSubject: SingleOrArray; + credentialStatus?: W3cCredentialStatus; +@@ -22,7 +22,7 @@ declare class W3cCredential { + id?: string; + type: Array; + issuer: string | W3cIssuer; +- issuanceDate: string; ++ issuanceDate?: string; + expirationDate?: string; + credentialSubject: SingleOrArray; + credentialSchema?: SingleOrArray; +diff --git a/build/modules/vc/models/credential/W3cCredential.mjs b/build/modules/vc/models/credential/W3cCredential.mjs +index f3ad42c21d31e28b0f297416f17d7e560454082d..783cae8b47016777ac82d96f599319e8cfd63b3d 100644 +--- a/build/modules/vc/models/credential/W3cCredential.mjs ++++ b/build/modules/vc/models/credential/W3cCredential.mjs +@@ -66,7 +66,13 @@ __decorate([ + IsW3cIssuer(), + __decorateMetadata("design:type", Object) + ], W3cCredential.prototype, "issuer", void 0); +-__decorate([IsRFC3339(), __decorateMetadata("design:type", String)], W3cCredential.prototype, "issuanceDate", void 0); ++// KEYRING PATCH (VCDM 2.0): issuanceDate is v1.1-only; VCDM 2.0 credentials ++// use validFrom instead, so the property must be optional to accept them. ++__decorate([ ++ IsRFC3339(), ++ IsOptional(), ++ __decorateMetadata("design:type", String) ++], W3cCredential.prototype, "issuanceDate", void 0); + __decorate([ + IsRFC3339(), + IsOptional(), +diff --git a/build/modules/vc/validators.mjs b/build/modules/vc/validators.mjs +index 1dc281ee34c7ee80285bf99008d2fa2bd85ef0e2..4fe87ad71253a0af11cae2f52be8f8eb8a041b8c 100644 +--- a/build/modules/vc/validators.mjs ++++ b/build/modules/vc/validators.mjs +@@ -5,15 +5,21 @@ import { CREDENTIALS_CONTEXT_V1_URL, VERIFIABLE_CREDENTIAL_TYPE, VERIFIABLE_PRES + import { ValidateBy, buildMessage, isString, isURL } from "class-validator"; + + //#region src/modules/vc/validators.ts ++// KEYRING PATCH (VCDM 2.0 over DIDComm JSON-LD): also accept the VCDM 2.0 ++// context URL as the first @context entry, so v2-context credentials can be ++// parsed/validated by the v1 W3cCredential model used by the DIDComm jsonld ++// credential format. See https://www.w3.org/TR/vc-data-model-2.0/ ++const CREDENTIALS_CONTEXT_V2_URL_PATCH = "https://www.w3.org/ns/credentials/v2"; + function IsCredentialJsonLdContext(validationOptions) { + const allowString = validationOptions?.allowString ?? false; + const credentialContext = validationOptions?.credentialContext ?? CREDENTIALS_CONTEXT_V1_URL; ++ const acceptedContexts = credentialContext === CREDENTIALS_CONTEXT_V1_URL ? [CREDENTIALS_CONTEXT_V1_URL, CREDENTIALS_CONTEXT_V2_URL_PATCH] : [credentialContext]; + return ValidateBy({ + name: "IsCredentialJsonLdContext", + validator: { + validate: (value) => { +- if (!Array.isArray(value)) return allowString && isString(value) && value === credentialContext; +- if (value[0] !== credentialContext) return false; ++ if (!Array.isArray(value)) return allowString && isString(value) && acceptedContexts.includes(value); ++ if (!acceptedContexts.includes(value[0])) return false; + return value.every((v) => isString(v) && isURL(v) || isJsonObject(v)); + }, + defaultMessage: buildMessage((eachPrefix) => `${eachPrefix}$property must be an array of strings or objects, where the first item is the verifiable credential context URL.`, validationOptions) diff --git a/.yarn/patches/@credo-ts-didcomm-npm-0.6.3-b3cbe5f2a8.patch b/.yarn/patches/@credo-ts-didcomm-npm-0.6.3-b3cbe5f2a8.patch new file mode 100644 index 0000000..9e3a04f --- /dev/null +++ b/.yarn/patches/@credo-ts-didcomm-npm-0.6.3-b3cbe5f2a8.patch @@ -0,0 +1,83 @@ +diff --git a/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialDetailOptions.d.mts b/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialDetailOptions.d.mts +index 1175bf65bbd5328b3dc3c08d6bfbba65e460c949..286beea925df63ee4303800f355c4989f9411b44 100644 +--- a/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialDetailOptions.d.mts ++++ b/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialDetailOptions.d.mts +@@ -13,6 +13,7 @@ interface DidCommJsonLdCredentialDetailOptionsOptions { + challenge?: string; + credentialStatus?: DidCommJsonLdCredentialDetailCredentialStatus; + proofType: string; ++ cryptosuite?: string; + } + declare class DidCommJsonLdCredentialDetailOptions { + constructor(options: DidCommJsonLdCredentialDetailOptionsOptions); +@@ -21,6 +22,7 @@ declare class DidCommJsonLdCredentialDetailOptions { + domain?: string; + challenge?: string; + proofType: string; ++ cryptosuite?: string; + credentialStatus?: DidCommJsonLdCredentialDetailCredentialStatus; + } + //#endregion +diff --git a/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialDetailOptions.mjs b/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialDetailOptions.mjs +index 16e977f4701e036b2d67b147c6bc4fb921256afa..96a2185d1c41642fc323be053cbc4eedb18439a4 100644 +--- a/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialDetailOptions.mjs ++++ b/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialDetailOptions.mjs +@@ -19,6 +19,10 @@ var DidCommJsonLdCredentialDetailOptions = class { + this.challenge = options.challenge; + this.credentialStatus = options.credentialStatus; + this.proofType = options.proofType; ++ // KEYRING PATCH (Data Integrity): DataIntegrityProof proofs carry the ++ // concrete algorithm in proof.cryptosuite; the request options must be ++ // able to pin it (docs/CRYPTO_SUITE_FOLLOWUP.md, Decision 5 Option B). ++ this.cryptosuite = options.cryptosuite; + } + } + }; +@@ -39,6 +43,11 @@ __decorate([ + __decorateMetadata("design:type", String) + ], DidCommJsonLdCredentialDetailOptions.prototype, "challenge", void 0); + __decorate([IsString(), __decorateMetadata("design:type", String)], DidCommJsonLdCredentialDetailOptions.prototype, "proofType", void 0); ++__decorate([ ++ IsString(), ++ IsOptional(), ++ __decorateMetadata("design:type", String) ++], DidCommJsonLdCredentialDetailOptions.prototype, "cryptosuite", void 0); + __decorate([ + IsOptional(), + IsObject(), +diff --git a/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialFormat.d.mts b/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialFormat.d.mts +index f6c655038122a044377ee872e4d5b17a6c1bbd89..0c759a06544dc17151c583e00e1a437add1dd884 100644 +--- a/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialFormat.d.mts ++++ b/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialFormat.d.mts +@@ -20,6 +20,7 @@ interface DidCommJsonLdCredentialDetailFormat { + options: { + proofPurpose: string; + proofType: string; ++ cryptosuite?: string; + }; + } + type EmptyObject = Record; +@@ -81,6 +82,7 @@ interface JsonLdFormatDataCredentialDetail { + interface JsonLdFormatDataCredentialDetailOptions { + proofPurpose: string; + proofType: string; ++ cryptosuite?: string; + created?: string; + domain?: string; + challenge?: string; +diff --git a/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialFormatService.mjs b/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialFormatService.mjs +index ef75c086b244014c31cbaa5ef3ca3d83f0b96507..64af8e41977562d2b64e93acbb733e85a767defc 100644 +--- a/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialFormatService.mjs ++++ b/build/modules/credentials/formats/jsonld/DidCommJsonLdCredentialFormatService.mjs +@@ -188,6 +188,11 @@ var DidCommJsonLdCredentialFormatService = class { + if (credential.proof.domain !== request.options.domain) throw new CredoError("Received credential proof domain does not match domain from credential request"); + if (credential.proof.challenge !== request.options.challenge) throw new CredoError("Received credential proof challenge does not match challenge from credential request"); + if (credential.proof.type !== request.options.proofType) throw new CredoError("Received credential proof type does not match proof type from credential request"); ++ // KEYRING PATCH (Data Integrity): when the request pins a cryptosuite ++ // (DataIntegrityProof), the received proof must carry the same one. ++ // Absent option (Ed25519Signature2018 path) keeps type-only matching ++ // (docs/CRYPTO_SUITE_FOLLOWUP.md, Decision 5 Option B). ++ if (request.options.cryptosuite !== void 0 && credential.proof.cryptosuite !== request.options.cryptosuite) throw new CredoError("Received credential proof cryptosuite does not match cryptosuite from credential request"); + if (credential.proof.proofPurpose !== request.options.proofPurpose) throw new CredoError("Received credential proof purpose does not match proof purpose from credential request"); + if (!utils.areObjectsEqual(jsonCredential, request.credential)) throw new CredoError("Received credential does not match credential request"); + } diff --git a/.yarn/patches/@credo-ts-indy-vdr-npm-0.5.17-aa0b05041f.patch b/.yarn/patches/@credo-ts-indy-vdr-npm-0.5.17-aa0b05041f.patch deleted file mode 100644 index ee9f0dc..0000000 --- a/.yarn/patches/@credo-ts-indy-vdr-npm-0.5.17-aa0b05041f.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/build/pool/IndyVdrPool.js b/build/pool/IndyVdrPool.js -index 7c157d6754dcba7526100f67dbed3c86b335b0cc..56437364edcb3d16e998fb4766d7b14cae63430f 100644 ---- a/build/pool/IndyVdrPool.js -+++ b/build/pool/IndyVdrPool.js -@@ -17,7 +17,7 @@ class IndyVdrPool { - } - connect() { - if (this._pool) { -- throw new error_1.IndyVdrError('Cannot connect to pool, already connected.'); -+ return; - } - this._pool = new indy_vdr_shared_1.PoolCreate({ - parameters: { diff --git a/.yarn/patches/@credo-ts-react-native-npm-0.6.3-secure-environment-biometrics.patch b/.yarn/patches/@credo-ts-react-native-npm-0.6.3-secure-environment-biometrics.patch new file mode 100644 index 0000000..534f5e5 --- /dev/null +++ b/.yarn/patches/@credo-ts-react-native-npm-0.6.3-secure-environment-biometrics.patch @@ -0,0 +1,68 @@ +diff --git a/build/kms/SecureEnvironmentKeyManagementService.d.mts b/build/kms/SecureEnvironmentKeyManagementService.d.mts +index a24147575a9e37473c63d112d7bb64c79dceaa54..7ff91e5712fed3d4ae4da49d6d7fe54c338e8ba9 100644 +--- a/build/kms/SecureEnvironmentKeyManagementService.d.mts ++++ b/build/kms/SecureEnvironmentKeyManagementService.d.mts +@@ -1,22 +1,27 @@ + import { AgentContext, Kms } from "@credo-ts/core"; + + //#region src/kms/SecureEnvironmentKeyManagementService.d.ts ++interface SecureEnvironmentKeyManagementServiceOptions { ++ biometricsBacked?: boolean; ++} + declare class SecureEnvironmentKeyManagementService implements Kms.KeyManagementService { + readonly backend = "secureEnvironment"; + private readonly secureEnvironment; ++ private readonly options; ++ constructor(options?: SecureEnvironmentKeyManagementServiceOptions); + isOperationSupported(_agentContext: AgentContext, operation: Kms.KmsOperation): boolean; + randomBytes(_agentContext: AgentContext, _options: Kms.KmsRandomBytesOptions): Kms.KmsRandomBytesReturn; + getPublicKey(_agentContext: AgentContext, keyId: string): Promise; + importKey(): Promise>; + deleteKey(_agentContext: AgentContext, options: Kms.KmsDeleteKeyOptions): Promise; + encrypt(): Promise; + decrypt(): Promise; + createKey(_agentContext: AgentContext, options: Kms.KmsCreateKeyOptions): Promise; + sign(_agentContext: AgentContext, options: Kms.KmsSignOptions): Promise; + verify(): Promise; + private publicJwkFromPublicKeyBytes; + private getKeyAsserted; + } + //#endregion +-export { SecureEnvironmentKeyManagementService }; ++export { SecureEnvironmentKeyManagementService, type SecureEnvironmentKeyManagementServiceOptions }; + //# sourceMappingURL=SecureEnvironmentKeyManagementService.d.mts.map +diff --git a/build/kms/SecureEnvironmentKeyManagementService.mjs b/build/kms/SecureEnvironmentKeyManagementService.mjs +index 45aa862698d9d3e164c36d5b61b5977282981983..23d58743281711002c2425d39f0ab1d976d5d911 100644 +--- a/build/kms/SecureEnvironmentKeyManagementService.mjs ++++ b/build/kms/SecureEnvironmentKeyManagementService.mjs +@@ -3,10 +3,11 @@ import { Kms, utils } from "@credo-ts/core"; + + //#region src/kms/SecureEnvironmentKeyManagementService.ts + var SecureEnvironmentKeyManagementService = class { +- constructor() { ++ constructor(options = {}) { + this.backend = "secureEnvironment"; + this.secureEnvironment = importSecureEnvironment(); ++ this.options = { biometricsBacked: true, ...options }; + } + isOperationSupported(_agentContext, operation) { + if (operation.operation === "createKey") return operation.type.kty === "EC" && operation.type.crv === "P-256"; + if (operation.operation === "sign") return operation.algorithm === "ES256"; +@@ -49,7 +50,7 @@ var SecureEnvironmentKeyManagementService = class { + const keyId = options.keyId ?? utils.uuid(); + const secureEnvironment = await this.secureEnvironment; + try { +- await secureEnvironment.generateKeypair(keyId); ++ await secureEnvironment.generateKeypair(keyId, this.options.biometricsBacked); + return { + keyId, + publicJwk: await this.getKeyAsserted(keyId) +@@ -64,7 +65,7 @@ var SecureEnvironmentKeyManagementService = class { + if (options.algorithm !== "ES256") throw new Kms.KeyManagementAlgorithmNotSupportedError(`algorithm '${options.algorithm}'. Only 'ES256' supported.`, this.backend); + const secureEnvironment = await this.secureEnvironment; + try { +- return { signature: await secureEnvironment.sign(options.keyId, options.data) }; ++ return { signature: await secureEnvironment.sign(options.keyId, new Uint8Array(options.data), this.options.biometricsBacked) }; + } catch (error) { + if (error instanceof secureEnvironment.KeyNotFoundError) throw new Kms.KeyManagementKeyNotFoundError(options.keyId, [this.backend]); + throw new Kms.KeyManagementError("Error signing with key", { cause: error }); diff --git a/.yarn/patches/@hyperledger-indy-vdr-react-native-npm-0.2.2-627d424b96.patch b/.yarn/patches/@hyperledger-indy-vdr-react-native-npm-0.2.2-627d424b96.patch deleted file mode 100644 index 8555e52..0000000 --- a/.yarn/patches/@hyperledger-indy-vdr-react-native-npm-0.2.2-627d424b96.patch +++ /dev/null @@ -1,173 +0,0 @@ -diff --git a/android/build.gradle b/android/build.gradle -index 9017d77eb32573415c7922cd83dae5cd792a885f..083320b13d82925625e57b929387a20a6d42c841 100644 ---- a/android/build.gradle -+++ b/android/build.gradle -@@ -59,6 +59,10 @@ def getExt(name) { - return rootProject.ext.get(name) - } - -+def getExtWithFallback(prop, fallback) { -+ return rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback -+} -+ - def resolveBuildType() { - def buildType = "debug" - tasks.all({ task -> -@@ -81,7 +85,7 @@ android { - } - - defaultConfig { -- minSdkVersion 21 -+ minSdkVersion getExtWithFallback('minSdkVersion', '21') - targetSdkVersion getExt('targetSdkVersion') - - externalNativeBuild { -diff --git a/build/NativeBindings.d.ts b/build/NativeBindings.d.ts -index e3106250eb275f591ab53e42dc37cdf888d3406b..f3f2dcd9256d2addeeb4ce83afb3733c9d911f39 100644 ---- a/build/NativeBindings.d.ts -+++ b/build/NativeBindings.d.ts -@@ -11,6 +11,11 @@ export interface NativeBindings { - setCacheDirectory(options: { - path: string; - }): ReturnObject; -+ setLedgerTxnCache(options: { -+ capacity: number; -+ expiry_offset_ms: number; -+ path?: string; -+ }): ReturnObject; - setDefaultLogger(options: Record): ReturnObject; - setProtocolVersion(options: { - version: number; -diff --git a/build/ReactNativeIndyVdr.d.ts b/build/ReactNativeIndyVdr.d.ts -index 034c2d4527ef08eac1941ad784e497a948229ef1..b48eb78bc63c65641bbcf52dce713d4ad7a84a4f 100644 ---- a/build/ReactNativeIndyVdr.d.ts -+++ b/build/ReactNativeIndyVdr.d.ts -@@ -14,6 +14,11 @@ export declare class ReactNativeIndyVdr implements IndyVdr { - setCacheDirectory(options: { - path: string; - }): void; -+ setLedgerTxnCache(options: { -+ capacity: number; -+ expiry_offset_ms: number; -+ path?: string; -+ }): void; - setDefaultLogger(): void; - setProtocolVersion(options: { - version: number; -diff --git a/build/ReactNativeIndyVdr.js b/build/ReactNativeIndyVdr.js -index 16bdc5e8ee395295afa0ec255fee1e2c7a220c57..5fb112fa5df10aeffdd9d42a324702a6b25c3db1 100644 ---- a/build/ReactNativeIndyVdr.js -+++ b/build/ReactNativeIndyVdr.js -@@ -57,6 +57,10 @@ class ReactNativeIndyVdr { - const serializedOptions = (0, serialize_1.serializeArguments)(options); - this.indyVdr.setCacheDirectory(serializedOptions); - } -+ setLedgerTxnCache(options) { -+ const serializedOptions = (0, serialize_1.serializeArguments)(options); -+ this.indyVdr.setLedgerTxnCache(serializedOptions); -+ } - setDefaultLogger() { - this.handleError(this.indyVdr.setDefaultLogger({})); - } -diff --git a/build/ReactNativeIndyVdr.js.map b/build/ReactNativeIndyVdr.js.map -index 219c2d0156e6e3395061e41567831414c320e410..30fb92ec803052f901cf2858be8bda1569196a2c 100644 ---- a/build/ReactNativeIndyVdr.js.map -+++ b/build/ReactNativeIndyVdr.js.map -@@ -1 +1 @@ --{"version":3,"file":"ReactNativeIndyVdr.js","sourceRoot":"","sources":["../src/ReactNativeIndyVdr.ts"],"names":[],"mappings":";;;AAyCA,kEAAsF;AAEtF,2CAAgD;AAEhD,MAAa,kBAAkB;IAG7B,YAAmB,QAAwB;QAYnC,cAAS,GAAG,CAAC,MAA8B,EAAiB,EAAE;YACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,MAAM,GAAG,GAAa,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;oBACtC,IAAI,SAAS,KAAK,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;oBACnD,OAAO,EAAE,CAAA;gBACX,CAAC,CAAA;gBAED,MAAM,CAAC,GAAG,CAAC,CAAA;YACb,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAEO,0BAAqB,GAAG,CAC9B,MAAkD,EAClD,QAAQ,GAAG,KAAK,EACQ,EAAE;YAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,MAAM,EAAE,GAAyB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;oBACxD,IAAI,SAAS,KAAK,CAAC;wBAAE,MAAM,CAAC,IAAI,8BAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAuB,CAAC,CAAC,CAAA;oBAEvG,qFAAqF;oBACrF,kBAAkB;oBAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,EAAE;wBACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA;wBAE/E,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;wBACrD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAW,CAAC,CAAA;qBAC9C;yBAAM;wBACL,OAAO,CAAC,KAAe,CAAC,CAAA;qBACzB;gBACH,CAAC,CAAA;gBAED,MAAM,CAAC,EAAE,CAAC,CAAA;YACZ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QA5CC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAA;IACzB,CAAC;IAEO,WAAW,CAAI,EAAE,SAAS,EAAE,KAAK,EAAmB;QAC1D,IAAI,SAAS,KAAK,CAAC,EAAE;YACnB,MAAM,IAAI,8BAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAuB,CAAC,CAAA;SACjF;QAED,OAAO,KAAU,CAAA;IACnB,CAAC;IAqCM,eAAe;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACjC,CAAC;IAEM,SAAS,CAAC,OAA4C;QAC3D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC3C,CAAC;IAEM,iBAAiB,CAAC,OAAyB;QAChD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAA;IACnD,CAAC;IAEM,gBAAgB;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAA;IACrD,CAAC;IAEM,kBAAkB,CAAC,OAA4B;QACpD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACtE,CAAC;IAEM,aAAa,CAAC,OAA+B;QAClD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACjE,CAAC;IAEM,gCAAgC,CAAC,OAA2C;QACjF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,gCAAgC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACtH,CAAC;IAEM,mCAAmC,CAAC,OAA8C;QACvF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,mCAAmC,CAAC,iBAAiB,CAAC,CAAC,CACtF,CAAA;IACH,CAAC;IAEM,kBAAkB,CAAC,OAA6B;QACrD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,qBAAqB,CAAC,OAAgC;QAC3D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC3G,CAAC;IAEM,mBAAmB,CAAC,OAA2C;QACpE,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACzG,CAAC;IAEM,sBAAsB,CAAC,OAA8C;QAC1E,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC5G,CAAC;IAEM,0BAA0B,CAAC,OAAsD;QACtF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAChH,CAAC;IAEM,uBAAuB,CAAC,OAA4C;QACzE,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC7G,CAAC;IAEM,4BAA4B,CAAC,OAAiD;QACnF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAClH,CAAC;IAEM,uBAAuB,CAAC,OAAmD;QAChF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC7G,CAAC;IAEM,kBAAkB,CAAC,OAA6B;QACrD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,yCAAyC,CAC9C,OAA4D;QAE5D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,yCAAyC,CAAC,iBAAiB,CAAC,CAAC,CAC5F,CAAA;IACH,CAAC;IAEM,kBAAkB,CAAC,OAA6B;QACrD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,qBAAqB,CAAC,OAAgC;QAC3D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC3G,CAAC;IAEM,iCAAiC,CAAC,OAAoD;QAC3F,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,iCAAiC,CAAC,iBAAiB,CAAC,CAAC,CACpF,CAAA;IACH,CAAC;IAEM,kBAAkB,CAAC,OAAqC;QAC7D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,4BAA4B,CAAC,OAAsC;QACxE,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAClH,CAAC;IAEM,eAAe,CAAC,OAA0B;QAC/C,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACrG,CAAC;IAEM,yBAAyB,CAAC,OAA8C;QAC7E,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC/G,CAAC;IAEM,kBAAkB,CAAC,OAA6B;QACrD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,8BAA8B,CAAC,OAAiD;QACrF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACpH,CAAC;IAEM,UAAU,CAAC,OAA0B;QAC1C,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAChG,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,OAAmC;QAC1D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;IAC/F,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAmC;QAC5D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAS,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CACnH,CAAA;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAe,CAAA;IACzC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,OAAmC;QAClE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAe,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,CACnH,CAAA;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,OAAmC;QAC/D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAS,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,CACpG,CAAA;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAc,CAAA;IACxC,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,OAA6D;QAE7D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAS,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,iBAAG,EAAE,IAAK,iBAAiB,EAAG,CAAC,CAC9G,CAAA;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,CAAA;IAChC,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC5B,OAA8D;QAE9D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAS,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,iBAAG,EAAE,IAAK,iBAAiB,EAAG,CAAC,CAC/G,CAAA;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,CAAA;IAChC,CAAC;IAEM,SAAS,CAAC,OAA+B;QAC9C,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC3C,CAAC;IAEM,mCAAmC,CAAC,OAAmD;QAC5F,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,mCAAmC,CAAC,iBAAiB,CAAC,CAAC,CACtF,CAAA;IACH,CAAC;IAEM,WAAW,CAAC,OAAkC;QACnD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAA;IAC7C,CAAC;IAEM,cAAc,CAAC,OAAkC;QACtD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACzE,CAAC;IAEM,wBAAwB,CAAC,OAAkC;QAChE,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC9G,CAAC;IAEM,kBAAkB,CAAC,OAAqE;QAC7F,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;IACpD,CAAC;IAEM,wBAAwB,CAAC,OAA2E;QACzG,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAA;IAC1D,CAAC;IAEM,mBAAmB,CAAC,OAAsE;QAC/F,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;IACrD,CAAC;IAEM,sCAAsC,CAC3C,OAAyF;QAEzF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,sCAAsC,CAAC,iBAAiB,CAAC,CAAA;IACxE,CAAC;CACF;AA9SD,gDA8SC"} -\ No newline at end of file -+{"version":3,"file":"ReactNativeIndyVdr.js","sourceRoot":"","sources":["../src/ReactNativeIndyVdr.ts"],"names":[],"mappings":";;;AAyCA,kEAAsF;AAEtF,2CAAgD;AAEhD,MAAa,kBAAkB;IAG7B,YAAmB,QAAwB;QAYnC,cAAS,GAAG,CAAC,MAA8B,EAAiB,EAAE;YACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,MAAM,GAAG,GAAa,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;oBACtC,IAAI,SAAS,KAAK,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;oBACnD,OAAO,EAAE,CAAA;gBACX,CAAC,CAAA;gBAED,MAAM,CAAC,GAAG,CAAC,CAAA;YACb,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAEO,0BAAqB,GAAG,CAC9B,MAAkD,EAClD,QAAQ,GAAG,KAAK,EACQ,EAAE;YAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,MAAM,EAAE,GAAyB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;oBACxD,IAAI,SAAS,KAAK,CAAC;wBAAE,MAAM,CAAC,IAAI,8BAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAuB,CAAC,CAAC,CAAA;oBAEvG,qFAAqF;oBACrF,kBAAkB;oBAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,EAAE;wBACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA;wBAE/E,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;wBACrD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAW,CAAC,CAAA;qBAC9C;yBAAM;wBACL,OAAO,CAAC,KAAe,CAAC,CAAA;qBACzB;gBACH,CAAC,CAAA;gBAED,MAAM,CAAC,EAAE,CAAC,CAAA;YACZ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QA5CC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAA;IACzB,CAAC;IAEO,WAAW,CAAI,EAAE,SAAS,EAAE,KAAK,EAAmB;QAC1D,IAAI,SAAS,KAAK,CAAC,EAAE;YACnB,MAAM,IAAI,8BAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAuB,CAAC,CAAA;SACjF;QAED,OAAO,KAAU,CAAA;IACnB,CAAC;IAqCM,eAAe;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACjC,CAAC;IAEM,SAAS,CAAC,OAA4C;QAC3D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC3C,CAAC;IAEM,iBAAiB,CAAC,OAAyB;QAChD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAA;IACnD,CAAC;IACM,iBAAiB,CAAC,OAAsE;QAC7F,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAA;IACnD,CAAC;IAEM,gBAAgB;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAA;IACrD,CAAC;IAEM,kBAAkB,CAAC,OAA4B;QACpD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACtE,CAAC;IAEM,aAAa,CAAC,OAA+B;QAClD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACjE,CAAC;IAEM,gCAAgC,CAAC,OAA2C;QACjF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,gCAAgC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACtH,CAAC;IAEM,mCAAmC,CAAC,OAA8C;QACvF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,mCAAmC,CAAC,iBAAiB,CAAC,CAAC,CACtF,CAAA;IACH,CAAC;IAEM,kBAAkB,CAAC,OAA6B;QACrD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,qBAAqB,CAAC,OAAgC;QAC3D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC3G,CAAC;IAEM,mBAAmB,CAAC,OAA2C;QACpE,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACzG,CAAC;IAEM,sBAAsB,CAAC,OAA8C;QAC1E,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC5G,CAAC;IAEM,0BAA0B,CAAC,OAAsD;QACtF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAChH,CAAC;IAEM,uBAAuB,CAAC,OAA4C;QACzE,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC7G,CAAC;IAEM,4BAA4B,CAAC,OAAiD;QACnF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAClH,CAAC;IAEM,uBAAuB,CAAC,OAAmD;QAChF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC7G,CAAC;IAEM,kBAAkB,CAAC,OAA6B;QACrD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,yCAAyC,CAC9C,OAA4D;QAE5D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,yCAAyC,CAAC,iBAAiB,CAAC,CAAC,CAC5F,CAAA;IACH,CAAC;IAEM,kBAAkB,CAAC,OAA6B;QACrD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,qBAAqB,CAAC,OAAgC;QAC3D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC3G,CAAC;IAEM,iCAAiC,CAAC,OAAoD;QAC3F,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,iCAAiC,CAAC,iBAAiB,CAAC,CAAC,CACpF,CAAA;IACH,CAAC;IAEM,kBAAkB,CAAC,OAAqC;QAC7D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,4BAA4B,CAAC,OAAsC;QACxE,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAClH,CAAC;IAEM,eAAe,CAAC,OAA0B;QAC/C,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACrG,CAAC;IAEM,yBAAyB,CAAC,OAA8C;QAC7E,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC/G,CAAC;IAEM,kBAAkB,CAAC,OAA6B;QACrD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACxG,CAAC;IAEM,8BAA8B,CAAC,OAAiD;QACrF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IACpH,CAAC;IAEM,UAAU,CAAC,OAA0B;QAC1C,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAChG,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,OAAmC;QAC1D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;IAC/F,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAmC;QAC5D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAS,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CACnH,CAAA;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAe,CAAA;IACzC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,OAAmC;QAClE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAe,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,CACnH,CAAA;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,OAAmC;QAC/D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAS,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,CACpG,CAAA;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAc,CAAA;IACxC,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,OAA6D;QAE7D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAS,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,iBAAG,EAAE,IAAK,iBAAiB,EAAG,CAAC,CAC9G,CAAA;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,CAAA;IAChC,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC5B,OAA8D;QAE9D,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAA,2CAAyB,EACtC,MAAM,IAAI,CAAC,qBAAqB,CAAS,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,iBAAG,EAAE,IAAK,iBAAiB,EAAG,CAAC,CAC/G,CAAA;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,CAAA;IAChC,CAAC;IAEM,SAAS,CAAC,OAA+B;QAC9C,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC3C,CAAC;IAEM,mCAAmC,CAAC,OAAmD;QAC5F,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,mCAAmC,CAAC,iBAAiB,CAAC,CAAC,CACtF,CAAA;IACH,CAAC;IAEM,WAAW,CAAC,OAAkC;QACnD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAA;IAC7C,CAAC;IAEM,cAAc,CAAC,OAAkC;QACtD,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACzE,CAAC;IAEM,wBAAwB,CAAC,OAAkC;QAChE,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,OAAO,IAAA,2CAAyB,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC9G,CAAC;IAEM,kBAAkB,CAAC,OAAqE;QAC7F,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;IACpD,CAAC;IAEM,wBAAwB,CAAC,OAA2E;QACzG,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAA;IAC1D,CAAC;IAEM,mBAAmB,CAAC,OAAsE;QAC/F,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;IACrD,CAAC;IAEM,sCAAsC,CAC3C,OAAyF;QAEzF,MAAM,iBAAiB,GAAG,IAAA,8BAAkB,EAAC,OAAO,CAAC,CAAA;QACrD,IAAI,CAAC,OAAO,CAAC,sCAAsC,CAAC,iBAAiB,CAAC,CAAA;IACxE,CAAC;CACF;AAlTD,gDAkTC"} -\ No newline at end of file -diff --git a/cpp/HostObject.cpp b/cpp/HostObject.cpp -index dca847963687111473125064c58c90b13f7c718b..c5c5e0a8227314809c31e6565bbecc7cce1c5478 100644 ---- a/cpp/HostObject.cpp -+++ b/cpp/HostObject.cpp -@@ -13,6 +13,7 @@ FunctionMap IndyVdrTurboModuleHostObject::functionMapping(jsi::Runtime &rt) { - fMap.insert(std::make_tuple("getCurrentError", &indyVdr::getCurrentError)); - fMap.insert(std::make_tuple("setConfig", &indyVdr::setConfig)); - fMap.insert(std::make_tuple("setCacheDirectory", &indyVdr::setCacheDirectory)); -+ fMap.insert(std::make_tuple("setLedgerTxnCache", &indyVdr::setLedgerTxnCache)); - fMap.insert(std::make_tuple("setDefaultLogger", &indyVdr::setDefaultLogger)); - fMap.insert( - std::make_tuple("setProtocolVersion", &indyVdr::setProtocolVersion)); -diff --git a/cpp/include/libindy_vdr.h b/cpp/include/libindy_vdr.h -index 7f61bb9faaa119ea74619c82937c8de838992c0a..6ce64ab2a429b940d117b664033f0e3369171eab 100644 ---- a/cpp/include/libindy_vdr.h -+++ b/cpp/include/libindy_vdr.h -@@ -481,6 +481,8 @@ ErrorCode indy_vdr_resolve(PoolHandle pool_handle, - - ErrorCode indy_vdr_set_cache_directory(FfiStr path); - -+ErrorCode indy_vdr_set_ledger_txn_cache(int32_t capacity, int64_t expiry_offset_ms, FfiStr path); -+ - ErrorCode indy_vdr_set_config(FfiStr config); - - ErrorCode indy_vdr_set_default_logger(void); -diff --git a/cpp/indyVdr.cpp b/cpp/indyVdr.cpp -index 0e3002cc6b504743ac70e777e52c387e26067bda..706134f8ccad62a790ee2f85a0f7b306cdfa5c85 100644 ---- a/cpp/indyVdr.cpp -+++ b/cpp/indyVdr.cpp -@@ -32,6 +32,16 @@ jsi::Value setCacheDirectory(jsi::Runtime &rt, jsi::Object options) { - return createReturnValue(rt, code, nullptr); - }; - -+jsi::Value setLedgerTxnCache(jsi::Runtime &rt, jsi::Object options) { -+ auto capacity = jsiToValue(rt, options, "capacity"); -+ auto expiry_offset_ms = jsiToValue(rt, options, "expiry_offset_ms"); -+ auto path = jsiToValue(rt, options, "path", true); -+ -+ ErrorCode code = indy_vdr_set_ledger_txn_cache(capacity, expiry_offset_ms, path.length() > 0 ? path.c_str() : nullptr); -+ -+ return createReturnValue(rt, code, nullptr); -+}; -+ - jsi::Value setDefaultLogger(jsi::Runtime &rt, jsi::Object options) { - ErrorCode code = indy_vdr_set_default_logger(); - -diff --git a/cpp/indyVdr.h b/cpp/indyVdr.h -index fa48a9253770faf2007913890f8458ffb26864f4..c708f3d483ff71dc90fe54af1a2b2eb087c58b26 100644 ---- a/cpp/indyVdr.h -+++ b/cpp/indyVdr.h -@@ -13,6 +13,7 @@ jsi::Value version(jsi::Runtime &rt, jsi::Object options); - jsi::Value getCurrentError(jsi::Runtime &rt, jsi::Object options); - jsi::Value setConfig(jsi::Runtime &rt, jsi::Object options); - jsi::Value setCacheDirectory(jsi::Runtime &rt, jsi::Object options); -+jsi::Value setLedgerTxnCache(jsi::Runtime &rt, jsi::Object options); - jsi::Value setDefaultLogger(jsi::Runtime &rt, jsi::Object options); - jsi::Value setProtocolVersion(jsi::Runtime &rt, jsi::Object options); - jsi::Value setSocksProxy(jsi::Runtime &rt, jsi::Object options); -diff --git a/cpp/turboModuleUtility.cpp b/cpp/turboModuleUtility.cpp -index 3ff7d9a455748748d84abf076dc29166bd94a717..5a029ea34225d5bb9f5610270677d5ffda80203a 100644 ---- a/cpp/turboModuleUtility.cpp -+++ b/cpp/turboModuleUtility.cpp -@@ -143,7 +143,7 @@ int64_t jsiToValue(jsi::Runtime &rt, jsi::Object &options, const char *name, - bool optional) { - jsi::Value value = options.getProperty(rt, name); - if ((value.isNull() || value.isUndefined()) && optional) -- return 0; -+ return -1; - - if (value.isNumber()) - return value.asNumber(); -@@ -169,7 +169,7 @@ int32_t jsiToValue(jsi::Runtime &rt, jsi::Object &options, const char *name, - bool optional) { - jsi::Value value = options.getProperty(rt, name); - if ((value.isNull() || value.isUndefined()) && optional) -- return 0; -+ return -1; - - if (value.isNumber()) - return value.asNumber(); -diff --git a/package.json b/package.json -index 084a7146e124e07cd3860819b9211be7d2369806..b911f8c6c360caea06946a3076e5148d5018c6ed 100644 ---- a/package.json -+++ b/package.json -@@ -58,7 +58,7 @@ - "binary": { - "module_name": "indy_vdr", - "module_path": "native", -- "remote_path": "v0.4.1", -+ "remote_path": "v0.4.3", - "host": "https://github.com/hyperledger/indy-vdr/releases/download/", - "package_name": "library-ios-android.tar.gz" - }, diff --git a/.yarn/patches/@hyperledger-indy-vdr-react-native-npm-0.2.4-d7ed0b15da.patch b/.yarn/patches/@hyperledger-indy-vdr-react-native-npm-0.2.4-d7ed0b15da.patch new file mode 100644 index 0000000..d7260d5 --- /dev/null +++ b/.yarn/patches/@hyperledger-indy-vdr-react-native-npm-0.2.4-d7ed0b15da.patch @@ -0,0 +1,22 @@ +diff --git a/cpp/turboModuleUtility.cpp b/cpp/turboModuleUtility.cpp +index 3ff7d9a455748748d84abf076dc29166bd94a717..5a029ea34225d5bb9f5610270677d5ffda80203a 100644 +--- a/cpp/turboModuleUtility.cpp ++++ b/cpp/turboModuleUtility.cpp +@@ -143,7 +143,7 @@ int64_t jsiToValue(jsi::Runtime &rt, jsi::Object &options, const char *name, + bool optional) { + jsi::Value value = options.getProperty(rt, name); + if ((value.isNull() || value.isUndefined()) && optional) +- return 0; ++ return -1; + + if (value.isNumber()) + return value.asNumber(); +@@ -169,7 +169,7 @@ int32_t jsiToValue(jsi::Runtime &rt, jsi::Object &options, const char *name, + bool optional) { + jsi::Value value = options.getProperty(rt, name); + if ((value.isNull() || value.isUndefined()) && optional) +- return 0; ++ return -1; + + if (value.isNumber()) + return value.asNumber(); diff --git a/.yarn/patches/@hyperledger-indy-vdr-shared-npm-0.2.2-b989282fc6.patch b/.yarn/patches/@hyperledger-indy-vdr-shared-npm-0.2.2-b989282fc6.patch deleted file mode 100644 index 99e2283..0000000 --- a/.yarn/patches/@hyperledger-indy-vdr-shared-npm-0.2.2-b989282fc6.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/build/types/IndyVdr.d.ts b/build/types/IndyVdr.d.ts -index 99f5d50a851462c8c41e52ceb49795feebce0b4e..3aa7890e1f3c422daa6ec82fd6b42d0b924d18b5 100644 ---- a/build/types/IndyVdr.d.ts -+++ b/build/types/IndyVdr.d.ts -@@ -11,6 +11,11 @@ export interface IndyVdr { - setCacheDirectory(options: { - path: string; - }): void; -+ setLedgerTxnCache(options: { -+ capacity: number; -+ expiry_offset_ms: number; -+ path?: string; -+ }): void; - setDefaultLogger(): void; - setProtocolVersion(options: { - version: number; diff --git a/.yarn/patches/react-native-document-picker-npm-9.3.1-ce22d39a18.patch b/.yarn/patches/react-native-document-picker-npm-9.3.1-ce22d39a18.patch new file mode 100644 index 0000000..4fc4e70 --- /dev/null +++ b/.yarn/patches/react-native-document-picker-npm-9.3.1-ce22d39a18.patch @@ -0,0 +1,44 @@ +diff --git a/android/src/main/java/com/reactnativedocumentpicker/RNDocumentPickerModule.java b/android/src/main/java/com/reactnativedocumentpicker/RNDocumentPickerModule.java +index 5001525e27475858fe60cbdf77c5c62ff52a92ae..fe1412a869b85446b48f7a40d8c1fc7bee99d2a0 100644 +--- a/android/src/main/java/com/reactnativedocumentpicker/RNDocumentPickerModule.java ++++ b/android/src/main/java/com/reactnativedocumentpicker/RNDocumentPickerModule.java +@@ -18,7 +18,7 @@ import androidx.annotation.NonNull; + import com.facebook.react.bridge.ActivityEventListener; + import com.facebook.react.bridge.Arguments; + import com.facebook.react.bridge.BaseActivityEventListener; +-import com.facebook.react.bridge.GuardedResultAsyncTask; ++import com.facebook.react.bridge.GuardedAsyncTask; + import com.facebook.react.bridge.Promise; + import com.facebook.react.bridge.ReactApplicationContext; + import com.facebook.react.bridge.ReactContext; +@@ -229,7 +229,9 @@ public class RNDocumentPickerModule extends NativeDocumentPickerSpec { + } + } + +- private static class ProcessDataTask extends GuardedResultAsyncTask { ++ // GuardedResultAsyncTask was removed in React Native 0.81; use GuardedAsyncTask ++ // and resolve the promise from the background thread (Promise is thread-safe). ++ private static class ProcessDataTask extends GuardedAsyncTask { + private final WeakReference weakContext; + private final List uris; + private final String copyTo; +@@ -244,17 +246,12 @@ public class RNDocumentPickerModule extends NativeDocumentPickerSpec { + } + + @Override +- protected ReadableArray doInBackgroundGuarded() { ++ protected void doInBackgroundGuarded(Void... params) { + WritableArray results = Arguments.createArray(); + for (Uri uri : uris) { + results.pushMap(getMetadata(uri)); + } +- return results; +- } +- +- @Override +- protected void onPostExecuteGuarded(ReadableArray readableArray) { +- promise.resolve(readableArray); ++ promise.resolve(results); + } + + private WritableMap getMetadata(Uri uri) { diff --git a/.yarn/patches/react-native-npm-0.81.5-d8232ef145.patch b/.yarn/patches/react-native-npm-0.81.5-d8232ef145.patch new file mode 100644 index 0000000..5b6e7e6 --- /dev/null +++ b/.yarn/patches/react-native-npm-0.81.5-d8232ef145.patch @@ -0,0 +1,57 @@ +diff --git a/ReactCommon/react/renderer/components/textinput/BaseTextInputShadowNode.h b/ReactCommon/react/renderer/components/textinput/BaseTextInputShadowNode.h +index 8c8a225eaa98ac3efe5f3194d53560c68c21a052..c553c1ab47244b4f13c5603546549f1e13d46160 100644 +--- a/ReactCommon/react/renderer/components/textinput/BaseTextInputShadowNode.h ++++ b/ReactCommon/react/renderer/components/textinput/BaseTextInputShadowNode.h +@@ -25,6 +25,22 @@ + + namespace facebook::react { + ++// KEYRING PATCH (react-native#55719, merged upstream as 5229e507e1a1): ++// building the fragment with a full ShadowView retains the node's `state`, ++// chaining every TextInputState revision to the previous one. The chain is ++// destroyed recursively on the Hermes GC thread ("hades"), whose small stack ++// overflows after enough keystrokes -> SIGBUS/EXC_BAD_ACCESS crash observed ++// on real iPhones during the VRC E2E flow. ++inline ShadowView textInputShadowViewFromShadowNode( ++ const ShadowNode& shadowNode) { ++ auto shadowView = ShadowView{shadowNode}; ++ // Clearing `props` and `state` (which we don't use) allows avoiding retain ++ // cycles. ++ shadowView.props = nullptr; ++ shadowView.state = nullptr; ++ return shadowView; ++} ++ + /* + * Base `ShadowNode` for component. + */ +@@ -186,7 +202,7 @@ class BaseTextInputShadowNode : public ConcreteViewShadowNode< + attributedString.appendFragment(AttributedString::Fragment{ + .string = props.text, + .textAttributes = textAttributes, +- .parentShadowView = ShadowView(*this)}); ++ .parentShadowView = textInputShadowViewFromShadowNode(*this)}); + + auto attachments = BaseTextShadowNode::Attachments{}; + BaseTextShadowNode::buildAttributedString( +diff --git a/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp b/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp +index e9a546e0154f84a73278ae6c3c3bb2e26d640efa..0e9309fd84a6bc1c3d5d41aedc8482b1f2f45ecb 100644 +--- a/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp ++++ b/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp +@@ -187,7 +187,15 @@ AttributedString AndroidTextInputShadowNode::getAttributedString( + // text value's background will stack. This is a hack/workaround to prevent + // that effect. + fragment.textAttributes.backgroundColor = clearColor(); +- fragment.parentShadowView = ShadowView(*this); ++ // KEYRING PATCH (react-native#55719): same TextInputState retain-chain ++ // leak as BaseTextInputShadowNode — clear props/state on the ShadowView ++ // to avoid chaining every state revision to the previous one. ++ { ++ auto parentShadowView = ShadowView(*this); ++ parentShadowView.props = nullptr; ++ parentShadowView.state = nullptr; ++ fragment.parentShadowView = std::move(parentShadowView); ++ } + attributedString.prependFragment(std::move(fragment)); + } + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e86b2d8 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,68 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## What this is + +Keyring — a React Native (0.81, React 19) mobile wallet for decentralized identity and verifiable credentials, built on a fork of OpenWallet Foundation's Bifold and the Credo-TS agent framework. The signature feature is the VRC (Verifiable Relationship Credential) module: peer-to-peer relationship credential exchange, optionally witnessed and backed by biometric hardware attestation (Secure Enclave / StrongBox). + +## Repo layout + +Two-level monorepo: + +- `app/` — the only yarn workspace. Keyring-specific mobile app: screens, `keyring-theme/`, localization, errors framework, and agent/container configuration. Native projects live in `app/android` and `app/ios` (workspace `AriesBifold.xcworkspace`, scheme `AriesBifold`). +- `bifold/` — **git submodule** (github.com/berkmancenter/keyring-bifold, fork of bifold-wallet). Core framework packages under `bifold/packages/`: `core` (UI, navigation, tsyringe DI container in `container-api.ts`/`container-impl.ts`, VRC module at `src/modules/vrc`), `witness-server` (standalone Node.js witness service), `react-native-attestation`, `oca`, `verifier`, `vrc-contexts`, `vrc-reference` (reference implementation + conformance tests), `vrc-shared`, `remote-logs`. +- `e2e/` — standalone npm package (deliberately outside the yarn workspaces) with Appium two-device tests. + +`@bifold/*` dependencies resolve to the submodule via `portal:` resolutions in the root `package.json` — source changes in `bifold/packages/*` are picked up without a build step in dev. `yarn install` at the root runs `scripts/ensure-bifold-ready.js` (init + build submodule) as preinstall and `scripts/fix-portal-symlinks.js` as postinstall. + +Dependency patches live in two places: `.yarn/patches/` (applied via `patch:` protocol in root resolutions — credo-ts, react-native, expo-secure-environment, etc.) and `app/patches/` (patch-package, applied by `app` postinstall). + +## Commands + +Node `>=20.19.2 <21`, Yarn 4.9.2 via corepack. Install from the repo root: `yarn install`. + +From the repo root: + +```sh +yarn lint # eslint (runs in app/) +yarn typecheck # tsc --noEmit (runs in app/) +yarn test # jest (runs in app/) +yarn prettier # check; yarn prettier:fix to write +``` + +Single test (jest): `cd app && TZ=GMT yarn jest path/to/file.test.ts` or `yarn test -t "test name"`. Bifold packages have their own suites: `cd bifold/packages/core && yarn test` (the VRC module tests are the contract for upgrade work). + +Run the app (requires `app/.env`, copied from `app/.env.sample`, with a reachable DIDComm mediator): + +```sh +cd app +yarn ios:setup && yarn ios # iOS (pod install, then build+launch) +yarn android # Android +yarn start # Metro, if it doesn't start automatically +``` + +E2E (Appium, two devices; binaries must be built first — see `e2e/README.md` for build recipes and setup): + +```sh +yarn e2e:vrc # Android emulator + iOS simulator, unattended +yarn e2e:vrc:devices # physical phones — the only way to prove hardware attestation (attended) +yarn e2e:migration # Askar 0.2→0.6 store-migration test +yarn e2e:smoke # single-device onboarding smoke test +``` + +Note: emulators/simulators cannot do hardware attestation — the app silently falls back to a plain exchange. Attestation paths are only proven by `e2e:vrc:devices`. + +## Commit conventions + +- Conventional commits enforced by commitlint: `feat|fix|docs|style|refactor|perf|test|chore|revert`, lower-case type. +- Commits in the `bifold/` submodule require `Signed-off-by: Alberto L ` as the **last line** of the message (commitlint rejects anything after it). Do not add agent co-author trailers to bifold commits. +- For message-only rewrites in bifold, use `git commit-tree -S` (SSH signing) to keep commits Verified; fallback `git commit -S -F msg.txt` with `HUSKY=0`. + +## Ongoing upgrade work + +`UPGRADE_PROGRESS.md` at the root is the authoritative hand-off document for the upstream sync effort (RN/React/credo-ts upgrades, VC 2.0 issuance, bifold "branch swap" strategy). Read it before touching upgrade-related work, and update it at phase gates. Related design docs live in `docs/` (e.g. `HARDWARE_ATTESTATION_FLOW.md`, `CRYPTO_SUITE_FOLLOWUP.md`). + +## CodeGraph + +A CodeGraph MCP index (`.codegraph/`) is configured for this repo — prefer `codegraph_*` tools over grep for structural questions (symbol definitions, callers, impact analysis). diff --git a/README.md b/README.md index 2c58371..b2b7d51 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,20 @@ yarn start Default ports: DIDComm on `9002`, web UI on `9003`. +### End-to-end tests + +Appium-driven two-device tests (fresh install → onboarding → VRC exchange) +live in [`e2e/`](e2e/README.md). From the repo root: + +```sh +yarn e2e:vrc # Android emulator + iOS simulator, unattended +yarn e2e:vrc:devices # physical phones — proves hardware attestation (attended) +yarn e2e:migration # Askar store-migration upgrade test +yarn e2e:smoke # single-device onboarding smoke test +``` + +Setup, app-build commands, and the real-device operator guide: [`e2e/README.md`](e2e/README.md). + ## Developing in keyring-bifold The `keyring-bifold/` directory is a Git submodule pointing to our Bifold fork. To work on core changes: diff --git a/UPGRADE_PROGRESS.md b/UPGRADE_PROGRESS.md new file mode 100644 index 0000000..373b751 --- /dev/null +++ b/UPGRADE_PROGRESS.md @@ -0,0 +1,554 @@ +# Keyring Wallet — Upstream Sync & Upgrade Progress + +> **Purpose of this file**: hand-off document so any agent/human can resume the upgrade +> effort with zero conversation context. Update it at every phase gate and whenever a +> significant decision or discovery is made. Keep it factual and current. + +Last updated: 2026-07-13 (real-device attestation E2E green; HARDWARE_ATTESTATION_FLOW rewritten for native verify; DataIntegrityProof cryptosuite explicitly deferred — see docs/CRYPTO_SUITE_FOLLOWUP.md) + +--- + +## 1. Goal + +Bring Keyring Wallet (fork of bcgov/bc-wallet-mobile + openwallet-foundation/bifold-wallet) +as close to upstream as possible: React Native, React, native toolchains, credo-ts, and all +major dependencies. The VRC (Verifiable Relationship Credential) module is Keyring's unique +contribution and must keep working (its tests are the contract). Proof of success = app +bundles AND runs on both platforms, verified by an Appium E2E script that does full +onboarding + a VRC exchange between two devices/emulators. + +Secondary goal (last phase): move VRC issuance to W3C VC Data Model 2.0. +DIDComm v2 is **out of scope** — not shipped in any stable credo release (PR +openwallet-foundation/credo-ts#2704 still open as of 2026-06). + +## 2. Decisions already made (by Alberto, 2026-07-04) + +| Topic | Decision | +| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| App upstream reference | `bcgov/bc-wallet-mobile` (NOT BC-Wallet-Demo, that's a web demo) | +| BCSC (BC Services Card) code | **Drop it** (`react-native-bcsc-core` pkg, bcsc API code) — but **keep the Keyring theme** (`app/src/keyring-theme/`, which lives alongside the bcsc-theme scaffolding it was derived from) | +| Storybook | Drop it (Storybook 5.3 won't survive React 19; user doesn't care) | +| VC 2.0 old-credential migration | Not needed (~0 users). Bump RCE protocol version so old/new wallets fail cleanly | +| E2E devices | Emulators/simulators first; fall back to real devices (user has both) if attestation/biometrics block simulators | +| Mediator + witness-server for E2E | Already hosted; endpoints configured in `app/.env` | +| Bifold sync strategy | "Branch swap": new branch in `berkmancenter/keyring-bifold` starting from upstream 3.0.16 content, port Keyring delta onto it. Same repo, no new repo. Gives shared git history with upstream going forward | +| RN upgrade path | Two hops: 0.73→0.77 (last React-18 RN) first, then 0.81+React 19 together with bifold 3.x/credo 0.6 | + +## 3. Current versions vs upstream targets + +| Component | Current | Target (upstream, 2026-07) | +| ------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------- | +| `@bifold/*` | 2.7.4 (fork, portal: to `bifold/packages/*`) | 3.0.16 | +| credo-ts | 0.5.17 (+ yarn patches) | 0.6.3 (DIDComm split into `@credo-ts/didcomm`; agent API moves to `agent.modules.*` / `agent.didcomm.*`) | +| React Native | 0.73.11 | 0.81.5 | +| React | 18.3.1 | 19.1.0 | +| askar | `@hyperledger/aries-askar-react-native` 0.2.3 | renamed `@openwallet-foundation/askar-*` 0.6.0 | +| anoncreds RN | 0.2.4 | check upstream bifold 3.0.16 resolutions | +| indy-vdr RN | 0.2.2 (patched) | 0.2.4 (upstream carries its own patch) | +| VRC signature suite | **Ed25519Signature2018** on VCDM 2.0 payloads (intentional) | **Deferred:** DataIntegrityProof / `eddsa-rdfc-2022` — see `docs/CRYPTO_SUITE_FOLLOWUP.md` | + +Upstream bifold 3.0.16 root resolutions worth copying: react 19.1.0, react-native 0.81.5, +react-native-vision-camera 4.7.3, expo ~54 (they added expo modules!), plus their patch set +(`.yarn/patches` upstream): credo-ts-react-native biometrics patch, indy-vdr-react-native 0.2.4 +patch, animo pex + sphereon pex patches (same ones we carry). + +## 4. Repo topology & baselines + +- Parent repo: `berkmancenter/keyring-wallet` (this repo). Yarn 4 workspaces: `app`, `packages/*` + (only `packages/bcsc-core` — to be dropped). `bifold/` is a nested git repo + (gitlink in parent) → `berkmancenter/keyring-bifold`. +- `@bifold/*` deps resolve via `portal:bifold/packages/*` in root package.json resolutions. +- Branches at baseline: parent on `feat/configurable-mediator-v2-batch-pickup`; bifold on + `fix/disable-native-build-triggers` (1 commit ahead of its origin/main). +- **Baseline tags created (Phase 0): `upgrade-baseline-p0` in BOTH repos.** +- Upstream remote added inside `bifold/`: `upstream` → openwallet-foundation/bifold-wallet + (tag `v2.7.4` fetched; upstream/main fetched). +- bc-wallet-mobile reference clone: `/tmp/bc-wallet-mobile` (full clone; re-clone if gone). + +## 5. Delta extraction results (Phase 0) + +### 5.1 keyring-bifold vs upstream `v2.7.4` (exact diff: `git diff v2.7.4 HEAD` inside `bifold/`) + +Fork point is exact: upstream tag `v2.7.4`. 457 files changed (excl. lockfiles): +290 added / 158 modified / 9 deleted. + +**Added (the Keyring contribution — ports cleanly, upstream never touches these paths):** + +- `packages/core/src/modules/vrc/` — 67 files, the VRC module (managers, protocol, types, tests) +- `packages/witness-server/` — 66 files (server component; not an RN package) +- `packages/vrc-reference/` — 46 files (reference implementation + conformance) +- `packages/vrc-shared/` — 7 files (documentLoader etc.) +- `packages/vrc-contexts/` — 5 files (JSON-LD contexts) +- Non-VRC additions to core: Messages/chat screens (`Messages.tsx`, `MessageStack.tsx`, + `useUnreadMessages`, `activeChatTracker`, `InAppMessageNotifier`, `MessageNotificationToast`), + wallet Export/Import screens, `About.tsx`, Toggle screens (HardwareAttestation, Witnessing, + WitnessReporting), `BiometricConfirmationModal` + `biometric-confirmation` context, + `QRCodeExchangeSlider`, pseudonym utils, seedTestCredentials, ~18 SVG assets, 39 test files +- Docs: `docs/VRC_*.md`, `docs/WITNESSED_EXCHANGE_FLOW.md`, etc. + +**Modified (158 files — must be re-applied by hand onto 3.0.16 where upstream moved):** + +- Heaviest churn (ins/del): `hooks/chat-messages.tsx` (803/84), `screens/CredentialOffer.tsx` + (476/61), `screens/Settings.tsx` (351/78), `components/chat/ChatMessage.tsx` (258/82), + `navigators/SettingStack.tsx` (216/133), `navigators/TabStack.tsx` (133/132), + `screens/Onboarding.tsx`, `contexts/reducers/store.ts` (+148), `index.ts` (+91 exports), + `container-api.ts` / `container-impl.ts`, `theme.ts` / `theme.interface.ts`, + localization en/fr/pt-br, `utils/agent.ts`, `hooks/useBifoldAgentSetup.ts` +- Native: `packages/react-native-attestation/` — heavily customized + (`AttestationModule.kt` ~1.5k lines, `Attestation.mm` ~1.5k lines, build.gradle, podspec, + `NativeAttestation.ts`) — hardware-backed VRC signing lives here. Treat as Keyring-owned; + diff upstream's 3.0.16 version for template changes (New Arch!) and port ours onto it. +- Total modified-src churn: ~5.2k insertions / 1.3k deletions across 80 core src files. + +**Deleted upstream files (9)**: `ListContacts.tsx`, `ContactDetails.tsx` (+ their tests/snaps), +`InfoIcon.tsx`, CODEOWNERS, MAINTAINERS.md — Keyring replaced contacts UI with its own. + +Full list: regenerate anytime with +`cd bifold && git diff --name-status v2.7.4 HEAD -- . ':!yarn.lock' ':!package-lock.json'` + +### 5.2 app/ vs bc-wallet-mobile fork point + +Fork point: bc-wallet-mobile commit **`f628bb23`** (2025-09-17, "feat: update address #2452", +bifold 2.7.4 / credo 0.5.17 era; `e12ca6d1` scores identically — either works as reference). + +**Keyring-only (added) in `app/`:** + +- `src/keyring-theme/` — THE KEEPER (user decision) +- `src/types/`, `src/components/SetupCard.tsx`, `src/screens/Biometry.tsx` +- Keyring branding assets (fonts GT-America/SourceSans3, Keyring/ASML logos, onboarding/tab SVGs) +- `universal-link-site/`, `witness-link-site/`, `patches/` (jsonld-signatures, rdf-canonize), + `__mocks__/@bifold`, `.jest/`, extra tests (`__tests__/navigation`, `__tests__/utils`) + +**Modified vs fork point (~45 files):** `App.tsx`, `container-imp.ts`, `index.js`, +`src/store.tsx`, `src/constants.ts`, `src/theme.ts`, `src/onboarding.ts`, +`src/hooks/useBCAgentSetup.ts`, `src/utils/bc-agent-modules.ts`, `src/utils/mediator.ts`, +`src/components/OnboardingPages.tsx`, localization index files, several screens +(Splash, Terms, Preface, Developer, PINExplainer, RemoteLogWarning), `bcsc-theme/` scaffolding +(MainStack, RootStack, Settings, theme, navigators types), Podfile, build.gradle, +gradle.properties, settings.gradle, AppDelegate.mm, Info.plist, entitlements, app.json, +babel/metro/jest configs, `.env.sample`. + +**bcwallet-only (we deleted):** `src/bcwallet-theme/`, BCSans fonts, android release.keystore. + +### 5.3 Yarn patches carried (root `.yarn/patches` + `app/patches`) + +- credo 0.5.17: anoncreds, core, indy-vdr → **die with credo 0.6.3** (re-derive only if the + underlying fix is still missing; check upstream 3.0.16 patch set first — they carry + equivalents for pex/indy-vdr) +- `@animo-id/pex`, `@sphereon/pex` → upstream 3.0.16 carries the SAME patches; adopt theirs +- indy-vdr-react-native / indy-vdr-shared 0.2.2 → upstream patches 0.2.4 instead +- app/patches (patch-package): `@digitalcredentials/jsonld-signatures@9.4.0`, + `rdf-canonize@5.0.0` → VRC-related, keep and re-verify + +## 6. Phase plan & status + +- [x] **Phase 0 — Baseline & delta extraction** (this document; tags `upgrade-baseline-p0`) + - [x] Delta bifold vs v2.7.4 + - [x] Delta app vs bc-wallet-mobile f628bb23 + - [x] Baseline test run recorded (§7 — all green) +- [x] **Phase 1 — Appium E2E harness on CURRENT app** — COMPLETE 2026-07-04. + **Green run**: `node e2e/run-vrc-exchange.js` → full two-wallet exchange + (Android emulator Pixel_6_API_33 ↔ iOS simulator iPhone 17) in ~7 min: + both onboardings → invitation → paste → connection → bidirectional VRC offers → + manual accepts → "added to your wallet" ×2 → peer R-card names visible in Contacts ×2. + - Environment verified 2026-07-04: Appium 3.5.0 with xcuitest 11.10.0 + uiautomator2 7.6.1 + installed; iOS 26.3 simulators (iPhone 17 etc.); AVDs `Pixel_6_API_31`, `Pixel_6_API_33`. + - Harness lives in `e2e/` (plain node + webdriverio, no test-runner framework): + `run-onboarding-smoke.js` (single device) and `run-vrc-exchange.js` (two devices). + Artifacts (screenshots + page-source XML) land in `e2e/artifacts/`. + - [x] Android debug APK builds (`cd app/android && ./gradlew assembleDebug`) + - [x] iOS simulator app builds (`cd app/ios && xcodebuild -workspace AriesBifold.xcworkspace +-scheme AriesBifold -configuration Debug -sdk iphonesimulator -derivedDataPath build/e2e-dd build`) + → product is `KeyRing.app`. DO NOT pass CODE_SIGNING_ALLOWED=NO: it strips the keychain + entitlements and the app fails onboarding with "Error code 1001 … required entitlement". + - [x] **Android onboarding smoke passes** (fresh install → GetStarted → PIN explainer → + PIN → biometry Continue → wallet naming → R-Card form → main tabs). + - [x] iOS onboarding smoke passes (rebuilt without CODE_SIGNING_ALLOWED=NO; numeric-keypad + dismissal = tap neutral content area x:235,y:240; `appium:platformVersion` must match an + installed simctl SDK, currently 26.3). + - [x] Two-device VRC exchange (Android emulator ↔ iOS simulator) PASSES. + Flow facts the harness encodes (don't rediscover): + - VRC offers are NOT auto-accepted. Each wallet gets a chat message "Credential offer + received — Would you like to accept it? YES/NO" (`ChatMessage.tsx` + CredentialOfferActions; YES has NO testID → find by text) → CredentialOffer screen → + `AcceptCredentialOffer` → `ContactAddedToYourWallet` (VRC flow shows the Contact + variant, not `CredentialAddedToYourWallet`) → `Done`. + - VRCs are HIDDEN from the Wallet credential list by design + (`ListCredentials.shouldHideFromWallet` filters RelationshipCredential/DTGCredential). + Success signal = peer's R-card name in the Contacts list (proves credential content + arrived, not just the connection). + - Wallet auto-locks after 5 min inactivity; mediator round-trips can exceed it — + harness has `unlockIfLocked` (PIN re-entry) woven into every wait loop. + - Mediator delivery is slow (pickup polling); full run ≈ 9–10 min. + - A redelivered duplicate offer-credential message logs "Error handling message … + offer-credential" + "Failed to process message" with empty error `{}` — benign, + exchange still completes. + - Simulator/emulator hardware-signing caveats (logged by [VRC:Sign], NON-fatal — flow falls + back to software keys): iOS sim "App Attest not supported"; Android emulator "Secure lock + screen must be enabled" (no lock screen configured on AVD); embedded Google root CA expired. + - Known red-box noise on both devices: unhandled rejection `IndyVdrError … did +'TeT8SJGHruVL9up3Erp4o' … Pool timeout` (indy ledger DID lookup from container-imp.ts + OCA/ledger config; unrelated to VRC, but it paints a dev-mode toast over the UI). + - IMPORTANT (harness ops): metro must NOT be piped through `tail`/`grep` when started — it + swallows all RN JS console logs. Start plainly: `cd app && npx react-native start`. + Both apps' JS logs stream into the metro terminal; that's the primary debugging signal. + - Learnings encoded in the harness (don't rediscover these): + - Debug builds need metro on the host (`cd app && npx react-native start`) and, for + Android, `adb -s reverse tcp:8081 tcp:8081` BEFORE first app launch — + caps use `appium:autoLaunch:false`, harness runs reverse then `activateApp`. + - Two adb devices may be attached (user's physical phone) — always pass `-s `. + - Appium needs ANDROID_HOME exported; start: + `ANDROID_HOME=$HOME/Library/Android/sdk appium --port 4723 --relaxed-security`. + - Invitation URL is read from a `__DEV__`-only hidden ThemedText with + testID `InvitationUrl` added to `bifold/.../components/misc/QRScanner.tsx` + (accessibilityLabel = invitation URL). Receiver uses the stock PasteUrl screen + (`PasteUrlButton` → `PastedUrl` input → `ScanPastedUrl`). + - A feature-tour popup ("Contact requests") shows over the Contacts screen after + onboarding; dismiss via testID `Close` before doing anything. + - testID prefix is `com.ariesbifold:id/` (bifold `testIdWithKey`); Android → resource-id, + iOS → accessibility id. + - Fresh install (uninstall first) → onboarding → VRC exchange between Android emulator + and iOS simulator. QR problem solved via invite-link injection, NOT camera. Good news: + bifold core already ships a `PasteUrl` screen (`packages/core/src/screens/PasteUrl.tsx`, + reachable from Scan/ConnectStack) — the harness can read the invitation URL from wallet A + (expose via testID on the QR/connect screen) and paste it into wallet B. A temporary code + hook may not be needed at all. Uses hosted mediator/witness from `app/.env`. + - No existing e2e tooling in the repo (no appium/wdio/detox anywhere) — build fresh under + `e2e/` at repo root. + - Check first: does hardware attestation/biometry block simulators? If yes, add dev bypass + flag or use real devices. +- [x] **Phase 2 — RN 0.73.11 → 0.77.x, React 18 kept, credo/bifold untouched** — COMPLETE. + Branch: `upgrade/phase2-rn77` (root repo). DONE (2026-07-04): + - RN 0.77.3 template applied (Upgrade Helper diff): Gradle 8.10.2, AGP 8.7.3, + Kotlin 2.0.21, buildTools 35, NDK 27.1.12297006, iOS deployment target 15.1, + settings.gradle plugin-based autolinking, `MainApplication.kt` OpenSourceMergedSoMapping, + `AppDelegate.mm` -bundleURL, Podfile Flipper removal + `$VCEnableLocation=false`. + - Ecosystem bumps: gesture-handler 2.22, safe-area-context 5.1, screens 4.6, svg 15.11, + vision-camera 4.7.3, webview 13.13 (13.10 fails Kotlin 2.0 compile). bifold core + peerDeps loosened to `>=`. + - `dependenciesMeta.built=false` for @2060.io/ffi-napi+ref-napi (node-gyp/distutils breakage, + not needed at runtime). Jest mock path: `react-native/src/private/animated/NativeAnimatedHelper`. + - RN 0.77 BackHandler API: `subscription.remove()` in bifold Onboarding/ProofDetails/ + ProofRequesting. Kotlin 2.0 null-safety fix in react-native-attestation. + - **RN 0.76+ prefab breakage (KEY LEARNING)**: @hyperledger/{anoncreds,aries-askar,indy-vdr} + -react-native CMakeLists link `ReactAndroid::reactnativejni`, which no longer exists + (merged into `ReactAndroid::reactnative` = single libreactnative.so). Fixed via yarn + patches (indy-vdr patch REPLACES the pre-existing 627d424b96 patch — same filename, now + also carries the CMake fix). Plus app/build.gradle `packagingOptions.jniLibs.pickFirsts` + for libreactnative/jsi/fbjni/c++\_shared (libraries copy prefab .so into their AARs). + - RN 0.77 codegen is stricter: bcsc-core spec couldn't use `Omit<>`, indexer+named props, + or `any` → replaced JWTClaims with `UnsafeObject` (react-native/Libraries/Types/CodegenTypes). + Moot once bcsc-core is dropped, but unblocked pod install. + - iOS pods: full `rm -rf Pods Podfile.lock` needed (boost snapshot conflict from 0.73 lock). + - GATE STATUS: app jest 23/88 PASS, bifold core jest 134/1242 PASS, + `assembleDebug` BUILD SUCCESSFUL, iOS simulator `xcodebuild` BUILD SUCCEEDED. + - BCSC removal DONE (2026-07-04): deleted `packages/bcsc-core` workspace, + `app/src/bcsc-theme/`, `useSetupSteps`, bcsc tests. `store.tsx` stripped of + BCSCState/BCSCDispatchAction/Mode (KeyRing is the only mode now; Root always renders + KeyRingRootStack). Removed `BCSCApiClientProvider` from App, BCSC/KeyRingSC theme + names + Developer screen theme/mode toggles, `@bcsc-theme` aliases + (babel/tsconfig/metro), bcsc-core refs in package.jsons. keyring-theme KEPT. + Unused BCSC localization strings left in place (inert; prune later). + Post-removal gate: typecheck PASS, eslint PASS, app jest 14 suites/27 tests PASS + (Developer snapshot updated), Android assembleDebug PASS (gradle locks regenerated), + iOS pod install + simulator build PASS (RNBcscCore pod gone). + - E2E VRC exchange rerun DONE (2026-07-04): green on BOTH platforms after two fixes: + 1. `@react-native-firebase` 14.x is incompatible with RN 0.77 (iOS crashed at startup, + "No Firebase App '[DEFAULT]'"); bumped app+messaging to ~21.14.0, and added + `RCTAppDependencyProvider` to AppDelegate.mm (required by RN 0.77 for third-party + Fabric component/module resolution — its absence caused the + `setSheetLargestUndimmedDetent` unrecognized-selector crash). + 2. **RN 0.77 / safe-area-context 5.x layout regression (KEY LEARNING)**: ScrollView + with `height:'100%'` inside a SafeAreaView that lacks `flex:1` pushes the + bottom controls (marginTop:'auto') off-screen. Fixed by `flex:1` on both the + SafeAreaView and the ScrollView in: CredentialOfferAccept, ProofRequestAccept, + CameraDisclosureModal, MobileVerifierLoading, CommonRemoveModal (bifold) and + PersonCredentialLoading (app keyring-theme). Snapshots updated. + - PHASE 2 GATE PASSED: app jest 14/27 PASS, bifold core jest 134 suites / 1242 PASS, + Android + iOS build PASS, two-device E2E VRC exchange PASS on Android and iOS. +- [x] **Phase 3 — Big hop: bifold 3.0.16 + credo 0.6.3 + React 19 + RN 0.81** + - [x] In `bifold/`: branch `upgrade/bifold-3.x` = upstream v3.0.16 content; §5.1 delta ported + (commit `68d9da80`). Credo 0.6.3 migration done (commit `cdb9289c`): DIDComm APIs under + `agent.modules.didcomm`, `DidCommModule` carries connections/credentials/proofs/oob/ + mediation config, renamed types/events (`DidCommConnectionRecord` etc.), + `kms.importKey` + `dids.create createKey` (JWK types) replace `wallet.createKey`, + askar renamed to `@openwallet-foundation/askar-*`, `W3cCredentialRecord.encoded` + replaces private `.credential`. witness-server + vrc-reference fully migrated + (sources AND unit tests — mock agents alias didcomm APIs under `modules.didcomm`; + jest needs babel-jest ESM transform for credo 0.6 `.mjs` builds, see the two + jest.config.js files). `receiveInvitationFromUrl` now REQUIRES a `label` in its + 2nd config arg (credo 0.6 moved agent label out of InitConfig). + - [x] bifold gate: `yarn build` 0 TS errors, lint + prettier clean, + `yarn coverage` 155 suites / 1398 tests PASS (core 1400 incl. 2 skipped, + vrc-reference 105, witness-server, vrc-shared). One flaky suite noted: + CredentialDetails.test.tsx can fail under full-run load (act() timing), passes + isolated and on rerun. + - [x] Pushed + PR opened: berkmancenter/keyring-bifold#26 (upgrade/bifold-3.x → main). + NOTE: branch-swap made history disjoint from fork main; fixed with a signed + tie-merge commit (`git commit-tree -S` with two parents, tree = Phase 3 tree). + DO NOT merge without Alberto's approval. + - [x] Attestation package: rebuilt from upstream 3.0.16 base, Keyring crypto re-applied. + - [x] App JS layer: RN 0.81.5 + React 19.1.0 wired, bifold 3.0.16 portals (incl. new + `@bifold/react-hooks` — `@credo-ts/react-hooks` is gone), credo 0.6.3 deps, + askar → `@openwallet-foundation/askar-react-native` 0.6.0, Storybook dropped + (dir + AppStorybook.tsx removed), branch `upgrade/phase3-bifold3`. Highlights: + - `bc-agent-modules.ts` rewritten for credo 0.6 (`DidCommModule` config, + `Kms.KeyManagementModule` with askar + expo secure-environment services, + explicit JSON-LD/AnonCreds DIDComm format services, VRC document loader). + - `useBCAgentSetup.ts`: wallet id/key now live in `AskarModule` store config — + no more `agent.wallet.open()`; transports register via + `agent.modules.didcomm.registerOutboundTransport`; indy-vdr pool warm-up + guards the BC-patch-only methods (`refreshPoolConnections`). + - DRPC-based BC attestation flow REMOVED (`@credo-ts/drpc` has no stable 0.6.x; + Keyring doesn't run BC's attestation service). `AttestationMonitor` keeps the + bifold interface; `requestAttestationCredential` now emits FailedRequestCredential. + `app/src/utils/drpc.ts` deleted. + - proofs/credentials API options renamed: `proofRecordId`→`proofExchangeRecordId`, + `credentialRecordId`→`credentialExchangeRecordId`. + - jest: transformIgnorePatterns synced with bifold core (credo .mjs, @noble, + @stablelib, expo...); `@bifold/*` mapped to bifold SOURCES (lib/commonjs build + has a circular-require bug under jest); reanimated mocked via official mock; + RN 0.81 Keyboard/BackHandler mocks ported from bifold jestSetup. + - babel: module-resolver `root: ['.']` REMOVED (it rewrote `from '.'` imports + inside node_modules to app root index.js under jest); added + `@babel/plugin-transform-export-namespace-from` + reanimated plugin. + - Fixed upstream bug in bifold `store.ts` (absolute `components/views/Banner` + import breaks consumers compiling core from source). + - [x] App gate (JS): typecheck 0 errors, eslint clean, jest 14 suites / 27 tests PASS + (6 snapshots updated for RN 0.81 Pressable/style flattening). + - [x] Android native build GREEN with **New Architecture enabled** (`newArchEnabled=true`), + `assembleDebug` passes. Changes: compileSdk/targetSdk 36, buildTools 36.0.0, + kotlin 2.1.20, gradle 8.14.3, AGP version now supplied by RN gradle plugin; + expo autolinking added to settings.gradle (`useExpoModules()`) and + MainApplication wrapped in `ReactNativeHostWrapper` + `loadReactNative(this)`; + `react.internal.disableJavaVersionAlignment=true` + subprojects Java-17 + compileOptions block (both from bifold samples/app — RN plugin vs expo + toolchain conflict); kotlin-stdlib force-resolutions and app java toolchain + block REMOVED (broke under AGP 8.12); gradle lockfiles regenerated + (`--write-locks`). Attestation module: Android now implements the 5 iOS-only + spec methods as UNSUPPORTED-reject stubs (New-Arch codegen makes them + abstract on both platforms) — bifold commit. + - [x] iOS native build GREEN (`xcodebuild` Debug, simulator). Podfile gained expo + autolinking (`use_expo_modules!` + `expo_patch_react_imports!`), pods + reinstalled (RN 0.81.5, hermes, 140 pods). AppDelegate.mm (RCTAppDelegate) + still compiles on 0.81 — migration to RCTReactNativeFactory deferred. + - [x] Release JS bundles green for BOTH platforms. metro.config fixes: + exclusionList import moved to `metro-config/private/...` (metro 0.83 exports), + `unstable_enablePackageExports` + conditions `['react-native','browser','require']` + (nanoid etc. need browser builds), bifold/node_modules added to + watchFolders/nodeModulesPaths, react-native-svg-transformer 0.14→1.5.1. + New app deps surfaced by bifold 3.x code paths: zustand ~4.5.4 (core has it + only as devDep), @expo/app-integrity ^55.0.9. + PATCH: react-native-document-picker 9.3.1 uses GuardedResultAsyncTask + (removed in RN 0.81) — yarn patch swaps it to GuardedAsyncTask. + - [x] Runtime smoke test GREEN on both platforms: Android emulator (Pixel 6 API 33) + boots to onboarding, iOS simulator (iPhone 17) boots to PIN unlock (existing + wallet opened — askar 0.6 store loads). Runtime fixes: + - metro resolveRequest singleton guard: imports of react/react-native/react-dom/ + @credo-ts/{core,didcomm,anoncreds} from OUTSIDE app/ re-resolve from the app + root, otherwise bifold/node_modules' second react copy loads in dev bundles + and hooks crash ("dispatcher.useContext of null" in bifold Button). + - '@bifold/react-hooks' added to BIFOLD_SOURCE_PACKAGES (verifier src imports it). + - react-native-date-picker REMOVED (unused; 5.0.13 breaks RN 0.81 iOS: + "RNDatePickerManager does not conform to RCTModuleProvider"). + - GOTCHA: killing the `yarn start` wrapper leaves the node metro child alive + holding :8081 — a stale metro served the old config for a while. pkill + 'cli.js start' or kill the listener pid from lsof. + - [x] Two-device E2E VRC exchange GREEN (2026-07-06): Android emulator ↔ iOS simulator, + full flow (onboarding → invitation → chat → bidirectional VRC issuance → contact + visible on both). Five fixes to get there: + - credo 0.6 event payload rename: `payload.credentialRecord` → + `payload.credentialExchangeRecord` in `app/src/services/attestation.ts` + (threw "Cannot read property 'id' of undefined" on every credential event; + proof events still use `payload.proofRecord`). + - Credo 0.6 event NAME rename (earlier fix, same class of bug): vrc-manager + + InAppMessageNotifier listen on `DidCommBasicMessageEventTypes.…` not the old + 0.5 string. + - Chat YES/NO + details links: RN's TouchableOpacity misses taps inside + GiftedChat's inverted list on Android with New Architecture — swapped to + `react-native-gesture-handler` touchables (gifted-chat already wraps in + GestureHandlerRootView). E2E also retries the YES tap. + - INFINITE RENDER LOOP ("Maximum update depth exceeded", both platforms, fired + after accepting an offer): `useCredentialByState`/`useProofByState` in + @bifold/react-hooks memoized `states` on ARRAY IDENTITY; app's + `useNotifications` passes fresh array literals each render → new array each + render → downstream effect loop (Connection screen via useNotifications). + React 19 surfaces this hard. Fixed by keying the memo on `state.join(',')`. + - Clock skew: holder rejected issued VC ("current date time is before + issuanceDate") because emulator/simulator clocks differ by a few seconds — + vrc-manager now backdates issuanceDate/validFrom by 5 min. + - LogBox: dev banners cover bottom-of-screen buttons (Done) and eat E2E taps — + `LogBox.ignoreAllLogs()` in dev (app/index.js). + - E2E harness gotchas: stale `IOS_APP`/`ANDROID_APK` env vars make Appium + install OLD builds (RN version-mismatch redbox); `enforceAppInstall: true` + added for iOS; unset the env vars before runs. + - [x] Askar 0.2→0.6 store migration check GREEN (2026-07-07): `e2e/run-store-migration.js` + installs the baseline apk (credo 0.5.17/askar 0.2.3, built from `upgrade-baseline-p0` + worktree as a RELEASE build with debug signing — a debug build would load the NEW + JS from metro and crash on the askar native mismatch), populates the old-format + store with a real VRC exchange against the new iOS build, then `adb install -r` + the new apk over it. Wallet opens with the same PIN, contact + VRC survive. + - MIGRATION BUG found+fixed: R-Card template records stored by credo-0.5 builds + have NO `proof`; credo 0.6 parses stored credentials as + W3cJsonLdVerifiableCredential (proof required), so `record.getTags()` threw and + OpenIDCredentialRecordProvider crashed with a render error on first launch after + upgrade. `migrateRCardTemplateProofs()` (vrc/services/rCardCredential.ts) adds the + same placeholder proof new templates get; runs in `useBCAgentSetup.ts` right after + `agent.initialize()`, before any provider reads W3C records. + - E2E harness: old release build's QR bottom-sheet ignores appium synthetic taps — + invitation delivered via deep link (`adb shell am start -a VIEW -d `), which + is also the real-user path. iOS `simctl privacy grant camera` kills the app; + terminate + sleep + activate avoids a black-screen race. Runtime permissions + granted via `adb shell pm grant` (manual installs skip autoGrantPermissions). + - [x] Gate: VRC conformance tests green (bifold side done), two-device E2E green. +- [x] **Phase 4 (lite) — App-layer upstream sync** (2026-07-07). Analysis first: most + upstream churn since the fork is BCSC product work (bcsc-theme/, variants build + system, dual-mode store) that Keyring does NOT adopt. Ported the generic pieces: + - [x] Error-handling framework (`app/src/errors/`): AppError + ErrorRegistry + (registry trimmed to Keyring-relevant codes, ranges kept aligned with upstream + so support references stay comparable) + errorHandler utils + ErrorInfoCard/ + AppErrorModal/ErrorBoundary components + `ErrorAlertProvider`/`useErrorAlert` + context. Upstream's Snowplow analytics coupling DROPPED — errors report to + Loki via the remote logger instead (`reportProblem()` in utils/logger.ts + returns a human-readable reference code, shown+copyable in the modal). + App.tsx now uses OUR ErrorBoundaryWrapper (was bifold's) and mounts + ErrorAlertProvider inside TourProvider. AppEventCode enum in + `app/src/events/appEventCode.ts` (trimmed from upstream's ~200 codes). + Ported jest suites: appError/errorRegistry/errorHandler (49 tests). + - [x] `PressableOpacity` (`app/src/components/`): Pressable-based TouchableOpacity + replacement (New-Arch touch reliability); used by ErrorInfoCard. + - [x] Small hooks: `usePreventGestureBack`, `useDeclineCredentialOffer`, + `useDeclineProofRequest` (adapted to `useAgent` from @bifold/react-hooks — + upstream uses their BCSC agent context), `useAutoRequestPermission`. + `useAlerts` NOT ported (hard-wired to BCSC stacks/screens/factory-reset). + - [x] Mediator pickup simplified to upstream's approach: unconditional + `PickUpV2LiveMode` (WebSocket push) in useBCAgentSetup; REMOVED the legacy + batch-pickup double-tap + 5s trust-ping polling loop (utils/mediator.ts + deleted, `MEDIATOR_USE_V2_BATCH_PICKUP` env flag retired). Verified against + our hosted mediator (credo-mediator.aaleon.com advertises wss) by the + two-device E2E — message delivery works on socket push alone. + - [x] Test-harness fix (bifold core jestSetup): RNGH's own jest mocks render + buttons without children, blanking gesture-handler touchable labels — + ChatMessage YES/NO tests failed. jestSetup now maps RNGH touchables to RN + equivalents (4 previously-failing tests green). + - [x] Gate GREEN (2026-07-07): app jest 16 suites/70 tests PASS; bifold core + 155 suites/1398 tests PASS; app+bifold typecheck PASS; two-device VRC + exchange E2E (Android emulator ↔ iOS simulator) PASS on live-mode-only + pickup — full flow inc. bidirectional VRC + contacts. +- [x] **Phase 5 — DTG spec alignment + VC 2.0 for VRC** — COMPLETE 2026-07-08. + Credo 0.6.3 verified (source-read): JSON-LD Data Integrity signing is **VCDM 1.1-only**. + The DIDComm jsonld format parses into `W3cCredential`, whose validators require + (a) first `@context` = the v1.1 URL and (b) a mandatory `issuanceDate`. The + `W3cV2CredentialService` (VCDM 2.0) only does vc+jwt / vc+sd-jwt (OpenID4VC stack, + not wired to DIDComm). DIDComm itself and Ed25519Signature2018 are version-agnostic. + - [x] **Task 1 — RCard/VRC separation**: VRC `issuer` is now a bare DID string for v2 + peers (PII out of the pseudonymous edge credential). RCard is an exchanged VDS + (`type: ["VerifiableCredential","RelationshipCard"]`, subject = counterparty DID, + `credentialSubject.card` = jCard) built from the local template + (`services/rCardCredential.ts buildRCardCredential`) and offered right after the + VRC (`issueRCardCredential` in vrc-manager, best-effort/non-blocking, deduped per + connection). Receiver AUTO-ACCEPTS RelationshipCard offers (tagged + `rcardExchange` metadata); RCard exchanges are filtered from chat bubbles, + notifications, wallet list, and VRC-flow overlay state. Contact display resolves + via `utils/rcardDisplayUtils.ts resolveContactDisplayInfo`: newest received RCard + first, fallback to legacy VRC issuer objects (sorted most-recent-first). New + RCard JSON-LD context in vrc-contexts (`https://www.firstperson.network/rcard/v1`) + with `@type: @json` for the jCard (JCS-canonicalized as a JSON literal, structure + survives RDF canonicalization). + - [x] **Task 2 — VWC digest via JCS (RFC 8785)**: pure-TS `jcsCanonicalize` in + `@bifold/vrc-contexts/src/jcs.ts` (recursive UTF-16 key sort, ECMAScript number + serialization, undefined handling); witness-server + vrc-reference Witness now + hash `jcsCanonicalize(vrcJson)` (was top-level-only key sort). Encoding stays + `sha256:`. Wallet doesn't verify digests today; the helper is exported for + when it does. + - [x] **Task 3 — VC 2.0 verification (credo patch)**: yarn patch + `.yarn/patches/@credo-ts-core-npm-0.6.3-28b59086b0.patch` applied in BOTH trees + via the `resolutions` entry itself (GOTCHA: a second broader `"@credo-ts/core": + "0.6.3"` resolution silently wins over a `@credo-ts/core@npm:0.6.3: patch:...` + entry — put the `patch:` ref directly on the main resolution). Patch: (a) + `IsCredentialJsonLdContext` also accepts `https://www.w3.org/ns/credentials/v2` + first; (b) `W3cCredential.issuanceDate` optional. VCDM 2.0 context document + bundled (`vrc-contexts/src/credentialsV2Context.ts`) + served by all three + document loaders. `cachedStandardContexts.ts` pins credo's DEFAULT_CONTEXTS + (security/ed25519 suites etc.) into the vrc-shared loader so Node-side + sign/verify never fetches from w3.org. Conformance: `vc20Validation.test.ts` + (model-level) + `vrc-reference vc20Conformance.test.ts` (full sign/verify + round-trip on a bare credo agent, v2 and v1.1). + - [x] **Task 4 — VC 2.0 issuance flip + RCE v2 negotiation**: handshake message now + carries `vrc:rceVersion:2` (old parsers ignore the suffix); peer's version stored + on `RelationshipDidRecord.counterpartyRceVersion` (absent = 1). For v2 peers: + VRC/RCard/VWC are VCDM 2.0 (v2 context first, `validFrom`/`validUntil`, no + issuanceDate). Witness-server mirrors the observed VRC's data model for the VWC + and its freshness check reads `validFrom || issuanceDate` (window widened to + 10 min = 5 min clock-skew backdate + 5 min margin); announcement now + `version: '2.0'`, capability `vc-2.0`. + **KEY LEARNING (cost a failed E2E)**: the v2 base context does NOT define the + Ed25519Signature2018 proof terms (v1.1 did), so jsonld-signatures APPENDS + `https://w3id.org/security/suites/ed25519-2018/v1` to `@context` during signing — + the signed credential then fails credo's holder-side deep-equality check against + the offer ("Received credential does not match credential request"). Fix: include + `ED25519_2018_SUITE_CONTEXT_URL` in `@context` at BUILD time in every v2 builder + (vrc-manager, rCardCredential, WitnessService, vrc-reference Participant/Witness). + - [x] **Backward compat with pre-Phase-5 peers (v1 path)** — found+fixed by the + backward-compat E2E: a v1 peer (no rceVersion announced) must get the FULL legacy + exchange, not just a 1.1-shaped VRC. Two fixes in vrc-manager: + (a) legacy VRCs embed the old issuer OBJECT `{id, name, email?, organization?}` + from the R-Card template (`buildLegacyIssuerObject`) — old apps read the contact + name from it; (b) RCard issuance is SKIPPED for v1 peers — they can't resolve the + RCard context (verification fails) and the unexpected offer surfaces as a second + actionable chat bubble that broke the old app's accept flow. + - [x] **Gates (all green 2026-07-08)**: + - bifold core jest 159 suites / 1434 passed (2 skipped); vrc-reference + + witness-server suites green; app jest/typecheck/lint green; core tsc + eslint clean + (witness-server has PRE-EXISTING `Timeout` tsc errors from baseline — not a regression). + - Two-device E2E VRC exchange (new↔new, Android emulator ↔ iOS simulator) PASS: + RCE v2 negotiated both ways, VC 2.0 VRCs verified, RCards auto-accepted, contact + names from RCards visible both sides. + - Backward-compat E2E PASS: Phase-4 baseline RELEASE apk (commit `dc944fd`, worktree + `/tmp/kw-p4-baseline` — build needs `yarn workspace @bifold/ build` for + app-consumed packages, skip witness-server which fails its build on baseline, plus + `./gradlew :bifold_react-native-attestation:generateCodegenArtifactsFromSchema` + before assembleRelease) ↔ NEW iOS build: old wallet receives a legacy 1.1 VRC with + issuer object, no RCard offered, contact visible on both; then `adb install -r` + the new apk over the old store → PIN unlock, agent init, contact + VRC survive. + - [x] **Task 6 — upstream credo contribution**: on hold. A write-up of the VCDM 2.0 + DIDComm JSON-LD gap and our yarn patch exists locally; any upstream issue/PR to + credo-ts happens only with explicit owner approval. If credo ever accepts the + change, our yarn patch dissolves at the next upgrade. + - [x] **Attestation hardening (2026-07-09)**: cherry-picked bifold PR #23 + (`fix: align Google attestation trust anchors with published roots`, now `88f80fe8` + on `upgrade/bifold-3.x`) so real-device Android hardware attestation validates + against Google's published roots instead of self-as-anchor. Verified on the new + stack: 7/7 attestation JUnit tests, 29/29 BiometricSignatureVerifier TS tests, + app `assembleDebug` green. PR #23 superseded/closed. + - **Deliberately deferred**: custom → official context URL switch (waiting on ToIP WG; + draft in `dtg-context-v1.draft.jsonld`, git-excluded); **DataIntegrityProof / + eddsa-rdfc-2022** (separate profound follow-up — parking lot: + `docs/CRYPTO_SUITE_FOLLOWUP.md`; keep issuing Ed25519Signature2018 until then); + BBS+/ZKP (separate future project); wallet-side VWC digest verification + (jcsCanonicalize exported and ready). + - [x] **Real-device hardware attestation E2E (2026-07-13)**: `yarn e2e:vrc:devices` + green — Secure Exchange both directions; native verify; Google multi-root + anchors. Docs: `docs/HARDWARE_ATTESTATION_FLOW.md` rewritten to match. + +## 7. Baseline test results (Phase 0 gate — all green, recorded 2026-07-04) + +- `app`: `yarn test` → **PASS** (23 suites, 88 tests, 13 snapshots) +- `bifold` (all workspaces): `yarn test` → **PASS**; `packages/core` alone: + **134 suites, 1242 passed / 2 skipped, 137 snapshots** (includes VRC module tests) +- `app`: `yarn typecheck` → **PASS** +- `bifold`: `yarn typecheck` (all workspaces) → **PASS** + +Note: sandboxed shells can't reach watchman (`Operation not permitted` on its socket); +run jest outside sandbox or with `--watchman=false`. + +## 8. How to resume (for the next agent) + +1. Read this file top to bottom. +2. `git -C . status` and `git -C bifold status` — check for WIP beyond `.codegraph/.cursor`. +3. Find the first unchecked box in §6; that's the active phase. Respect the gates. +4. Baseline tags `upgrade-baseline-p0` exist in both repos if you need to diff/rollback. +5. Conventions: bifold commits need `Signed-off-by: Alberto L ` as the + last line; never add Cursor co-author trailers. Don't push without being asked. +6. Regenerate deltas with the commands in §5 if trees have moved. +7. Update §6 checkboxes, §7 results, and the "Last updated" line before you stop. diff --git a/app/.bundle/config b/app/.bundle/config index 87bd688..95838fc 100644 --- a/app/.bundle/config +++ b/app/.bundle/config @@ -1,3 +1,4 @@ --- BUNDLE_FORCE_RUBY_PLATFORM: "1" -BUNDLE_FROZEN: "true" +BUNDLE_FROZEN: "false" +BUNDLE_DEPLOYMENT: "false" diff --git a/app/App.tsx b/app/App.tsx index 8618dde..e2023c8 100644 --- a/app/App.tsx +++ b/app/App.tsx @@ -3,7 +3,6 @@ import { AnimatedComponentsProvider, AuthProvider, ContainerProvider, - ErrorBoundaryWrapper, ErrorModal, initLanguages, initStoredLanguage, @@ -27,8 +26,9 @@ import Toast from 'react-native-toast-message' import { container } from 'tsyringe' import Root from '@/Root' -import { BCSCApiClientProvider } from '@/bcsc-theme/contexts/BCSCApiClientContext' import { KeyRingThemeNames, surveyMonkeyExitUrl, surveyMonkeyUrl } from '@/constants' +import { ErrorAlertProvider } from '@/contexts/ErrorAlertContext' +import { ErrorBoundaryWrapper } from '@/errors/components/ErrorBoundary' import { localization } from '@/localization' import { initialState, reducer } from '@/store' import { themes } from '@/theme' @@ -70,30 +70,30 @@ const App = () => { - - - - - - - - - setSurveyVisible(false)} - /> - + + + + + + + + setSurveyVisible(false)} + /> + + - - - - - - - - + + + + + + + + diff --git a/app/AppStorybook.tsx b/app/AppStorybook.tsx deleted file mode 100644 index 41ec751..0000000 --- a/app/AppStorybook.tsx +++ /dev/null @@ -1,18 +0,0 @@ -// import { initLanguages } from '@bifold/core' -import React from 'react' -import { LogBox } from 'react-native' - -// import keyring from './src' -import StorybookUIRoot from './storybook' - -// const { localization } = keyring - -// initLanguages(localization) - -LogBox.ignoreAllLogs() - -const Base = () => { - return -} - -export default Base diff --git a/app/Gemfile b/app/Gemfile index 268b2a3..65aa988 100644 --- a/app/Gemfile +++ b/app/Gemfile @@ -1,5 +1,8 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version ruby ">= 2.6.10" -gem 'cocoapods', '~> 1.14.3' -gem 'activesupport', '~> 7.0.8' +# Exclude problematic versions of cocoapods and activesupport that cause build failures. +gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1' +gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0' +gem 'xcodeproj', '< 1.26.0' +gem 'concurrent-ruby', '< 1.3.4' diff --git a/app/Gemfile.lock b/app/Gemfile.lock index 35f3dfe..3af5b20 100644 --- a/app/Gemfile.lock +++ b/app/Gemfile.lock @@ -1,27 +1,34 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.7) + CFPropertyList (3.0.9) + activesupport (7.1.6) base64 - nkf - rexml - activesupport (7.0.8) + benchmark (>= 0.3) + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) + logger (>= 1.4.2) minitest (>= 5.1) + mutex_m + securerandom (>= 0.3) tzinfo (~> 2.0) - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) - base64 (0.2.0) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (4.1.2) claide (1.1.0) - cocoapods (1.14.3) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.14.3) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -36,7 +43,7 @@ GEM nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.14.3) + cocoapods-core (1.15.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -56,47 +63,53 @@ GEM netrc (~> 0.11) cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.2.2) + concurrent-ruby (1.3.3) + connection_pool (2.5.5) + drb (2.2.3) escape (0.0.4) - ethon (0.16.0) + ethon (0.18.0) ffi (>= 1.15.0) - ffi (1.17.1) + logger + ffi (1.17.4) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) httpclient (2.9.0) mutex_m - i18n (1.14.1) + i18n (1.14.8) concurrent-ruby (~> 1.0) - json (2.10.2) - minitest (5.20.0) + json (2.20.0) + logger (1.7.0) + minitest (5.26.1) molinillo (0.8.0) mutex_m (0.3.0) - nanaimo (0.4.0) + nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) - nkf (0.2.0) public_suffix (4.0.7) - rexml (3.4.1) + rexml (3.4.4) ruby-macho (2.5.1) - typhoeus (1.4.1) - ethon (>= 0.9.0) + securerandom (0.3.2) + typhoeus (1.6.0) + ethon (>= 0.18.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - xcodeproj (1.27.0) + xcodeproj (1.25.1) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.4.0) + nanaimo (~> 0.3.0) rexml (>= 3.3.6, < 4.0) PLATFORMS ruby DEPENDENCIES - activesupport (~> 7.0.8) - cocoapods (~> 1.14.3) + activesupport (>= 6.1.7.5, != 7.1.0) + cocoapods (>= 1.13, != 1.15.1, != 1.15.0) + concurrent-ruby (< 1.3.4) + xcodeproj (< 1.26.0) RUBY VERSION ruby 2.7.8p225 diff --git a/app/__mocks__/@credo-ts/react-hooks.ts b/app/__mocks__/@bifold/react-hooks.ts similarity index 87% rename from app/__mocks__/@credo-ts/react-hooks.ts rename to app/__mocks__/@bifold/react-hooks.ts index 50bb0cf..3c75943 100644 --- a/app/__mocks__/@credo-ts/react-hooks.ts +++ b/app/__mocks__/@bifold/react-hooks.ts @@ -1,6 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { LegacyIndyCredentialFormat } from '@credo-ts/anoncreds' -import { CredentialExchangeRecord, CredentialProtocolOptions, ProofExchangeRecord } from '@credo-ts/core' +import { + CredentialProtocolOptions, + DidCommCredentialExchangeRecord as CredentialExchangeRecord, + DidCommProofExchangeRecord as ProofExchangeRecord, +} from '@credo-ts/didcomm' const useCredentials = jest.fn().mockReturnValue({ credentials: [] } as any) const useCredentialByState = jest.fn().mockReturnValue([] as CredentialExchangeRecord[]) diff --git a/app/__mocks__/@bifold/remote-logs.ts b/app/__mocks__/@bifold/remote-logs.ts index 7230752..0f6f5c0 100644 --- a/app/__mocks__/@bifold/remote-logs.ts +++ b/app/__mocks__/@bifold/remote-logs.ts @@ -2,6 +2,10 @@ export enum RemoteLoggerEventTypes { ENABLE_REMOTE_LOGGING = 'RemoteLogging.Enable', } +export type RemoteLoggerOptions = Record + +export const lokiTransport = jest.fn() + export class RemoteLogger { create() { return this diff --git a/app/__tests__/bcsc-theme/api/useConfigApi.test.ts b/app/__tests__/bcsc-theme/api/useConfigApi.test.ts deleted file mode 100644 index 70a0431..0000000 --- a/app/__tests__/bcsc-theme/api/useConfigApi.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import useConfigApi from '@bcsc-theme/api/hooks/useConfigApi' -import { renderHook } from '@testing-library/react-native' -import { Platform } from 'react-native' - -const mockApiClient = { - baseURL: 'https://mock-api-base-url.com', - get: jest.fn().mockImplementation(() => Promise.resolve({ data: {} })), -} - -describe('useConfigApi', () => { - beforeEach(() => { - Platform.OS = 'ios' - jest.clearAllMocks() - }) - - const config = renderHook(() => useConfigApi(mockApiClient as any)).result.current - - describe('getServerStatus', () => { - it('calls the correct endpoint for android', async () => { - // eslint-disable-next-line no-extra-semi - ;(mockApiClient.get as jest.Mock).mockResolvedValueOnce({ data: { status: 'ok' } }) - Platform.OS = 'android' - - // Call the method we're testing - const response = await config.getServerStatus() - - // Verify correct endpoint called with the mocked baseURL - expect(mockApiClient.get).toHaveBeenCalledWith(`${mockApiClient.baseURL}/cardtap/v3/status/android/mobile_card`, { - skipBearerAuth: true, - }) - expect(response).toEqual({ status: 'ok' }) - }) - - it('calls the correct endpoint for ios', async () => { - // eslint-disable-next-line no-extra-semi - ;(mockApiClient.get as jest.Mock).mockResolvedValueOnce({ data: { status: 'ok' } }) - const response = await config.getServerStatus() - - expect(mockApiClient.get).toHaveBeenCalledWith(`${mockApiClient.baseURL}/cardtap/v3/status/ios/mobile_card`, { - skipBearerAuth: true, - }) - expect(response).toEqual({ status: 'ok' }) - }) - - it('handles API errors gracefully', async () => { - // eslint-disable-next-line no-extra-semi - ;(mockApiClient.get as jest.Mock).mockRejectedValueOnce(new Error('Network error')) - await expect(config.getServerStatus()).rejects.toThrow('Network error') - }) - }) - - describe('getTermsOfUse', () => { - it('calls the correct endpoint', async () => { - // eslint-disable-next-line no-extra-semi - ;(mockApiClient.get as jest.Mock).mockResolvedValueOnce({ data: { terms: 'Sample terms' } }) - const response = await config.getTermsOfUse() - - expect(mockApiClient.get).toHaveBeenCalledWith(`${mockApiClient.baseURL}/cardtap/v3/terms`) - expect(response).toEqual({ terms: 'Sample terms' }) - }) - - it('handles API errors gracefully', async () => { - // eslint-disable-next-line no-extra-semi - ;(mockApiClient.get as jest.Mock).mockRejectedValueOnce(new Error('Network error')) - await expect(config.getTermsOfUse()).rejects.toThrow('Network error') - }) - }) -}) diff --git a/app/__tests__/bcsc-theme/hooks/useFactoryReset.test.ts b/app/__tests__/bcsc-theme/hooks/useFactoryReset.test.ts deleted file mode 100644 index b5635a5..0000000 --- a/app/__tests__/bcsc-theme/hooks/useFactoryReset.test.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { renderHook, act } from '@testing-library/react-native' -import * as BcscCore from 'react-native-bcsc-core' -import * as Bifold from '@bifold/core' -import useApi from '@/bcsc-theme/api/hooks/useApi' -import { useFactoryReset } from '@/bcsc-theme/api/hooks/useFactoryReset' -import { BCDispatchAction } from '@/store' -import { DispatchAction } from '@bifold/core' - -jest.mock('@/bcsc-theme/api/hooks/useApi') -jest.mock('@bifold/core') - -describe('useFactoryReset', () => { - beforeEach(() => { - jest.resetAllMocks() - }) - - it('should factory reset the device when successful', async () => { - const bcscCoreMock = jest.mocked(BcscCore) - const useApiMock = jest.mocked(useApi) - const bifoldMock = jest.mocked(Bifold) - - const deleteRegistrationMock = jest.fn().mockResolvedValue({ success: true }) - const registerMock = jest.fn() - const dispatchMock = jest.fn() - - bcscCoreMock.getAccount.mockResolvedValue({ clientID: 'test-client-id' } as any) - useApiMock.mockImplementation( - () => - ({ - registration: { - deleteRegistration: deleteRegistrationMock, - register: registerMock, - }, - } as any) - ) - bifoldMock.useStore.mockReturnValue([{} as any, dispatchMock]) - bifoldMock.useServices.mockReturnValue([{ info: jest.fn(), error: jest.fn() }] as any) - - const hook = renderHook(() => useFactoryReset()) - - await act(async () => { - const result = await hook.result.current() - expect(result.success).toBe(true) - }) - - expect(bcscCoreMock.getAccount).toHaveBeenCalledWith() - expect(deleteRegistrationMock).toHaveBeenCalledWith('test-client-id') - expect(bcscCoreMock.removeAccount).toHaveBeenCalledWith() - expect(dispatchMock.mock.calls[0]).toStrictEqual([{ type: BCDispatchAction.CLEAR_BCSC }]) - expect(registerMock).toHaveBeenCalledWith() - expect(dispatchMock.mock.calls[1]).toStrictEqual([{ type: DispatchAction.DID_AUTHENTICATE, payload: [false] }]) - }) - - it('should return an error if account is null', async () => { - const bcscCoreMock = jest.mocked(BcscCore) - const useApiMock = jest.mocked(useApi) - const bifoldMock = jest.mocked(Bifold) - - const deleteRegistrationMock = jest.fn() - - bcscCoreMock.getAccount.mockResolvedValue(null) - useApiMock.mockImplementation(() => ({ registration: { deleteRegistration: deleteRegistrationMock } } as any)) - bifoldMock.useStore.mockReturnValue([{} as any, jest.fn()]) - bifoldMock.useServices.mockReturnValue([{ info: jest.fn(), error: jest.fn() }] as any) - - const hook = renderHook(() => useFactoryReset()) - - await act(async () => { - const result = await hook.result.current() - if (result.success) { - expect(true).toBe(false) // Force fail if success is true - } else { - expect(result.success).toBe(false) - expect(result.error.message).toContain('Local account') - } - }) - - expect(bcscCoreMock.getAccount).toHaveBeenCalled() - expect(deleteRegistrationMock).not.toHaveBeenCalled() - }) - - it('should return an error if IAS account deletion fails', async () => { - const bcscCoreMock = jest.mocked(BcscCore) - const useApiMock = jest.mocked(useApi) - const bifoldMock = jest.mocked(Bifold) - - const deleteRegistrationMock = jest.fn().mockResolvedValue({ success: false }) - - bcscCoreMock.getAccount.mockResolvedValue({ clientID: 'test-client-id' } as any) - useApiMock.mockImplementation(() => ({ registration: { deleteRegistration: deleteRegistrationMock } } as any)) - bifoldMock.useStore.mockReturnValue([{} as any, jest.fn()]) - bifoldMock.useServices.mockReturnValue([{ info: jest.fn(), error: jest.fn() }] as any) - - const hook = renderHook(() => useFactoryReset()) - - await act(async () => { - const result = await hook.result.current() - if (result.success) { - expect(true).toBe(false) // Force fail if success is true - } else { - expect(result.success).toBe(false) - expect(result.error.message).toContain('IAS') - } - }) - - expect(bcscCoreMock.getAccount).toHaveBeenCalled() - expect(deleteRegistrationMock).toHaveBeenCalledWith('test-client-id') - }) - - it('should return an error if local account file deletion fails', async () => { - const bcscCoreMock = jest.mocked(BcscCore) - const useApiMock = jest.mocked(useApi) - const bifoldMock = jest.mocked(Bifold) - - const deleteRegistrationMock = jest.fn().mockResolvedValue({ success: true }) - - bcscCoreMock.getAccount.mockResolvedValue({ clientID: 'test-client-id' } as any) - bcscCoreMock.removeAccount.mockRejectedValue(new Error('Failed to remove account')) - useApiMock.mockImplementation(() => ({ registration: { deleteRegistration: deleteRegistrationMock } } as any)) - bifoldMock.useStore.mockReturnValue([{} as any, jest.fn()]) - bifoldMock.useServices.mockReturnValue([{ info: jest.fn(), error: jest.fn() }] as any) - - const hook = renderHook(() => useFactoryReset()) - - await act(async () => { - const result = await hook.result.current() - if (result.success) { - expect(true).toBe(false) // Force fail if success is true - } else { - expect(result.success).toBe(false) - expect(result.error.message).toContain('Failed to remove account') - } - }) - - expect(bcscCoreMock.getAccount).toHaveBeenCalled() - expect(deleteRegistrationMock).toHaveBeenCalledWith('test-client-id') - expect(bcscCoreMock.removeAccount).toHaveBeenCalled() - }) - - it('should return an error if re-registration fails', async () => { - const bcscCoreMock = jest.mocked(BcscCore) - const useApiMock = jest.mocked(useApi) - const bifoldMock = jest.mocked(Bifold) - - const deleteRegistrationMock = jest.fn().mockResolvedValue({ success: true }) - const registerMock = jest.fn().mockRejectedValue(new Error('Failed to register new account')) - - bcscCoreMock.getAccount.mockResolvedValue({ clientID: 'test-client-id' } as any) - useApiMock.mockImplementation( - () => - ({ - registration: { - deleteRegistration: deleteRegistrationMock, - register: registerMock, - }, - } as any) - ) - bifoldMock.useStore.mockReturnValue([{} as any, jest.fn()]) - bifoldMock.useServices.mockReturnValue([{ info: jest.fn(), error: jest.fn() }] as any) - - const hook = renderHook(() => useFactoryReset()) - - await act(async () => { - const result = await hook.result.current() - if (result.success) { - expect(true).toBe(false) // Force fail if success is true - } else { - expect(result.success).toBe(false) - expect(result.error.message).toContain('Failed to register') - } - }) - - expect(bcscCoreMock.getAccount).toHaveBeenCalled() - expect(deleteRegistrationMock).toHaveBeenCalledWith('test-client-id') - expect(bcscCoreMock.removeAccount).toHaveBeenCalled() - expect(registerMock).toHaveBeenCalled() - }) -}) diff --git a/app/__tests__/bcsc-theme/hooks/useFilterServiceClients.test.ts b/app/__tests__/bcsc-theme/hooks/useFilterServiceClients.test.ts deleted file mode 100644 index b6bf25b..0000000 --- a/app/__tests__/bcsc-theme/hooks/useFilterServiceClients.test.ts +++ /dev/null @@ -1,271 +0,0 @@ -import * as Bifold from '@bifold/core' -import { useFilterServiceClients } from '@/bcsc-theme/features/services/hooks/useFilterServiceClients' -import { renderHook, waitFor } from '@testing-library/react-native' -import * as useApi from '@/bcsc-theme/api/hooks/useApi' -import * as navigation from '@react-navigation/native' -import { ClientMetadata } from '@/bcsc-theme/api/hooks/useMetadataApi' -import { BCSCCardProcess } from '@/bcsc-theme/types/cards' - -jest.mock('@bifold/core') -jest.mock('@/bcsc-theme/api/hooks/useApi') -jest.mock('@react-navigation/native') - -const mockServiceClientA: ClientMetadata = { - client_ref_id: 'test-client-id-a', - client_name: 'TEST CLIENT ALPHA', - client_uri: 'https://test.client.a', - application_type: 'web', - claims_description: 'claims', - suppress_confirmation_info: false, - suppress_bookmark_prompt: false, - allowed_identification_processes: [BCSCCardProcess.BCSC], - bc_address: true, -} - -const mockServiceClientB: ClientMetadata = { - client_ref_id: 'test-client-id-b', - client_name: 'TEST CLIENT BETA', - client_uri: 'https://test.client.b', - application_type: 'web', - claims_description: 'claims', - suppress_confirmation_info: false, - suppress_bookmark_prompt: false, - allowed_identification_processes: [BCSCCardProcess.NonBCSC], - bc_address: false, -} - -describe('useFilterServiceClients', () => { - beforeEach(() => { - jest.resetAllMocks() - }) - - describe('no filters', () => { - it('should return all service clients when no filters are applied', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useFilterServiceClients({})) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(2) - expect(hook.result.current[0].client_ref_id).toBe(mockServiceClientA.client_ref_id) - expect(hook.result.current[1].client_ref_id).toBe(mockServiceClientB.client_ref_id) - }) - }) - }) - - describe('card process filter', () => { - it('should filter out service clients by card process', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useFilterServiceClients({ cardProcessFilter: BCSCCardProcess.BCSC })) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(1) - expect(hook.result.current[0].client_ref_id).toBe(mockServiceClientA.client_ref_id) - }) - }) - }) - - describe('BC address filter', () => { - it('should filter out non BC service clients', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useFilterServiceClients({ requireBCAddressFilter: true })) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(1) - expect(hook.result.current[0].client_ref_id).toBe(mockServiceClientA.client_ref_id) - }) - }) - }) - - describe('partial name filter', () => { - it('should filter service clients by partial name match', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useFilterServiceClients({ partialNameFilter: 'ALPHA' })) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(1) - expect(hook.result.current[0].client_ref_id).toBe(mockServiceClientA.client_ref_id) - }) - }) - - it('should filter service clients by partial name match (case insensitive)', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useFilterServiceClients({ partialNameFilter: 'Alpha' })) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(1) - expect(hook.result.current[0].client_ref_id).toBe(mockServiceClientA.client_ref_id) - }) - }) - - it('should filter service clients by partial name match multiple words', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useFilterServiceClients({ partialNameFilter: 'client alpha' })) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(1) - expect(hook.result.current[0].client_ref_id).toBe(mockServiceClientA.client_ref_id) - }) - }) - - it('should return no service clients when no match', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useFilterServiceClients({ partialNameFilter: 'badbadbad' })) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(0) - }) - }) - - it('should return no service clients when partial name words are not contiguous', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useFilterServiceClients({ partialNameFilter: 'TEST ALPHA' })) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(0) - }) - }) - }) - - describe('combined filters', () => { - it('should filter service clients by multiple criteria', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => - useFilterServiceClients({ - cardProcessFilter: BCSCCardProcess.BCSC, - requireBCAddressFilter: true, - partialNameFilter: 'ALPHA', - }) - ) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(1) - expect(hook.result.current[0].client_ref_id).toBe(mockServiceClientA.client_ref_id) - }) - }) - - it('should filter service clients by multiple criteria and return zero when one filter misses', async () => { - const bifoldMock = jest.mocked(Bifold) - const useApiMock = jest.mocked(useApi) - const navigationMock = jest.mocked(navigation) - - useApiMock.default.mockReturnValue({ - metadata: { - getClientMetadata: jest.fn().mockResolvedValue([mockServiceClientA, mockServiceClientB]), - }, - } as any) - navigationMock.useNavigation.mockReturnValue({ navigation: jest.fn() }) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => - useFilterServiceClients({ - cardProcessFilter: BCSCCardProcess.NonBCSC, - requireBCAddressFilter: true, - partialNameFilter: 'ALPHA', - }) - ) - - await waitFor(() => { - expect(hook.result.current).toHaveLength(0) - }) - }) - }) -}) diff --git a/app/__tests__/bcsc-theme/hooks/useQuickLoginURL.test.ts b/app/__tests__/bcsc-theme/hooks/useQuickLoginURL.test.ts deleted file mode 100644 index a0aa692..0000000 --- a/app/__tests__/bcsc-theme/hooks/useQuickLoginURL.test.ts +++ /dev/null @@ -1,186 +0,0 @@ -import * as useApi from '@/bcsc-theme/api/hooks/useApi' -import * as useBCSCApiClient from '@/bcsc-theme/hooks/useBCSCApiClient' -import * as BcscCore from 'react-native-bcsc-core' -import * as tokens from '@/bcsc-theme/utils/push-notification-tokens' -import { useQuickLoginURL } from '@/bcsc-theme/hooks/useQuickLoginUrl' -import * as Bifold from '@bifold/core' -import { renderHook } from '@testing-library/react-native' - -jest.mock('@bifold/core') -jest.mock('@/bcsc-theme/api/hooks/useApi') -jest.mock('@/bcsc-theme/hooks/useBCSCApiClient') -jest.mock('@bcsc-theme/utils/push-notification-tokens') - -describe('useQuickLoginURL', () => { - beforeEach(() => { - jest.resetAllMocks() - }) - - it('should return error when no initiate login uri', async () => { - const useApiMock = jest.mocked(useApi) - const useClientMock = jest.mocked(useBCSCApiClient) - const bifoldMock = jest.mocked(Bifold) - - useApiMock.default.mockReturnValue({ jwks: { getFirstJwk: jest.fn() } } as any) - useClientMock.useBCSCApiClient.mockReturnValue({} as any) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useQuickLoginURL()) - const result = await hook.result.current({ client_ref_id: 'test' }) - - expect(result).toEqual({ success: false, error: expect.stringContaining('login unavailable') }) - }) - - it('should return error when no client access token', async () => { - const useApiMock = jest.mocked(useApi) - const useClientMock = jest.mocked(useBCSCApiClient) - const bifoldMock = jest.mocked(Bifold) - - useApiMock.default.mockReturnValue({ jwks: { getFirstJwk: jest.fn() } } as any) - useClientMock.useBCSCApiClient.mockReturnValue({} as any) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useQuickLoginURL()) - const result = await hook.result.current({ client_ref_id: 'test', initiate_login_uri: 'https://example.com' }) - - expect(result).toEqual({ success: false, error: expect.stringContaining('access token') }) - }) - - it('should return error when no notification tokens available', async () => { - const useApiMock = jest.mocked(useApi) - const useClientMock = jest.mocked(useBCSCApiClient) - const bifoldMock = jest.mocked(Bifold) - const bcscCoreMock = jest.mocked(BcscCore) - const tokensMock = jest.mocked(tokens) - - const getFirstJwkMock = jest.fn() - bcscCoreMock.getAccount = jest.fn() - tokensMock.getNotificationTokens = jest.fn() - - useApiMock.default.mockReturnValue({ jwks: { getFirstJwk: getFirstJwkMock } } as any) - useClientMock.useBCSCApiClient.mockReturnValue({ tokens: { access_token: true } } as any) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useQuickLoginURL()) - const result = await hook.result.current({ client_ref_id: 'test', initiate_login_uri: 'https://example.com' }) - - expect(result).toEqual({ success: false, error: expect.stringContaining('notification tokens') }) - - expect(tokensMock.getNotificationTokens).toHaveBeenCalledTimes(1) - expect(bcscCoreMock.getAccount).toHaveBeenCalledTimes(1) - expect(getFirstJwkMock).toHaveBeenCalledTimes(1) - }) - - it('should return error when no account available', async () => { - const useApiMock = jest.mocked(useApi) - const useClientMock = jest.mocked(useBCSCApiClient) - const bifoldMock = jest.mocked(Bifold) - const bcscCoreMock = jest.mocked(BcscCore) - const tokensMock = jest.mocked(tokens) - - const getFirstJwkMock = jest.fn() - bcscCoreMock.getAccount = jest.fn() - tokensMock.getNotificationTokens = jest.fn().mockResolvedValue(true) - - useApiMock.default.mockReturnValue({ jwks: { getFirstJwk: getFirstJwkMock } } as any) - useClientMock.useBCSCApiClient.mockReturnValue({ tokens: { access_token: true } } as any) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useQuickLoginURL()) - const result = await hook.result.current({ client_ref_id: 'test', initiate_login_uri: 'https://example.com' }) - - expect(result).toEqual({ success: false, error: expect.stringContaining('account') }) - - expect(tokensMock.getNotificationTokens).toHaveBeenCalledTimes(1) - expect(bcscCoreMock.getAccount).toHaveBeenCalledTimes(1) - expect(getFirstJwkMock).toHaveBeenCalledTimes(1) - }) - - it('should return error when no jwk available', async () => { - const useApiMock = jest.mocked(useApi) - const useClientMock = jest.mocked(useBCSCApiClient) - const bifoldMock = jest.mocked(Bifold) - const bcscCoreMock = jest.mocked(BcscCore) - const tokensMock = jest.mocked(tokens) - - const getFirstJwkMock = jest.fn() - bcscCoreMock.getAccount = jest.fn().mockResolvedValue(true) - tokensMock.getNotificationTokens = jest.fn().mockResolvedValue(true) - - useApiMock.default.mockReturnValue({ jwks: { getFirstJwk: getFirstJwkMock } } as any) - useClientMock.useBCSCApiClient.mockReturnValue({ tokens: { access_token: true } } as any) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useQuickLoginURL()) - const result = await hook.result.current({ client_ref_id: 'test', initiate_login_uri: 'https://example.com' }) - - expect(result).toEqual({ success: false, error: expect.stringContaining('JWK') }) - - expect(tokensMock.getNotificationTokens).toHaveBeenCalledTimes(1) - expect(bcscCoreMock.getAccount).toHaveBeenCalledTimes(1) - expect(getFirstJwkMock).toHaveBeenCalledTimes(1) - }) - - it('should return error when failed to create quick login JWT', async () => { - const useApiMock = jest.mocked(useApi) - const useClientMock = jest.mocked(useBCSCApiClient) - const bifoldMock = jest.mocked(Bifold) - const bcscCoreMock = jest.mocked(BcscCore) - const tokensMock = jest.mocked(tokens) - - const getFirstJwkMock = jest.fn().mockResolvedValue(true) - bcscCoreMock.getAccount = jest.fn().mockResolvedValue(true) - tokensMock.getNotificationTokens = jest.fn().mockResolvedValue(true) - bcscCoreMock.createQuickLoginJWT = jest.fn().mockRejectedValue(new Error('failed jwt')) - - useApiMock.default.mockReturnValue({ jwks: { getFirstJwk: getFirstJwkMock } } as any) - useClientMock.useBCSCApiClient.mockReturnValue({ tokens: { access_token: true } } as any) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useQuickLoginURL()) - const result = await hook.result.current({ client_ref_id: 'test', initiate_login_uri: 'https://example.com' }) - - expect(result).toEqual({ success: false, error: expect.stringContaining('failed jwt') }) - - expect(tokensMock.getNotificationTokens).toHaveBeenCalledTimes(1) - expect(bcscCoreMock.getAccount).toHaveBeenCalledTimes(1) - expect(getFirstJwkMock).toHaveBeenCalledTimes(1) - expect(bcscCoreMock.createQuickLoginJWT).toHaveBeenCalledTimes(1) - }) - - it('should return the quick login URL', async () => { - const useApiMock = jest.mocked(useApi) - const useClientMock = jest.mocked(useBCSCApiClient) - const bifoldMock = jest.mocked(Bifold) - const bcscCoreMock = jest.mocked(BcscCore) - const tokensMock = jest.mocked(tokens) - - const getFirstJwkMock = jest.fn().mockResolvedValue('jwk') - bcscCoreMock.getAccount = jest.fn().mockResolvedValue({ clientID: 'client-id', issuer: 'issuer' } as any) - tokensMock.getNotificationTokens = jest.fn().mockResolvedValue({ fcmDeviceToken: 'fcm', apnsToken: 'apns' }) - bcscCoreMock.createQuickLoginJWT = jest.fn().mockResolvedValue('test-jwt') - - useApiMock.default.mockReturnValue({ jwks: { getFirstJwk: getFirstJwkMock } } as any) - useClientMock.useBCSCApiClient.mockReturnValue({ tokens: { access_token: 'access-token' } } as any) - bifoldMock.useServices.mockReturnValue([{ error: jest.fn() }] as any) - - const hook = renderHook(() => useQuickLoginURL()) - const result = await hook.result.current({ client_ref_id: 'test', initiate_login_uri: 'https://example.com' }) - - expect(result).toEqual({ success: true, url: `https://example.com?login_hint=${encodeURIComponent('test-jwt')}` }) - - expect(tokensMock.getNotificationTokens).toHaveBeenCalledTimes(1) - expect(bcscCoreMock.getAccount).toHaveBeenCalledTimes(1) - expect(getFirstJwkMock).toHaveBeenCalledTimes(1) - expect(bcscCoreMock.createQuickLoginJWT).toHaveBeenCalledTimes(1) - expect(bcscCoreMock.createQuickLoginJWT).toHaveBeenCalledWith( - 'access-token', - 'client-id', - 'issuer', - 'test', - 'jwk', - 'fcm', - 'apns' - ) - }) -}) diff --git a/app/__tests__/bcsc-theme/utils/address-utils.test.ts b/app/__tests__/bcsc-theme/utils/address-utils.test.ts deleted file mode 100644 index 713b0c5..0000000 --- a/app/__tests__/bcsc-theme/utils/address-utils.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { isCanadianPostalCode } from '@/bcsc-theme/utils/address-utils' - -describe('address-utils', () => { - describe('isCanadianPostalCode', () => { - it('should return true for valid postal codes', () => { - expect(isCanadianPostalCode('A1B 2C3')).toBeTruthy() - expect(isCanadianPostalCode('K1A 0B1')).toBeTruthy() - expect(isCanadianPostalCode('V6B 1A1')).toBeTruthy() - expect(isCanadianPostalCode('H2Y 1N4')).toBeTruthy() - expect(isCanadianPostalCode('T5J 1N9')).toBeTruthy() - expect(isCanadianPostalCode('R3C 4T3')).toBeTruthy() - expect(isCanadianPostalCode('S7K 3J8')).toBeTruthy() - expect(isCanadianPostalCode('Y1A 5B2')).toBeTruthy() - expect(isCanadianPostalCode('X1A 2P3')).toBeTruthy() - expect(isCanadianPostalCode('X0A 1H0')).toBeTruthy() - expect(isCanadianPostalCode('B2H 3K4')).toBeTruthy() - expect(isCanadianPostalCode('C1A 4N5')).toBeTruthy() - expect(isCanadianPostalCode('E3B 5L6')).toBeTruthy() - expect(isCanadianPostalCode('G1R 2X5')).toBeTruthy() - expect(isCanadianPostalCode('M5V 3L9')).toBeTruthy() - expect(isCanadianPostalCode('R2M 3S8')).toBeTruthy() - expect(isCanadianPostalCode('S4P 2K5')).toBeTruthy() - expect(isCanadianPostalCode('V5K 0A1')).toBeTruthy() - expect(isCanadianPostalCode('Y1A 0A8')).toBeTruthy() - expect(isCanadianPostalCode('X0B 1E0')).toBeTruthy() - expect(isCanadianPostalCode('V8Z 1C8')).toBeTruthy() - }) - - it('should return true for valid postal codes without spaces', () => { - expect(isCanadianPostalCode('A1B2C3')).toBeTruthy() - }) - - it('should return true for valid postal codes in lowercase', () => { - expect(isCanadianPostalCode('a1b 2c3')).toBeTruthy() - }) - - it('should return true for valid postal codes in lowercase without spaces', () => { - expect(isCanadianPostalCode('a1b2c3')).toBeTruthy() - }) - - it('should return true for valid postal codes with hyphens', () => { - expect(isCanadianPostalCode('A1B-2C3')).toBeTruthy() - }) - - it('should return true for valid postal codes with any combination of casing, spaces and hyphens', () => { - expect(isCanadianPostalCode('a1B-2c3')).toBeTruthy() - expect(isCanadianPostalCode('A1b-2C3')).toBeTruthy() - expect(isCanadianPostalCode('a1B 2c3')).toBeTruthy() - expect(isCanadianPostalCode('A1b 2C3')).toBeTruthy() - expect(isCanadianPostalCode('a1B2c3')).toBeTruthy() - expect(isCanadianPostalCode('A1b2C3')).toBeTruthy() - }) - - it('should return false for invalid postal codes', () => { - expect(isCanadianPostalCode('123 456')).toBeFalsy() - expect(isCanadianPostalCode('ABC DEF')).toBeFalsy() - expect(isCanadianPostalCode('A1B2C')).toBeFalsy() - expect(isCanadianPostalCode('A1B 2C34')).toBeFalsy() - expect(isCanadianPostalCode('A1B-2C34')).toBeFalsy() - expect(isCanadianPostalCode('A1B_2C3')).toBeFalsy() - expect(isCanadianPostalCode('A1 2C3')).toBeFalsy() - expect(isCanadianPostalCode('1A1 2C3')).toBeFalsy() - expect(isCanadianPostalCode('A11 2C3')).toBeFalsy() - expect(isCanadianPostalCode('A1A 22C3')).toBeFalsy() - expect(isCanadianPostalCode('A1A 2CC3')).toBeFalsy() - expect(isCanadianPostalCode('A1A2C3 ')).toBeFalsy() - expect(isCanadianPostalCode(' A1A2C3')).toBeFalsy() - expect(isCanadianPostalCode('')).toBeFalsy() - expect(isCanadianPostalCode(' ')).toBeFalsy() - expect(isCanadianPostalCode('A B C D E F')).toBeFalsy() - expect(isCanadianPostalCode('A-1B-2C-3')).toBeFalsy() - expect(isCanadianPostalCode('A_1B_2C_3')).toBeFalsy() - expect(isCanadianPostalCode('A1B@2C3')).toBeFalsy() - expect(isCanadianPostalCode('A1B#2C3')).toBeFalsy() - expect(isCanadianPostalCode('A1B$2C3')).toBeFalsy() - expect(isCanadianPostalCode('A1B%2C3')).toBeFalsy() - expect(isCanadianPostalCode('A1B^2C3')).toBeFalsy() - }) - }) -}) diff --git a/app/__tests__/bcsc-theme/utils/card-utils.test.ts b/app/__tests__/bcsc-theme/utils/card-utils.test.ts deleted file mode 100644 index 76c36bf..0000000 --- a/app/__tests__/bcsc-theme/utils/card-utils.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { BCSCCardProcess, BCSCCardType } from '@/bcsc-theme/types/cards' -import { getCardProcessForCardType } from '@/bcsc-theme/utils/card-utils' - -describe('Card Utils', () => { - describe('getCardProcessForCardType', () => { - it('should return BCSC for Combined card type', () => { - expect(getCardProcessForCardType(BCSCCardType.Combined)).toBe(BCSCCardProcess.BCSC) - }) - - it('should return BCSC for Photo card type', () => { - expect(getCardProcessForCardType(BCSCCardType.Photo)).toBe(BCSCCardProcess.BCSC) - }) - - it('should return BCSCNonPhoto for NonPhoto card type', () => { - expect(getCardProcessForCardType(BCSCCardType.NonPhoto)).toBe(BCSCCardProcess.BCSCNonPhoto) - }) - - it('should return NonBCSC for Other card type', () => { - expect(getCardProcessForCardType(BCSCCardType.Other)).toBe(BCSCCardProcess.NonBCSC) - }) - - it('should throw an error for None card type', () => { - expect(() => getCardProcessForCardType(BCSCCardType.None)).toThrow(`Invalid card type: ${BCSCCardType.None}}`) - }) - - it('should throw an error for unknown card type', () => { - expect(() => getCardProcessForCardType(99 as any)).toThrow('Unknown card type: 99') - }) - - it('should support all BCSCCardType values', () => { - const cardTypes = Object.values(BCSCCardType) - cardTypes.forEach((cardType) => { - if (cardType === BCSCCardType.None) { - expect(() => getCardProcessForCardType(cardType)).toThrow() - } else { - const process = getCardProcessForCardType(cardType) - expect(Object.values(BCSCCardProcess)).toContain(process) - } - }) - }) - }) -}) diff --git a/app/__tests__/components/AppBanner.test.tsx b/app/__tests__/components/AppBanner.test.tsx deleted file mode 100644 index 03b845f..0000000 --- a/app/__tests__/components/AppBanner.test.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react' -import { render, fireEvent } from '@testing-library/react-native' -import { AppBanner, AppBannerSection, AppBannerSectionProps } from '../../src/bcsc-theme/components/AppBanner' -import { testIdWithKey } from '@bifold/core' - -describe('AppBanner', () => { - it('renders correctly with multiple messages', () => { - const messages: AppBannerSectionProps[] = [ - { title: 'Error Message', type: 'error', dismissible: true }, - { title: 'Warning Message', type: 'warning', dismissible: false }, - ] - - const { getByText } = render() - - expect(getByText('Error Message')).toBeTruthy() - expect(getByText('Warning Message')).toBeTruthy() - }) - - it('dismisses a banner when dismissible and tapped', () => { - const messages: AppBannerSectionProps[] = [ - { title: 'Dismissible Message', type: 'info', dismissible: true }, - { title: 'Non dismissible Message', type: 'warning', dismissible: false }, - ] - - const { getByText, queryByText } = render() - - expect(getByText('Dismissible Message')).toBeTruthy() - - fireEvent.press(getByText('Dismissible Message')) - - expect(queryByText('Dismissible Message')).toBeFalsy() - expect(getByText('Non dismissible Message')).toBeTruthy() - }) - - it('does not dismiss a non-dismissible banner when tapped', () => { - const messages: AppBannerSectionProps[] = [ - { title: 'Non dismissible Message', type: 'warning', dismissible: false }, - ] - - const { getByText } = render() - - fireEvent.press(getByText('Non dismissible Message')) - - expect(getByText('Non dismissible Message')).toBeTruthy() - }) -}) - -describe('AppBannerSection', () => { - it('renders correctly with the correct icon and color for type', () => { - const { getByText, getByTestId } = render( - - ) - - expect(getByText('Success Message')).toBeTruthy() - expect(getByTestId(testIdWithKey('icon-success'))).toBeTruthy() - }) - - it('calls onDismiss when tapped and dismissible', () => { - const onDismissMock = jest.fn() - - const { getByText } = render( - - ) - - fireEvent.press(getByText('Dismissible Message')) - - expect(onDismissMock).toHaveBeenCalled() - }) - - it('does not call onDismiss when not dismissible', () => { - const onDismissMock = jest.fn() - - const { getByText } = render( - - ) - - fireEvent.press(getByText('Non-dismissible Message')) - - expect(onDismissMock).not.toHaveBeenCalled() - }) -}) diff --git a/app/__tests__/components/__snapshots__/EmptyList.test.tsx.snap b/app/__tests__/components/__snapshots__/EmptyList.test.tsx.snap index 88a6520..a61f7d3 100644 --- a/app/__tests__/components/__snapshots__/EmptyList.test.tsx.snap +++ b/app/__tests__/components/__snapshots__/EmptyList.test.tsx.snap @@ -120,9 +120,7 @@ exports[`EmptyList Component renders correctly 1`] = ` accessible={true} collapsable={false} focusable={true} - onBlur={[Function]} onClick={[Function]} - onFocus={[Function]} onResponderGrant={[Function]} onResponderMove={[Function]} onResponderRelease={[Function]} @@ -130,29 +128,22 @@ exports[`EmptyList Component renders correctly 1`] = ` onResponderTerminationRequest={[Function]} onStartShouldSetResponder={[Function]} style={ - [ - { - "overflow": "hidden", - }, - { - "backgroundColor": "#622C62", - "borderRadius": 10, - "elevation": 4, - "padding": 16, - "paddingHorizontal": 16, - "paddingVertical": 12, - "shadowColor": "#000000", - "shadowOffset": { - "height": 4, - "width": 0, - }, - "shadowOpacity": 0.15, - "shadowRadius": 4, + { + "backgroundColor": "#622C62", + "borderRadius": 10, + "elevation": 4, + "opacity": 1, + "padding": 16, + "paddingHorizontal": 16, + "paddingVertical": 12, + "shadowColor": "#000000", + "shadowOffset": { + "height": 4, + "width": 0, }, - false, - false, - false, - ] + "shadowOpacity": 0.15, + "shadowRadius": 4, + } } testID="com.ariesbifold:id/AddFirstCredential" > @@ -186,7 +177,6 @@ exports[`EmptyList Component renders correctly 1`] = ` }, false, false, - false, ], ] } diff --git a/app/__tests__/hooks/useSetupSteps.test.tsx b/app/__tests__/hooks/useSetupSteps.test.tsx deleted file mode 100644 index 6b4cbbf..0000000 --- a/app/__tests__/hooks/useSetupSteps.test.tsx +++ /dev/null @@ -1,308 +0,0 @@ -import { BCSCCardType } from '@/bcsc-theme/types/cards' -import { useSetupSteps } from '@/hooks/useSetupSteps' -import { initialState } from '@/store' -import { renderHook } from '@testing-library/react-native' -import lodash from 'lodash' - -describe('useSetupSteps Hook', () => { - describe('Init', () => { - it('all steps should not be focused and completed', () => { - // note: const store = { ...initialState } clones only top level, nested objects remain references - const store = lodash.cloneDeep(initialState) - - const { result: hook } = renderHook(() => useSetupSteps(store)) - - expect(hook.current.id.completed).toBe(false) - expect(hook.current.id.focused).toBe(true) - expect(hook.current.address.completed).toBe(false) - expect(hook.current.address.focused).toBe(false) - expect(hook.current.email.completed).toBe(false) - expect(hook.current.email.focused).toBe(false) - expect(hook.current.verify.completed).toBe(false) - expect(hook.current.verify.focused).toBe(false) - }) - }) - - describe('ID Step', () => { - it('Combo Card: should be completed when serial and email provided', () => { - const store = lodash.cloneDeep(initialState) - - const hook = renderHook(() => useSetupSteps(store)) - - expect(hook.result.current.id.completed).toBe(false) - expect(hook.result.current.id.focused).toBe(true) - - store.bcsc.cardType = BCSCCardType.Combined - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - - hook.rerender(store) - - expect(hook.result.current.id.completed).toBe(true) - expect(hook.result.current.id.focused).toBe(false) - }) - - it('Non-Photo Card: should be completed when serial, email, and photo ID provided', () => { - const store = lodash.cloneDeep(initialState) - - const hook = renderHook(() => useSetupSteps(store)) - - expect(hook.result.current.id.completed).toBe(false) - expect(hook.result.current.id.focused).toBe(true) - expect(hook.result.current.id.nonPhotoBcscNeedsAdditionalCard).toBe(false) - - store.bcsc.cardType = BCSCCardType.NonPhoto - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - - hook.rerender(store) - - expect(hook.result.current.id.completed).toBe(false) - expect(hook.result.current.id.focused).toBe(true) - expect(hook.result.current.id.nonPhotoBcscNeedsAdditionalCard).toBe(true) - - store.bcsc.additionalEvidenceData = [ - { - evidenceType: { - has_photo: true, - }, - }, - ] as any[] - - hook.rerender(store) - - expect(hook.result.current.id.completed).toBe(true) - expect(hook.result.current.id.focused).toBe(false) - expect(hook.result.current.id.nonPhotoBcscNeedsAdditionalCard).toBe(false) - }) - - it('Non-BCSC Card: should be completed when 2 IDs provided', () => { - const store = lodash.cloneDeep(initialState) - - const hook = renderHook(() => useSetupSteps(store)) - - expect(hook.result.current.id.completed).toBe(false) - expect(hook.result.current.id.focused).toBe(true) - expect(hook.result.current.id.nonBcscNeedsAdditionalCard).toBe(false) - - store.bcsc.cardType = BCSCCardType.Other - - hook.rerender(store) - - expect(hook.result.current.id.completed).toBe(false) - expect(hook.result.current.id.focused).toBe(true) - expect(hook.result.current.id.nonBcscNeedsAdditionalCard).toBe(false) - - store.bcsc.additionalEvidenceData = [ - { - evidenceType: { - has_photo: false, - }, - }, - ] as any[] - - hook.rerender(store) - - expect(hook.result.current.id.completed).toBe(false) - expect(hook.result.current.id.focused).toBe(true) - expect(hook.result.current.id.nonBcscNeedsAdditionalCard).toBe(true) - - store.bcsc.additionalEvidenceData = [ - { - evidenceType: { - has_photo: false, - }, - }, - { - evidenceType: { - has_photo: true, - }, - }, - ] as any[] - - hook.rerender(store) - - expect(hook.result.current.id.completed).toBe(true) - expect(hook.result.current.id.focused).toBe(false) - expect(hook.result.current.id.nonBcscNeedsAdditionalCard).toBe(false) - }) - }) - - describe('Residential Address Step', () => { - it('should be focused when ID step completed but address not yet completed', () => { - const store = lodash.cloneDeep(initialState) - - store.bcsc.cardType = BCSCCardType.Combined - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - - const hook = renderHook(() => useSetupSteps(store)) - - // Address step should be focused - expect(hook.result.current.address.focused).toBe(true) - expect(hook.result.current.address.completed).toBe(false) - }) - - it('should be completed when device code is provided', () => { - const store = lodash.cloneDeep(initialState) - - store.bcsc.cardType = BCSCCardType.Combined - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - store.bcsc.deviceCode = 'ABCDEFGH' - - const hook = renderHook(() => useSetupSteps(store)) - - expect(hook.result.current.address.focused).toBe(false) - expect(hook.result.current.address.completed).toBe(true) - }) - }) - - describe('Email Step', () => { - it('should be focused when ID step completed, address step completed, but email not yet completed', () => { - const store = lodash.cloneDeep(initialState) - - store.bcsc.cardType = BCSCCardType.Combined - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - store.bcsc.deviceCode = 'ABCDEFGH' - - const hook = renderHook(() => useSetupSteps(store)) - - expect(hook.result.current.email.focused).toBe(true) - expect(hook.result.current.email.completed).toBe(false) - }) - - it('should be completed when email and emailConfirmed are provided', () => { - const store = lodash.cloneDeep(initialState) - - store.bcsc.cardType = BCSCCardType.Combined - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - store.bcsc.deviceCode = 'ABCDEFGH' - store.bcsc.emailConfirmed = true - - const hook = renderHook(() => useSetupSteps(store)) - - expect(hook.result.current.email.focused).toBe(false) - expect(hook.result.current.email.completed).toBe(true) - }) - }) - - describe('Verify Step', () => { - it('should be focused when ID step completed, address step completed, email step completed, but verify not yet completed', () => { - const store = lodash.cloneDeep(initialState) - - store.bcsc.cardType = BCSCCardType.Combined - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - store.bcsc.deviceCode = 'ABCDEFGH' - store.bcsc.emailConfirmed = true - store.bcsc.verified = false - - const hook = renderHook(() => useSetupSteps(store)) - - expect(hook.result.current.verify.focused).toBe(true) - expect(hook.result.current.verify.completed).toBe(false) - }) - - it('should be completed when verified is true', () => { - const store = lodash.cloneDeep(initialState) - - store.bcsc.cardType = BCSCCardType.Combined - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - store.bcsc.deviceCode = 'ABCDEFGH' - store.bcsc.emailConfirmed = true - store.bcsc.verified = true - store.bcsc.pendingVerification = false - - const hook = renderHook(() => useSetupSteps(store)) - - expect(hook.result.current.verify.focused).toBe(false) - expect(hook.result.current.verify.completed).toBe(true) - }) - - it('should be focused when pendingVerification is true', () => { - const store = lodash.cloneDeep(initialState) - - store.bcsc.cardType = BCSCCardType.Combined - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - store.bcsc.deviceCode = 'ABCDEFGH' - store.bcsc.emailConfirmed = true - store.bcsc.verified = true - store.bcsc.pendingVerification = true - - const hook = renderHook(() => useSetupSteps(store)) - - expect(hook.result.current.verify.focused).toBe(true) - expect(hook.result.current.verify.completed).toBe(false) - }) - }) - - describe('Full workflow', () => { - it('should progress through all steps to completion', () => { - const store = lodash.cloneDeep(initialState) - - const hook = renderHook(() => useSetupSteps(store)) - - // Step 1: ID step should be focused - expect(hook.result.current.id.completed).toBe(false) - expect(hook.result.current.id.focused).toBe(true) - expect(hook.result.current.address.completed).toBe(false) - expect(hook.result.current.address.focused).toBe(false) - expect(hook.result.current.email.completed).toBe(false) - expect(hook.result.current.email.focused).toBe(false) - expect(hook.result.current.verify.completed).toBe(false) - expect(hook.result.current.verify.focused).toBe(false) - - // Complete Step 1 - store.bcsc.cardType = BCSCCardType.Combined - store.bcsc.serial = '123456789' - store.bcsc.email = 'steveBrule@email.com' - - hook.rerender(store) - - expect(hook.result.current.id.completed).toBe(true) - expect(hook.result.current.id.focused).toBe(false) - - // Step 2: Address step should be focused - expect(hook.result.current.address.completed).toBe(false) - expect(hook.result.current.address.focused).toBe(true) - - // Complete Step 2 - store.bcsc.deviceCode = 'ABCDEFGH' - - hook.rerender(store) - - expect(hook.result.current.address.completed).toBe(true) - expect(hook.result.current.address.focused).toBe(false) - - // Step 3: Email step should be focused - expect(hook.result.current.email.completed).toBe(false) - expect(hook.result.current.email.focused).toBe(true) - - // Complete Step 3 - store.bcsc.emailConfirmed = true - - hook.rerender(store) - - expect(hook.result.current.email.completed).toBe(true) - expect(hook.result.current.email.focused).toBe(false) - - // Step 4: Verify step should be focused - expect(hook.result.current.verify.completed).toBe(false) - expect(hook.result.current.verify.focused).toBe(true) - - // Complete Step 4 - store.bcsc.verified = true - store.bcsc.pendingVerification = false - - hook.rerender(store) - - expect(hook.result.current.verify.completed).toBe(true) - expect(hook.result.current.verify.focused).toBe(false) - }) - }) -}) diff --git a/app/__tests__/navigation/__snapshots__/QRCodeFlow.test.tsx.snap b/app/__tests__/navigation/__snapshots__/QRCodeFlow.test.tsx.snap index 2d34fa8..11d67ad 100644 --- a/app/__tests__/navigation/__snapshots__/QRCodeFlow.test.tsx.snap +++ b/app/__tests__/navigation/__snapshots__/QRCodeFlow.test.tsx.snap @@ -3,7 +3,6 @@ exports[`QR Code Flow Integration QRCodeExchangeSlider renders correctly in AdvancedIdentity context 1`] = ` @@ -255,20 +257,22 @@ exports[`QR Code Flow Integration QRCodeExchangeSlider renders correctly in Adva style={ [ { - "color": "#FFFFFF", + "color": "#4A4A4A", + "fontFamily": "SourceSans3-Regular", "fontSize": 18, "fontWeight": "normal", }, [ { "color": "#FFFFFF", + "fontFamily": "SourceSans3-Regular", "fontSize": 18, "fontWeight": "bold", + "lineHeight": 24, "textAlign": "center", }, false, false, - false, ], ] } @@ -308,9 +312,7 @@ exports[`QR Code Flow Integration QRCodeExchangeSlider renders correctly in Adva accessible={true} collapsable={false} focusable={true} - onBlur={[Function]} onClick={[Function]} - onFocus={[Function]} onResponderGrant={[Function]} onResponderMove={[Function]} onResponderRelease={[Function]} @@ -318,19 +320,20 @@ exports[`QR Code Flow Integration QRCodeExchangeSlider renders correctly in Adva onResponderTerminationRequest={[Function]} onStartShouldSetResponder={[Function]} style={ - [ - { - "overflow": "hidden", - }, - { - "backgroundColor": "#42803E", - "borderRadius": 4, - "padding": 16, + { + "backgroundColor": "#622C62", + "borderRadius": 10, + "elevation": 4, + "opacity": 1, + "padding": 16, + "shadowColor": "#000000", + "shadowOffset": { + "height": 4, + "width": 0, }, - false, - false, - false, - ] + "shadowOpacity": 0.15, + "shadowRadius": 4, + } } testID="com.ariesbifold:id/GenerateQRCode" > @@ -348,20 +351,22 @@ exports[`QR Code Flow Integration QRCodeExchangeSlider renders correctly in Adva style={ [ { - "color": "#FFFFFF", + "color": "#4A4A4A", + "fontFamily": "SourceSans3-Regular", "fontSize": 18, "fontWeight": "normal", }, [ { "color": "#FFFFFF", + "fontFamily": "SourceSans3-Regular", "fontSize": 18, "fontWeight": "bold", + "lineHeight": 24, "textAlign": "center", }, false, false, - false, ], ] } diff --git a/app/__tests__/navigation/__snapshots__/TabNavigation.test.tsx.snap b/app/__tests__/navigation/__snapshots__/TabNavigation.test.tsx.snap index 66236ca..cd990ef 100644 --- a/app/__tests__/navigation/__snapshots__/TabNavigation.test.tsx.snap +++ b/app/__tests__/navigation/__snapshots__/TabNavigation.test.tsx.snap @@ -3,7 +3,6 @@ exports[`Tab Navigation Integration QRCodeExchangeSlider renders correctly 1`] = ` @@ -255,20 +257,22 @@ exports[`Tab Navigation Integration QRCodeExchangeSlider renders correctly 1`] = style={ [ { - "color": "#FFFFFF", + "color": "#4A4A4A", + "fontFamily": "SourceSans3-Regular", "fontSize": 18, "fontWeight": "normal", }, [ { "color": "#FFFFFF", + "fontFamily": "SourceSans3-Regular", "fontSize": 18, "fontWeight": "bold", + "lineHeight": 24, "textAlign": "center", }, false, false, - false, ], ] } @@ -308,9 +312,7 @@ exports[`Tab Navigation Integration QRCodeExchangeSlider renders correctly 1`] = accessible={true} collapsable={false} focusable={true} - onBlur={[Function]} onClick={[Function]} - onFocus={[Function]} onResponderGrant={[Function]} onResponderMove={[Function]} onResponderRelease={[Function]} @@ -318,19 +320,20 @@ exports[`Tab Navigation Integration QRCodeExchangeSlider renders correctly 1`] = onResponderTerminationRequest={[Function]} onStartShouldSetResponder={[Function]} style={ - [ - { - "overflow": "hidden", - }, - { - "backgroundColor": "#42803E", - "borderRadius": 4, - "padding": 16, + { + "backgroundColor": "#622C62", + "borderRadius": 10, + "elevation": 4, + "opacity": 1, + "padding": 16, + "shadowColor": "#000000", + "shadowOffset": { + "height": 4, + "width": 0, }, - false, - false, - false, - ] + "shadowOpacity": 0.15, + "shadowRadius": 4, + } } testID="com.ariesbifold:id/GenerateQRCode" > @@ -348,20 +351,22 @@ exports[`Tab Navigation Integration QRCodeExchangeSlider renders correctly 1`] = style={ [ { - "color": "#FFFFFF", + "color": "#4A4A4A", + "fontFamily": "SourceSans3-Regular", "fontSize": 18, "fontWeight": "normal", }, [ { "color": "#FFFFFF", + "fontFamily": "SourceSans3-Regular", "fontSize": 18, "fontWeight": "bold", + "lineHeight": 24, "textAlign": "center", }, false, false, - false, ], ] } diff --git a/app/__tests__/screens/__snapshots__/Developer.test.tsx.snap b/app/__tests__/screens/__snapshots__/Developer.test.tsx.snap index 89d2a7b..05d9fc2 100644 --- a/app/__tests__/screens/__snapshots__/Developer.test.tsx.snap +++ b/app/__tests__/screens/__snapshots__/Developer.test.tsx.snap @@ -103,8 +103,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -358,8 +357,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -469,8 +467,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -580,8 +577,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -691,8 +687,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -802,8 +797,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -913,8 +907,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -1024,8 +1017,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -1119,8 +1111,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -1213,8 +1204,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, + "alignSelf": "flex-start", }, { "backgroundColor": "#D3D3D3", @@ -1307,196 +1297,7 @@ exports[`Developer Screen screen renders correctly 1`] = ` style={ [ { - "height": 31, - "width": 51, - }, - { - "backgroundColor": "#D3D3D3", - "borderRadius": 16, - }, - ] - } - thumbTintColor="#666666" - tintColor="#D3D3D3" - value={false} - /> - - - - - - - Developer.SwitchTheme - - - - - - - - - - Developer.SwitchMode - - - @@ -173,7 +164,6 @@ exports[`Person Credential Screen screen renders correctly 1`] = ` }, false, false, - false, ], ] } diff --git a/app/__tests__/screens/__snapshots__/RemoteLogWarning.test.tsx.snap b/app/__tests__/screens/__snapshots__/RemoteLogWarning.test.tsx.snap index 69f937f..b5e5475 100644 --- a/app/__tests__/screens/__snapshots__/RemoteLogWarning.test.tsx.snap +++ b/app/__tests__/screens/__snapshots__/RemoteLogWarning.test.tsx.snap @@ -412,7 +412,6 @@ exports[`RemoteLogWarning Screen screen renders correctly 1`] = ` style={ { "alignItems": "center", - "flex": 1, "flexDirection": "row-reverse", "margin": 10, } @@ -544,10 +543,8 @@ exports[`RemoteLogWarning Screen screen renders correctly 1`] = ` } accessible={true} collapsable={false} - focusable={true} - onBlur={[Function]} + focusable={false} onClick={[Function]} - onFocus={[Function]} onResponderGrant={[Function]} onResponderMove={[Function]} onResponderRelease={[Function]} @@ -555,35 +552,22 @@ exports[`RemoteLogWarning Screen screen renders correctly 1`] = ` onResponderTerminationRequest={[Function]} onStartShouldSetResponder={[Function]} style={ - [ - { - "overflow": "hidden", - }, - { - "backgroundColor": "#622C62", - "borderRadius": 10, - "elevation": 4, - "padding": 16, - "paddingHorizontal": 16, - "paddingVertical": 12, - "shadowColor": "#000000", - "shadowOffset": { - "height": 4, - "width": 0, - }, - "shadowOpacity": 0.15, - "shadowRadius": 4, - }, - { - "backgroundColor": "rgba(98, 44, 98, 0.7)", - "borderRadius": 10, - "padding": 16, - "paddingHorizontal": 16, - "paddingVertical": 12, + { + "backgroundColor": "rgba(98, 44, 98, 0.7)", + "borderRadius": 10, + "elevation": 4, + "opacity": 1, + "padding": 16, + "paddingHorizontal": 16, + "paddingVertical": 12, + "shadowColor": "#000000", + "shadowOffset": { + "height": 4, + "width": 0, }, - false, - false, - ] + "shadowOpacity": 0.15, + "shadowRadius": 4, + } } testID="com.ariesbifold:id/TurnOn" > @@ -624,7 +608,6 @@ exports[`RemoteLogWarning Screen screen renders correctly 1`] = ` "textAlign": "center", }, false, - false, ], ] } diff --git a/app/__tests__/utils/periodicPickup.test.ts b/app/__tests__/utils/periodicPickup.test.ts deleted file mode 100644 index 807fe12..0000000 --- a/app/__tests__/utils/periodicPickup.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { Agent } from '@credo-ts/core' -import { startPeriodicTrustPing } from '@utils/mediator' - -jest.useFakeTimers({ legacyFakeTimers: true }) - -const createMockAgent = () => - ({ - mediationRecipient: { - findDefaultMediator: jest.fn().mockResolvedValue({ connectionId: 'mock-mediator-conn-id' }), - }, - connections: { - sendPing: jest.fn().mockResolvedValue(undefined), - }, - config: { - logger: { - debug: jest.fn(), - error: jest.fn(), - }, - }, - } as unknown as Agent) - -describe('startPeriodicTrustPing', () => { - let mockAgent: Agent - - beforeEach(() => { - jest.clearAllTimers() - jest.clearAllMocks() - mockAgent = createMockAgent() - }) - - it('does not send a ping immediately on start', () => { - startPeriodicTrustPing(mockAgent, 15000) - - expect(mockAgent.connections.sendPing).not.toHaveBeenCalled() - }) - - it('sends a trust ping after one interval', async () => { - startPeriodicTrustPing(mockAgent, 15000) - - jest.advanceTimersByTime(15000) - await Promise.resolve() - - expect(mockAgent.connections.sendPing).toHaveBeenCalledTimes(1) - expect(mockAgent.connections.sendPing).toHaveBeenCalledWith('mock-mediator-conn-id', { - responseRequested: false, - withReturnRouting: true, - }) - }) - - it('pings repeatedly on each interval', async () => { - startPeriodicTrustPing(mockAgent, 15000) - - for (let i = 0; i < 3; i++) { - jest.advanceTimersByTime(15000) - await Promise.resolve() - } - - expect(mockAgent.connections.sendPing).toHaveBeenCalledTimes(3) - }) - - it('stops pinging after cleanup', async () => { - const cleanup = startPeriodicTrustPing(mockAgent, 15000) - - jest.advanceTimersByTime(15000) - await Promise.resolve() - expect(mockAgent.connections.sendPing).toHaveBeenCalledTimes(1) - - cleanup() - - jest.advanceTimersByTime(30000) - await Promise.resolve() - expect(mockAgent.connections.sendPing).toHaveBeenCalledTimes(1) - }) - - it('survives errors and keeps pinging', async () => { - jest.mocked(mockAgent.connections.sendPing).mockRejectedValueOnce(new Error('WebSocket dead')) - - startPeriodicTrustPing(mockAgent, 15000) - - jest.advanceTimersByTime(15000) - await Promise.resolve() - expect(mockAgent.connections.sendPing).toHaveBeenCalledTimes(1) - - jest.advanceTimersByTime(15000) - await Promise.resolve() - expect(mockAgent.connections.sendPing).toHaveBeenCalledTimes(2) - }) - - it('skips ping if no default mediator is found', async () => { - jest.mocked(mockAgent.mediationRecipient.findDefaultMediator).mockResolvedValue(null) - - startPeriodicTrustPing(mockAgent, 15000) - - jest.advanceTimersByTime(15000) - await Promise.resolve() - - expect(mockAgent.connections.sendPing).not.toHaveBeenCalled() - }) -}) diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle index 9501702..74a4fcb 100644 --- a/app/android/app/build.gradle +++ b/app/android/app/build.gradle @@ -50,6 +50,9 @@ react { // // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" // hermesFlags = ["-O", "-output-source-map"] + + /* Autolinking */ + autolinkLibrariesWithApp() } apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" @@ -106,24 +109,8 @@ android { version "3.22.1" } } - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = "17" - } - - kotlinOptions { - jvmTarget = "17" - } - - java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(17)) - } - } + // Java/Kotlin toolchain + jvmTarget are managed by the RN 0.81 gradle + // plugin; setting them here now fails ("languageVersion is final") defaultConfig { applicationId "asml.bkc.harvard.wallet" @@ -177,6 +164,14 @@ android { proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } + packagingOptions { + jniLibs { + // RN 0.76+ prefab: JSI libraries (@hyperledger/*) copy the imported + // libreactnative.so etc. into their own AARs, colliding with the copies + // from the react-android AAR. The contents are identical — keep one. + pickFirsts += ['**/libreactnative.so', '**/libjsi.so', '**/libfbjni.so', '**/libc++_shared.so'] + } + } } // Fix the task dependency issue between lint and React Native Vector Icons @@ -194,7 +189,7 @@ dependencies { // The version of react-native is set by the React Native Gradle Plugin implementation("com.facebook.react:react-android") - implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.20") + implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion") implementation 'net.java.dev.jna:jna:5.14.0' @@ -211,7 +206,6 @@ dependencies { } } -apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" -apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) +apply from: file("../../node_modules/react-native-config/android/dotenv.gradle") apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/app/android/app/gradle.lockfile b/app/android/app/gradle.lockfile index b6ee300..02c0c1b 100644 --- a/app/android/app/gradle.lockfile +++ b/app/android/app/gradle.lockfile @@ -1,314 +1,245 @@ # This is a Gradle generated file for dependency locking. # Manual edits can break the build and are not advised. # This file is expected to be part of source control. -androidx.activity:activity-ktx:1.9.3=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.activity:activity:1.6.0=debugAndroidTestCompileClasspath -androidx.activity:activity:1.9.3=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.annotation:annotation-experimental:1.3.0=debugAndroidTestCompileClasspath -androidx.annotation:annotation-experimental:1.4.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.annotation:annotation-jvm:1.9.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.annotation:annotation:1.3.0=debugAndroidTestCompileClasspath -androidx.annotation:annotation:1.9.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.appcompat:appcompat-resources:1.6.1=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.appcompat:appcompat:1.6.1=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.arch.core:core-common:2.1.0=debugAndroidTestCompileClasspath -androidx.arch.core:core-common:2.2.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.arch.core:core-runtime:2.0.0=debugAndroidTestCompileClasspath -androidx.arch.core:core-runtime:2.2.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.asynclayoutinflater:asynclayoutinflater:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.autofill:autofill:1.1.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.biometric:biometric:1.1.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.browser:browser:1.5.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.camera:camera-camera2:1.4.0-beta02=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.camera:camera-core:1.4.0-beta02=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.camera:camera-extensions:1.4.0-beta02=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.camera:camera-lifecycle:1.4.0-beta02=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.camera:camera-video:1.4.0-beta02=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.camera:camera-view:1.4.0-beta02=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.cardview:cardview:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.collection:collection-ktx:1.1.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.collection:collection:1.1.0=debugAndroidTestCompileClasspath -androidx.collection:collection:1.2.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.concurrent:concurrent-futures-ktx:1.1.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.concurrent:concurrent-futures:1.1.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.constraintlayout:constraintlayout-solver:2.0.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.constraintlayout:constraintlayout:2.0.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.coordinatorlayout:coordinatorlayout:1.2.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.core:core-ktx:1.13.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.core:core-ktx:1.2.0=debugAndroidTestCompileClasspath -androidx.core:core:1.13.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.core:core:1.9.0=debugAndroidTestCompileClasspath -androidx.cursoradapter:cursoradapter:1.0.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.customview:customview-poolingcontainer:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.customview:customview:1.0.0=debugAndroidTestCompileClasspath -androidx.customview:customview:1.1.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.documentfile:documentfile:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.drawerlayout:drawerlayout:1.0.0=debugAndroidTestCompileClasspath -androidx.drawerlayout:drawerlayout:1.1.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.dynamicanimation:dynamicanimation:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.emoji2:emoji2-views-helper:1.2.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.emoji2:emoji2:1.2.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.exifinterface:exifinterface:1.0.0=debugAndroidTestCompileClasspath -androidx.exifinterface:exifinterface:1.3.6=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.fragment:fragment-ktx:1.6.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.fragment:fragment:1.3.6=debugAndroidTestCompileClasspath -androidx.fragment:fragment:1.6.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.interpolator:interpolator:1.0.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.legacy:legacy-support-core-ui:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.legacy:legacy-support-core-utils:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.legacy:legacy-support-v4:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-common:2.5.1=debugAndroidTestCompileClasspath -androidx.lifecycle:lifecycle-common:2.6.2=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.2=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-livedata-core:2.5.1=debugAndroidTestCompileClasspath -androidx.lifecycle:lifecycle-livedata-core:2.6.2=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-livedata:2.0.0=debugAndroidTestCompileClasspath -androidx.lifecycle:lifecycle-livedata:2.6.2=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-process:2.6.2=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-runtime-ktx:2.6.2=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-runtime:2.5.1=debugAndroidTestCompileClasspath -androidx.lifecycle:lifecycle-runtime:2.6.2=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1=debugAndroidTestCompileClasspath -androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.lifecycle:lifecycle-viewmodel:2.5.1=debugAndroidTestCompileClasspath -androidx.lifecycle:lifecycle-viewmodel:2.6.2=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.loader:loader:1.0.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.localbroadcastmanager:localbroadcastmanager:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-common:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-container:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-database:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-datasource-okhttp:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-datasource:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-decoder:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-exoplayer-dash:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-exoplayer-hls:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-exoplayer-smoothstreaming:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-exoplayer:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-extractor:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-session:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media3:media3-ui:1.4.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.media:media:1.7.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.print:print:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.profileinstaller:profileinstaller:1.3.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.recyclerview:recyclerview:1.3.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.resourceinspection:resourceinspection-annotation:1.0.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.savedstate:savedstate-ktx:1.2.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.savedstate:savedstate:1.2.0=debugAndroidTestCompileClasspath -androidx.savedstate:savedstate:1.2.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.security:security-crypto:1.1.0-alpha03=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.slidingpanelayout:slidingpanelayout:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.startup:startup-runtime:1.1.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.swiperefreshlayout:swiperefreshlayout:1.1.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.tracing:tracing:1.1.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.transition:transition:1.2.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.vectordrawable:vectordrawable-animated:1.1.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.vectordrawable:vectordrawable:1.1.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.versionedparcelable:versionedparcelable:1.1.1=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.viewpager2:viewpager2:1.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -androidx.viewpager:viewpager:1.0.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -androidx.webkit:webkit:1.4.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.android.installreferrer:installreferrer:1.1.2=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.android.tools.ddms:ddmlib:31.6.1=_internal-unified-test-platform-android-device-provider-ddmlib -com.android.tools.emulator:proto:31.6.1=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention -com.android.tools.utp:android-device-provider-ddmlib-proto:31.6.1=_internal-unified-test-platform-android-device-provider-ddmlib -com.android.tools.utp:android-device-provider-ddmlib:31.6.1=_internal-unified-test-platform-android-device-provider-ddmlib -com.android.tools.utp:android-device-provider-gradle-proto:31.6.1=_internal-unified-test-platform-android-device-provider-gradle -com.android.tools.utp:android-device-provider-gradle:31.6.1=_internal-unified-test-platform-android-device-provider-gradle -com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.6.1=_internal-unified-test-platform-android-test-plugin-host-additional-test-output -com.android.tools.utp:android-test-plugin-host-additional-test-output:31.6.1=_internal-unified-test-platform-android-test-plugin-host-additional-test-output -com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.6.1=_internal-unified-test-platform-android-test-plugin-host-apk-installer -com.android.tools.utp:android-test-plugin-host-apk-installer:31.6.1=_internal-unified-test-platform-android-test-plugin-host-apk-installer -com.android.tools.utp:android-test-plugin-host-coverage-proto:31.6.1=_internal-unified-test-platform-android-test-plugin-host-coverage -com.android.tools.utp:android-test-plugin-host-coverage:31.6.1=_internal-unified-test-platform-android-test-plugin-host-coverage -com.android.tools.utp:android-test-plugin-host-device-info-proto:31.6.1=_internal-unified-test-platform-android-test-plugin-host-device-info -com.android.tools.utp:android-test-plugin-host-device-info:31.6.1=_internal-unified-test-platform-android-test-plugin-host-device-info -com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.6.1=_internal-unified-test-platform-android-test-plugin-host-emulator-control -com.android.tools.utp:android-test-plugin-host-emulator-control:31.6.1=_internal-unified-test-platform-android-test-plugin-host-emulator-control -com.android.tools.utp:android-test-plugin-host-logcat-proto:31.6.1=_internal-unified-test-platform-android-test-plugin-host-logcat -com.android.tools.utp:android-test-plugin-host-logcat:31.6.1=_internal-unified-test-platform-android-test-plugin-host-logcat -com.android.tools.utp:android-test-plugin-host-retention-proto:31.6.1=_internal-unified-test-platform-android-test-plugin-host-retention -com.android.tools.utp:android-test-plugin-host-retention:31.6.1=_internal-unified-test-platform-android-test-plugin-host-retention -com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.6.1=_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.android.tools.utp:android-test-plugin-result-listener-gradle:31.6.1=_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.android.tools.utp:utp-common:31.6.1=_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention -com.android.tools:annotations:31.6.1=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.android.tools:common:31.6.1=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.facebook.conceal:conceal:1.1.3=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fbjni:fbjni:0.5.1=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:drawee:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:fbcore:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:fresco:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:imagepipeline-base:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:imagepipeline-native:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:imagepipeline-okhttp3:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:imagepipeline:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:memory-type-ashmem:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:memory-type-java:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:memory-type-native:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:middleware:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:nativeimagefilters:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:nativeimagetranscoder:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:soloader:3.1.3=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.facebook.fresco:ui-common:3.1.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.infer.annotation:infer-annotation:0.18.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.react:hermes-android:0.73.11=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.react:react-android:0.73.11=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.soloader:annotation:0.10.5=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.soloader:nativeloader:0.10.5=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.soloader:soloader:0.10.5=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.facebook.yoga:proguard-annotations:1.19.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.github.bumptech.glide:annotations:4.12.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.github.bumptech.glide:disklrucache:4.12.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.github.bumptech.glide:gifdecoder:4.12.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.github.bumptech.glide:glide:4.12.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.github.stephenc.jcip:jcip-annotations:1.0-1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.android.datatransport:transport-api:2.2.1=debugAndroidTestCompileClasspath -com.google.android.datatransport:transport-api:3.0.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.android.datatransport:transport-backend-cct:2.3.3=debugAndroidTestCompileClasspath -com.google.android.datatransport:transport-backend-cct:3.1.7=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.android.datatransport:transport-runtime:2.2.6=debugAndroidTestCompileClasspath -com.google.android.datatransport:transport-runtime:3.1.7=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-auth-api-phone:18.0.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-auth-base:18.0.4=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-auth:20.3.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-base:18.1.0=debugAndroidTestCompileClasspath -com.google.android.gms:play-services-base:18.2.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-basement:18.1.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-cloud-messaging:17.0.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-iid:17.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-stats:17.0.2=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.android.gms:play-services-tasks:18.0.2=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.android.material:material:1.6.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.android.odml:image:1.0.0-beta1=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.android.play:integrity:1.2.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.android:annotations:4.1.1.4=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.google.api.grpc:proto-google-common-protos:2.17.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.google.auto.value:auto-value-annotations:1.6.3=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.code.findbugs:jsr305:3.0.2=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle,debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.code.gson:gson:2.10.1=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle,debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.crypto.tink:tink-android:1.5.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.crypto.tink:tink:1.7.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control -com.google.errorprone:error_prone_annotations:2.18.0=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.google.errorprone:error_prone_annotations:2.9.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-annotations:16.0.0=debugAndroidTestCompileClasspath -com.google.firebase:firebase-annotations:16.1.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-bom:26.8.0=debugAndroidTestCompileClasspath -com.google.firebase:firebase-bom:30.5.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-common:20.1.2=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-components:16.1.0=debugAndroidTestCompileClasspath -com.google.firebase:firebase-components:17.0.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-datatransport:18.1.6=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-encoders-json:17.1.0=debugAndroidTestCompileClasspath -com.google.firebase:firebase-encoders-json:18.0.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-encoders-proto:16.0.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-encoders:16.1.0=debugAndroidTestCompileClasspath -com.google.firebase:firebase-encoders:17.0.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-iid-interop:17.1.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-installations-interop:17.0.2=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-installations:17.0.3=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-measurement-connector:19.0.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.firebase:firebase-messaging:23.0.8=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.guava:failureaccess:1.0.1=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.google.guava:failureaccess:1.0.2=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.guava:guava:32.0.1-jre=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.google.guava:guava:33.0.0-android=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle,debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.google.j2objc:j2objc-annotations:2.8=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.google.mlkit:barcode-scanning-common:17.0.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.mlkit:barcode-scanning:17.2.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.mlkit:common:18.9.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.mlkit:vision-common:17.3.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.mlkit:vision-interfaces:16.2.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.google.protobuf:protobuf-java:3.22.3=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.google.testing.platform:android-device-provider-local:0.0.9-alpha02=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.google.testing.platform:android-driver-instrumentation:0.0.9-alpha02=_internal-unified-test-platform-android-driver-instrumentation,_internal-unified-test-platform-android-test-plugin-host-emulator-control -com.google.testing.platform:android-test-plugin:0.0.9-alpha02=_internal-unified-test-platform-android-test-plugin -com.google.testing.platform:core-proto:0.0.9-alpha02=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -com.google.testing.platform:core:0.0.9-alpha02=_internal-unified-test-platform-core -com.google.testing.platform:launcher:0.0.9-alpha02=_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-launcher -com.lambdapioneer.argon2kt:argon2kt:1.3.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.nimbusds:nimbus-jose-jwt:9.37.3=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.parse.bolts:bolts-tasks:1.4.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -com.squareup.okhttp3:okhttp-urlconnection:4.9.2=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.squareup.okhttp3:okhttp:4.12.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.squareup.okhttp3:okhttp:4.9.2=debugAndroidTestCompileClasspath -com.squareup.okio:okio-jvm:3.6.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -com.squareup.okio:okio:2.9.0=debugAndroidTestCompileClasspath -com.squareup.okio:okio:3.6.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -commons-io:commons-io:2.13.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention -io.grpc:grpc-api:1.57.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.grpc:grpc-context:1.57.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.grpc:grpc-core:1.57.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.grpc:grpc-netty:1.57.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.grpc:grpc-protobuf-lite:1.57.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.grpc:grpc-protobuf:1.57.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.grpc:grpc-stub:1.57.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-buffer:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-codec-http2:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-codec-http:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-codec-socks:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-codec:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-common:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-handler-proxy:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-handler:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-resolver:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-transport-native-unix-common:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.netty:netty-transport:4.1.93.Final=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.perfmark:perfmark-api:0.26.0=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -io.reactivex.rxjava2:rxandroid:2.1.1=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -io.reactivex.rxjava2:rxjava:2.2.21=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -javax.annotation:javax.annotation-api:1.3.2=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -javax.inject:javax.inject:1=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -jp.wasabeef:blurry:4.0.1=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -net.java.dev.jna:jna-platform:5.6.0=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -net.java.dev.jna:jna:5.14.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -net.java.dev.jna:jna:5.6.0=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -net.sf.kxml:kxml2:2.3.0=_internal-unified-test-platform-android-device-provider-ddmlib -net.time4j:time4j-android:4.8-2021a=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -org.apache.commons:commons-lang3:3.11=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.checkerframework:checker-qual:3.33.0=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -org.codehaus.mojo:animal-sniffer-annotations:1.23=_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -org.greenrobot:eventbus:3.1.0=debugRuntimeClasspath,debugUnitTestRuntimeClasspath,releaseRuntimeClasspath,releaseUnitTestRuntimeClasspath -org.jacoco:org.jacoco.agent:0.8.8=androidJacocoAnt -org.jacoco:org.jacoco.ant:0.8.8=androidJacocoAnt -org.jacoco:org.jacoco.core:0.8.8=androidJacocoAnt -org.jacoco:org.jacoco.report:0.8.8=androidJacocoAnt -org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-annotations-jvm:1.3.72=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jetbrains.kotlin:kotlin-build-common:1.9.20=kotlinBuildToolsApiClasspath -org.jetbrains.kotlin:kotlin-build-tools-api:1.9.20=kotlinBuildToolsApiClasspath -org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.20=kotlinBuildToolsApiClasspath -org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-compiler-runner:1.9.20=kotlinBuildToolsApiClasspath -org.jetbrains.kotlin:kotlin-daemon-client:1.9.20=kotlinBuildToolsApiClasspath -org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.20=kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-script-runtime:1.9.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-stdlib-common:1.9.20=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle,debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle,debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle,debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib:1.9.20=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle,debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1=debugAndroidTestCompileClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1=debugAndroidTestCompileClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=kotlinBuildToolsApiClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1=debugAndroidTestCompileClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1=debugAndroidTestCompileClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=_internal-unified-test-platform-android-device-provider-ddmlib,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jetbrains:annotations:13.0=_internal-unified-test-platform-android-device-provider-gradle,_internal-unified-test-platform-android-test-plugin-host-additional-test-output,_internal-unified-test-platform-android-test-plugin-host-apk-installer,_internal-unified-test-platform-android-test-plugin-host-coverage,_internal-unified-test-platform-android-test-plugin-host-device-info,_internal-unified-test-platform-android-test-plugin-host-emulator-control,_internal-unified-test-platform-android-test-plugin-host-logcat,_internal-unified-test-platform-android-test-plugin-host-retention,_internal-unified-test-platform-android-test-plugin-result-listener-gradle,debugAndroidTestCompileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath -org.jetbrains:annotations:23.0.0=_internal-unified-test-platform-android-device-provider-ddmlib,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.jitsi:webrtc:124.0.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -org.ow2.asm:asm-analysis:9.2=androidJacocoAnt -org.ow2.asm:asm-commons:9.2=androidJacocoAnt -org.ow2.asm:asm-tree:9.2=androidJacocoAnt -org.ow2.asm:asm:9.2=androidJacocoAnt -org.reactivestreams:reactive-streams:1.0.3=debugAndroidTestCompileClasspath,debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath -empty=androidApis,androidJdkImage,androidTestApiDependenciesMetadata,androidTestCompileOnlyDependenciesMetadata,androidTestDebugApiDependenciesMetadata,androidTestDebugCompileOnlyDependenciesMetadata,androidTestDebugImplementationDependenciesMetadata,androidTestDebugIntransitiveDependenciesMetadata,androidTestDebugRuntimeOnlyDependenciesMetadata,androidTestImplementationDependenciesMetadata,androidTestIntransitiveDependenciesMetadata,androidTestReleaseApiDependenciesMetadata,androidTestReleaseCompileOnlyDependenciesMetadata,androidTestReleaseImplementationDependenciesMetadata,androidTestReleaseIntransitiveDependenciesMetadata,androidTestReleaseRuntimeOnlyDependenciesMetadata,androidTestRuntimeOnlyDependenciesMetadata,androidTestUtil,apiDependenciesMetadata,compileOnlyDependenciesMetadata,coreLibraryDesugaring,debugAndroidTestAnnotationProcessorClasspath,debugAndroidTestApiDependenciesMetadata,debugAndroidTestCompileOnlyDependenciesMetadata,debugAndroidTestImplementationDependenciesMetadata,debugAndroidTestIntransitiveDependenciesMetadata,debugAndroidTestRuntimeClasspath,debugAndroidTestRuntimeOnlyDependenciesMetadata,debugAnnotationProcessorClasspath,debugApiDependenciesMetadata,debugCompileOnlyDependenciesMetadata,debugImplementationDependenciesMetadata,debugIntransitiveDependenciesMetadata,debugReverseMetadataValues,debugRuntimeOnlyDependenciesMetadata,debugUnitTestAnnotationProcessorClasspath,debugUnitTestApiDependenciesMetadata,debugUnitTestCompileOnlyDependenciesMetadata,debugUnitTestImplementationDependenciesMetadata,debugUnitTestIntransitiveDependenciesMetadata,debugUnitTestRuntimeOnlyDependenciesMetadata,debugWearBundling,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinCompilerPluginClasspathDebug,kotlinCompilerPluginClasspathDebugAndroidTest,kotlinCompilerPluginClasspathDebugUnitTest,kotlinCompilerPluginClasspathRelease,kotlinCompilerPluginClasspathReleaseUnitTest,kotlinNativeCompilerPluginClasspath,lintChecks,lintPublish,releaseAnnotationProcessorClasspath,releaseApiDependenciesMetadata,releaseCompileOnlyDependenciesMetadata,releaseImplementationDependenciesMetadata,releaseIntransitiveDependenciesMetadata,releaseReverseMetadataValues,releaseRuntimeOnlyDependenciesMetadata,releaseUnitTestAnnotationProcessorClasspath,releaseUnitTestApiDependenciesMetadata,releaseUnitTestCompileOnlyDependenciesMetadata,releaseUnitTestImplementationDependenciesMetadata,releaseUnitTestIntransitiveDependenciesMetadata,releaseUnitTestRuntimeOnlyDependenciesMetadata,releaseWearBundling,runtimeOnlyDependenciesMetadata,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testDebugApiDependenciesMetadata,testDebugCompileOnlyDependenciesMetadata,testDebugImplementationDependenciesMetadata,testDebugIntransitiveDependenciesMetadata,testDebugRuntimeOnlyDependenciesMetadata,testFixturesApiDependenciesMetadata,testFixturesCompileOnlyDependenciesMetadata,testFixturesDebugApiDependenciesMetadata,testFixturesDebugCompileOnlyDependenciesMetadata,testFixturesDebugImplementationDependenciesMetadata,testFixturesDebugIntransitiveDependenciesMetadata,testFixturesDebugRuntimeOnlyDependenciesMetadata,testFixturesImplementationDependenciesMetadata,testFixturesIntransitiveDependenciesMetadata,testFixturesReleaseApiDependenciesMetadata,testFixturesReleaseCompileOnlyDependenciesMetadata,testFixturesReleaseImplementationDependenciesMetadata,testFixturesReleaseIntransitiveDependenciesMetadata,testFixturesReleaseRuntimeOnlyDependenciesMetadata,testFixturesRuntimeOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testIntransitiveDependenciesMetadata,testReleaseApiDependenciesMetadata,testReleaseCompileOnlyDependenciesMetadata,testReleaseImplementationDependenciesMetadata,testReleaseIntransitiveDependenciesMetadata,testReleaseRuntimeOnlyDependenciesMetadata,testRuntimeOnlyDependenciesMetadata +androidx.activity:activity-ktx:1.9.3=debugRuntimeClasspath +androidx.activity:activity:1.9.3=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation-experimental:1.4.1=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation-jvm:1.10.0=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation:1.10.0=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat-resources:1.7.0=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat:1.7.0=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-common:2.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-runtime:2.2.0=debugRuntimeClasspath +androidx.asynclayoutinflater:asynclayoutinflater:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.autofill:autofill:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.biometric:biometric:1.2.0-alpha05=debugCompileClasspath,debugRuntimeClasspath +androidx.browser:browser:1.5.0=debugRuntimeClasspath +androidx.camera:camera-camera2:1.5.0-alpha03=debugRuntimeClasspath +androidx.camera:camera-core:1.5.0-alpha03=debugRuntimeClasspath +androidx.camera:camera-extensions:1.5.0-alpha03=debugRuntimeClasspath +androidx.camera:camera-lifecycle:1.5.0-alpha03=debugRuntimeClasspath +androidx.camera:camera-video:1.5.0-alpha03=debugRuntimeClasspath +androidx.camera:camera-view:1.5.0-alpha03=debugRuntimeClasspath +androidx.cardview:cardview:1.0.0=debugRuntimeClasspath +androidx.collection:collection-jvm:1.4.2=debugCompileClasspath,debugRuntimeClasspath +androidx.collection:collection-ktx:1.4.2=debugRuntimeClasspath +androidx.collection:collection:1.4.2=debugCompileClasspath,debugRuntimeClasspath +androidx.concurrent:concurrent-futures-ktx:1.1.0=debugRuntimeClasspath +androidx.concurrent:concurrent-futures:1.1.0=debugRuntimeClasspath +androidx.constraintlayout:constraintlayout-solver:2.0.1=debugRuntimeClasspath +androidx.constraintlayout:constraintlayout:2.0.1=debugRuntimeClasspath +androidx.coordinatorlayout:coordinatorlayout:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core-ktx:1.16.0=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core-viewtree:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core:1.16.0=debugCompileClasspath,debugRuntimeClasspath +androidx.cursoradapter:cursoradapter:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.customview:customview-poolingcontainer:1.0.0=debugRuntimeClasspath +androidx.customview:customview:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.datastore:datastore-android:1.1.1=debugRuntimeClasspath +androidx.datastore:datastore-core-android:1.1.1=debugRuntimeClasspath +androidx.datastore:datastore-core-okio-jvm:1.1.1=debugRuntimeClasspath +androidx.datastore:datastore-core-okio:1.1.1=debugRuntimeClasspath +androidx.datastore:datastore-core:1.1.1=debugRuntimeClasspath +androidx.datastore:datastore-preferences-android:1.1.1=debugRuntimeClasspath +androidx.datastore:datastore-preferences-core-jvm:1.1.1=debugRuntimeClasspath +androidx.datastore:datastore-preferences-core:1.1.1=debugRuntimeClasspath +androidx.datastore:datastore-preferences:1.1.1=debugRuntimeClasspath +androidx.datastore:datastore:1.1.1=debugRuntimeClasspath +androidx.documentfile:documentfile:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.drawerlayout:drawerlayout:1.1.1=debugCompileClasspath,debugRuntimeClasspath +androidx.dynamicanimation:dynamicanimation-ktx:1.0.0-alpha03=debugRuntimeClasspath +androidx.dynamicanimation:dynamicanimation:1.1.0-alpha03=debugRuntimeClasspath +androidx.emoji2:emoji2-views-helper:1.3.0=debugRuntimeClasspath +androidx.emoji2:emoji2:1.3.0=debugRuntimeClasspath +androidx.exifinterface:exifinterface:1.3.7=debugCompileClasspath,debugRuntimeClasspath +androidx.fragment:fragment-ktx:1.8.6=debugRuntimeClasspath +androidx.fragment:fragment:1.8.6=debugCompileClasspath,debugRuntimeClasspath +androidx.interpolator:interpolator:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.legacy:legacy-support-core-ui:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.legacy:legacy-support-core-utils:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.legacy:legacy-support-v4:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common-java8:2.8.7=debugRuntimeClasspath +androidx.lifecycle:lifecycle-common-jvm:2.8.7=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common:2.8.7=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7=debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core:2.8.7=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata:2.8.7=debugRuntimeClasspath +androidx.lifecycle:lifecycle-process:2.8.7=debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime-android:2.8.7=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7=debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime-ktx:2.8.7=debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime:2.8.7=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-android:2.8.7=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7=debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel:2.8.7=debugCompileClasspath,debugRuntimeClasspath +androidx.loader:loader:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.localbroadcastmanager:localbroadcastmanager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.media3:media3-common:1.4.1=debugRuntimeClasspath +androidx.media3:media3-container:1.4.1=debugRuntimeClasspath +androidx.media3:media3-database:1.4.1=debugRuntimeClasspath +androidx.media3:media3-datasource-okhttp:1.4.1=debugRuntimeClasspath +androidx.media3:media3-datasource:1.4.1=debugRuntimeClasspath +androidx.media3:media3-decoder:1.4.1=debugRuntimeClasspath +androidx.media3:media3-exoplayer-dash:1.4.1=debugRuntimeClasspath +androidx.media3:media3-exoplayer-hls:1.4.1=debugRuntimeClasspath +androidx.media3:media3-exoplayer-smoothstreaming:1.4.1=debugRuntimeClasspath +androidx.media3:media3-exoplayer:1.4.1=debugRuntimeClasspath +androidx.media3:media3-extractor:1.4.1=debugRuntimeClasspath +androidx.media3:media3-session:1.4.1=debugRuntimeClasspath +androidx.media3:media3-ui:1.4.1=debugRuntimeClasspath +androidx.media:media:1.7.0=debugCompileClasspath,debugRuntimeClasspath +androidx.print:print:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.profileinstaller:profileinstaller:1.4.1=debugRuntimeClasspath +androidx.recyclerview:recyclerview:1.3.0=debugRuntimeClasspath +androidx.resourceinspection:resourceinspection-annotation:1.0.1=debugRuntimeClasspath +androidx.savedstate:savedstate-ktx:1.2.1=debugRuntimeClasspath +androidx.savedstate:savedstate:1.2.1=debugCompileClasspath,debugRuntimeClasspath +androidx.security:security-crypto:1.1.0-alpha03=debugRuntimeClasspath +androidx.slidingpanelayout:slidingpanelayout:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.startup:startup-runtime:1.1.1=debugRuntimeClasspath +androidx.swiperefreshlayout:swiperefreshlayout:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.tracing:tracing-ktx:1.2.0=debugRuntimeClasspath +androidx.tracing:tracing:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.transition:transition:1.5.0=debugRuntimeClasspath +androidx.vectordrawable:vectordrawable-animated:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.vectordrawable:vectordrawable:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.versionedparcelable:versionedparcelable:1.1.1=debugCompileClasspath,debugRuntimeClasspath +androidx.viewpager2:viewpager2:1.0.0=debugRuntimeClasspath +androidx.viewpager:viewpager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.webkit:webkit:1.14.0=debugRuntimeClasspath +com.android.installreferrer:installreferrer:1.1.2=debugRuntimeClasspath +com.caverock:androidsvg-aar:1.4=debugRuntimeClasspath +com.facebook.fbjni:fbjni:0.7.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:drawee:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:fbcore:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:fresco:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:imagepipeline-base:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:imagepipeline-native:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:imagepipeline-okhttp3:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:imagepipeline:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:memory-type-ashmem:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:memory-type-java:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:memory-type-native:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:middleware:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:nativeimagefilters:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:nativeimagetranscoder:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:soloader:3.6.0=debugRuntimeClasspath +com.facebook.fresco:ui-common:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:ui-core:3.6.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.fresco:urimod:3.6.0=debugRuntimeClasspath +com.facebook.fresco:vito-source:3.6.0=debugRuntimeClasspath +com.facebook.infer.annotation:infer-annotation:0.18.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.react:hermes-android:0.81.5=debugCompileClasspath,debugRuntimeClasspath +com.facebook.react:react-android:0.81.5=debugCompileClasspath,debugRuntimeClasspath +com.facebook.soloader:annotation:0.12.1=debugCompileClasspath,debugRuntimeClasspath +com.facebook.soloader:nativeloader:0.12.1=debugCompileClasspath,debugRuntimeClasspath +com.facebook.soloader:soloader:0.12.1=debugCompileClasspath,debugRuntimeClasspath +com.facebook.yoga:proguard-annotations:1.19.0=debugCompileClasspath,debugRuntimeClasspath +com.github.bumptech.glide:annotations:4.12.0=debugRuntimeClasspath +com.github.bumptech.glide:disklrucache:4.12.0=debugRuntimeClasspath +com.github.bumptech.glide:gifdecoder:4.12.0=debugRuntimeClasspath +com.github.bumptech.glide:glide:4.12.0=debugRuntimeClasspath +com.google.android.datatransport:transport-api:3.1.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.datatransport:transport-backend-cct:3.1.9=debugCompileClasspath,debugRuntimeClasspath +com.google.android.datatransport:transport-runtime:3.1.9=debugCompileClasspath,debugRuntimeClasspath +com.google.android.gms:play-services-auth-api-phone:18.0.2=debugRuntimeClasspath +com.google.android.gms:play-services-auth-base:18.0.10=debugRuntimeClasspath +com.google.android.gms:play-services-auth:21.3.0=debugRuntimeClasspath +com.google.android.gms:play-services-base:18.5.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.gms:play-services-basement:18.4.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.gms:play-services-cloud-messaging:17.2.0=debugRuntimeClasspath +com.google.android.gms:play-services-fido:20.0.1=debugRuntimeClasspath +com.google.android.gms:play-services-iid:17.0.0=debugRuntimeClasspath +com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1=debugCompileClasspath,debugRuntimeClasspath +com.google.android.gms:play-services-stats:17.0.2=debugRuntimeClasspath +com.google.android.gms:play-services-tasks:18.2.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.material:material:1.12.0=debugRuntimeClasspath +com.google.android.odml:image:1.0.0-beta1=debugCompileClasspath,debugRuntimeClasspath +com.google.android.play:core-common:2.0.4=debugRuntimeClasspath +com.google.android.play:integrity:1.4.0=debugRuntimeClasspath +com.google.auto.value:auto-value-annotations:1.6.3=debugRuntimeClasspath +com.google.code.findbugs:jsr305:3.0.2=debugCompileClasspath,debugRuntimeClasspath +com.google.crypto.tink:tink-android:1.5.0=debugRuntimeClasspath +com.google.errorprone:error_prone_annotations:2.26.0=debugRuntimeClasspath +com.google.firebase:firebase-annotations:16.2.0=debugCompileClasspath,debugRuntimeClasspath +com.google.firebase:firebase-bom:33.12.0=debugCompileClasspath,debugRuntimeClasspath +com.google.firebase:firebase-common-ktx:21.0.0=debugRuntimeClasspath +com.google.firebase:firebase-common:21.0.0=debugRuntimeClasspath +com.google.firebase:firebase-components:18.0.0=debugCompileClasspath,debugRuntimeClasspath +com.google.firebase:firebase-datatransport:18.2.0=debugRuntimeClasspath +com.google.firebase:firebase-encoders-json:18.0.0=debugCompileClasspath,debugRuntimeClasspath +com.google.firebase:firebase-encoders-proto:16.0.0=debugCompileClasspath,debugRuntimeClasspath +com.google.firebase:firebase-encoders:17.0.0=debugCompileClasspath,debugRuntimeClasspath +com.google.firebase:firebase-iid-interop:17.1.0=debugRuntimeClasspath +com.google.firebase:firebase-installations-interop:17.1.1=debugRuntimeClasspath +com.google.firebase:firebase-installations:18.0.0=debugRuntimeClasspath +com.google.firebase:firebase-measurement-connector:19.0.0=debugRuntimeClasspath +com.google.firebase:firebase-messaging:24.1.1=debugRuntimeClasspath +com.google.guava:failureaccess:1.0.2=debugRuntimeClasspath +com.google.guava:guava:33.0.0-android=debugRuntimeClasspath +com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=debugRuntimeClasspath +com.google.mlkit:barcode-scanning-common:17.0.0=debugCompileClasspath,debugRuntimeClasspath +com.google.mlkit:barcode-scanning:17.2.0=debugCompileClasspath,debugRuntimeClasspath +com.google.mlkit:common:18.11.0=debugCompileClasspath,debugRuntimeClasspath +com.google.mlkit:vision-common:17.3.0=debugCompileClasspath,debugRuntimeClasspath +com.google.mlkit:vision-interfaces:16.3.0=debugCompileClasspath,debugRuntimeClasspath +com.google.prefab:cli:2.1.0=_internal_prefab_binary +com.lambdapioneer.argon2kt:argon2kt:1.3.0=debugRuntimeClasspath +com.parse.bolts:bolts-tasks:1.4.0=debugRuntimeClasspath +com.squareup.okhttp3:okhttp-urlconnection:4.9.2=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okhttp3:okhttp:4.12.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okio:okio-jvm:3.9.1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okio:okio:3.9.1=debugCompileClasspath,debugRuntimeClasspath +commons-codec:commons-codec:1.10=debugCompileClasspath,debugRuntimeClasspath +commons-io:commons-io:2.6=debugCompileClasspath,debugRuntimeClasspath +io.coil-kt.coil3:coil-android:3.0.4=debugRuntimeClasspath +io.coil-kt.coil3:coil-core-android:3.0.4=debugRuntimeClasspath +io.coil-kt.coil3:coil-core:3.0.4=debugRuntimeClasspath +io.coil-kt.coil3:coil-network-core-android:3.0.4=debugRuntimeClasspath +io.coil-kt.coil3:coil-network-core:3.0.4=debugRuntimeClasspath +io.coil-kt.coil3:coil-network-okhttp-jvm:3.0.4=debugRuntimeClasspath +io.coil-kt.coil3:coil-network-okhttp:3.0.4=debugRuntimeClasspath +io.coil-kt.coil3:coil-svg-android:3.0.4=debugRuntimeClasspath +io.coil-kt.coil3:coil-svg:3.0.4=debugRuntimeClasspath +io.coil-kt.coil3:coil:3.0.4=debugRuntimeClasspath +io.reactivex.rxjava2:rxandroid:2.1.1=debugCompileClasspath,debugRuntimeClasspath +io.reactivex.rxjava2:rxjava:2.2.21=debugCompileClasspath,debugRuntimeClasspath +javax.inject:javax.inject:1=debugCompileClasspath,debugRuntimeClasspath +jp.wasabeef:blurry:4.0.1=debugRuntimeClasspath +net.java.dev.jna:jna:5.14.0=debugCompileClasspath,debugRuntimeClasspath +org.apache.commons:commons-lang3:3.11=debugCompileClasspath,debugRuntimeClasspath +org.greenrobot:eventbus:3.1.0=debugRuntimeClasspath +org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.9.22=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-annotations-jvm:1.3.72=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-bom:1.8.22=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-build-tools-api:2.1.20=kotlinBuildToolsApiClasspath +org.jetbrains.kotlin:kotlin-build-tools-impl:2.1.20=kotlinBuildToolsApiClasspath +org.jetbrains.kotlin:kotlin-compiler-embeddable:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-compiler-runner:2.1.20=kotlinBuildToolsApiClasspath +org.jetbrains.kotlin:kotlin-daemon-client:2.1.20=kotlinBuildToolsApiClasspath +org.jetbrains.kotlin:kotlin-daemon-embeddable:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.22=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-reflect:2.1.20=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-script-runtime:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-scripting-common:2.1.20=kotlinBuildToolsApiClasspath +org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.1.20=kotlinBuildToolsApiClasspath +org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.1.20=kotlinBuildToolsApiClasspath +org.jetbrains.kotlin:kotlin-scripting-jvm:2.1.20=kotlinBuildToolsApiClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.20=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:2.1.20=debugCompileClasspath,debugRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.9.0=debugRuntimeClasspath +org.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath +org.jetbrains:annotations:23.0.0=debugCompileClasspath,debugRuntimeClasspath +org.jitsi:webrtc:124.0.0=debugCompileClasspath,debugRuntimeClasspath +org.jspecify:jspecify:1.0.0=debugCompileClasspath,debugRuntimeClasspath +org.reactivestreams:reactive-streams:1.0.3=debugCompileClasspath,debugRuntimeClasspath +empty=androidApis,androidJdkImage,debugAnnotationProcessorClasspath,debugReverseMetadataValues,kotlinCompilerPluginClasspathDebug diff --git a/app/android/app/src/main/java/ca/bc/gov/BCWallet/MainApplication.kt b/app/android/app/src/main/java/ca/bc/gov/BCWallet/MainApplication.kt index f051447..3299b58 100644 --- a/app/android/app/src/main/java/ca/bc/gov/BCWallet/MainApplication.kt +++ b/app/android/app/src/main/java/ca/bc/gov/BCWallet/MainApplication.kt @@ -1,22 +1,24 @@ package asml.bkc.harvard.wallet import android.app.Application +import android.content.res.Configuration import com.facebook.react.PackageList import com.facebook.react.ReactApplication import com.facebook.react.ReactHost +import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost import com.facebook.react.defaults.DefaultReactNativeHost -import com.facebook.soloader.SoLoader +import expo.modules.ApplicationLifecycleDispatcher +import expo.modules.ReactNativeHostWrapper import org.wonday.orientation.OrientationActivityLifecycle class MainApplication : Application(), ReactApplication { override val reactNativeHost: ReactNativeHost = - object : DefaultReactNativeHost(this) { + ReactNativeHostWrapper(this, object : DefaultReactNativeHost(this) { override fun getPackages(): List = PackageList(this).packages.apply { // Packages that cannot be autolinked yet can be added manually here, for example: @@ -27,7 +29,7 @@ class MainApplication : Application(), ReactApplication { override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - } + }) override val reactHost: ReactHost get() = getDefaultReactHost(this.applicationContext, reactNativeHost) @@ -35,10 +37,12 @@ class MainApplication : Application(), ReactApplication { override fun onCreate() { registerActivityLifecycleCallbacks(OrientationActivityLifecycle.getInstance()) super.onCreate() - SoLoader.init(this, false) - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app - load() - } + loadReactNative(this) + ApplicationLifecycleDispatcher.onApplicationCreate(this) + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) } } \ No newline at end of file diff --git a/app/android/build.gradle b/app/android/build.gradle index 59e9b61..c0a0b06 100644 --- a/app/android/build.gradle +++ b/app/android/build.gradle @@ -2,12 +2,12 @@ buildscript { ext { - buildToolsVersion = "33.0.2" + buildToolsVersion = "36.0.0" minSdkVersion = 24 - compileSdkVersion = 35 - targetSdkVersion = 35 - ndkVersion = "25.1.8937393" - kotlinVersion = "1.9.20" + compileSdkVersion = 36 + targetSdkVersion = 36 + ndkVersion = "27.1.12297006" + kotlinVersion = "2.1.20" androidXBrowser = "1.5.0" javaVersion = JavaVersion.VERSION_17 } @@ -16,8 +16,8 @@ buildscript { mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:8.6.1") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.20") + // AGP version comes from @react-native/gradle-plugin (RN 0.81 -> AGP 8.12) + classpath("com.android.tools.build:gradle") classpath('com.google.gms:google-services:4.4.2') classpath("com.facebook.react:react-native-gradle-plugin") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") @@ -42,20 +42,28 @@ allprojects { google() maven { url 'https://www.jitpack.io' } } - - configurations.all { - resolutionStrategy { - force "org.jetbrains.kotlin:kotlin-stdlib:1.9.20" - force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20" - force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20" - } - } } subprojects { configurations.all { it.resolutionStrategy.activateDependencyLocking() } + + // Align every Android subproject on Java 17 (expo-modules-core otherwise + // compiles Java at 1.8 while Kotlin targets 17 and the build fails). + // Same approach as bifold samples/app. + afterEvaluate { project -> + ["com.android.application", "com.android.library"].each { pluginId -> + project.plugins.withId(pluginId) { + project.android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + } + } + } + } } dependencyLocking { diff --git a/app/android/gradle.properties b/app/android/gradle.properties index 99b4594..de54e12 100644 --- a/app/android/gradle.properties +++ b/app/android/gradle.properties @@ -42,7 +42,10 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 # your application. You should enable this flag either if you want # to write custom TurboModules/Fabric components OR use libraries that # are providing them. -newArchEnabled=false +newArchEnabled=true +# Expo modules manage the Java toolchain; stop the RN plugin from re-finalizing it +# (same workaround as bifold samples/app) +react.internal.disableJavaVersionAlignment=true # Use this property to enable or disable the Hermes JS engine. # If set to false, you will be using JSC instead. hermesEnabled=true \ No newline at end of file diff --git a/app/android/gradle/wrapper/gradle-wrapper.properties b/app/android/gradle/wrapper/gradle-wrapper.properties index b772700..d4081da 100644 --- a/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/app/android/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 -alidateDistributionUrl=true +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/app/android/settings.gradle b/app/android/settings.gradle index e28d3c1..73887fe 100644 --- a/app/android/settings.gradle +++ b/app/android/settings.gradle @@ -1,4 +1,10 @@ +pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } +plugins { id("com.facebook.react.settings") } +extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() } rootProject.name = 'KeyRing' -apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' includeBuild('../node_modules/@react-native/gradle-plugin') + +// Expo modules autolinking (expo-crypto, expo-secure-store, @animo-id/expo-secure-environment) +apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle") +useExpoModules() diff --git a/app/babel.config.js b/app/babel.config.js index 01c1231..89fb8b7 100644 --- a/app/babel.config.js +++ b/app/babel.config.js @@ -1,15 +1,17 @@ const presets = ['module:@react-native/babel-preset'] const plugins = [ + '@babel/plugin-transform-export-namespace-from', [ 'module-resolver', { - root: ['.'], - extensions: ['.tsx', 'ts'], + // NOTE: no `root` here on purpose - with root: ['.'] module-resolver + // rewrites `from '.'` imports inside node_modules (e.g. gesture-handler's + // ReanimatedSwipeable) to the app root index.js, breaking jest + extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'], alias: { '@': './src', '@assets': './src/assets', '@keyring-theme': './src/keyring-theme', - '@bcsc-theme': './src/bcsc-theme', '@components': './src/components', '@events': './src/events', '@hooks': './src/hooks', @@ -26,6 +28,9 @@ if (process.env['ENV'] === 'prod') { plugins.push('transform-remove-console') } +// react-native-reanimated plugin must be listed last +plugins.push('react-native-reanimated/plugin') + module.exports = { presets, plugins, diff --git a/app/container-imp.ts b/app/container-imp.ts index 746888a..7fcf388 100644 --- a/app/container-imp.ts +++ b/app/container-imp.ts @@ -28,7 +28,6 @@ import { BrandingOverlayType, RemoteOCABundleResolver } from '@bifold/oca/build/ import { getProofRequestTemplates } from '@bifold/verifier' // import { Agent } from '@credo-ts/core' // DISABLED: Only used by push notifications import { NavigationProp } from '@react-navigation/native' -import moment from 'moment' import { TFunction } from 'react-i18next' // import { Linking } from 'react-native' import { Config } from 'react-native-config' @@ -68,11 +67,9 @@ import { VersionCheckService } from './src/services/version' import { BCDispatchAction, BCLocalStorageKeys, - BCSCState, BCState, DismissPersonCredentialOffer, IASEnvironment, - Mode, RemoteDebuggingState, initialState, } from './src/store' @@ -341,8 +338,6 @@ export class AppContainer implements Container { let onboarding = initialState.onboarding let personCredOfferDissmissed = initialState.dismissPersonCredentialOffer let { environment, remoteDebugging, enableProxy, enableAppToAppPersonFlow } = initialState.developer - let bcsc = initialState.bcsc - let mode = initialState.mode let witness = initialState.witness await Promise.all([ @@ -363,36 +358,12 @@ export class AppContainer implements Container { loadState(BCLocalStorageKeys.RemoteDebugging, (val) => (remoteDebugging = val)), loadState(BCLocalStorageKeys.EnableProxy, (val) => (enableProxy = val)), loadState(BCLocalStorageKeys.EnableAppToAppPersonFlow, (val) => (enableAppToAppPersonFlow = val)), - loadState(BCLocalStorageKeys.BCSC, (val) => (bcsc = val)), - loadState(BCLocalStorageKeys.Mode, (val) => (mode = val)), loadState(LocalStorageKeys.WitnessSettings, (val) => { // console.log('[DEBUG] Loaded WitnessSettings from storage:', JSON.stringify(val)) witness = val }), ]) - // Convert date string to Date object (async-storage converts Dates to strings) - // timezone-safe parsing to prevent off-by-one date errors (consistent with date picker) - if (typeof bcsc.birthdate === 'string') { - const momentDate = moment(bcsc.birthdate) - const year = momentDate.year() - const month = momentDate.month() - const day = momentDate.date() - bcsc.birthdate = new Date(year, month, day, 12, 0, 0, 0) - } - - if (typeof bcsc.deviceCodeExpiresAt === 'string') { - bcsc.deviceCodeExpiresAt = new Date(Date.parse(bcsc.deviceCodeExpiresAt)) - } - - // Reset paths and prompts on load as they should not be persisted - bcsc.photoPath = undefined - bcsc.videoPath = undefined - bcsc.videoThumbnailPath = undefined - bcsc.prompts = undefined - bcsc.photoMetadata = undefined - bcsc.videoMetadata = undefined - const state = { loginAttempt: { ...initialState.loginAttempt, ...loginAttempt }, preferences: { ...initialState.preferences, ...preferences }, @@ -410,8 +381,6 @@ export class AppContainer implements Container { enableProxy, enableAppToAppPersonFlow, }, - bcsc: { ...initialState.bcsc, ...bcsc }, - mode, witness: { ...initialState.witness, ...witness }, } as BCState diff --git a/app/declarations.d.ts b/app/declarations.d.ts index 3b7fc30..1264ef4 100644 --- a/app/declarations.d.ts +++ b/app/declarations.d.ts @@ -6,6 +6,39 @@ declare module '*.svg' { declare module '*.png' declare module '*.jpg' + +// Minimal typings for the (untyped) Digital Credentials Consortium packages +// used by the eddsa-rdfc-2022 Data Integrity suite. Mirrors +// bifold/packages/core/declarations.d.ts (the app typechecks bifold sources +// with this tsconfig, which cannot see bifold's own ambient declarations). +declare module '@digitalcredentials/data-integrity' { + export interface DataIntegritySigner { + sign(options: { data: Uint8Array | Uint8Array[] }): Promise + id?: string + algorithm?: string + } + + export class DataIntegrityProof { + constructor(options?: { + signer?: DataIntegritySigner + date?: string | Date + cryptosuite: unknown + legacyContext?: boolean + }) + type: string + cryptosuite: string + verificationMethod?: string + } +} + +declare module '@digitalcredentials/eddsa-rdfc-2022-cryptosuite' { + export const cryptosuite: { + name: string + requiredAlgorithm: string + canonize: (input: unknown, options: unknown) => Promise + createVerifier: (options: { verificationMethod: unknown }) => Promise + } +} declare module '*.jpeg' declare module 'react-native-argon2' diff --git a/app/index.js b/app/index.js index d2ba6d4..dce4ba8 100644 --- a/app/index.js +++ b/app/index.js @@ -129,8 +129,13 @@ if (!global.atob) { global.atob = decode } -// Register the app -const { AppRegistry } = require('react-native') +// Dev-only: disable LogBox notification banners entirely. The banners overlay +// the bottom of the screen (where primary buttons live) and repeatedly break +// E2E taps. All warnings/errors still land in Metro/logcat/syslog. +const { AppRegistry, LogBox } = require('react-native') +if (global.__DEV__) { + LogBox.ignoreAllLogs() +} const App = require('./App').default const { name: appName } = require('./app.json') diff --git a/app/ios/AriesBifold.xcodeproj/project.pbxproj b/app/ios/AriesBifold.xcodeproj/project.pbxproj index ba2e375..3210ece 100644 --- a/app/ios/AriesBifold.xcodeproj/project.pbxproj +++ b/app/ios/AriesBifold.xcodeproj/project.pbxproj @@ -12,7 +12,9 @@ 1A157F462BACCDEA00E30CDB /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1A157F452BACCDEA00E30CDB /* PrivacyInfo.xcprivacy */; }; 1A762CD62D87E24100455F4C /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A762CD52D87E24100455F4C /* AppDelegate.mm */; }; 2F9994AE2A8D83CB004E773E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2F9994AD2A8D83CB004E773E /* GoogleService-Info.plist */; }; + 460C62056C817F32DD50B03E /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8695E760B846E4F378AB5655 /* ExpoModulesProvider.swift */; }; 4AA41CC1208649828A6C7F7F /* GT-America-Mono-Regular.OTF in Resources */ = {isa = PBXBuildFile; fileRef = 791DE193A8F54ABDB4C0A6E7 /* GT-America-Mono-Regular.OTF */; }; + 50FEB047FBD813EA82B0B9E8 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB705808CC6C27175E93BD23 /* ExpoModulesProvider.swift */; }; 51DF9B21480F42A9BD3A92CC /* SourceSans3-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1518883F928D41DF9687C602 /* SourceSans3-Light.ttf */; }; 566FB1F2273B158E003E9BEE /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 566FB1F1273B158E003E9BEE /* Media.xcassets */; }; 5F13137F43F5857730628E88 /* libPods-AriesBifold-AriesBifoldTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2FEEE17975EE5C7D138D250 /* libPods-AriesBifold-AriesBifoldTests.a */; }; @@ -70,6 +72,7 @@ 7AF003B82E01D25300389FF2 /* GT-America-Regular.OTF */ = {isa = PBXFileReference; lastKnownFileType = file; path = "GT-America-Regular.OTF"; sourceTree = ""; }; 7D2E34625C1340E6979A7172 /* SourceSans3-It.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "SourceSans3-It.ttf"; path = "../src/assets/fonts/SourceSans3-It.ttf"; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = AriesBifold/LaunchScreen.storyboard; sourceTree = ""; }; + 8695E760B846E4F378AB5655 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-AriesBifold-AriesBifoldTests/ExpoModulesProvider.swift"; sourceTree = ""; }; 99A1BC81F291BF040E41B70D /* libPods-AriesBifold.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AriesBifold.a"; sourceTree = BUILT_PRODUCTS_DIR; }; A68707143FAC4C9A8B391935 /* GT-America-Mono-Bold.OTF */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GT-America-Mono-Bold.OTF"; path = "../src/assets/fonts/GT-America-Mono-Bold.OTF"; sourceTree = ""; }; CA217BD1171D444992207F53 /* GT-America-Bold.OTF */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GT-America-Bold.OTF"; path = "../src/assets/fonts/GT-America-Bold.OTF"; sourceTree = ""; }; @@ -79,6 +82,7 @@ E5D436714AEB456F859D1A6A /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = ../src/assets/fonts/MaterialIcons.ttf; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; FAE9144464984615A799B578 /* GT-America-Regular.OTF */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GT-America-Regular.OTF"; path = "../src/assets/fonts/GT-America-Regular.OTF"; sourceTree = ""; }; + FB705808CC6C27175E93BD23 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-AriesBifold/ExpoModulesProvider.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -141,6 +145,14 @@ name = Frameworks; sourceTree = ""; }; + 53C76CBB26DD45D2AF027D8F /* AriesBifold */ = { + isa = PBXGroup; + children = ( + FB705808CC6C27175E93BD23 /* ExpoModulesProvider.swift */, + ); + name = AriesBifold; + sourceTree = ""; + }; 56A83D5927D95BBF002FE8FE /* Resources */ = { isa = PBXGroup; children = ( @@ -166,6 +178,15 @@ name = Resources; sourceTree = ""; }; + 7B61326B67920F8F6A63C808 /* ExpoModulesProviders */ = { + isa = PBXGroup; + children = ( + 53C76CBB26DD45D2AF027D8F /* AriesBifold */, + F5DF803F29736DDAA342CFF2 /* AriesBifoldTests */, + ); + name = ExpoModulesProviders; + sourceTree = ""; + }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( @@ -187,6 +208,7 @@ 2D16E6871FA4F8E400B85C8A /* Frameworks */, 56A83D5927D95BBF002FE8FE /* Resources */, 8ACF6F3B2962FE31C0EE5408 /* Pods */, + 7B61326B67920F8F6A63C808 /* ExpoModulesProviders */, ); indentWidth = 2; sourceTree = ""; @@ -213,6 +235,14 @@ path = Pods; sourceTree = ""; }; + F5DF803F29736DDAA342CFF2 /* AriesBifoldTests */ = { + isa = PBXGroup; + children = ( + 8695E760B846E4F378AB5655 /* ExpoModulesProvider.swift */, + ); + name = AriesBifoldTests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -221,6 +251,7 @@ buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "AriesBifoldTests" */; buildPhases = ( 8E2BB1F0C19AA17EB70A2E46 /* [CP] Check Pods Manifest.lock */, + 79AC122EB8FB7BB97DCFBE03 /* [Expo] Configure project */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, @@ -243,6 +274,7 @@ buildPhases = ( D19D45CA82EB16EA5021312D /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, + 1BC411DB87B5A949793F4FC1 /* [Expo] Configure project */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, @@ -343,21 +375,41 @@ shellPath = /bin/zsh; shellScript = "set -e\n\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; }; - 2971F0F156B890557487DDEB /* [CP] Embed Pods Frameworks */ = { + 1BC411DB87B5A949793F4FC1 /* [Expo] Configure project */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AriesBifold-AriesBifoldTests/Pods-AriesBifold-AriesBifoldTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); inputPaths = ( + "$(SRCROOT)/.xcode.env", + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/AriesBifold/AriesBifold.entitlements", + "$(SRCROOT)/Pods/Target Support Files/Pods-AriesBifold/expo-configure-project.sh", ); - name = "[CP] Embed Pods Frameworks"; + name = "[Expo] Configure project"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AriesBifold-AriesBifoldTests/Pods-AriesBifold-AriesBifoldTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); outputPaths = ( + "$(SRCROOT)/Pods/Target Support Files/Pods-AriesBifold/ExpoModulesProvider.swift", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-AriesBifold/expo-configure-project.sh\"\n"; + }; + 2971F0F156B890557487DDEB /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AriesBifold-AriesBifoldTests/Pods-AriesBifold-AriesBifoldTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AriesBifold-AriesBifoldTests/Pods-AriesBifold-AriesBifoldTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -372,34 +424,49 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-AriesBifold-AriesBifoldTests/Pods-AriesBifold-AriesBifoldTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-AriesBifold-AriesBifoldTests/Pods-AriesBifold-AriesBifoldTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AriesBifold-AriesBifoldTests/Pods-AriesBifold-AriesBifoldTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 889B52BA36E6E01B35CF05F4 /* [CP] Embed Pods Frameworks */ = { + 79AC122EB8FB7BB97DCFBE03 /* [Expo] Configure project */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AriesBifold/Pods-AriesBifold-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); inputPaths = ( + "$(SRCROOT)/.xcode.env", + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/Pods/Target Support Files/Pods-AriesBifold-AriesBifoldTests/expo-configure-project.sh", ); - name = "[CP] Embed Pods Frameworks"; + name = "[Expo] Configure project"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AriesBifold/Pods-AriesBifold-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); outputPaths = ( + "$(SRCROOT)/Pods/Target Support Files/Pods-AriesBifold-AriesBifoldTests/ExpoModulesProvider.swift", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-AriesBifold-AriesBifoldTests/expo-configure-project.sh\"\n"; + }; + 889B52BA36E6E01B35CF05F4 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AriesBifold/Pods-AriesBifold-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AriesBifold/Pods-AriesBifold-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -436,14 +503,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-AriesBifold/Pods-AriesBifold-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-AriesBifold/Pods-AriesBifold-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AriesBifold/Pods-AriesBifold-resources.sh\"\n"; @@ -458,11 +521,9 @@ "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", ); name = "[CP-User] [RNFB] Core Configuration"; - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; }; D19D45CA82EB16EA5021312D /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -513,6 +574,7 @@ buildActionMask = 2147483647; files = ( 00E356F31AD99517003FC87E /* AriesBifoldTests.m in Sources */, + 460C62056C817F32DD50B03E /* ExpoModulesProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -522,6 +584,7 @@ files = ( 1A762CD62D87E24100455F4C /* AppDelegate.mm in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, + 50FEB047FBD813EA82B0B9E8 /* ExpoModulesProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -547,7 +610,7 @@ "$(inherited)", ); INFOPLIST_FILE = AriesBifoldTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -558,6 +621,7 @@ "-lc++", "$(inherited)", ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AriesBifold.app/AriesBifold"; @@ -572,7 +636,7 @@ COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = AriesBifoldTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -583,6 +647,7 @@ "-lc++", "$(inherited)", ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AriesBifold.app/AriesBifold"; @@ -618,6 +683,7 @@ "-ObjC", "-lc++", ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = asml.bkc.harvard.wallet; PRODUCT_NAME = KeyRing; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -660,6 +726,7 @@ "-ObjC", "-lc++", ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = asml.bkc.harvard.wallet; PRODUCT_NAME = KeyRing; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -722,7 +789,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -739,6 +806,7 @@ OTHER_LDFLAGS = "$(inherited)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; USE_HERMES = true; }; name = Debug; @@ -789,7 +857,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", diff --git a/app/ios/AriesBifold/AppDelegate.mm b/app/ios/AriesBifold/AppDelegate.mm index 17bc4d6..b276e45 100644 --- a/app/ios/AriesBifold/AppDelegate.mm +++ b/app/ios/AriesBifold/AppDelegate.mm @@ -2,6 +2,7 @@ #import #import +#import #import #import #import @@ -17,6 +18,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( [FIRApp configure]; self.moduleName = @"KeyRing"; + // RN 0.77+: third-party Fabric components/modules are resolved through this provider + self.dependencyProvider = [RCTAppDependencyProvider new]; // You can add your custom initial props in the dictionary below. // They will be passed down to the ViewController used by React Native. self.initialProps = @{}; @@ -30,10 +33,11 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { - return [self getBundleURL]; + return [self bundleURL]; } -- (NSURL *)getBundleURL +// RN 0.74+ RCTAppDelegate calls -bundleURL (sourceURLForBridge: kept for compat) +- (NSURL *)bundleURL { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; diff --git a/app/ios/AriesBifold/Info.plist b/app/ios/AriesBifold/Info.plist index f1e7c02..96e7c22 100644 --- a/app/ios/AriesBifold/Info.plist +++ b/app/ios/AriesBifold/Info.plist @@ -51,6 +51,8 @@ LSRequiresIPhoneOS + LSSupportsOpeningDocumentsInPlace + NSAppTransportSecurity NSAllowsArbitraryLoads @@ -68,14 +70,6 @@ $(PRODUCT_NAME) needs access to Bluetooth to manage audio routing during calls NSBluetoothPeripheralUsageDescription $(PRODUCT_NAME) needs access to Bluetooth to connect to audio devices during calls - NSCameraUsageDescription - Camera used for QR Code scanning and video calls - NSFaceIDUsageDescription - $(PRODUCT_NAME) wants to use your FaceID/TouchID to authenticate your identity - NSLocationWhenInUseUsageDescription - We include this permission because a library our app uses references it, even though we don't use it directly - NSLocalNetworkUsageDescription - $(PRODUCT_NAME) needs access to the local network to discover witness servers for credential verification NSBonjourServices _witness._tcp @@ -83,8 +77,18 @@ _witness._tcp.local _witness._tcp.local. + NSCameraUsageDescription + Camera used for QR Code scanning and video calls + NSFaceIDUsageDescription + $(PRODUCT_NAME) wants to use your FaceID/TouchID to authenticate your identity + NSLocalNetworkUsageDescription + $(PRODUCT_NAME) needs access to the local network to discover witness servers for credential verification + NSLocationWhenInUseUsageDescription + We include this permission because a library our app uses references it, even though we don't use it directly NSMicrophoneUsageDescription $(PRODUCT_NAME) needs access to your microphone to enable video calls + RCTNewArchEnabled + UIAppFonts MaterialIcons.ttf @@ -107,6 +111,8 @@ audio voip + UIFileSharingEnabled + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -128,9 +134,5 @@ UIViewControllerBasedStatusBarAppearance - UIFileSharingEnabled - - LSSupportsOpeningDocumentsInPlace - diff --git a/app/ios/Podfile b/app/ios/Podfile index 5a74709..cb8b276 100644 --- a/app/ios/Podfile +++ b/app/ios/Podfile @@ -1,6 +1,10 @@ +require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") source 'https://cdn.cocoapods.org' require_relative '../node_modules/react-native/scripts/react_native_pods' +# prevents location usage from react-native-vision-camera (matches upstream bc-wallet) +$VCEnableLocation = false + # From RNP docs here: https://www.npmjs.com/package/react-native-permissions/v/4.0.1 def node_require(script) # Resolve script with node to allow for hoisting @@ -41,17 +45,6 @@ setup_permissions([ # 'StoreKit', ]) -# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. -# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded -# -# To fix this you can also exclude `react-native-flipper` using a `react-native.config.js` -# ```js -# module.exports = { -# dependencies: { -# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), -# ``` -flipper_config = FlipperConfiguration.disabled - linkage = ENV['USE_FRAMEWORKS'] if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green @@ -59,6 +52,14 @@ if linkage != nil end target 'AriesBifold' do + use_expo_modules! + post_integrate do |installer| + begin + expo_patch_react_imports!(installer) + rescue => e + Pod::UI.warn e + end + end config = use_native_modules! pod 'Firebase', :modular_headers => true diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock index 3be8538..0c1e154 100644 --- a/app/ios/Podfile.lock +++ b/app/ios/Podfile.lock @@ -1,1363 +1,3374 @@ PODS: - - anoncreds (0.2.4): + - anoncreds (0.3.4): - React - React-callinvoker - React-Core - - aries-askar (0.2.3): + - askar (0.6.0): - React - React-callinvoker - React-Core - - BcscCore (0.1.0-alpha.1): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - boost (1.83.0) + - boost (1.84.0) - BVLinearGradient (2.8.3): - React-Core - CatCrypto (0.3.2) - CocoaAsyncSocket (7.6.5) - DoubleConversion (1.1.6) - - FBLazyVector (0.73.11) - - FBReactNativeSpec (0.73.11): - - RCT-Folly (= 2022.05.16.00) - - RCTRequired (= 0.73.11) - - RCTTypeSafety (= 0.73.11) - - React-Core (= 0.73.11) - - React-jsi (= 0.73.11) - - ReactCommon/turbomodule/core (= 0.73.11) - - Firebase (8.15.0): - - Firebase/Core (= 8.15.0) - - Firebase/Core (8.15.0): + - EXConstants (18.0.13): + - ExpoModulesCore + - Expo (54.0.35): + - boost + - DoubleConversion + - ExpoModulesCore + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - ExpoAppIntegrity (55.0.14): + - ExpoModulesCore + - ExpoAsset (12.0.13): + - ExpoModulesCore + - ExpoCrypto (15.0.9): + - ExpoModulesCore + - ExpoFileSystem (19.0.23): + - ExpoModulesCore + - ExpoFont (14.0.12): + - ExpoModulesCore + - ExpoKeepAwake (15.0.8): + - ExpoModulesCore + - ExpoModulesCore (3.0.30): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - ExpoSecureEnvironment (0.1.5): + - ExpoModulesCore + - ExpoSecureStore (15.0.8): + - ExpoModulesCore + - fast_float (8.0.0) + - FBLazyVector (0.81.5) + - Firebase (11.11.0): + - Firebase/Core (= 11.11.0) + - Firebase/Core (11.11.0): - Firebase/CoreOnly - - FirebaseAnalytics (~> 8.15.0) - - Firebase/CoreOnly (8.15.0): - - FirebaseCore (= 8.15.0) - - Firebase/Messaging (8.15.0): + - FirebaseAnalytics (~> 11.11.0) + - Firebase/CoreOnly (11.11.0): + - FirebaseCore (~> 11.11.0) + - Firebase/Messaging (11.11.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 8.15.0) - - FirebaseAnalytics (8.15.0): - - FirebaseAnalytics/AdIdSupport (= 8.15.0) - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" - - nanopb (~> 2.30908.0) - - FirebaseAnalytics/AdIdSupport (8.15.0): - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleAppMeasurement (= 8.15.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" - - nanopb (~> 2.30908.0) - - FirebaseCore (8.15.0): - - FirebaseCoreDiagnostics (~> 8.0) - - GoogleUtilities/Environment (~> 7.7) - - GoogleUtilities/Logger (~> 7.7) - - FirebaseCoreDiagnostics (8.15.0): - - GoogleDataTransport (~> 9.1) - - GoogleUtilities/Environment (~> 7.7) - - GoogleUtilities/Logger (~> 7.7) - - nanopb (~> 2.30908.0) - - FirebaseCoreInternal (10.29.0): - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseInstallations (8.15.0): - - FirebaseCore (~> 8.0) - - GoogleUtilities/Environment (~> 7.7) - - GoogleUtilities/UserDefaults (~> 7.7) - - PromisesObjC (< 3.0, >= 1.2) - - FirebaseMessaging (8.15.0): - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleDataTransport (~> 9.1) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/Environment (~> 7.7) - - GoogleUtilities/Reachability (~> 7.7) - - GoogleUtilities/UserDefaults (~> 7.7) - - nanopb (~> 2.30908.0) - - fmt (6.2.1) + - FirebaseMessaging (~> 11.11.0) + - FirebaseAnalytics (11.11.0): + - FirebaseAnalytics/AdIdSupport (= 11.11.0) + - FirebaseCore (~> 11.11.0) + - FirebaseInstallations (~> 11.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - FirebaseAnalytics/AdIdSupport (11.11.0): + - FirebaseCore (~> 11.11.0) + - FirebaseInstallations (~> 11.0) + - GoogleAppMeasurement (= 11.11.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - FirebaseCore (11.11.0): + - FirebaseCoreInternal (~> 11.11.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/Logger (~> 8.0) + - FirebaseCoreExtension (11.11.0): + - FirebaseCore (~> 11.11.0) + - FirebaseCoreInternal (11.11.0): + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseInstallations (11.11.0): + - FirebaseCore (~> 11.11.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (11.11.0): + - FirebaseCore (~> 11.11.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/Reachability (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - nanopb (~> 3.30910.0) + - fmt (11.0.2) - glog (0.3.5) - - GoogleAppMeasurement (8.15.0): - - GoogleAppMeasurement/AdIdSupport (= 8.15.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" - - nanopb (~> 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (8.15.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 8.15.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" - - nanopb (~> 2.30908.0) - - GoogleAppMeasurement/WithoutAdIdSupport (8.15.0): - - GoogleUtilities/AppDelegateSwizzler (~> 7.7) - - GoogleUtilities/MethodSwizzler (~> 7.7) - - GoogleUtilities/Network (~> 7.7) - - "GoogleUtilities/NSData+zlib (~> 7.7)" - - nanopb (~> 2.30908.0) - - GoogleDataTransport (9.4.1): - - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30911.0, >= 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities (7.13.3): - - GoogleUtilities/AppDelegateSwizzler (= 7.13.3) - - GoogleUtilities/Environment (= 7.13.3) - - GoogleUtilities/ISASwizzler (= 7.13.3) - - GoogleUtilities/Logger (= 7.13.3) - - GoogleUtilities/MethodSwizzler (= 7.13.3) - - GoogleUtilities/Network (= 7.13.3) - - "GoogleUtilities/NSData+zlib (= 7.13.3)" - - GoogleUtilities/Privacy (= 7.13.3) - - GoogleUtilities/Reachability (= 7.13.3) - - GoogleUtilities/SwizzlerTestHelpers (= 7.13.3) - - GoogleUtilities/UserDefaults (= 7.13.3) - - GoogleUtilities/AppDelegateSwizzler (7.13.3): + - GoogleAppMeasurement (11.11.0): + - GoogleAppMeasurement/AdIdSupport (= 11.11.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/AdIdSupport (11.11.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 11.11.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/WithoutAdIdSupport (11.11.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - nanopb (~> 3.30910.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleUtilities (8.1.2): + - GoogleUtilities/AppDelegateSwizzler (= 8.1.2) + - GoogleUtilities/Environment (= 8.1.2) + - GoogleUtilities/Logger (= 8.1.2) + - GoogleUtilities/MethodSwizzler (= 8.1.2) + - GoogleUtilities/Network (= 8.1.2) + - "GoogleUtilities/NSData+zlib (= 8.1.2)" + - GoogleUtilities/Privacy (= 8.1.2) + - GoogleUtilities/Reachability (= 8.1.2) + - GoogleUtilities/SwizzlerTestHelpers (= 8.1.2) + - GoogleUtilities/UserDefaults (= 8.1.2) + - GoogleUtilities/AppDelegateSwizzler (8.1.2): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - GoogleUtilities/Privacy - - GoogleUtilities/Environment (7.13.3): + - GoogleUtilities/Environment (8.1.2): - GoogleUtilities/Privacy - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/ISASwizzler (7.13.3): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (7.13.3): + - GoogleUtilities/Logger (8.1.2): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (7.13.3): + - GoogleUtilities/MethodSwizzler (8.1.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/Network (7.13.3): + - GoogleUtilities/Network (8.1.2): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.13.3)": + - "GoogleUtilities/NSData+zlib (8.1.2)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (7.13.3) - - GoogleUtilities/Reachability (7.13.3): + - GoogleUtilities/Privacy (8.1.2) + - GoogleUtilities/Reachability (8.1.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/SwizzlerTestHelpers (7.13.3): + - GoogleUtilities/SwizzlerTestHelpers (8.1.2): - GoogleUtilities/MethodSwizzler - - GoogleUtilities/UserDefaults (7.13.3): + - GoogleUtilities/UserDefaults (8.1.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - hermes-engine (0.73.11): - - hermes-engine/Pre-built (= 0.73.11) - - hermes-engine/Pre-built (0.73.11) - - indy-vdr (0.2.2): + - hermes-engine (0.81.5): + - hermes-engine/Pre-built (= 0.81.5) + - hermes-engine/Pre-built (0.81.5) + - indy-vdr (0.2.4): - React - React-callinvoker - React-Core - JitsiWebRTC (124.0.2) - - libevent (2.1.12) - Mute (0.6.1) - - nanopb (2.30908.0): - - nanopb/decode (= 2.30908.0) - - nanopb/encode (= 2.30908.0) - - nanopb/decode (2.30908.0) - - nanopb/encode (2.30908.0) - - PromisesObjC (2.4.0) - - RCT-Folly (2022.05.16.00): + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - PromisesObjC (2.4.1) + - RCT-Folly (2024.11.18.00): - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float (= 8.0.0) + - fmt (= 11.0.2) - glog - - RCT-Folly/Default (= 2022.05.16.00) - - RCT-Folly/Default (2022.05.16.00): + - RCT-Folly/Default (= 2024.11.18.00) + - RCT-Folly/Default (2024.11.18.00): - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float (= 8.0.0) + - fmt (= 11.0.2) - glog - - RCT-Folly/Fabric (2022.05.16.00): + - RCT-Folly/Fabric (2024.11.18.00): - boost - DoubleConversion - - fmt (~> 6.2.1) - - glog - - RCT-Folly/Futures (2022.05.16.00): + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - RCTDeprecation (0.81.5) + - RCTRequired (0.81.5) + - RCTTypeSafety (0.81.5): + - FBLazyVector (= 0.81.5) + - RCTRequired (= 0.81.5) + - React-Core (= 0.81.5) + - React (0.81.5): + - React-Core (= 0.81.5) + - React-Core/DevSupport (= 0.81.5) + - React-Core/RCTWebSocket (= 0.81.5) + - React-RCTActionSheet (= 0.81.5) + - React-RCTAnimation (= 0.81.5) + - React-RCTBlob (= 0.81.5) + - React-RCTImage (= 0.81.5) + - React-RCTLinking (= 0.81.5) + - React-RCTNetwork (= 0.81.5) + - React-RCTSettings (= 0.81.5) + - React-RCTText (= 0.81.5) + - React-RCTVibration (= 0.81.5) + - React-callinvoker (0.81.5) + - React-Core (0.81.5): - boost - DoubleConversion - - fmt (~> 6.2.1) - - glog - - libevent - - RCTRequired (0.73.11) - - RCTTypeSafety (0.73.11): - - FBLazyVector (= 0.73.11) - - RCTRequired (= 0.73.11) - - React-Core (= 0.73.11) - - React (0.73.11): - - React-Core (= 0.73.11) - - React-Core/DevSupport (= 0.73.11) - - React-Core/RCTWebSocket (= 0.73.11) - - React-RCTActionSheet (= 0.73.11) - - React-RCTAnimation (= 0.73.11) - - React-RCTBlob (= 0.73.11) - - React-RCTImage (= 0.73.11) - - React-RCTLinking (= 0.73.11) - - React-RCTNetwork (= 0.73.11) - - React-RCTSettings (= 0.73.11) - - React-RCTText (= 0.73.11) - - React-RCTVibration (= 0.73.11) - - React-callinvoker (0.73.11) - - React-Codegen (0.73.11): - - DoubleConversion - - FBReactNativeSpec + - fast_float + - fmt - glog - hermes-engine - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - React-rncore - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-Core (0.73.11): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default (= 0.73.11) + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.81.5) - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/CoreModulesHeaders (0.73.11): + - React-Core/CoreModulesHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/Default (0.73.11): + - React-Core/Default (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/DevSupport (0.73.11): + - React-Core/DevSupport (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default (= 0.73.11) - - React-Core/RCTWebSocket (= 0.73.11) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.81.5) + - React-Core/RCTWebSocket (= 0.81.5) - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector (= 0.73.11) + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTActionSheetHeaders (0.73.11): + - React-Core/RCTActionSheetHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTAnimationHeaders (0.73.11): + - React-Core/RCTAnimationHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTBlobHeaders (0.73.11): + - React-Core/RCTBlobHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTImageHeaders (0.73.11): + - React-Core/RCTImageHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTLinkingHeaders (0.73.11): + - React-Core/RCTLinkingHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTNetworkHeaders (0.73.11): + - React-Core/RCTNetworkHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTSettingsHeaders (0.73.11): + - React-Core/RCTSettingsHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTTextHeaders (0.73.11): + - React-Core/RCTTextHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTVibrationHeaders (0.73.11): + - React-Core/RCTVibrationHeaders (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation - React-Core/Default - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-Core/RCTWebSocket (0.73.11): + - React-Core/RCTWebSocket (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Core/Default (= 0.73.11) + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.81.5) - React-cxxreact + - React-featureflags - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.6.1) + - SocketRocket - Yoga - - React-CoreModules (0.73.11): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety (= 0.73.11) - - React-Codegen - - React-Core/CoreModulesHeaders (= 0.73.11) - - React-jsi (= 0.73.11) + - React-CoreModules (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety (= 0.81.5) + - React-Core/CoreModulesHeaders (= 0.81.5) + - React-jsi (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing - React-NativeModulesApple - React-RCTBlob - - React-RCTImage (= 0.73.11) + - React-RCTFBReactNativeSpec + - React-RCTImage (= 0.81.5) + - React-runtimeexecutor - ReactCommon - - SocketRocket (= 0.6.1) - - React-cxxreact (0.73.11): - - boost (= 1.83.0) + - SocketRocket + - React-cxxreact (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker (= 0.73.11) - - React-debug (= 0.73.11) - - React-jsi (= 0.73.11) - - React-jsinspector (= 0.73.11) - - React-logger (= 0.73.11) - - React-perflogger (= 0.73.11) - - React-runtimeexecutor (= 0.73.11) - - React-debug (0.73.11) - - React-Fabric (0.73.11): + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.81.5) + - React-debug (= 0.81.5) + - React-jsi (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-logger (= 0.81.5) + - React-perflogger (= 0.81.5) + - React-runtimeexecutor + - React-timing (= 0.81.5) + - SocketRocket + - React-debug (0.81.5) + - React-defaultsnativemodule (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/animations (= 0.73.11) - - React-Fabric/attributedstring (= 0.73.11) - - React-Fabric/componentregistry (= 0.73.11) - - React-Fabric/componentregistrynative (= 0.73.11) - - React-Fabric/components (= 0.73.11) - - React-Fabric/core (= 0.73.11) - - React-Fabric/imagemanager (= 0.73.11) - - React-Fabric/leakchecker (= 0.73.11) - - React-Fabric/mounting (= 0.73.11) - - React-Fabric/scheduler (= 0.73.11) - - React-Fabric/telemetry (= 0.73.11) - - React-Fabric/templateprocessor (= 0.73.11) - - React-Fabric/textlayoutmanager (= 0.73.11) - - React-Fabric/uimanager (= 0.73.11) + - RCT-Folly + - RCT-Folly/Fabric + - React-domnativemodule + - React-featureflagsnativemodule + - React-idlecallbacksnativemodule + - React-jsi + - React-jsiexecutor + - React-microtasksnativemodule + - React-RCTFBReactNativeSpec + - SocketRocket + - React-domnativemodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Fabric + - React-Fabric/bridging + - React-FabricComponents - React-graphics - React-jsi - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils + - React-RCTFBReactNativeSpec + - React-runtimeexecutor - ReactCommon/turbomodule/core - - React-Fabric/animations (0.73.11): + - SocketRocket + - Yoga + - React-Fabric (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric/animations (= 0.81.5) + - React-Fabric/attributedstring (= 0.81.5) + - React-Fabric/bridging (= 0.81.5) + - React-Fabric/componentregistry (= 0.81.5) + - React-Fabric/componentregistrynative (= 0.81.5) + - React-Fabric/components (= 0.81.5) + - React-Fabric/consistency (= 0.81.5) + - React-Fabric/core (= 0.81.5) + - React-Fabric/dom (= 0.81.5) + - React-Fabric/imagemanager (= 0.81.5) + - React-Fabric/leakchecker (= 0.81.5) + - React-Fabric/mounting (= 0.81.5) + - React-Fabric/observers (= 0.81.5) + - React-Fabric/scheduler (= 0.81.5) + - React-Fabric/telemetry (= 0.81.5) + - React-Fabric/templateprocessor (= 0.81.5) + - React-Fabric/uimanager (= 0.81.5) + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.73.11): + - SocketRocket + - React-Fabric/animations (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.73.11): + - SocketRocket + - React-Fabric/attributedstring (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.73.11): + - SocketRocket + - React-Fabric/bridging (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components (0.73.11): + - SocketRocket + - React-Fabric/componentregistry (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug - - React-Fabric/components/inputaccessory (= 0.73.11) - - React-Fabric/components/legacyviewmanagerinterop (= 0.73.11) - - React-Fabric/components/modal (= 0.73.11) - - React-Fabric/components/rncore (= 0.73.11) - - React-Fabric/components/root (= 0.73.11) - - React-Fabric/components/safeareaview (= 0.73.11) - - React-Fabric/components/scrollview (= 0.73.11) - - React-Fabric/components/text (= 0.73.11) - - React-Fabric/components/textinput (= 0.73.11) - - React-Fabric/components/unimplementedview (= 0.73.11) - - React-Fabric/components/view (= 0.73.11) + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/inputaccessory (0.73.11): + - SocketRocket + - React-Fabric/componentregistrynative (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.73.11): + - SocketRocket + - React-Fabric/components (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.81.5) + - React-Fabric/components/root (= 0.81.5) + - React-Fabric/components/scrollview (= 0.81.5) + - React-Fabric/components/view (= 0.81.5) + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/modal (0.73.11): + - SocketRocket + - React-Fabric/components/legacyviewmanagerinterop (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/rncore (0.73.11): + - SocketRocket + - React-Fabric/components/root (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.73.11): + - SocketRocket + - React-Fabric/components/scrollview (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/view (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/safeareaview (0.73.11): + - SocketRocket + - Yoga + - React-Fabric/consistency (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/scrollview (0.73.11): + - SocketRocket + - React-Fabric/core (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/text (0.73.11): + - SocketRocket + - React-Fabric/dom (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/textinput (0.73.11): + - SocketRocket + - React-Fabric/imagemanager (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/unimplementedview (0.73.11): + - SocketRocket + - React-Fabric/leakchecker (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.73.11): + - SocketRocket + - React-Fabric/mounting (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - Yoga - - React-Fabric/core (0.73.11): + - SocketRocket + - React-Fabric/observers (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.81.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers/events (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/scheduler (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancetimeline + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/telemetry (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/templateprocessor (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.81.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager/consistency (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-rendererconsistency - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.73.11): + - SocketRocket + - React-FabricComponents (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.81.5) + - React-FabricComponents/textlayoutmanager (= 0.81.5) + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.73.11): + - SocketRocket + - Yoga + - React-FabricComponents/components (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.81.5) + - React-FabricComponents/components/iostextinput (= 0.81.5) + - React-FabricComponents/components/modal (= 0.81.5) + - React-FabricComponents/components/rncore (= 0.81.5) + - React-FabricComponents/components/safeareaview (= 0.81.5) + - React-FabricComponents/components/scrollview (= 0.81.5) + - React-FabricComponents/components/switch (= 0.81.5) + - React-FabricComponents/components/text (= 0.81.5) + - React-FabricComponents/components/textinput (= 0.81.5) + - React-FabricComponents/components/unimplementedview (= 0.81.5) + - React-FabricComponents/components/virtualview (= 0.81.5) + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.73.11): + - SocketRocket + - Yoga + - React-FabricComponents/components/inputaccessory (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.73.11): + - SocketRocket + - Yoga + - React-FabricComponents/components/iostextinput (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.73.11): + - SocketRocket + - Yoga + - React-FabricComponents/components/modal (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.73.11): + - SocketRocket + - Yoga + - React-FabricComponents/components/rncore (0.81.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric + - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/textlayoutmanager (0.73.11): + - SocketRocket + - Yoga + - React-FabricComponents/components/safeareaview (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/scrollview (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/switch (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/text (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/textinput (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/unimplementedview (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/virtualview (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/textlayoutmanager (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricImage (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired (= 0.81.5) + - RCTTypeSafety (= 0.81.5) + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.81.5) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - SocketRocket + - Yoga + - React-featureflags (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-featureflagsnativemodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - React-graphics (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-utils + - SocketRocket + - React-hermes (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.81.5) + - React-jsi + - React-jsiexecutor (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.81.5) + - React-runtimeexecutor + - SocketRocket + - React-idlecallbacksnativemodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - SocketRocket + - React-ImageManager (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - SocketRocket + - React-jserrorhandler (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - ReactCommon/turbomodule/bridging + - SocketRocket + - React-jsi (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsiexecutor (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.81.5) + - React-jsi (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.81.5) + - React-runtimeexecutor + - SocketRocket + - React-jsinspector (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-oscompat + - React-perflogger (= 0.81.5) + - React-runtimeexecutor + - SocketRocket + - React-jsinspectorcdp (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsinspectornetwork (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectorcdp + - React-performancetimeline + - React-timing + - SocketRocket + - React-jsinspectortracing (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-oscompat + - React-timing + - SocketRocket + - React-jsitooling (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.81.5) + - React-jsi (= 0.81.5) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-runtimeexecutor + - SocketRocket + - React-jsitracing (0.81.5): + - React-jsi + - React-logger (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-Mapbuffer (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-microtasksnativemodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - react-native-attestation (3.0.16): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-config (1.5.5): + - react-native-config/App (= 1.5.5) + - react-native-config/App (1.5.5): + - React-Core + - react-native-document-picker (9.3.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-encrypted-storage (4.0.3): + - React-Core + - react-native-get-random-values (1.11.0): + - React-Core + - react-native-keyboard-controller (1.18.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-keyboard-controller/common (= 1.18.6) + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-keyboard-controller/common (1.18.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-netinfo (11.4.1): + - React-Core + - react-native-orientation-locker (1.6.0): + - React-Core + - react-native-safe-area-context (5.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common (= 5.6.2) + - react-native-safe-area-context/fabric (= 5.6.2) + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/common (5.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/fabric (5.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-screenguard (1.1.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SDWebImage (~> 5.21.0) + - SocketRocket + - Yoga + - react-native-splash-screen (3.3.0): + - React-Core + - react-native-tcp-socket (6.0.6): + - CocoaAsyncSocket + - React-Core + - react-native-video (6.16.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-video/Video (= 6.16.1) + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-video/Fabric (6.16.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-video/Video (6.16.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-video/Fabric + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-volume-manager (1.10.0): + - Mute + - React-Core + - react-native-webrtc (124.0.6): + - JitsiWebRTC (~> 124.0.0) + - React-Core + - react-native-webview (13.15.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-zeroconf (0.14.0): + - React-Core + - React-NativeModulesApple (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core + - React-cxxreact + - React-featureflags + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - React-oscompat (0.81.5) + - React-perflogger (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-performancetimeline (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectortracing + - React-perflogger + - React-timing + - SocketRocket + - React-RCTActionSheet (0.81.5): + - React-Core/RCTActionSheetHeaders (= 0.81.5) + - React-RCTAnimation (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-featureflags + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTAppDelegate (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsitooling + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTNetwork + - React-RCTRuntime + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon + - SocketRocket + - React-RCTBlob (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - React-RCTFabric (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-performancetimeline + - React-RCTAnimation + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-RCTFBReactNativeSpec (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec/components (= 0.81.5) + - ReactCommon + - SocketRocket + - React-RCTFBReactNativeSpec/components (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon + - SocketRocket + - Yoga + - React-RCTImage (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - React-RCTLinking (0.81.5): + - React-Core/RCTLinkingHeaders (= 0.81.5) + - React-jsi (= 0.81.5) + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactCommon/turbomodule/core (= 0.81.5) + - React-RCTNetwork (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTRuntime (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - SocketRocket + - React-RCTSettings (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTText (0.81.5): + - React-Core/RCTTextHeaders (= 0.81.5) + - Yoga + - React-RCTVibration (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-rendererconsistency (0.81.5) + - React-renderercss (0.81.5): + - React-debug + - React-utils + - React-rendererdebug (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-RuntimeApple (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - SocketRocket + - React-RuntimeCore (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-Fabric + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-performancetimeline + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - React-runtimeexecutor (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-featureflags + - React-jsi (= 0.81.5) + - React-utils + - SocketRocket + - React-RuntimeHermes (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-jsitracing + - React-RuntimeCore + - React-runtimeexecutor + - React-utils + - SocketRocket + - React-runtimescheduler (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - React-jsinspectortracing + - React-performancetimeline + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-timing + - React-utils + - SocketRocket + - React-timing (0.81.5): + - React-debug + - React-utils (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-jsi (= 0.81.5) + - SocketRocket + - ReactAppDependencyProvider (0.81.5): + - ReactCodegen + - ReactCodegen (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-RCTAppDelegate + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - ReactCommon (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - ReactCommon/turbomodule (= 0.81.5) + - SocketRocket + - ReactCommon/turbomodule (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.81.5) + - React-cxxreact (= 0.81.5) + - React-jsi (= 0.81.5) + - React-logger (= 0.81.5) + - React-perflogger (= 0.81.5) + - ReactCommon/turbomodule/bridging (= 0.81.5) + - ReactCommon/turbomodule/core (= 0.81.5) + - SocketRocket + - ReactCommon/turbomodule/bridging (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.81.5) + - React-cxxreact (= 0.81.5) + - React-jsi (= 0.81.5) + - React-logger (= 0.81.5) + - React-perflogger (= 0.81.5) + - SocketRocket + - ReactCommon/turbomodule/core (0.81.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.81.5) + - React-cxxreact (= 0.81.5) + - React-debug (= 0.81.5) + - React-featureflags (= 0.81.5) + - React-jsi (= 0.81.5) + - React-logger (= 0.81.5) + - React-perflogger (= 0.81.5) + - React-utils (= 0.81.5) + - SocketRocket + - ReactNativeIncallManager (4.2.1): + - React-Core + - RNArgon2 (2.0.1): + - CatCrypto + - React-Core + - RNCAsyncStorage (2.2.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNCClipboard (1.16.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNDeviceInfo (8.7.1): + - React-Core + - RNFBApp (21.14.0): + - Firebase/CoreOnly (= 11.11.0) + - React-Core + - RNFBMessaging (21.14.0): + - Firebase/Messaging (= 11.11.0) + - FirebaseCoreExtension + - React-Core + - RNFBApp + - RNFS (2.20.0): + - React-Core + - RNGestureHandler (2.28.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNInAppBrowser (3.7.0): + - React-Core + - RNKeychain (10.0.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNLocalize (2.2.6): + - React-Core + - RNPermissions (5.4.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNReanimated (3.19.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 3.19.5) + - RNReanimated/worklets (= 3.19.5) + - SocketRocket + - Yoga + - RNReanimated/reanimated (3.19.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated/apple (= 3.19.5) + - SocketRocket + - Yoga + - RNReanimated/reanimated/apple (3.19.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNReanimated/worklets (3.19.5): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/worklets/apple (= 3.19.5) + - SocketRocket + - Yoga + - RNReanimated/worklets/apple (3.19.5): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-cxxreact - React-debug - - React-Fabric/uimanager + - React-Fabric + - React-featureflags - React-graphics + - React-hermes + - React-ImageManager - React-jsi - - React-jsiexecutor - - React-logger + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss - React-rendererdebug - - React-runtimescheduler - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.73.11): + - SocketRocket + - Yoga + - RNScreens (4.16.0): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) + - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-cxxreact - React-debug + - React-Fabric + - React-featureflags - React-graphics + - React-ImageManager - React-jsi - - React-jsiexecutor - - React-logger + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss - React-rendererdebug - - React-runtimescheduler - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-FabricImage (0.73.11): + - RNScreens/common (= 4.16.0) + - SocketRocket + - Yoga + - RNScreens/common (4.16.0): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - RCTRequired (= 0.73.11) - - RCTTypeSafety (= 0.73.11) + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug - React-Fabric + - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.73.11) - - React-logger + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss - React-rendererdebug - React-utils - - ReactCommon + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket - Yoga - - React-graphics (0.73.11): - - glog - - RCT-Folly/Fabric (= 2022.05.16.00) - - React-Core/Default (= 0.73.11) - - React-utils - - React-hermes (0.73.11): + - RNSVG (15.12.1): + - boost - DoubleConversion - - fmt (~> 6.2.1) + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - RCT-Folly/Futures (= 2022.05.16.00) - - React-cxxreact (= 0.73.11) - - React-jsi - - React-jsiexecutor (= 0.73.11) - - React-jsinspector (= 0.73.11) - - React-perflogger (= 0.73.11) - - React-ImageManager (0.73.11): - - glog + - RCT-Folly - RCT-Folly/Fabric - - React-Core/Default + - RCTRequired + - RCTTypeSafety + - React-Core - React-debug - React-Fabric + - React-featureflags - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - - React-jserrorhandler (0.73.11): - - RCT-Folly/Fabric (= 2022.05.16.00) - - React-debug - - React-jsi - - React-Mapbuffer - - React-jsi (0.73.11): - - boost (= 1.83.0) - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-jsiexecutor (0.73.11): + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNSVG/common (= 15.12.1) + - SocketRocket + - Yoga + - RNSVG/common (15.12.1): + - boost - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-cxxreact (= 0.73.11) - - React-jsi (= 0.73.11) - - React-perflogger (= 0.73.11) - - React-jsinspector (0.73.11) - - React-logger (0.73.11): - - glog - - React-Mapbuffer (0.73.11): - - glog - - React-debug - - react-native-attestation (0.1.0-alpha.1): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - react-native-config (1.5.5): - - react-native-config/App (= 1.5.5) - - react-native-config/App (1.5.5): - - React-Core - - react-native-date-picker (5.0.13): - - React-Core - - react-native-document-picker (9.3.1): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - react-native-encrypted-storage (4.0.3): - - React-Core - - react-native-get-random-values (1.11.0): - - React-Core - - react-native-netinfo (11.3.3): - - React-Core - - react-native-orientation-locker (1.6.0): - - React-Core - - react-native-safe-area-context (4.8.2): - - React-Core - - react-native-screenguard (1.1.0): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - SDWebImage (~> 5.21.0) - - react-native-splash-screen (3.3.0): - - React-Core - - react-native-tcp-socket (6.0.6): - - CocoaAsyncSocket - - React-Core - - react-native-video (6.16.1): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - react-native-video/Video (= 6.16.1) - - react-native-video/Video (6.16.1): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - react-native-volume-manager (1.10.0): - - Mute - - React-Core - - react-native-webrtc (124.0.6): - - JitsiWebRTC (~> 124.0.0) - - React-Core - - react-native-webview (13.10.7): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - react-native-zeroconf (0.14.0): - - React-Core - - React-nativeconfig (0.73.11) - - React-NativeModulesApple (0.73.11): + - fast_float + - fmt - glog - hermes-engine - - React-callinvoker - - React-Core - - React-cxxreact - - React-jsi - - React-runtimeexecutor - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-perflogger (0.73.11) - - React-RCTActionSheet (0.73.11): - - React-Core/RCTActionSheetHeaders (= 0.73.11) - - React-RCTAnimation (0.73.11): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety - - React-Codegen - - React-Core/RCTAnimationHeaders - - React-jsi - - React-NativeModulesApple - - ReactCommon - - React-RCTAppDelegate (0.73.11): - RCT-Folly + - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety - React-Core - - React-CoreModules - - React-hermes - - React-nativeconfig - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-RCTNetwork - - React-runtimescheduler - - ReactCommon - - React-RCTBlob (0.73.11): - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-Codegen - - React-Core/RCTBlobHeaders - - React-Core/RCTWebSocket - - React-jsi - - React-NativeModulesApple - - React-RCTNetwork - - ReactCommon - - React-RCTFabric (0.73.11): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - React-Core - React-debug - React-Fabric - - React-FabricImage + - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-nativeconfig - - React-RCTImage - - React-RCTText + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss - React-rendererdebug - - React-runtimescheduler - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket - Yoga - - React-RCTImage (0.73.11): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety - - React-Codegen - - React-Core/RCTImageHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTNetwork - - ReactCommon - - React-RCTLinking (0.73.11): - - React-Codegen - - React-Core/RCTLinkingHeaders (= 0.73.11) - - React-jsi (= 0.73.11) - - React-NativeModulesApple - - ReactCommon - - ReactCommon/turbomodule/core (= 0.73.11) - - React-RCTNetwork (0.73.11): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety - - React-Codegen - - React-Core/RCTNetworkHeaders - - React-jsi - - React-NativeModulesApple - - ReactCommon - - React-RCTSettings (0.73.11): - - RCT-Folly (= 2022.05.16.00) - - RCTTypeSafety - - React-Codegen - - React-Core/RCTSettingsHeaders - - React-jsi - - React-NativeModulesApple - - ReactCommon - - React-RCTText (0.73.11): - - React-Core/RCTTextHeaders (= 0.73.11) - - Yoga - - React-RCTVibration (0.73.11): - - RCT-Folly (= 2022.05.16.00) - - React-Codegen - - React-Core/RCTVibrationHeaders - - React-jsi - - React-NativeModulesApple - - ReactCommon - - React-rendererdebug (0.73.11): + - RNVectorIcons (10.3.0): + - boost - DoubleConversion - - fmt (~> 6.2.1) - - RCT-Folly (= 2022.05.16.00) - - React-debug - - React-rncore (0.73.11) - - React-runtimeexecutor (0.73.11): - - React-jsi (= 0.73.11) - - React-runtimescheduler (0.73.11): + - fast_float + - fmt - glog - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker - - React-cxxreact + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss - React-rendererdebug - - React-runtimeexecutor - React-utils - - React-utils (0.73.11): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-debug - - ReactCommon (0.73.11): - - React-logger (= 0.73.11) - - ReactCommon/turbomodule (= 0.73.11) - - ReactCommon/turbomodule (0.73.11): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker (= 0.73.11) - - React-cxxreact (= 0.73.11) - - React-jsi (= 0.73.11) - - React-logger (= 0.73.11) - - React-perflogger (= 0.73.11) - - ReactCommon/turbomodule/bridging (= 0.73.11) - - ReactCommon/turbomodule/core (= 0.73.11) - - ReactCommon/turbomodule/bridging (0.73.11): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker (= 0.73.11) - - React-cxxreact (= 0.73.11) - - React-jsi (= 0.73.11) - - React-logger (= 0.73.11) - - React-perflogger (= 0.73.11) - - ReactCommon/turbomodule/core (0.73.11): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - React-callinvoker (= 0.73.11) - - React-cxxreact (= 0.73.11) - - React-jsi (= 0.73.11) - - React-logger (= 0.73.11) - - React-perflogger (= 0.73.11) - - ReactNativeIncallManager (4.2.1): - - React-Core - - RNArgon2 (2.0.1): - - CatCrypto - - React-Core - - RNCAsyncStorage (1.22.3): - - React-Core - - RNCClipboard (1.16.3): - - React-Core - - RNDeviceInfo (8.7.1): - - React-Core - - RNFBApp (14.12.0): - - Firebase/CoreOnly (= 8.15.0) - - React-Core - - RNFBMessaging (14.12.0): - - Firebase/Messaging (= 8.15.0) - - React-Core - - RNFBApp - - RNFS (2.20.0): - - React-Core - - RNGestureHandler (2.18.1): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - RNInAppBrowser (3.7.0): - - React-Core - - RNKeychain (8.1.3): - - React-Core - - RNLocalize (2.2.6): - - React-Core - - RNPermissions (5.4.2): - - React-Core - - RNScreens (4.4.0): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - React-RCTImage - - RNSVG (15.0.0): - - React-Core - - RNVectorIcons (10.0.3): - - glog - - RCT-Folly (= 2022.05.16.00) - - React-Core - - SDWebImage (5.21.2): - - SDWebImage/Core (= 5.21.2) - - SDWebImage/Core (5.21.2) - - SocketRocket (0.6.1) - - VisionCamera (4.3.2): - - VisionCamera/Core (= 4.3.2) - - VisionCamera/React (= 4.3.2) - - VisionCamera/Core (4.3.2) - - VisionCamera/React (4.3.2): - - React-Core - - Yoga (1.14.0) + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - SDWebImage (5.21.7): + - SDWebImage/Core (= 5.21.7) + - SDWebImage/Core (5.21.7) + - SocketRocket (0.7.1) + - VisionCamera (4.7.3): + - VisionCamera/Core (= 4.7.3) + - VisionCamera/React (= 4.7.3) + - VisionCamera/Core (4.7.3) + - VisionCamera/React (4.7.3): + - React-Core + - Yoga (0.0.0) DEPENDENCIES: - "anoncreds (from `../node_modules/@hyperledger/anoncreds-react-native`)" - - "aries-askar (from `../node_modules/@hyperledger/aries-askar-react-native`)" - - BcscCore (from `../node_modules/react-native-bcsc-core`) + - "askar (from `../node_modules/@openwallet-foundation/askar-react-native`)" - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - BVLinearGradient (from `../node_modules/react-native-linear-gradient`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - EXConstants (from `../node_modules/expo-constants/ios`) + - Expo (from `../node_modules/expo`) + - "ExpoAppIntegrity (from `../node_modules/@expo/app-integrity/ios`)" + - ExpoAsset (from `../node_modules/expo-asset/ios`) + - ExpoCrypto (from `../node_modules/expo-crypto/ios`) + - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) + - ExpoFont (from `../node_modules/expo-font/ios`) + - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) + - ExpoModulesCore (from `../node_modules/expo-modules-core`) + - "ExpoSecureEnvironment (from `../node_modules/@animo-id/expo-secure-environment/ios`)" + - ExpoSecureStore (from `../node_modules/expo-secure-store/ios`) + - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - Firebase - FirebaseCore - FirebaseCoreInternal + - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - GoogleUtilities - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - "indy-vdr (from `../node_modules/@hyperledger/indy-vdr-react-native`)" - - libevent (~> 2.1.12) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) + - RCTRequired (from `../node_modules/react-native/Libraries/Required`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - React (from `../node_modules/react-native/`) - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - - React-Codegen (from `build/generated/ios`) - React-Core (from `../node_modules/react-native/`) - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) - React-FabricImage (from `../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsinspectorcdp (from `../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) + - React-jsinspectornetwork (from `../node_modules/react-native/ReactCommon/jsinspector-modern/network`) + - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) + - React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`) + - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) + - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - "react-native-attestation (from `../node_modules/@bifold/react-native-attestation`)" - react-native-config (from `../node_modules/react-native-config`) - - react-native-date-picker (from `../node_modules/react-native-date-picker`) - react-native-document-picker (from `../node_modules/react-native-document-picker`) - react-native-encrypted-storage (from `../node_modules/react-native-encrypted-storage`) - react-native-get-random-values (from `../node_modules/react-native-get-random-values`) + - react-native-keyboard-controller (from `../node_modules/react-native-keyboard-controller`) - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" - react-native-orientation-locker (from `../node_modules/react-native-orientation-locker`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) @@ -1369,25 +3380,35 @@ DEPENDENCIES: - react-native-webrtc (from `../node_modules/react-native-webrtc`) - react-native-webview (from `../node_modules/react-native-webview`) - react-native-zeroconf (from `../node_modules/react-native-zeroconf`) - - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) - React-RCTFabric (from `../node_modules/react-native/React`) + - React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`) - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTRuntime (from `../node_modules/react-native/React/Runtime`) - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-rncore (from `../node_modules/react-native/ReactCommon`) + - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - ReactAppDependencyProvider (from `build/generated/ios`) + - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - ReactNativeIncallManager (from `../node_modules/react-native-incall-manager`) - RNArgon2 (from `../node_modules/react-native-argon2`) @@ -1402,9 +3423,11 @@ DEPENDENCIES: - RNKeychain (from `../node_modules/react-native-keychain`) - RNLocalize (from `../node_modules/react-native-localize`) - RNPermissions (from `../node_modules/react-native-permissions`) + - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) - RNSVG (from `../node_modules/react-native-svg`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - SocketRocket (~> 0.7.1) - VisionCamera (from `../node_modules/react-native-vision-camera`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -1415,16 +3438,14 @@ SPEC REPOS: - Firebase - FirebaseAnalytics - FirebaseCore - - FirebaseCoreDiagnostics + - FirebaseCoreExtension - FirebaseCoreInternal - FirebaseInstallations - FirebaseMessaging - - fmt - GoogleAppMeasurement - GoogleDataTransport - GoogleUtilities - JitsiWebRTC - - libevent - Mute - nanopb - PromisesObjC @@ -1434,39 +3455,61 @@ SPEC REPOS: EXTERNAL SOURCES: anoncreds: :path: "../node_modules/@hyperledger/anoncreds-react-native" - aries-askar: - :path: "../node_modules/@hyperledger/aries-askar-react-native" - BcscCore: - :path: "../node_modules/react-native-bcsc-core" + askar: + :path: "../node_modules/@openwallet-foundation/askar-react-native" boost: :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" BVLinearGradient: :path: "../node_modules/react-native-linear-gradient" DoubleConversion: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + EXConstants: + :path: "../node_modules/expo-constants/ios" + Expo: + :path: "../node_modules/expo" + ExpoAppIntegrity: + :path: "../node_modules/@expo/app-integrity/ios" + ExpoAsset: + :path: "../node_modules/expo-asset/ios" + ExpoCrypto: + :path: "../node_modules/expo-crypto/ios" + ExpoFileSystem: + :path: "../node_modules/expo-file-system/ios" + ExpoFont: + :path: "../node_modules/expo-font/ios" + ExpoKeepAwake: + :path: "../node_modules/expo-keep-awake/ios" + ExpoModulesCore: + :path: "../node_modules/expo-modules-core" + ExpoSecureEnvironment: + :path: "../node_modules/@animo-id/expo-secure-environment/ios" + ExpoSecureStore: + :path: "../node_modules/expo-secure-store/ios" + fast_float: + :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" - FBReactNativeSpec: - :path: "../node_modules/react-native/React/FBReactNativeSpec" + fmt: + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-2024-04-29-RNv0.73.8-644c8be78af1eae7c138fa4093fb87f0f4f8db85 + :tag: hermes-2025-07-07-RNv0.81.0-e0fc67142ec0763c6b6153ca2bf96df815539782 indy-vdr: :path: "../node_modules/@hyperledger/indy-vdr-react-native" RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: - :path: "../node_modules/react-native/Libraries/RCTRequired" + :path: "../node_modules/react-native/Libraries/Required" RCTTypeSafety: :path: "../node_modules/react-native/Libraries/TypeSafety" React: :path: "../node_modules/react-native/" React-callinvoker: :path: "../node_modules/react-native/ReactCommon/callinvoker" - React-Codegen: - :path: build/generated/ios React-Core: :path: "../node_modules/react-native/" React-CoreModules: @@ -1475,14 +3518,26 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/cxxreact" React-debug: :path: "../node_modules/react-native/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" React-Fabric: :path: "../node_modules/react-native/ReactCommon" + React-FabricComponents: + :path: "../node_modules/react-native/ReactCommon" React-FabricImage: :path: "../node_modules/react-native/ReactCommon" + React-featureflags: + :path: "../node_modules/react-native/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" React-graphics: :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" React-hermes: :path: "../node_modules/react-native/ReactCommon/hermes" + React-idlecallbacksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" React-ImageManager: :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" React-jserrorhandler: @@ -1493,22 +3548,34 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsinspectorcdp: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + React-jsinspectornetwork: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" + React-jsinspectortracing: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + React-jsitooling: + :path: "../node_modules/react-native/ReactCommon/jsitooling" + React-jsitracing: + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: :path: "../node_modules/react-native/ReactCommon/logger" React-Mapbuffer: :path: "../node_modules/react-native/ReactCommon" + React-microtasksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" react-native-attestation: :path: "../node_modules/@bifold/react-native-attestation" react-native-config: :path: "../node_modules/react-native-config" - react-native-date-picker: - :path: "../node_modules/react-native-date-picker" react-native-document-picker: :path: "../node_modules/react-native-document-picker" react-native-encrypted-storage: :path: "../node_modules/react-native-encrypted-storage" react-native-get-random-values: :path: "../node_modules/react-native-get-random-values" + react-native-keyboard-controller: + :path: "../node_modules/react-native-keyboard-controller" react-native-netinfo: :path: "../node_modules/@react-native-community/netinfo" react-native-orientation-locker: @@ -1531,12 +3598,14 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-webview" react-native-zeroconf: :path: "../node_modules/react-native-zeroconf" - React-nativeconfig: - :path: "../node_modules/react-native/ReactCommon" React-NativeModulesApple: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-oscompat: + :path: "../node_modules/react-native/ReactCommon/oscompat" React-perflogger: :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-performancetimeline: + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: @@ -1547,28 +3616,46 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Blob" React-RCTFabric: :path: "../node_modules/react-native/React" + React-RCTFBReactNativeSpec: + :path: "../node_modules/react-native/React" React-RCTImage: :path: "../node_modules/react-native/Libraries/Image" React-RCTLinking: :path: "../node_modules/react-native/Libraries/LinkingIOS" React-RCTNetwork: :path: "../node_modules/react-native/Libraries/Network" + React-RCTRuntime: + :path: "../node_modules/react-native/React/Runtime" React-RCTSettings: :path: "../node_modules/react-native/Libraries/Settings" React-RCTText: :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: :path: "../node_modules/react-native/Libraries/Vibration" + React-rendererconsistency: + :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-renderercss: + :path: "../node_modules/react-native/ReactCommon/react/renderer/css" React-rendererdebug: :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" - React-rncore: - :path: "../node_modules/react-native/ReactCommon" + React-RuntimeApple: + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimescheduler: :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-timing: + :path: "../node_modules/react-native/ReactCommon/react/timing" React-utils: :path: "../node_modules/react-native/ReactCommon/react/utils" + ReactAppDependencyProvider: + :path: build/generated/ios + ReactCodegen: + :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" ReactNativeIncallManager: @@ -1597,6 +3684,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-localize" RNPermissions: :path: "../node_modules/react-native-permissions" + RNReanimated: + :path: "../node_modules/react-native-reanimated" RNScreens: :path: "../node_modules/react-native-screens" RNSVG: @@ -1609,114 +3698,146 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - anoncreds: 4b29b0ef841fc1a96910aab8f047c090ee6acb89 - aries-askar: 6fce8d0405b8c84e654a694be1954649cf7955a3 - BcscCore: 3b8d5910cba73e271ec5c6654377f1ff6eabc231 - boost: d3f49c53809116a5d38da093a8aa78bf551aed09 + anoncreds: d48fc0f3bde44f97aef5bb907f6821bf9191d758 + askar: d15c0dd9a376a8e3245030f0baf7ddca0058f76d + boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 BVLinearGradient: cb006ba232a1f3e4f341bb62c42d1098c284da70 CatCrypto: a477899b6be4954e75be4897e732da098cc0a5a8 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953 - FBLazyVector: b46891061bfe0a9b07f601813114c8653a72a45c - FBReactNativeSpec: 9a01850c21d81027fa7b20b9dcc25d9bfae083da - Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d - FirebaseAnalytics: 7761cbadb00a717d8d0939363eb46041526474fa - FirebaseCore: 5743c5785c074a794d35f2fff7ecc254a91e08b1 - FirebaseCoreDiagnostics: 92e07a649aeb66352b319d43bdd2ee3942af84cb - FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934 - FirebaseInstallations: 40bd9054049b2eae9a2c38ef1c3dd213df3605cd - FirebaseMessaging: 5e5118a2383b3531e730d974680954c679ca0a13 - fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 - GoogleAppMeasurement: 4c19f031220c72464d460c9daa1fb5d1acce958e - GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a - GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 - hermes-engine: d992945b77c506e5164e6a9a77510c9d57472c59 - indy-vdr: aada31078a9ed270dd618fadb4cf69bcdc333d68 + DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb + EXConstants: fce59a631a06c4151602843667f7cfe35f81e271 + Expo: 4479cae646b5d3ce16f45ce0e920fadbc0e7396e + ExpoAppIntegrity: 4e47b5f12af29dcf917bca2c12bd1d8b9e968460 + ExpoAsset: 9e5a7c9c0a9fb83ad5b2bb365141f2bd7f289b66 + ExpoCrypto: e2a2c4c748aac8485e5675f027b7901f511d43ff + ExpoFileSystem: a8e7fb1e958471764fb48d281cf9fa81a9e4d77c + ExpoFont: dfb7c572372b610da45b41e3b436321fd6a97215 + ExpoKeepAwake: 55f75eca6499bb9e4231ebad6f3e9cb8f99c0296 + ExpoModulesCore: 20899b4dd703e10a543ff4c50ee1543e47d90082 + ExpoSecureEnvironment: bdba36c15073279baf3b8787f2e1eb42146a0761 + ExpoSecureStore: d32f751874a2ceb5aaeebeb3578e165c1ba2b24a + fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 + FBLazyVector: 5beb8028d5a2e75dd9634917f23e23d3a061d2aa + Firebase: 6a8f201c61eda24e98f1ce2b44b1b9c2caf525cc + FirebaseAnalytics: acfa848bf81e1a4dbf60ef1f0eddd7328fe6673e + FirebaseCore: 2321536f9c423b1f857e047a82b8a42abc6d9e2c + FirebaseCoreExtension: 3a64994969dd05f4bcb7e6896c654eded238e75b + FirebaseCoreInternal: 31ee350d87b30a9349e907f84bf49ef8e6791e5a + FirebaseInstallations: 781e0e37aa0e1c92b44d00e739aba79ad31b2dba + FirebaseMessaging: c7be9357fd8ba33bc45b9a6c3cdff0b466e1e2a4 + fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd + glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 + GoogleAppMeasurement: 8a82b93a6400c8e6551c0bcd66a9177f2e067aed + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleUtilities: 766ace00c6b10d8148408f329d10c4f051931850 + hermes-engine: 9f4dfe93326146a1c99eb535b1cb0b857a3cd172 + indy-vdr: 3606e7be9ed3b5fc67a80b198982015adfdadc7f JitsiWebRTC: b47805ab5668be38e7ee60e2258f49badfe8e1d0 - libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 Mute: 20135a96076f140cc82bfc8b810e2d6150d8ec7e - nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - RCT-Folly: cd21f1661364f975ae76b3308167ad66b09f53f5 - RCTRequired: 415e56f7c33799a6483e41e4dce607f3daf1e69b - RCTTypeSafety: e984a88e713281c2d8c2309a1a6d2775af0107ae - React: ab885684e73c5f659bad63446a977312fd3d1ecb - React-callinvoker: 50a2d1ce3594637c700401ba306373321231eb71 - React-Codegen: 0ca856c100b98ab436c73601f9b1296a58d26b92 - React-Core: d5166294382484f57e25dfde05ba00596703d51c - React-CoreModules: 459534f8112ee73e94f04f5e58276b3d236efd16 - React-cxxreact: d5716540fd97df323792ef1d227f50515fb3e1a8 - React-debug: cbc88cbcffdca42184a32d073ceb7d9b11122b8d - React-Fabric: 0008b953afdacf3dd5ac38947a36d9c280e3a0a1 - React-FabricImage: 51198a14587c3269e12cf823e81a6f3b642dd136 - React-graphics: 977137c75673c2f31a1515ce48db31a076771112 - React-hermes: 59ff965e45955d66977a23d51fe9235b44a09bd4 - React-ImageManager: 5c8d5e6246c22613a0cb198c51044f4794e8c518 - React-jserrorhandler: 90c29c95fb32abfdb61ab9c8eb425e6af097a0b9 - React-jsi: 36f85df7d83197707e9fd9320d857eac616e6df3 - React-jsiexecutor: a68ea442fd94c7ecf5d9355bde2443f0241531d9 - React-jsinspector: a98428936fb888cc15d857226a26d9ac0a668a0e - React-logger: 6e4873d1f9c54cca30f6c91a6617f8c91b75ba4c - React-Mapbuffer: 57bf49a458398d329dad2bf8bc660e3e35b96989 - react-native-attestation: c7e459cb6585f3757addf8d1d4d8d30bf7d32081 + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273 + RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 + RCTDeprecation: 5eb1d2eeff5fb91151e8a8eef45b6c7658b6c897 + RCTRequired: cebcf9442fc296c9b89ac791dfd463021d9f6f23 + RCTTypeSafety: b99aa872829ee18f6e777e0ef55852521c5a6788 + React: 914f8695f9bf38e6418228c2ffb70021e559f92f + React-callinvoker: 23cd4e33928608bd0cc35357597568b8b9a5f068 + React-Core: 6a0a97598e9455348113bfe4c573fe8edac34469 + React-CoreModules: a88a6ca48b668401b9780e272e2a607e70f9f955 + React-cxxreact: 06265fd7e8d5c3b6b49e00d328ef76e5f1ae9c8b + React-debug: 039d3dbd3078613e02e3960439bbf52f6d321bc4 + React-defaultsnativemodule: 09efbfa17b15445907689c577e371558d8b08135 + React-domnativemodule: 6284a09207d8e0e974affb0d84b43a0c1aee2554 + React-Fabric: 5ffa7f2a10fb3bf835f97990d341419ae338963d + React-FabricComponents: 25173bc205a6b7c18d87121891f3acef1c329b04 + React-FabricImage: aa90e4b2b34a79f9b4ee56328ad9222cb672f1f3 + React-featureflags: 7bdaca8af1def3ec9203743c91b11ac7c2cb2574 + React-featureflagsnativemodule: 6840bc359820d5e44f1de1f9ba69706e0a88a60b + React-graphics: b0a76138e325f9c5dfcc8fbc62491ab252ca736c + React-hermes: a852be3ab9e1f515e46ba3ea9f48c31d4a9df437 + React-idlecallbacksnativemodule: 38895fd946b2dcb0af387f2176f5f2e578b14277 + React-ImageManager: 44409a10adff7091c9e678b97ee59c7b0576b8ae + React-jserrorhandler: 3852205bbfc68277cd4e7392ad1fa74a170150fd + React-jsi: 7b53959aea60909ac6bbe4dd0bdec6c10d7dc597 + React-jsiexecutor: 19938072af05ade148474bac41e0324a2d733f44 + React-jsinspector: 0aecd79939adf576c6dd7bbbddf90b630e7827e4 + React-jsinspectorcdp: 8245973529c78d150aebddd2c497ee290349faf0 + React-jsinspectornetwork: 496a12dbc80835fac10acf29b9c4386ddcc472f1 + React-jsinspectortracing: 1939b3e0cec087983384c5561bf925f35287d760 + React-jsitooling: 86c70336d5c371b4289499e9303b6da118ad3eeb + React-jsitracing: 8eb0d50d7874886fb3ec7f85e0567f1964a20075 + React-logger: a913317214a26565cd4c045347edf1bcacb80a3f + React-Mapbuffer: 94f4264de2cb156960cd82b338a403f4653f2fd9 + React-microtasksnativemodule: 6c4ee39a36958c39c97b074d28f360246a335e84 + react-native-attestation: 59a8566766131a61587d9ceb7602040e31fdab7f react-native-config: 644074ab88db883fcfaa584f03520ec29589d7df - react-native-date-picker: 2eca217a8fb09c517f5bb6b23978718c6cec59ec - react-native-document-picker: 4425fea5360a9e3ec5f268681194bf88ae67ec65 + react-native-document-picker: dcf5e57f3bcae61bf8384a1c6f90896f81e17941 react-native-encrypted-storage: 569d114e329b1c2c2d9f8c84bcdbe4478dda2258 react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba - react-native-netinfo: 28c2462c85067fe653615f6f595673bdca93a287 + react-native-keyboard-controller: 7e305e26078360602b5d523ff84250b5a054a6ff + react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187 react-native-orientation-locker: ee8bb2177365ca74f51dc1e11218fe544634d523 - react-native-safe-area-context: bf9d9d58f0f6726d4a6257088044c2595017579d - react-native-screenguard: 38cf6d55781c6225f33be32afeb13cb2a0e154ee + react-native-safe-area-context: c00143b4823773bba23f2f19f85663ae89ceb460 + react-native-screenguard: 4cdef4ef526bba6728917e4d188b1e8083081953 react-native-splash-screen: 95994222cc95c236bd3cdc59fe45ed5f27969594 react-native-tcp-socket: ae8abcfebc071216302a09d9ed1e375d4e877484 - react-native-video: d74d94fbaeee3c0d8f6570173289f43fe210066f + react-native-video: a509f299d71020addc12bff98bc094c142d3f09c react-native-volume-manager: d9d2863a2374420af89c89662333ea6adf506988 react-native-webrtc: 96fdff9e3a942ed88cafe01898da1c93fd628957 - react-native-webview: f802f655c8446404bb0c134da9335a8cf667e8cb + react-native-webview: 4cbb7f05f2c50671a7dcff4012d3e85faad271e4 react-native-zeroconf: eb2e5584308f20f5fc3eb0cea2ceafbbd345b48b - React-nativeconfig: 8fd29a35a3e4e8c37682d976667663d834ba6165 - React-NativeModulesApple: 83d7077877f8eda8e1b6055b3f8f16f7db8463b5 - React-perflogger: 3887a05940ccd34a83457fd153fdeda509b31737 - React-RCTActionSheet: 2f42b4797374b53e93b65c79eaa8a0d292e255ac - React-RCTAnimation: 5639dcd418b798b28e9caacaed18ff5472454837 - React-RCTAppDelegate: 37d3142bfa7cb9f2f8cd41feedc6b50c95986029 - React-RCTBlob: e9f735bb085c6da208dd138bd4bfd294a52e3a86 - React-RCTFabric: 8c1abd00ccb3aff18f67b39f0a37034a30f402f3 - React-RCTImage: cc82df2b50bbdc1a0a0b19bf6fc16dd321eb8f0f - React-RCTLinking: 3d7900f52ecf03bb2522d7b94d8d16cce776294a - React-RCTNetwork: ac25c15ee52eb4aadb510afe68db0d1f949c45fa - React-RCTSettings: 013301fe7304ff06acca5287f6f754c9fa2b63b7 - React-RCTText: ba6997c26241ea0b36ec8f98502a4ed45cab18e4 - React-RCTVibration: b5ba13ed0909d2f2614ed99b067543e6ea0d7c37 - React-rendererdebug: dda7606832e5907ecbdf2093950068a36fd5a267 - React-rncore: 0dd62c0c8f8215747a9b49035410fde76a18876e - React-runtimeexecutor: 2fd27b921f664e66d903ee274dcda55cc0b2cb2e - React-runtimescheduler: 398069b748d97567cc7585cc9a97284ad19d72fa - React-utils: e8549669b504c18929b2e9aa4d87657e530a91a4 - ReactCommon: 9c38e8797dc2ac72edf63cd18cf450d918575666 + React-NativeModulesApple: ebf2ce72b35870036900d6498b33724386540a71 + React-oscompat: eb0626e8ba1a2c61673c991bf9dc21834898475d + React-perflogger: 509e1f9a3ee28df71b0a66de806ac515ce951246 + React-performancetimeline: 43a1ea36ac47853b479ae85e04c1c339721e99f1 + React-RCTActionSheet: 30fe8f9f8d86db4a25ff34595a658ecd837485fc + React-RCTAnimation: 3126eb1cb8e7a6ca33a52fd833d8018aa9311af1 + React-RCTAppDelegate: b03981c790aa40cf26e0f78cc0f1f2df8287ead4 + React-RCTBlob: 53c35e85c85d6bdaa55dc81a0b290d4e78431095 + React-RCTFabric: 4e2a4176f99b6b8f2d2eda9fc82453a3e6c3ef8e + React-RCTFBReactNativeSpec: 947126c649e04b95457a40bc97c4b2a76206534b + React-RCTImage: 074b2faa71a152a456c974e118b60c9eeda94a64 + React-RCTLinking: e5ca17a4f7ae2ad7b0c0483be77e1b383ecd0a8a + React-RCTNetwork: c508d7548c9eceac30a8100a846ea00033a03366 + React-RCTRuntime: 6813778046c775c124179d9e4d7b33d4129bbd84 + React-RCTSettings: dd84c857a4fce42c1e08c1dabcda894e25af4a6e + React-RCTText: 6e4b177d047f98bccb90d6fb1ebdd3391cf8b299 + React-RCTVibration: 9572d4a06a0c92650bcc62913e50eb2a89f19fb6 + React-rendererconsistency: 6f0622076d7b26eda57a582db5ffd8b05fe94652 + React-renderercss: c00b6db35f01e2f17e496d1d0793fc0be89d4f7b + React-rendererdebug: 17f707ba5ba1ed7a10dd997a2e27b2431b24a180 + React-RuntimeApple: b9b9a53afd594eb49c3e6891f84327d1834a2c5e + React-RuntimeCore: 5a0c78665206a44c4a030e2b4af0c8d6ad05ae77 + React-runtimeexecutor: 7f56789cd23bd4ea1f95595eb5c27e08cee3a19e + React-RuntimeHermes: b2d6bc03f4cc9d2eb7ee0a1bfe16c226cb2114ce + React-runtimescheduler: 5cc5c0568bf216e1ee8f3c2c0a1cff2ef3091b32 + React-timing: b1e27e61bd184fab3792947685bebdb2dc55af9a + React-utils: ddf52534853a3b5f19d4615b1a1f172b504673f2 + ReactAppDependencyProvider: 1bcd3527ac0390a1c898c114f81ff954be35ed79 + ReactCodegen: 6c26f8c25d0b5ae66f86a1cce1777076ac8bcbd8 + ReactCommon: 5f0e5c09a64a2717215dd84380e1a747810406f2 ReactNativeIncallManager: dccd3e7499caa3bb73d3acfedf4fb0360f1a87d5 RNArgon2: 708e188b7a4d4ec8baf62463927c47abef453a94 - RNCAsyncStorage: 9350c2956f996b3ff1ac7cfdb50901c113a27640 - RNCClipboard: f6679d470d0da2bce2a37b0af7b9e0bf369ecda5 + RNCAsyncStorage: 29f0230e1a25f36c20b05f65e2eb8958d6526e82 + RNCClipboard: 4b58c780f63676367640f23c8e114e9bd0cf86ac RNDeviceInfo: d3e91ffb33ee97a7982108476edb68cb3672efa6 - RNFBApp: 827b4dfadf8c039738c1c928474e45b3ec306ba0 - RNFBMessaging: 6465e1ccc5421e9493a5ed8d7d69e4daf8a2de6d + RNFBApp: 4105e54d9ca4a1c10893a032268470f670181110 + RNFBMessaging: 6857871d9dff8f26b0c325fc7d97ba69cb77d213 RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 - RNGestureHandler: 03a2c31aea5d46f51080f1c1b6659b76a9ac78c9 + RNGestureHandler: 3a73f098d74712952870e948b3d9cf7b6cae9961 RNInAppBrowser: 6d3eb68d471b9834335c664704719b8be1bfdb20 - RNKeychain: c497f7844b24577523bb84a6e8af9d217957972f + RNKeychain: a2c134ab796272c3d605e035ab727591000b30f3 RNLocalize: 8bf466de4c92d4721b254aabe1ff0a1456e7b9f4 - RNPermissions: 6dbd8de5d88b730d746057d5cd868a93888ce994 - RNScreens: e0f79783ce405f4362c29d098b19fe7e241f11a9 - RNSVG: a9e095acf2e207f2ef491870523ed455636cf3b8 - RNVectorIcons: 102cd20472bf0d7cd15443d43cd87f9c97228ac3 - SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a - SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 - VisionCamera: 6ad4b86176f6fea45e90e380d3d530bc5e1abff9 - Yoga: 1f93d5925ea12fb0880b21efe3566677337cf2ed + RNPermissions: b07b9c6c05a5842a1d5d1e7025d95d9903b2ab51 + RNReanimated: 9af1b9f7d221d1cc2f99d935bab08419cae7c1ce + RNScreens: 0bbf16c074ae6bb1058a7bf2d1ae017f4306797c + RNSVG: 6f39605a4c4d200b11435c35bd077553c6b5963a + RNVectorIcons: 791f13226ec4a3fd13062eda9e892159f0981fae + SDWebImage: e9fc87c1aab89a8ab1bbd74eba378c6f53be8abf + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + VisionCamera: b51af005669c6642dd1b4fca434eda4c1778de87 + Yoga: d7064c22f7ba5890471d32dd95e72c77ec911f26 -PODFILE CHECKSUM: 4a08b54523014fd5431e03183542e6526d90cba5 +PODFILE CHECKSUM: 5dcb1c4cfd3f07b2f4465bf766c61d4f6f6088b1 COCOAPODS: 1.14.3 diff --git a/app/ios/PrivacyInfo.xcprivacy b/app/ios/PrivacyInfo.xcprivacy index db45b7c..a403e5f 100644 --- a/app/ios/PrivacyInfo.xcprivacy +++ b/app/ios/PrivacyInfo.xcprivacy @@ -9,9 +9,9 @@ NSPrivacyAccessedAPICategoryUserDefaults NSPrivacyAccessedAPITypeReasons + CA92.1 1C8F.1 C56D.1 - CA92.1 @@ -19,23 +19,26 @@ NSPrivacyAccessedAPICategoryFileTimestamp NSPrivacyAccessedAPITypeReasons + 0A2A.1 + 3B52.1 C617.1 NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPICategoryDiskSpace NSPrivacyAccessedAPITypeReasons - 35F9.1 + E174.1 + 85F4.1 NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPICategorySystemBootTime NSPrivacyAccessedAPITypeReasons - E174.1 + 35F9.1 diff --git a/app/jest.config.js b/app/jest.config.js index e0e33aa..3e682ae 100644 --- a/app/jest.config.js +++ b/app/jest.config.js @@ -16,9 +16,16 @@ module.exports = { '^uuid$': require.resolve('uuid'), '@credo-ts/core': require.resolve('@credo-ts/core'), '@credo-ts/anoncreds': require.resolve('@credo-ts/anoncreds'), - '@bifold/core': require.resolve('@bifold/core'), + '@credo-ts/didcomm': require.resolve('@credo-ts/didcomm'), + // Use bifold sources directly (like bifold's own jest configs) to avoid + // circular-require issues in the lib/commonjs build under jest + '^@bifold/core$': '/../bifold/packages/core/src/index.ts', + '^@bifold/verifier$': '/../bifold/packages/verifier/src/index.ts', + '^@bifold/oca/build/legacy$': '/../bifold/packages/oca/src/legacy/index.ts', + '^@bifold/oca$': '/../bifold/packages/oca/src/index.ts', + '^@bifold/react-hooks$': '/../bifold/packages/react-hooks/src/index.ts', '@bifold/remote-logs': '/__mocks__/@bifold/remote-logs.ts', - '@hyperledger/aries-askar-react-native': require.resolve('@hyperledger/aries-askar-react-native'), + '@openwallet-foundation/askar-react-native': require.resolve('@openwallet-foundation/askar-react-native'), // CRITICAL: Force Jest to use app's React instead of bifold's // Multiple copies of React cause "Invalid hook call" errors '^react$': require.resolve('react'), @@ -27,6 +34,11 @@ module.exports = { // When portal: follows symlink to bifold, it can resolve packages from bifold's node_modules // This ensures tests use app's versions with proper mocks from jestSetup.js '^react-native$': require.resolve('react-native'), + // Also map react-native subpath imports (e.g. react-native/Libraries/...) + // so bifold sources can't drag in bifold/node_modules' second RN copy + '^react-native/(.*)$': `${require('path').dirname(require.resolve('react-native/package.json'))}/$1`, + '^react-native-reanimated$': require.resolve('react-native-reanimated'), + '^react-native-keyboard-controller$': require.resolve('react-native-keyboard-controller'), '^react-native-splash-screen$': require.resolve('react-native-splash-screen'), '^react-native-toast-message$': require.resolve('react-native-toast-message'), '^react-native-device-info$': require.resolve('react-native-device-info'), @@ -53,12 +65,15 @@ module.exports = { '^react-native-screenguard$': require.resolve('react-native-screenguard'), '^react-native-tcp-socket$': require.resolve('react-native-tcp-socket'), '^react-native-vector-icons$': require.resolve('react-native-vector-icons'), + // Expo modules used by bifold core - reuse bifold's jest mocks + 'expo-crypto': '/../bifold/packages/core/__mocks__/@expo/expo-crypto.js', + '@expo/app-integrity': '/../bifold/packages/core/__mocks__/@expo/app-integrity.js', }, transform: { - '^.+\\.(js|jsx|ts|tsx)$': 'babel-jest', + '^.+\\.(js|jsx|ts|tsx|mjs)$': 'babel-jest', }, transformIgnorePatterns: [ - 'node_modules\\/(?!(.*react-native.*)|(uuid)|(@aries-framework\\/core)|(@aries-framework\\/anoncreds)|(@hyperledger\\/aries-bifold-core))', + 'node_modules/(?!(.*react-native.*|@credo-ts|@openwallet-foundation|@openid4vc|@noble|@stablelib|@digitalcredentials|base58-universal|base64url-universal|dcql|valibot|query-string|decode-uri-component|filter-obj|split-on-first|uuid|@bifold|expo(nent)?|@expo(nent)?/.*)/)', ], testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$', testPathIgnorePatterns: ['\\.snap$', '/node_modules/', '/lib', '/__tests__/contexts/'], diff --git a/app/jestSetup.js b/app/jestSetup.js index afb9fde..f1676ca 100644 --- a/app/jestSetup.js +++ b/app/jestSetup.js @@ -14,7 +14,8 @@ mockRNDeviceInfo.getBuildNumber = jest.fn(() => '1') jest.mock('react-native-safe-area-context', () => mockSafeAreaContext) jest.mock('@react-native-community/netinfo', () => mockRNCNetInfo) jest.mock('react-native-device-info', () => mockRNDeviceInfo) -jest.mock('react-native/Libraries/Animated/NativeAnimatedHelper') +// moved in RN 0.76: Libraries/Animated/NativeAnimatedHelper → src/private/animated/ +jest.mock('react-native/src/private/animated/NativeAnimatedHelper') jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter') jest.mock('react-native-localize', () => mockRNLocalize) jest.mock('react-native-vision-camera', () => { @@ -24,5 +25,56 @@ jest.mock('react-native-permissions', () => require('react-native-permissions/mo jest.mock('react-native-splash-screen', () => ({})) jest.mock('@bifold/react-native-attestation', () => ({})) jest.mock('@hyperledger/anoncreds-react-native', () => ({})) -jest.mock('@hyperledger/aries-askar-react-native', () => ({})) +jest.mock('@openwallet-foundation/askar-react-native', () => ({})) jest.mock('@hyperledger/indy-vdr-react-native', () => ({})) + +// React 18+/19: enable proper act() behavior in tests +globalThis.IS_REACT_ACT_ENVIRONMENT = true + +jest.mock('react-native-reanimated', () => require('react-native-reanimated/mock')) + +// Mirror bifold's jestSetup: keep RefreshOrchestrator from spinning timers/logs +jest.mock('../bifold/packages/core/src/modules/openid/refresh/refreshOrchestrator', () => ({ + RefreshOrchestrator: jest.fn().mockImplementation(() => ({ + configure: jest.fn(), + start: jest.fn(), + stop: jest.fn(), + runOnce: jest.fn(), + })), +})) + +jest.mock('react-native-keyboard-controller', () => { + const { ScrollView, View } = jest.requireActual('react-native') + return { + KeyboardProvider: ({ children }) => children, + KeyboardAwareScrollView: ScrollView, + KeyboardAvoidingView: View, + } +}) + +// Mock Keyboard to fix KeyboardAvoidingView cleanup issues in tests +// React Native 0.81+ exports Keyboard as .default +const mockKeyboard = { + addListener: jest.fn(() => ({ remove: jest.fn() })), + removeListener: jest.fn(), + dismiss: jest.fn(), + scheduleLayoutAnimation: jest.fn(), + isVisible: jest.fn(() => false), + metrics: jest.fn(() => null), +} +jest.mock('react-native/Libraries/Components/Keyboard/Keyboard', () => ({ + default: mockKeyboard, + ...mockKeyboard, +})) + +// Mock BackHandler to return subscription with remove() method +// This covers the new subscription-based API used in React Native 0.81+ +const mockBackHandler = { + addEventListener: jest.fn(() => ({ remove: jest.fn() })), + removeEventListener: jest.fn(), + exitApp: jest.fn(), +} +jest.mock('react-native/Libraries/Utilities/BackHandler', () => ({ + default: mockBackHandler, + ...mockBackHandler, +})) diff --git a/app/metro.config.js b/app/metro.config.js index 1812ac7..21f8c02 100644 --- a/app/metro.config.js +++ b/app/metro.config.js @@ -2,7 +2,9 @@ const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config') const fs = require('fs') const path = require('path') const escape = require('escape-string-regexp') -const exclusionList = require('metro-config/src/defaults/exclusionList') +// metro 0.83+ moved internal files under exports "./private/*" +const exclusionListModule = require('metro-config/private/defaults/exclusionList') +const exclusionList = exclusionListModule.default ?? exclusionListModule require('dotenv').config() const packageDirs = [ @@ -12,7 +14,7 @@ const packageDirs = [ fs.realpathSync(path.join(__dirname, 'node_modules', '@bifold/verifier')), fs.realpathSync(path.join(__dirname, 'node_modules', '@bifold/react-native-attestation')), fs.realpathSync(path.join(__dirname, 'node_modules', '@bifold/vrc-contexts')), - fs.realpathSync(path.join(__dirname, 'node_modules', 'react-native-bcsc-core')), + fs.realpathSync(path.join(__dirname, 'node_modules', '@bifold/react-hooks')), ] // In development, resolve these to source for hot reload; CI/production uses built output. @@ -21,6 +23,7 @@ const BIFOLD_SOURCE_PACKAGES = [ '@bifold/verifier', '@bifold/vrc-contexts', '@bifold/react-native-attestation', + '@bifold/react-hooks', ] const bifoldSourceDirByPackage = {} for (const dir of packageDirs) { @@ -34,20 +37,29 @@ for (const dir of packageDirs) { } } -const watchFolders = [...packageDirs] +// bifold workspace deps hoist to bifold/node_modules; metro must watch it to +// resolve them from bifold's built lib output (production bundles) +const bifoldNodeModules = fs.realpathSync(path.join(__dirname, '..', 'bifold', 'node_modules')) + +const watchFolders = [...packageDirs, bifoldNodeModules] const extraExclusionlist = [] const extraNodeModules = {} // Module aliases for React Native compatibility const polyfillModules = { - // js-sha256 is used by patched packages (rdf-canonize, jsonld-signatures) + // js-sha256 is used by the patched rdf-canonize (RDFC SHA-256 on RN). + // (jsonld-signatures no longer needs a patch: v12 ships its own RN shim + // built on expo-crypto — see docs/CRYPTO_SUITE_FOLLOWUP.md.) 'js-sha256': path.join(__dirname, 'node_modules', 'js-sha256', 'src', 'sha256.js'), // Stream and buffer polyfills stream: path.join(__dirname, 'node_modules', 'stream-browserify'), buffer: path.join(__dirname, 'node_modules', 'buffer'), // Force rdf-canonize to use our patched version from app's node_modules 'rdf-canonize': path.join(__dirname, 'node_modules', 'rdf-canonize'), + // bifold workspace cross-deps hoist to bifold/node_modules, which metro + // doesn't watch; resolve them through the app's portals instead + '@bifold/react-hooks': path.join(__dirname, 'node_modules', '@bifold/react-hooks'), } for (const packageDir of packageDirs) { @@ -103,10 +115,37 @@ module.exports = (async () => { }, assetExts: assetExts.filter((ext) => ext !== 'svg'), sourceExts: [...sourceExts, 'svg', 'cjs'], + // Prefer browser builds (e.g. nanoid) over node builds that require('crypto'). + // Same setup as bifold samples/app. + unstable_enablePackageExports: true, + unstable_conditionNames: ['react-native', 'browser', 'require'], + nodeModulesPaths: [path.join(__dirname, 'node_modules'), bifoldNodeModules], // Force specific module imports to use our polyfilled/patched versions resolveRequest: (context, moduleName, platform) => { + // Singleton packages: always resolve from the app's node_modules so + // bifold sources never load a second copy (bifold/node_modules is on + // nodeModulesPaths, which would otherwise win for react etc.) + const singletonPrefixes = [ + 'react', + 'react-native', + 'react-dom', + '@credo-ts/core', + '@credo-ts/didcomm', + '@credo-ts/anoncreds', + ] + const isSingleton = singletonPrefixes.some((pkg) => moduleName === pkg || moduleName.startsWith(`${pkg}/`)) + if (isSingleton && !context.originModulePath.startsWith(__dirname)) { + // Re-resolve as if requested from the app root (keeps package + // "exports" handling intact, unlike remapping to an absolute path) + return context.resolveRequest( + { ...context, originModulePath: path.join(__dirname, 'index.js') }, + moduleName, + platform + ) + } // Ensure js-sha256 is resolved from app's node_modules - // This is needed by patched @digitalcredentials/jsonld-signatures and rdf-canonize + // This is needed by the patched rdf-canonize (jsonld-signatures v12 + // no longer needs it — its RN SHA-256 shim uses expo-crypto) if (moduleName === 'js-sha256') { return context.resolveRequest(context, path.join(__dirname, 'node_modules', 'js-sha256'), platform) } diff --git a/app/package.json b/app/package.json index df8104c..f4f455d 100644 --- a/app/package.json +++ b/app/package.json @@ -35,58 +35,58 @@ "prettier:fix": "prettier --loglevel=warn --write '**/*.+(js|jsx|json|ts|tsx|md|yml|yaml)'", "pre-commit-lint": "yarn lint-staged", "typecheck": "tsc --noEmit", - "storybook": "start-storybook -p 7007", - "build-storybook": "build-storybook", "ios:setup": "bundle install && cd ios && bundle exec pod install", "android:setup": "cd android && ./gradlew app:dependencies --write-locks", "setup": "yarn ios:setup && yarn android:setup" }, "dependencies": { - "@bifold/core": "2.7.4", - "@bifold/oca": "2.7.4", - "@bifold/react-native-attestation": "2.7.4", - "@bifold/remote-logs": "2.7.4", - "@bifold/verifier": "2.7.4", - "@bifold/vrc-contexts": "0.0.1", + "@animo-id/expo-secure-environment": "0.1.5", + "@bifold/core": "3.0.16", + "@bifold/oca": "3.0.16", + "@bifold/react-hooks": "3.0.16", + "@bifold/react-native-attestation": "3.0.16", + "@bifold/remote-logs": "3.0.16", + "@bifold/verifier": "3.0.16", + "@bifold/vrc-contexts": "0.1.0-alpha.1", "@craftzdog/react-native-buffer": "^6.1.1", - "@credo-ts/anoncreds": "0.5.17", - "@credo-ts/askar": "0.5.17", - "@credo-ts/core": "0.5.17", - "@credo-ts/drpc": "0.5.17", - "@credo-ts/indy-sdk-to-askar-migration": "0.5.17", - "@credo-ts/indy-vdr": "0.5.17", - "@credo-ts/openid4vc": "0.5.17", - "@credo-ts/push-notifications": "0.7.0", - "@credo-ts/question-answer": "0.5.17", - "@credo-ts/react-hooks": "0.6.1", - "@credo-ts/react-native": "0.5.17", - "@credo-ts/webvh": "0.5.17", - "@formatjs/intl-datetimeformat": "~4.2.6", - "@formatjs/intl-displaynames": "~5.2.6", - "@formatjs/intl-getcanonicallocales": "~1.7.3", - "@formatjs/intl-listformat": "~6.3.6", - "@formatjs/intl-locale": "~2.4.47", - "@formatjs/intl-numberformat": "~7.2.6", - "@formatjs/intl-pluralrules": "~4.1.6", - "@formatjs/intl-relativetimeformat": "~9.3.3", - "@hyperledger/anoncreds-react-native": "0.2.4", - "@hyperledger/aries-askar-react-native": "0.2.3", - "@hyperledger/indy-vdr-react-native": "0.2.2", - "@hyperledger/indy-vdr-shared": "0.2.2", + "@credo-ts/anoncreds": "0.6.3", + "@credo-ts/askar": "0.6.3", + "@credo-ts/core": "0.6.3", + "@credo-ts/didcomm": "patch:@credo-ts/didcomm@npm%3A0.6.3#~/.yarn/patches/@credo-ts-didcomm-npm-0.6.3-b3cbe5f2a8.patch", + "@credo-ts/indy-vdr": "0.6.3", + "@credo-ts/openid4vc": "0.6.3", + "@credo-ts/question-answer": "0.6.3", + "@credo-ts/react-native": "0.6.3", + "@credo-ts/webvh": "0.6.3", + "@expo/app-integrity": "^55.0.9", + "@formatjs/intl-datetimeformat": "~6.18.2", + "@formatjs/intl-displaynames": "~6.8.13", + "@formatjs/intl-getcanonicallocales": "~2.5.6", + "@formatjs/intl-listformat": "~7.7.13", + "@formatjs/intl-locale": "~4.2.13", + "@formatjs/intl-numberformat": "~8.15.6", + "@formatjs/intl-pluralrules": "~5.4.6", + "@formatjs/intl-relativetimeformat": "~11.4.13", + "@hyperledger/anoncreds-react-native": "0.3.4", + "@hyperledger/indy-vdr-react-native": "0.2.4", + "@hyperledger/indy-vdr-shared": "0.2.4", + "@openwallet-foundation/askar-react-native": "0.6.0", "@pexip/infinity-api": "~19.1.2", - "@react-native-async-storage/async-storage": "~1.22.3", + "@react-native-async-storage/async-storage": "~2.2.0", "@react-native-clipboard/clipboard": "~1.16.3", - "@react-native-community/netinfo": "~11.3.3", - "@react-native-firebase/app": "~14.12.0", - "@react-native-firebase/messaging": "~14.12.0", + "@react-native-community/netinfo": "~11.4.1", + "@react-native-firebase/app": "~21.14.0", + "@react-native-firebase/messaging": "~21.14.0", "@react-navigation/bottom-tabs": "~6.0.9", "@react-navigation/devtools": "~6.0.27", "@react-navigation/native": "~6.0.16", "@react-navigation/stack": "~6.3.29", - "axios": "~1.4.0", + "axios": "~1.13.2", "base-64": "~1.0.0", "buffer": "^6.0.3", - "credo-ts-indy-vdr-proxy-client": "0.2.4", + "expo": "~54.0.31", + "expo-crypto": "~15.0.8", + "expo-secure-store": "~15.0.8", "fast-text-encoding": "~1.0.6", "i18next": "~21.6.16", "js-sha256": "^0.11.1", @@ -96,75 +96,74 @@ "lodash.startcase": "~4.4.0", "moment": "~2.29.4", "query-string": "~7.1.3", - "react": "~18.3.1", + "react": "19.1.0", "react-i18next": "~11.17.1", - "react-native": "0.73.11", + "react-native": "patch:react-native@npm%3A0.81.5#~/.yarn/patches/react-native-npm-0.81.5-d8232ef145.patch", "react-native-animated-pagination-dots": "~0.1.73", "react-native-argon2": "~2.0.1", - "react-native-bcsc-core": "workspace:*", "react-native-bouncy-checkbox": "~3.0.7", "react-native-check-version": "~1.3.0", "react-native-collapsible": "~1.6.2", "react-native-config": "~1.5.5", "react-native-confirmation-code-field": "~7.3.2", - "react-native-date-picker": "~5.0.13", "react-native-device-info": "~8.7.1", - "react-native-document-picker": "^9.3.1", + "react-native-document-picker": "patch:react-native-document-picker@npm%3A9.3.1#~/.yarn/patches/react-native-document-picker-npm-9.3.1-ce22d39a18.patch", "react-native-encrypted-storage": "~4.0.3", "react-native-fs": "~2.20.0", - "react-native-gesture-handler": "~2.18.1", + "react-native-gesture-handler": "~2.28.0", "react-native-get-random-values": "~1.11.0", - "react-native-gifted-chat": "*", + "react-native-gifted-chat": "~3.3.2", "react-native-inappbrowser-reborn": "~3.7.0", "react-native-incall-manager": "~4.2.1", - "react-native-keychain": "~8.1.3", + "react-native-keyboard-controller": "~1.18.5", + "react-native-keychain": "~10.0.0", "react-native-linear-gradient": "^2.8.3", "react-native-localize": "~2.2.6", "react-native-logs": "~5.1.0", "react-native-orientation-locker": "~1.6.0", "react-native-permissions": "~5.4.1", "react-native-qrcode-svg": "~6.2.0", - "react-native-safe-area-context": "~4.8.2", + "react-native-reanimated": "~3.19.5", + "react-native-safe-area-context": "~5.6.2", "react-native-scalable-image": "~1.1.0", "react-native-screenguard": "~1.1.0", - "react-native-screens": "~4.4.0", + "react-native-screens": "~4.16.0", "react-native-splash-screen": "~3.3.0", - "react-native-svg": "~15.0.0", + "react-native-svg": "~15.12.1", "react-native-tcp-socket": "~6.0.6", "react-native-toast-message": "~2.1.10", + "react-native-url-polyfill": "3.0.0", "react-native-uuid": "~2.0.3", - "react-native-vector-icons": "~10.0.3", + "react-native-vector-icons": "~10.3.0", "react-native-video": "~6.16.1", - "react-native-vision-camera": "4.3.2", + "react-native-vision-camera": "4.7.3", "react-native-volume-manager": "~1.10.0", "react-native-webrtc": "~124.0.6", - "react-native-webview": "~13.10.7", + "react-native-webview": "~13.15.0", "react-native-zeroconf": "~0.14.0", "readable-stream": "^4.7.0", "reflect-metadata": "~0.1.14", "rxjs": "~7.8.2", "stream-browserify": "^3.0.0", "tsyringe": "~4.8.0", - "uuid": "~9.0.1" + "uuid": "~9.0.1", + "zustand": "~4.5.4" }, "devDependencies": { - "@babel/core": "~7.22.20", - "@babel/preset-env": "~7.22.20", - "@babel/runtime": "~7.23.9", + "@babel/core": "~7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/preset-env": "~7.28.6", + "@babel/runtime": "~7.28.6", "@commitlint/cli": "~11.0.0", "@eslint/js": "~8.57.1", - "@react-native/babel-preset": "~0.73.21", - "@react-native/eslint-config": "~0.73.2", - "@react-native/eslint-plugin": "~0.73.1", - "@react-native/metro-config": "~0.73.5", - "@react-native/typescript-config": "~0.73.1", - "@storybook/addon-actions": "~5.3.21", - "@storybook/addon-knobs": "~5.3.21", - "@storybook/addon-links": "~5.3.21", - "@storybook/addon-ondevice-actions": "~5.3.23", - "@storybook/addon-ondevice-knobs": "~5.3.26", - "@storybook/react-native": "~5.3.27", - "@storybook/react-native-server": "~5.3.23", + "@react-native-community/cli": "20.0.2", + "@react-native-community/cli-platform-android": "20.0.2", + "@react-native-community/cli-platform-ios": "20.0.2", + "@react-native/babel-preset": "0.81.5", + "@react-native/eslint-config": "0.81.5", + "@react-native/eslint-plugin": "0.81.5", + "@react-native/metro-config": "0.81.5", + "@react-native/typescript-config": "0.81.5", "@testing-library/jest-native": "~5.4.3", "@testing-library/react-native": "~12.3.3", "@types/eslint__js": "~8.42.3", @@ -172,14 +171,13 @@ "@types/lodash.flatten": "~4.4.9", "@types/lodash.merge": "~4.6.9", "@types/lodash.startcase": "~4.4.9", - "@types/react": "~18.2.79", - "@types/react-native": "~0.71.13", + "@types/react": "~19.1.9", "@types/react-native-vector-icons": "~6.4.18", - "@types/react-test-renderer": "~18.0.7", + "@types/react-test-renderer": "~19.1.0", "@types/readable-stream": "^4", "@typescript-eslint/eslint-plugin": "~7.18.0", "@typescript-eslint/parser": "~7.18.0", - "babel-jest": "~27.5.1", + "babel-jest": "~29.7.0", "babel-plugin-module-resolver": "~5.0.2", "commitlint": "~17.7.2", "copyfiles": "~2.4.1", @@ -193,16 +191,15 @@ "husky": "~7.0.4", "jest": "~29.6.4", "lint-staged": "~11.2.6", - "metro-react-native-babel-transformer": "~0.77.0", "mockdate": "~3.0.5", "patch-package": "^8.0.1", "pod-install": "~0.1.39", "postinstall-postinstall": "^2.1.0", "prettier": "~2.8.8", - "react-dom": "~18.2.0", - "react-native-svg-transformer": "~0.14.3", - "react-test-renderer": "~18.2.0", - "typescript": "~5.5.4", + "react-dom": "19.1.0", + "react-native-svg-transformer": "^1.5.1", + "react-test-renderer": "19.1.0", + "typescript": "~5.9.2", "typescript-eslint": "~7.18.0" } } diff --git a/app/patches/@digitalcredentials+jsonld-signatures+9.4.0.patch b/app/patches/@digitalcredentials+jsonld-signatures+9.4.0.patch deleted file mode 100644 index 7371fbe..0000000 --- a/app/patches/@digitalcredentials+jsonld-signatures+9.4.0.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff --git a/node_modules/@digitalcredentials/jsonld-signatures/lib/sha256digest-reactnative.js b/node_modules/@digitalcredentials/jsonld-signatures/lib/sha256digest-reactnative.js -index 1234567..abcdefg 100644 ---- a/node_modules/@digitalcredentials/jsonld-signatures/lib/sha256digest-reactnative.js -+++ b/node_modules/@digitalcredentials/jsonld-signatures/lib/sha256digest-reactnative.js -@@ -3,7 +3,9 @@ - */ - 'use strict'; - --const crypto = require('isomorphic-webcrypto'); -+// Use js-sha256 for synchronous SHA-256 in React Native -+// This avoids async initialization issues with isomorphic-webcrypto -+const jsSha256 = require('js-sha256'); - require('fast-text-encoding'); - - module.exports = { -@@ -15,9 +17,15 @@ - * @return {Uint8Array} the hash digest. - */ - async sha256digest({string}) { -- const bytes = new TextEncoder().encode(string); -- return new Uint8Array( -- await crypto.subtle.digest({name: 'SHA-256'}, bytes) -- ); -+ // Use js-sha256 directly - works synchronously in React Native -+ const hexHash = jsSha256.sha256(string); -+ -+ // Convert hex string to Uint8Array -+ const hashLength = hexHash.length / 2; -+ const result = new Uint8Array(hashLength); -+ for (let i = 0; i < hashLength; i++) { -+ result[i] = parseInt(hexHash.substr(i * 2, 2), 16); -+ } -+ return result; - } - }; diff --git a/app/src/Root.tsx b/app/src/Root.tsx index 5b2f7a5..87583a3 100644 --- a/app/src/Root.tsx +++ b/app/src/Root.tsx @@ -1,11 +1,7 @@ -import { RootStack as KeyRingRootStack, useStore } from '@bifold/core' -import { BCState, Mode } from '@/store' -import BCSCRootStack from '@bcsc-theme/navigators/RootStack' +import { RootStack as KeyRingRootStack } from '@bifold/core' const Root: React.FC = () => { - const [store] = useStore() - - return store.mode === Mode.KeyRingSC ? : + return } export default Root diff --git a/app/src/bcsc-theme/__tests__/components/TileButton.test.tsx b/app/src/bcsc-theme/__tests__/components/TileButton.test.tsx deleted file mode 100644 index 57c8aa7..0000000 --- a/app/src/bcsc-theme/__tests__/components/TileButton.test.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { testIdWithKey } from '@bifold/core' -import { fireEvent, render } from '@testing-library/react-native' -import React from 'react' - -import TileButton from '../../components/TileButton' -import { BasicAppContext } from '../../../../__mocks__/helpers/app' - -describe('TileButton Component', () => { - const onPress = jest.fn() - const actionText = 'Action text' - const description = - 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quasi et consectetur iusto error aliquam' - const testIDKey = 'TileButton' - const accessibilityLabel = 'Card' - - beforeEach(() => { - jest.resetAllMocks() - }) - - test('renders correctly', () => { - const tree = render( - - - - ) - expect(tree).toMatchSnapshot() - }) - - test('test ID is present and press handler works', () => { - const { getByTestId } = render( - - - - ) - - const tileButton = getByTestId(testIdWithKey(testIDKey)) - expect(tileButton).toBeDefined() - fireEvent(tileButton, 'press') - expect(onPress).toHaveBeenCalledTimes(1) - }) -}) diff --git a/app/src/bcsc-theme/__tests__/components/__snapshots__/TileButton.test.tsx.snap b/app/src/bcsc-theme/__tests__/components/__snapshots__/TileButton.test.tsx.snap deleted file mode 100644 index 13397a5..0000000 --- a/app/src/bcsc-theme/__tests__/components/__snapshots__/TileButton.test.tsx.snap +++ /dev/null @@ -1,99 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`TileButton Component renders correctly 1`] = ` - - - - Action text - - 󱦰 - - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Quasi et consectetur iusto error aliquam - - - -`; diff --git a/app/src/bcsc-theme/api/client.ts b/app/src/bcsc-theme/api/client.ts deleted file mode 100644 index c0bd92b..0000000 --- a/app/src/bcsc-theme/api/client.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { RemoteLogger } from '@bifold/remote-logs' -import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios' -import { jwtDecode } from 'jwt-decode' -import { getRefreshTokenRequestBody } from 'react-native-bcsc-core' - -import { getDeviceCountFromIdToken } from '../utils/get-device-count' -import { TokenStatusResponseData } from './hooks/useTokens' -import { withAccount } from './hooks/withAccountGuard' - -// Extend AxiosRequestConfig to include skipBearerAuth -declare module 'axios' { - export interface AxiosRequestConfig { - skipBearerAuth?: boolean - } -} - -export interface TokenStatusResponseDataWithDeviceCount extends TokenStatusResponseData { - bcsc_devices_count?: number -} - -interface BCSCConfig { - pairDeviceWithQRCodeSupported: boolean - maximumAccountsPerDevice: number - allowedIdentificationProcesses: string[] - credentialFlowsSupported: string - multipleAccountsSupported: boolean - attestationTimeToLive: number -} - -interface BCSCEndpoints { - attestation: string - issuer: string - authorization: string - userInfo: string - deviceAuthorization: string - jwksURI: string - registration: string - clientMetadata: string - savedServices: string - token: string - credential: string - evidence: string - video: string -} - -class BCSCApiClient { - readonly client: AxiosInstance - readonly logger: RemoteLogger - endpoints: BCSCEndpoints - config: BCSCConfig - baseURL: string - tokens?: TokenStatusResponseData // this token will be used to interact and access data from IAS servers - - constructor(baseURL: string, logger: RemoteLogger) { - this.baseURL = baseURL - this.logger = logger - this.client = axios.create({ - headers: { - 'Content-Type': 'application/json', - }, - }) - - if (this.baseURL) { - this.logger.info(`BCSCApiClient initialized with URL: ${this.baseURL}`) - } else { - this.logger.error('BCSCApiClient initialized with empty URL.') - } - - // fallback config - this.config = { - pairDeviceWithQRCodeSupported: true, - maximumAccountsPerDevice: 0, - allowedIdentificationProcesses: [ - 'IDIM L3 Remote BCSC Photo Identity Verification', - 'IDIM L3 Remote BCSC Non-Photo Identity Verification', - 'IDIM L3 Remote Non-BCSC Identity Verification', - ], - credentialFlowsSupported: 'default_web_flow, bcwallet_initiated, bcsc_initiated', - multipleAccountsSupported: false, - attestationTimeToLive: 60, - } - - // fallback endpoints - this.endpoints = { - attestation: `${this.baseURL}/device/attestations`, - issuer: `${this.baseURL}/device/`, - authorization: `${this.baseURL}/device/authorize`, - userInfo: `${this.baseURL}/device/userinfo`, - deviceAuthorization: `${this.baseURL}/device/devicecode`, - jwksURI: `${this.baseURL}/device/jwk`, - registration: `${this.baseURL}/device/register`, - clientMetadata: `${this.baseURL}/device/clients/metadata`, - savedServices: `${this.baseURL}/device/services`, - token: `${this.baseURL}/device/token`, - credential: `${this.baseURL}/credentials/v1/person`, - evidence: `${this.baseURL}/evidence`, - video: `${this.baseURL}/video`, - } - - // Add interceptors - this.client.interceptors.request.use(this.handleRequest.bind(this)) - this.client.interceptors.response.use(undefined, (error: AxiosError) => { - const errorDetails = { - name: error.name, - message: error.message, - code: error.code, - - request: { - method: error.config?.method?.toUpperCase(), - url: error.config?.url, - baseURL: error.config?.baseURL, - headers: error.config?.headers, - data: error.config?.data, - params: error.config?.params, - }, - - response: error.response - ? { - status: error.response.status, - statusText: error.response.statusText, - headers: error.response.headers, - data: error.response.data, - } - : null, - - isTimeout: error.code === 'ECONNABORTED', - isNetworkError: !error.response && !error.code, - - stack: error.stack, - } - - this.logger.error(`API Error:\n${JSON.stringify(errorDetails, null, 2)}`) - - return Promise.reject(error) - }) - } - - async fetchEndpointsAndConfig(url: string) { - const response = await this.get(`${url}/device/.well-known/openid-configuration`, { skipBearerAuth: true }) - this.config = { - pairDeviceWithQRCodeSupported: response.data['pair_device_with_qrcode_supported'], - maximumAccountsPerDevice: response.data['maximum_accounts_per_device'], - allowedIdentificationProcesses: response.data['allowed_identification_processes'], - credentialFlowsSupported: response.data['credential_flows_supported'], - multipleAccountsSupported: response.data['multiple_accounts_supported'], - attestationTimeToLive: response.data['attestation_time_to_live'], - } - - this.endpoints = { - attestation: response.data['attestation_endpoint'], - issuer: response.data['issuer'], - authorization: response.data['authorization_endpoint'], - userInfo: response.data['userinfo_endpoint'], - deviceAuthorization: response.data['device_authorization_endpoint'], - jwksURI: response.data['jwks_uri'], - registration: response.data['registration_endpoint'], - clientMetadata: response.data['client_metadata_endpoint'], - savedServices: response.data['saved_services_endpoint'], - token: response.data['token_endpoint'], - credential: response.data['credential_endpoint'], - // TODO(bm): request backend team to add evidence and video endpoints to the response - evidence: `${this.baseURL}/evidence`, - video: `${this.baseURL}/video`, - } - } - - async fetchAccessToken(): Promise { - return withAccount(async () => { - if (!this.tokens?.refresh_token || this.isTokenExpired(this.tokens?.refresh_token)) { - // refresh token should be saved when a device is authorized with IAS - throw new Error('TODO: Register if refresh token is expired or not present') - } - - const tokenData = await this.getTokensForRefreshToken(this.tokens.refresh_token) - return tokenData - }) - } - - private isTokenExpired(token?: string): boolean { - let isExpired = true - // if no token is present, return that token is "expired" and fetch a new one - if (token) { - const decodedToken = jwtDecode(token) - const exp = decodedToken.exp ?? 0 - isExpired = Date.now() >= exp * 1000 - } - return isExpired - } - - private async handleRequest(config: InternalAxiosRequestConfig): Promise { - this.logger.info(`Handling request for URL: ${String(config.url)}`) - // skip processing if skipBearerAuth is set in the config - if (config.skipBearerAuth) { - return config - } - - if (!this.tokens || this.isTokenExpired(this.tokens.access_token)) { - this.tokens = await this.fetchAccessToken() - } - - if (this.tokens) { - config.headers.set('Authorization', `Bearer ${this.tokens.access_token}`) - } - - this.logger.debug(`Sending request to ${String(config.url)} with method ${String(config.method)}`, config as any) - - return config - } - - async getTokensForRefreshToken(refreshToken: string): Promise { - return withAccount(async (account) => { - const { issuer, clientID } = account - const tokenBody = await getRefreshTokenRequestBody(issuer, clientID, refreshToken) - const tokenResponse = await this.post(this.endpoints.token, tokenBody, { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - skipBearerAuth: true, - }) - this.tokens = tokenResponse.data - - const bcsc_devices_count = await getDeviceCountFromIdToken(tokenResponse.data.id_token, this.logger) - - return { ...tokenResponse.data, bcsc_devices_count } - }) - } - - async get(url: string, config?: AxiosRequestConfig): Promise> { - return this.client.get(url, config) - } - - async post(url: string, data?: any, config?: AxiosRequestConfig): Promise> { - return this.client.post(url, data, config) - } - - async put(url: string, data?: any, config?: AxiosRequestConfig): Promise> { - return this.client.put(url, data, config) - } - - async delete(url: string, config?: AxiosRequestConfig): Promise> { - return this.client.delete(url, config) - } -} - -export default BCSCApiClient diff --git a/app/src/bcsc-theme/api/hooks/useApi.tsx b/app/src/bcsc-theme/api/hooks/useApi.tsx deleted file mode 100644 index 6346416..0000000 --- a/app/src/bcsc-theme/api/hooks/useApi.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { useBCSCApiClient } from '@/bcsc-theme/hooks/useBCSCApiClient' -import { useMemo } from 'react' -import useAuthorizationApi from './useAuthorizationApi' -import useConfigApi from './useConfigApi' -import useEvidenceApi from './useEvidenceApi' -import useJwksApi from './useJwksApi' -import useMetadataApi from './useMetadataApi' -import usePairingApi from './usePairingApi' -import useRegistrationApi from './useRegistrationApi' -import useTokenApi from './useTokens' -import useUserApi from './useUserApi' -import useVideoCallApi from './useVideoCallApi' - -const useApi = () => { - const apiClient = useBCSCApiClient() - const config = useConfigApi(apiClient) - const pairing = usePairingApi(apiClient) - const registration = useRegistrationApi(apiClient) - const authorization = useAuthorizationApi(apiClient) - const token = useTokenApi(apiClient) - const user = useUserApi(apiClient) - const evidence = useEvidenceApi(apiClient) - const metadata = useMetadataApi(apiClient) - const jwks = useJwksApi(apiClient) - const video = useVideoCallApi(apiClient) - - return useMemo( - () => ({ - config, - pairing, - registration, - authorization, - token, - user, - evidence, - metadata, - jwks, - video, - }), - [config, pairing, registration, authorization, token, user, evidence, metadata, jwks, video] - ) -} - -export default useApi diff --git a/app/src/bcsc-theme/api/hooks/useAuthorizationApi.tsx b/app/src/bcsc-theme/api/hooks/useAuthorizationApi.tsx deleted file mode 100644 index f059061..0000000 --- a/app/src/bcsc-theme/api/hooks/useAuthorizationApi.tsx +++ /dev/null @@ -1,192 +0,0 @@ -import { ProvinceCode } from '@/bcsc-theme/utils/address-utils' -import { isAxiosError } from 'axios' -import { useCallback, useMemo } from 'react' -import { createDeviceSignedJWT } from 'react-native-bcsc-core' -import BCSCApiClient from '../client' -import { withAccount } from './withAccountGuard' -import { BCSCCardProcess } from '@/bcsc-theme/types/cards' - -const INVALID_REGISTRATION_REQUEST = 'invalid_registration_request' - -export interface VerifyInPersonResponseData { - process: BCSCCardProcess - user_code: string - device_code: string - verified_email: string - expires_in: number -} - -export interface VerifyUnknownBCSCResponseData { - process: BCSCCardProcess.NonBCSC - user_code: string - evidence_upload_uri: string - device_code: string - verification_options: string - verification_uri: string - expires_in: number -} - -export interface AuthorizeDeviceUnknownBCSCConfig { - firstName: string - lastName: string - birthdate: string - address: { - streetAddress: string - postalCode: string - city: string - province: ProvinceCode - } - gender?: 'male' | 'female' | 'unknown' - middleNames?: string // space delimited names -} - -const useAuthorizationApi = (apiClient: BCSCApiClient) => { - /** - * Authorize a device with a known BCSC card. - * - * TODO: fetch evidence API endpoint from this endpoint - * - * @see `https://citz-cdt.atlassian.net/wiki/spaces/BMS/pages/301615517/5.1.1+Evidence+API` - * @param {string} serial - BCSC serial number - * @param {Date} birthdate - Users birth date - * @returns {*} {VerifyInPersonResponseData | null} - */ - const authorizeDevice = useCallback( - async (serial: string, birthdate: Date): Promise => { - return withAccount(async (account) => { - const body = { - response_type: 'device_code', - client_id: account.clientID, - card_serial_number: serial, - birth_date: birthdate.toISOString().split('T')[0], - scope: 'openid profile address offline_access', - } - - apiClient.logger.info('useAuthorizationApi.authorizeDevice.body', body) - - try { - const { data } = await apiClient.post( - apiClient.endpoints.deviceAuthorization, - body, - { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - skipBearerAuth: true, - } - ) - - return data - } catch (error) { - /** - * if already registered, return null for workflow convienience - * useful to be able to determine if the request failed or if the device - * has previously been registered - */ - if (isDeviceRegistered(error)) { - return null - } - - throw error - } - }) - }, - [apiClient] - ) - - /** - * Authorize a device with an unknown BCSC card. - * - * Note: This request will return null if called multiple times for the same device. - * First response will return the Verification response, which must be stored and persisted. - * - * @see `https://citz-cdt.atlassian.net/wiki/spaces/BMS/pages/301615517/5.1.1+Evidence+API` - * @param {AuthorizeDeviceUnknownBCSCConfig} config - Config including user information and address - * @returns {*} {VerifyUnknownBCSCResponseData | null} - Returns the response data or null if already registered - */ - const authorizeDeviceWithUnknownBCSC = useCallback( - async (config: AuthorizeDeviceUnknownBCSCConfig): Promise => { - return withAccount(async (account) => { - const body: Record = { - client_id: account.clientID, - response_type: 'device_code', - scope: 'openid profile address offline_access', - id_token_hint: await createDeviceSignedJWT({ - iss: account.clientID, - aud: account.issuer, - sub: account.clientID, - iat: Math.floor(Date.now() / 1000), - exp: Math.floor(Date.now() / 1000) + 60 * 10, // ten minutes - family_name: config.lastName, - given_name: config.firstName, - birthdate: config.birthdate, - address: { - street_address: config.address.streetAddress, - postal_code: config.address.postalCode, - locality: config.address.city, - region: config.address.province, - country: 'CA', - }, - // IAS requests 'unknown' when not specified - gender: config.gender ?? 'unknown', - // Omit middle name if not provided or empty string - middle_name: config.middleNames || undefined, - }), - } - - apiClient.logger.info('useAuthorizationApi.authorizeDeviceWithUnknownBCSC.body', body) - - try { - const { data } = await apiClient.post( - apiClient.endpoints.deviceAuthorization, - body, - { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - skipBearerAuth: true, - } - ) - - return data - } catch (error) { - /** - * if already registered, return null for workflow convienience - * useful to be able to determine if the request failed or if the device - * has previously been registered - */ - if (isDeviceRegistered(error)) { - return null - } - - throw error - } - }) - }, - [apiClient] - ) - - return useMemo( - () => ({ - authorizeDevice, - authorizeDeviceWithUnknownBCSC, - }), - [authorizeDevice, authorizeDeviceWithUnknownBCSC] - ) -} - -export default useAuthorizationApi - -// Helper functions - -/** - * Checks if an error matches the structure of when a device is registered. - * - * @param {any} error - The error to check - * @returns {*} {boolean} - */ -function isDeviceRegistered(error: any): boolean { - return ( - isAxiosError(error) && - error.response?.status === 400 && - error.response?.data.error === INVALID_REGISTRATION_REQUEST && - // "client is in invalid statue" OR "client is in invalid state" - String(error.response?.data.error_description).includes('client is in invalid') - ) -} diff --git a/app/src/bcsc-theme/api/hooks/useConfigApi.tsx b/app/src/bcsc-theme/api/hooks/useConfigApi.tsx deleted file mode 100644 index 7e3396f..0000000 --- a/app/src/bcsc-theme/api/hooks/useConfigApi.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { useCallback, useMemo } from 'react' -import { Platform } from 'react-native' -import BCSCApiClient from '../client' - -export interface ServerStatusResponseData { - minVersion: string - minVersionMessage: string - supportedVersions: string[] - service: string - status: 'ok' | 'unavailable' - statusMessage?: string - contactLink: string - controlNumber: number -} - -export interface TermsOfUseResponseData { - version: string - date: string - html: string -} - -const useConfigApi = (apiClient: BCSCApiClient) => { - /** - * Fetches the server status from the IAS API. - * - * @returns {*} {Promise} A promise that resolves to the server status data. - */ - const getServerStatus = useCallback(async () => { - // this endpoint is not available through the .well-known/openid-configuration so it needs to be hardcoded - const { data } = await apiClient.get( - `${apiClient.baseURL}/cardtap/v3/status/${Platform.OS}/mobile_card`, - { - skipBearerAuth: true, // this endpoint does not require an access token - } - ) - return data - }, [apiClient]) - - const getTermsOfUse = useCallback(async () => { - // this endpoint is not available through the .well-known/openid-configuration so it needs to be hardcoded - const { data } = await apiClient.get(`${apiClient.baseURL}/cardtap/v3/terms`) - return data - }, [apiClient]) - - return useMemo( - () => ({ - getServerStatus, - getTermsOfUse, - }), - [getServerStatus, getTermsOfUse] - ) -} - -export default useConfigApi diff --git a/app/src/bcsc-theme/api/hooks/useEvidenceApi.tsx b/app/src/bcsc-theme/api/hooks/useEvidenceApi.tsx deleted file mode 100644 index 4b8b668..0000000 --- a/app/src/bcsc-theme/api/hooks/useEvidenceApi.tsx +++ /dev/null @@ -1,384 +0,0 @@ -import { BCState } from '@/store' -import { useStore } from '@bifold/core' -import { useCallback, useMemo } from 'react' -import { createPreVerificationJWT } from 'react-native-bcsc-core' -import BCSCApiClient from '../client' -import { withAccount } from './withAccountGuard' - -export interface VerificationPrompt { - id: number - prompt: string -} - -export interface VerificationPromptUploadPayload { - id: number - prompted_at: number // this provides the index/ order in which the prompt was given. 0 is the first prompt, 1 is the second prompt show ect. -} -export interface VerificationResponseData { - id: string - sha256: string - prompts: VerificationPrompt[] -} - -export interface SendVerificationPayload { - upload_uris: string[] - sha256: string -} - -export interface VerificationStatusResponseData { - id: string - status: 'pending' | 'verified' | 'cancelled' - status_message?: string - expires_in?: string - avg_turnaround_time_message?: string -} - -export interface VerificationPhotoUploadPayload { - label: string - content_type: string - content_length: number - date: number - sha256: string // hashed copy of the photo - filename?: string -} - -export interface VerificationVideoUploadPayload { - content_type: string - content_length: number - date: number // epoch timestamp in seconds - sha256: string // hashed copy of the video - duration: number // video duration in seconds - prompts: VerificationPromptUploadPayload[] - filename?: string -} - -export interface UploadEvidenceResponseData { - label: string - upload_uri: string -} - -export interface EvidenceImageSide { - image_side_name: 'FRONT_SIDE' | 'BACK_SIDE' - image_side_label: string - image_side_tip: string -} - -export interface EvidenceType { - evidence_type: string - has_photo: boolean - group: 'BRITISH COLUMBIA' | 'CANADA, OR OTHER LOCATION IN CANADA' | 'UNITED STATES' | 'OTHER COUNTRIES' - group_sort_order: number - sort_order: number - collection_order: 'FIRST' | 'SECOND' | 'BOTH' - document_reference_input_mask: string // a regex mask for ID document reference input, number only can indicate to use a number only keyboard - document_reference_label: string - document_reference_sample: string - image_sides: EvidenceImageSide[] - evidence_type_label: string -} -export interface EvidenceMetadataResponseData { - processes: { - process: 'IDIM L3 Remote Non-BCSC Identity Verification' | 'IDIM L3 Remote Non-photo BCSC Identity Verification' - evidence_types: EvidenceType[] - }[] -} -export interface EvidenceMetadataPayload { - type: string - number: string - images: VerificationPhotoUploadPayload[] - barcodes?: { - type: string - }[] -} - -const useEvidenceApi = (apiClient: BCSCApiClient) => { - const [store] = useStore() - - const _getDeviceCode = useCallback(() => { - const code = store.bcsc.deviceCode - if (!code) throw new Error('Device code is missing. Re install the app and setup try again.') - return code - }, [store.bcsc.deviceCode]) - - const getEvidenceMetadata = useCallback(async (): Promise => { - const { data } = await apiClient.get(`${apiClient.endpoints.evidence}/metadata`, { - // Evidence endpoints do not require a full access token - skipBearerAuth: true, - }) - return data - }, [apiClient]) - - // This needs ot be called for the process to start - const createVerificationRequest = useCallback(async (): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.post( - `${apiClient.endpoints.evidence}/v1/verifications`, - null, - { - headers: { - Authorization: `Bearer ${token}`, - }, - // Evidence endpoints do not require a full access token - skipBearerAuth: true, - } - ) - return data - }) - }, [_getDeviceCode, apiClient]) - - const uploadPhotoEvidenceMetadata = useCallback( - async (payload: VerificationPhotoUploadPayload): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.post( - `${apiClient.endpoints.evidence}/v1/photos`, - payload, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - const uploadVideoEvidenceMetadata = useCallback( - async (payload: VerificationVideoUploadPayload): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.post( - `${apiClient.endpoints.evidence}/v1/videos`, - payload, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const sendVerificationRequest = useCallback( - async ( - verificationRequestId: string, - payload: SendVerificationPayload - ): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.put( - `${apiClient.endpoints.evidence}/v1/verifications/${verificationRequestId}`, - payload, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const getVerificationRequestPrompts = useCallback( - async (verificationRequestId: string): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.get( - `${apiClient.endpoints.evidence}/v1/verifications/${verificationRequestId}/prompts`, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const getVerificationRequestStatus = useCallback( - async (verificationRequestId: string): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.get( - `${apiClient.endpoints.evidence}/v1/verifications/${verificationRequestId}`, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - // This is only valid once sendVerificationRequest has been called - // meaning the user has uploaded their photo, video and document evidence - // In the mean time the ID is 'held' for the time being and discarded if the user backs out - const cancelVerificationRequest = useCallback( - async (verificationRequestId: string): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.delete( - `${apiClient.endpoints.evidence}/v1/verifications/${verificationRequestId}`, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const createEmailVerification = useCallback( - async (email: string): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.post( - `${apiClient.endpoints.evidence}/v1/emails`, - { email_address: email }, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const sendEmailVerificationCode = useCallback( - async (code: string, emailAddressId: string): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.put( - `${apiClient.endpoints.evidence}/v1/emails/${emailAddressId}`, - { - verification_code: code, - }, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const uploadPhotoEvidenceBinary = useCallback( - async (url: string, binaryData: any): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.put(url, binaryData, { - headers: { - Authorization: `Bearer ${token}`, - 'Content-Type': 'image/jpeg', - Accept: 'image/jpeg', - }, - skipBearerAuth: true, - }) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const uploadVideoEvidenceBinary = useCallback( - async (url: string, binaryData: any): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.put(url, binaryData, { - headers: { - Authorization: `Bearer ${token}`, - 'Content-Type': 'video/mp4', - Accept: 'video/mp4', - }, - skipBearerAuth: true, - }) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const sendEvidenceMetadata = useCallback( - async (payload: EvidenceMetadataPayload): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.post( - `${apiClient.endpoints.evidence}/v1/documents`, - payload, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - return useMemo( - () => ({ - createVerificationRequest, - uploadPhotoEvidenceMetadata, - uploadVideoEvidenceMetadata, - uploadPhotoEvidenceBinary, - uploadVideoEvidenceBinary, - sendVerificationRequest, - getVerificationRequestStatus, - cancelVerificationRequest, - getVerificationRequestPrompts, - createEmailVerification, - sendEmailVerificationCode, - sendEvidenceMetadata, - getEvidenceMetadata, - }), - [ - createVerificationRequest, - uploadPhotoEvidenceMetadata, - uploadVideoEvidenceMetadata, - uploadPhotoEvidenceBinary, - uploadVideoEvidenceBinary, - sendVerificationRequest, - getVerificationRequestStatus, - cancelVerificationRequest, - getVerificationRequestPrompts, - createEmailVerification, - sendEmailVerificationCode, - sendEvidenceMetadata, - getEvidenceMetadata, - ] - ) -} - -export default useEvidenceApi diff --git a/app/src/bcsc-theme/api/hooks/useFactoryReset.tsx b/app/src/bcsc-theme/api/hooks/useFactoryReset.tsx deleted file mode 100644 index 63f3c9d..0000000 --- a/app/src/bcsc-theme/api/hooks/useFactoryReset.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { DispatchAction, TOKENS, useServices, useStore } from '@bifold/core' -import useApi from './useApi' -import * as BcscCore from 'react-native-bcsc-core' -import { BCDispatchAction, BCState } from '@/store' -import { useCallback } from 'react' - -type FactoryResetResult = - | { - success: true - } - | { - success: false - error: Error - } - -/** - * Hook to perform a factory reset of the BCSC account and state. - * This should get the application as close as possible to a fresh install state. - * - * WARNING: This is a destructive action and will result in loss of all user data and settings. - * - * This includes: - * - Deleting the IAS account associated with the current clientID. - * - Removing the local account file. - * - Clearing the BCSC state in the global store. - * - Registering a new account to generate a new clientID and save it locally. - * - Logging out the user by updating the authentication state. - * - * @returns {Function} A function that performs the factory reset when called. - */ -export const useFactoryReset = () => { - const { registration } = useApi() - const [, dispatch] = useStore() - const [logger] = useServices([TOKENS.UTIL_LOGGER]) - - // TODO (MD): Consider adding a loading / status state to indicate progress of the factory reset operation - - /** - * Performs a factory reset of the BCSC account and state. - * - * @returns {Promise} A promise that resolves to the result of the factory reset operation. - */ - const factoryReset = useCallback(async (): Promise => { - try { - const account = await BcscCore.getAccount() - - if (!account) { - throw new Error('Local account not found for factory reset') - } - - // Delete IAS account - logger.info('FactoryReset: Deleting IAS account from server...') - const deleteIASAccount = await registration.deleteRegistration(account.clientID) - - if (!deleteIASAccount.success) { - throw new Error('IAS server account deletion failed') - } - - // Remove local account file - logger.info('FactoryReset: Removing local account file...') - await BcscCore.removeAccount() - - // Reset BCSC state to initial state - logger.info('FactoryReset: Clearing BCSC state...') - dispatch({ type: BCDispatchAction.CLEAR_BCSC }) - - logger.info('FactoryReset: Registering new account...') - await registration.register() - - logger.info('FactoryReset: Logging out user...') - dispatch({ type: DispatchAction.DID_AUTHENTICATE, payload: [false] }) - - // Factory reset complete - logger.info('FactoryReset: BCSC factory reset completed successfully') - return { success: true } - } catch (error) { - const factoryResetError = _formatFactoryResetError(error) - logger.error(`FactoryReset: ${factoryResetError.message}`, factoryResetError) - - return { success: false, error: factoryResetError } - } - }, [registration, dispatch, logger]) - - return factoryReset -} - -/** - * Formats errors that occur during the factory reset process. - * - * @param {unknown} error - The error to format. - * @returns {*} {Error} The formatted error. - */ -function _formatFactoryResetError(error: unknown): Error { - if (error instanceof Error) { - error.message = `FactoryResetError: ${error.message}` - return error - } - - return new Error(`FactoryResetUnknownError: ${JSON.stringify(error, null, 2)}`) -} diff --git a/app/src/bcsc-theme/api/hooks/useJwksApi.tsx b/app/src/bcsc-theme/api/hooks/useJwksApi.tsx deleted file mode 100644 index a223754..0000000 --- a/app/src/bcsc-theme/api/hooks/useJwksApi.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useCallback, useMemo } from 'react' -import BCSCApiClient from '../client' - -export interface JWK { - kty: string - e: string - kid: string - alg: string - n: string -} -export type Keys = JWK[] - -export type JWKResponseData = { - keys: Keys -} - -const useJwksApi = (apiClient: BCSCApiClient) => { - const getJwks = useCallback(async (): Promise => { - const { - data: { keys }, - } = await apiClient.get(apiClient.endpoints.jwksURI, { - skipBearerAuth: true, // this endpoint does not require an access token - }) - return keys - }, [apiClient]) - - const getFirstJwk = useCallback(async (): Promise => { - const keys = await getJwks() - return keys.length > 0 ? keys[0] : null - }, [getJwks]) - - return useMemo( - () => ({ - getJwks, - getFirstJwk, - }), - [getJwks, getFirstJwk] - ) -} - -export default useJwksApi diff --git a/app/src/bcsc-theme/api/hooks/useMetadataApi.tsx b/app/src/bcsc-theme/api/hooks/useMetadataApi.tsx deleted file mode 100644 index 99329c9..0000000 --- a/app/src/bcsc-theme/api/hooks/useMetadataApi.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { useCallback, useMemo } from 'react' -import BCSCApiClient from '../client' - -export type Clients = ClientMetadata[] - -export type MetadataResponseData = { - clients: Clients -} - -/** - * Client metadata as returned by the IAS Client Metadata endpoint. - * - * @see https://citz-cdt.atlassian.net/wiki/spaces/BMS/pages/301574688/5.1+System+Interfaces#IAS-Client-Metadata-endpoint - */ -export interface ClientMetadata { - client_ref_id: string - client_name: string - client_uri: string - application_type: string - claims_description: string - suppress_confirmation_info: boolean - suppress_bookmark_prompt: boolean - allowed_identification_processes: string[] - bc_address: boolean - initiate_login_uri?: string - client_description?: string - policy_uri?: string - service_listing_sort_order?: number -} - -const useMetadataApi = (apiClient: BCSCApiClient) => { - /** - * Fetches the client metadata from the IAS Client Metadata endpoint. - * - * @return {*} {Promise} A promise that resolves to an array of client metadata objects. - */ - const getClientMetadata = useCallback(async (): Promise => { - const { - data: { clients }, - } = await apiClient.get(apiClient.endpoints.clientMetadata) - return clients - }, [apiClient]) - - /** - * Fetches the client metadata for the BCSC application specifically. - * - * @return {*} {Promise} A promise that resolves to the BCSC client metadata object, or null if not found. - */ - const getBCSCClientMetadata = useCallback(async (): Promise => { - const clients = await getClientMetadata() - const bcscClient = clients.find((client) => client.client_uri === `${apiClient.baseURL}/account/`) - - if (!bcscClient) { - throw new Error('BCSC client metadata not found') - } - - return bcscClient - }, [apiClient, getClientMetadata]) - - return useMemo( - () => ({ - getClientMetadata, - getBCSCClientMetadata, - }), - [getClientMetadata, getBCSCClientMetadata] - ) -} - -export default useMetadataApi diff --git a/app/src/bcsc-theme/api/hooks/usePairingApi.tsx b/app/src/bcsc-theme/api/hooks/usePairingApi.tsx deleted file mode 100644 index 089f182..0000000 --- a/app/src/bcsc-theme/api/hooks/usePairingApi.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { getNotificationTokens } from '@/bcsc-theme/utils/push-notification-tokens' -import { useCallback, useMemo } from 'react' -import { signPairingCode } from 'react-native-bcsc-core' -import BCSCApiClient from '../client' -import { withAccount } from './withAccountGuard' - -// There is no actual data response (just a 200) from the pairing code login endpoint, so we -// define a minimal response for DX and and TypeScript -export interface PairingCodeLoginResponseData { - success: boolean -} - -const usePairingApi = (apiClient: BCSCApiClient) => { - const loginByPairingCode = useCallback( - async (code: string) => { - return withAccount(async (account) => { - const { issuer, clientID } = account - const { fcmDeviceToken, apnsToken } = await getNotificationTokens() - const signedCode = await signPairingCode(code, issuer, clientID, fcmDeviceToken, apnsToken) - await apiClient.post( - // this endpoint is not available through the .well-known/openid-configuration so it needs to be hardcoded - `${apiClient.baseURL}/cardtap/v3/mobile/assertion`, - { assertion: signedCode }, - { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } - ) - return { success: true } - }) - }, - [apiClient] - ) - - return useMemo( - () => ({ - loginByPairingCode, - }), - [loginByPairingCode] - ) -} - -export default usePairingApi diff --git a/app/src/bcsc-theme/api/hooks/useRegistrationApi.tsx b/app/src/bcsc-theme/api/hooks/useRegistrationApi.tsx deleted file mode 100644 index 8247798..0000000 --- a/app/src/bcsc-theme/api/hooks/useRegistrationApi.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { useCallback, useMemo } from 'react' -import { AccountSecurityMethod, getAccount, getDynamicClientRegistrationBody, setAccount } from 'react-native-bcsc-core' - -import { getNotificationTokens } from '@/bcsc-theme/utils/push-notification-tokens' -import { BCDispatchAction, BCState } from '@/store' -import { useStore } from '@bifold/core' -import BCSCApiClient from '../client' - -export interface RegistrationResponseData { - client_id: string - client_id_issued_at: number - registration_access_token: string - registration_client_uri: string - redirect_uris: string[] - client_name: string - token_endpoint_auth_method: string - scope: string - grant_types: string[] - response_types: string[] - jwks: { - keys: Array<{ - kty: string - e: string - kid: string - alg: string - n: string - }> - } - request_object_signing_alg: string - userinfo_signed_response_alg: string - userinfo_encrypted_response_alg: string - userinfo_encrypted_response_enc: string - id_token_signed_response_alg: string - id_token_encrypted_response_alg: string - id_token_encrypted_response_enc: string - token_endpoint_auth_signing_alg: string - default_max_age: number - require_auth_time: boolean - default_acr_values: string[] -} - -// The registration API is a bit of a special case because it gets called during initialization, -// so its params are adjusted to account for an api client that may not be ready yet -const useRegistrationApi = (apiClient: BCSCApiClient | null, clientIsReady: boolean = true) => { - const [store, dispatch] = useStore() - - const register = useCallback(async () => { - if (!clientIsReady || !apiClient) { - throw new Error('BCSC client not ready for registration') - } - - const account = await getAccount() - // If an account already exists, we don't need to register again - if (account) return - - const { fcmDeviceToken, apnsToken } = await getNotificationTokens() - const body = await getDynamicClientRegistrationBody(fcmDeviceToken, apnsToken) - const { data } = await apiClient.post(apiClient.endpoints.registration, body, { - headers: { 'Content-Type': 'application/json' }, - skipBearerAuth: true, - }) - - dispatch({ - type: BCDispatchAction.UPDATE_REGISTRATION_ACCESS_TOKEN, - payload: [{ registrationAccessToken: data.registration_access_token }], - }) - - await setAccount({ - clientID: data.client_id, - issuer: apiClient.endpoints.issuer, - securityMethod: AccountSecurityMethod.PinNoDeviceAuth, - }) - return data - }, [clientIsReady, apiClient, dispatch]) - - const updateRegistration = useCallback( - async (clientId: string) => { - if (!clientIsReady || !apiClient) { - throw new Error('BCSC client not ready for registration update') - } - - const { fcmDeviceToken, apnsToken } = await getNotificationTokens() - const body = await getDynamicClientRegistrationBody(fcmDeviceToken, apnsToken) - const { data } = await apiClient.put( - `${apiClient.endpoints.registration}/${clientId}`, - body, - { headers: { 'Content-Type': 'application/json' } } - ) - return data - }, - [clientIsReady, apiClient] - ) - - const deleteRegistration = useCallback( - async (clientId: string) => { - if (!clientIsReady || !apiClient) { - throw new Error('BCSC client not ready for registration deletion') - } - - const registrationAccessToken = store.bcsc.registrationAccessToken - - const { status } = await apiClient.delete(`${apiClient.endpoints.registration}/${clientId}`, { - skipBearerAuth: true, - headers: { - Authorization: `Bearer ${registrationAccessToken}`, - }, - }) - - // 200 level status codes indicate success - return { success: status > 199 && status < 300 } - }, - [clientIsReady, apiClient, store.bcsc.registrationAccessToken] - ) - - return useMemo( - () => ({ - register, - updateRegistration, - deleteRegistration, - }), - [register, updateRegistration, deleteRegistration] - ) -} - -export default useRegistrationApi diff --git a/app/src/bcsc-theme/api/hooks/useTokens.tsx b/app/src/bcsc-theme/api/hooks/useTokens.tsx deleted file mode 100644 index 942a5b0..0000000 --- a/app/src/bcsc-theme/api/hooks/useTokens.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { getDeviceCountFromIdToken } from '@/bcsc-theme/utils/get-device-count' -import { useCallback, useMemo } from 'react' -import { getDeviceCodeRequestBody } from 'react-native-bcsc-core' -import BCSCApiClient, { TokenStatusResponseDataWithDeviceCount } from '../client' -import { withAccount } from './withAccountGuard' - -export interface TokenStatusResponseData { - access_token: string - expires_in: number - id_token: string - refresh_token: string - scope: string - token_type: string -} - -export interface BcscJwtPayload { - bcsc_devices_count?: number - // Add other BCSC-specific claims here as needed -} - -const useTokenApi = (apiClient: BCSCApiClient) => { - const checkDeviceCodeStatus = useCallback( - async (deviceCode: string, confirmationCode: string) => { - return withAccount(async (account) => { - const { clientID, issuer } = account - const body = await getDeviceCodeRequestBody(deviceCode, clientID, issuer, confirmationCode) - const { data } = await apiClient.post(apiClient.endpoints.token, body, { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - skipBearerAuth: true, - }) - apiClient.tokens = data - - const bcsc_devices_count = await getDeviceCountFromIdToken(data.id_token, apiClient.logger) - return { ...data, bcsc_devices_count } - }) - }, - [apiClient] - ) - - return useMemo( - () => ({ - checkDeviceCodeStatus, - }), - [checkDeviceCodeStatus] - ) -} - -export default useTokenApi diff --git a/app/src/bcsc-theme/api/hooks/useUserApi.tsx b/app/src/bcsc-theme/api/hooks/useUserApi.tsx deleted file mode 100644 index 565d851..0000000 --- a/app/src/bcsc-theme/api/hooks/useUserApi.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { useCallback, useMemo } from 'react' -import { decodePayload } from 'react-native-bcsc-core' -import BCSCApiClient from '../client' -import { withAccount } from './withAccountGuard' - -export interface UserInfoResponseData { - identity_assurance_level: string - credential_reference: string - sub: string - transaction_identifier: string - given_name: string - family_name: string - display_name: string - birthdate: string - gender: string - address: { formatted: string } - picture: string - card_type: any - card_expiry: string -} - -const useUserApi = (apiClient: BCSCApiClient) => { - const getUserInfo = useCallback(async (): Promise => { - return withAccount(async () => { - const response = await apiClient.get(apiClient.endpoints.userInfo) - const userInfoString = await decodePayload(String(response.data)) - return JSON.parse(userInfoString) - }) - }, [apiClient]) - - const getPicture = useCallback( - async (pictureUrl: string): Promise => { - return withAccount(async () => { - const response = await apiClient.get(pictureUrl, { - responseType: 'arraybuffer', // get raw binary data - }) - - // convert to base64 - const base64String = btoa( - new Uint8Array(response.data).reduce((data, byte) => data + String.fromCharCode(byte), '') - ) - - // return as uri - return `data:image/jpeg;base64,${base64String}` - }) - }, - [apiClient] - ) - - return useMemo( - () => ({ - getUserInfo, - getPicture, - }), - [getUserInfo, getPicture] - ) -} - -export default useUserApi diff --git a/app/src/bcsc-theme/api/hooks/useVideoCallApi.tsx b/app/src/bcsc-theme/api/hooks/useVideoCallApi.tsx deleted file mode 100644 index 0f1c178..0000000 --- a/app/src/bcsc-theme/api/hooks/useVideoCallApi.tsx +++ /dev/null @@ -1,219 +0,0 @@ -import { BCState } from '@/store' -import { useStore } from '@bifold/core' -import { useCallback, useMemo } from 'react' -import { createPreVerificationJWT } from 'react-native-bcsc-core' -import BCSCApiClient from '../client' -import { withAccount } from './withAccountGuard' - -type SessionStatusType = 'session_granted' | 'session_not_granted' | 'session_failed' | 'session_ended' -type CallStatusType = - | 'call_ringing' - | 'call_media_pending' - | 'call_in_call' - | 'call_ended' - | 'call_error' - | 'call_dropped' - | 'call_reconnected' - -export interface VideoSession { - client_id: string - device_code: string - session_id: string - destination_host: string - room_name: string - room_alias: string - guest_pin: string - queue_position: number - status: SessionStatusType - status_date: number // seconds from epoch - created_date: number // seconds from epoch -} - -export interface VideoCall { - session_id: string - call_id: string - client_call_id: string - status: CallStatusType - status_date: number // seconds from epoch -} - -export interface VideoDestination { - max_active_sessions?: number - max_inactive_seconds?: number - number_of_agents?: number - destination_name: string - destination_priority: number - destination_host?: string -} - -export type VideoDestinations = VideoDestination[] - -export interface ServicePeriod { - start_day: string // e.g. "MONDAY" - end_day: string // e.g. "MONDAY" - start_time: string // e.g. "05:00" - end_time: string // e.g. "23:59" -} - -export interface ServiceHours { - time_zone: string - regular_service_periods: ServicePeriod[] - service_unavailable_periods: ServicePeriod[] -} - -const useVideoCallApi = (apiClient: BCSCApiClient) => { - const [store] = useStore() - - const _getDeviceCode = useCallback(() => { - const code = store.bcsc.deviceCode - if (!code) throw new Error('Device code is missing. Re install the app and try again.') - return code - }, [store.bcsc.deviceCode]) - - const createVideoSession = useCallback(async (): Promise => { - return withAccount(async (account) => { - const deviceCode = _getDeviceCode() - const body = { client_id: account.clientID, device_code: deviceCode } - const token = await createPreVerificationJWT(deviceCode, account.clientID) - const { data } = await apiClient.post(`${apiClient.endpoints.video}/v2/sessions/`, body, { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - }) - return data - }) - }, [_getDeviceCode, apiClient]) - - const updateVideoSessionStatus = useCallback( - async (sessionId: string, status: SessionStatusType): Promise => { - return withAccount(async (account) => { - const body = { status } - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.put( - `${apiClient.endpoints.video}/v2/sessions/${sessionId}`, - body, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const createVideoCall = useCallback( - async (sessionId: string, clientCallId: string, status: CallStatusType = 'call_ringing'): Promise => { - return withAccount(async (account) => { - const body = { - session_id: sessionId, - status: status, - client_call_id: clientCallId, - } - - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.post( - `${apiClient.endpoints.video}/v2/sessions/${sessionId}/calls/`, - body, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const updateVideoCallStatus = useCallback( - async (sessionId: string, clientCallId: string, status: CallStatusType): Promise => { - return withAccount(async (account) => { - const body = { status, client_call_id: clientCallId } - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.put( - `${apiClient.endpoints.video}/v2/sessions/${sessionId}/calls/${clientCallId}`, - body, - { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - } - ) - return data - }) - }, - [_getDeviceCode, apiClient] - ) - - const endVideoSession = useCallback( - async (sessionId: string): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - await apiClient.delete(`${apiClient.endpoints.video}/v2/sessions/${sessionId}`, { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - }) - }) - }, - [_getDeviceCode, apiClient] - ) - - const getVideoDestinations = useCallback(async (): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.get(`${apiClient.endpoints.video}/v2/destinations`, { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - }) - return data - }) - }, [_getDeviceCode, apiClient]) - - const getServiceHours = useCallback(async (): Promise => { - return withAccount(async (account) => { - const token = await createPreVerificationJWT(_getDeviceCode(), account.clientID) - const { data } = await apiClient.get(`${apiClient.endpoints.video}/v2/service_hours`, { - headers: { - Authorization: `Bearer ${token}`, - }, - skipBearerAuth: true, - }) - return data - }) - }, [_getDeviceCode, apiClient]) - - return useMemo( - () => ({ - createVideoSession, - updateVideoSessionStatus, - createVideoCall, - updateVideoCallStatus, - endVideoSession, - getVideoDestinations, - getServiceHours, - }), - [ - createVideoSession, - updateVideoSessionStatus, - createVideoCall, - updateVideoCallStatus, - endVideoSession, - getVideoDestinations, - getServiceHours, - ] - ) -} - -export default useVideoCallApi diff --git a/app/src/bcsc-theme/api/hooks/withAccountGuard.ts b/app/src/bcsc-theme/api/hooks/withAccountGuard.ts deleted file mode 100644 index ca6fd64..0000000 --- a/app/src/bcsc-theme/api/hooks/withAccountGuard.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { getAccount } from 'react-native-bcsc-core' - -/** - * This is a wrapper function to centralize checking for an account before executing a function. - * - * @param fn Function that `withAccount` will wrap, which requires an account to be present. - * @returns The executed function with the account passed as an argument. - */ -export const withAccount = async (fn: (account: any) => Promise): Promise => { - const account = await getAccount() - if (!account) { - throw new Error('No account found. Please register first.') - } - - return fn(account) -} diff --git a/app/src/bcsc-theme/api/workflow/key-rotation.workflow.ts b/app/src/bcsc-theme/api/workflow/key-rotation.workflow.ts deleted file mode 100644 index 842a14d..0000000 --- a/app/src/bcsc-theme/api/workflow/key-rotation.workflow.ts +++ /dev/null @@ -1,13 +0,0 @@ -export async function checkKeyStatus() { - // keys can be rotated for the following reasons: - // - 90 days have passed - // - key is not valid -} -export async function rotateKeys() { - // get current keys - // get new keys - // end date old keys - // save new keys to device - // save new keys to server - // check new keys work -} diff --git a/app/src/bcsc-theme/components/AppBanner.tsx b/app/src/bcsc-theme/components/AppBanner.tsx deleted file mode 100644 index e351f7b..0000000 --- a/app/src/bcsc-theme/components/AppBanner.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { ThemedText, testIdWithKey, useTheme } from '@bifold/core' -import React, { useEffect, useState } from 'react' -import { StyleSheet, TouchableOpacity, View } from 'react-native' -import Icon from 'react-native-vector-icons/MaterialCommunityIcons' -export interface AppBannerSectionProps { - title: string - type: 'error' | 'warning' | 'info' | 'success' - dismissible?: boolean - onDismiss?: () => void -} - -interface AppBannerProps { - messages: AppBannerSectionProps[] -} - -export const AppBanner: React.FC = ({ messages }) => { - const [bannerMessages, setBannerMessages] = useState(messages) - - const dismissBanner = (index: number) => { - setBannerMessages((prevMessages) => prevMessages.filter((_, i) => i !== index)) - } - - useEffect(() => { - setBannerMessages(messages) - }, [messages]) - - if (!bannerMessages || bannerMessages.length == 0) { - return null - } - - return ( - - {bannerMessages.map((message, index) => ( - dismissBanner(index)} - key={`${message.title}-${message.type}`} - dismissible={message.dismissible} - /> - ))} - - ) -} - -export const AppBannerSection: React.FC = ({ title, type, onDismiss, dismissible = true }) => { - const { Spacing, ColorPalette } = useTheme() - const styles = StyleSheet.create({ - container: { - backgroundColor: ColorPalette.brand.primary, - flexDirection: 'row', - alignItems: 'center', - flexWrap: 'wrap', - padding: Spacing.md, - flexShrink: 1, - }, - icon: { - marginRight: Spacing.md, - }, - }) - - const iconName = (type: string): string => { - switch (type) { - case 'error': - return 'alert-circle' - case 'warning': - return 'alert' - case 'info': - return 'information' - case 'success': - return 'check-circle' - default: - return 'information' - } - } - - const bannerColor = (type: string): string => { - switch (type) { - case 'error': - return '#CE3E39' - case 'warning': - return '#F8BB47' - case 'info': - return '#2E5DD7' - case 'success': - return '#42814A' - default: - return '#2E5DD7' - } - } - - // If more details are needed we might need to push the banner down to accommodate the extra information - return ( - { - if (dismissible && onDismiss) { - onDismiss() - } - }} - > - - - {title} - - - ) -} diff --git a/app/src/bcsc-theme/components/CodeScanningCamera.tsx b/app/src/bcsc-theme/components/CodeScanningCamera.tsx deleted file mode 100644 index 541f69f..0000000 --- a/app/src/bcsc-theme/components/CodeScanningCamera.tsx +++ /dev/null @@ -1,223 +0,0 @@ -import { QRScannerTorch, useTheme } from '@bifold/core' -import React, { useEffect, useRef, useState } from 'react' -import { ColorValue, StyleSheet, View, ViewStyle, useWindowDimensions } from 'react-native' -import { - Camera, - Code, - CodeScannerFrame, - CodeType, - useCameraDevice, - useCameraPermission, - useCodeScanner, -} from 'react-native-vision-camera' - -const overlayTint: ColorValue = 'rgba(0, 0, 0, 0.4)' - -export interface CodeScanningCameraProps { - codeTypes: CodeType[] - - /** - * Callback function called when a code is successfully scanned - * @param codes Array of scanned codes - * @param frame The camera frame information - */ - onCodeScanned: (codes: Code[], frame: CodeScannerFrame) => void - - /** - * Custom style for the camera container - */ - style?: ViewStyle - - /** - * Should camera permission be requested - * @default true - */ - autoRequestPermission?: boolean - - /** - * Which camera to use - * @default 'back' - */ - cameraType?: 'front' | 'back' -} - -const CodeScanningCamera: React.FC = ({ - codeTypes, - onCodeScanned, - style, - autoRequestPermission = true, - cameraType = 'back', -}) => { - const { ColorPalette } = useTheme() - const camera = useRef(null) - const [torchEnabled, setTorchEnabled] = useState(false) - const { width } = useWindowDimensions() - - const { hasPermission, requestPermission } = useCameraPermission() - const device = useCameraDevice(cameraType) - useEffect(() => { - if (!hasPermission) { - requestPermission() - } - }, [hasPermission, requestPermission]) - - const scanSize = Math.min(width - 80, 250) - - const getScanAreaDimensions = () => { - // if we want to use a different sized - // scan area for different code types, - // this can be adjusted to return different width/height - // depending on codetypes passed - - // the current value roughly matches the shape - // of either code on a dl/ combined card - const scanWidth = scanSize * 1.3 - const scanHeight = scanWidth / 5 - - return { - width: scanWidth, - height: scanHeight, - } - } - - const scanAreaDimensions = getScanAreaDimensions() - - const codeScanner = useCodeScanner({ - codeTypes, - onCodeScanned: (codes, frame) => { - if (codes.length > 0) { - onCodeScanned(codes, frame) - } - }, - }) - - useEffect(() => { - if (autoRequestPermission && !hasPermission) { - requestPermission() - } - }, [hasPermission, requestPermission, autoRequestPermission]) - - const toggleTorch = () => { - setTorchEnabled((prev) => !prev) - } - - const styles = StyleSheet.create({ - container: { - flex: 1, - backgroundColor: ColorPalette.brand.primaryBackground, - position: 'relative', - }, - camera: { - flex: 1, - }, - overlayContainer: { - position: 'absolute', - top: 0, - left: 0, - right: 0, - bottom: 0, - justifyContent: 'center', - alignItems: 'center', - }, - overlayTop: { - position: 'absolute', - top: 0, - left: 0, - right: 0, - bottom: '50%', - marginBottom: scanAreaDimensions.height / 2, - backgroundColor: overlayTint, - }, - overlayBottom: { - position: 'absolute', - top: '50%', - marginTop: scanAreaDimensions.height / 2, - left: 0, - right: 0, - bottom: 0, - backgroundColor: overlayTint, - }, - overlayLeft: { - position: 'absolute', - top: '50%', - marginTop: -scanAreaDimensions.height / 2, - left: 0, - right: '50%', - marginRight: scanAreaDimensions.width / 2, - height: scanAreaDimensions.height, - backgroundColor: overlayTint, - }, - overlayRight: { - position: 'absolute', - top: '50%', - marginTop: -scanAreaDimensions.height / 2, - right: 0, - left: '50%', - marginLeft: scanAreaDimensions.width / 2, - height: scanAreaDimensions.height, - backgroundColor: overlayTint, - }, - overlayOpening: { - position: 'absolute', - top: '50%', - left: '50%', - width: scanAreaDimensions.width, - height: scanAreaDimensions.height, - marginTop: -scanAreaDimensions.height / 2, - marginLeft: -scanAreaDimensions.width / 2, - borderColor: 'rgba(255, 255, 255, 0.8)', - borderWidth: 2, - }, - torchContainer: { - position: 'absolute', - bottom: 0, - right: 24, - zIndex: 10, - }, - }) - - if (!device || !hasPermission) { - // return placeholder view - return ( - - - - - - - - - - - - - ) - } - - return ( - - - {/* scan area cutout */} - - - - - - - - {/* reuse qrscannertorch from bifold */} - - - - - ) -} - -export default CodeScanningCamera diff --git a/app/src/bcsc-theme/components/HelpHeaderButton.tsx b/app/src/bcsc-theme/components/HelpHeaderButton.tsx deleted file mode 100644 index c379034..0000000 --- a/app/src/bcsc-theme/components/HelpHeaderButton.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { HelpCentreUrl } from '@/constants' -import { ButtonLocation, IconButton, testIdWithKey, TOKENS, useServices } from '@bifold/core' -import { useTranslation } from 'react-i18next' -import { BCSCScreens } from '../types/navigators' -import { useNavigation } from '@react-navigation/native' -import React, { useCallback } from 'react' -import { StackNavigationProp } from '@react-navigation/stack' - -type HelpHeaderButtonUrlProps = { - /** - * The URL of the Help Centre page to navigate to, opens in a webview. - * - * @type {HelpCentreUrl} - */ - helpCentreUrl: HelpCentreUrl - helpAction?: never -} - -type HelpHeaderButtonActionProps = { - /** - * Function to call when the help button is pressed. - * - * @returns {*} {void} - */ - helpAction: () => void - helpCentreUrl?: never -} - -type HelpHeaderButtonProps = HelpHeaderButtonUrlProps | HelpHeaderButtonActionProps - -/** - * Creates a Help Header Button component that can either navigate to a Help Centre URL or execute a custom action. - * - * Note: This is a curried function to avoid re-rendering in navigation stacks. - * - * @param {HelpHeaderButtonProps} helpHeaderProps - The properties for the Help Header Button. - * @returns {*} {React.FC} A React functional component that renders the Help Header Button. - */ -const createHelpHeaderButton = (helpHeaderProps: HelpHeaderButtonProps) => { - // Declared so that it has a display name for debugging purposes - const HeaderRight = () => { - const { t } = useTranslation() - const [logger] = useServices([TOKENS.UTIL_LOGGER]) - const navigation = useNavigation>() - - /** - * Handles navigation to the Help Centre webview. - * - * @param {string} helpCentreUrl - The URL of the Help Centre page to navigate to. - * @returns {*} {Promise} - */ - const handleHelpCentreNavigation = useCallback( - async (helpCentreUrl: HelpCentreUrl) => { - try { - navigation.navigate(BCSCScreens.WebView, { - url: helpCentreUrl, - title: t('HelpCentre.Title'), - }) - } catch (error) { - logger.error(`Error navigating to Help Center webview: ${error}`) - } - }, - [navigation, logger, t] - ) - - return ( - { - // If helpCentreUrl is provided, navigate to the Help Centre webview - if (helpHeaderProps.helpCentreUrl) { - handleHelpCentreNavigation(helpHeaderProps.helpCentreUrl) - return - } - - // Otherwise, execute the custom help action - helpHeaderProps.helpAction() - }} - /> - ) - } - return HeaderRight -} - -export default createHelpHeaderButton diff --git a/app/src/bcsc-theme/components/InputWithValidation.tsx b/app/src/bcsc-theme/components/InputWithValidation.tsx deleted file mode 100644 index a5c118f..0000000 --- a/app/src/bcsc-theme/components/InputWithValidation.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { testIdWithKey, useTheme } from '@bifold/core' -import { ThemedText } from '@bifold/core' -import { StyleProp, TextInput, TextStyle, View } from 'react-native' - -// NOTE (MD): This is a first pass at this component, I assume eventually we will need to modify this to -// accept number inputs as well. - -type InputWithValidationProps = { - id: string // unique input identifier - value: string - onChange: (value: string) => void - label: string - subtext?: string - error?: string - labelProps?: StyleProp - inputProps?: StyleProp - subtextProps?: StyleProp - errorProps?: StyleProp -} - -/** - * An input component which includes a label, input, subtext and error props. - * - * Note: This also includes the equivalent styling props for each section for customization. - * - * @param {InputWithValidationProps} props - Input props - * @returns {*} {JSX.Element} - */ -export const InputWithValidation: React.FC = (props: InputWithValidationProps) => { - const { Inputs, ColorPalette } = useTheme() - - return ( - - - {props.label} - - - { - props.onChange(e.nativeEvent.text) - }} - testID={testIdWithKey(`${props.id}-input`)} - /> - - {props.error ? ( - - {props.error} - - ) : null} - - {props.subtext && !props.error ? ( - - {props.subtext} - - ) : null} - - ) -} diff --git a/app/src/bcsc-theme/components/MaskedCamera.tsx b/app/src/bcsc-theme/components/MaskedCamera.tsx deleted file mode 100644 index 85368b4..0000000 --- a/app/src/bcsc-theme/components/MaskedCamera.tsx +++ /dev/null @@ -1,185 +0,0 @@ -import { MaskType, SVGOverlay, ThemedText, TOKENS, useServices, useTheme } from '@bifold/core' -import { useEffect, useRef, useState } from 'react' -import { Alert, StyleSheet, Text, TouchableOpacity, View } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' -import Icon from 'react-native-vector-icons/MaterialCommunityIcons' -import { Camera, useCameraDevice, useCameraPermission } from 'react-native-vision-camera' - -type MaskedCameraProps = { - navigation: any - cameraFace: 'front' | 'back' - cameraInstructions?: string - cameraLabel?: string - maskType?: MaskType - maskLineColor?: string - onPhotoTaken: (path: string) => void -} - -const MaskedCamera = ({ - navigation, - cameraInstructions, - cameraLabel, - maskLineColor, - maskType, - cameraFace = 'back', - onPhotoTaken, -}: MaskedCameraProps) => { - const device = useCameraDevice(cameraFace) - - const { Spacing, ColorPalette } = useTheme() - const { hasPermission, requestPermission } = useCameraPermission() - const [isActive, setIsActive] = useState(false) - const [torchOn, setTorchOn] = useState(false) - const cameraRef = useRef(null) - const [logger] = useServices([TOKENS.UTIL_LOGGER]) - const hasTorch = device?.hasTorch ?? false - - const styles = StyleSheet.create({ - container: { - flex: 1, - position: 'relative', - }, - camera: { - flex: 1, - }, - controlsContainer: { - flex: 1, - position: 'absolute', - bottom: 30, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - paddingHorizontal: Spacing.lg, - }, - instructionText: { - backgroundColor: 'transparent', - position: 'absolute', - fontWeight: 'normal', - top: Spacing.lg, - left: 0, - right: 0, - zIndex: 5, - paddingHorizontal: Spacing.md, - flex: 1, - justifyContent: 'center', - alignItems: 'center', - }, - captureButton: { - width: 70, - height: 70, - borderRadius: 35, - backgroundColor: 'white', - justifyContent: 'center', - alignItems: 'center', - }, - captureButtonInner: { - width: 64, - height: 64, - borderRadius: 30, - borderWidth: 2, - }, - }) - - useEffect(() => { - const checkPermissions = async () => { - if (!hasPermission) { - const permission = await requestPermission() - if (!permission) { - Alert.alert('Camera Permission Required', 'Please enable camera permission to take a photo.', [ - { text: 'OK', onPress: () => navigation.goBack() }, - ]) - return - } - } - } - - checkPermissions() - }, [hasPermission, requestPermission, navigation]) - - const toggleTorch = () => setTorchOn((prev: boolean) => !prev) - - if (!hasPermission) { - return ( - - - Camera permission required - - - ) - } - - if (!device) { - return ( - - - {`No ${device} camera available`} - - - ) - } - - const handleCancel = () => { - navigation.goBack() - } - const onError = (error: any) => { - logger.error(`Camera error: ${error}`) - Alert.alert('Camera Error', 'An error occurred while using the camera. Please try again.') - } - - const takePhoto = async () => { - try { - if (cameraRef.current && isActive) { - const photo = await cameraRef.current.takePhoto({ - flash: 'off', - }) - - onPhotoTaken(photo.path) - logger.info(`Photo taken and saved temporarily: ${photo.path}`) - } - } catch (error) { - logger.error(`Error taking photo: ${error}`) - Alert.alert('Error', 'Failed to take photo. Please try again.') - } - } - - return ( - - setIsActive(true)} - onError={onError} - torch={torchOn ? 'on' : 'off'} - /> - - - - {cameraLabel} - - - {cameraInstructions} - - - - - Cancel - - - - - {hasTorch ? ( - - - - ) : ( - - )} - - - ) -} - -export default MaskedCamera diff --git a/app/src/bcsc-theme/components/PhotoReview.tsx b/app/src/bcsc-theme/components/PhotoReview.tsx deleted file mode 100644 index 613099a..0000000 --- a/app/src/bcsc-theme/components/PhotoReview.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { Button, ButtonType, testIdWithKey, useAnimatedComponents, useTheme } from '@bifold/core' -import React, { useState } from 'react' -import { Image, StyleSheet, View } from 'react-native' - -type PhotoReviewProps = { - photoPath: string - onAccept: () => Promise - onRetake: () => void -} - -const PhotoReview: React.FC = ({ photoPath, onAccept, onRetake }) => { - const { ColorPalette, Spacing } = useTheme() - const [loading, setLoading] = useState(false) - const { ButtonLoading } = useAnimatedComponents() - - const styles = StyleSheet.create({ - contentContainer: { - flexGrow: 1, - }, - controlsContainer: { - position: 'absolute', - bottom: 0, - left: 0, - right: 0, - padding: Spacing.md, - backgroundColor: ColorPalette.notification.popupOverlay, - }, - secondButton: { - marginTop: Spacing.sm, - }, - }) - - const handleAccept = async () => { - try { - setLoading(true) - await onAccept() - } finally { - setLoading(false) - } - } - return ( - - - - - - - - - - ) -} - -export default ManualPairing diff --git a/app/src/bcsc-theme/features/pairing/PairingConfirmation.tsx b/app/src/bcsc-theme/features/pairing/PairingConfirmation.tsx deleted file mode 100644 index ba2378e..0000000 --- a/app/src/bcsc-theme/features/pairing/PairingConfirmation.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { BCSCRootStackParams, BCSCScreens, BCSCStacks } from '@/bcsc-theme/types/navigators' -import { useTheme, ThemedText, Button, ButtonType, testIdWithKey } from '@bifold/core' -import { StackScreenProps } from '@react-navigation/stack' -import React from 'react' -import { StyleSheet, View } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' -import ServiceBookmarkButton from './components/ServiceBookmarkButton' -import { useTranslation } from 'react-i18next' -import { CommonActions } from '@react-navigation/native' - -type ManualPairingProps = StackScreenProps - -const ManualPairing: React.FC = ({ navigation, route }) => { - const { Spacing } = useTheme() - const { t } = useTranslation() - const { serviceName, serviceId } = route.params - - const styles = StyleSheet.create({ - container: { - flex: 1, - padding: Spacing.md, - justifyContent: 'space-between', - }, - contentContainer: { - flex: 1, - }, - controlsContainer: { - marginTop: 'auto', - }, - }) - - const onClose = () => { - navigation.dispatch( - CommonActions.reset({ - index: 0, - routes: [{ name: BCSCStacks.TabStack }], - }) - ) - } - - return ( - - - {"You're done in this app"} - - Go back to the device you started on to continue logging in to {serviceName}. - - - - - - - - ) -} - -export default EnterBirthdateScreen diff --git a/app/src/bcsc-theme/features/verify/IdentitySelectionScreen.tsx b/app/src/bcsc-theme/features/verify/IdentitySelectionScreen.tsx deleted file mode 100644 index 0a6cd0a..0000000 --- a/app/src/bcsc-theme/features/verify/IdentitySelectionScreen.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import { ThemedText, useStore, useTheme } from '@bifold/core' -import { useCallback, useMemo } from 'react' -import { useTranslation } from 'react-i18next' -import { Image, Pressable, ScrollView, StyleSheet, View, useWindowDimensions } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' -import Icon from 'react-native-vector-icons/MaterialCommunityIcons' - -import { BCSCScreens, BCSCVerifyIdentityStackParams } from '@/bcsc-theme/types/navigators' -import { BCDispatchAction, BCState } from '@/store' -import ComboCardImage from '@assets/img/combo_card.png' -import NoPhotoCardImage from '@assets/img/no_photo_card.png' -import PhotoCardImage from '@assets/img/photo_card.png' -import { StackNavigationProp } from '@react-navigation/stack' -import TileButton, { TileButtonProps } from '../../components/TileButton' -import { BCSCCardType } from '../../types/cards' - -const COMBO_CARD = Image.resolveAssetSource(ComboCardImage).uri -const PHOTO_CARD = Image.resolveAssetSource(PhotoCardImage).uri -const NO_PHOTO_CARD = Image.resolveAssetSource(NoPhotoCardImage).uri - -type IdentitySelectionScreenProps = { - navigation: StackNavigationProp -} - -const IdentitySelectionScreen: React.FC = ({ - navigation, -}: IdentitySelectionScreenProps) => { - const { t } = useTranslation() - const { ColorPalette, Spacing } = useTheme() - const [, dispatch] = useStore() - const { width } = useWindowDimensions() - - const styles = StyleSheet.create({ - scrollView: { - flex: 1, - paddingHorizontal: Spacing.md, - backgroundColor: ColorPalette.brand.primaryBackground, - }, - heading: { - marginTop: Spacing.md, - marginBottom: Spacing.sm, - }, - description: { - marginBottom: Spacing.md, - }, - pageBreakSlot: { - position: 'relative', - flex: 1, - height: 8, - marginTop: 8, - }, - pageBreak: { - position: 'absolute', - width, - height: 8, - backgroundColor: ColorPalette.brand.secondaryBackground, - left: -Spacing.md, - }, - checkButton: { - marginVertical: Spacing.md, - flexWrap: 'wrap', - flex: 1, - }, - checkButtonText: { - color: ColorPalette.brand.primary, - }, - }) - - const onPressCombinedCard = useCallback(() => { - dispatch({ type: BCDispatchAction.UPDATE_CARD_TYPE, payload: [BCSCCardType.Combined] }) - navigation.navigate(BCSCScreens.SerialInstructions) - }, [dispatch, navigation]) - - const onPressPhotoCard = useCallback(() => { - dispatch({ type: BCDispatchAction.UPDATE_CARD_TYPE, payload: [BCSCCardType.Photo] }) - navigation.navigate(BCSCScreens.SerialInstructions) - }, [dispatch, navigation]) - - const onPressNoPhotoCard = useCallback(() => { - dispatch({ type: BCDispatchAction.UPDATE_CARD_TYPE, payload: [BCSCCardType.NonPhoto] }) - navigation.navigate(BCSCScreens.SerialInstructions) - }, [dispatch, navigation]) - - const onCheckForServicesCard = useCallback(() => { - // TODO: Implement - }, []) - - const onPressOtherID = useCallback(() => { - dispatch({ type: BCDispatchAction.UPDATE_CARD_TYPE, payload: [BCSCCardType.Other] }) - navigation.navigate(BCSCScreens.DualIdentificationRequired) - }, [dispatch, navigation]) - - const cardButtons = useMemo(() => { - return ( - [ - { - onPress: onPressCombinedCard, - testIDKey: 'CombinedCard', - accessibilityLabel: t('Unified.ChooseYourID.CombinedCard'), - actionText: t('Unified.ChooseYourID.CombinedCardActionText'), - description: t('Unified.ChooseYourID.CombinedCardDescription'), - imgSrc: { uri: COMBO_CARD }, - style: { marginBottom: Spacing.md }, - }, - { - onPress: onPressPhotoCard, - testIDKey: 'PhotoCard', - accessibilityLabel: t('Unified.ChooseYourID.PhotoCard'), - actionText: t('Unified.ChooseYourID.PhotoCardActionText'), - description: t('Unified.ChooseYourID.PhotoCardDescription'), - imgSrc: { uri: PHOTO_CARD }, - style: { marginBottom: Spacing.md }, - }, - { - onPress: onPressNoPhotoCard, - testIDKey: 'NoPhotoCard', - accessibilityLabel: t('Unified.ChooseYourID.NoPhotoCard'), - actionText: t('Unified.ChooseYourID.NoPhotoCardActionText'), - description: t('Unified.ChooseYourID.NoPhotoCardDescription'), - imgSrc: { uri: NO_PHOTO_CARD }, - style: { marginBottom: Spacing.md }, - }, - ] as TileButtonProps[] - ).map((props, i) => ) - }, [onPressCombinedCard, onPressPhotoCard, onPressNoPhotoCard, t, Spacing]) - - return ( - - - - {t('Unified.ChooseYourID.WhatCardDoYou')} - - {t('Unified.ChooseYourID.SomePeopleStillCallIt')} - {cardButtons} - - - - - {t('Unified.ChooseYourID.DontHaveOne')} - - {t('Unified.ChooseYourID.CheckBefore')} - - - {t('Unified.ChooseYourID.CheckIfIHave') + ' '} - - - - - - - ) -} - -export default IdentitySelectionScreen diff --git a/app/src/bcsc-theme/features/verify/ManualSerialScreen.tsx b/app/src/bcsc-theme/features/verify/ManualSerialScreen.tsx deleted file mode 100644 index 819737e..0000000 --- a/app/src/bcsc-theme/features/verify/ManualSerialScreen.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { - Button, - ButtonType, - KeyboardView, - LimitedTextInput, - testIdWithKey, - ThemedText, - useStore, - useTheme, -} from '@bifold/core' -import React, { useCallback, useState } from 'react' -import { useTranslation } from 'react-i18next' -import { Image, StyleSheet, useWindowDimensions, View } from 'react-native' - -import { BCDispatchAction, BCState } from '@/store' -import { StackNavigationProp } from '@react-navigation/stack' -import { BCSCScreens, BCSCVerifyIdentityStackParams } from '@/bcsc-theme/types/navigators' -import SerialHighlightImage from '@assets/img/highlight_serial_barcode.png' - -const SERIAL_HIGHLIGHT_IMAGE = Image.resolveAssetSource(SerialHighlightImage).uri - -const twoThirds = 0.67 -const maxSerialNumberLength = 15 - -type ErrorState = { - visible: boolean - description: string -} - -type ManualSerialScreenProps = { - navigation: StackNavigationProp -} - -const ManualSerialScreen: React.FC = ({ navigation }: ManualSerialScreenProps) => { - const { t } = useTranslation() - const { ColorPalette, Spacing } = useTheme() - const [store, dispatch] = useStore() - const [serial, setSerial] = useState(store.bcsc.serial ?? '') - const { width } = useWindowDimensions() - const [errorState, setErrorState] = useState({ - visible: false, - description: '', - }) - - const styles = StyleSheet.create({ - screenContainer: { - flex: 1, - backgroundColor: ColorPalette.brand.primaryBackground, - padding: Spacing.md, - justifyContent: 'space-between', - }, - contentContainer: { - flexDirection: 'column', - }, - image: { - width: width - Spacing.md * 2, - height: (width - Spacing.md * 2) * twoThirds, - marginBottom: Spacing.md, - }, - error: { - color: ColorPalette.semantic.error, - marginBottom: Spacing.sm, - }, - - // below used as helpful label for view, no properties needed atp - controlsContainer: {}, - - buttonContainer: { - width: '100%', - }, - }) - - const handleChangeText = useCallback((text: string) => { - setSerial(text.replace(/\s/g, '')) - }, []) - - const onContinuePressed = useCallback(() => { - if (serial.length < 1) { - setErrorState({ - description: t('Unified.ManualSerial.EmptySerialError'), - visible: true, - }) - return - } - - if (serial.length > maxSerialNumberLength) { - setErrorState({ - description: t('Unified.ManualSerial.CharCountError'), - visible: true, - }) - return - } - - dispatch({ type: BCDispatchAction.UPDATE_SERIAL, payload: [serial] }) - navigation.navigate(BCSCScreens.EnterBirthdate) - }, [serial, t, dispatch, navigation]) - - return ( - - - - - - {errorState.visible ? ( - - {errorState.description} - - ) : null} - {t('Unified.ManualSerial.InputSubText')} - - - - - - - - - - {cardType !== BCSCCardType.Other ? ( - - - - - Card serial number: {store.bcsc.serial ?? store.bcsc.additionalEvidenceData[0]?.documentNumber ?? 'N/A'} - - - - ) -} -export default VerifyInPersonScreen diff --git a/app/src/bcsc-theme/features/verify/live-call/BeforeYouCallScreen.tsx b/app/src/bcsc-theme/features/verify/live-call/BeforeYouCallScreen.tsx deleted file mode 100644 index f39125f..0000000 --- a/app/src/bcsc-theme/features/verify/live-call/BeforeYouCallScreen.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { BCSCScreens, BCSCVerifyIdentityStackParams } from '@bcsc-theme/types/navigators' -import { Button, ButtonType, testIdWithKey, ThemedText, useTheme } from '@bifold/core' -import { useNetInfo } from '@react-native-community/netinfo' -import { RouteProp } from '@react-navigation/native' -import { StackNavigationProp } from '@react-navigation/stack' -import { useMemo } from 'react' -import { useTranslation } from 'react-i18next' -import { ScrollView, StyleSheet, View } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' - -type BeforeYouCallScreenProps = { - navigation: StackNavigationProp - route: RouteProp -} - -const BeforeYouCallScreen = ({ navigation, route }: BeforeYouCallScreenProps) => { - const { ColorPalette, Spacing } = useTheme() - const { type: networkType, isConnected } = useNetInfo() - const { t } = useTranslation() - const { formattedHours } = route.params || {} - - // Use the passed formatted hours or fallback to default - const hoursText = formattedHours || 'Monday to Friday\n7:30am - 5:00pm Pacific Time' - const isCellular = useMemo(() => networkType === 'cellular' && isConnected === true, [networkType, isConnected]) - - const styles = StyleSheet.create({ - pageContainer: { - flex: 1, - justifyContent: 'space-between', - backgroundColor: ColorPalette.brand.primaryBackground, - padding: Spacing.md, - }, - contentContainer: { - flexGrow: 1, - }, - controlsContainer: { - gap: Spacing.sm, - marginTop: Spacing.md, - }, - }) - - const onPressContinue = async () => { - navigation.navigate(BCSCScreens.TakePhoto, { - forLiveCall: true, - deviceSide: 'front', - cameraInstructions: '', - cameraLabel: '', - }) - } - - const onPressAssistance = () => { - // TODO (bm): webview or external link here presumeably - } - - return ( - - - - {t('Unified.VideoCall.BeforeYouCallTitle')} - - {t('Unified.VideoCall.WiFiRecommended')} - - {isCellular ? t('Unified.VideoCall.CellularNetworkWarning') : ''} - {t('Unified.VideoCall.StandardDataCharges')} - - - - {t('Unified.VideoCall.FindPrivatePlace')} - - {t('Unified.VideoCall.MakeSureOnlyYou')} - - - {t('Unified.VideoCall.HoursOfService')} - - {hoursText} - - {t('Unified.VideoCall.ContactCentrePrivacy')} - - {t(`Unified.VideoCall.PrivacyNotice`)} - {t(`Unified.VideoCall.PrivacyContactInfo`)} - - - - - {t('Unified.VideoCall.VerifyNotComplete.TroubleshootingTips')} - - - - - - - ) -} - -export default InformationRequiredScreen diff --git a/app/src/bcsc-theme/features/verify/send-video/PendingReviewScreen.tsx b/app/src/bcsc-theme/features/verify/send-video/PendingReviewScreen.tsx deleted file mode 100644 index 1450687..0000000 --- a/app/src/bcsc-theme/features/verify/send-video/PendingReviewScreen.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { BCSCScreens, BCSCVerifyIdentityStackParams } from '@/bcsc-theme/types/navigators' -import { Button, ButtonType, testIdWithKey, ThemedText, useTheme } from '@bifold/core' -import { StackNavigationProp } from '@react-navigation/stack' -import { StyleSheet, View } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' - -type PendingReviewScreenProps = { - navigation: StackNavigationProp -} - -const PendingReviewScreen = ({ navigation }: PendingReviewScreenProps) => { - const { ColorPalette, Spacing } = useTheme() - - const styles = StyleSheet.create({ - pageContainer: { - flex: 1, - justifyContent: 'space-between', - backgroundColor: ColorPalette.brand.primaryBackground, - padding: Spacing.md, - }, - contentContainer: { - flex: 1, - }, - bulletContainer: { - flexDirection: 'row', - marginBottom: Spacing.md, - }, - bullet: { - marginRight: Spacing.xs, - }, - controlsContainer: { - marginTop: 'auto', - }, - }) - - return ( - - - {`Request pending review`} - {`We review requests:`} - - {'\u2022'} - Monday to Friday, 9am to 5pm - - - {'\u2022'} - In the order they're received - - - Usually, we review requests within 2 business days. During busy periods, it may take longer. - - - After it's reviewed, you will get an email if your provided your email. - - Do not resend your video. If you do, your request will go to the back of the queue. - - - - -