From 08be1ed009fb80e910cffa2e4cf376758798b27e Mon Sep 17 00:00:00 2001 From: Niels Klomp Date: Fri, 26 May 2023 12:56:38 +0200 Subject: [PATCH] fix: Many v11 fixes on server and client side --- .../lib/__tests__/issuerCallback.spec.ts | 6 +- packages/client/lib/AccessTokenClient.ts | 10 +- packages/client/lib/OpenID4VCIClient.ts | 12 +- .../lib/__tests__/JsonURIConversions.spec.ts | 65 ++- .../lib/functions/CredentialOfferUtil.ts | 17 +- packages/common/lib/functions/Encoding.ts | 8 +- packages/common/lib/functions/HttpUtils.ts | 2 +- .../common/lib/types/StateManager.types.ts | 2 +- .../issuer-rest/lib/IssuerTokenEndpoint.ts | 10 +- packages/issuer-rest/lib/OID4VCIServer.ts | 48 +- .../lib/__tests__/ClientIssuerIT.spec.ts | 242 ++++++++++ .../lib/__tests__/IssuerTokenServer.spec.ts | 4 +- packages/issuer-rest/lib/expressUtils.ts | 2 +- packages/issuer-rest/package.json | 1 + packages/issuer/lib/VcIssuer.ts | 7 +- .../issuer/lib/__tests__/VcIssuer.spec.ts | 60 ++- .../lib/__tests__/VcIssuerBuilder.spec.ts | 16 +- .../CredentialSupportedBuilderV1_11.ts | 11 +- .../lib/functions/CredentialOfferUtils.ts | 25 +- pnpm-lock.yaml | 414 +++++++++--------- 20 files changed, 681 insertions(+), 281 deletions(-) create mode 100644 packages/issuer-rest/lib/__tests__/ClientIssuerIT.spec.ts diff --git a/packages/callback-example/lib/__tests__/issuerCallback.spec.ts b/packages/callback-example/lib/__tests__/issuerCallback.spec.ts index 1225c13f..2311e217 100644 --- a/packages/callback-example/lib/__tests__/issuerCallback.spec.ts +++ b/packages/callback-example/lib/__tests__/issuerCallback.spec.ts @@ -73,7 +73,7 @@ xdescribe('issuerCallback', () => { //FIXME Here a CredentialFormatEnum is passed in, but later it is matched against a CredentialFormat .withFormat('jwt_vc_json') .withId('UniversityDegree_JWT') - .withCredentialDisplay({ + .withCredentialSupportedDisplay({ name: 'University Credential', locale: 'en-US', logo: { @@ -83,7 +83,7 @@ xdescribe('issuerCallback', () => { background_color: '#12107c', text_color: '#FFFFFF', }) - .withIssuerCredentialSubjectDisplay('given_name', { + .addCredentialSubjectPropertyDisplay('given_name', { name: 'given name', locale: 'en-US', } as IssuerCredentialSubjectDisplay) @@ -93,7 +93,7 @@ xdescribe('issuerCallback', () => { issuerState: 'existing-state', clientId, createdAt: +new Date(), - userPin: 123456, + userPin: '123456', credentialOffer: { credential_offer: { credential_issuer: 'did:key:test', diff --git a/packages/client/lib/AccessTokenClient.ts b/packages/client/lib/AccessTokenClient.ts index 6ba8959f..73e25705 100644 --- a/packages/client/lib/AccessTokenClient.ts +++ b/packages/client/lib/AccessTokenClient.ts @@ -29,8 +29,12 @@ export class AccessTokenClient { const credentialOffer = await assertedUniformCredentialOffer(opts.credentialOffer); const isPinRequired = this.isPinRequiredValue(credentialOffer.credential_offer); + const issuer = getIssuerFromCredentialOfferPayload(credentialOffer.credential_offer) ?? (metadata?.issuer as string); + if (!issuer) { + throw Error('Issuer required at this point'); + } const issuerOpts = { - issuer: getIssuerFromCredentialOfferPayload(credentialOffer.credential_offer) ?? (metadata?.issuer as string), + issuer, }; return await this.acquireAccessTokenUsingRequest({ @@ -96,7 +100,7 @@ export class AccessTokenClient { request[PRE_AUTH_CODE_LITERAL] = credentialOfferRequest?.credential_offer.grants?.['urn:ietf:params:oauth:grant-type:pre-authorized_code']?.[PRE_AUTH_CODE_LITERAL]; } - if (credentialOfferRequest.credential_offer.grants?.authorization_code?.issuer_state) { + if (!isPreAuth && credentialOfferRequest.credential_offer.grants?.authorization_code?.issuer_state) { this.throwNotSupportedFlow(); // not supported yet request.grant_type = GrantTypes.AUTHORIZATION_CODE; } @@ -215,7 +219,7 @@ export class AccessTokenClient { } else if (metadata?.token_endpoint) { url = metadata.token_endpoint; } else { - if (!issuerOpts) { + if (!issuerOpts?.issuer) { throw Error('Either authorization server options, a token endpoint or issuer options are required at this point'); } url = this.creatTokenURLFromURL(issuerOpts.issuer, asOpts?.allowInsecureEndpoints, issuerOpts.tokenEndpoint); diff --git a/packages/client/lib/OpenID4VCIClient.ts b/packages/client/lib/OpenID4VCIClient.ts index c7617824..3eec68db 100644 --- a/packages/client/lib/OpenID4VCIClient.ts +++ b/packages/client/lib/OpenID4VCIClient.ts @@ -197,6 +197,7 @@ export class OpenID4VCIClient { } return authorizationDetails; } + private handleLocations(authorizationDetails: AuthDetails) { if (authorizationDetails && (this.endpointMetadata.issuerMetadata?.authorization_server || this.endpointMetadata.authorization_endpoint)) { if (authorizationDetails.locations) { @@ -212,19 +213,14 @@ export class OpenID4VCIClient { return authorizationDetails; } - public async acquireAccessToken({ - pin, - clientId, - codeVerifier, - code, - redirectUri, - }: { + public async acquireAccessToken(opts?: { pin?: string; clientId?: string; codeVerifier?: string; code?: string; redirectUri?: string; }): Promise { + const { pin, clientId, codeVerifier, code, redirectUri } = opts ?? {}; this.assertIssuerData(); if (clientId) { this._clientId = clientId; @@ -239,7 +235,7 @@ export class OpenID4VCIClient { codeVerifier, code, redirectUri, - asOpts: { clientId: this.clientId }, + asOpts: { clientId }, }); if (response.errorBody) { diff --git a/packages/client/lib/__tests__/JsonURIConversions.spec.ts b/packages/client/lib/__tests__/JsonURIConversions.spec.ts index f63dd583..d113407c 100644 --- a/packages/client/lib/__tests__/JsonURIConversions.spec.ts +++ b/packages/client/lib/__tests__/JsonURIConversions.spec.ts @@ -1,6 +1,6 @@ import { convertJsonToURI, convertURIToJsonObject, OpenId4VCIVersion } from '@sphereon/oid4vci-common'; -describe('JSON To URI', () => { +describe('JSON To URI v8', () => { it('should parse an object into open-id-URI with a single credential_type', () => { expect( convertJsonToURI( @@ -11,7 +11,7 @@ describe('JSON To URI', () => { }, { uriTypeProperties: ['issuer', 'credential_type'], - version: OpenId4VCIVersion.VER_1_0_09, + version: OpenId4VCIVersion.VER_1_0_08, } ) ).toEqual( @@ -29,7 +29,7 @@ describe('JSON To URI', () => { { arrayTypeProperties: ['credential_type'], uriTypeProperties: ['issuer', 'credential_type'], - version: OpenId4VCIVersion.VER_1_0_09, + version: OpenId4VCIVersion.VER_1_0_08, } ) ).toEqual( @@ -47,7 +47,7 @@ describe('JSON To URI', () => { { arrayTypeProperties: ['credential_type'], uriTypeProperties: ['issuer', 'credential_type'], - version: OpenId4VCIVersion.VER_1_0_09, + version: OpenId4VCIVersion.VER_1_0_08, } ) ).toEqual( @@ -55,6 +55,63 @@ describe('JSON To URI', () => { ); }); }); + +describe('JSON To URI v9', () => { + it('should parse an object into open-id-URI with a single credential_type', () => { + expect( + convertJsonToURI( + { + issuer: 'https://server.example.com', + credential_type: 'https://did.example.org/healthCard', + op_state: 'eyJhbGciOiJSU0Et...FYUaBy', + }, + { + uriTypeProperties: ['issuer', 'credential_type'], + version: OpenId4VCIVersion.VER_1_0_09, + } + ) + ).toEqual( + '%7B%22issuer%22%3A%22https%3A%2F%2Fserver.example.com%22%2C%22credential_type%22%3A%22https%3A%2F%2Fdid.example.org%2FhealthCard%22%2C%22op_state%22%3A%22eyJhbGciOiJSU0Et...FYUaBy%22%7D' + ); + }); + it('should parse an object into open-id-URI with an array of credential_type', () => { + expect( + convertJsonToURI( + { + issuer: 'https://server.example.com', + credential_type: ['https://did.example.org/healthCard', 'https://did.example.org/driverLicense'], + op_state: 'eyJhbGciOiJSU0Et...FYUaBy', + }, + { + arrayTypeProperties: ['credential_type'], + uriTypeProperties: ['issuer', 'credential_type'], + version: OpenId4VCIVersion.VER_1_0_09, + } + ) + ).toEqual( + '%7B%22issuer%22%3A%22https%3A%2F%2Fserver.example.com%22%2C%22credential_type%22%3A%5B%22https%3A%2F%2Fdid.example.org%2FhealthCard%22%2C%22https%3A%2F%2Fdid.example.org%2FdriverLicense%22%5D%2C%22op_state%22%3A%22eyJhbGciOiJSU0Et...FYUaBy%22%7D' + ); + }); + it('should parse an object into open-id-URI with an array of credential_type and json string', () => { + expect( + convertJsonToURI( + JSON.stringify({ + issuer: 'https://server.example.com', + credential_type: ['https://did.example.org/healthCard', 'https://did.example.org/driverLicense'], + op_state: 'eyJhbGciOiJSU0Et...FYUaBy', + }), + { + arrayTypeProperties: ['credential_type'], + uriTypeProperties: ['issuer', 'credential_type'], + version: OpenId4VCIVersion.VER_1_0_09, + } + ) + ).toEqual( + '%7B%22issuer%22%3A%22https%3A%2F%2Fserver.example.com%22%2C%22credential_type%22%3A%5B%22https%3A%2F%2Fdid.example.org%2FhealthCard%22%2C%22https%3A%2F%2Fdid.example.org%2FdriverLicense%22%5D%2C%22op_state%22%3A%22eyJhbGciOiJSU0Et...FYUaBy%22%7D' + ); + }); +}); + describe('URI To Json Object', () => { it('should parse open-id-URI as json object with a single credential_type', () => { expect( diff --git a/packages/common/lib/functions/CredentialOfferUtil.ts b/packages/common/lib/functions/CredentialOfferUtil.ts index 09abafe1..2411c3fd 100644 --- a/packages/common/lib/functions/CredentialOfferUtil.ts +++ b/packages/common/lib/functions/CredentialOfferUtil.ts @@ -79,9 +79,11 @@ export function isCredentialOfferVersion(offer: CredentialOfferPayload | Credent } const version = determineSpecVersionFromOffer(offer); if (version.valueOf() < min.valueOf()) { - throw Error(`Credential offer version (${version.valueOf()}) is lower than minimum required version (${min.valueOf()})`); + console.log(`Credential offer version (${version.valueOf()}) is lower than minimum required version (${min.valueOf()})`); + return false; } else if (max && version.valueOf() > max.valueOf()) { - throw Error(`Credential offer version (${version.valueOf()}) is higher than maximum required version (${max.valueOf()})`); + console.log(`Credential offer version (${version.valueOf()}) is higher than maximum required version (${max.valueOf()})`); + return false; } return true; } @@ -182,7 +184,7 @@ export async function assertedUniformCredentialOffer( if (!credentialOffer.credential_offer) { throw Error(`No credential_offer present`); } - credentialOffer.credential_offer = await toUniformCredentialOfferPayload(credentialOffer.credential_offer); + credentialOffer.credential_offer = await toUniformCredentialOfferPayload(credentialOffer.credential_offer, { version: credentialOffer.version }); return credentialOffer as AssertedUniformCredentialOffer; } @@ -203,6 +205,7 @@ export function toUniformCredentialOfferPayload( version?: OpenId4VCIVersion; } ): UniformCredentialOfferPayload { + // todo: create test to check idempotence once a payload is already been made uniform. const version = opts?.version ?? determineSpecVersionFromOffer(offer); if (version >= OpenId4VCIVersion.VER_1_0_11) { const orig = offer as UniformCredentialOfferPayload; @@ -210,11 +213,12 @@ export function toUniformCredentialOfferPayload( ...orig, }; } - const grants: Grant = {}; + const grants: Grant = 'grants' in offer ? (offer.grants as Grant) : {}; let offerPayloadAsV8V9 = offer as CredentialOfferPayloadV1_0_08 | CredentialOfferPayloadV1_0_09; if (isCredentialOfferVersion(offer, OpenId4VCIVersion.VER_1_0_08, OpenId4VCIVersion.VER_1_0_09)) { if (offerPayloadAsV8V9.op_state) { grants.authorization_code = { + ...grants.authorization_code, issuer_state: offerPayloadAsV8V9.op_state, }; } @@ -231,11 +235,12 @@ export function toUniformCredentialOfferPayload( }; } } + const issuer = getIssuerFromCredentialOfferPayload(offer); if (version === OpenId4VCIVersion.VER_1_0_09) { offerPayloadAsV8V9 = offer as CredentialOfferPayloadV1_0_09; return { // credential_definition: getCredentialsSupported(never, offerPayloadAsV8V9.credentials).map(sup => {credentialSubject: sup.credentialSubject})[0], - credential_issuer: offerPayloadAsV8V9.issuer, + credential_issuer: issuer ?? offerPayloadAsV8V9.issuer, credentials: offerPayloadAsV8V9.credentials, grants, }; @@ -243,7 +248,7 @@ export function toUniformCredentialOfferPayload( if (version === OpenId4VCIVersion.VER_1_0_08) { offerPayloadAsV8V9 = offer as CredentialOfferPayloadV1_0_08; return { - credential_issuer: offerPayloadAsV8V9.issuer, + credential_issuer: issuer ?? offerPayloadAsV8V9.issuer, credentials: Array.isArray(offerPayloadAsV8V9.credential_type) ? offerPayloadAsV8V9.credential_type : [offerPayloadAsV8V9.credential_type], grants, } as UniformCredentialOfferPayload; diff --git a/packages/common/lib/functions/Encoding.ts b/packages/common/lib/functions/Encoding.ts index 72818142..38f2209a 100644 --- a/packages/common/lib/functions/Encoding.ts +++ b/packages/common/lib/functions/Encoding.ts @@ -32,7 +32,10 @@ export function convertJsonToURI( } let components: string; - if (opts?.version && opts.version < OpenId4VCIVersion.VER_1_0_11) { + if (opts?.version && opts.version > OpenId4VCIVersion.VER_1_0_08) { + // v11 changed from encoding every param to a encoded json object with a credential_offer param key + components = encodeAndStripWhitespace(JSON.stringify(json)); + } else { for (const [key, value] of Object.entries(json)) { if (!value) { continue; @@ -60,9 +63,6 @@ export function convertJsonToURI( results.push(encoded); } components = results.join('&'); - } else { - // v11 changed from encoding every param to a encoded json object with a credential_offer param key - components = encodeAndStripWhitespace(JSON.stringify(json)); } if (opts?.baseUrl) { if (opts.baseUrl.endsWith('=')) { diff --git a/packages/common/lib/functions/HttpUtils.ts b/packages/common/lib/functions/HttpUtils.ts index a5bd1322..b1802bba 100644 --- a/packages/common/lib/functions/HttpUtils.ts +++ b/packages/common/lib/functions/HttpUtils.ts @@ -76,7 +76,7 @@ const openIdFetch = async ( const isJSONResponse = accept === 'application/json' || origResponse.headers.get('Content-Type') === 'application/json'; const success = origResponse && origResponse.status >= 200 && origResponse.status < 400; const responseText = await origResponse.text(); - const responseBody = isJSONResponse ? JSON.parse(responseText) : responseText; + const responseBody = isJSONResponse && responseText.includes('{') ? JSON.parse(responseText) : responseText; debug(`${success ? 'success' : 'error'} status: ${origResponse.status}, body:\r\n${JSON.stringify(responseBody)}`); if (!success && opts?.exceptionOnHttpErrorStatus) { diff --git a/packages/common/lib/types/StateManager.types.ts b/packages/common/lib/types/StateManager.types.ts index 2dd97c39..9731f3f1 100644 --- a/packages/common/lib/types/StateManager.types.ts +++ b/packages/common/lib/types/StateManager.types.ts @@ -7,7 +7,7 @@ export interface StateType { export interface CredentialOfferSession extends StateType { clientId?: string; credentialOffer: CredentialOfferV1_0_11; - userPin?: number; + userPin?: string; issuerState?: string; //todo: Probably good to hash it here, since it would come in from the client and we could match the hash and thus use the client value preAuthorizedCode?: string; //todo: Probably good to hash it here, since it would come in from the client and we could match the hash and thus use the client value } diff --git a/packages/issuer-rest/lib/IssuerTokenEndpoint.ts b/packages/issuer-rest/lib/IssuerTokenEndpoint.ts index 3214dad3..571b76be 100644 --- a/packages/issuer-rest/lib/IssuerTokenEndpoint.ts +++ b/packages/issuer-rest/lib/IssuerTokenEndpoint.ts @@ -3,13 +3,11 @@ import { Alg, CredentialOfferSession, EXPIRED_PRE_AUTHORIZED_CODE, - getNumberOrUndefined, GrantType, INVALID_PRE_AUTHORIZED_CODE, Jwt, JWTSignerCallback, PIN_NOT_MATCH_ERROR, - PIN_NOT_MATCHING_ERROR, PIN_VALIDATION_ERROR, PRE_AUTH_CODE_LITERAL, PRE_AUTHORIZED_CODE_REQUIRED_ERROR, @@ -183,13 +181,7 @@ export const verifyTokenRequest = ({ error_message: PIN_VALIDATION_ERROR, }) } - if (credentialOfferSession.userPin != getNumberOrUndefined(request.body.user_pin)) { - return sendErrorResponse(response, 400, { - error: TokenErrorResponse.invalid_grant, - error_message: PIN_NOT_MATCHING_ERROR, - }) - } - if (getNumberOrUndefined(request.body.user_pin) !== credentialOfferSession.userPin) { + if (request.body.user_pin !== credentialOfferSession.userPin) { return sendErrorResponse(response, 400, { error: TokenErrorResponse.invalid_grant, error_message: PIN_NOT_MATCH_ERROR, diff --git a/packages/issuer-rest/lib/OID4VCIServer.ts b/packages/issuer-rest/lib/OID4VCIServer.ts index ef1bae89..30dbcfa2 100644 --- a/packages/issuer-rest/lib/OID4VCIServer.ts +++ b/packages/issuer-rest/lib/OID4VCIServer.ts @@ -30,7 +30,7 @@ function buildVCIFromEnvironment() { .withFormat(process.env.credential_supported_format as unknown as OID4VCICredentialFormat) .withId(process.env.credential_supported_id as string) .withTypes([process.env.credential_supported_types_1 as string, process.env.credential_supported_types_2 as string]) - .withCredentialDisplay({ + .withCredentialSupportedDisplay({ name: process.env.credential_display_name as string, locale: process.env.credential_display_locale as string, logo: { @@ -40,7 +40,7 @@ function buildVCIFromEnvironment() { background_color: process.env.credential_display_background_color as string, text_color: process.env.credential_display_text_color as string, }) - .withIssuerCredentialSubjectDisplay( + .addCredentialSubjectPropertyDisplay( process.env.credential_subject_display_key1 as string, { name: process.env.credential_subject_display_key1_name as string, @@ -124,7 +124,7 @@ export class OID4VCIServer { const issuerEndpoint = this.issuer.issuerMetadata.token_endpoint let path: string - const accessTokenIssuer = tokenEndpointOpts?.accessTokenIssuer ?? process.env.ACCESS_TOKEN_ISSUER + const accessTokenIssuer = tokenEndpointOpts?.accessTokenIssuer ?? process.env.ACCESS_TOKEN_ISSUER ?? this.issuer.issuerMetadata.credential_issuer const preAuthorizedCodeExpirationDuration = tokenEndpointOpts?.preAuthorizedCodeExpirationDuration ?? getNumberOrUndefined(process.env.PRE_AUTHORIZED_CODE_EXPIRATION_DURATION) ?? 300000 @@ -132,22 +132,30 @@ export class OID4VCIServer { const tokenExpiresIn = tokenEndpointOpts?.tokenExpiresIn ?? 300 // todo: this means we cannot sign JWTs or issue access tokens when configured from env vars! - if (!tokenEndpointOpts?.accessTokenSignerCallback) { + if (tokenEndpointOpts?.accessTokenSignerCallback === undefined) { throw new Error(JWT_SIGNER_CALLBACK_REQUIRED_ERROR) } else if (!accessTokenIssuer) { throw new Error(ACCESS_TOKEN_ISSUER_REQUIRED_ERROR) } + let url: URL + let baseUrl = this._baseUrl?.toString() + if (baseUrl.endsWith('/')) { + baseUrl = baseUrl.substring(0, baseUrl.length) + } if (!issuerEndpoint) { - path = this.extractPath(tokenEndpointOpts?.tokenPath ?? process.env.TOKEN_PATH ?? '/token') - // last replace fixes any baseUrl ending with a slash and path starting with a slash - this.issuer.issuerMetadata.token_endpoint = `${this._baseUrl.toString()}${path}`.replace('//', '/') + path = this.extractPath(tokenEndpointOpts?.tokenPath ?? process.env.TOKEN_PATH ?? '/token', true) + // let's fix any baseUrl ending with a slash as path will always start with a slash + + url = new URL(`${baseUrl}${path}`) + this.issuer.issuerMetadata.token_endpoint = url.toString() } else { this.assertEndpointHasIssuerBaseUrl(issuerEndpoint) path = this.extractPath(issuerEndpoint) + url = new URL(`${baseUrl}${path}`) } this.app.post( - path, + url.pathname, verifyTokenRequest({ issuer: this.issuer, preAuthorizedCodeExpirationDuration, @@ -164,7 +172,12 @@ export class OID4VCIServer { } private metadataEndpoint() { - this.app.get('/metadata', (request: Request, response: Response) => { + let basePath = this.extractPath(this._baseUrl.toString()) + if (basePath.endsWith('/')) { + basePath = basePath.substring(0, basePath.length) + } + const path = basePath + '/.well-known/openid-credential-issuer' + this.app.get(path, (request: Request, response: Response) => { return response.send(this.issuer.issuerMetadata) }) } @@ -284,6 +297,10 @@ export class OID4VCIServer { return this._issuer } + public stop() { + this.server.close() + } + private isTokenEndpointDisabled(tokenEndpointOpts?: ITokenEndpointOpts) { return tokenEndpointOpts?.tokenEndpointDisabled === true || process.env.TOKEN_ENDPOINT_DISABLED === 'true' } @@ -300,18 +317,23 @@ export class OID4VCIServer { } else { if (authServer) { throw Error( - `A Authorization Server (AS) was already enabled in the issuer metadata (${authServer}. Cannot both have an AS and enable the token endpoint at the same time ` + `A Authorization Server (AS) was already enabled in the issuer metadata (${authServer}). Cannot both have an AS and enable the token endpoint at the same time ` ) } } } - private extractPath(endpoint: string) { + private extractPath(endpoint: string, skipBaseUrlCheck?: boolean) { if (endpoint.startsWith('/')) { return endpoint } - this.assertEndpointHasIssuerBaseUrl(endpoint) - const path = endpoint.replace(this._baseUrl.toString(), '') + if (skipBaseUrlCheck !== true) { + this.assertEndpointHasIssuerBaseUrl(endpoint) + } + let path = endpoint + if (endpoint.toLowerCase().includes('://')) { + path = new URL(endpoint).pathname + } return path.startsWith('/') ? path : `/${path}` } diff --git a/packages/issuer-rest/lib/__tests__/ClientIssuerIT.spec.ts b/packages/issuer-rest/lib/__tests__/ClientIssuerIT.spec.ts new file mode 100644 index 00000000..d0d4982a --- /dev/null +++ b/packages/issuer-rest/lib/__tests__/ClientIssuerIT.spec.ts @@ -0,0 +1,242 @@ +import { KeyObject } from 'crypto' + +import { OpenID4VCIClient } from '@sphereon/oid4vci-client' +import { + Alg, + AuthzFlowType, + CredentialOfferSession, + CredentialSupported, + IssuerCredentialSubjectDisplay, + Jwt, + OpenId4VCIVersion, +} from '@sphereon/oid4vci-common' +import { VcIssuer } from '@sphereon/oid4vci-issuer/dist/VcIssuer' +import { CredentialSupportedBuilderV1_11, VcIssuerBuilder } from '@sphereon/oid4vci-issuer/dist/builder' +import { MemoryStates } from '@sphereon/oid4vci-issuer/dist/state-manager' +import { IProofPurpose, IProofType } from '@sphereon/ssi-types' +import * as jose from 'jose' + +import { OID4VCIServer } from '../OID4VCIServer' + +const ISSUER_URL = 'http://localhost:3456/test' + +describe('VcIssuer', () => { + let vcIssuer: VcIssuer + let server: OID4VCIServer + const issuerState = 'previously-created-state' + // const clientId = 'sphereon:wallet' + const preAuthorizedCode = 'test_code' + + /*const preAuthorizedCode1 = 'SplxlOBeZQQYbYS6WxSbIA1' + const preAuthorizedCode2 = 'SplxlOBeZQQYbYS6WxSbIA2' + const preAuthorizedCode3 = 'SplxlOBeZQQYbYS6WxSbIA3' +*/ + + beforeAll(async () => { + jest.clearAllMocks() + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const signerCallback = async (jwt: Jwt, kid?: string): Promise => { + const privateKey = (await jose.generateKeyPair(Alg.ES256)).privateKey as KeyObject + return new jose.SignJWT({ ...jwt.payload }).setProtectedHeader({ ...jwt.header, alg: Alg.ES256 }).sign(privateKey) + } + + const credentialsSupported: CredentialSupported = new CredentialSupportedBuilderV1_11() + .withCryptographicSuitesSupported('ES256K') + .withCryptographicBindingMethod('did') + //FIXME Here a CredentialFormatEnum is passed in, but later it is matched against a CredentialFormat + .withFormat('jwt_vc_json') + .withId('UniversityDegree_JWT') + .withCredentialSupportedDisplay({ + name: 'University Credential', + locale: 'en-US', + logo: { + url: 'https://exampleuniversity.com/public/logo.png', + alt_text: 'a square logo of a university', + }, + background_color: '#12107c', + text_color: '#FFFFFF', + }) + .addCredentialSubjectPropertyDisplay('given_name', { + name: 'given name', + locale: 'en-US', + } as IssuerCredentialSubjectDisplay) + .build() + const stateManager = new MemoryStates() + + vcIssuer = new VcIssuerBuilder() + // .withAuthorizationServer('https://authorization-server') + .withCredentialEndpoint('http://localhost:3456/test/credential-endpoint') + .withCredentialIssuer(ISSUER_URL) + .withIssuerDisplay({ + name: 'example issuer', + locale: 'en-US', + }) + .withCredentialsSupported(credentialsSupported) + .withCredentialOfferStateManager(stateManager) + .withInMemoryCNonceState() + .withInMemoryCredentialOfferURIState() + .withIssuerCallback(() => + Promise.resolve({ + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiableCredential'], + issuer: 'did:key:test', + issuanceDate: new Date().toISOString(), + credentialSubject: {}, + proof: { + type: IProofType.JwtProof2020, + jwt: 'ye.ye.ye', + created: new Date().toISOString(), + proofPurpose: IProofPurpose.assertionMethod, + verificationMethod: 'sdfsdfasdfasdfasdfasdfassdfasdf', + }, + }) + ) + .withJWTVerifyCallback(() => + Promise.resolve({ + header: { + typ: 'openid4vci-proof+jwt', + alg: Alg.ES256K, + kid: 'test-kid', + }, + payload: { + aud: 'https://credential-issuer', + iat: +new Date(), + nonce: 'test-nonce', + }, + }) + ) + .build() + + server = new OID4VCIServer({ + issuer: vcIssuer, + serverOpts: { baseUrl: 'http://localhost:3456/test', port: 3456 }, + tokenEndpointOpts: { accessTokenSignerCallback: signerCallback, tokenPath: 'test/token/path' }, + }) + }) + + afterAll(async () => { + jest.clearAllMocks() + server.stop() + // await new Promise((resolve) => setTimeout((v: void) => resolve(v), 500)) + }) + + let credOfferSession: CredentialOfferSession + let uri: string + let client: OpenID4VCIClient + it('should create credential offer', async () => { + expect(server.issuer).toBeDefined() + uri = await vcIssuer.createCredentialOfferURI({ + grants: { + authorization_code: { + issuer_state: issuerState, + }, + 'urn:ietf:params:oauth:grant-type:pre-authorized_code': { + 'pre-authorized_code': preAuthorizedCode, + user_pin_required: true, + }, + }, + credentials: ['UniversityDegree_JWT'], + scheme: 'http', + }) + expect(uri).toEqual( + 'http://localhost:3456/test?credential_offer=%7B%22grants%22%3A%7B%22authorization_code%22%3A%7B%22issuer_state%22%3A%22previously-created-state%22%7D%2C%22urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Apre-authorized_code%22%3A%7B%22pre-authorized_code%22%3A%22test_code%22%2C%22user_pin_required%22%3Atrue%7D%7D%2C%22credentials%22%3A%5B%22UniversityDegree_JWT%22%5D%2C%22credential_issuer%22%3A%22http%3A%2F%2Flocalhost%3A3456%2Ftest%22%7D' + ) + }) + + it('should create client from credential offer URI', async () => { + client = await OpenID4VCIClient.fromURI({ uri, flowType: AuthzFlowType.PRE_AUTHORIZED_CODE_FLOW }) + expect(client.credentialOffer).toEqual({ + baseUrl: 'http://localhost:3456/test', + credential_offer: { + credential_issuer: 'http://localhost:3456/test', + credentials: ['UniversityDegree_JWT'], + grants: { + authorization_code: { + issuer_state: 'previously-created-state', + }, + 'urn:ietf:params:oauth:grant-type:pre-authorized_code': { + 'pre-authorized_code': 'test_code', + user_pin_required: true, + }, + }, + }, + original_credential_offer: { + credential_issuer: 'http://localhost:3456/test', + credentials: ['UniversityDegree_JWT'], + grants: { + authorization_code: { + issuer_state: 'previously-created-state', + }, + 'urn:ietf:params:oauth:grant-type:pre-authorized_code': { + 'pre-authorized_code': 'test_code', + user_pin_required: true, + }, + }, + }, + scheme: 'http', + version: 1011, + }) + expect(client.getIssuer()).toEqual(ISSUER_URL) + expect(client.version()).toEqual(OpenId4VCIVersion.VER_1_0_11) + }) + + it('should retrieve server metadata', async () => { + await expect(client.retrieveServerMetadata()).resolves.toEqual({ + credential_endpoint: 'http://localhost:3456/test/credential-endpoint', + issuer: 'http://localhost:3456/test', + issuerMetadata: { + credential_endpoint: 'http://localhost:3456/test/credential-endpoint', + credential_issuer: 'http://localhost:3456/test', + credentials_supported: [ + { + credentialSubject: { + given_name: { + locale: 'en-US', + name: 'given name', + }, + }, + cryptographic_binding_methods_supported: ['did'], + cryptographic_suites_supported: ['ES256K'], + display: [ + { + background_color: '#12107c', + locale: 'en-US', + logo: { + alt_text: 'a square logo of a university', + url: 'https://exampleuniversity.com/public/logo.png', + }, + name: 'University Credential', + text_color: '#FFFFFF', + }, + ], + format: 'jwt_vc_json', + id: 'UniversityDegree_JWT', + }, + ], + display: [ + { + locale: 'en-US', + name: 'example issuer', + }, + ], + token_endpoint: 'http://localhost:3456/test/test/token/path', + }, + token_endpoint: 'http://localhost:3456/test/test/token/path', + }) + }) + it('should get state on server side', async () => { + const preAuthCode = + client.credentialOffer.credential_offer.grants?.['urn:ietf:params:oauth:grant-type:pre-authorized_code']?.['pre-authorized_code'] + expect(preAuthCode).toBeDefined() + + if (preAuthCode) { + credOfferSession = await vcIssuer.credentialOfferSessions.getAsserted(preAuthCode) + } + expect(credOfferSession).toBeDefined() + }) + + it('should acquire access token', async () => { + await expect(client.acquireAccessToken({ pin: credOfferSession.userPin })).resolves.toBeDefined() + }) +}) diff --git a/packages/issuer-rest/lib/__tests__/IssuerTokenServer.spec.ts b/packages/issuer-rest/lib/__tests__/IssuerTokenServer.spec.ts index 3ceebaf8..d8e256f1 100644 --- a/packages/issuer-rest/lib/__tests__/IssuerTokenServer.spec.ts +++ b/packages/issuer-rest/lib/__tests__/IssuerTokenServer.spec.ts @@ -19,7 +19,7 @@ import requests from 'supertest' import { OID4VCIServer } from '../OID4VCIServer' -describe('OID4VCIServer', () => { +xdescribe('OID4VCIServer', () => { let app: Express let server: http.Server const preAuthorizedCode1 = 'SplxlOBeZQQYbYS6WxSbIA1' @@ -35,7 +35,7 @@ describe('OID4VCIServer', () => { const credentialOfferState1: CredentialOfferSession = { preAuthorizedCode: preAuthorizedCode1, - userPin: 493536, + userPin: '493536', createdAt: +new Date(), credentialOffer: { credential_offer: { diff --git a/packages/issuer-rest/lib/expressUtils.ts b/packages/issuer-rest/lib/expressUtils.ts index ec979048..67a6f0d8 100644 --- a/packages/issuer-rest/lib/expressUtils.ts +++ b/packages/issuer-rest/lib/expressUtils.ts @@ -23,7 +23,7 @@ export const validateRequestBody = ({ } export const sendErrorResponse = (response: Response, statusCode: number, message: any, error?: any) => { - console.log(`${message} ${error}`) + console.log(`${JSON.stringify(message)} ${error}`) response.statusCode = statusCode response.status(statusCode).send(message) } diff --git a/packages/issuer-rest/package.json b/packages/issuer-rest/package.json index 0ee3cab3..436178c4 100644 --- a/packages/issuer-rest/package.json +++ b/packages/issuer-rest/package.json @@ -21,6 +21,7 @@ "uuid": "^9.0.0" }, "devDependencies": { + "@sphereon/oid4vci-client": "workspace:*", "@types/body-parser": "^1.19.2", "@types/cookie-parser": "^1.4.3", "@types/cors": "^2.8.13", diff --git a/packages/issuer/lib/VcIssuer.ts b/packages/issuer/lib/VcIssuer.ts index 79f2e756..fea12471 100644 --- a/packages/issuer/lib/VcIssuer.ts +++ b/packages/issuer/lib/VcIssuer.ts @@ -82,8 +82,8 @@ export class VcIssuer { credentials?: (CredentialOfferFormat | string)[] credentialDefinition?: IssuerCredentialDefinition credentialOfferUri?: string - scheme?: string baseUri?: string + scheme?: string }): Promise { const { grants, credentials, credentialDefinition } = opts if (!grants?.authorization_code && !grants?.['urn:ietf:params:oauth:grant-type:pre-authorized_code']) { @@ -128,10 +128,10 @@ export class VcIssuer { issuerState, }) - let userPin: number | undefined + let userPin: string | undefined // todo: Double check this can only happen in pre-auth flow and if so make sure to not do the below when in a state is present (authorized flow) if (userPinRequired) { - userPin = Math.round(9999 * Math.random()) + userPin = ('' + Math.round(9999 * Math.random())).padStart(4, '0') } const createdAt = +new Date() if (opts?.credentialOfferUri) { @@ -224,6 +224,7 @@ export class VcIssuer { c_nonce_expires_in: this._cNonceExpiresIn, } } + /* private async retrieveGrantsAndCredentialOfferSession(id: string): Promise<{ clientId?: string; diff --git a/packages/issuer/lib/__tests__/VcIssuer.spec.ts b/packages/issuer/lib/__tests__/VcIssuer.spec.ts index a5cb1c05..8372b307 100644 --- a/packages/issuer/lib/__tests__/VcIssuer.spec.ts +++ b/packages/issuer/lib/__tests__/VcIssuer.spec.ts @@ -30,7 +30,7 @@ describe('VcIssuer', () => { //FIXME Here a CredentialFormatEnum is passed in, but later it is matched against a CredentialFormat .withFormat('jwt_vc_json') .withId('UniversityDegree_JWT') - .withCredentialDisplay({ + .withCredentialSupportedDisplay({ name: 'University Credential', locale: 'en-US', logo: { @@ -40,7 +40,7 @@ describe('VcIssuer', () => { background_color: '#12107c', text_color: '#FFFFFF', }) - .withIssuerCredentialSubjectDisplay('given_name', { + .addCredentialSubjectPropertyDisplay('given_name', { name: 'given name', locale: 'en-US', } as IssuerCredentialSubjectDisplay) @@ -51,7 +51,7 @@ describe('VcIssuer', () => { clientId, preAuthorizedCode, createdAt: +new Date(), - userPin: 123456, + userPin: '123456', credentialOffer: { credential_offer: { credential_issuer: 'did:key:test', @@ -135,7 +135,7 @@ describe('VcIssuer', () => { baseUri: 'issuer-example.com', }) expect(uri).toEqual( - 'http://issuer-example.com?credential_offer=%7B%22grants%22%3A%7B%22authorization_code%22%3A%7B%22issuer_state%22%3A%22previously-created-state%22%7D%2C%22urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Apre-authorized_code%22%3A%7B%22pre-authorized_code%22%3A%22test_code%22%2C%22user_pin_required%22%3Atrue%7D%7D%2C%22credential_issuer%22%3A%22https%3A%2F%2Fissuer.research.identiproof.io%22%7D' + 'http://issuer-example.com?credential_offer=%7B%22grants%22%3A%7B%22authorization_code%22%3A%7B%22issuer_state%22%3A%22previously-created-state%22%7D%2C%22urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Apre-authorized_code%22%3A%7B%22pre-authorized_code%22%3A%22test_code%22%2C%22user_pin_required%22%3Atrue%7D%7D%2C%22credential_issuer%22%3A%22https%3A%2F%2Fissuer.research.identiproof.io%22%2C%22credentials%22%3A%5B%7B%22format%22%3A%22jwt_vc_json%22%2C%22credentialSubject%22%3A%7B%22given_name%22%3A%7B%22name%22%3A%22given%20name%22%2C%22locale%22%3A%22en-US%22%7D%7D%2C%22cryptographic_suites_supported%22%3A%5B%22ES256K%22%5D%2C%22cryptographic_binding_methods_supported%22%3A%5B%22did%22%5D%2C%22id%22%3A%22UniversityDegree_JWT%22%2C%22display%22%3A%5B%7B%22name%22%3A%22University%20Credential%22%2C%22locale%22%3A%22en-US%22%2C%22logo%22%3A%7B%22url%22%3A%22https%3A%2F%2Fexampleuniversity.com%2Fpublic%2Flogo.png%22%2C%22alt_text%22%3A%22a%20square%20logo%20of%20a%20university%22%7D%2C%22background_color%22%3A%22%2312107c%22%2C%22text_color%22%3A%22%23FFFFFF%22%7D%5D%7D%5D%7D' ) const client = await OpenID4VCIClient.fromURI({ uri, flowType: AuthzFlowType.PRE_AUTHORIZED_CODE_FLOW }) @@ -143,6 +143,32 @@ describe('VcIssuer', () => { baseUrl: 'http://issuer-example.com', credential_offer: { credential_issuer: 'https://issuer.research.identiproof.io', + credentials: [ + { + credentialSubject: { + given_name: { + locale: 'en-US', + name: 'given name', + }, + }, + cryptographic_binding_methods_supported: ['did'], + cryptographic_suites_supported: ['ES256K'], + display: [ + { + background_color: '#12107c', + locale: 'en-US', + logo: { + alt_text: 'a square logo of a university', + url: 'https://exampleuniversity.com/public/logo.png', + }, + name: 'University Credential', + text_color: '#FFFFFF', + }, + ], + format: 'jwt_vc_json', + id: 'UniversityDegree_JWT', + }, + ], grants: { authorization_code: { issuer_state: 'previously-created-state', @@ -155,6 +181,32 @@ describe('VcIssuer', () => { }, original_credential_offer: { credential_issuer: 'https://issuer.research.identiproof.io', + credentials: [ + { + credentialSubject: { + given_name: { + locale: 'en-US', + name: 'given name', + }, + }, + cryptographic_binding_methods_supported: ['did'], + cryptographic_suites_supported: ['ES256K'], + display: [ + { + background_color: '#12107c', + locale: 'en-US', + logo: { + alt_text: 'a square logo of a university', + url: 'https://exampleuniversity.com/public/logo.png', + }, + name: 'University Credential', + text_color: '#FFFFFF', + }, + ], + format: 'jwt_vc_json', + id: 'UniversityDegree_JWT', + }, + ], grants: { authorization_code: { issuer_state: 'previously-created-state', diff --git a/packages/issuer/lib/__tests__/VcIssuerBuilder.spec.ts b/packages/issuer/lib/__tests__/VcIssuerBuilder.spec.ts index b07c556d..18b2517b 100644 --- a/packages/issuer/lib/__tests__/VcIssuerBuilder.spec.ts +++ b/packages/issuer/lib/__tests__/VcIssuerBuilder.spec.ts @@ -10,7 +10,7 @@ describe('VcIssuer builder should', () => { .withCryptographicBindingMethod('did') .withFormat('jwt_vc_json') .withId('UniversityDegree_JWT') - .withCredentialDisplay({ + .withCredentialSupportedDisplay({ name: 'University Credential', locale: 'en-US', logo: { @@ -20,7 +20,7 @@ describe('VcIssuer builder should', () => { background_color: '#12107c', text_color: '#FFFFFF', }) - .withIssuerCredentialSubjectDisplay('given_name', { + .addCredentialSubjectPropertyDisplay('given_name', { name: 'given name', locale: 'en-US', } as IssuerCredentialSubjectDisplay) @@ -49,7 +49,7 @@ describe('VcIssuer builder should', () => { .withCryptographicBindingMethod('did') .withFormat('jwt_vc_json') .withId('UniversityDegree_JWT') - .withCredentialDisplay({ + .withCredentialSupportedDisplay({ name: 'University Credential', locale: 'en-US', logo: { @@ -59,7 +59,7 @@ describe('VcIssuer builder should', () => { background_color: '#12107c', text_color: '#FFFFFF', }) - .withIssuerCredentialSubjectDisplay('given_name', { + .addCredentialSubjectPropertyDisplay('given_name', { name: 'given name', locale: 'en-US', } as IssuerCredentialSubjectDisplay) @@ -92,7 +92,7 @@ describe('VcIssuer builder should', () => { .withCryptographicBindingMethod('did') .withFormat('jwt_vc_json') .withId('UniversityDegree_JWT') - .withCredentialDisplay({ + .withCredentialSupportedDisplay({ name: 'University Credential', locale: 'en-US', logo: { @@ -102,7 +102,7 @@ describe('VcIssuer builder should', () => { background_color: '#12107c', text_color: '#FFFFFF', }) - .withIssuerCredentialSubjectDisplay('given_name', { + .addCredentialSubjectPropertyDisplay('given_name', { name: 'given name', locale: 'en-US', } as IssuerCredentialSubjectDisplay) @@ -126,12 +126,12 @@ describe('VcIssuer builder should', () => { issuerState: v4(), clientId: 'test_client', createdAt: preAuthorizedCodecreatedAt, - userPin: 123456, + userPin: '123456', credentialOffer: { credential_offer: { credentials: ['test_credential'], credential_issuer: 'test_issuer' } }, }) await expect(vcIssuer.credentialOfferSessions?.get('test')).resolves.toMatchObject({ clientId: 'test_client', - userPin: 123456, + userPin: '123456', createdAt: preAuthorizedCodecreatedAt, credentialOffer: { credential_offer: { credentials: ['test_credential'], credential_issuer: 'test_issuer' } }, }) diff --git a/packages/issuer/lib/builder/CredentialSupportedBuilderV1_11.ts b/packages/issuer/lib/builder/CredentialSupportedBuilderV1_11.ts index db9f20f2..fe85ecde 100644 --- a/packages/issuer/lib/builder/CredentialSupportedBuilderV1_11.ts +++ b/packages/issuer/lib/builder/CredentialSupportedBuilderV1_11.ts @@ -74,7 +74,7 @@ export class CredentialSupportedBuilderV1_11 { return this } - addCredentialDisplay(credentialDisplay: CredentialsSupportedDisplay | CredentialsSupportedDisplay[]): CredentialSupportedBuilderV1_11 { + addCredentialSupportedDisplay(credentialDisplay: CredentialsSupportedDisplay | CredentialsSupportedDisplay[]): CredentialSupportedBuilderV1_11 { if (!Array.isArray(credentialDisplay)) { this.display = this.display ? [...this.display, credentialDisplay] : [credentialDisplay] } else { @@ -83,12 +83,17 @@ export class CredentialSupportedBuilderV1_11 { return this } - withCredentialDisplay(credentialDisplay: CredentialsSupportedDisplay | CredentialsSupportedDisplay[]): CredentialSupportedBuilderV1_11 { + withCredentialSupportedDisplay(credentialDisplay: CredentialsSupportedDisplay | CredentialsSupportedDisplay[]): CredentialSupportedBuilderV1_11 { this.display = Array.isArray(credentialDisplay) ? credentialDisplay : [credentialDisplay] return this } - withIssuerCredentialSubjectDisplay( + withCredentialSubjectDisplay(credentialSubject: IssuerCredentialSubject) { + this.credentialSubject = credentialSubject + return this + } + + addCredentialSubjectPropertyDisplay( subjectProperty: string, issuerCredentialSubjectDisplay: IssuerCredentialSubjectDisplay ): CredentialSupportedBuilderV1_11 { diff --git a/packages/issuer/lib/functions/CredentialOfferUtils.ts b/packages/issuer/lib/functions/CredentialOfferUtils.ts index 10c5513b..48772834 100644 --- a/packages/issuer/lib/functions/CredentialOfferUtils.ts +++ b/packages/issuer/lib/functions/CredentialOfferUtils.ts @@ -24,19 +24,38 @@ export function createCredentialOfferObject( if (!issuerMetadata && !opts?.credentialOffer && !opts?.credentialOfferUri) { throw new Error('You have to provide issuerMetadata or credentialOffer object for creating a deeplink') } - const baseUri = opts?.baseUri ?? '' const scheme = opts?.scheme?.replace('://', '') ?? 'openid-credential-offer' + let baseUri: string + if (opts?.baseUri) { + baseUri = opts.baseUri + } else if (scheme.startsWith('http')) { + if (issuerMetadata?.credential_issuer) { + baseUri = issuerMetadata?.credential_issuer + if (!baseUri.startsWith(`${scheme}://`)) { + throw Error(`schem ${scheme} is different from base uri ${baseUri}`) + } + baseUri = baseUri.replace(`${scheme}://`, '') + } else { + throw Error(`A '${scheme}' scheme requires a URI to be present as baseUri`) + } + } else { + baseUri = '' + } + const credential_offer_uri = opts?.credentialOfferUri ? `${scheme}://${baseUri}?credential_offer_uri=${opts?.credentialOfferUri}` : undefined let credential_offer: CredentialOfferPayloadV1_0_11 if (opts?.credentialOffer) { - credential_offer = opts.credentialOffer + credential_offer = { + ...opts.credentialOffer, + credentials: opts.credentialOffer?.credentials ?? issuerMetadata?.credentials_supported, + } } else { credential_offer = { credential_issuer: issuerMetadata?.credential_issuer, credentials: issuerMetadata?.credentials_supported, } as CredentialOfferPayloadV1_0_11 } - // todo: check payload against issuer metadata + // todo: check payload against issuer metadata. Especially strings in the credentials array: When processing, the Wallet MUST resolve this string value to the respective object. if (!credential_offer.grants) { credential_offer.grants = {} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2a9d64e..cf030326 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,7 +112,7 @@ importers: version: 0.9.0 cross-fetch: specifier: ^3.1.5 - version: 3.1.5 + version: 3.1.6 debug: specifier: ^4.3.4 version: 4.3.4 @@ -252,6 +252,9 @@ importers: specifier: ^9.0.0 version: 9.0.0 devDependencies: + '@sphereon/oid4vci-client': + specifier: workspace:* + version: link:../client '@types/body-parser': specifier: ^1.19.2 version: 1.19.2 @@ -309,8 +312,8 @@ packages: dependencies: '@babel/highlight': 7.18.6 - /@babel/compat-data@7.21.7: - resolution: {integrity: sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==} + /@babel/compat-data@7.21.9: + resolution: {integrity: sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==} engines: {node: '>=6.9.0'} /@babel/core@7.21.4: @@ -319,12 +322,12 @@ packages: dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.5 + '@babel/generator': 7.21.9 '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.21.4) '@babel/helper-module-transforms': 7.21.5 '@babel/helpers': 7.21.5 - '@babel/parser': 7.21.8 - '@babel/template': 7.20.7 + '@babel/parser': 7.21.9 + '@babel/template': 7.21.9 '@babel/traverse': 7.21.5 '@babel/types': 7.21.5 convert-source-map: 1.9.0 @@ -335,8 +338,8 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.21.5: - resolution: {integrity: sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==} + /@babel/generator@7.21.9: + resolution: {integrity: sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.5 @@ -362,7 +365,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.21.7 + '@babel/compat-data': 7.21.9 '@babel/core': 7.21.4 '@babel/helper-validator-option': 7.21.0 browserslist: 4.21.5 @@ -422,7 +425,7 @@ packages: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.20.7 + '@babel/template': 7.21.9 '@babel/types': 7.21.5 /@babel/helper-hoist-variables@7.18.6: @@ -452,7 +455,7 @@ packages: '@babel/helper-simple-access': 7.21.5 '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.20.7 + '@babel/template': 7.21.9 '@babel/traverse': 7.21.5 '@babel/types': 7.21.5 transitivePeerDependencies: @@ -489,7 +492,7 @@ packages: '@babel/helper-environment-visitor': 7.21.5 '@babel/helper-member-expression-to-functions': 7.21.5 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/template': 7.20.7 + '@babel/template': 7.21.9 '@babel/traverse': 7.21.5 '@babel/types': 7.21.5 transitivePeerDependencies: @@ -530,7 +533,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.21.0 - '@babel/template': 7.20.7 + '@babel/template': 7.21.9 '@babel/traverse': 7.21.5 '@babel/types': 7.21.5 transitivePeerDependencies: @@ -540,7 +543,7 @@ packages: resolution: {integrity: sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.20.7 + '@babel/template': 7.21.9 '@babel/traverse': 7.21.5 '@babel/types': 7.21.5 transitivePeerDependencies: @@ -554,8 +557,8 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.21.8: - resolution: {integrity: sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==} + /@babel/parser@7.21.9: + resolution: {integrity: sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==} engines: {node: '>=6.0.0'} hasBin: true dependencies: @@ -711,7 +714,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.7 + '@babel/compat-data': 7.21.9 '@babel/core': 7.21.4 '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.21.5 @@ -1029,7 +1032,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.21.5 - '@babel/template': 7.20.7 + '@babel/template': 7.21.9 /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.4): resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} @@ -1377,7 +1380,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.7 + '@babel/compat-data': 7.21.9 '@babel/core': 7.21.4 '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.21.5 @@ -1516,12 +1519,12 @@ packages: dependencies: regenerator-runtime: 0.13.11 - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + /@babel/template@7.21.9: + resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.21.4 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 /@babel/traverse@7.21.5: @@ -1529,12 +1532,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.5 + '@babel/generator': 7.21.9 '@babel/helper-environment-visitor': 7.21.5 '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 debug: 4.3.4 globals: 11.12.0 @@ -1858,7 +1861,7 @@ packages: send: 0.18.0 slugify: 1.6.6 structured-headers: 0.4.1 - tar: 6.1.14 + tar: 6.1.15 tempy: 0.7.1 terminal-link: 2.1.1 text-table: 0.2.0 @@ -1958,7 +1961,7 @@ packages: rimraf: 2.7.1 sudo-prompt: 8.2.5 tmp: 0.0.33 - tslib: 2.5.0 + tslib: 2.5.2 transitivePeerDependencies: - supports-color @@ -2270,7 +2273,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@sinonjs/fake-timers': 10.1.0 + '@sinonjs/fake-timers': 10.2.0 '@types/node': 18.16.0 jest-message-util: 29.5.0 jest-mock: 29.5.0 @@ -2598,11 +2601,11 @@ packages: '@npmcli/metavuln-calculator': 5.0.1 '@npmcli/name-from-folder': 2.0.0 '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 3.0.0 + '@npmcli/package-json': 3.1.0 '@npmcli/query': 3.0.0 '@npmcli/run-script': 6.0.2 bin-links: 4.0.1 - cacache: 17.1.0 + cacache: 17.1.3 common-ancestor-path: 1.0.1 hosted-git-info: 6.1.1 json-parse-even-better-errors: 3.0.0 @@ -2614,7 +2617,7 @@ packages: npm-pick-manifest: 8.0.1 npm-registry-fetch: 14.0.5 npmlog: 7.0.1 - pacote: 15.1.3 + pacote: 15.2.0 parse-conflict-json: 3.0.1 proc-log: 3.0.0 promise-all-reject-late: 1.0.1 @@ -2706,8 +2709,8 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/name-from-folder': 2.0.0 - glob: 10.2.3 - minimatch: 9.0.0 + glob: 10.2.6 + minimatch: 9.0.1 read-package-json-fast: 3.0.2 dev: true @@ -2715,9 +2718,9 @@ packages: resolution: {integrity: sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - cacache: 17.1.0 + cacache: 17.1.3 json-parse-even-better-errors: 3.0.0 - pacote: 15.1.3 + pacote: 15.2.0 semver: 7.5.1 transitivePeerDependencies: - bluebird @@ -2756,11 +2759,14 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /@npmcli/package-json@3.0.0: - resolution: {integrity: sha512-NnuPuM97xfiCpbTEJYtEuKz6CFbpUHtaT0+5via5pQeI25omvQDFbp1GcGJ/c4zvL/WX0qbde6YiLgfZbWFgvg==} + /@npmcli/package-json@3.1.0: + resolution: {integrity: sha512-qNPy6Yf9ruFST99xcrl5EWAvrb7qFrwgVbwdzcTJlIgxbArKOq5e/bgZ6rTL1X9hDgAdPbvL8RWx/OTLSB0ToA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: + glob: 10.2.6 json-parse-even-better-errors: 3.0.0 + normalize-package-data: 5.0.0 + npm-normalize-package-bin: 3.0.1 dev: true /@npmcli/promise-spawn@3.0.0: @@ -2781,7 +2787,7 @@ packages: resolution: {integrity: sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - postcss-selector-parser: 6.0.12 + postcss-selector-parser: 6.0.13 dev: true /@npmcli/run-script@4.1.7: @@ -2832,7 +2838,7 @@ packages: nx: 15.9.4 semver: 7.3.4 tmp: 0.2.1 - tslib: 2.5.0 + tslib: 2.5.2 dev: true /@nrwl/nx-darwin-arm64@15.9.4: @@ -2931,18 +2937,18 @@ packages: resolution: {integrity: sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==} engines: {node: '>= 14'} dependencies: - '@octokit/types': 9.2.2 + '@octokit/types': 9.2.3 dev: true - /@octokit/core@4.2.0: - resolution: {integrity: sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==} + /@octokit/core@4.2.1: + resolution: {integrity: sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==} engines: {node: '>= 14'} dependencies: '@octokit/auth-token': 3.0.3 - '@octokit/graphql': 5.0.5 - '@octokit/request': 6.2.3 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.5 '@octokit/request-error': 3.0.3 - '@octokit/types': 9.2.2 + '@octokit/types': 9.2.3 before-after-hook: 2.2.3 universal-user-agent: 6.0.0 transitivePeerDependencies: @@ -2953,17 +2959,17 @@ packages: resolution: {integrity: sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==} engines: {node: '>= 14'} dependencies: - '@octokit/types': 9.2.2 + '@octokit/types': 9.2.3 is-plain-object: 5.0.0 universal-user-agent: 6.0.0 dev: true - /@octokit/graphql@5.0.5: - resolution: {integrity: sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==} + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} engines: {node: '>= 14'} dependencies: - '@octokit/request': 6.2.3 - '@octokit/types': 9.2.2 + '@octokit/request': 6.2.5 + '@octokit/types': 9.2.3 universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding @@ -2977,39 +2983,39 @@ packages: resolution: {integrity: sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==} dev: true - /@octokit/openapi-types@17.1.2: - resolution: {integrity: sha512-OaS7Ol4Y+U50PbejfzQflGWRMxO04nYWO5ZBv6JerqMKE2WS/tI9VoVDDPXHBlRMGG2fOdKwtVGlFfc7AVIstw==} + /@octokit/openapi-types@17.2.0: + resolution: {integrity: sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==} dev: true /@octokit/plugin-enterprise-rest@6.0.1: resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} dev: true - /@octokit/plugin-paginate-rest@3.1.0(@octokit/core@4.2.0): + /@octokit/plugin-paginate-rest@3.1.0(@octokit/core@4.2.1): resolution: {integrity: sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==} engines: {node: '>= 14'} peerDependencies: '@octokit/core': '>=4' dependencies: - '@octokit/core': 4.2.0 + '@octokit/core': 4.2.1 '@octokit/types': 6.41.0 dev: true - /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.0): + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.1): resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} peerDependencies: '@octokit/core': '>=3' dependencies: - '@octokit/core': 4.2.0 + '@octokit/core': 4.2.1 dev: true - /@octokit/plugin-rest-endpoint-methods@6.8.1(@octokit/core@4.2.0): + /@octokit/plugin-rest-endpoint-methods@6.8.1(@octokit/core@4.2.1): resolution: {integrity: sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg==} engines: {node: '>= 14'} peerDependencies: '@octokit/core': '>=3' dependencies: - '@octokit/core': 4.2.0 + '@octokit/core': 4.2.1 '@octokit/types': 8.2.1 deprecation: 2.3.1 dev: true @@ -3018,20 +3024,20 @@ packages: resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} engines: {node: '>= 14'} dependencies: - '@octokit/types': 9.2.2 + '@octokit/types': 9.2.3 deprecation: 2.3.1 once: 1.4.0 dev: true - /@octokit/request@6.2.3: - resolution: {integrity: sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==} + /@octokit/request@6.2.5: + resolution: {integrity: sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==} engines: {node: '>= 14'} dependencies: '@octokit/endpoint': 7.0.5 '@octokit/request-error': 3.0.3 - '@octokit/types': 9.2.2 + '@octokit/types': 9.2.3 is-plain-object: 5.0.0 - node-fetch: 2.6.11 + node-fetch: 2.6.7 universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding @@ -3041,10 +3047,10 @@ packages: resolution: {integrity: sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ==} engines: {node: '>= 14'} dependencies: - '@octokit/core': 4.2.0 - '@octokit/plugin-paginate-rest': 3.1.0(@octokit/core@4.2.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.0) - '@octokit/plugin-rest-endpoint-methods': 6.8.1(@octokit/core@4.2.0) + '@octokit/core': 4.2.1 + '@octokit/plugin-paginate-rest': 3.1.0(@octokit/core@4.2.1) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.1) + '@octokit/plugin-rest-endpoint-methods': 6.8.1(@octokit/core@4.2.1) transitivePeerDependencies: - encoding dev: true @@ -3061,10 +3067,10 @@ packages: '@octokit/openapi-types': 14.0.0 dev: true - /@octokit/types@9.2.2: - resolution: {integrity: sha512-9BjDxjgQIvCjNWZsbqyH5QC2Yni16oaE6xL+8SUBMzcYPF4TGQBXGA97Cl3KceK9mwiNMb1mOYCz6FbCCLEL+g==} + /@octokit/types@9.2.3: + resolution: {integrity: sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==} dependencies: - '@octokit/openapi-types': 17.1.2 + '@octokit/openapi-types': 17.2.0 dev: true /@parcel/watcher@2.0.4: @@ -3081,14 +3087,14 @@ packages: dependencies: asn1js: 3.0.5 pvtsutils: 1.3.2 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@peculiar/json-schema@1.1.12: resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} engines: {node: '>=8.0.0'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /@peculiar/webcrypto@1.4.3: @@ -3098,7 +3104,7 @@ packages: '@peculiar/asn1-schema': 2.3.6 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.2 - tslib: 2.5.0 + tslib: 2.5.2 webcrypto-core: 1.7.7 dev: false @@ -3321,8 +3327,8 @@ packages: dependencies: type-detect: 4.0.8 - /@sinonjs/fake-timers@10.1.0: - resolution: {integrity: sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==} + /@sinonjs/fake-timers@10.2.0: + resolution: {integrity: sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==} dependencies: '@sinonjs/commons': 3.0.0 @@ -3413,17 +3419,17 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.0 + minimatch: 9.0.1 dev: true - /@types/babel__core@7.20.0: - resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.5 + '@types/babel__traverse': 7.20.0 dev: true /@types/babel__generator@7.6.4: @@ -3435,12 +3441,12 @@ packages: /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 dev: true - /@types/babel__traverse@7.18.5: - resolution: {integrity: sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==} + /@types/babel__traverse@7.20.0: + resolution: {integrity: sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q==} dependencies: '@babel/types': 7.21.5 dev: true @@ -3524,8 +3530,8 @@ packages: pretty-format: 29.5.0 dev: true - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true /@types/json5@0.0.29: @@ -3721,7 +3727,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.12 '@typescript-eslint/scope-manager': 5.36.1 '@typescript-eslint/types': 5.36.1 '@typescript-eslint/typescript-estree': 5.36.1(typescript@4.9.5) @@ -3786,12 +3792,12 @@ packages: resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} dev: true - /@yarnpkg/parsers@3.0.0-rc.43: - resolution: {integrity: sha512-AhFF3mIDfA+jEwQv2WMHmiYhOvmdbh2qhUkDVQfiqzQtUwS4BgoWwom5NpSPg4Ix5vOul+w1690Bt21CkVLpgg==} + /@yarnpkg/parsers@3.0.0-rc.44: + resolution: {integrity: sha512-UVAt9Icc8zfGXioeYJ8XMoSTxOYVmlal2TRNxy9Uh91taS72kQFalK7LpIslcvEBKy4XtarmfIwcFIU3ZY64lw==} engines: {node: '>=14.15.0'} dependencies: js-yaml: 3.14.1 - tslib: 2.5.0 + tslib: 2.5.2 dev: true /@zkochan/js-yaml@0.0.6: @@ -4046,7 +4052,7 @@ packages: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 is-string: 1.0.7 dev: true @@ -4091,7 +4097,7 @@ packages: dependencies: pvtsutils: 1.3.2 pvutils: 1.1.3 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /assign-symbols@1.0.0: @@ -4102,7 +4108,7 @@ packages: resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} engines: {node: '>=4'} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 /astral-regex@1.0.0: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} @@ -4168,7 +4174,7 @@ packages: dependencies: '@babel/core': 7.21.4 '@jest/transform': 29.5.0 - '@types/babel__core': 7.20.0 + '@types/babel__core': 7.20.1 babel-plugin-istanbul: 6.1.1 babel-preset-jest: 29.5.0(@babel/core@7.21.4) chalk: 4.1.2 @@ -4195,10 +4201,10 @@ packages: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.20.7 + '@babel/template': 7.21.9 '@babel/types': 7.21.5 - '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.18.5 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.0 dev: true /babel-plugin-module-resolver@4.1.0: @@ -4216,7 +4222,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.7 + '@babel/compat-data': 7.21.9 '@babel/core': 7.21.4 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) semver: 6.3.0 @@ -4499,9 +4505,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001487 - electron-to-chromium: 1.4.394 - node-releases: 2.0.10 + caniuse-lite: 1.0.30001489 + electron-to-chromium: 1.4.408 + node-releases: 2.0.12 update-browserslist-db: 1.0.11(browserslist@4.21.5) /bs-logger@0.2.6: @@ -4586,7 +4592,7 @@ packages: promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 - tar: 6.1.14 + tar: 6.1.15 unique-filename: 1.1.1 transitivePeerDependencies: - bluebird @@ -4617,13 +4623,13 @@ packages: - bluebird dev: true - /cacache@17.1.0: - resolution: {integrity: sha512-hXpFU+Z3AfVmNuiLve1qxWHMq0RSIt5gjCKAHi/M6DktwFwDdAXAtunl1i4WSKaaVcU9IsRvXFg42jTHigcC6Q==} + /cacache@17.1.3: + resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.2 - glob: 10.2.3 + glob: 10.2.6 lru-cache: 7.18.3 minipass: 5.0.0 minipass-collect: 1.0.2 @@ -4653,7 +4659,7 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} @@ -4703,8 +4709,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - /caniuse-lite@1.0.30001487: - resolution: {integrity: sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==} + /caniuse-lite@1.0.30001489: + resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==} /canonicalize@1.0.8: resolution: {integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==} @@ -5210,14 +5216,6 @@ packages: resolution: {integrity: sha512-/mFKax6FK26KjgV2KW2D4YqKgoJ5DVJpNt87X2Jc9IxT2HBMy7nEIlc+n7pEi+YFFe721XqrvZPd+jbyyBjsvQ==} dev: false - /cross-fetch@3.1.5: - resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} - dependencies: - node-fetch: 2.6.7 - transitivePeerDependencies: - - encoding - dev: false - /cross-fetch@3.1.6: resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==} dependencies: @@ -5567,11 +5565,11 @@ packages: engines: {node: '>=0.10.0'} hasBin: true dependencies: - jake: 10.8.5 + jake: 10.8.6 dev: true - /electron-to-chromium@1.4.394: - resolution: {integrity: sha512-0IbC2cfr8w5LxTz+nmn2cJTGafsK9iauV2r5A5scfzyovqLrxuLoxOHE5OBobP3oVIggJT+0JfKnw9sm87c8Hw==} + /electron-to-chromium@1.4.408: + resolution: {integrity: sha512-vjeaj0u/UYnzA/CIdGXzzcxRLCqRwREYc9YfaWInjIEr7/XPttZ6ShpyqapchEy0S2r6LpLjDBTnNj7ZxnxJKg==} /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -5657,7 +5655,7 @@ packages: es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 @@ -5691,7 +5689,7 @@ packages: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 has: 1.0.3 has-tostringtag: 1.0.0 dev: true @@ -5744,7 +5742,7 @@ packages: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 - is-core-module: 2.12.0 + is-core-module: 2.12.1 resolve: 1.22.2 transitivePeerDependencies: - supports-color @@ -5809,7 +5807,7 @@ packages: eslint-import-resolver-node: 0.3.7 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.36.1)(eslint-import-resolver-node@0.3.7)(eslint@8.23.0) has: 1.0.3 - is-core-module: 2.12.0 + is-core-module: 2.12.1 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.1.6 @@ -6542,7 +6540,7 @@ packages: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 - qs: 6.11.1 + qs: 6.11.2 dev: true /forwarded@0.2.0: @@ -6572,7 +6570,7 @@ packages: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} dependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -6683,11 +6681,12 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 has: 1.0.3 + has-proto: 1.0.1 has-symbols: 1.0.3 /get-package-type@0.1.0: @@ -6741,7 +6740,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 dev: true /get-value@2.0.6: @@ -6813,16 +6812,16 @@ packages: is-glob: 4.0.3 dev: true - /glob@10.2.3: - resolution: {integrity: sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==} + /glob@10.2.6: + resolution: {integrity: sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.2.0 - minimatch: 9.0.0 - minipass: 5.0.0 - path-scurry: 1.8.0 + jackspeak: 2.2.1 + minimatch: 9.0.1 + minipass: 6.0.2 + path-scurry: 1.9.2 dev: true /glob@6.0.4: @@ -6884,7 +6883,7 @@ packages: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 - path-scurry: 1.8.0 + path-scurry: 1.9.2 dev: true /globals@11.12.0: @@ -6919,7 +6918,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 dev: true /graceful-fs@4.2.10: @@ -6939,7 +6938,7 @@ packages: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: graphql: 15.8.0 - tslib: 2.5.0 + tslib: 2.5.2 /graphql@15.8.0: resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} @@ -6978,13 +6977,12 @@ packages: /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 dev: true /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} - dev: true /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} @@ -7186,7 +7184,7 @@ packages: resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minimatch: 9.0.0 + minimatch: 9.0.1 dev: true /ignore@5.2.4: @@ -7316,7 +7314,7 @@ packages: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -7357,7 +7355,7 @@ packages: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 is-typed-array: 1.1.10 dev: true @@ -7393,8 +7391,8 @@ packages: ci-info: 2.0.0 dev: true - /is-core-module@2.12.0: - resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} dependencies: has: 1.0.3 @@ -7695,7 +7693,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.21.4 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -7731,8 +7729,8 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jackspeak@2.2.0: - resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==} + /jackspeak@2.2.1: + resolution: {integrity: sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -7740,15 +7738,15 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: true - /jake@10.8.5: - resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} + /jake@10.8.6: + resolution: {integrity: sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA==} engines: {node: '>=10'} hasBin: true dependencies: async: 3.2.4 chalk: 4.1.2 filelist: 1.0.4 - minimatch: 3.0.5 + minimatch: 3.1.2 dev: true /jest-changed-files@29.5.0: @@ -8089,7 +8087,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.21.4 - '@babel/generator': 7.21.5 + '@babel/generator': 7.21.9 '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) '@babel/traverse': 7.21.5 @@ -8097,7 +8095,7 @@ packages: '@jest/expect-utils': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/babel__traverse': 7.18.5 + '@types/babel__traverse': 7.20.0 '@types/prettier': 2.7.2 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) chalk: 4.1.2 @@ -8256,7 +8254,7 @@ packages: '@babel/preset-env': ^7.1.6 dependencies: '@babel/core': 7.21.4 - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) @@ -8358,7 +8356,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 /jsonld-document-loader@1.2.1: resolution: {integrity: sha512-CtFyIBZApeVvs6QgyS7Gcp8h1dUs+1XNHcV4Sr6O9ItPaL0hVgqe47Tgs3RNH0A5Bc4p3UFPKAJVHKSOQq4mhQ==} @@ -8747,7 +8745,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: agentkeepalive: 4.3.0 - cacache: 17.1.0 + cacache: 17.1.3 http-cache-semantics: 4.1.1 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 @@ -8984,7 +8982,7 @@ packages: /metro-minify-terser@0.73.9: resolution: {integrity: sha512-MTGPu2qV5qtzPJ2SqH6s58awHDtZ4jd7lmmLR+7TXDwtZDjIBA0YVfI0Zak2Haby2SqoNKrhhUns/b4dPAQAVg==} dependencies: - terser: 5.17.3 + terser: 5.17.6 /metro-minify-uglify@0.73.9: resolution: {integrity: sha512-gzxD/7WjYcnCNGiFJaA26z34rjOp+c/Ft++194Wg91lYep3TeWQ0CnH8t2HRS7AYDHU81SGWgvD3U7WV0g4LGA==} @@ -9032,7 +9030,7 @@ packages: '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.4) '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.4) '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) - '@babel/template': 7.20.7 + '@babel/template': 7.21.9 react-refresh: 0.4.3 transitivePeerDependencies: - supports-color @@ -9095,8 +9093,8 @@ packages: resolution: {integrity: sha512-r9NeiqMngmooX2VOKLJVQrMuV7PAydbqst5bFhdVBPcFpZkxxqyzjzo+kzrszGy2UpSQBZr2P1L6OMjLHwQwfQ==} dependencies: '@babel/core': 7.21.4 - '@babel/generator': 7.21.5 - '@babel/template': 7.20.7 + '@babel/generator': 7.21.9 + '@babel/template': 7.21.9 '@babel/traverse': 7.21.5 nullthrows: 1.1.1 transitivePeerDependencies: @@ -9106,8 +9104,8 @@ packages: resolution: {integrity: sha512-Rq4b489sIaTUENA+WCvtu9yvlT/C6zFMWhU4sq+97W29Zj0mPBjdk+qGT5n1ZBgtBIJzZWt1KxeYuc17f4aYtQ==} dependencies: '@babel/core': 7.21.4 - '@babel/generator': 7.21.5 - '@babel/parser': 7.21.8 + '@babel/generator': 7.21.9 + '@babel/parser': 7.21.9 '@babel/types': 7.21.5 babel-preset-fbjs: 3.4.0(@babel/core@7.21.4) metro: 0.73.9 @@ -9130,9 +9128,9 @@ packages: dependencies: '@babel/code-frame': 7.21.4 '@babel/core': 7.21.4 - '@babel/generator': 7.21.5 - '@babel/parser': 7.21.8 - '@babel/template': 7.20.7 + '@babel/generator': 7.21.9 + '@babel/parser': 7.21.9 + '@babel/template': 7.21.9 '@babel/traverse': 7.21.5 '@babel/types': 7.21.5 absolute-path: 0.0.0 @@ -9276,8 +9274,8 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@9.0.0: - resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} + /minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 @@ -9381,6 +9379,11 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} + /minipass@6.0.2: + resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -9556,6 +9559,7 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 + dev: true /node-fetch@3.0.0-beta.9: resolution: {integrity: sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg==} @@ -9583,7 +9587,7 @@ packages: dependencies: env-paths: 2.2.1 glob: 7.2.3 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 make-fetch-happen: 10.2.1 nopt: 6.0.0 npmlog: 6.0.2 @@ -9599,8 +9603,8 @@ packages: /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + /node-releases@2.0.12: + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} /node-stream-zip@1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} @@ -9636,7 +9640,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.12.0 + is-core-module: 2.12.1 semver: 7.5.1 validate-npm-package-license: 3.0.4 dev: true @@ -9646,7 +9650,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: hosted-git-info: 5.2.1 - is-core-module: 2.12.0 + is-core-module: 2.12.1 semver: 7.5.1 validate-npm-package-license: 3.0.4 dev: true @@ -9656,7 +9660,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: hosted-git-info: 6.1.1 - is-core-module: 2.12.0 + is-core-module: 2.12.1 semver: 7.5.1 validate-npm-package-license: 3.0.4 dev: true @@ -9896,7 +9900,7 @@ packages: '@nrwl/tao': 15.9.4 '@parcel/watcher': 2.0.4 '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.0-rc.43 + '@yarnpkg/parsers': 3.0.0-rc.44 '@zkochan/js-yaml': 0.0.6 axios: 1.4.0 chalk: 4.1.0 @@ -9923,7 +9927,7 @@ packages: tar-stream: 2.2.0 tmp: 0.2.1 tsconfig-paths: 4.2.0 - tslib: 2.5.0 + tslib: 2.5.2 v8-compile-cache: 2.3.0 yargs: 17.7.2 yargs-parser: 21.1.1 @@ -10243,8 +10247,8 @@ packages: - supports-color dev: true - /pacote@15.1.3: - resolution: {integrity: sha512-aRts8cZqxiJVDitmAh+3z+FxuO3tLNWEmwDRPEpDDiZJaRz06clP4XX112ynMT5uF0QNoMPajBBHnaStUEPJXA==} + /pacote@15.2.0: + resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: @@ -10252,7 +10256,7 @@ packages: '@npmcli/installed-package-contents': 2.0.2 '@npmcli/promise-spawn': 6.0.2 '@npmcli/run-script': 6.0.2 - cacache: 17.1.0 + cacache: 17.1.3 fs-minipass: 3.0.2 minipass: 5.0.0 npm-package-arg: 10.1.0 @@ -10263,7 +10267,7 @@ packages: promise-retry: 2.0.1 read-package-json: 6.0.3 read-package-json-fast: 3.0.2 - sigstore: 1.5.0 + sigstore: 1.5.2 ssri: 10.0.4 tar: 6.1.11 transitivePeerDependencies: @@ -10377,12 +10381,12 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.8.0: - resolution: {integrity: sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==} + /path-scurry@1.9.2: + resolution: {integrity: sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 9.1.1 - minipass: 5.0.0 + minipass: 6.0.2 dev: true /path-to-regexp@0.1.7: @@ -10475,8 +10479,8 @@ packages: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} - /postcss-selector-parser@6.0.12: - resolution: {integrity: sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==} + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -10646,7 +10650,7 @@ packages: /pvtsutils@1.3.2: resolution: {integrity: sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: false /pvutils@1.1.3: @@ -10669,8 +10673,8 @@ packages: dependencies: side-channel: 1.0.4 - /qs@6.11.1: - resolution: {integrity: sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==} + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 @@ -10724,8 +10728,8 @@ packages: minimist: 1.2.8 strip-json-comments: 2.0.1 - /react-devtools-core@4.27.7: - resolution: {integrity: sha512-12N0HrhCPbD76Z7SkyJdGdXdPGouUsgV6tlEsbSpAnLDO06tjXZP+irht4wPdYwJAJRQ85DxL48eQoz7UmrSuQ==} + /react-devtools-core@4.27.8: + resolution: {integrity: sha512-KwoH8/wN/+m5wTItLnsgVraGNmFrcTWR3k1VimP1HjtMMw4CNF+F5vg4S/0tzTEKIdpCi2R7mPNTC+/dswZMgw==} dependencies: shell-quote: 1.8.1 ws: 7.5.9 @@ -10745,7 +10749,7 @@ packages: /react-native-codegen@0.71.5(@babel/preset-env@7.21.4): resolution: {integrity: sha512-rfsuc0zkuUuMjFnrT55I1mDZ+pBRp2zAiRwxck3m6qeGJBGK5OV5JH66eDQ4aa+3m0of316CqrJDRzVlYufzIg==} dependencies: - '@babel/parser': 7.21.8 + '@babel/parser': 7.21.9 flow-parser: 0.185.2 jscodeshift: 0.13.1(@babel/preset-env@7.21.4) nullthrows: 1.1.1 @@ -10807,7 +10811,7 @@ packages: pretty-format: 26.6.2 promise: 8.3.0 react: 18.2.0 - react-devtools-core: 4.27.7 + react-devtools-core: 4.27.8 react-native-codegen: 0.71.5(@babel/preset-env@7.21.4) react-native-gradle-plugin: 0.71.18 react-refresh: 0.4.3 @@ -10885,7 +10889,7 @@ packages: resolution: {integrity: sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - glob: 10.2.3 + glob: 10.2.6 json-parse-even-better-errors: 3.0.0 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 @@ -10999,7 +11003,7 @@ packages: ast-types: 0.14.2 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.5.0 + tslib: 2.5.2 /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -11141,7 +11145,7 @@ packages: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: - is-core-module: 2.12.0 + is-core-module: 2.12.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -11227,7 +11231,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.0 + tslib: 2.5.2 dev: true /safe-buffer@5.1.2: @@ -11245,7 +11249,7 @@ packages: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 is-regex: 1.1.4 dev: true @@ -11402,7 +11406,7 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 object-inspect: 1.12.3 /signal-exit@3.0.7: @@ -11413,8 +11417,8 @@ packages: engines: {node: '>=14'} dev: true - /sigstore@1.5.0: - resolution: {integrity: sha512-i3nhvdobiPj8XrXNIggjeur6+A5iAQ4f+r1bR5SGitFJBbthy/6c7Fz0h+kY70Wua1FSMdDr/UEhXSVRXNpynw==} + /sigstore@1.5.2: + resolution: {integrity: sha512-X95v6xAAooVpn7PaB94TDmFeSO5SBfCtB1R23fvzr36WTfjtkiiyOeei979nbTjc8nzh6FSLeltQZuODsm1EjQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: @@ -11859,7 +11863,7 @@ packages: formidable: 2.1.2 methods: 1.1.2 mime: 2.6.0 - qs: 6.11.1 + qs: 6.11.2 semver: 7.5.1 transitivePeerDependencies: - supports-color @@ -11927,8 +11931,8 @@ packages: yallist: 4.0.0 dev: true - /tar@6.1.14: - resolution: {integrity: sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==} + /tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 @@ -12020,8 +12024,8 @@ packages: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser@5.17.3: - resolution: {integrity: sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==} + /terser@5.17.6: + resolution: {integrity: sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==} engines: {node: '>=10'} hasBin: true dependencies: @@ -12288,8 +12292,8 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + /tslib@2.5.2: + resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} /tsutils@3.21.0(typescript@4.9.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -12696,7 +12700,7 @@ packages: '@peculiar/json-schema': 1.1.12 asn1js: 3.0.5 pvtsutils: 1.3.2 - tslib: 2.5.0 + tslib: 2.5.2 dev: false /webcrypto-shim@0.1.7: @@ -12857,7 +12861,7 @@ packages: engines: {node: '>=6'} dependencies: detect-indent: 5.0.0 - graceful-fs: 4.2.11 + graceful-fs: 4.2.10 make-dir: 2.1.0 pify: 4.0.1 sort-keys: 2.0.0