From 5cd08fedcb4debabd42d44ebd695e2a76197fb67 Mon Sep 17 00:00:00 2001 From: Martin Auer Date: Fri, 30 Aug 2024 11:04:20 +0200 Subject: [PATCH 1/3] fix: auth code flow alpha --- .../OpenId4VciHolderService.ts | 40 ++- .../OpenId4VcIssuerService.ts | 111 ++++++- .../OpenId4VcIssuerServiceOptions.ts | 23 +- .../repository/OpenId4VcCNonceStateManager.ts | 19 +- ...Id4VcCredentialOfferSessionStateManager.ts | 89 +++--- .../OpenId4VcIssuanceSessionRecord.ts | 9 + .../repository/OpenId4VcIssuerRecord.ts | 9 +- .../router/accessTokenEndpoint.ts | 271 +++++++++++++++--- .../router/credentialEndpoint.ts | 30 +- .../router/metadataEndpoint.ts | 4 +- .../router/verifyAccessToken.ts | 25 +- .../src/shared/models/AuthorizationServer.ts | 4 + packages/openid4vc/src/shared/models/index.ts | 6 +- 13 files changed, 513 insertions(+), 127 deletions(-) create mode 100644 packages/openid4vc/src/shared/models/AuthorizationServer.ts diff --git a/packages/openid4vc/src/openid4vc-holder/OpenId4VciHolderService.ts b/packages/openid4vc/src/openid4vc-holder/OpenId4VciHolderService.ts index 6c25997df5..dfd03d93b5 100644 --- a/packages/openid4vc/src/openid4vc-holder/OpenId4VciHolderService.ts +++ b/packages/openid4vc/src/openid4vc-holder/OpenId4VciHolderService.ts @@ -165,9 +165,11 @@ export class OpenId4VciHolderService { authCodeFlowOptions: OpenId4VciAuthCodeFlowOptions ): Promise { const { credentialOfferPayload, metadata, offeredCredentials } = resolvedCredentialOffer + const codeVerifier = ( - await Promise.allSettled([agentContext.wallet.generateNonce(), agentContext.wallet.generateNonce()]) - ).join() + await Promise.all([agentContext.wallet.generateNonce(), agentContext.wallet.generateNonce()]) + ).join('') + const codeVerifierSha256 = Hasher.hash(codeVerifier, 'sha-256') const codeChallenge = TypedArrayEncoder.toBase64URL(codeVerifierSha256) @@ -178,13 +180,13 @@ export class OpenId4VciHolderService { }) const authDetailsLocation = metadata.credentialIssuerMetadata.authorization_server - ? metadata.credentialIssuerMetadata.authorization_server - : undefined + const authDetails = offeredCredentials .map((credential) => this.getAuthDetailsFromOfferedCredential(credential, authDetailsLocation)) .filter((authDetail): authDetail is AuthorizationDetails => authDetail !== undefined) const { clientId, redirectUri, scope } = authCodeFlowOptions + const authorizationRequestUri = await createAuthorizationRequestUri({ clientId, codeChallenge, @@ -256,6 +258,7 @@ export class OpenId4VciHolderService { code, codeVerifier, redirectUri, + asOpts: { clientId: resolvedAuthorizationRequestWithCode.clientId }, }) } else { accessTokenResponse = await accessTokenClient.acquireAccessToken({ @@ -642,8 +645,21 @@ async function createAuthorizationRequestUri(options: { authDetails?: AuthorizationDetails | AuthorizationDetails[] redirectUri: string scope?: string[] + userHint?: string + walletIssuer?: string }) { - const { scope, authDetails, metadata, clientId, codeChallenge, codeChallengeMethod, redirectUri } = options + const { + scope, + authDetails, + metadata, + clientId, + codeChallenge, + codeChallengeMethod, + redirectUri, + userHint, + walletIssuer, + } = options + let nonEmptyScope = !scope || scope.length === 0 ? undefined : scope const nonEmptyAuthDetails = !authDetails || authDetails.length === 0 ? undefined : authDetails @@ -655,9 +671,13 @@ async function createAuthorizationRequestUri(options: { // Authorization servers supporting PAR SHOULD include the URL of their pushed authorization request endpoint in their authorization server metadata document // Note that the presence of pushed_authorization_request_endpoint is sufficient for a client to determine that it may use the PAR flow. - const parEndpoint = metadata.credentialIssuerMetadata.pushed_authorization_request_endpoint + const parEndpoint = + metadata.credentialIssuerMetadata.pushed_authorization_request_endpoint ?? + metadata.authorizationServerMetadata?.pushed_authorization_request_endpoint - const authorizationEndpoint = metadata.credentialIssuerMetadata?.authorization_endpoint + const authorizationEndpoint = + metadata.credentialIssuerMetadata?.authorization_endpoint ?? + metadata.authorizationServerMetadata?.authorization_endpoint if (!authorizationEndpoint && !parEndpoint) { throw new CredoError( @@ -680,8 +700,12 @@ async function createAuthorizationRequestUri(options: { if (nonEmptyScope) queryObj['scope'] = nonEmptyScope.join(' ') - if (nonEmptyAuthDetails) + if (nonEmptyAuthDetails) { queryObj['authorization_details'] = JSON.stringify(handleAuthorizationDetails(nonEmptyAuthDetails, metadata)) + } + + if (userHint) queryObj['user_hint'] = userHint + if (walletIssuer) queryObj['wallet_issuer'] = walletIssuer const issuerState = options.credentialOffer.grants?.authorization_code?.issuer_state if (issuerState) queryObj['issuer_state'] = issuerState diff --git a/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerService.ts b/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerService.ts index e70a8ad324..c7e40c5ff4 100644 --- a/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerService.ts +++ b/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerService.ts @@ -6,6 +6,7 @@ import type { OpenId4VcIssuerMetadata, OpenId4VciSignSdJwtCredential, OpenId4VciSignW3cCredential, + OpenId4VciAuthorizationCodeFlowConfig, } from './OpenId4VcIssuerServiceOptions' import type { OpenId4VcIssuanceSessionRecord } from './repository' import type { @@ -94,7 +95,11 @@ export class OpenId4VcIssuerService { agentContext: AgentContext, options: OpenId4VciCreateCredentialOfferOptions & { issuer: OpenId4VcIssuerRecord } ) { - const { preAuthorizedCodeFlowConfig, issuer, offeredCredentials } = options + const { preAuthorizedCodeFlowConfig, authorizationCodeFlowConfig, issuer, offeredCredentials } = options + + if (!preAuthorizedCodeFlowConfig && !authorizationCodeFlowConfig) { + throw new CredoError('Authorization Config or Pre-Authorized Config must be provided.') + } const vcIssuer = this.getVcIssuer(agentContext, issuer) @@ -114,8 +119,37 @@ export class OpenId4VcIssuerService { utils.uuid(), ]) + // TODO: HAIP + // TODO: for grant type authorization_code, the issuer must include a scope value in order to allow the wallet to identify the desired credential type. + // TODO: The wallet MUST use that value in the scope Authorization parameter. + // TODO: add support for scope in the credential offer in sphereon-oid4vci + const issuerMetadata = this.getIssuerMetadata(agentContext, issuer) + + if ( + authorizationCodeFlowConfig && + (issuerMetadata.authorizationServers?.length ?? 0 > 1) && + authorizationCodeFlowConfig?.authorizationServerUrl + ) { + throw new CredoError( + 'The authorization code flow requires an explicit authorization server url, if multiple authorization servers are present.' + ) + } + let { uri } = await vcIssuer.createCredentialOfferURI({ - grants: await this.getGrantsFromConfig(agentContext, preAuthorizedCodeFlowConfig), + grants: await this.getGrantsFromConfig(agentContext, { + preAuthorizedCodeFlowConfig, + authorizationCodeFlowConfig: authorizationCodeFlowConfig + ? { + ...authorizationCodeFlowConfig, + + // Must only be used if multiple authorization servers are present + authorizationServerUrl: + issuerMetadata.authorizationServers?.length ?? 0 > 1 + ? authorizationCodeFlowConfig?.authorizationServerUrl + : undefined, + } + : undefined, + }), credentials: offeredCredentials, credentialOfferUri: hostedCredentialOfferUri, baseUri: options.baseUri, @@ -239,17 +273,35 @@ export class OpenId4VcIssuerService { } public async createIssuer(agentContext: AgentContext, options: OpenId4VciCreateIssuerOptions) { + const { authorizationServerConfigs: authorizationServers, issuerId, display } = options // TODO: ideally we can store additional data with a key, such as: // - createdAt // - purpose const accessTokenSignerKey = await agentContext.wallet.createKey({ keyType: KeyType.Ed25519, }) + + // If we have an authorization server, we also want to publish a scope to request each credential + // this is required for HAIP + const credentialsSupported = options.credentialsSupported.map((credentialSupported) => { + return { + ...credentialSupported, + // TODO: do we also need to provide some way to let the wallet know which authorization server + // TODO: can issue which credentials? + scope: credentialSupported.scope + ? credentialSupported.scope + : authorizationServers?.length ?? 0 > 0 + ? credentialSupported.id + : undefined, + } + }) + const openId4VcIssuer = new OpenId4VcIssuerRecord({ - issuerId: options.issuerId ?? utils.uuid(), - display: options.display, + issuerId: issuerId ?? utils.uuid(), + display: display, accessTokenPublicKeyFingerprint: accessTokenSignerKey.fingerprint, - credentialsSupported: options.credentialsSupported, + credentialsSupported, + authorizationServerConfigs: authorizationServers, }) await this.openId4VcIssuerRepository.save(agentContext, openId4VcIssuer) @@ -271,12 +323,22 @@ export class OpenId4VcIssuerService { const config = agentContext.dependencyManager.resolve(OpenId4VcIssuerModuleConfig) const issuerUrl = joinUriParts(config.baseUrl, [issuerRecord.issuerId]) + const authorizationServers = + issuerRecord.authorizationServerConfigs && issuerRecord.authorizationServerConfigs.length > 0 + ? issuerRecord.authorizationServerConfigs.map((authorizationServer) => authorizationServer.baseUrl) + : undefined + + const tokenEndpoint = authorizationServers + ? undefined + : joinUriParts(issuerUrl, [config.accessTokenEndpoint.endpointPath]) + const issuerMetadata = { issuerUrl, - tokenEndpoint: joinUriParts(issuerUrl, [config.accessTokenEndpoint.endpointPath]), + tokenEndpoint, credentialEndpoint: joinUriParts(issuerUrl, [config.credentialEndpoint.endpointPath]), credentialsSupported: issuerRecord.credentialsSupported, issuerDisplay: issuerRecord.display, + authorizationServers, } satisfies OpenId4VcIssuerMetadata return issuerMetadata @@ -323,7 +385,6 @@ export class OpenId4VcIssuerService { const builder = new VcIssuerBuilder() .withCredentialIssuer(issuerMetadata.issuerUrl) .withCredentialEndpoint(issuerMetadata.credentialEndpoint) - .withTokenEndpoint(issuerMetadata.tokenEndpoint) .withCredentialsSupported(issuerMetadata.credentialsSupported) .withCNonceStateManager(new OpenId4VcCNonceStateManager(agentContext, issuer.issuerId)) .withCredentialOfferStateManager(new OpenId4VcCredentialOfferSessionStateManager(agentContext, issuer.issuerId)) @@ -333,8 +394,14 @@ export class OpenId4VcIssuerService { throw new CredoError('Credential signer callback should be overwritten. This is a no-op') }) - if (issuerMetadata.authorizationServer) { - builder.withAuthorizationServer(issuerMetadata.authorizationServer) + if (issuerMetadata.authorizationServers) { + // TODO: add support for multiple authorization servers + builder.withAuthorizationServer(issuerMetadata.authorizationServers[0]) + } else { + if (!issuerMetadata.tokenEndpoint) { + throw new CredoError('Missing required token endpoint. No authorization server is set.') + } + builder.withTokenEndpoint(issuerMetadata.tokenEndpoint) } if (issuerMetadata.issuerDisplay) { @@ -346,14 +413,28 @@ export class OpenId4VcIssuerService { private async getGrantsFromConfig( agentContext: AgentContext, - preAuthorizedCodeFlowConfig: OpenId4VciPreAuthorizedCodeFlowConfig + config: { + preAuthorizedCodeFlowConfig?: OpenId4VciPreAuthorizedCodeFlowConfig + authorizationCodeFlowConfig?: OpenId4VciAuthorizationCodeFlowConfig + } ) { + const { preAuthorizedCodeFlowConfig, authorizationCodeFlowConfig } = config + const grants: Grant = { - 'urn:ietf:params:oauth:grant-type:pre-authorized_code': { - 'pre-authorized_code': - preAuthorizedCodeFlowConfig.preAuthorizedCode ?? (await agentContext.wallet.generateNonce()), - user_pin_required: preAuthorizedCodeFlowConfig.userPinRequired ?? false, - }, + ...(preAuthorizedCodeFlowConfig && { + 'urn:ietf:params:oauth:grant-type:pre-authorized_code': { + 'pre-authorized_code': + preAuthorizedCodeFlowConfig.preAuthorizedCode ?? (await agentContext.wallet.generateNonce()), + user_pin_required: preAuthorizedCodeFlowConfig.userPinRequired ?? false, + }, + }), + + ...(authorizationCodeFlowConfig && { + authorization_code: { + issuer_state: authorizationCodeFlowConfig.issuerState, + authorization_server: authorizationCodeFlowConfig.authorizationServerUrl, + }, + }), } return grants diff --git a/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerServiceOptions.ts b/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerServiceOptions.ts index 5775d01f63..c9341be76b 100644 --- a/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerServiceOptions.ts +++ b/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerServiceOptions.ts @@ -7,6 +7,7 @@ import type { OpenId4VciCredentialSupportedWithId, OpenId4VciIssuerMetadataDisplay, } from '../shared' +import type { OpenId4VciAuthorizationServerConfig } from '../shared/models/AuthorizationServer' import type { AgentContext, ClaimFormat, W3cCredential, SdJwtVcSignOptions } from '@credo-ts/core' export interface OpenId4VciPreAuthorizedCodeFlowConfig { @@ -14,15 +15,26 @@ export interface OpenId4VciPreAuthorizedCodeFlowConfig { userPinRequired?: boolean } +export interface OpenId4VciAuthorizationCodeFlowConfig { + // OPTIONAL. String value created by the Credential Issuer and opaque to the Wallet + // that is used to bind the subsequent Authorization Request with the Credential Issuer + // to a context set up during previous steps. + issuerState?: string + + // OPTIONAL string that the Wallet can use to identify the Authorization Server to use with this grant + // type when authorization_servers parameter in the Credential Issuer metadata has multiple entries. + authorizationServerUrl?: string +} + export type OpenId4VcIssuerMetadata = { // The Credential Issuer's identifier. (URL using the https scheme) issuerUrl: string credentialEndpoint: string - tokenEndpoint: string - authorizationServer?: string + tokenEndpoint?: string + authorizationServers?: string[] issuerDisplay?: OpenId4VciIssuerMetadataDisplay[] - credentialsSupported: OpenId4VciCredentialSupported[] + credentialsSupported: OpenId4VciCredentialSupportedWithId[] } export interface OpenId4VciCreateCredentialOfferOptions { @@ -37,7 +49,9 @@ export interface OpenId4VciCreateCredentialOfferOptions { */ baseUri?: string - preAuthorizedCodeFlowConfig: OpenId4VciPreAuthorizedCodeFlowConfig + preAuthorizedCodeFlowConfig?: OpenId4VciPreAuthorizedCodeFlowConfig + + authorizationCodeFlowConfig?: OpenId4VciAuthorizationCodeFlowConfig /** * Metadata about the issuance, that will be stored in the issuance session record and @@ -123,4 +137,5 @@ export interface OpenId4VciCreateIssuerOptions { credentialsSupported: OpenId4VciCredentialSupportedWithId[] display?: OpenId4VciIssuerMetadataDisplay[] + authorizationServerConfigs?: OpenId4VciAuthorizationServerConfig[] } diff --git a/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcCNonceStateManager.ts b/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcCNonceStateManager.ts index 7473719435..c0cadd0a9c 100644 --- a/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcCNonceStateManager.ts +++ b/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcCNonceStateManager.ts @@ -1,4 +1,6 @@ -import type { AgentContext } from '@credo-ts/core' +import type { OpenId4VcIssuanceCodeType } from './OpenId4VcCredentialOfferSessionStateManager' +import type { OpenId4VcIssuanceSessionRecord } from './OpenId4VcIssuanceSessionRecord' +import type { AgentContext, Query } from '@credo-ts/core' import type { CNonceState, IStateManager } from '@sphereon/oid4vci-common' import { CredoError } from '@credo-ts/core' @@ -16,21 +18,26 @@ export class OpenId4VcCNonceStateManager implements IStateManager { this.openId4VcIssuerModuleConfig = agentContext.dependencyManager.resolve(OpenId4VcIssuerModuleConfig) } - public async set(cNonce: string, stateValue: CNonceState): Promise { + public async set(cNonce: string, stateValue: CNonceState, type?: OpenId4VcIssuanceCodeType): Promise { // Just to make sure that the cNonce is the same as the id as that's what we use to query if (cNonce !== stateValue.cNonce) { throw new CredoError('Expected the id of the cNonce state to be equal to the cNonce') } - if (!stateValue.preAuthorizedCode) { - throw new CredoError("Expected the stateValue to have a 'preAuthorizedCode' property") + if (!stateValue.preAuthorizedCode && !stateValue.issuerState) { + throw new CredoError("Expected the stateValue to have a 'preAuthorizedCode' or 'issuerState' property") } // Record MUST exist (otherwise there's no issuance session active yet) + + const $or: Query[] = [] + + if (!type || type === 'preAuthorized') $or.push({ preAuthorizedCode: stateValue.preAuthorizedCode }) + if (!type || type === 'issuerState') $or.push({ issuerState: stateValue.issuerState }) + const record = await this.openId4VcIssuanceSessionRepository.getSingleByQuery(this.agentContext, { - // NOTE: once we support authorized flow, we need to add an $or for the issuer state as well issuerId: this.issuerId, - preAuthorizedCode: stateValue.preAuthorizedCode, + $or, }) // cNonce already matches, no need to update diff --git a/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcCredentialOfferSessionStateManager.ts b/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcCredentialOfferSessionStateManager.ts index 83cd20d27e..f2463ba68b 100644 --- a/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcCredentialOfferSessionStateManager.ts +++ b/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcCredentialOfferSessionStateManager.ts @@ -1,5 +1,5 @@ import type { OpenId4VcIssuanceSessionStateChangedEvent } from '../OpenId4VcIssuerEvents' -import type { AgentContext } from '@credo-ts/core' +import type { AgentContext, Query } from '@credo-ts/core' import type { CredentialOfferSession, IStateManager } from '@sphereon/oid4vci-common' import { CredoError, EventEmitter } from '@credo-ts/core' @@ -11,6 +11,21 @@ import { OpenId4VcIssuerEvents } from '../OpenId4VcIssuerEvents' import { OpenId4VcIssuanceSessionRecord } from './OpenId4VcIssuanceSessionRecord' import { OpenId4VcIssuanceSessionRepository } from './OpenId4VcIssuanceSessionRepository' +export type OpenId4VcIssuanceCodeType = 'preAuthorized' | 'issuerState' + +const createCodeQuery = ( + issuerId: string, + code: string, + type?: OpenId4VcIssuanceCodeType +): Query => { + const $or: Query[] = [] + + if (!type || type === 'preAuthorized') $or.push({ preAuthorizedCode: code }) + if (!type || type === 'issuerState') $or.push({ issuerState: code }) + + return { issuerId, $or } +} + export class OpenId4VcCredentialOfferSessionStateManager implements IStateManager { private openId4VcIssuanceSessionRepository: OpenId4VcIssuanceSessionRepository private eventEmitter: EventEmitter @@ -20,22 +35,31 @@ export class OpenId4VcCredentialOfferSessionStateManager implements IStateManage this.eventEmitter = agentContext.dependencyManager.resolve(EventEmitter) } - public async set(preAuthorizedCode: string, stateValue: CredentialOfferSession): Promise { + public async set(code: string, stateValue: CredentialOfferSession, type?: OpenId4VcIssuanceCodeType): Promise { // Just to make sure that the preAuthorizedCode is the same as the id as that's what we use to query // NOTE: once we support authorized flow, we need to also allow the id to be equal to issuer state - if (preAuthorizedCode !== stateValue.preAuthorizedCode) { - throw new CredoError('Expected the id of the credential offer state to be equal to the preAuthorizedCode') + if ( + (type === 'preAuthorized' && code !== stateValue.preAuthorizedCode) || + (type === 'issuerState' && code !== stateValue.issuerState) + ) { + throw new CredoError(`Expected the id of the credential offer state to be equal to the '${type}'`) } - if (!stateValue.preAuthorizedCode) { - throw new CredoError("Expected the stateValue to have a 'preAuthorizedCode' property") + if (code !== stateValue.issuerState && code !== stateValue.preAuthorizedCode) { + throw new CredoError( + `Expected the id of the credential offer state to be equal to the 'preAuthorizedCode' or 'issuerState'` + ) + } + + if (!stateValue.issuerState && !stateValue.preAuthorizedCode) { + throw new CredoError("Expected the stateValue to have a 'preAuthorizedCode' or 'issuerState' property") } // Record may already exist - let record = await this.openId4VcIssuanceSessionRepository.findSingleByQuery(this.agentContext, { - issuerId: this.issuerId, - preAuthorizedCode: stateValue.preAuthorizedCode, - }) + let record = await this.openId4VcIssuanceSessionRepository.findSingleByQuery( + this.agentContext, + createCodeQuery(this.issuerId, code, type) + ) const previousState = record?.state ?? null @@ -67,6 +91,7 @@ export class OpenId4VcCredentialOfferSessionStateManager implements IStateManage record.credentialOfferPayload = stateValue.credentialOffer.credential_offer record.userPin = stateValue.userPin record.preAuthorizedCode = stateValue.preAuthorizedCode + record.issuerState = stateValue.issuerState record.errorMessage = stateValue.error record.credentialOfferUri = credentialOfferUri record.state = state @@ -75,6 +100,7 @@ export class OpenId4VcCredentialOfferSessionStateManager implements IStateManage record = new OpenId4VcIssuanceSessionRecord({ issuerId: this.issuerId, preAuthorizedCode: stateValue.preAuthorizedCode, + issuerState: stateValue.issuerState, issuanceMetadata: stateValue.credentialDataSupplierInput, credentialOfferPayload: stateValue.credentialOffer.credential_offer, credentialOfferUri, @@ -89,18 +115,16 @@ export class OpenId4VcCredentialOfferSessionStateManager implements IStateManage this.emitStateChangedEvent(this.agentContext, record, previousState) } - public async get(preAuthorizedCode: string): Promise { - const record = await this.openId4VcIssuanceSessionRepository.findSingleByQuery(this.agentContext, { - issuerId: this.issuerId, - preAuthorizedCode, - }) + public async get(code: string, type?: OpenId4VcIssuanceCodeType): Promise { + const record = await this.openId4VcIssuanceSessionRepository.findSingleByQuery( + this.agentContext, + createCodeQuery(this.issuerId, code, type) + ) if (!record) return undefined - // NOTE: This should not happen as we query by the preAuthorizedCode - // so it's mostly to make TS happy - if (!record.preAuthorizedCode) { - throw new CredoError("No 'preAuthorizedCode' found on record.") + if (!record.preAuthorizedCode && !record.issuerState) { + throw new CredoError("No 'preAuthorizedCode' and 'issuerState' found on record.") } if (!record.credentialOfferPayload) { @@ -114,6 +138,7 @@ export class OpenId4VcCredentialOfferSessionStateManager implements IStateManage }, status: sphereonIssueStatusFromOpenId4VcIssuanceState(record.state), preAuthorizedCode: record.preAuthorizedCode, + issuerState: record.issuerState, credentialDataSupplierInput: record.issuanceMetadata, error: record.errorMessage, userPin: record.userPin, @@ -122,20 +147,20 @@ export class OpenId4VcCredentialOfferSessionStateManager implements IStateManage } } - public async has(preAuthorizedCode: string): Promise { - const record = await this.openId4VcIssuanceSessionRepository.findSingleByQuery(this.agentContext, { - issuerId: this.issuerId, - preAuthorizedCode, - }) + public async has(code: string, type?: OpenId4VcIssuanceCodeType): Promise { + const record = await this.openId4VcIssuanceSessionRepository.findSingleByQuery( + this.agentContext, + createCodeQuery(this.issuerId, code, type) + ) return record !== undefined } - public async delete(preAuthorizedCode: string): Promise { - const record = await this.openId4VcIssuanceSessionRepository.findSingleByQuery(this.agentContext, { - issuerId: this.issuerId, - preAuthorizedCode, - }) + public async delete(code: string, type?: OpenId4VcIssuanceCodeType): Promise { + const record = await this.openId4VcIssuanceSessionRepository.findSingleByQuery( + this.agentContext, + createCodeQuery(this.issuerId, code, type) + ) if (!record) return false @@ -153,11 +178,11 @@ export class OpenId4VcCredentialOfferSessionStateManager implements IStateManage throw new Error('Method not implemented.') } - public async getAsserted(preAuthorizedCode: string): Promise { - const state = await this.get(preAuthorizedCode) + public async getAsserted(code: string, type?: OpenId4VcIssuanceCodeType): Promise { + const state = await this.get(code, type) if (!state) { - throw new CredoError(`No credential offer state found for id ${preAuthorizedCode}`) + throw new CredoError(`No credential offer state found for id '${code}'`) } return state diff --git a/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.ts b/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.ts index 3de3af4313..f2e76255b3 100644 --- a/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.ts +++ b/packages/openid4vc/src/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.ts @@ -27,6 +27,7 @@ export interface OpenId4VcIssuanceSessionRecordProps { cNonceExpiresAt?: Date preAuthorizedCode?: string + issuerState?: string userPin?: string credentialOfferUri: string @@ -81,6 +82,12 @@ export class OpenId4VcIssuanceSessionRecord extends BaseRecord { + if (assertedState.credentialOffer?.credential_offer?.grants) { + const validPreAuthorizedGrant = + Object.keys(assertedState.credentialOffer.credential_offer.grants).includes(GrantTypes.PRE_AUTHORIZED_CODE) && + grantType === GrantTypes.PRE_AUTHORIZED_CODE + + const validAuthorizationCodeGrant = + Object.keys(assertedState.credentialOffer.credential_offer.grants).includes(GrantTypes.AUTHORIZATION_CODE) && + grantType === GrantTypes.AUTHORIZATION_CODE + return validAuthorizationCodeGrant || validPreAuthorizedGrant + } + return false +} + +// TODO: Update in Sphereon OID4VCI +export const assertValidAccessTokenRequest = async ( + request: AccessTokenRequest, + opts: { + credentialOfferSessions: IStateManager + expirationDuration: number + } +) => { + const { credentialOfferSessions, expirationDuration } = opts + // Only pre-auth supported for now + if (request.grant_type !== GrantTypes.PRE_AUTHORIZED_CODE && request.grant_type !== GrantTypes.AUTHORIZATION_CODE) { + throw new TokenError(400, TokenErrorResponse.invalid_grant, UNSUPPORTED_GRANT_TYPE_ERROR) + } + + // Pre-auth flow + const preAuthorizedCode = + request.grant_type === GrantTypes.PRE_AUTHORIZED_CODE ? request[PRE_AUTH_CODE_LITERAL] : undefined + const issuerStatus = request.grant_type === GrantTypes.AUTHORIZATION_CODE ? request.issuer_state : undefined + + if (!preAuthorizedCode && !issuerStatus) { + throw new TokenError( + 400, + TokenErrorResponse.invalid_request, + "Either 'pre-authorized_code' or 'authorization_code' is required" + ) + } + + const code = (preAuthorizedCode ?? issuerStatus) as string + + const credentialOfferSession = await credentialOfferSessions.getAsserted(code) + + if (![IssueStatus.OFFER_CREATED, IssueStatus.OFFER_URI_RETRIEVED].includes(credentialOfferSession.status)) { + throw new TokenError(400, TokenErrorResponse.invalid_request, 'Access token has already been retrieved') + } + + credentialOfferSession.status = IssueStatus.ACCESS_TOKEN_REQUESTED + credentialOfferSession.lastUpdatedAt = +new Date() + await credentialOfferSessions.set(code, credentialOfferSession) + + if (!isValidGrant(credentialOfferSession, request.grant_type)) { + throw new TokenError(400, TokenErrorResponse.invalid_grant, UNSUPPORTED_GRANT_TYPE_ERROR) + } + + if (preAuthorizedCode) { + /* + invalid_request: + the Authorization Server expects a PIN in the pre-authorized flow but the client does not provide a PIN + */ + if ( + credentialOfferSession.credentialOffer.credential_offer.grants?.[GrantTypes.PRE_AUTHORIZED_CODE] + ?.user_pin_required && + !request.user_pin + ) { + throw new TokenError(400, TokenErrorResponse.invalid_request, USER_PIN_REQUIRED_ERROR) + } + + /* + invalid_request: + the Authorization Server does not expect a PIN in the pre-authorized flow but the client provides a PIN + */ + if ( + !credentialOfferSession.credentialOffer.credential_offer.grants?.[GrantTypes.PRE_AUTHORIZED_CODE] + ?.user_pin_required && + request.user_pin + ) { + throw new TokenError(400, TokenErrorResponse.invalid_request, USER_PIN_NOT_REQUIRED_ERROR) + } + + /* + invalid_grant: + the Authorization Server expects a PIN in the pre-authorized flow but the client provides the wrong PIN + the End-User provides the wrong Pre-Authorized Code or the Pre-Authorized Code has expired + */ + if (request.user_pin && !/[0-9{,8}]/.test(request.user_pin)) { + throw new TokenError(400, TokenErrorResponse.invalid_grant, PIN_VALIDATION_ERROR) + } else if (request.user_pin !== credentialOfferSession.userPin) { + throw new TokenError(400, TokenErrorResponse.invalid_grant, PIN_NOT_MATCH_ERROR) + } else if (isPreAuthorizedCodeExpired(credentialOfferSession, expirationDuration)) { + throw new TokenError(400, TokenErrorResponse.invalid_grant, EXPIRED_PRE_AUTHORIZED_CODE) + } else if ( + request[PRE_AUTH_CODE_LITERAL] !== + credentialOfferSession.credentialOffer.credential_offer.grants?.[GrantTypes.PRE_AUTHORIZED_CODE]?.[ + PRE_AUTH_CODE_LITERAL + ] + ) { + throw new TokenError(400, TokenErrorResponse.invalid_grant, INVALID_PRE_AUTHORIZED_CODE) + } + return { preAuthSession: credentialOfferSession } + } + + // Authorization code flow + + const authorizationCodeGrant = credentialOfferSession.credentialOffer.credential_offer.grants?.authorization_code + + if (authorizationCodeGrant?.issuer_state !== credentialOfferSession.issuerState) { + throw new TokenError( + 400, + TokenErrorResponse.invalid_request, + 'Issuer state does not match credential offer issuance state' + ) + } + + // TODO: rename to isCodeExpired + if (isPreAuthorizedCodeExpired(credentialOfferSession, expirationDuration)) { + throw new TokenError(400, TokenErrorResponse.invalid_grant, 'Issuer state is expired') + } + + if (!authorizationCodeGrant?.issuer_state || request.issuer_state !== authorizationCodeGrant.issuer_state) { + throw new TokenError(400, TokenErrorResponse.invalid_grant, 'Issuer state is invalid') + } + return { preAuthSession: credentialOfferSession } +} + +// TODO: Update in Sphereon OID4VCI +export interface AccessTokenRequest { + client_id?: string + code?: string + code_verifier?: string + grant_type: GrantTypes + 'pre-authorized_code'?: string + issuer_state?: string + redirect_uri?: string + scope?: string + user_pin?: string +} + +/** + * TODO: create pr to support issuerState in `createAccessTokenResponse` + * Copy from '@sphereon/oid4vci-issuer' + * @param opts + * @returns + */ +export const generateAccessToken = async ( + opts: Required> & { + preAuthorizedCode?: string + issuerState?: string + alg?: Alg + } +): Promise => { + const { accessTokenIssuer, alg, accessTokenSignerCallback, tokenExpiresIn, preAuthorizedCode, issuerState } = opts + // JWT uses seconds for iat and exp + const iat = new Date().getTime() / 1000 + const exp = iat + tokenExpiresIn + const jwt: Jwt = { + header: { typ: 'JWT', alg: alg ?? Alg.ES256K }, + payload: { + iat, + exp, + iss: accessTokenIssuer, + ...(preAuthorizedCode && { preAuthorizedCode }), + ...(issuerState && { issuerState }), + }, + } + return await accessTokenSignerCallback(jwt) +} + export interface OpenId4VciAccessTokenEndpointConfig { /** * The path at which the token endpoint should be made available. Note that it will be @@ -53,7 +238,7 @@ export interface OpenId4VciAccessTokenEndpointConfig { export function configureAccessTokenEndpoint(router: Router, config: OpenId4VciAccessTokenEndpointConfig) { router.post( config.endpointPath, - verifyTokenRequest({ preAuthorizedCodeExpirationInSeconds: config.preAuthorizedCodeExpirationInSeconds }), + verifyTokenRequest({ codeExpirationInSeconds: config.preAuthorizedCodeExpirationInSeconds }), handleTokenRequest(config) ) } @@ -106,30 +291,52 @@ export function handleTokenRequest(config: OpenId4VciAccessTokenEndpointConfig) const { agentContext, issuer } = requestContext const body = request.body as AccessTokenRequest - if (body.grant_type !== GrantTypes.PRE_AUTHORIZED_CODE) { - return sendErrorResponse( - response, - agentContext.config.logger, - 400, - TokenErrorResponse.invalid_request, - PRE_AUTHORIZED_CODE_REQUIRED_ERROR - ) - } const openId4VcIssuerService = agentContext.dependencyManager.resolve(OpenId4VcIssuerService) const issuerMetadata = openId4VcIssuerService.getIssuerMetadata(agentContext, issuer) const accessTokenSigningKey = Key.fromFingerprint(issuer.accessTokenPublicKeyFingerprint) try { - const accessTokenResponse = await createAccessTokenResponse(request.body, { - credentialOfferSessions: new OpenId4VcCredentialOfferSessionStateManager(agentContext, issuer.issuerId), - tokenExpiresIn: tokenExpiresInSeconds, + const code = body.issuer_state + ? { type: 'issuerState' as const, value: body.issuer_state } + : { type: 'preAuthorized' as const, value: body[PRE_AUTH_CODE_LITERAL] as string } + + const cNonceStateManager = new OpenId4VcCNonceStateManager(agentContext, issuer.issuerId) + const cNonce = await agentContext.wallet.generateNonce() + await cNonceStateManager.set( + cNonce, + { + cNonce, + createdAt: +new Date(), + ...(code.type === 'issuerState' && { issuerState: code.value }), + ...(code.type === 'preAuthorized' && { preAuthorizedCode: code.value }), + }, + code.type + ) + + const access_token = await generateAccessToken({ + tokenExpiresIn: 3600, accessTokenIssuer: issuerMetadata.issuerUrl, - cNonce: await agentContext.wallet.generateNonce(), - cNonceExpiresIn: cNonceExpiresInSeconds, - cNonces: new OpenId4VcCNonceStateManager(agentContext, issuer.issuerId), accessTokenSignerCallback: getJwtSignerCallback(agentContext, accessTokenSigningKey, config), + ...(code.type === 'issuerState' && { issuerState: code.value }), + ...(code.type === 'preAuthorized' && { preAuthorizedCode: code.value }), }) + + const accessTokenResponse: AccessTokenResponse = { + access_token, + expires_in: tokenExpiresInSeconds, + c_nonce: cNonce, + c_nonce_expires_in: cNonceExpiresInSeconds, + authorization_pending: false, + interval: undefined, + } + + const credentialOfferStateManager = new OpenId4VcCredentialOfferSessionStateManager(agentContext, issuer.issuerId) + const credentialOfferSession = await credentialOfferStateManager.getAsserted(code.value, code.type) + credentialOfferSession.status = IssueStatus.ACCESS_TOKEN_CREATED + credentialOfferSession.lastUpdatedAt = +new Date() + await credentialOfferStateManager.set(code.value, credentialOfferSession, code.type) + response.status(200).json(accessTokenResponse) } catch (error) { sendErrorResponse(response, agentContext.config.logger, 400, TokenErrorResponse.invalid_request, error) @@ -140,31 +347,15 @@ export function handleTokenRequest(config: OpenId4VciAccessTokenEndpointConfig) } } -export function verifyTokenRequest(options: { preAuthorizedCodeExpirationInSeconds: number }) { +export function verifyTokenRequest(options: { codeExpirationInSeconds: number }) { return async (request: OpenId4VcIssuanceRequest, response: Response, next: NextFunction) => { const { agentContext, issuer } = getRequestContext(request) try { - const credentialOfferSessions = new OpenId4VcCredentialOfferSessionStateManager(agentContext, issuer.issuerId) - const credentialOfferSession = await credentialOfferSessions.getAsserted(request.body[PRE_AUTH_CODE_LITERAL]) - if (![IssueStatus.OFFER_CREATED, IssueStatus.OFFER_URI_RETRIEVED].includes(credentialOfferSession.status)) { - throw new TokenError(400, TokenErrorResponse.invalid_request, 'Access token has already been retrieved') - } - const { preAuthSession } = await assertValidAccessTokenRequest(request.body, { - // It should actually be in seconds. but the oid4vci library has some bugs related - // to seconds vs milliseconds. We pass it as ms for now, but once the fix is released - // we should pass it as seconds. We have an extra check below, so that we won't have - // an security issue once the fix is released. - // FIXME: https://github.com/Sphereon-Opensource/OID4VCI/pull/104 - expirationDuration: options.preAuthorizedCodeExpirationInSeconds * 1000, - credentialOfferSessions, + await assertValidAccessTokenRequest(request.body, { + expirationDuration: options.codeExpirationInSeconds, + credentialOfferSessions: new OpenId4VcCredentialOfferSessionStateManager(agentContext, issuer.issuerId), }) - - // TODO: remove once above PR is merged and released - const expiresAt = preAuthSession.createdAt + options.preAuthorizedCodeExpirationInSeconds * 1000 - if (Date.now() > expiresAt) { - throw new TokenError(400, TokenErrorResponse.invalid_grant, 'Pre-authorized code has expired') - } } catch (error) { if (error instanceof TokenError) { sendErrorResponse( diff --git a/packages/openid4vc/src/openid4vc-issuer/router/credentialEndpoint.ts b/packages/openid4vc/src/openid4vc-issuer/router/credentialEndpoint.ts index 90ad62ee12..c864bc5a1c 100644 --- a/packages/openid4vc/src/openid4vc-issuer/router/credentialEndpoint.ts +++ b/packages/openid4vc/src/openid4vc-issuer/router/credentialEndpoint.ts @@ -1,4 +1,5 @@ import type { OpenId4VcIssuanceRequest } from './requestContext' +import type { VerifyAccessTokenResult } from './verifyAccessToken' import type { OpenId4VciCredentialRequest } from '../../shared' import type { OpenId4VciCredentialRequestToCredentialMapper } from '../OpenId4VcIssuerServiceOptions' import type { Router, Response } from 'express' @@ -29,12 +30,11 @@ export function configureCredentialEndpoint(router: Router, config: OpenId4VciCr const { agentContext, issuer } = getRequestContext(request) const openId4VcIssuerService = agentContext.dependencyManager.resolve(OpenId4VcIssuerService) - let preAuthorizedCode: string + let verifyAccessTokenResult: VerifyAccessTokenResult // Verify the access token (should at some point be moved to a middleware function or something) try { - preAuthorizedCode = (await verifyAccessToken(agentContext, issuer, request.headers.authorization)) - .preAuthorizedCode + verifyAccessTokenResult = await verifyAccessToken(agentContext, issuer, request.headers.authorization) } catch (error) { return sendErrorResponse(response, agentContext.config.logger, 401, 'unauthorized', error) } @@ -47,9 +47,21 @@ export function configureCredentialEndpoint(router: Router, config: OpenId4VciCr credentialRequest, }) - if (issuanceSession?.preAuthorizedCode !== preAuthorizedCode) { + if (!issuanceSession) { + const cNonce = getCNonceFromCredentialRequest(credentialRequest) + agentContext.config.logger.warn( + `No issuance session found for incoming credential request with cNonce ${cNonce} and issuer ${issuer.issuerId}` + ) + return sendErrorResponse(response, agentContext.config.logger, 404, 'invalid_request', null) + } + + if ( + (verifyAccessTokenResult.preAuthorizedCode && + issuanceSession.preAuthorizedCode !== verifyAccessTokenResult.preAuthorizedCode) || + (verifyAccessTokenResult.issuerState && issuanceSession.issuerState !== verifyAccessTokenResult.issuerState) + ) { agentContext.config.logger.warn( - `Credential request used access token with for credential offer with different pre-authorized code than was used for the issuance session ${issuanceSession?.id}` + `Credential request used access token with different a pre-authorized code or issuerState code than was used for the issuance session ${issuanceSession?.id}` ) return sendErrorResponse( response, @@ -60,14 +72,6 @@ export function configureCredentialEndpoint(router: Router, config: OpenId4VciCr ) } - if (!issuanceSession) { - const cNonce = getCNonceFromCredentialRequest(credentialRequest) - agentContext.config.logger.warn( - `No issuance session found for incoming credential request with cNonce ${cNonce} and issuer ${issuer.issuerId}` - ) - return sendErrorResponse(response, agentContext.config.logger, 404, 'invalid_request', null) - } - const { credentialResponse } = await openId4VcIssuerService.createCredentialResponse(agentContext, { issuanceSession, credentialRequest, diff --git a/packages/openid4vc/src/openid4vc-issuer/router/metadataEndpoint.ts b/packages/openid4vc/src/openid4vc-issuer/router/metadataEndpoint.ts index b3ecb4edc4..6f0acb9492 100644 --- a/packages/openid4vc/src/openid4vc-issuer/router/metadataEndpoint.ts +++ b/packages/openid4vc/src/openid4vc-issuer/router/metadataEndpoint.ts @@ -18,7 +18,9 @@ export function configureIssuerMetadataEndpoint(router: Router) { credential_issuer: issuerMetadata.issuerUrl, token_endpoint: issuerMetadata.tokenEndpoint, credential_endpoint: issuerMetadata.credentialEndpoint, - authorization_server: issuerMetadata.authorizationServer, + // TODO: this is a temporary solution to support the first authorization server + // TODO: CHANGE THIS TO SUPPORT MULTIPLE AUTHORIZATION SERVERS + authorization_server: issuerMetadata.authorizationServers?.[0], credentials_supported: issuerMetadata.credentialsSupported, display: issuerMetadata.issuerDisplay, } satisfies CredentialIssuerMetadata diff --git a/packages/openid4vc/src/openid4vc-issuer/router/verifyAccessToken.ts b/packages/openid4vc/src/openid4vc-issuer/router/verifyAccessToken.ts index 8ee900afae..dd7b819402 100644 --- a/packages/openid4vc/src/openid4vc-issuer/router/verifyAccessToken.ts +++ b/packages/openid4vc/src/openid4vc-issuer/router/verifyAccessToken.ts @@ -5,11 +5,15 @@ import { CredoError, JwsService, Jwt } from '@credo-ts/core' import { OpenId4VcIssuerService } from '../OpenId4VcIssuerService' +export type VerifyAccessTokenResult = + | { preAuthorizedCode: string; issuerState: undefined } + | { preAuthorizedCode: undefined; issuerState: string } + export async function verifyAccessToken( agentContext: AgentContext, issuer: OpenId4VcIssuerRecord, authorizationHeader?: string -) { +): Promise { const openId4VcIssuerService = agentContext.dependencyManager.resolve(OpenId4VcIssuerService) if (!authorizationHeader || !authorizationHeader.startsWith('Bearer ')) { @@ -42,11 +46,22 @@ export async function verifyAccessToken( throw new CredoError('Access token was not issued by the expected issuer') } - if (typeof accessToken.payload.additionalClaims.preAuthorizedCode !== 'string') { - throw new CredoError('No preAuthorizedCode present in access token') + const { preAuthorizedCode, issuerState } = accessToken.payload.additionalClaims + + if (!preAuthorizedCode && !issuerState) { + throw new CredoError('No preAuthorizedCode or issuerState present in access token') } - return { - preAuthorizedCode: accessToken.payload.additionalClaims.preAuthorizedCode, + if (preAuthorizedCode && typeof preAuthorizedCode !== 'string') { + throw new CredoError('Invalid preAuthorizedCode present in access token') } + + if (issuerState && typeof issuerState !== 'string') { + throw new CredoError('Invalid issuerState present in access token') + } + + return { + preAuthorizedCode: preAuthorizedCode || undefined, + issuerState: issuerState || undefined, + } as VerifyAccessTokenResult } diff --git a/packages/openid4vc/src/shared/models/AuthorizationServer.ts b/packages/openid4vc/src/shared/models/AuthorizationServer.ts new file mode 100644 index 0000000000..5225a4a561 --- /dev/null +++ b/packages/openid4vc/src/shared/models/AuthorizationServer.ts @@ -0,0 +1,4 @@ +export interface OpenId4VciAuthorizationServerConfig { + // The base Url of your OAuth Server + baseUrl: string +} diff --git a/packages/openid4vc/src/shared/models/index.ts b/packages/openid4vc/src/shared/models/index.ts index 779881dbed..13691c9f99 100644 --- a/packages/openid4vc/src/shared/models/index.ts +++ b/packages/openid4vc/src/shared/models/index.ts @@ -16,8 +16,9 @@ import type { UniformCredentialRequest, } from '@sphereon/oid4vci-common' -export type OpenId4VciCredentialSupportedWithId = CredentialSupported & { id: string } -export type OpenId4VciCredentialSupported = CredentialSupported +export type OpenId4VciCredentialSupported = CredentialSupported & { id?: string; scope?: string } +export type OpenId4VciCredentialSupportedWithId = OpenId4VciCredentialSupported & { id: string; scope?: string } +export type OpenId4VciCredentialSupportedWithIdAndScope = OpenId4VciCredentialSupportedWithId & { scope: string } export type OpenId4VciIssuerMetadata = CredentialIssuerMetadata export type OpenId4VciIssuerMetadataDisplay = MetadataDisplay @@ -37,3 +38,4 @@ export type OpenId4VcSiopIdTokenPayload = IDTokenPayload export * from './OpenId4VcJwtIssuer' export * from './CredentialHolderBinding' export * from './OpenId4VciCredentialFormatProfile' +export * from './AuthorizationServer' From 80b55b40fe345ad6864b43c8a9161e87f6379541 Mon Sep 17 00:00:00 2001 From: Martin Auer Date: Wed, 11 Sep 2024 10:45:13 +0200 Subject: [PATCH 2/3] fix: make eslint happy --- .../openid4vc/src/openid4vc-issuer/OpenId4VcIssuerService.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerService.ts b/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerService.ts index 77fd3dfc7c..d8c5e36b7b 100644 --- a/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerService.ts +++ b/packages/openid4vc/src/openid4vc-issuer/OpenId4VcIssuerService.ts @@ -17,7 +17,6 @@ import type { } from '../shared' import type { AgentContext, DidDocument, Query, QueryOptions } from '@credo-ts/core' import type { - CredentialConfigurationSupported, CredentialOfferPayloadV1_0_11, CredentialOfferPayloadV1_0_13, Grant, From 9ccb645e5f44cd2491d0b0a1c334c58639151594 Mon Sep 17 00:00:00 2001 From: Martin Auer Date: Wed, 11 Sep 2024 10:45:35 +0200 Subject: [PATCH 3/3] feat: add method to test auth code flow --- demo-openid/package.json | 10 +- demo-openid/src/Holder.ts | 24 +- demo-openid/src/Issuer.ts | 11 +- demo-openid/src/Provider.ts | 81 +++ pnpm-lock.yaml | 1071 ++++++++++++++++++++++++++++------- 5 files changed, 995 insertions(+), 202 deletions(-) create mode 100644 demo-openid/src/Provider.ts diff --git a/demo-openid/package.json b/demo-openid/package.json index 6993266ab9..ad24c863f2 100644 --- a/demo-openid/package.json +++ b/demo-openid/package.json @@ -10,6 +10,7 @@ "license": "Apache-2.0", "scripts": { "issuer": "ts-node src/IssuerInquirer.ts", + "provider": "tsx src/Provider.ts", "holder": "ts-node src/HolderInquirer.ts", "verifier": "ts-node src/VerifierInquirer.ts" }, @@ -17,8 +18,11 @@ "@hyperledger/anoncreds-nodejs": "^0.2.2", "@hyperledger/aries-askar-nodejs": "^0.2.3", "@hyperledger/indy-vdr-nodejs": "^0.2.2", + "@koa/bodyparser": "^5.1.1", "express": "^4.18.1", - "inquirer": "^8.2.5" + "inquirer": "^8.2.5", + "jose": "^5.3.0", + "oidc-provider": "^8.4.6" }, "devDependencies": { "@credo-ts/openid4vc": "workspace:*", @@ -28,8 +32,10 @@ "@types/express": "^4.17.13", "@types/figlet": "^1.5.4", "@types/inquirer": "^8.2.6", + "@types/oidc-provider": "^8.4.4", "clear": "^0.1.0", "figlet": "^1.5.2", - "ts-node": "^10.4.0" + "ts-node": "^10.4.0", + "tsx": "^4.11.0" } } diff --git a/demo-openid/src/Holder.ts b/demo-openid/src/Holder.ts index d16cdc7498..625d704527 100644 --- a/demo-openid/src/Holder.ts +++ b/demo-openid/src/Holder.ts @@ -39,16 +39,34 @@ export class Holder extends BaseAgent> resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer, credentialsToRequest: string[] ) { - const tokenResponse = await this.agent.modules.openId4VcHolder.requestToken({ resolvedCredentialOffer }) + const resolvedAuthorizationRequest = await this.agent.modules.openId4VcHolder.resolveIssuanceAuthorizationRequest( + resolvedCredentialOffer, + { + clientId: 'foo', + redirectUri: 'http://example.com', + scope: ['openid', 'UniversityDegree'], + } + ) + + console.log(resolvedAuthorizationRequest.authorizationRequestUri) + + let code = 'not a valid code!' + code = 'MU_MtTZjjhjmzuzGZdsLSam2GcC-7c4g_k5ukV2XO3i' + + const tokenResponse = await this.agent.modules.openId4VcHolder.requestToken({ + resolvedAuthorizationRequest, + code, + resolvedCredentialOffer, + }) + const credentialResponse = await this.agent.modules.openId4VcHolder.requestCredentials({ resolvedCredentialOffer, - ...tokenResponse, - // TODO: add jwk support for holder binding credentialsToRequest, credentialBindingResolver: async () => ({ method: 'did', didUrl: this.verificationMethod.id, }), + ...tokenResponse, }) const storedCredentials = await Promise.all( diff --git a/demo-openid/src/Issuer.ts b/demo-openid/src/Issuer.ts index 410080e647..52aebf2343 100644 --- a/demo-openid/src/Issuer.ts +++ b/demo-openid/src/Issuer.ts @@ -4,6 +4,7 @@ import type { OpenId4VcCredentialHolderDidBinding, OpenId4VciCredentialRequestToCredentialMapper, OpenId4VciCredentialSupportedWithId, + OpenId4VciCredentialSupportedWithIdAndScope, OpenId4VcIssuerRecord, } from '@credo-ts/openid4vc' @@ -28,13 +29,15 @@ export const universityDegreeCredential = { id: 'UniversityDegreeCredential', format: OpenId4VciCredentialFormatProfile.JwtVcJson, types: ['VerifiableCredential', 'UniversityDegreeCredential'], -} satisfies OpenId4VciCredentialSupportedWithId + scope: 'openid4vc:credential:UniversityDegreeCredential', +} satisfies OpenId4VciCredentialSupportedWithIdAndScope export const openBadgeCredential = { id: 'OpenBadgeCredential', format: OpenId4VciCredentialFormatProfile.JwtVcJson, types: ['VerifiableCredential', 'OpenBadgeCredential'], -} satisfies OpenId4VciCredentialSupportedWithId + scope: 'openid4vc:credential:OpenBadgeCredential', +} satisfies OpenId4VciCredentialSupportedWithIdAndScope export const universityDegreeCredentialSdJwt = { id: 'UniversityDegreeCredential-sdjwt', @@ -148,7 +151,9 @@ export class Issuer extends BaseAgent<{ const issuer = new Issuer(2000, 'OpenId4VcIssuer ' + Math.random().toString()) await issuer.initializeAgent('96213c3d7fc8d4d6754c7a0fd969598f') issuer.issuerRecord = await issuer.agent.modules.openId4VcIssuer.createIssuer({ + issuerId: '726222ad-7624-4f12-b15b-e08aa7042ffa', credentialsSupported, + authorizationServerConfigs: [{ baseUrl: 'http://localhost:3042' }], }) return issuer @@ -158,7 +163,7 @@ export class Issuer extends BaseAgent<{ const { credentialOffer } = await this.agent.modules.openId4VcIssuer.createCredentialOffer({ issuerId: this.issuerRecord.issuerId, offeredCredentials, - preAuthorizedCodeFlowConfig: { userPinRequired: false }, + authorizationCodeFlowConfig: { issuerState: 'f498b73c-144f-4eea-bd6b-7be89b35936e' }, }) return credentialOffer diff --git a/demo-openid/src/Provider.ts b/demo-openid/src/Provider.ts new file mode 100644 index 0000000000..ab0ebe1b88 --- /dev/null +++ b/demo-openid/src/Provider.ts @@ -0,0 +1,81 @@ +import { bodyParser } from '@koa/bodyparser' +import Provider from 'oidc-provider' + +const oidc = new Provider('http://localhost:3042', { + clients: [ + { + client_id: 'foo', + client_secret: 'bar', + redirect_uris: ['http://example.com'], + scope: 'openid', + grant_types: ['authorization_code'], + }, + ], + pkce: { + methods: ['S256'], + required: () => { + console.log('checking pkce') + return true + }, + }, + features: { + dPoP: { enabled: false }, + pushedAuthorizationRequests: { + enabled: true, + //requirePushedAuthorizationRequests: true, + }, + }, + + async findAccount(ctx, id) { + console.log('called findAccount') + return { + accountId: id, + async claims(use, scope) { + console.log('called claims', scope) + return { sub: id } + }, + } + }, +}) + +oidc.use(bodyParser()) +oidc.use(async (ctx, next) => { + /** pre-processing + * you may target a specific action here by matching `ctx.path` + */ + + console.log('pre middleware', ctx.method, ctx.path) + + if (ctx.path.includes('request')) { + console.log(ctx.request.body) + ctx.request.body.client_secret = 'bar' + } + + if (ctx.path.includes('auth')) { + const match = ctx.body?.match(/code=([^&]*)/) + const code = match ? match[1] : null + console.log('code', code) + } + + if (ctx.path.includes('token')) { + console.log('token endpoint') + ctx.request.body.client_secret = 'bar' + } + + await next() + + /** post-processing + * since internal route matching was already executed you may target a specific action here + * checking `ctx.oidc.route`, the unique route names used are + */ + + console.log('post middleware', ctx.method, ctx.oidc?.route) + if (ctx.path.includes('token')) { + console.log('token endpoint') + ctx.response.body + } +}) + +oidc.listen(3042, () => { + console.log('oidc-provider listening on port 3042, check http://localhost:3042/.well-known/openid-configuration') +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index caa634ac22..d134d3dca6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: version: 8.5.12 '@typescript-eslint/eslint-plugin': specifier: ^7.14.1 - version: 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^7.14.1 version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -67,13 +67,13 @@ importers: version: 8.10.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.5.3 - version: 3.6.1(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: ^2.23.4 - version: 2.29.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) eslint-plugin-workspaces: specifier: ^0.8.0 version: 0.8.0 @@ -82,7 +82,7 @@ importers: version: 4.19.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) prettier: specifier: ^2.3.1 version: 2.8.8 @@ -91,7 +91,7 @@ importers: version: 7.8.1 ts-jest: specifier: ^29.1.2 - version: 29.2.4(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4) + version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4) ts-node: specifier: ^10.0.0 version: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) @@ -165,12 +165,21 @@ importers: '@hyperledger/indy-vdr-nodejs': specifier: ^0.2.2 version: 0.2.2 + '@koa/bodyparser': + specifier: ^5.1.1 + version: 5.1.1(koa@2.15.3) express: specifier: ^4.18.1 version: 4.19.2 inquirer: specifier: ^8.2.5 version: 8.2.6 + jose: + specifier: ^5.3.0 + version: 5.8.0 + oidc-provider: + specifier: ^8.4.6 + version: 8.5.1 devDependencies: '@credo-ts/askar': specifier: workspace:* @@ -193,6 +202,9 @@ importers: '@types/inquirer': specifier: ^8.2.6 version: 8.2.10 + '@types/oidc-provider': + specifier: ^8.4.4 + version: 8.5.2 clear: specifier: ^0.1.0 version: 0.1.0 @@ -202,6 +214,9 @@ importers: ts-node: specifier: ^10.4.0 version: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) + tsx: + specifier: ^4.11.0 + version: 4.19.0 packages/action-menu: dependencies: @@ -297,7 +312,7 @@ importers: devDependencies: '@animo-id/expo-secure-environment': specifier: ^0.0.1-alpha.0 - version: 0.0.1-alpha.0(expo@51.0.29)(react-native@0.71.19)(react@18.3.1) + version: 0.0.1-alpha.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(react@18.3.1) '@hyperledger/aries-askar-nodejs': specifier: ^0.2.3 version: 0.2.3 @@ -327,7 +342,7 @@ importers: dependencies: '@animo-id/react-native-bbs-signatures': specifier: ^0.1.0 - version: 0.1.0(react-native@0.71.19)(react@18.3.1) + version: 0.1.0(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(react@18.3.1) '@credo-ts/core': specifier: workspace:* version: link:../core @@ -404,13 +419,13 @@ importers: dependencies: '@digitalcredentials/jsonld': specifier: ^6.0.0 - version: 6.0.0(expo@51.0.29)(react-native@0.71.19) + version: 6.0.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) '@digitalcredentials/jsonld-signatures': specifier: ^9.4.0 - version: 9.4.0(expo@51.0.29)(react-native@0.71.19) + version: 9.4.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) '@digitalcredentials/vc': specifier: ^6.0.1 - version: 6.0.1(expo@51.0.29)(react-native@0.71.19) + version: 6.0.1(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) '@multiformats/base-x': specifier: ^4.0.1 version: 4.0.1 @@ -769,13 +784,13 @@ importers: devDependencies: react-native: specifier: ^0.71.4 - version: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3)(react@18.2.0) + version: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1) react-native-fs: specifier: ^2.20.0 - version: 2.20.0(react-native@0.71.19) + version: 2.20.0(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)) react-native-get-random-values: specifier: ^1.8.0 - version: 1.11.0(react-native@0.71.19) + version: 1.11.0(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)) rimraf: specifier: ^4.4.0 version: 4.4.1 @@ -1856,6 +1871,150 @@ packages: resolution: {integrity: sha512-TZgLoi00Jc9uv3b6jStH+G8+bCqpHIqFw9DYODz+fVjNh197ksvcYqSndUDHa2oi0HCcK+soI8j4ba3Sa4Pl4w==} engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1951,6 +2110,9 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@hapi/bourne@3.0.0': + resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -2112,6 +2274,20 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@koa/bodyparser@5.1.1': + resolution: {integrity: sha512-ZBF49xqNVxnmJ+8iXegq+fXPQm9RSX8giNl/aXS5rW1VpNct92wnFbGR/47vfoRJVLARGQ4HVL4WaQ0u8IJVoA==} + engines: {node: '>= 16'} + peerDependencies: + koa: ^2.14.1 + + '@koa/cors@5.0.0': + resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} + engines: {node: '>= 14.0.0'} + + '@koa/router@12.0.1': + resolution: {integrity: sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==} + engines: {node: '>= 12'} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -2369,6 +2545,10 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -2483,6 +2663,10 @@ packages: '@stablelib/xchacha20poly1305@1.0.1': resolution: {integrity: sha512-B1Abj0sMJ8h3HNmGnJ7vHBrAvxuNka6cJJoZ1ILN7iuacXp7sUYcgOVEOTLWj+rtQMpspY9tXSCRLPmN1mQNWg==} + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -2498,6 +2682,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/accepts@1.3.7': + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2519,6 +2706,12 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/content-disposition@0.5.8': + resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + + '@types/cookies@0.9.0': + resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} + '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} @@ -2543,6 +2736,12 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/http-assert@1.5.5': + resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} @@ -2573,6 +2772,15 @@ packages: '@types/jsonpath@0.2.4': resolution: {integrity: sha512-K3hxB8Blw0qgW6ExKgMbXQv2UPZBoE2GqLpVY+yr7nMD2Pq86lsuIzyAaiQ7eMqFL5B6di6pxSkogLJEyEHoGA==} + '@types/keygrip@1.0.6': + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + + '@types/koa-compose@3.2.8': + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + + '@types/koa@2.15.0': + resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + '@types/long@4.0.2': resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} @@ -2594,6 +2802,9 @@ packages: '@types/object-inspect@1.13.0': resolution: {integrity: sha512-lwGTVESDDV+XsQ1pH4UifpJ1f7OtXzQ6QBOX2Afq2bM/T3oOt8hF6exJMjjIjtEWeAN2YAo25J7HxWh97CCz9w==} + '@types/oidc-provider@8.5.2': + resolution: {integrity: sha512-NiD3VG49+cRCAAe8+uZLM4onOcX8y9+cwaml8JG1qlgc98rWoCRgsnOB4Ypx+ysays5jiwzfUgT0nWyXPB/9uQ==} + '@types/qs@6.9.15': resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} @@ -3162,6 +3373,18 @@ packages: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} + cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -3284,6 +3507,10 @@ packages: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} + co-body@6.2.0: + resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} + engines: {node: '>=8.0.0'} + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -3397,6 +3624,10 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + core-js-compat@3.38.1: resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} @@ -3520,6 +3751,10 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -3528,6 +3763,9 @@ packages: babel-plugin-macros: optional: true + deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -3550,6 +3788,10 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -3576,6 +3818,10 @@ packages: denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -3746,6 +3992,11 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -3882,6 +4133,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + eta@3.5.0: + resolution: {integrity: sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==} + engines: {node: '>=6.0.0'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -4133,6 +4388,10 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -4295,6 +4554,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4378,10 +4641,25 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -4430,6 +4708,10 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + engines: {node: '>= 0.8.0'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -4536,6 +4818,10 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + is-glob@2.0.1: resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} engines: {node: '>=0.10.0'} @@ -4850,6 +5136,9 @@ packages: join-component@1.1.0: resolution: {integrity: sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==} + jose@5.8.0: + resolution: {integrity: sha512-E7CqYpL/t7MMnfGnK/eg416OsFCVUrU/Y3Vwe7QjKhu/BkS1Ms455+2xsqZQVN57/U2MHMBvEb5SrmAZWAIntA==} + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} @@ -4888,6 +5177,11 @@ packages: engines: {node: '>=4'} hasBin: true + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -4950,6 +5244,10 @@ packages: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -4961,6 +5259,17 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + + koa@2.15.3: + resolution: {integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + ky-universal@0.11.0: resolution: {integrity: sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==} engines: {node: '>=14.16'} @@ -5134,6 +5443,10 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -5315,6 +5628,14 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -5418,6 +5739,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.0.7: + resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + engines: {node: ^18 || >=20} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5505,6 +5831,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + npm-package-arg@7.0.0: resolution: {integrity: sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==} @@ -5530,6 +5860,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + object-inspect@1.13.2: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} @@ -5554,6 +5888,13 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} + oidc-provider@8.5.1: + resolution: {integrity: sha512-Bm3EyxN68/KS76IlciJ3+4pnVtfdRWL+NghWpIF0XQbiRT1gzc6Qf/cyFmpL9yieko/jXYZ/uLHUv77jD00qww==} + + oidc-token-hash@5.0.3: + resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} + engines: {node: ^10.13.0 || >=12.0.0} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -5577,6 +5918,9 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + open@6.4.0: resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} engines: {node: '>=8'} @@ -5620,6 +5964,10 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -5719,6 +6067,9 @@ packages: path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -5882,6 +6233,14 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + quick-lru@7.0.0: + resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} + engines: {node: '>=18'} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -5959,10 +6318,6 @@ packages: peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -6054,6 +6409,9 @@ packages: resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==} engines: {node: '>= 4.0.0'} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -6084,6 +6442,10 @@ packages: resolve@1.7.1: resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==} + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + restore-cursor@2.0.0: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} @@ -6639,6 +7001,15 @@ packages: resolution: {integrity: sha512-oDWuGVONxhVEBtschLf2cs/Jy8i7h1T+CpdkTNWQgdAF7DhRo2G8vMCgILKe7ojdEkLhICWgI1LYSSKaJsRgcw==} engines: {node: '>=16'} + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + tsx@4.19.0: + resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} + engines: {node: '>=18.0.0'} + hasBin: true + tsyringe@4.8.0: resolution: {integrity: sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==} engines: {node: '>= 6.0.0'} @@ -7066,6 +7437,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -7110,19 +7485,19 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@animo-id/expo-secure-environment@0.0.1-alpha.0(expo@51.0.29)(react-native@0.71.19)(react@18.3.1)': + '@animo-id/expo-secure-environment@0.0.1-alpha.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(react@18.3.1)': dependencies: '@peculiar/asn1-ecc': 2.3.13 '@peculiar/asn1-schema': 2.3.13 '@peculiar/asn1-x509': 2.3.13 - expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3) + expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)) react: 18.3.1 - react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3)(react@18.3.1) + react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1) - '@animo-id/react-native-bbs-signatures@0.1.0(react-native@0.71.19)(react@18.3.1)': + '@animo-id/react-native-bbs-signatures@0.1.0(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(react@18.3.1)': dependencies: react: 18.3.1 - react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3)(react@18.3.1) + react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1) '@astronautlabs/jsonpath@1.1.2': dependencies: @@ -8420,10 +8795,10 @@ snapshots: base64url-universal: 2.0.0 pako: 2.1.0 - '@digitalbazaar/http-client@3.4.1': + '@digitalbazaar/http-client@3.4.1(web-streams-polyfill@3.3.3)': dependencies: ky: 0.33.3 - ky-universal: 0.11.0(ky@0.33.3) + ky-universal: 0.11.0(ky@0.33.3)(web-streams-polyfill@3.3.3) undici: 5.28.4 transitivePeerDependencies: - web-streams-polyfill @@ -8432,20 +8807,20 @@ snapshots: '@digitalbazaar/vc-status-list-context@3.1.1': {} - '@digitalbazaar/vc-status-list@7.1.0': + '@digitalbazaar/vc-status-list@7.1.0(web-streams-polyfill@3.3.3)': dependencies: '@digitalbazaar/bitstring': 3.1.0 - '@digitalbazaar/vc': 5.0.0 + '@digitalbazaar/vc': 5.0.0(web-streams-polyfill@3.3.3) '@digitalbazaar/vc-status-list-context': 3.1.1 credentials-context: 2.0.0 transitivePeerDependencies: - web-streams-polyfill - '@digitalbazaar/vc@5.0.0': + '@digitalbazaar/vc@5.0.0(web-streams-polyfill@3.3.3)': dependencies: credentials-context: 2.0.0 - jsonld: 8.3.2 - jsonld-signatures: 11.3.0 + jsonld: 8.3.2(web-streams-polyfill@3.3.3) + jsonld-signatures: 11.3.0(web-streams-polyfill@3.3.3) transitivePeerDependencies: - web-streams-polyfill @@ -8460,11 +8835,11 @@ snapshots: '@digitalcredentials/base64url-universal': 2.0.6 pako: 2.1.0 - '@digitalcredentials/ed25519-signature-2020@3.0.2(expo@51.0.29)(react-native@0.71.19)': + '@digitalcredentials/ed25519-signature-2020@3.0.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@digitalcredentials/base58-universal': 1.0.1 '@digitalcredentials/ed25519-verification-key-2020': 3.2.2 - '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29)(react-native@0.71.19) + '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) ed25519-signature-2018-context: 1.1.0 ed25519-signature-2020-context: 1.1.0 transitivePeerDependencies: @@ -8480,20 +8855,20 @@ snapshots: base64url-universal: 1.1.0 crypto-ld: 6.0.0 - '@digitalcredentials/http-client@1.2.2': + '@digitalcredentials/http-client@1.2.2(web-streams-polyfill@3.3.3)': dependencies: ky: 0.25.1 - ky-universal: 0.8.2(ky@0.25.1) + ky-universal: 0.8.2(ky@0.25.1)(web-streams-polyfill@3.3.3) transitivePeerDependencies: - domexception - web-streams-polyfill - '@digitalcredentials/jsonld-signatures@9.4.0(expo@51.0.29)(react-native@0.71.19)': + '@digitalcredentials/jsonld-signatures@9.4.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@digitalbazaar/security-context': 1.0.1 - '@digitalcredentials/jsonld': 6.0.0(expo@51.0.29)(react-native@0.71.19) + '@digitalcredentials/jsonld': 6.0.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) fast-text-encoding: 1.0.6 - isomorphic-webcrypto: 2.3.8(expo@51.0.29)(react-native@0.71.19) + isomorphic-webcrypto: 2.3.8(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)) serialize-error: 8.1.0 transitivePeerDependencies: - domexception @@ -8501,10 +8876,10 @@ snapshots: - react-native - web-streams-polyfill - '@digitalcredentials/jsonld@5.2.2(expo@51.0.29)(react-native@0.71.19)': + '@digitalcredentials/jsonld@5.2.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: - '@digitalcredentials/http-client': 1.2.2 - '@digitalcredentials/rdf-canonize': 1.0.0(expo@51.0.29)(react-native@0.71.19) + '@digitalcredentials/http-client': 1.2.2(web-streams-polyfill@3.3.3) + '@digitalcredentials/rdf-canonize': 1.0.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)) canonicalize: 1.0.8 lru-cache: 6.0.0 transitivePeerDependencies: @@ -8513,10 +8888,10 @@ snapshots: - react-native - web-streams-polyfill - '@digitalcredentials/jsonld@6.0.0(expo@51.0.29)(react-native@0.71.19)': + '@digitalcredentials/jsonld@6.0.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: - '@digitalcredentials/http-client': 1.2.2 - '@digitalcredentials/rdf-canonize': 1.0.0(expo@51.0.29)(react-native@0.71.19) + '@digitalcredentials/http-client': 1.2.2(web-streams-polyfill@3.3.3) + '@digitalcredentials/rdf-canonize': 1.0.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)) canonicalize: 1.0.8 lru-cache: 6.0.0 transitivePeerDependencies: @@ -8527,19 +8902,19 @@ snapshots: '@digitalcredentials/open-badges-context@2.1.0': {} - '@digitalcredentials/rdf-canonize@1.0.0(expo@51.0.29)(react-native@0.71.19)': + '@digitalcredentials/rdf-canonize@1.0.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))': dependencies: fast-text-encoding: 1.0.6 - isomorphic-webcrypto: 2.3.8(expo@51.0.29)(react-native@0.71.19) + isomorphic-webcrypto: 2.3.8(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)) transitivePeerDependencies: - expo - react-native - '@digitalcredentials/vc-status-list@5.0.2(expo@51.0.29)(react-native@0.71.19)': + '@digitalcredentials/vc-status-list@5.0.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@digitalbazaar/vc-status-list-context': 3.1.1 '@digitalcredentials/bitstring': 2.0.1 - '@digitalcredentials/vc': 4.2.0(expo@51.0.29)(react-native@0.71.19) + '@digitalcredentials/vc': 4.2.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) credentials-context: 2.0.0 transitivePeerDependencies: - domexception @@ -8547,10 +8922,10 @@ snapshots: - react-native - web-streams-polyfill - '@digitalcredentials/vc@4.2.0(expo@51.0.29)(react-native@0.71.19)': + '@digitalcredentials/vc@4.2.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: - '@digitalcredentials/jsonld': 5.2.2(expo@51.0.29)(react-native@0.71.19) - '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29)(react-native@0.71.19) + '@digitalcredentials/jsonld': 5.2.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) credentials-context: 2.0.0 transitivePeerDependencies: - domexception @@ -8558,14 +8933,14 @@ snapshots: - react-native - web-streams-polyfill - '@digitalcredentials/vc@6.0.1(expo@51.0.29)(react-native@0.71.19)': + '@digitalcredentials/vc@6.0.1(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: - '@digitalbazaar/vc-status-list': 7.1.0 - '@digitalcredentials/ed25519-signature-2020': 3.0.2(expo@51.0.29)(react-native@0.71.19) - '@digitalcredentials/jsonld': 6.0.0(expo@51.0.29)(react-native@0.71.19) - '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29)(react-native@0.71.19) + '@digitalbazaar/vc-status-list': 7.1.0(web-streams-polyfill@3.3.3) + '@digitalcredentials/ed25519-signature-2020': 3.0.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/jsonld': 6.0.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) '@digitalcredentials/open-badges-context': 2.1.0 - '@digitalcredentials/vc-status-list': 5.0.2(expo@51.0.29)(react-native@0.71.19) + '@digitalcredentials/vc-status-list': 5.0.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1))(web-streams-polyfill@3.3.3) credentials-context: 2.0.0 fix-esm: 1.0.1 transitivePeerDependencies: @@ -8575,6 +8950,78 @@ snapshots: - supports-color - web-streams-polyfill + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 @@ -8881,6 +9328,8 @@ snapshots: dependencies: graphql: 15.8.0 + '@hapi/bourne@3.0.0': {} + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': @@ -8973,7 +9422,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2)': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -8987,7 +9436,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -9179,6 +9628,27 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@koa/bodyparser@5.1.1(koa@2.15.3)': + dependencies: + co-body: 6.2.0 + koa: 2.15.3 + lodash.merge: 4.6.2 + type-is: 1.6.18 + + '@koa/cors@5.0.0': + dependencies: + vary: 1.1.2 + + '@koa/router@12.0.1': + dependencies: + debug: 4.3.6 + http-errors: 2.0.0 + koa-compose: 4.1.0 + methods: 1.1.2 + path-to-regexp: 6.2.2 + transitivePeerDependencies: + - supports-color + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.25.0 @@ -9545,14 +10015,14 @@ snapshots: '@react-native/assets@1.0.0': {} - '@react-native/babel-plugin-codegen@0.74.87(@babel/preset-env@7.25.3)': + '@react-native/babel-plugin-codegen@0.74.87(@babel/preset-env@7.25.3(@babel/core@7.25.2))': dependencies: - '@react-native/codegen': 0.74.87(@babel/preset-env@7.25.3) + '@react-native/codegen': 0.74.87(@babel/preset-env@7.25.3(@babel/core@7.25.2)) transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/babel-preset@0.74.87(@babel/core@7.25.2)(@babel/preset-env@7.25.3)': + '@react-native/babel-preset@0.74.87(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.25.2) @@ -9594,21 +10064,21 @@ snapshots: '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) '@babel/template': 7.25.0 - '@react-native/babel-plugin-codegen': 0.74.87(@babel/preset-env@7.25.3) + '@react-native/babel-plugin-codegen': 0.74.87(@babel/preset-env@7.25.3(@babel/core@7.25.2)) babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.25.2) react-refresh: 0.14.2 transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/codegen@0.74.87(@babel/preset-env@7.25.3)': + '@react-native/codegen@0.74.87(@babel/preset-env@7.25.3(@babel/core@7.25.2))': dependencies: '@babel/parser': 7.25.3 '@babel/preset-env': 7.25.3(@babel/core@7.25.2) glob: 7.2.3 hermes-parser: 0.19.1 invariant: 2.2.4 - jscodeshift: 0.14.0(@babel/preset-env@7.25.3) + jscodeshift: 0.14.0(@babel/preset-env@7.25.3(@babel/core@7.25.2)) mkdirp: 0.5.6 nullthrows: 1.1.1 transitivePeerDependencies: @@ -9724,6 +10194,8 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@sindresorhus/is@5.6.0': {} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -9934,6 +10406,10 @@ snapshots: '@stablelib/wipe': 1.0.1 '@stablelib/xchacha20': 1.0.1 + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + '@tokenizer/token@0.3.0': {} '@tsconfig/node10@1.0.11': {} @@ -9944,6 +10420,10 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@types/accepts@1.3.7': + dependencies: + '@types/node': 18.18.8 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.25.3 @@ -9978,6 +10458,15 @@ snapshots: dependencies: '@types/node': 18.18.8 + '@types/content-disposition@0.5.8': {} + + '@types/cookies@0.9.0': + dependencies: + '@types/connect': 3.4.38 + '@types/express': 4.17.21 + '@types/keygrip': 1.0.6 + '@types/node': 18.18.8 + '@types/cors@2.8.17': dependencies: '@types/node': 18.18.8 @@ -10011,6 +10500,10 @@ snapshots: dependencies: '@types/node': 18.18.8 + '@types/http-assert@1.5.5': {} + + '@types/http-cache-semantics@4.0.4': {} + '@types/http-errors@2.0.4': {} '@types/inquirer@8.2.10': @@ -10044,6 +10537,23 @@ snapshots: '@types/jsonpath@0.2.4': {} + '@types/keygrip@1.0.6': {} + + '@types/koa-compose@3.2.8': + dependencies: + '@types/koa': 2.15.0 + + '@types/koa@2.15.0': + dependencies: + '@types/accepts': 1.3.7 + '@types/content-disposition': 0.5.8 + '@types/cookies': 0.9.0 + '@types/http-assert': 1.5.5 + '@types/http-errors': 2.0.4 + '@types/keygrip': 1.0.6 + '@types/koa-compose': 3.2.8 + '@types/node': 18.18.8 + '@types/long@4.0.2': {} '@types/luxon@3.4.2': {} @@ -10064,6 +10574,11 @@ snapshots: '@types/object-inspect@1.13.0': {} + '@types/oidc-provider@8.5.2': + dependencies: + '@types/koa': 2.15.0 + '@types/node': 18.18.8 + '@types/qs@6.9.15': {} '@types/range-parser@1.2.7': {} @@ -10129,7 +10644,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) @@ -10142,6 +10657,7 @@ snapshots: ignore: 5.3.2 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -10154,6 +10670,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6 eslint: 8.57.0 + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -10170,6 +10687,7 @@ snapshots: debug: 4.3.6 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -10186,6 +10704,7 @@ snapshots: minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -10270,7 +10789,7 @@ snapshots: indent-string: 4.0.0 ajv-formats@2.1.1(ajv@8.17.1): - dependencies: + optionalDependencies: ajv: 8.17.1 ajv@6.12.6: @@ -10557,7 +11076,7 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) - babel-preset-expo@11.0.14(@babel/core@7.25.2)(@babel/preset-env@7.25.3): + babel-preset-expo@11.0.14(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)): dependencies: '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) @@ -10565,7 +11084,7 @@ snapshots: '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) '@babel/preset-react': 7.24.7(@babel/core@7.25.2) '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) - '@react-native/babel-preset': 0.74.87(@babel/core@7.25.2)(@babel/preset-env@7.25.3) + '@react-native/babel-preset': 0.74.87(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)) babel-plugin-react-compiler: 0.0.0-experimental-7d62301-20240819 babel-plugin-react-native-web: 0.19.12 react-refresh: 0.14.2 @@ -10782,6 +11301,23 @@ snapshots: tar: 6.2.1 unique-filename: 3.0.0 + cache-content-type@1.0.1: + dependencies: + mime-types: 2.1.35 + ylru: 1.4.0 + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -10892,6 +11428,14 @@ snapshots: clone@2.1.2: {} + co-body@6.2.0: + dependencies: + '@hapi/bourne': 3.0.0 + inflation: 2.1.0 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + co@4.6.0: {} collect-v8-coverage@1.0.2: {} @@ -11004,6 +11548,11 @@ snapshots: cookie@0.6.0: {} + cookies@0.9.1: + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + core-js-compat@3.38.1: dependencies: browserslist: 4.23.3 @@ -11027,13 +11576,13 @@ snapshots: long: 4.0.0 protobufjs: 6.11.4 - create-jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2): + create-jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -11133,8 +11682,14 @@ snapshots: decode-uri-component@0.2.2: {} + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + dedent@1.5.3: {} + deep-equal@1.0.1: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -11152,6 +11707,8 @@ snapshots: dependencies: clone: 1.0.4 + defer-to-connect@2.0.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 @@ -11183,6 +11740,8 @@ snapshots: denodeify@1.2.1: {} + depd@1.1.2: {} + depd@2.0.0: {} deprecated-react-native-prop-types@3.0.2: @@ -11398,6 +11957,33 @@ snapshots: d: 1.0.2 ext: 1.7.0 + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + escalade@3.1.2: {} escape-html@1.0.3: {} @@ -11429,13 +12015,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.6 enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.6 is-core-module: 2.15.0 @@ -11446,19 +12032,19 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -11467,7 +12053,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -11477,17 +12063,20 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.8.8): + eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): dependencies: eslint: 8.57.0 - eslint-config-prettier: 8.10.0(eslint@8.57.0) prettier: 2.8.8 prettier-linter-helpers: 1.0.0 + optionalDependencies: + eslint-config-prettier: 8.10.0(eslint@8.57.0) eslint-plugin-workspaces@0.8.0: dependencies: @@ -11574,6 +12163,8 @@ snapshots: esutils@2.0.3: {} + eta@3.5.0: {} + etag@1.8.1: {} event-emitter@0.3.5: @@ -11619,35 +12210,35 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expo-asset@10.0.10(expo@51.0.29): + expo-asset@10.0.10(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))): dependencies: - expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3) - expo-constants: 16.0.2(expo@51.0.29) + expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)) + expo-constants: 16.0.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))) invariant: 2.2.4 md5-file: 3.2.3 transitivePeerDependencies: - supports-color - expo-constants@16.0.2(expo@51.0.29): + expo-constants@16.0.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))): dependencies: '@expo/config': 9.0.3 '@expo/env': 0.3.0 - expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3) + expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)) transitivePeerDependencies: - supports-color - expo-file-system@17.0.1(expo@51.0.29): + expo-file-system@17.0.1(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))): dependencies: - expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3) + expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)) - expo-font@12.0.9(expo@51.0.29): + expo-font@12.0.9(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))): dependencies: - expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3) + expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)) fontfaceobserver: 2.3.0 - expo-keep-awake@13.0.2(expo@51.0.29): + expo-keep-awake@13.0.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))): dependencies: - expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3) + expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)) expo-modules-autolinking@0.0.3: dependencies: @@ -11672,13 +12263,13 @@ snapshots: dependencies: invariant: 2.2.4 - expo-random@14.0.1(expo@51.0.29): + expo-random@14.0.1(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))): dependencies: base64-js: 1.5.1 - expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3) + expo: 51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)) optional: true - expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3): + expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)): dependencies: '@babel/runtime': 7.25.0 '@expo/cli': 0.18.29(expo-modules-autolinking@1.11.2) @@ -11686,11 +12277,11 @@ snapshots: '@expo/config-plugins': 8.0.8 '@expo/metro-config': 0.18.11 '@expo/vector-icons': 14.0.2 - babel-preset-expo: 11.0.14(@babel/core@7.25.2)(@babel/preset-env@7.25.3) - expo-asset: 10.0.10(expo@51.0.29) - expo-file-system: 17.0.1(expo@51.0.29) - expo-font: 12.0.9(expo@51.0.29) - expo-keep-awake: 13.0.2(expo@51.0.29) + babel-preset-expo: 11.0.14(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)) + expo-asset: 10.0.10(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))) + expo-file-system: 17.0.1(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))) + expo-font: 12.0.9(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))) + expo-keep-awake: 13.0.2(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))) expo-modules-autolinking: 1.11.2 expo-modules-core: 1.12.21 fbemitter: 3.0.0 @@ -11935,6 +12526,8 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + form-data-encoder@2.1.4: {} + form-data@3.0.1: dependencies: asynckit: 0.4.0 @@ -12130,6 +12723,20 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + got@13.0.0: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -12208,6 +12815,21 @@ snapshots: html-escaper@2.0.2: {} + http-assert@1.5.0: + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + + http-cache-semantics@4.1.1: {} + + http-errors@1.8.1: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -12216,6 +12838,11 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -12256,6 +12883,8 @@ snapshots: indent-string@4.0.0: {} + inflation@2.1.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -12370,6 +12999,10 @@ snapshots: is-generator-fn@2.1.0: {} + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + is-glob@2.0.1: dependencies: is-extglob: 1.0.0 @@ -12457,7 +13090,7 @@ snapshots: isobject@3.0.1: {} - isomorphic-webcrypto@2.3.8(expo@51.0.29)(react-native@0.71.19): + isomorphic-webcrypto@2.3.8(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2)))(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)): dependencies: '@peculiar/webcrypto': 1.5.0 asmcrypto.js: 0.22.0 @@ -12469,8 +13102,8 @@ snapshots: optionalDependencies: '@unimodules/core': 7.1.2 '@unimodules/react-native-adapter': 6.3.9 - expo-random: 14.0.1(expo@51.0.29) - react-native-securerandom: 0.1.1(react-native@0.71.19) + expo-random: 14.0.1(expo@51.0.29(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))) + react-native-securerandom: 0.1.1(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)) transitivePeerDependencies: - expo - react-native @@ -12565,16 +13198,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@18.18.8)(ts-node@10.9.2): + jest-cli@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -12584,12 +13217,11 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@18.18.8)(ts-node@10.9.2): + jest-config@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.18.8 babel-jest: 29.7.0(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 @@ -12609,6 +13241,8 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.18.8 ts-node: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) transitivePeerDependencies: - babel-plugin-macros @@ -12693,7 +13327,7 @@ snapshots: jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - dependencies: + optionalDependencies: jest-resolve: 29.7.0 jest-regex-util@27.5.1: {} @@ -12862,12 +13496,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2): + jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -12886,6 +13520,8 @@ snapshots: join-component@1.1.0: {} + jose@5.8.0: {} + js-base64@3.7.7: {} js-sha3@0.8.0: {} @@ -12905,7 +13541,7 @@ snapshots: jsc-safe-url@0.2.4: {} - jscodeshift@0.14.0(@babel/preset-env@7.25.3): + jscodeshift@0.14.0(@babel/preset-env@7.25.3(@babel/core@7.25.2)): dependencies: '@babel/core': 7.25.2 '@babel/parser': 7.25.3 @@ -12934,6 +13570,8 @@ snapshots: jsesc@2.5.2: {} + jsesc@3.0.2: {} + json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} @@ -12979,18 +13617,18 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonld-signatures@11.3.0: + jsonld-signatures@11.3.0(web-streams-polyfill@3.3.3): dependencies: '@digitalbazaar/security-context': 1.0.1 - jsonld: 8.3.2 + jsonld: 8.3.2(web-streams-polyfill@3.3.3) rdf-canonize: 4.0.1 serialize-error: 8.1.0 transitivePeerDependencies: - web-streams-polyfill - jsonld@8.3.2: + jsonld@8.3.2(web-streams-polyfill@3.3.3): dependencies: - '@digitalbazaar/http-client': 3.4.1 + '@digitalbazaar/http-client': 3.4.1(web-streams-polyfill@3.3.3) canonicalize: 1.0.8 lru-cache: 6.0.0 rdf-canonize: 3.4.0 @@ -13007,6 +13645,10 @@ snapshots: jwt-decode@4.0.0: {} + keygrip@1.1.0: + dependencies: + tsscmp: 1.0.6 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -13015,17 +13657,56 @@ snapshots: kleur@3.0.3: {} - ky-universal@0.11.0(ky@0.33.3): + koa-compose@4.1.0: {} + + koa-convert@2.0.0: + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + + koa@2.15.3: + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.9.1 + debug: 4.3.6 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + ky-universal@0.11.0(ky@0.33.3)(web-streams-polyfill@3.3.3): dependencies: abort-controller: 3.0.0 ky: 0.33.3 node-fetch: 3.3.2 + optionalDependencies: + web-streams-polyfill: 3.3.3 - ky-universal@0.8.2(ky@0.25.1): + ky-universal@0.8.2(ky@0.25.1)(web-streams-polyfill@3.3.3): dependencies: abort-controller: 3.0.0 ky: 0.25.1 node-fetch: 3.0.0-beta.9 + optionalDependencies: + web-streams-polyfill: 3.3.3 transitivePeerDependencies: - domexception @@ -13163,6 +13844,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + lowercase-keys@3.0.0: {} + lru-cache@10.4.3: {} lru-cache@4.1.5: @@ -13513,6 +14196,10 @@ snapshots: mimic-fn@2.1.0: {} + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -13602,6 +14289,8 @@ snapshots: nanoid@3.3.7: {} + nanoid@5.0.7: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -13683,6 +14372,8 @@ snapshots: normalize-path@3.0.0: {} + normalize-url@8.0.1: {} + npm-package-arg@7.0.0: dependencies: hosted-git-info: 3.0.8 @@ -13711,6 +14402,8 @@ snapshots: object-assign@4.1.1: {} + object-hash@3.0.0: {} + object-inspect@1.13.2: {} object-keys@1.1.1: {} @@ -13741,6 +14434,26 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + oidc-provider@8.5.1: + dependencies: + '@koa/cors': 5.0.0 + '@koa/router': 12.0.1 + debug: 4.3.6 + eta: 3.5.0 + got: 13.0.0 + jose: 5.8.0 + jsesc: 3.0.2 + koa: 2.15.3 + nanoid: 5.0.7 + object-hash: 3.0.0 + oidc-token-hash: 5.0.3 + quick-lru: 7.0.0 + raw-body: 2.5.2 + transitivePeerDependencies: + - supports-color + + oidc-token-hash@5.0.3: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -13763,6 +14476,8 @@ snapshots: dependencies: mimic-fn: 2.1.0 + only@0.0.2: {} + open@6.4.0: dependencies: is-wsl: 1.1.0 @@ -13828,6 +14543,8 @@ snapshots: outdent@0.5.0: {} + p-cancelable@3.0.0: {} + p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -13912,6 +14629,8 @@ snapshots: path-to-regexp@0.1.7: {} + path-to-regexp@6.2.2: {} + path-type@4.0.0: {} peek-readable@4.1.0: {} @@ -14086,6 +14805,10 @@ snapshots: queue-microtask@1.2.3: {} + quick-lru@5.1.1: {} + + quick-lru@7.0.0: {} + range-parser@1.2.1: {} raw-body@2.5.2: @@ -14124,82 +14847,36 @@ snapshots: react-is@18.3.1: {} - react-native-codegen@0.71.6(@babel/preset-env@7.25.3): + react-native-codegen@0.71.6(@babel/preset-env@7.25.3(@babel/core@7.25.2)): dependencies: '@babel/parser': 7.25.3 flow-parser: 0.185.2 - jscodeshift: 0.14.0(@babel/preset-env@7.25.3) + jscodeshift: 0.14.0(@babel/preset-env@7.25.3(@babel/core@7.25.2)) nullthrows: 1.1.1 transitivePeerDependencies: - '@babel/preset-env' - supports-color - react-native-fs@2.20.0(react-native@0.71.19): + react-native-fs@2.20.0(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)): dependencies: base-64: 0.1.0 - react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3)(react@18.2.0) + react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1) utf8: 3.0.0 - react-native-get-random-values@1.11.0(react-native@0.71.19): + react-native-get-random-values@1.11.0(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)): dependencies: fast-base64-decode: 1.0.0 - react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3)(react@18.2.0) + react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1) react-native-gradle-plugin@0.71.19: {} - react-native-securerandom@0.1.1(react-native@0.71.19): + react-native-securerandom@0.1.1(react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1)): dependencies: base64-js: 1.5.1 - react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3)(react@18.2.0) + react-native: 0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1) optional: true - react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3)(react@18.2.0): - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 10.2.7(@babel/core@7.25.2) - '@react-native-community/cli-platform-android': 10.2.0 - '@react-native-community/cli-platform-ios': 10.2.5 - '@react-native/assets': 1.0.0 - '@react-native/normalize-color': 2.1.0 - '@react-native/polyfills': 2.0.0 - abort-controller: 3.0.0 - anser: 1.4.10 - ansi-regex: 5.0.1 - base64-js: 1.5.1 - deprecated-react-native-prop-types: 3.0.2 - event-target-shim: 5.0.1 - invariant: 2.2.4 - jest-environment-node: 29.7.0 - jsc-android: 250231.0.0 - memoize-one: 5.2.1 - metro-react-native-babel-transformer: 0.73.10(@babel/core@7.25.2) - metro-runtime: 0.73.10 - metro-source-map: 0.73.10 - mkdirp: 0.5.6 - nullthrows: 1.1.1 - pretty-format: 26.6.2 - promise: 8.3.0 - react: 18.2.0 - react-devtools-core: 4.28.5 - react-native-codegen: 0.71.6(@babel/preset-env@7.25.3) - react-native-gradle-plugin: 0.71.19 - react-refresh: 0.4.3 - react-shallow-renderer: 16.15.0(react@18.2.0) - regenerator-runtime: 0.13.11 - scheduler: 0.23.2 - stacktrace-parser: 0.1.10 - use-sync-external-store: 1.2.2(react@18.2.0) - whatwg-fetch: 3.6.20 - ws: 6.2.3 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - utf-8-validate - - react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3)(react@18.3.1): + react-native@0.71.19(@babel/core@7.25.2)(@babel/preset-env@7.25.3(@babel/core@7.25.2))(react@18.3.1): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native-community/cli': 10.2.7(@babel/core@7.25.2) @@ -14227,7 +14904,7 @@ snapshots: promise: 8.3.0 react: 18.3.1 react-devtools-core: 4.28.5 - react-native-codegen: 0.71.6(@babel/preset-env@7.25.3) + react-native-codegen: 0.71.6(@babel/preset-env@7.25.3(@babel/core@7.25.2)) react-native-gradle-plugin: 0.71.19 react-refresh: 0.4.3 react-shallow-renderer: 16.15.0(react@18.3.1) @@ -14249,22 +14926,12 @@ snapshots: react-refresh@0.4.3: {} - react-shallow-renderer@16.15.0(react@18.2.0): - dependencies: - object-assign: 4.1.1 - react: 18.2.0 - react-is: 18.3.1 - react-shallow-renderer@16.15.0(react@18.3.1): dependencies: object-assign: 4.1.1 react: 18.3.1 react-is: 18.3.1 - react@18.2.0: - dependencies: - loose-envify: 1.4.0 - react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -14375,6 +15042,8 @@ snapshots: rc: 1.2.8 resolve: 1.7.1 + resolve-alpn@1.2.1: {} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -14399,6 +15068,10 @@ snapshots: dependencies: path-parse: 1.0.7 + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + restore-cursor@2.0.0: dependencies: onetime: 2.0.1 @@ -14916,14 +15589,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.4(@babel/core@7.25.2)(@jest/types@29.6.3)(jest@29.7.0)(typescript@5.5.4): + ts-jest@29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4): dependencies: - '@babel/core': 7.25.2 - '@jest/types': 29.6.3 bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2) + jest: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -14931,6 +15602,11 @@ snapshots: semver: 7.6.3 typescript: 5.5.4 yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4): dependencies: @@ -14966,6 +15642,15 @@ snapshots: tslog@4.9.3: {} + tsscmp@1.0.6: {} + + tsx@4.19.0: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + tsyringe@4.8.0: dependencies: tslib: 1.14.1 @@ -15126,10 +15811,6 @@ snapshots: url-join@4.0.0: {} - use-sync-external-store@1.2.2(react@18.2.0): - dependencies: - react: 18.2.0 - use-sync-external-store@1.2.2(react@18.3.1): dependencies: react: 18.3.1 @@ -15371,6 +16052,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + ylru@1.4.0: {} + yn@3.1.1: {} yocto-queue@0.1.0: {}