From c4f94d97c79b1eee53467b10b5527e1da87a6be2 Mon Sep 17 00:00:00 2001 From: Alfonso Graziano Date: Thu, 20 Jun 2024 15:34:42 +0200 Subject: [PATCH 1/7] Align staging to dev (#37) Add staging pipeline file (#36) * add file * fix --- pipeline-variables/sta.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 pipeline-variables/sta.yml diff --git a/pipeline-variables/sta.yml b/pipeline-variables/sta.yml new file mode 100644 index 00000000000..fbb7b6ce8ec --- /dev/null +++ b/pipeline-variables/sta.yml @@ -0,0 +1,5 @@ +variables: + awsServiceConnection: life-events-sta-ecr + awsRegion: eu-west-1 + ecrEndpoint: 975050122570.dkr.ecr.eu-west-1.amazonaws.com + buildArguments: "" From ce792ab6fcebf78b2b6362e9ea1fa11a29bd14f7 Mon Sep 17 00:00:00 2001 From: Alfonso Graziano Date: Thu, 20 Jun 2024 16:36:04 +0200 Subject: [PATCH 2/7] Update staging (#39) * Add staging pipeline file (#36) * add file * fix * feat(cli): update seeder (#35) * Add deploy stage to logto-admin (#38) --------- Co-authored-by: Norbert Nagy Co-authored-by: William Monteiro --- azure_pipelines.yml | 7 +- .../commands/database/ogcio/common-rbac.ts | 3 + .../cli/src/commands/database/ogcio/index.ts | 23 +++- .../ogcio/ogcio-seeder-deployment.json | 32 ----- .../database/ogcio/ogcio-seeder-dev.json | 114 ++++++++++++++++++ .../commands/database/ogcio/ogcio-seeder.json | 4 +- .../cli/src/commands/database/ogcio/ogcio.ts | 91 ++++++++------ .../database/ogcio/organizations-rbac.ts | 43 ++++--- .../commands/database/ogcio/resources-rbac.ts | 82 +++++++------ 9 files changed, 276 insertions(+), 123 deletions(-) delete mode 100644 packages/cli/src/commands/database/ogcio/ogcio-seeder-deployment.json create mode 100644 packages/cli/src/commands/database/ogcio/ogcio-seeder-dev.json diff --git a/azure_pipelines.yml b/azure_pipelines.yml index 14c818bfccc..0c5f5095977 100644 --- a/azure_pipelines.yml +++ b/azure_pipelines.yml @@ -74,4 +74,9 @@ stages: parameters: awsServiceConnection: ${{ variables.awsServiceConnection }} awsRegion: ${{ variables.awsRegion }} - serviceName: logto \ No newline at end of file + serviceName: logto + - template: pipeline-templates/deploy_ecs.yml + parameters: + awsServiceConnection: ${{ variables.awsServiceConnection }} + awsRegion: ${{ variables.awsRegion }} + serviceName: logto-admin \ No newline at end of file diff --git a/packages/cli/src/commands/database/ogcio/common-rbac.ts b/packages/cli/src/commands/database/ogcio/common-rbac.ts index 9155b1f3bd8..7aa82df891b 100644 --- a/packages/cli/src/commands/database/ogcio/common-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/common-rbac.ts @@ -276,6 +276,9 @@ export const createScopes = async < fillScopesMethod: (scopesToSeed: T[]) => O; }): Promise => { const scopesToCreate = params.fillScopesMethod(params.scopesToSeed); + if (params.scopesToSeed.length === 0) { + return scopesToCreate; + } const queries: Array< Promise & { id: string }> > = []; diff --git a/packages/cli/src/commands/database/ogcio/index.ts b/packages/cli/src/commands/database/ogcio/index.ts index 7f080d8bc51..c337257aaa3 100644 --- a/packages/cli/src/commands/database/ogcio/index.ts +++ b/packages/cli/src/commands/database/ogcio/index.ts @@ -1,6 +1,9 @@ import { readFileSync } from 'node:fs'; +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable unicorn/import-style */ import { resolve } from 'node:path'; +import { getEnv } from '@silverhand/essentials'; import type { CommandModule } from 'yargs'; import { createPoolAndDatabaseIfNeeded } from '../../../database.js'; @@ -11,9 +14,25 @@ import { seedOgcio } from './ogcio.js'; const DEFAULT_SEEDER_FILE = './src/commands/database/ogcio/ogcio-seeder.json'; -const loadSeederData = (path: string): OgcioTenantSeeder => +const interpolateString = (content: string): string => { + const regExp = /<\w+>/g; + + return content.replaceAll(regExp, function (match) { + const variableName = match.slice(1, -1); + if (!getEnv(variableName)) { + return match; + } + return getEnv(variableName); + }); +}; + +const loadSeederData = (path: string): OgcioTenantSeeder => { + const content = readFileSync(new URL(path, import.meta.url), 'utf8'); + const interpolatedContent = interpolateString(content); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return - JSON.parse(readFileSync(new URL(path, import.meta.url), 'utf8')); + return JSON.parse(interpolatedContent); +}; const getSeederData = async (seederFilepath: unknown): Promise => { if (typeof seederFilepath !== 'string' || seederFilepath.length === 0) { diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder-deployment.json b/packages/cli/src/commands/database/ogcio/ogcio-seeder-deployment.json deleted file mode 100644 index 6c12200883e..00000000000 --- a/packages/cli/src/commands/database/ogcio/ogcio-seeder-deployment.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "default": { - "connectors": [{ - "id": "mygovid", - "sync_profile": false, - "connector_id": "mygovid", - "config": { - "scope": "openid profile email ${MYGOVID_CLIENT_ID}", - "clientId": "${MYGOVID_CLIENT_ID}", - "clientSecret": "${MYGOVID_CLIENT_SECRET}", - "tokenEndpoint": "${MYGOVID_TOKEN_ENDPOINT}", - "authorizationEndpoint": "${MYGOVID_AUTHORIZATION_ENDPOINT}", - "tokenEndpointAuthMethod": "client_secret_post", - "idTokenVerificationConfig": { - "jwksUri": "${MYGOVID_JWS_URI}" - }, - "clientSecretJwtSigningAlgorithm": "HS256" - }, - "metadata": { - "logo": "https://mygovidstatic.blob.core.windows.net/assets/images/favicon_196x196.png", - "name": { - "en": "MyGovId" - }, - "target": "MyGovId (MyGovId connector)" - } - - - - - }] - } -} diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder-dev.json b/packages/cli/src/commands/database/ogcio/ogcio-seeder-dev.json new file mode 100644 index 00000000000..a56a5d3c7f3 --- /dev/null +++ b/packages/cli/src/commands/database/ogcio/ogcio-seeder-dev.json @@ -0,0 +1,114 @@ +{ + "default": { + "organizations": [ + { + "name": "OGCIO", + "description": "OGCIO Organization", + "id": "ogcio" + } + ], + "applications": [ + { + "name": "Payments Building Block", + "description": "Payments App of Life Events", + "type": "Traditional", + "redirect_uri": "", + "logout_redirect_uri": "", + "secret": "", + "id": "r5f56tpkytpqyyshiutd2" + }, + { + "name": "Messaging Building Block", + "description": "Messaging App of Life Events", + "type": "Traditional", + "redirect_uri": "", + "logout_redirect_uri": "", + "secret": "", + "id": "1lvmteh2ao3xrswyq7j3e" + } + ], + "resources": [ + { + "id": "payments-api", + "name": "Payments Building Block API", + "indicator": "" + }, + { + "id": "messaging-api", + "name": "Messaging Building Block API", + "indicator": "" + } + ], + "connectors": [ + { + "id": "mygovid", + "sync_profile": false, + "connector_id": "mygovid", + "config": { + "scope": "openid profile email", + "clientId": "", + "clientSecret": "", + "tokenEndpoint": "", + "authorizationEndpoint": "", + "tokenEndpointAuthMethod": "client_secret_post", + "idTokenVerificationConfig": { + "jwksUri": "" + }, + "clientSecretJwtSigningAlgorithm": "HS256" + }, + "metadata": { + "logo": "https://mygovidstatic.blob.core.windows.net/assets/images/favicon_196x196.png", + "name": { + "en": "MyGovId" + }, + "target": "MyGovId (MyGovId connector)" + } + } + ], + "sign_in_experiences": [ + { + "id": "default", + "color": { + "primaryColor": "#007DA6", + "darkPrimaryColor": "#007DA6", + "isDarkModeEnabled": false + }, + "branding": { + "logoUrl": "https://mygovidstatic.blob.core.windows.net/assets/images/helpchat-logo.png", + "darkLogoUrl": "https://mygovidstatic.blob.core.windows.net/assets/images/helpchat-logo.png" + }, + "language_info": { + "autoDetect": true, + "fallbackLanguage": "en" + }, + "sign_in": { + "methods": [] + }, + "sign_up": { + "verify": false, + "password": false, + "identifiers": [] + }, + "social_sign_in_connector_targets": [ + "MyGovId (MyGovId connector)" + ], + "sign_in_mode": "SignInAndRegister" + } + ], + "webhooks": [ + { + "id": "login_webhook", + "name": "User log in", + "events": [ + "PostRegister", + "PostSignIn" + ], + "config": { + "url": "" + }, + "signing_key": "", + "enabled": true + } + ] + } +} diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder.json b/packages/cli/src/commands/database/ogcio/ogcio-seeder.json index 50cb93bd12c..a33424ae1f5 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio-seeder.json +++ b/packages/cli/src/commands/database/ogcio/ogcio-seeder.json @@ -111,8 +111,8 @@ { "id": "default", "color": { - "primaryColor": "#FFFFFF", - "darkPrimaryColor": "#FFFFFF", + "primaryColor": "#007DA6", + "darkPrimaryColor": "#007DA6", "isDarkModeEnabled": false }, "branding": { diff --git a/packages/cli/src/commands/database/ogcio/ogcio.ts b/packages/cli/src/commands/database/ogcio/ogcio.ts index c9d50c301f1..5a68923df3d 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio.ts +++ b/packages/cli/src/commands/database/ogcio/ogcio.ts @@ -19,47 +19,66 @@ const createDataForTenant = async ( tenantId: string, tenantData: OgcioSeeder ) => { - const organizations = await createOrganizations({ - transaction, - tenantId, - organizations: tenantData.organizations, - }); + if (tenantData.organizations.length > 0) { + const organizations = await createOrganizations({ + transaction, + tenantId, + organizations: tenantData.organizations, + }); + } + const organizationsRbac = await seedOrganizationRbacData({ transaction, tenantId, toSeed: tenantData, }); - const applications = await seedApplications({ - transaction, - tenantId, - applications: tenantData.applications, - }); - const resources = await seedResources({ - transaction, - tenantId, - inputResources: tenantData.resources, - }); - const resourcesRbac = await seedResourceRbacData({ - tenantId, - transaction, - toSeed: tenantData, - seededResources: resources, - }); - const connectors = await seedConnectors({ - transaction, - tenantId, - connectors: tenantData.connectors, - }); - const signInExperiences = await seedSignInExperiences({ - transaction, - tenantId, - experiences: tenantData.sign_in_experiences, - }); - const webhooks = await seedWebhooks({ - transaction, - tenantId, - hooks: tenantData.webhooks - }); + + if (tenantData.applications.length > 0) { + const applications = await seedApplications({ + transaction, + tenantId, + applications: tenantData.applications, + }); + } + + if (tenantData.resources.length > 0) { + const resources = await seedResources({ + transaction, + tenantId, + inputResources: tenantData.resources, + }); + + const resourcesRbac = await seedResourceRbacData({ + tenantId, + transaction, + toSeed: tenantData, + seededResources: resources, + }); + } + + if (tenantData.connectors.length > 0) { + const connectors = await seedConnectors({ + transaction, + tenantId, + connectors: tenantData.connectors, + }); + } + + if (tenantData.sign_in_experiences.length > 0) { + const signInExperiences = await seedSignInExperiences({ + transaction, + tenantId, + experiences: tenantData.sign_in_experiences, + }); + } + + if (tenantData.webhooks.length > 0) { + const webhooks = await seedWebhooks({ + transaction, + tenantId, + hooks: tenantData.webhooks, + }); + } }; const transactionMethod = async (transaction: DatabaseTransactionConnection) => { diff --git a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts index d295ca5e88b..729fd36992a 100644 --- a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts @@ -94,20 +94,33 @@ export const seedOrganizationRbacData = async (params: { roles: Record; relations: SeedingRelation[]; }> => { - const createdScopes = await createScopes({ - transaction: params.transaction, - tenantId: params.tenantId, - scopesToSeed: params.toSeed.organization_permissions, - fillScopesMethod: fillScopes, - }); - const createdRoles = await createRoles({ - transaction: params.transaction, - tenantId: params.tenantId, - scopesLists: createdScopes, - rolesToSeed: params.toSeed.organization_roles, - fillRolesMethod: fillRoles, - }); - const relations = await createRelations(params.transaction, params.tenantId, createdRoles); + if (params.toSeed.organization_permissions.length > 0) { + const createdScopes = await createScopes({ + transaction: params.transaction, + tenantId: params.tenantId, + scopesToSeed: params.toSeed.organization_permissions, + fillScopesMethod: fillScopes, + }); + const createdRoles = await createRoles({ + transaction: params.transaction, + tenantId: params.tenantId, + scopesLists: createdScopes, + rolesToSeed: params.toSeed.organization_roles, + fillRolesMethod: fillRoles, + }); + const relations = await createRelations(params.transaction, params.tenantId, createdRoles); - return { scopes: createdScopes, roles: createdRoles, relations }; + return { scopes: createdScopes, roles: createdRoles, relations }; + } + + return { + scopes: { + scopesList: [], + scopesByEntity: {}, + scopesByAction: {}, + scopesByFullName: {}, + }, + roles: {}, + relations: [], + }; }; diff --git a/packages/cli/src/commands/database/ogcio/resources-rbac.ts b/packages/cli/src/commands/database/ogcio/resources-rbac.ts index d58d883aa02..6ff4bf1bccf 100644 --- a/packages/cli/src/commands/database/ogcio/resources-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/resources-rbac.ts @@ -97,30 +97,38 @@ const replaceWithResourceIdFromDatabase = ( resource_permissions: ResourcePermissionSeeder[]; resource_roles: ResourceRoleSeeder[]; } => { - for (const permission of toSeed.resource_permissions) { - const toSetResourceIds = []; - for (const resourceId of permission.for_resource_ids) { - if (!seededResources[resourceId]) { - throw new Error(`Resource scopes. Referring to a not existent resource id: ${resourceId}!`); - } - toSetResourceIds.push(seededResources[resourceId]!.id!); - } - permission.for_resource_ids = toSetResourceIds; - } - for (const roles of toSeed.resource_roles) { - const toSetResourceIds = []; - for (const permissionGroup of roles.permissions) { - for (const resourceId of permissionGroup.for_resource_ids) { + if (toSeed.resource_permissions.length > 0) { + for (const permission of toSeed.resource_permissions) { + const toSetResourceIds = []; + for (const resourceId of permission.for_resource_ids) { if (!seededResources[resourceId]) { throw new Error( - `Resource roles. Referring to a not existent resource id: ${resourceId}!` + `Resource scopes. Referring to a not existent resource id: ${resourceId}!` ); } toSetResourceIds.push(seededResources[resourceId]!.id!); } - permissionGroup.for_resource_ids = toSetResourceIds; + permission.for_resource_ids = toSetResourceIds; + } + } + + if (toSeed.resource_roles.length > 0) { + for (const roles of toSeed.resource_roles) { + const toSetResourceIds = []; + for (const permissionGroup of roles.permissions) { + for (const resourceId of permissionGroup.for_resource_ids) { + if (!seededResources[resourceId]) { + throw new Error( + `Resource roles. Referring to a not existent resource id: ${resourceId}!` + ); + } + toSetResourceIds.push(seededResources[resourceId]!.id!); + } + permissionGroup.for_resource_ids = toSetResourceIds; + } } } + return toSeed; }; @@ -138,26 +146,30 @@ export const seedResourceRbacData = async (params: { relations: SeedingRelation[]; }> => { params.toSeed = replaceWithResourceIdFromDatabase(params.seededResources, params.toSeed); - const createdScopes = await createScopes({ - transaction: params.transaction, - tenantId: params.tenantId, - scopesToSeed: params.toSeed.resource_permissions, - fillScopesMethod: fillScopes, - }); - const createdRoles = await createRoles({ - transaction: params.transaction, - tenantId: params.tenantId, - scopesLists: createdScopes, - rolesToSeed: params.toSeed.resource_roles, - fillRolesMethod: fillRoles, - }); - const createdRelations = await createRelations({ - transaction: params.transaction, - tenantId: params.tenantId, - roles: createdRoles, - }); + if (params.toSeed.resource_permissions.length > 0) { + const createdScopes = await createScopes({ + transaction: params.transaction, + tenantId: params.tenantId, + scopesToSeed: params.toSeed.resource_permissions, + fillScopesMethod: fillScopes, + }); + const createdRoles = await createRoles({ + transaction: params.transaction, + tenantId: params.tenantId, + scopesLists: createdScopes, + rolesToSeed: params.toSeed.resource_roles, + fillRolesMethod: fillRoles, + }); + const createdRelations = await createRelations({ + transaction: params.transaction, + tenantId: params.tenantId, + roles: createdRoles, + }); + + return { scopes: createdScopes, roles: createdRoles, relations: createdRelations }; + } - return { scopes: createdScopes, roles: createdRoles, relations: createdRelations }; + return { scopes: {}, roles: {}, relations: [] }; }; const getEmptyList = (): ScopesLists => ({ From 9b91d9f7bdfa048b3a50c650b7d728192cb5484a Mon Sep 17 00:00:00 2001 From: Norbert Nagy Date: Wed, 26 Jun 2024 10:29:20 +0300 Subject: [PATCH 3/7] fix(cli): fix seeder to handle empty data (#42) * fix(cli): fix seeder to handle empty data (#41) fix(cli): fix seeder to handle empty values * chore(cli): cleanup * fix(cli): azure pipeline --- azure_pipelines.yml | 4 ++++ .../commands/database/ogcio/ogcio-seeder.ts | 20 +++++++++---------- .../cli/src/commands/database/ogcio/ogcio.ts | 12 +++++------ .../database/ogcio/organizations-rbac.ts | 6 +++--- .../commands/database/ogcio/resources-rbac.ts | 18 ++++++++--------- 5 files changed, 32 insertions(+), 28 deletions(-) diff --git a/azure_pipelines.yml b/azure_pipelines.yml index 0c5f5095977..83a034a50ba 100644 --- a/azure_pipelines.yml +++ b/azure_pipelines.yml @@ -75,6 +75,10 @@ stages: awsServiceConnection: ${{ variables.awsServiceConnection }} awsRegion: ${{ variables.awsRegion }} serviceName: logto + - stage: Deploy_Logto_Admin + displayName: Deploy to ECS - logto Admin + dependsOn: Push_Logto + jobs: - template: pipeline-templates/deploy_ecs.yml parameters: awsServiceConnection: ${{ variables.awsServiceConnection }} diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts b/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts index 9bc71745c8f..01b4b52f74a 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts +++ b/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts @@ -4,16 +4,16 @@ export type OgcioTenantSeeder = Record; export type OgcioSeeder = { - organizations: OrganizationSeeder[]; - organization_permissions: OrganizationPermissionSeeder[]; - organization_roles: OrganizationRoleSeeder[]; - applications: ApplicationSeeder[]; - resources: ResourceSeeder[]; - connectors: ConnectorSeeder[]; - webhooks: WebhookSeeder[]; - sign_in_experiences: SignInExperienceSeeder[]; - resource_permissions: ResourcePermissionSeeder[]; - resource_roles: ResourceRoleSeeder[]; + organizations?: OrganizationSeeder[]; + organization_permissions?: OrganizationPermissionSeeder[]; + organization_roles?: OrganizationRoleSeeder[]; + applications?: ApplicationSeeder[]; + resources?: ResourceSeeder[]; + connectors?: ConnectorSeeder[]; + webhooks?: WebhookSeeder[]; + sign_in_experiences?: SignInExperienceSeeder[]; + resource_permissions?: ResourcePermissionSeeder[]; + resource_roles?: ResourceRoleSeeder[]; }; export type OrganizationSeeder = { diff --git a/packages/cli/src/commands/database/ogcio/ogcio.ts b/packages/cli/src/commands/database/ogcio/ogcio.ts index 5a68923df3d..2e6c355dff7 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio.ts +++ b/packages/cli/src/commands/database/ogcio/ogcio.ts @@ -19,7 +19,7 @@ const createDataForTenant = async ( tenantId: string, tenantData: OgcioSeeder ) => { - if (tenantData.organizations.length > 0) { + if (tenantData.organizations?.length) { const organizations = await createOrganizations({ transaction, tenantId, @@ -33,7 +33,7 @@ const createDataForTenant = async ( toSeed: tenantData, }); - if (tenantData.applications.length > 0) { + if (tenantData.applications?.length) { const applications = await seedApplications({ transaction, tenantId, @@ -41,7 +41,7 @@ const createDataForTenant = async ( }); } - if (tenantData.resources.length > 0) { + if (tenantData.resources?.length) { const resources = await seedResources({ transaction, tenantId, @@ -56,7 +56,7 @@ const createDataForTenant = async ( }); } - if (tenantData.connectors.length > 0) { + if (tenantData.connectors?.length) { const connectors = await seedConnectors({ transaction, tenantId, @@ -64,7 +64,7 @@ const createDataForTenant = async ( }); } - if (tenantData.sign_in_experiences.length > 0) { + if (tenantData.sign_in_experiences?.length) { const signInExperiences = await seedSignInExperiences({ transaction, tenantId, @@ -72,7 +72,7 @@ const createDataForTenant = async ( }); } - if (tenantData.webhooks.length > 0) { + if (tenantData.webhooks?.length) { const webhooks = await seedWebhooks({ transaction, tenantId, diff --git a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts index 729fd36992a..f9f979a1669 100644 --- a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts @@ -86,15 +86,15 @@ export const seedOrganizationRbacData = async (params: { transaction: DatabaseTransactionConnection; tenantId: string; toSeed: { - organization_permissions: OrganizationPermissionSeeder[]; - organization_roles: OrganizationRoleSeeder[]; + organization_permissions?: OrganizationPermissionSeeder[]; + organization_roles?: OrganizationRoleSeeder[]; }; }): Promise<{ scopes: OrganizationScopesLists; roles: Record; relations: SeedingRelation[]; }> => { - if (params.toSeed.organization_permissions.length > 0) { + if (params.toSeed.organization_permissions?.length && params.toSeed.organization_roles?.length) { const createdScopes = await createScopes({ transaction: params.transaction, tenantId: params.tenantId, diff --git a/packages/cli/src/commands/database/ogcio/resources-rbac.ts b/packages/cli/src/commands/database/ogcio/resources-rbac.ts index 6ff4bf1bccf..b2ada091496 100644 --- a/packages/cli/src/commands/database/ogcio/resources-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/resources-rbac.ts @@ -90,14 +90,14 @@ const createRelations = async (params: { const replaceWithResourceIdFromDatabase = ( seededResources: Record, toSeed: { - resource_permissions: ResourcePermissionSeeder[]; - resource_roles: ResourceRoleSeeder[]; + resource_permissions?: ResourcePermissionSeeder[]; + resource_roles?: ResourceRoleSeeder[]; } ): { - resource_permissions: ResourcePermissionSeeder[]; - resource_roles: ResourceRoleSeeder[]; + resource_permissions?: ResourcePermissionSeeder[]; + resource_roles?: ResourceRoleSeeder[]; } => { - if (toSeed.resource_permissions.length > 0) { + if (toSeed.resource_permissions?.length) { for (const permission of toSeed.resource_permissions) { const toSetResourceIds = []; for (const resourceId of permission.for_resource_ids) { @@ -112,7 +112,7 @@ const replaceWithResourceIdFromDatabase = ( } } - if (toSeed.resource_roles.length > 0) { + if (toSeed.resource_roles?.length) { for (const roles of toSeed.resource_roles) { const toSetResourceIds = []; for (const permissionGroup of roles.permissions) { @@ -137,8 +137,8 @@ export const seedResourceRbacData = async (params: { tenantId: string; seededResources: Record; toSeed: { - resource_permissions: ResourcePermissionSeeder[]; - resource_roles: ResourceRoleSeeder[]; + resource_permissions?: ResourcePermissionSeeder[]; + resource_roles?: ResourceRoleSeeder[]; }; }): Promise<{ scopes: ResourceScopesLists; @@ -146,7 +146,7 @@ export const seedResourceRbacData = async (params: { relations: SeedingRelation[]; }> => { params.toSeed = replaceWithResourceIdFromDatabase(params.seededResources, params.toSeed); - if (params.toSeed.resource_permissions.length > 0) { + if (params.toSeed.resource_permissions?.length && params.toSeed.resource_roles?.length) { const createdScopes = await createScopes({ transaction: params.transaction, tenantId: params.tenantId, From 46cb5fa9d51afe104d6482ce0b483d0a214d65aa Mon Sep 17 00:00:00 2001 From: Sara Zanellato <47299026+peschina@users.noreply.github.com> Date: Thu, 27 Jun 2024 13:57:05 +0200 Subject: [PATCH 4/7] [17584] Deploy to staging (#47) * Add staging pipeline file (#36) * add file * fix * feat(cli): update seeder (#35) * Add deploy stage to logto-admin (#38) * fix(cli): fix logto pipeline (#40) * fix(cli): fix seeder to handle empty data (#41) fix(cli): fix seeder to handle empty values * feat: logto uat changes (#43) * feat: logto uat changes * Update pipeline-variables/uat.yml Co-authored-by: Sara Zanellato <47299026+peschina@users.noreply.github.com> --------- Co-authored-by: Sara Zanellato <47299026+peschina@users.noreply.github.com> --------- Co-authored-by: Alfonso Graziano Co-authored-by: Norbert Nagy Co-authored-by: William Monteiro --- azure_pipelines.yml | 2 +- pipeline-variables/uat.yml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 pipeline-variables/uat.yml diff --git a/azure_pipelines.yml b/azure_pipelines.yml index 83a034a50ba..4085f714049 100644 --- a/azure_pipelines.yml +++ b/azure_pipelines.yml @@ -83,4 +83,4 @@ stages: parameters: awsServiceConnection: ${{ variables.awsServiceConnection }} awsRegion: ${{ variables.awsRegion }} - serviceName: logto-admin \ No newline at end of file + serviceName: logto-admin diff --git a/pipeline-variables/uat.yml b/pipeline-variables/uat.yml new file mode 100644 index 00000000000..8426c18d747 --- /dev/null +++ b/pipeline-variables/uat.yml @@ -0,0 +1,5 @@ +variables: + awsServiceConnection: life-events-uat-ecr + awsRegion: eu-west-1 + ecrEndpoint: 339713032391.dkr.ecr.eu-west-1.amazonaws.com + buildArguments: "" From 6efc87b418a93c1cd0d0f944507fd9a60c6de643 Mon Sep 17 00:00:00 2001 From: Sara Zanellato <47299026+peschina@users.noreply.github.com> Date: Fri, 28 Jun 2024 14:25:01 +0200 Subject: [PATCH 5/7] [18810] Deploy to staging (#50) * Add staging pipeline file (#36) * add file * fix * feat(cli): update seeder (#35) * Add deploy stage to logto-admin (#38) * fix(cli): fix logto pipeline (#40) * fix(cli): fix seeder to handle empty data (#41) fix(cli): fix seeder to handle empty values * feat: logto uat changes (#43) * feat: logto uat changes * Update pipeline-variables/uat.yml Co-authored-by: Sara Zanellato <47299026+peschina@users.noreply.github.com> --------- Co-authored-by: Sara Zanellato <47299026+peschina@users.noreply.github.com> * Test migration command in Terraform (#48) fix: remove seed commands from dockerfile --------- Co-authored-by: Alfonso Graziano Co-authored-by: Norbert Nagy Co-authored-by: William Monteiro --- Dockerfile | 2 +- packages/cli/src/commands/database/ogcio/organizations-rbac.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3e5e85610da..1be470e7711 100644 --- a/Dockerfile +++ b/Dockerfile @@ -54,4 +54,4 @@ EXPOSE 3301 # OGCIO EXPOSE 3302 # OGCIO -CMD [ "sh", "-c", "export ENCODED_PASSWORD=$(jq --slurp --raw-input --raw-output @uri <(printf \"%s\" $POSTGRES_PASSWORD)) && export DB_URL=\"postgres://$POSTGRES_USER:$ENCODED_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB_NAME\" && export REDIS_URL=\"redis://$REDIS_HOST:$REDIS_PORT\" && npm run cli db seed -- --swe && npm run cli db alteration deploy latest && npm run ogcio:start"] +CMD [ "sh", "-c", "export ENCODED_PASSWORD=$(jq --slurp --raw-input --raw-output @uri <(printf \"%s\" $POSTGRES_PASSWORD)) && export DB_URL=\"postgres://$POSTGRES_USER:$ENCODED_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB_NAME\" && export REDIS_URL=\"redis://$REDIS_HOST:$REDIS_PORT\" && npm run ogcio:start"] diff --git a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts index f9f979a1669..1691681c4cd 100644 --- a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts @@ -101,6 +101,7 @@ export const seedOrganizationRbacData = async (params: { scopesToSeed: params.toSeed.organization_permissions, fillScopesMethod: fillScopes, }); + const createdRoles = await createRoles({ transaction: params.transaction, tenantId: params.tenantId, From 5c52434045ff58da6abe8cc2d68aa2203aefaba1 Mon Sep 17 00:00:00 2001 From: Sara Zanellato <47299026+peschina@users.noreply.github.com> Date: Fri, 28 Jun 2024 17:48:48 +0200 Subject: [PATCH 6/7] [18630] Deploy renamed seeder to staging (#53) * Add staging pipeline file (#36) * add file * fix * feat(cli): update seeder (#35) * Add deploy stage to logto-admin (#38) * fix(cli): fix logto pipeline (#40) * fix(cli): fix seeder to handle empty data (#41) fix(cli): fix seeder to handle empty values * feat: logto uat changes (#43) * feat: logto uat changes * Update pipeline-variables/uat.yml Co-authored-by: Sara Zanellato <47299026+peschina@users.noreply.github.com> --------- Co-authored-by: Sara Zanellato <47299026+peschina@users.noreply.github.com> * Test migration command in Terraform (#48) fix: remove seed commands from dockerfile * 18630 seed real roles (#45) * feat(cli): seed roles and permissions into db * fix(cli): cleanup code * chore(cli): small update * chore(cli): refactoring roles * chore(cli): refactoring organization roles * chore(cli): update * chore(cli): rename seeder file (#52) * chore(cli): rename seeder file * chore(cli): fix eof new line --------- Co-authored-by: Alfonso Graziano Co-authored-by: Norbert Nagy Co-authored-by: William Monteiro --- .gitleaksignore | 6 +- README.OGCIO.md | 6 +- docker-compose-local.yml | 2 +- .../commands/database/ogcio/common-rbac.ts | 377 ------------------ .../cli/src/commands/database/ogcio/index.ts | 2 +- .../database/ogcio/ogcio-seeder-local.json | 162 ++++++++ .../commands/database/ogcio/ogcio-seeder.json | 78 ++-- .../commands/database/ogcio/ogcio-seeder.ts | 22 +- .../cli/src/commands/database/ogcio/ogcio.ts | 4 +- .../database/ogcio/organizations-rbac.ts | 197 +++++---- .../commands/database/ogcio/resources-rbac.ts | 285 ++++++++----- packages/core/src/libraries/ogcio-user.ts | 83 +++- .../interaction/actions/submit-interaction.ts | 18 +- 13 files changed, 605 insertions(+), 637 deletions(-) delete mode 100644 packages/cli/src/commands/database/ogcio/common-rbac.ts create mode 100644 packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json diff --git a/.gitleaksignore b/.gitleaksignore index dbab12c141e..c6049a9b76b 100644 --- a/.gitleaksignore +++ b/.gitleaksignore @@ -1,4 +1,4 @@ /src/packages/connectors/connector-saml/README.md:private-key:101 -/src/packages/cli/src/commands/database/ogcio/ogcio-seeder.json:generic-api-key:33 -/src/packages/cli/src/commands/database/ogcio/ogcio-seeder.json:generic-api-key:42 -/src/packages/cli/src/commands/database/ogcio/ogcio-seeder.json:generic-api-key:151 \ No newline at end of file +/src/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json:generic-api-key:37 +/src/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json:generic-api-key:46 +/src/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json:generic-api-key:157 diff --git a/README.OGCIO.md b/README.OGCIO.md index e0316dd4935..9a1f976a5e1 100644 --- a/README.OGCIO.md +++ b/README.OGCIO.md @@ -68,7 +68,7 @@ USER_DEFAULT_ORGANIZATION_ROLE_NAMES=OGCIO Employee, OGCIO Manager 3. After the installation, you can start seeding the database. You have to seed in two steps: - seed Logto's database: `pnpm cli db seed` -- seed custom OGCIO data: `npm run cli db ogcio -- --seeder-filepath="./packages/cli/src/commands/database/ogcio/ogcio-seeder.json"` +- seed custom OGCIO data: `npm run cli db ogcio -- --seeder-filepath="./packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json"` 3.5. Database alteration @@ -98,7 +98,7 @@ After installing and seeding the database, you must create a default admin user. ## Custom seeder -We made a custom seeder to ensure the required configuration for OGCIO Building Block integration exists right after the installation. The seeder also makes configuring the deployed Logto instance easy via a CI pipeline. The seeder is located in `packages/cli/src/commands/database/ogcio/`. The configuration for the local dev environment is inside `packages/cli/src/commands/database/ogcio/ogcio-seeder.json`. +We made a custom seeder to ensure the required configuration for OGCIO Building Block integration exists right after the installation. The seeder also makes configuring the deployed Logto instance easy via a CI pipeline. The seeder is located in `packages/cli/src/commands/database/ogcio/`. The configuration for the local dev environment is inside `packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json`. Each type of configuration has its own dedicated file, which serves as a repository of knowledge about the structure of the configuration and how it should be inserted into the database. This approach ensures a systematic and organized management of the database configuration. @@ -112,4 +112,4 @@ This command can take a parameter to specify the input data file, called `seeder Usage: `npm run cli db ogcio -- --seeder-filepath="DATA_FILE_PATH"` -To seed the default data for local dev environments, run `npm run cli db ogcio -- --seeder-filepath="./packages/cli/src/commands/database/ogcio/ogcio-seeder.json"`. +To seed the default data for local dev environments, run `npm run cli db ogcio -- --seeder-filepath="./packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json"`. diff --git a/docker-compose-local.yml b/docker-compose-local.yml index 9ea1f94e67d..a9d5657ad8f 100644 --- a/docker-compose-local.yml +++ b/docker-compose-local.yml @@ -9,7 +9,7 @@ services: [ "sh", "-c", - "npm run cli db seed -- --swe && npm run cli db alteration deploy latest && npm run cli db ogcio -- --seeder-filepath=\"/etc/logto/packages/cli/src/commands/database/ogcio/ogcio-seeder.json\" && npm start" + "npm run cli db seed -- --swe && npm run cli db alteration deploy latest && npm run cli db ogcio -- --seeder-filepath=\"/etc/logto/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json\" && npm start" ] ports: - 3301:3301 diff --git a/packages/cli/src/commands/database/ogcio/common-rbac.ts b/packages/cli/src/commands/database/ogcio/common-rbac.ts deleted file mode 100644 index 7aa82df891b..00000000000 --- a/packages/cli/src/commands/database/ogcio/common-rbac.ts +++ /dev/null @@ -1,377 +0,0 @@ -/* eslint-disable eslint-comments/disable-enable-pair */ - -/* eslint-disable @silverhand/fp/no-let */ -/* eslint-disable @silverhand/fp/no-mutating-methods */ -/* eslint-disable @silverhand/fp/no-mutation */ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable max-lines */ -/* eslint-disable max-params */ -import { OrganizationRoles, OrganizationScopes, Roles, Scopes } from '@logto/schemas'; -import { sql, type ValueExpression, type DatabaseTransactionConnection } from '@silverhand/slonik'; - -import { - type ResourcePermissionSeeder, - type OrganizationPermissionSeeder, - type OrganizationRoleSeeder, - type ResourceRoleSeeder, -} from './ogcio-seeder.js'; -import { createItem } from './queries.js'; - -type SeedingScope = { - name: string; - id?: string; - description: string; -}; - -export type ResourceSeedingScope = SeedingScope & { - resource_id: string; -}; - -export type OrganizationSeedingScope = SeedingScope; - -type SeedingRole = { - name: string; - description: string; - id?: string; - scopes: T[]; -}; - -export type OrganizationSeedingRole = SeedingRole; - -export type ResourceSeedingRole = SeedingRole; - -export type ScopesLists = { - scopesList: T[]; - scopesByEntity: Record; - scopesByAction: Record; - scopesByFullName: Record; -}; - -export type OrganizationScopesLists = ScopesLists; - -export type ResourceScopesLists = Record>; - -export const buildScopeFullName = (entity: string, action: string, subject?: string): string => - [entity, action, subject].filter(Boolean).join(':'); - -export const ensureRoleHasAtLeastOneScope = (roleName: string, scopes: T[]): void => { - if (scopes.length === 0) { - throw new Error(`${roleName}. You must assign at least one scope`); - } -}; - -export const buildCrossScopes = ( - actions: string[], - entities: string[], - specificPermissions: string[], - scopesLists: ScopesLists -): T[] => { - if (actions.length === 0 && entities.length === 0) { - return []; - } - const scopesByAction = actions.length > 0 ? actions : Object.keys(scopesLists.scopesByAction); - const scopesByEntity = entities.length > 0 ? entities : Object.keys(scopesLists.scopesByEntity); - const byFullname: T[] = []; - for (const action of scopesByAction) { - for (const entity of scopesByEntity) { - const fullName = buildScopeFullName(entity, action); - if ( - scopesLists.scopesByFullName[fullName] !== undefined && - !specificPermissions.includes(fullName) - ) { - byFullname.push(scopesLists.scopesByFullName[fullName]!); - } - } - } - - return byFullname; -}; - -export const getScopesBySpecificPermissions = < - T extends ResourceSeedingScope | OrganizationSeedingScope, ->( - specificPerms: string[] | undefined, - scopesLists: ScopesLists -): T[] => { - if (!specificPerms || specificPerms.length === 0) { - return []; - } - const outputPerms: T[] = []; - for (const scopeName of specificPerms) { - if (!scopesLists.scopesByFullName[scopeName]) { - throw new Error(`Specific permissions. The requested ${scopeName} scope does not exist!`); - } - outputPerms.push(scopesLists.scopesByFullName[scopeName]!); - } - - return outputPerms; -}; - -const addScopeToLists = ( - lists: ScopesLists, - resource: string, - action: string, - resourceId?: string, - subject?: string -) => { - const { scopesByEntity, scopesList, scopesByAction, scopesByFullName } = lists; - - const scope: { name: string; description: string; resource_id?: string } = { - name: buildScopeFullName(resource, action, subject), - description: `${action} ${resource} ${subject}`, - }; - if (resourceId) { - scope.resource_id = resourceId; - } - scopesList.push(scope); - if (scopesByEntity[resource] === undefined) { - scopesByEntity[resource] = []; - } - scopesByEntity[resource]!.push(scope); - if (scopesByAction[action] === undefined) { - scopesByAction[action] = []; - } - scopesByAction[action]!.push(scope); - - scopesByFullName[scope.name] = scope; -}; - -export const fillScopesGroup = < - T extends OrganizationPermissionSeeder | ResourcePermissionSeeder, - U extends ScopesLists, ->( - seeder: T, - fullLists: U, - resourceId?: string -) => { - for (const permission of seeder.specific_permissions ?? []) { - const [resource, action, subject] = permission.split(':'); - if (!resource || !action) { - continue; - } - - addScopeToLists(fullLists, resource, action, resourceId, subject); - } - - for (const resource of seeder.entities ?? []) { - for (const action of seeder.actions ?? []) { - addScopeToLists(fullLists, resource, action, resourceId); - } - } - - return fullLists; -}; - -const isResourceScope = ( - scopeToSeed: ResourceSeedingScope | OrganizationSeedingScope -): scopeToSeed is ResourceSeedingScope => 'resource_id' in scopeToSeed; - -const getScopeConfigByType = ( - scopeToSeed: T -): { tableName: string; whereClauses: ValueExpression[] } => { - if (isResourceScope(scopeToSeed)) { - return { - tableName: Scopes.table, - whereClauses: [ - sql`name = ${scopeToSeed.name}`, - sql`resource_id = ${scopeToSeed.resource_id}`, - ], - }; - } - - return { - tableName: OrganizationScopes.table, - whereClauses: [sql`name = ${scopeToSeed.name}`], - }; -}; - -const createScope = async (params: { - transaction: DatabaseTransactionConnection; - tenantId: string; - scopeToSeed: T; -}) => - createItem({ - transaction: params.transaction, - tenantId: params.tenantId, - toInsert: params.scopeToSeed, - toLogFieldName: 'name', - ...getScopeConfigByType(params.scopeToSeed), - }); - -const isResourceRole = ( - roleToSeed: ResourceSeedingRole | OrganizationSeedingRole -): roleToSeed is ResourceSeedingRole => { - if (roleToSeed.scopes.length === 0) { - throw new Error('You must assign at least one scope to a role!'); - } - - return isResourceScope(roleToSeed.scopes[0]!); -}; - -const isResourceScopeLists = ( - input: OrganizationScopesLists | ResourceScopesLists -): input is ResourceScopesLists => { - if (typeof input !== 'object') { - return false; - } - const resourceKeys = Object.keys(input); - if (resourceKeys.length === 0) { - throw new Error('You must create scopes for at least one resource'); - } - - return true; -}; - -const getListOfScopesToSeed = ( - input: OrganizationScopesLists | ResourceScopesLists -): SeedingScope[] => { - if ('scopesList' in input && Array.isArray(input.scopesList)) { - return input.scopesList; - } - if (isResourceScopeLists(input)) { - const resourceScopesList: ResourceScopesLists = input; - let outputScopes: SeedingScope[] = []; - - for (const scopesGroup of Object.values(resourceScopesList)) { - outputScopes = [...outputScopes, ...scopesGroup.scopesList]; - } - - return outputScopes; - } - throw new Error('List of scopes is not valid'); -}; - -export const getScopesPerRole = ( - roleToSeed: { - name: string; - specific_permissions?: string[]; - actions?: string[]; - entities?: string[]; - }, - scopesLists: ScopesLists -): U[] => { - const inputSpecific = roleToSeed.specific_permissions ?? []; - const specificScopes = getScopesBySpecificPermissions(inputSpecific, scopesLists); - const byAction = roleToSeed.actions ?? []; - const byEntity = roleToSeed.entities ?? []; - ensureRoleHasAtLeastOneScope(roleToSeed.name, [...specificScopes, ...byAction, ...byEntity]); - - const fullList = [ - ...buildCrossScopes(byAction, byEntity, inputSpecific, scopesLists), - ...specificScopes, - ]; - - ensureRoleHasAtLeastOneScope(roleToSeed.name, fullList); - - return fullList; -}; - -export const createScopes = async < - T extends OrganizationPermissionSeeder | ResourcePermissionSeeder, - O extends OrganizationScopesLists | ResourceScopesLists, ->(params: { - transaction: DatabaseTransactionConnection; - tenantId: string; - scopesToSeed: T[]; - fillScopesMethod: (scopesToSeed: T[]) => O; -}): Promise => { - const scopesToCreate = params.fillScopesMethod(params.scopesToSeed); - if (params.scopesToSeed.length === 0) { - return scopesToCreate; - } - const queries: Array< - Promise & { id: string }> - > = []; - for (const element of getListOfScopesToSeed(scopesToCreate)) { - queries.push( - createScope({ - scopeToSeed: element, - transaction: params.transaction, - tenantId: params.tenantId, - }) - ); - } - - await Promise.all(queries); - - return scopesToCreate; -}; - -const getRoleConfigByType = ( - roleToSeed: T -): { tableName: string } => { - if (isResourceRole(roleToSeed)) { - return { - tableName: Roles.table, - }; - } - - return { - tableName: OrganizationRoles.table, - }; -}; - -const createRole = async (params: { - transaction: DatabaseTransactionConnection; - tenantId: string; - roleToSeed: T; -}) => { - const created = await createItem({ - transaction: params.transaction, - tenantId: params.tenantId, - toLogFieldName: 'name', - whereClauses: [sql`name = ${params.roleToSeed.name}`], - toInsert: { name: params.roleToSeed.name, description: params.roleToSeed.description }, - ...getRoleConfigByType(params.roleToSeed), - }); - - params.roleToSeed.id = created.id; - - return { - ...params.roleToSeed, - id: created.id, - }; -}; - -export const addRole = async (params: { - transaction: DatabaseTransactionConnection; - tenantId: string; - role: T; - toFill: Record; -}) => { - params.toFill[params.role.name] = await createRole({ - transaction: params.transaction, - tenantId: params.tenantId, - roleToSeed: params.role, - }); -}; - -export const createRoles = async < - R extends OrganizationRoleSeeder | ResourceRoleSeeder, - T extends OrganizationScopesLists | ResourceScopesLists, - O extends OrganizationSeedingRole | ResourceSeedingRole, ->(params: { - transaction: DatabaseTransactionConnection; - tenantId: string; - scopesLists: T; - rolesToSeed: R[]; - fillRolesMethod: (rolesToSeed: R[], seededScopes: T) => O[]; -}): Promise> => { - const rolesToCreate = params.fillRolesMethod(params.rolesToSeed, params.scopesLists); - const queries: Array> = []; - const outputList: Record = {}; - for (const role of rolesToCreate) { - queries.push( - addRole({ - transaction: params.transaction, - tenantId: params.tenantId, - role, - toFill: outputList, - }) - ); - } - - await Promise.all(queries); - - return outputList; -}; diff --git a/packages/cli/src/commands/database/ogcio/index.ts b/packages/cli/src/commands/database/ogcio/index.ts index c337257aaa3..f6aef1b37ab 100644 --- a/packages/cli/src/commands/database/ogcio/index.ts +++ b/packages/cli/src/commands/database/ogcio/index.ts @@ -12,7 +12,7 @@ import { consoleLog } from '../../../utils.js'; import { setTenantSeederData, type OgcioTenantSeeder } from './ogcio-seeder.js'; import { seedOgcio } from './ogcio.js'; -const DEFAULT_SEEDER_FILE = './src/commands/database/ogcio/ogcio-seeder.json'; +const DEFAULT_SEEDER_FILE = './src/commands/database/ogcio/ogcio-seeder-local.json'; const interpolateString = (content: string): string => { const regExp = /<\w+>/g; diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json b/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json new file mode 100644 index 00000000000..273ef1be355 --- /dev/null +++ b/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json @@ -0,0 +1,162 @@ +{ + "default": { + "organizations": [ + { + "name": "OGCIO Seeded Org", + "description": "Organization created through seeder", + "id": "ogcio" + } + ], + "organization_permissions": { + "specific_permissions": [ + "payments:provider:*", + "payments:payment_request:*", + "payments:payment_request.public:read", + "payments:transaction:*" + ] + }, + "organization_roles": [ + { + "name": "Public Servant", + "description": "Building Blocks Public servant", + "specific_permissions": [ + "payments:provider:*", + "payments:payment_request:*", + "payments:payment_request.public:read", + "payments:transaction:*" + ] + } + ], + "applications": [ + { + "name": "Payments Building Block", + "description": "Payments App of Life Events", + "type": "Traditional", + "redirect_uri": "http://localhost:3001/callback", + "logout_redirect_uri": "http://localhost:3001", + "secret": "bgHz4Ouv2lxXCdc6s6s4IUoNpFAklC15", + "id": "2xz6sbi8ch01uhjt1oq8r" + }, + { + "name": "Messaging Building Block", + "description": "Messaging App of Life Events", + "type": "Traditional", + "redirect_uri": "http://localhost:3002/callback", + "logout_redirect_uri": "http://localhost:3002", + "secret": "Y3nBMm8Hs3Ugcl4596w5ewgOosvwX4im", + "id": "4695d8onfb9f3bv18phtq" + } + ], + "resources": [ + { + "id": "payments-api", + "name": "Payments Building Block API", + "indicator": "http://localhost:8001/" + }, + { + "id": "messaging-api", + "name": "Messaging Building Block API", + "indicator": "http://localhost:8002/" + } + ], + "resource_permissions": [ + { + "resource_id": "payments-api", + "specific_permissions": [ + "payments:transaction.self:read", + "payments:payment_request.public:read", + "payments:transaction.self:write", + "payments:provider.public:read" + ] + } + ], + "resource_roles": [ + { + "name": "Citizen", + "description": "A citizen using Life Events and the Building Blocks ecosystem", + "permissions": [ + { + "resource_id": "payments-api", + "specific_permissions": [ + "payments:transaction.self:read", + "payments:payment_request.public:read", + "payments:transaction.self:write", + "payments:provider.public:read" + ] + } + ] + } + ], + "connectors": [ + { + "id": "mygovid", + "sync_profile": false, + "connector_id": "mygovid", + "config": { + "scope": "openid profile email", + "clientId": "mock_client_id", + "clientSecret": "mock_client_secret", + "tokenEndpoint": "http://localhost:3005/logto/mock/token", + "authorizationEndpoint": "http://localhost:3005/logto/mock/auth", + "tokenEndpointAuthMethod": "client_secret_post", + "idTokenVerificationConfig": { + "jwksUri": "http://localhost:3005/logto/mock/keys" + }, + "clientSecretJwtSigningAlgorithm": "HS256" + }, + "metadata": { + "logo": "https://mygovidstatic.blob.core.windows.net/assets/images/favicon_196x196.png", + "name": { + "en": "MyGovId" + }, + "target": "MyGovId (MyGovId connector)" + } + } + ], + "sign_in_experiences": [ + { + "id": "default", + "color": { + "primaryColor": "#007DA6", + "darkPrimaryColor": "#007DA6", + "isDarkModeEnabled": false + }, + "branding": { + "logoUrl": "https://mygovidstatic.blob.core.windows.net/assets/images/helpchat-logo.png", + "darkLogoUrl": "https://mygovidstatic.blob.core.windows.net/assets/images/helpchat-logo.png" + }, + "language_info": { + "autoDetect": true, + "fallbackLanguage": "en" + }, + "sign_in": { + "methods": [] + }, + "sign_up": { + "verify": false, + "password": false, + "identifiers": [] + }, + "social_sign_in_connector_targets": [ + "MyGovId (MyGovId connector)" + ], + "sign_in_mode": "SignInAndRegister" + } + ], + "webhooks": [ + { + "id": "login_webhook", + "name": "User log in", + "events": [ + "PostRegister", + "PostSignIn" + ], + "config": { + "url": "http://localhost:8003/user-login-wh" + }, + "signing_key": "xpWX3WIkPkSA5A0UzLMfNOuTl1qEnbkg", + "enabled": true + } + ] + } +} diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder.json b/packages/cli/src/commands/database/ogcio/ogcio-seeder.json index a33424ae1f5..b0dbb11d6d5 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio-seeder.json +++ b/packages/cli/src/commands/database/ogcio/ogcio-seeder.json @@ -2,24 +2,28 @@ "default": { "organizations": [ { - "name": "OGCIO Seeded Org", - "description": "Organization created through seeder", + "name": "OGCIO", + "description": "OGCIO Organization", "id": "ogcio" } ], - "organization_permissions": [ - { - "specific_permissions": [ - "payments:create:providers" - ] - } - ], + "organization_permissions": { + "specific_permissions": [ + "payments:provider:*", + "payments:payment_request:*", + "payments:payment_request.public:read", + "payments:transaction:*" + ] + }, "organization_roles": [ { - "name": "Public servant", + "name": "Public Servant", "description": "Building Blocks Public servant", "specific_permissions": [ - "payments:create:providers" + "payments:provider:*", + "payments:payment_request:*", + "payments:payment_request.public:read", + "payments:transaction:*" ] } ], @@ -28,40 +32,41 @@ "name": "Payments Building Block", "description": "Payments App of Life Events", "type": "Traditional", - "redirect_uri": "http://localhost:3001/callback", - "logout_redirect_uri": "http://localhost:3001", - "secret": "bgHz4Ouv2lxXCdc6s6s4IUoNpFAklC15", - "id": "2xz6sbi8ch01uhjt1oq8r" + "redirect_uri": "", + "logout_redirect_uri": "", + "secret": "", + "id": "r5f56tpkytpqyyshiutd2" }, { "name": "Messaging Building Block", "description": "Messaging App of Life Events", "type": "Traditional", - "redirect_uri": "http://localhost:3002/callback", - "logout_redirect_uri": "http://localhost:3002", - "secret": "Y3nBMm8Hs3Ugcl4596w5ewgOosvwX4im", - "id": "4695d8onfb9f3bv18phtq" + "redirect_uri": "", + "logout_redirect_uri": "", + "secret": "", + "id": "1lvmteh2ao3xrswyq7j3e" } ], "resources": [ { "id": "payments-api", "name": "Payments Building Block API", - "indicator": "http://localhost:8001/" + "indicator": "" }, { "id": "messaging-api", "name": "Messaging Building Block API", - "indicator": "http://localhost:8002/" + "indicator": "" } ], "resource_permissions": [ { - "for_resource_ids": [ - "payments-api" - ], + "resource_id": "payments-api", "specific_permissions": [ - "payments:create:payment" + "payments:transaction.self:read", + "payments:payment_request.public:read", + "payments:transaction.self:write", + "payments:provider.public:read" ] } ], @@ -71,11 +76,12 @@ "description": "A citizen using Life Events and the Building Blocks ecosystem", "permissions": [ { - "for_resource_ids": [ - "payments-api" - ], + "resource_id": "payments-api", "specific_permissions": [ - "payments:create:payment" + "payments:transaction.self:read", + "payments:payment_request.public:read", + "payments:transaction.self:write", + "payments:provider.public:read" ] } ] @@ -88,13 +94,13 @@ "connector_id": "mygovid", "config": { "scope": "openid profile email", - "clientId": "mock_client_id", - "clientSecret": "mock_client_secret", - "tokenEndpoint": "http://localhost:3005/logto/mock/token", - "authorizationEndpoint": "http://localhost:3005/logto/mock/auth", + "clientId": "", + "clientSecret": "", + "tokenEndpoint": "", + "authorizationEndpoint": "", "tokenEndpointAuthMethod": "client_secret_post", "idTokenVerificationConfig": { - "jwksUri": "http://localhost:3005/logto/mock/keys" + "jwksUri": "" }, "clientSecretJwtSigningAlgorithm": "HS256" }, @@ -146,9 +152,9 @@ "PostSignIn" ], "config": { - "url": "http://localhost:8003/user-login-wh" + "url": "" }, - "signing_key": "xpWX3WIkPkSA5A0UzLMfNOuTl1qEnbkg", + "signing_key": "", "enabled": true } ] diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts b/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts index 01b4b52f74a..9210935157a 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts +++ b/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts @@ -5,7 +5,7 @@ export type OgcioTenantSeeder = Record; export type OgcioSeeder = { organizations?: OrganizationSeeder[]; - organization_permissions?: OrganizationPermissionSeeder[]; + organization_permissions?: OrganizationPermissionSeeder; organization_roles?: OrganizationRoleSeeder[]; applications?: ApplicationSeeder[]; resources?: ResourceSeeder[]; @@ -23,16 +23,12 @@ export type OrganizationSeeder = { }; export type OrganizationPermissionSeeder = { - specific_permissions?: string[]; - actions?: string[]; - entities?: string[]; + specific_permissions: string[]; }; export type OrganizationRoleSeeder = { name: string; - actions?: string[]; - entities?: string[]; - specific_permissions?: string[]; + specific_permissions: string[]; description: string; }; @@ -103,10 +99,8 @@ export type SignInExperienceSeeder = { }; export type ResourcePermissionSeeder = { - for_resource_ids: string[]; - specific_permissions?: string[]; - actions?: string[]; - entities?: string[]; + resource_id: string; + specific_permissions: string[]; }; export type ResourceRoleSeeder = { @@ -116,10 +110,8 @@ export type ResourceRoleSeeder = { }; export type ScopePerResourceRoleSeeder = { - for_resource_ids: string[]; - actions?: string[]; - entities?: string[]; - specific_permissions?: string[]; + resource_id: string; + specific_permissions: string[]; description: string; }; diff --git a/packages/cli/src/commands/database/ogcio/ogcio.ts b/packages/cli/src/commands/database/ogcio/ogcio.ts index 2e6c355dff7..4871c85c359 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio.ts +++ b/packages/cli/src/commands/database/ogcio/ogcio.ts @@ -27,7 +27,7 @@ const createDataForTenant = async ( }); } - const organizationsRbac = await seedOrganizationRbacData({ + await seedOrganizationRbacData({ transaction, tenantId, toSeed: tenantData, @@ -48,7 +48,7 @@ const createDataForTenant = async ( inputResources: tenantData.resources, }); - const resourcesRbac = await seedResourceRbacData({ + await seedResourceRbacData({ tenantId, transaction, toSeed: tenantData, diff --git a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts index 1691681c4cd..a786a87e24e 100644 --- a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts @@ -2,48 +2,123 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @silverhand/fp/no-mutating-methods */ -import { OrganizationRoleScopeRelations } from '@logto/schemas'; +import { OrganizationRoles, OrganizationRoleScopeRelations, OrganizationScopes } from '@logto/schemas'; import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; - -import { - type OrganizationSeedingRole, - type OrganizationScopesLists, - createScopes, - fillScopesGroup, - getScopesPerRole, - createRoles, -} from './common-rbac.js'; import { type OrganizationPermissionSeeder, type OrganizationRoleSeeder } from './ogcio-seeder.js'; -import { createItemWithoutId } from './queries.js'; +import { createItem, createItemWithoutId } from './queries.js'; + +type SeedingScope = { + name: string; + id?: string; + description: string; +}; +type ScopesByName = Record; + +type SeedingRole = { + name: string; + id?: string; + description: string; + scopes: string[]; +}; type SeedingRelation = { organization_role_id: string; organization_scope_id: string }; -const fillScopes = (scopesToSeed: OrganizationPermissionSeeder[]): OrganizationScopesLists => { - const fullLists: OrganizationScopesLists = { - scopesList: [], - scopesByEntity: {}, - scopesByAction: {}, - scopesByFullName: {}, - }; +const createScope = async (params: { + transaction: DatabaseTransactionConnection; + tenantId: string; + scopeToSeed: SeedingScope; +}) => + createItem({ + transaction: params.transaction, + tenantId: params.tenantId, + toInsert: params.scopeToSeed, + toLogFieldName: 'name', + tableName: OrganizationScopes.table, + whereClauses: [sql`name = ${params.scopeToSeed.name}`], + }); - for (const singleSeeder of scopesToSeed) { - fillScopesGroup(singleSeeder, fullLists); - } +const buildScopes = ( + scopes: string[] +): ScopesByName => { + return scopes.reduce((acc, scopeName) => { + acc[scopeName] = { + name: scopeName, + description: scopeName + }; + return acc; + }, {}); +}; + +export const createScopes = async (params: { + transaction: DatabaseTransactionConnection; + tenantId: string; + scopesToSeed: OrganizationPermissionSeeder; +}) => { + const scopesToCreate = buildScopes(params.scopesToSeed.specific_permissions); + + const queries = Object.values(scopesToCreate).map((scope) => + createScope({ + transaction: params.transaction, + tenantId: params.tenantId, + scopeToSeed: scope + }) + ); + + await Promise.all(queries); - return fullLists; + return scopesToCreate; }; -const fillRole = ( - roleToSeed: OrganizationRoleSeeder, - scopesLists: OrganizationScopesLists -): OrganizationSeedingRole => ({ - name: roleToSeed.name, - description: roleToSeed.description, - scopes: getScopesPerRole(roleToSeed, scopesLists), -}); +const createRole = async (params: { + transaction: DatabaseTransactionConnection; + tenantId: string; + roleToSeed: { + name: string; + description: string; + id?: string; + } +}) => { + const created = await createItem({ + transaction: params.transaction, + tenantId: params.tenantId, + toLogFieldName: 'name', + whereClauses: [sql`name = ${params.roleToSeed.name}`], + toInsert: { name: params.roleToSeed.name, description: params.roleToSeed.description }, + tableName: OrganizationRoles.table, + }); + + params.roleToSeed.id = created.id; + + return { + ...params.roleToSeed, + id: created.id, + }; +} -const fillRoles = (rolesToSeed: OrganizationRoleSeeder[], scopesLists: OrganizationScopesLists) => - rolesToSeed.map((role) => fillRole(role, scopesLists)); +const createRoles = async (params: { + transaction: DatabaseTransactionConnection; + tenantId: string; + scopes: ScopesByName, + rolesToSeed: OrganizationRoleSeeder[] +}) => { + const rolesToCreate = params.rolesToSeed.map((role) =>({ + name: role.name, + description: role.description, + scopes: role.specific_permissions + })); + + const queries = rolesToCreate.map((role) => + createRole({ + transaction: params.transaction, + tenantId: params.tenantId, + roleToSeed: role + }) + ); + + await Promise.all(queries); + + return rolesToCreate; +} const createRoleScopeRelation = async ( transaction: DatabaseTransactionConnection, @@ -66,19 +141,16 @@ const createRoleScopeRelation = async ( const createRelations = async ( transaction: DatabaseTransactionConnection, tenantId: string, - roles: Record + scopes: ScopesByName, + roles: SeedingRole[] ) => { - const queries: Array> = []; - for (const role of Object.values(roles)) { - for (const scope of role.scopes) { - queries.push( - createRoleScopeRelation(transaction, tenantId, { - organization_role_id: role.id!, - organization_scope_id: scope.id!, - }) - ); - } - } + const queries = roles.flatMap((role) => + role.scopes.map((scope) => createRoleScopeRelation(transaction, tenantId, { + organization_role_id: role.id!, + organization_scope_id: scopes[scope]?.id! + })) + ); + return Promise.all(queries); }; @@ -86,42 +158,29 @@ export const seedOrganizationRbacData = async (params: { transaction: DatabaseTransactionConnection; tenantId: string; toSeed: { - organization_permissions?: OrganizationPermissionSeeder[]; + organization_permissions?: OrganizationPermissionSeeder; organization_roles?: OrganizationRoleSeeder[]; }; -}): Promise<{ - scopes: OrganizationScopesLists; - roles: Record; - relations: SeedingRelation[]; -}> => { - if (params.toSeed.organization_permissions?.length && params.toSeed.organization_roles?.length) { +}) => { + if (params.toSeed.organization_permissions && params.toSeed.organization_roles?.length) { const createdScopes = await createScopes({ transaction: params.transaction, tenantId: params.tenantId, scopesToSeed: params.toSeed.organization_permissions, - fillScopesMethod: fillScopes, }); - + const createdRoles = await createRoles({ transaction: params.transaction, tenantId: params.tenantId, - scopesLists: createdScopes, - rolesToSeed: params.toSeed.organization_roles, - fillRolesMethod: fillRoles, + scopes: createdScopes, + rolesToSeed: params.toSeed.organization_roles }); - const relations = await createRelations(params.transaction, params.tenantId, createdRoles); - return { scopes: createdScopes, roles: createdRoles, relations }; + await createRelations( + params.transaction, + params.tenantId, + createdScopes, + createdRoles + ); } - - return { - scopes: { - scopesList: [], - scopesByEntity: {}, - scopesByAction: {}, - scopesByFullName: {}, - }, - roles: {}, - relations: [], - }; }; diff --git a/packages/cli/src/commands/database/ogcio/resources-rbac.ts b/packages/cli/src/commands/database/ogcio/resources-rbac.ts index b2ada091496..fcda585e7ee 100644 --- a/packages/cli/src/commands/database/ogcio/resources-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/resources-rbac.ts @@ -3,56 +3,145 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @silverhand/fp/no-mutating-methods */ /* eslint-disable @silverhand/fp/no-mutation */ -import { RolesScopes } from '@logto/schemas'; +import { Roles, RolesScopes, Scopes } from '@logto/schemas'; import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; - -import { - type ResourceSeedingRole, - type ResourceSeedingScope, - type ResourceScopesLists, - createScopes, - createRoles, - fillScopesGroup, - getScopesPerRole, - ensureRoleHasAtLeastOneScope, - type ScopesLists, -} from './common-rbac.js'; -import { type ResourceRoleSeeder, type ResourcePermissionSeeder } from './ogcio-seeder.js'; +import { type ResourceRoleSeeder, type ResourcePermissionSeeder, ScopePerResourceRoleSeeder } from './ogcio-seeder.js'; import { createItem } from './queries.js'; import { type SeedingResource } from './resources.js'; -const getFullListOfScopesPerRole = ( - roleToSeed: ResourceRoleSeeder, - scopesLists: ResourceScopesLists -): ResourceSeedingScope[] => { - ensureRoleHasAtLeastOneScope(roleToSeed.name, roleToSeed.permissions); - let fullList: ResourceSeedingScope[] = []; - for (const permissionsGroup of roleToSeed.permissions) { - for (const resource of permissionsGroup.for_resource_ids) { - fullList = [ - ...fullList, - ...getScopesPerRole({ name: roleToSeed.name, ...permissionsGroup }, scopesLists[resource]!), - ]; - } +type SeedingScope = { + name: string; + id?: string; + resource_id: string; + description: string; +}; +type ScopesByName = Record; +type ScopesByResourceId = Record; +type SeededRole = { + id?: string; + name: string; + description: string; + scopes: ScopePerResourceRoleSeeder[] +} +type SeedingRelation = { role_id: string; scope_id: string; id?: string }; + +const createScope = async (params: { + transaction: DatabaseTransactionConnection; + tenantId: string; + scopeToSeed: SeedingScope; +}) => + createItem({ + transaction: params.transaction, + tenantId: params.tenantId, + toInsert: params.scopeToSeed, + toLogFieldName: 'name', + tableName: Scopes.table, + whereClauses: [ + sql`name = ${params.scopeToSeed.name}`, + sql`resource_id = ${params.scopeToSeed.resource_id}` + ] + }); + +const buildScopes = ( + resourceId: string, + scopes: string[] +): ScopesByName => { + return scopes.reduce((acc, scopeName) => { + acc[scopeName] = { + name: scopeName, + description: scopeName, + resource_id: resourceId + }; + return acc; + }, {}); +}; + +export const createScopes = async (params: { + transaction: DatabaseTransactionConnection; + tenantId: string; + scopesToSeed: ResourcePermissionSeeder[]; +}) => { + if (params.scopesToSeed.length === 0) { + return {}; + } + + const scopesToCreate: ScopesByResourceId = {}; + for (const singleSeeder of params.scopesToSeed) { + scopesToCreate[singleSeeder.resource_id] = buildScopes(singleSeeder.resource_id, singleSeeder.specific_permissions); } - ensureRoleHasAtLeastOneScope(roleToSeed.name, fullList); - return fullList; + const queries: Array< + Promise & { id: string }> + > = []; + + + Object.values(scopesToCreate).forEach((scopes) => { + Object.values(scopes).forEach((scope) => { + queries.push( + createScope({ + scopeToSeed: scope, + transaction: params.transaction, + tenantId: params.tenantId, + }) + ); + }) + }); + + await Promise.all(queries); + + return scopesToCreate; }; -const fillRole = ( - roleToSeed: ResourceRoleSeeder, - scopesLists: ResourceScopesLists -): ResourceSeedingRole => ({ - name: roleToSeed.name, - description: roleToSeed.description, - scopes: getFullListOfScopesPerRole(roleToSeed, scopesLists), -}); +const createRole = async (params: { + transaction: DatabaseTransactionConnection; + tenantId: string; + roleToSeed: { + name: string; + description: string; + id?: string; + } +}) => { + const created = await createItem({ + transaction: params.transaction, + tenantId: params.tenantId, + toLogFieldName: 'name', + whereClauses: [sql`name = ${params.roleToSeed.name}`], + toInsert: { name: params.roleToSeed.name, description: params.roleToSeed.description }, + tableName: Roles.table, + }); -const fillRoles = (rolesToSeed: ResourceRoleSeeder[], scopesLists: ResourceScopesLists) => - rolesToSeed.map((role) => fillRole(role, scopesLists)); + params.roleToSeed.id = created.id; -type SeedingRelation = { role_id: string; scope_id: string; id?: string }; + return { + ...params.roleToSeed, + id: created.id, + }; +} + +const createRoles = async (params: { + transaction: DatabaseTransactionConnection; + tenantId: string; + scopes: ScopesByResourceId, + rolesToSeed: ResourceRoleSeeder[] +}) => { + const rolesToCreate = params.rolesToSeed.map((role) =>({ + name: role.name, + description: role.description, + scopes: role.permissions + })); + + const queries = rolesToCreate.map((role) => + createRole({ + transaction: params.transaction, + tenantId: params.tenantId, + roleToSeed: role + }) + ); + + await Promise.all(queries); + + return rolesToCreate; +} const createRoleScopeRelation = async ( transaction: DatabaseTransactionConnection, @@ -71,21 +160,41 @@ const createRoleScopeRelation = async ( const createRelations = async (params: { transaction: DatabaseTransactionConnection; tenantId: string; - roles: Record; + roles: SeededRole[]; + scopes: ScopesByResourceId; }) => { - const queries: Array> = []; - for (const role of Object.values(params.roles)) { - for (const scope of role.scopes) { - queries.push( - createRoleScopeRelation(params.transaction, params.tenantId, { + const relationsToCrete: SeedingRelation[] = []; + + params.roles.forEach((role) => { + role.scopes.forEach((scopeGroup) => { + const relations = scopeGroup.specific_permissions.map((permission) => { + // @ts-ignore @typescript-eslint/no-non-null-asserted-optional-chain + if (params.scopes[scopeGroup.resource_id]?.[permission]?.id === undefined) { + throw new Error("Requested permission does not exist.") + } + + return { role_id: role.id!, - scope_id: scope.id!, - }) - ); - } - } - return Promise.all(queries); -}; + // @ts-ignore @typescript-eslint/no-non-null-asserted-optional-chain + scope_id: params.scopes[scopeGroup.resource_id]?.[permission]?.id! + } + }); + relationsToCrete.push(...relations); + }) + }); + + const queries = relationsToCrete.map((relation) => + createRoleScopeRelation( + params.transaction, + params.tenantId, + relation + ) + ); + + await Promise.all(queries); + + return relationsToCrete; +} const replaceWithResourceIdFromDatabase = ( seededResources: Record, @@ -99,32 +208,26 @@ const replaceWithResourceIdFromDatabase = ( } => { if (toSeed.resource_permissions?.length) { for (const permission of toSeed.resource_permissions) { - const toSetResourceIds = []; - for (const resourceId of permission.for_resource_ids) { - if (!seededResources[resourceId]) { - throw new Error( - `Resource scopes. Referring to a not existent resource id: ${resourceId}!` - ); - } - toSetResourceIds.push(seededResources[resourceId]!.id!); + const seededResourceId = seededResources[permission.resource_id]; + if (!seededResourceId) { + throw new Error( + `Resource scopes. Referring to a not existent resource id: ${permission.resource_id}!` + ); } - permission.for_resource_ids = toSetResourceIds; + permission.resource_id = seededResourceId.id!; } } if (toSeed.resource_roles?.length) { for (const roles of toSeed.resource_roles) { - const toSetResourceIds = []; for (const permissionGroup of roles.permissions) { - for (const resourceId of permissionGroup.for_resource_ids) { - if (!seededResources[resourceId]) { - throw new Error( - `Resource roles. Referring to a not existent resource id: ${resourceId}!` - ); - } - toSetResourceIds.push(seededResources[resourceId]!.id!); + const seededResourceId = seededResources[permissionGroup.resource_id]; + if (!seededResourceId) { + throw new Error( + `Resource roles. Referring to a not existent resource id: ${permissionGroup.resource_id}!` + ); } - permissionGroup.for_resource_ids = toSetResourceIds; + permissionGroup.resource_id = seededResourceId.id!; } } } @@ -140,53 +243,27 @@ export const seedResourceRbacData = async (params: { resource_permissions?: ResourcePermissionSeeder[]; resource_roles?: ResourceRoleSeeder[]; }; -}): Promise<{ - scopes: ResourceScopesLists; - roles: Record; - relations: SeedingRelation[]; -}> => { +}) => { params.toSeed = replaceWithResourceIdFromDatabase(params.seededResources, params.toSeed); if (params.toSeed.resource_permissions?.length && params.toSeed.resource_roles?.length) { const createdScopes = await createScopes({ transaction: params.transaction, tenantId: params.tenantId, - scopesToSeed: params.toSeed.resource_permissions, - fillScopesMethod: fillScopes, + scopesToSeed: params.toSeed.resource_permissions }); + const createdRoles = await createRoles({ transaction: params.transaction, tenantId: params.tenantId, - scopesLists: createdScopes, + scopes: createdScopes, rolesToSeed: params.toSeed.resource_roles, - fillRolesMethod: fillRoles, }); - const createdRelations = await createRelations({ + + await createRelations({ transaction: params.transaction, tenantId: params.tenantId, roles: createdRoles, + scopes: createdScopes }); - - return { scopes: createdScopes, roles: createdRoles, relations: createdRelations }; - } - - return { scopes: {}, roles: {}, relations: [] }; -}; - -const getEmptyList = (): ScopesLists => ({ - scopesList: [], - scopesByEntity: {}, - scopesByAction: {}, - scopesByFullName: {}, -}); - -const fillScopes = (scopesToSeed: ResourcePermissionSeeder[]): ResourceScopesLists => { - const fullLists: ResourceScopesLists = {}; - for (const singleSeeder of scopesToSeed) { - for (const resource of singleSeeder.for_resource_ids) { - fullLists[resource] = getEmptyList(); - fillScopesGroup(singleSeeder, fullLists[resource]!, resource); - } } - - return fullLists; }; diff --git a/packages/core/src/libraries/ogcio-user.ts b/packages/core/src/libraries/ogcio-user.ts index efdbc0ddd38..d916acff866 100644 --- a/packages/core/src/libraries/ogcio-user.ts +++ b/packages/core/src/libraries/ogcio-user.ts @@ -134,20 +134,73 @@ const getDomainFromEmail = (email: string): string | undefined => { return email.split('@')[1]; }; -const getUserRoleByDomain = async ( - domain: string, - getRoles: (roleName: string, excludeRoleId?: string) => Promise +const assignCitizenRole = async ( + user: User, + getRoles: (roleName: string, excludeRoleId?: string) => Promise, + insertUsersRoles: (usersRoles: CreateUsersRole[]) => Promise> ) => { - if (PUBLIC_SERVANT_DOMAINS.has(domain)) { - return getRoles('Public Servant'); + const userRole = await getRoles('Citizen'); + + if (userRole === undefined) { + consoleLog.error(phrases.en.errors.role.default_role_missing); + return; + } + + return insertUsersRoles([ + { + tenantId: user.tenantId, + id: generateStandardId(), + userId: user.id, + roleId: userRole.id, + }, + ]); +}; + +const assignUserToOrganization = async (user: User, organizationQueries: OrganizationQueries) => { + try { + const organization = await organizationQueries.findById('ogcio'); + await organizationQueries.relations.users.insert([organization.id, user.id]); + return organization; + } catch { + consoleLog.error(phrases.en.errors.entity.not_exists_with_id); } - return getRoles('Citizen'); +}; + +const assignOrganizationRoleToUser = async ( + user: User, + organization: Organization, + organizationQueries: OrganizationQueries +) => { + const allOrganizationRoles = await organizationQueries.roles.findAll(100, 0); + const publicServantRole = allOrganizationRoles[1].find((role) => role.name === 'Public Servant'); + + if (publicServantRole === undefined) { + consoleLog.error(phrases.en.errors.role.default_role_missing); + return; + } + + await organizationQueries.relations.rolesUsers.insert([ + organization.id, + publicServantRole.id, + user.id, + ]); +}; + +const assignPublicServantRole = async (user: User, organizationQueries: OrganizationQueries) => { + const organization = await assignUserToOrganization(user, organizationQueries); + + if (!organization) { + return; + } + + await assignOrganizationRoleToUser(user, organization, organizationQueries); }; export const manageDefaultUserRole = async ( user: User, getRoles: (roleName: string, excludeRoleId?: string) => Promise, - insertUsersRoles: (usersRoles: CreateUsersRole[]) => Promise> + insertUsersRoles: (usersRoles: CreateUsersRole[]) => Promise>, + organizationQueries: OrganizationQueries ) => { if (user.tenantId === adminTenantId) { return; @@ -165,19 +218,9 @@ export const manageDefaultUserRole = async ( return; } - const userRole = await getUserRoleByDomain(domain, getRoles); - - if (userRole === undefined) { - consoleLog.error(phrases.en.errors.role.default_role_missing); - return; + if (PUBLIC_SERVANT_DOMAINS.has(domain)) { + return assignPublicServantRole(user, organizationQueries); } - return insertUsersRoles([ - { - tenantId: user.tenantId, - id: generateStandardId(), - userId: user.id, - roleId: userRole.id, - }, - ]); + return assignCitizenRole(user, getRoles, insertUsersRoles); }; diff --git a/packages/core/src/routes/interaction/actions/submit-interaction.ts b/packages/core/src/routes/interaction/actions/submit-interaction.ts index 638fb4bb690..988da35cd0e 100644 --- a/packages/core/src/routes/interaction/actions/submit-interaction.ts +++ b/packages/core/src/routes/interaction/actions/submit-interaction.ts @@ -21,7 +21,7 @@ import { conditional, conditionalArray, trySafe } from '@silverhand/essentials'; import { EnvSet } from '#src/env-set/index.js'; // OGCIO -import { manageDefaultOrganizations, manageDefaultUserRole } from '#src/libraries/ogcio-user.js'; +import { manageDefaultUserRole } from '#src/libraries/ogcio-user.js'; import { assignInteractionResults } from '#src/libraries/session.js'; import { encryptUserPassword } from '#src/libraries/user.js'; import type { LogEntry, WithLogContext } from '#src/middleware/koa-audit-log.js'; @@ -171,10 +171,6 @@ async function handleSubmitRegister( getInitialUserRoles(isInAdminTenant, isCreatingFirstAdminUser, isCloud) ); - // OGCIO - // @ts-expect-error weird error at findRoleByRoleName return type - await manageDefaultUserRole(user, roles.findRoleByRoleName, usersRoles.insertUsersRoles); - if (isCreatingFirstAdminUser) { // In OSS, we need to limit sign-in experience to "sign-in only" once // the first admin has been create since we don't want other unexpected registrations @@ -193,7 +189,17 @@ async function handleSubmitRegister( ]); } else { // OGCIO - await manageDefaultOrganizations({ userId: id, organizationQueries: organizations }); + // DO NOT DELETE THIS! It is disabled for now. + // await manageDefaultOrganizations({ userId: id, organizationQueries: organizations }); + + // OGCIO + await manageDefaultUserRole( + user, + // @ts-expect-error: strange error in roles.findRoleByRoleName return type + roles.findRoleByRoleName, + usersRoles.insertUsersRoles, + organizations + ); } await assignInteractionResults(ctx, provider, { login: { accountId: id } }); From 9cf451202089203fd5d749d2a265dcd881fe197d Mon Sep 17 00:00:00 2001 From: Norbert Nagy Date: Thu, 4 Jul 2024 16:54:16 +0300 Subject: [PATCH 7/7] 18941 Deploy dev into stage (#62) * Add staging pipeline file (#36) * add file * fix * feat(cli): update seeder (#35) * Add deploy stage to logto-admin (#38) * fix(cli): fix logto pipeline (#40) * fix(cli): fix seeder to handle empty data (#41) fix(cli): fix seeder to handle empty values * feat: logto uat changes (#43) * feat: logto uat changes * Update pipeline-variables/uat.yml Co-authored-by: Sara Zanellato <47299026+peschina@users.noreply.github.com> --------- Co-authored-by: Sara Zanellato <47299026+peschina@users.noreply.github.com> * Test migration command in Terraform (#48) fix: remove seed commands from dockerfile * 18630 seed real roles (#45) * feat(cli): seed roles and permissions into db * fix(cli): cleanup code * chore(cli): small update * chore(cli): refactoring roles * chore(cli): refactoring organization roles * chore(cli): update * chore(cli): rename seeder file (#52) * chore(cli): rename seeder file * chore(cli): fix eof new line * chore: use port 7001 instead of 5001 to avoid conflicts with forms (#56) * fix(cli): remove secrets from local seeder (#59) * feat(cli): seed is_third_party flag (#57) * feat(cli): seed is_third_party flag * fix(demo-app): trying to ignore the entire seeder local file from gitleaks * Reverted .gitleaksignore change --------- Co-authored-by: alfonsograziano Co-authored-by: Alfonso Graziano * feat(cli): seed multiple redurect uris (#58) * Feature(ogcio): messaging integration (#60) * feat(ogcio): added messaging permissions locally * feat(core): updated seeder for deployments * chore(core): added EOL --------- Co-authored-by: Alfonso Graziano * Add MyGovId Mock service to Logto (#55) * feat(demo-app): copied mock service from life events repo * feat(demo-app): add mock users + fix build * feat(demo-app): changed port to not clash with 3005 in life-events auth-service * fix(demo-app): trying to ignore the entire seeder local file from gitleaks * feat(cli): seeder updates already existing entries (#61) * feat(cli): seeder updates already existing entries * feat(cli): seeder file updated * feat(cli): update * feat(cli): documenting the seeders limitations * feat(cli): updated documentation --------- Co-authored-by: Alfonso Graziano Co-authored-by: William Monteiro Co-authored-by: Sara Zanellato <47299026+peschina@users.noreply.github.com> Co-authored-by: Marius Sebastian Besel <145235082+msebastianb@users.noreply.github.com> Co-authored-by: alfonsograziano Co-authored-by: SamSalvatico <40636569+SamSalvatico@users.noreply.github.com> --- .gitleaksignore | 3 - .gitpod.yml | 3 +- README.OGCIO.md | 14 + mygovid-mock-service/.eslintrc.json | 21 + mygovid-mock-service/.gitignore | 2 + mygovid-mock-service/package.json | 44 + mygovid-mock-service/src/app.ts | 21 + mygovid-mock-service/src/index.ts | 13 + .../src/routes/healthcheck.ts | 6 + mygovid-mock-service/src/routes/index.ts | 8 + .../src/routes/logto/index.ts | 186 ++ .../src/routes/logto/utils/index.ts | 81 + .../src/routes/static/mock-login.html | 269 ++ .../src/test/routes/healthcheck.test.ts | 18 + mygovid-mock-service/src/types/httpErrors.ts | 10 + .../src/types/schemaDefinitions.ts | 12 + mygovid-mock-service/tap.yml | 14 + mygovid-mock-service/tsconfig.json | 17 + .../commands/database/ogcio/applications.ts | 19 +- .../src/commands/database/ogcio/connectors.ts | 6 +- .../database/ogcio/ogcio-seeder-local.json | 51 +- .../commands/database/ogcio/ogcio-seeder.json | 39 +- .../commands/database/ogcio/ogcio-seeder.ts | 11 +- .../database/ogcio/organizations-rbac.ts | 114 +- .../commands/database/ogcio/organizations.ts | 10 +- .../src/commands/database/ogcio/queries.ts | 58 +- .../commands/database/ogcio/resources-rbac.ts | 186 +- .../src/commands/database/ogcio/resources.ts | 15 +- .../src/commands/database/ogcio/webhooks.ts | 13 +- .../core/src/libraries/ogcio-constants.ts | 12 + packages/core/src/libraries/ogcio-user.ts | 25 +- packages/core/src/middleware/koa-spa-proxy.ts | 3 +- .../routes/applications/application.test.ts | 3 +- .../interaction/actions/submit-interaction.ts | 3 +- packages/experience/package.json | 2 +- pnpm-lock.yaml | 2653 ++++++++++++++++- pnpm-workspace.yaml | 2 + 37 files changed, 3595 insertions(+), 372 deletions(-) create mode 100644 mygovid-mock-service/.eslintrc.json create mode 100644 mygovid-mock-service/.gitignore create mode 100644 mygovid-mock-service/package.json create mode 100644 mygovid-mock-service/src/app.ts create mode 100644 mygovid-mock-service/src/index.ts create mode 100644 mygovid-mock-service/src/routes/healthcheck.ts create mode 100644 mygovid-mock-service/src/routes/index.ts create mode 100644 mygovid-mock-service/src/routes/logto/index.ts create mode 100644 mygovid-mock-service/src/routes/logto/utils/index.ts create mode 100644 mygovid-mock-service/src/routes/static/mock-login.html create mode 100644 mygovid-mock-service/src/test/routes/healthcheck.test.ts create mode 100644 mygovid-mock-service/src/types/httpErrors.ts create mode 100644 mygovid-mock-service/src/types/schemaDefinitions.ts create mode 100644 mygovid-mock-service/tap.yml create mode 100644 mygovid-mock-service/tsconfig.json create mode 100644 packages/core/src/libraries/ogcio-constants.ts diff --git a/.gitleaksignore b/.gitleaksignore index c6049a9b76b..ea3d921fb81 100644 --- a/.gitleaksignore +++ b/.gitleaksignore @@ -1,4 +1 @@ /src/packages/connectors/connector-saml/README.md:private-key:101 -/src/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json:generic-api-key:37 -/src/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json:generic-api-key:46 -/src/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json:generic-api-key:157 diff --git a/.gitpod.yml b/.gitpod.yml index 31dcc8e32d6..b6a984ffb9f 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -38,7 +38,8 @@ ports: port: 5432 visibility: public onOpen: ignore - - port: 5001 + # OGCIO - formsie port collision fixed + - port: 7001 onOpen: ignore - port: 5002 onOpen: ignore diff --git a/README.OGCIO.md b/README.OGCIO.md index 9a1f976a5e1..26d53169c73 100644 --- a/README.OGCIO.md +++ b/README.OGCIO.md @@ -113,3 +113,17 @@ This command can take a parameter to specify the input data file, called `seeder Usage: `npm run cli db ogcio -- --seeder-filepath="DATA_FILE_PATH"` To seed the default data for local dev environments, run `npm run cli db ogcio -- --seeder-filepath="./packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json"`. + +### Limitations + +In most cases, we have predefined IDs in our seeder to ensure the same database structure, even if the database was cleared and re-seeded. Logto IDs are simple text fields (no UUID or other validations are applied) with a maximum length of 21 characters. Do not use IDs longer than 21 characters; otherwise, the seeder will fail with a database error! + +Be careful when defining a new ID because data duplication is avoided based on this field. If you later want to change the ID of any of your entries, the seeder won't be able to detect the existence of the affected entry, and it will try to create a new one. Creating a duplicate entry with a different ID can cause a database error if some other fields have a unique constraint. If this is not the case, a duplicate entry will be created, which is also a mistake, and we want to avoid any of these situations. Once you have defined an ID, do not change it if unnecessary. + +Using resources other than those declared in the seeder's data file is also impossible because referencing any resource outside of the seeder's scope is not supported. The seeder is supposed to create all the required resources and use them to seed the custom configuration into the database. + +### Edge cases + +Some changes might affect other entries from the database, like the user entities. In this case, a custom migration script is required to resolve the changes necessary to the affected entries. Before any change in the seeder data, analyse the situation to determine if it is safe to perform. The seeder is not intended to resolve conflicts or update other data than the configuration it seeds. + +Deletion of existing seeded data via the seeder is not yet possible. Only the permissions (scopes) will be removed and recreated every time the seeder is executed because that is safe and does not cause conflicts with other entries. A custom script or manual action is required for any other data that must be eliminated. diff --git a/mygovid-mock-service/.eslintrc.json b/mygovid-mock-service/.eslintrc.json new file mode 100644 index 00000000000..e4796c565a6 --- /dev/null +++ b/mygovid-mock-service/.eslintrc.json @@ -0,0 +1,21 @@ +{ + "parser": "@typescript-eslint/parser", + "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", + "eslint:recommended" + ], + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module" + }, + "rules": { + "no-redeclare": "off", + "no-unused-vars": "off" + }, + "env": { + "browser": true, + "node": true + }, + "ignorePatterns": ["dist"] +} diff --git a/mygovid-mock-service/.gitignore b/mygovid-mock-service/.gitignore new file mode 100644 index 00000000000..3e6091d0c02 --- /dev/null +++ b/mygovid-mock-service/.gitignore @@ -0,0 +1,2 @@ +node_modules +.tap diff --git a/mygovid-mock-service/package.json b/mygovid-mock-service/package.json new file mode 100644 index 00000000000..482060be441 --- /dev/null +++ b/mygovid-mock-service/package.json @@ -0,0 +1,44 @@ +{ + "name": "mygovid-mock-service", + "version": "1.0.0", + "description": "", + "main": "dist/index.js", + "scripts": { + "test": "TAP_RCFILE=tap.yml tap", + "start": "node dist/index.js", + "dev": "nodemon | pino-pretty", + "lint": "eslint . --ext .ts", + "build": "echo Build script for the MyGovId mock service not needed so far" + }, + "nodemonConfig": { + "ext": "ts,json", + "exec": "node --import tsx src/index.ts" + }, + "type": "module", + "author": "", + "license": "ISC", + "dependencies": { + "@fastify/cookie": "^9.3.1", + "@fastify/formbody": "^7.4.0", + "@fastify/sensible": "^5.5.0", + "@fastify/type-provider-typebox": "^4.0.0", + "@sinclair/typebox": "^0.32.16", + "fastify": "^4.26.2", + "fastify-plugin": "^4.5.1", + "jose": "^5.2.4" + }, + "devDependencies": { + "@types/node": "^20.11.28", + "@typescript-eslint/eslint-plugin": "^7.5.0", + "@typescript-eslint/parser": "^7.5.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "pino-pretty": "^11.0.0", + "prettier": "^3.2.5", + "tap": "^18.8.0", + "ts-node": "^10.9.2", + "tsx": "^4.7.1", + "typescript": "^5.4.2" + } +} diff --git a/mygovid-mock-service/src/app.ts b/mygovid-mock-service/src/app.ts new file mode 100644 index 00000000000..54aeb2371e9 --- /dev/null +++ b/mygovid-mock-service/src/app.ts @@ -0,0 +1,21 @@ +import fastify, { FastifyServerOptions } from "fastify"; +import routes from "./routes/index.js"; +import { TypeBoxTypeProvider } from "@fastify/type-provider-typebox"; +import sensible from "@fastify/sensible"; + +export async function build(opts?: FastifyServerOptions) { + const app = fastify(opts).withTypeProvider(); + + app.register(import("@fastify/cookie"), { + hook: "onRequest", // set to false to disable cookie autoparsing or set autoparsing on any of the following hooks: 'onRequest', 'preParsing', 'preHandler', 'preValidation'. default: 'onRequest' + parseOptions: {}, // options for parsing cookies + }); + + app.register(import("@fastify/formbody")); + + app.register(routes); + + app.register(sensible); + + return app; +} diff --git a/mygovid-mock-service/src/index.ts b/mygovid-mock-service/src/index.ts new file mode 100644 index 00000000000..0b26cb15f28 --- /dev/null +++ b/mygovid-mock-service/src/index.ts @@ -0,0 +1,13 @@ +import { build } from "./app.js"; + +const app = await build(); + +app.listen({ host: "0.0.0.0", port: 4005 }, (err, address) => { + if (err) { + console.error(err); + process.exit(1); + } + console.log(`MyGovId Mock Service listening at ${address}`); +}); + +await app.ready(); diff --git a/mygovid-mock-service/src/routes/healthcheck.ts b/mygovid-mock-service/src/routes/healthcheck.ts new file mode 100644 index 00000000000..540078cc6d6 --- /dev/null +++ b/mygovid-mock-service/src/routes/healthcheck.ts @@ -0,0 +1,6 @@ +import { FastifyInstance } from "fastify"; +export default async function healthCheck(app: FastifyInstance) { + app.get("/health", async () => { + return { status: "ok" }; + }); +} diff --git a/mygovid-mock-service/src/routes/index.ts b/mygovid-mock-service/src/routes/index.ts new file mode 100644 index 00000000000..9e6007d780f --- /dev/null +++ b/mygovid-mock-service/src/routes/index.ts @@ -0,0 +1,8 @@ +import { FastifyInstance } from "fastify"; +import healthCheck from "./healthcheck.js"; +import logto from "./logto/index.js"; + +export default async function routes(app: FastifyInstance) { + app.register(healthCheck); + app.register(logto, { prefix: "/logto/mock" }); +} diff --git a/mygovid-mock-service/src/routes/logto/index.ts b/mygovid-mock-service/src/routes/logto/index.ts new file mode 100644 index 00000000000..9f62eb86377 --- /dev/null +++ b/mygovid-mock-service/src/routes/logto/index.ts @@ -0,0 +1,186 @@ +import { FastifyInstance } from "fastify"; +import fs from "fs"; +import path, { dirname } from "path"; +import { exportJWK } from "jose"; +import { fileURLToPath } from "url"; +import { Type } from "@sinclair/typebox"; +import { + createMockSignedJwt, + getPublicKey, + streamToString, +} from "./utils/index.js"; +import { HttpError } from "../../types/httpErrors.js"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default async function login(app: FastifyInstance) { + app.get<{ + Querystring: { + response_type: string; + client_id: string; + redirect_uri: string; + state: string; + nonce: string; + scope: string; + }; + }>( + "/auth", + { + schema: { + tags: ["Mock"], + querystring: { + response_type: Type.String(), + client_id: Type.String(), + redirect_uri: Type.String(), + state: Type.String(), + nonce: Type.String(), + scope: Type.String(), + }, + response: { 200: Type.String(), 500: HttpError }, + }, + }, + async (request, reply) => { + const { redirect_uri, state } = request.query; + + const stream = fs.createReadStream( + path.join(__dirname, "..", "static", "mock-login.html") + ); + + const result = (await streamToString(stream)) + .replace("%REDIRECT_URL%", redirect_uri) + .replace("%STATE%", state); + return reply.type("text/html").send(result); + } + ); + + app.post<{ + Body: { + password: string; + firstName: string; + lastName: string; + email: string; + redirect_url: string; + state: string; + }; + }>("/login", async (request, reply) => { + const { password, firstName, lastName, email, redirect_url, state } = + request.body; + + if (password !== "123") + reply.redirect( + `/logto/mock/auth?redirect_uri=${redirect_url}&state=${state}` + ); + + const id_token = await createMockSignedJwt( + { firstName, lastName, email }, + request.headers.origin as unknown as string + ); + + return reply.redirect(`${redirect_url}?code=${id_token}&state=${state}`); + }); + + app.post<{ + Body: { + code: string; + grant_type: string; + redirect_uri: string; + client_id: string; + client_secret: string; + }; + Reply: { + id_token: string; + access_token: string; + token_type: string; + not_before: number; + expires_in: number; + expires_on: number; + id_token_expires_in: number; + profile_info: string; + scope: string; + }; + }>( + "/token", + { + schema: { + tags: ["Mock"], + body: Type.Object({ + code: Type.String(), + grant_type: Type.String(), + redirect_uri: Type.String(), + client_id: Type.String(), + client_secret: Type.String(), + }), + response: { + 200: Type.Object({ + id_token: Type.String(), + access_token: Type.String(), + token_type: Type.String(), + not_before: Type.Number(), + expires_in: Type.Number(), + expires_on: Type.Number(), + id_token_expires_in: Type.Number(), + profile_info: Type.String(), + scope: Type.String(), + }), + 500: HttpError, + }, + }, + }, + async (request, _) => { + const id_token = request.body.code; + return { + id_token, + access_token: id_token, + token_type: "Bearer", + not_before: Date.now() - 5000, + expires_in: 1800, + expires_on: Date.now() - 5000 + 1800, + id_token_expires_in: 1800, + profile_info: + "eyJ2ZXIiOiIxLjAiLCJ0aWQiOiI4OTc5MmE2ZC0xZWE0LTQxMjYtOTRkZi1hNzFkMjkyZGViYzciLCJzdWIiOm51bGwsIm5hbWUiOm51bGwsInByZWZlcnJlZF91c2VybmFtZSI6bnVsbCwiaWRwIjpudWxsfQ", + scope: "openid", + }; + } + ); + + app.get<{ + Reply: { + keys: { + kid: string; + use: string; + kty?: string; + n?: string; + e?: string; + }[]; + }; + }>( + "/keys", + { + schema: { + tags: ["Mock"], + response: { + 200: Type.Object({ + keys: Type.Array( + Type.Object({ + kid: Type.String(), + use: Type.String(), + kty: Type.Optional(Type.String()), + n: Type.Optional(Type.String()), + e: Type.Optional(Type.String()), + }) + ), + }), + 500: HttpError, + }, + }, + }, + async (request, reply) => { + const publicKey = await getPublicKey(); + const { kty, n, e } = await exportJWK(publicKey); + + return { + keys: [{ kid: "signingkey.mygovid.v1", use: "sig", kty, n, e }], + }; + } + ); +} diff --git a/mygovid-mock-service/src/routes/logto/utils/index.ts b/mygovid-mock-service/src/routes/logto/utils/index.ts new file mode 100644 index 00000000000..689abff07cf --- /dev/null +++ b/mygovid-mock-service/src/routes/logto/utils/index.ts @@ -0,0 +1,81 @@ +import fs from "fs"; +import crypto from "crypto"; +import { importPKCS8, importSPKI, SignJWT } from "jose"; + +const { privateKey, publicKey } = crypto.generateKeyPairSync("rsa", { + modulusLength: 2048, + publicKeyEncoding: { + type: "spki", + format: "pem", + }, + privateKeyEncoding: { + type: "pkcs8", + format: "pem", + }, +}); + +export const streamToString = (stream: fs.ReadStream): Promise => { + const chunks: Buffer[] = []; + return new Promise((resolve, reject) => { + stream.on("data", (chunk) => chunks.push(Buffer.from(chunk))); + stream.on("error", (err) => reject(err)); + stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8"))); + }); +}; + +const getRandomPhoneNumber = () => + `+353${Math.floor(Math.random() * 9000000000) + 1000000000}`; + +const getRandomString = () => crypto.randomBytes(20).toString("hex"); + +export const createMockSignedJwt = async ( + user: { + firstName: string; + lastName: string; + email: string; + }, + origin: string, +) => { + const body = { + ver: "1.0", + sub: getRandomString(), + auth_time: Date.now(), + email: user.email, + oid: getRandomString(), + AlternateIds: "", + BirthDate: "13/06/1941", + PublicServiceNumber: "0111019P", + LastJourney: "Login", + mobile: getRandomPhoneNumber(), + DSPOnlineLevel: "0", + DSPOnlineLevelStatic: "0", + givenName: user.firstName, + surname: user.lastName, + CustomerId: "532", + AcceptedPrivacyTerms: true, + AcceptedPrivacyTermsVersionNumber: "7", + SMS2FAEnabled: false, + AcceptedPrivacyTermsDateTime: 1715582120, + firstName: user.firstName, + lastName: user.lastName, + currentCulture: "en", + trustFrameworkPolicy: "B2C_1A_MyGovID_signin-v5-PARTIAL2", + CorrelationId: getRandomString(), + nbf: 1716804749, + }; + + const alg = "RS256"; + const key = await importPKCS8(privateKey, alg); + + const jwt = await new SignJWT(body) + .setProtectedHeader({ alg }) + .setAudience("mock_client_id") + .setIssuedAt() + .setIssuer(origin) + .setExpirationTime("2h") + .sign(key); + + return jwt; +}; + +export const getPublicKey = async () => await importSPKI(publicKey, "RS256"); diff --git a/mygovid-mock-service/src/routes/static/mock-login.html b/mygovid-mock-service/src/routes/static/mock-login.html new file mode 100644 index 00000000000..f811e401f86 --- /dev/null +++ b/mygovid-mock-service/src/routes/static/mock-login.html @@ -0,0 +1,269 @@ + + + + + + MyGovID - Login + + + + + + + + + + + + + +
+ + +
+ +
+ + + + + + +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+ + + diff --git a/mygovid-mock-service/src/test/routes/healthcheck.test.ts b/mygovid-mock-service/src/test/routes/healthcheck.test.ts new file mode 100644 index 00000000000..cd21a5840f9 --- /dev/null +++ b/mygovid-mock-service/src/test/routes/healthcheck.test.ts @@ -0,0 +1,18 @@ +import t from "tap"; +import { build } from "../../app.js"; + +t.test("healthCheck", async (t) => { + const app = await build(); + t.after(async () => { + await app.close(); + }); + + const res = await app.inject({ + method: "GET", + url: "/health", + }); + t.equal(res.statusCode, 200); + t.equal(res.headers["content-type"], "application/json; charset=utf-8"); + t.same(res.json(), { status: "ok" }); + t.end(); +}); diff --git a/mygovid-mock-service/src/types/httpErrors.ts b/mygovid-mock-service/src/types/httpErrors.ts new file mode 100644 index 00000000000..ea469469388 --- /dev/null +++ b/mygovid-mock-service/src/types/httpErrors.ts @@ -0,0 +1,10 @@ +import { Type } from "@sinclair/typebox"; + +export const HttpError = Type.Object({ + code: Type.String(), + detail: Type.String(), + request_id: Type.String(), + name: Type.String(), + validation: Type.Optional(Type.Any()), + validationContext: Type.Optional(Type.String()), +}); diff --git a/mygovid-mock-service/src/types/schemaDefinitions.ts b/mygovid-mock-service/src/types/schemaDefinitions.ts new file mode 100644 index 00000000000..ae651b7ad8e --- /dev/null +++ b/mygovid-mock-service/src/types/schemaDefinitions.ts @@ -0,0 +1,12 @@ +import { Static, Type } from "@sinclair/typebox"; + +export const Token = Type.Object({ + id_token: Type.String(), + token_type: Type.String(), + not_before: Type.Number(), + id_token_expires_in: Type.Number(), + profile_info: Type.String(), + scope: Type.String(), +}); + +export type TokenType = Static; diff --git a/mygovid-mock-service/tap.yml b/mygovid-mock-service/tap.yml new file mode 100644 index 00000000000..dace2f7a77d --- /dev/null +++ b/mygovid-mock-service/tap.yml @@ -0,0 +1,14 @@ +color: true +coverage-report: + - text +exclude: + - "**/@(fixture*(s)|dist)/**" +include: + - "**/@(test?(s)|__test?(s)__)/**/*.test.@(js|cjs|mjs|tap|cts|jsx|mts|ts|tsx)" + - "**/*.@(test?(s)|spec).@(js|cjs|mjs|tap|cts|jsx|mts|ts|tsx)" + - "**/test?(s).@(js|cjs|mjs|tap|cts|jsx|mts|ts|tsx)" +jobs: 8 +reporter: base +snapshot-clean-cwd: true +timeout: 30 +allow-incomplete-coverage: true diff --git a/mygovid-mock-service/tsconfig.json b/mygovid-mock-service/tsconfig.json new file mode 100644 index 00000000000..82a4116ec08 --- /dev/null +++ b/mygovid-mock-service/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "typeRoots": ["src/types"], + "outDir": "dist" + }, + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node", + } +} diff --git a/packages/cli/src/commands/database/ogcio/applications.ts b/packages/cli/src/commands/database/ogcio/applications.ts index 723d81db67f..42c4a47b3bf 100644 --- a/packages/cli/src/commands/database/ogcio/applications.ts +++ b/packages/cli/src/commands/database/ogcio/applications.ts @@ -5,7 +5,7 @@ import { Applications } from '@logto/schemas'; import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; import { type ApplicationSeeder } from './ogcio-seeder.js'; -import { createItem } from './queries.js'; +import { createOrUpdateItem } from './queries.js'; type SeedingApplication = { id: string; @@ -16,7 +16,7 @@ type SeedingApplication = { oidc_client_metadata: string; custom_client_metadata: string; protected_app_metadata?: string; - is_third_party?: boolean; + is_third_party: boolean; }; const createApplication = async ( @@ -24,12 +24,12 @@ const createApplication = async ( tenantId: string, appToSeed: SeedingApplication ) => - createItem({ + createOrUpdateItem({ transaction, tenantId, toInsert: appToSeed, toLogFieldName: 'name', - whereClauses: [sql`name = ${appToSeed.name}`], + whereClauses: [sql`tenant_id = ${tenantId}`, sql`id = ${appToSeed.id}`], tableName: Applications.table, }); @@ -41,6 +41,14 @@ const setApplicationId = async ( element = await createApplication(transaction, tenantId, element); }; +const createArrayString = (values: string | string[]): string => { + const valuesString = (Array.isArray(values) ? values : [values]) + .map((uri) => `"${uri}"`) + .join(','); + + return `[${valuesString}]`; +}; + const fillApplications = ( inputApplications: ApplicationSeeder[] ): Record => { @@ -52,9 +60,10 @@ const fillApplications = ( secret: inputApp.secret, description: inputApp.description, type: inputApp.type, - oidc_client_metadata: `{"redirectUris": ["${inputApp.redirect_uri}"], "postLogoutRedirectUris": ["${inputApp.logout_redirect_uri}"]}`, + oidc_client_metadata: `{"redirectUris": ${createArrayString(inputApp.redirect_uri)}, "postLogoutRedirectUris": ${createArrayString(inputApp.logout_redirect_uri)}}`, custom_client_metadata: '{"idTokenTtl": 3600, "corsAllowedOrigins": [], "rotateRefreshToken": true, "refreshTokenTtlInDays": 14, "alwaysIssueRefreshToken": false}', + is_third_party: inputApp.is_third_party ?? false, }; } diff --git a/packages/cli/src/commands/database/ogcio/connectors.ts b/packages/cli/src/commands/database/ogcio/connectors.ts index c891019042c..1dd3ab0d92a 100644 --- a/packages/cli/src/commands/database/ogcio/connectors.ts +++ b/packages/cli/src/commands/database/ogcio/connectors.ts @@ -5,7 +5,7 @@ import { Connectors } from '@logto/schemas'; import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; import { type ConnectorSeeder } from './ogcio-seeder.js'; -import { createItemWithoutId } from './queries.js'; +import { createOrUpdateItemWithoutId } from './queries.js'; type SeedingConnector = { tenant_id: string; @@ -21,12 +21,12 @@ const createConnector = async ( tenantId: string, connectorToSeed: SeedingConnector ) => - createItemWithoutId({ + createOrUpdateItemWithoutId({ transaction, tenantId, toInsert: connectorToSeed, toLogFieldName: 'id', - whereClauses: [sql`id = ${connectorToSeed.id}`], + whereClauses: [sql`tenant_id = ${tenantId}`, sql`id = ${connectorToSeed.id}`], tableName: Connectors.table, columnToGet: 'id', }); diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json b/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json index 273ef1be355..3b52e50b2af 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json +++ b/packages/cli/src/commands/database/ogcio/ogcio-seeder-local.json @@ -12,11 +12,16 @@ "payments:provider:*", "payments:payment_request:*", "payments:payment_request.public:read", - "payments:transaction:*" + "payments:transaction:*", + "messaging:message:*", + "messaging:provider:*", + "messaging:template:*", + "messaging:citizen:*" ] }, "organization_roles": [ { + "id": "bb-public-servant", "name": "Public Servant", "description": "Building Blocks Public servant", "specific_permissions": [ @@ -25,6 +30,17 @@ "payments:payment_request.public:read", "payments:transaction:*" ] + }, + { + "id": "msg-public-servant", + "name": "Messaging Public Servant", + "description": "Messaging Public servant", + "specific_permissions": [ + "messaging:message:*", + "messaging:provider:*", + "messaging:template:*", + "messaging:citizen:*" + ] } ], "applications": [ @@ -34,8 +50,9 @@ "type": "Traditional", "redirect_uri": "http://localhost:3001/callback", "logout_redirect_uri": "http://localhost:3001", - "secret": "bgHz4Ouv2lxXCdc6s6s4IUoNpFAklC15", - "id": "2xz6sbi8ch01uhjt1oq8r" + "secret": "payments_app_local_secret", + "id": "2xz6sbi8ch01uhjt1oq8r", + "is_third_party": false }, { "name": "Messaging Building Block", @@ -43,8 +60,9 @@ "type": "Traditional", "redirect_uri": "http://localhost:3002/callback", "logout_redirect_uri": "http://localhost:3002", - "secret": "Y3nBMm8Hs3Ugcl4596w5ewgOosvwX4im", - "id": "4695d8onfb9f3bv18phtq" + "secret": "messaging_app_local_secret", + "id": "4695d8onfb9f3bv18phtq", + "is_third_party": false } ], "resources": [ @@ -68,10 +86,17 @@ "payments:transaction.self:write", "payments:provider.public:read" ] + }, + { + "resource_id": "messaging-api", + "specific_permissions": [ + "messaging:message.self:read" + ] } ], "resource_roles": [ { + "id": "bb-citizen", "name": "Citizen", "description": "A citizen using Life Events and the Building Blocks ecosystem", "permissions": [ @@ -83,6 +108,12 @@ "payments:transaction.self:write", "payments:provider.public:read" ] + }, + { + "resource_id": "messaging-api", + "specific_permissions": [ + "messaging:message.self:read" + ] } ] } @@ -96,11 +127,11 @@ "scope": "openid profile email", "clientId": "mock_client_id", "clientSecret": "mock_client_secret", - "tokenEndpoint": "http://localhost:3005/logto/mock/token", - "authorizationEndpoint": "http://localhost:3005/logto/mock/auth", + "tokenEndpoint": "http://localhost:4005/logto/mock/token", + "authorizationEndpoint": "http://localhost:4005/logto/mock/auth", "tokenEndpointAuthMethod": "client_secret_post", "idTokenVerificationConfig": { - "jwksUri": "http://localhost:3005/logto/mock/keys" + "jwksUri": "http://localhost:4005/logto/mock/keys" }, "clientSecretJwtSigningAlgorithm": "HS256" }, @@ -145,7 +176,7 @@ ], "webhooks": [ { - "id": "login_webhook", + "id": "login-webhook", "name": "User log in", "events": [ "PostRegister", @@ -154,7 +185,7 @@ "config": { "url": "http://localhost:8003/user-login-wh" }, - "signing_key": "xpWX3WIkPkSA5A0UzLMfNOuTl1qEnbkg", + "signing_key": "webhooks_local_signing_key", "enabled": true } ] diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder.json b/packages/cli/src/commands/database/ogcio/ogcio-seeder.json index b0dbb11d6d5..924d446b53d 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio-seeder.json +++ b/packages/cli/src/commands/database/ogcio/ogcio-seeder.json @@ -12,11 +12,16 @@ "payments:provider:*", "payments:payment_request:*", "payments:payment_request.public:read", - "payments:transaction:*" + "payments:transaction:*", + "messaging:message:*", + "messaging:provider:*", + "messaging:template:*", + "messaging:citizen:*" ] }, "organization_roles": [ { + "id": "bb-public-servant", "name": "Public Servant", "description": "Building Blocks Public servant", "specific_permissions": [ @@ -25,6 +30,17 @@ "payments:payment_request.public:read", "payments:transaction:*" ] + }, + { + "id": "msg-public-servant", + "name": "Messaging Public Servant", + "description": "Messaging Public servant", + "specific_permissions": [ + "messaging:message:*", + "messaging:provider:*", + "messaging:template:*", + "messaging:citizen:*" + ] } ], "applications": [ @@ -35,7 +51,8 @@ "redirect_uri": "", "logout_redirect_uri": "", "secret": "", - "id": "r5f56tpkytpqyyshiutd2" + "id": "r5f56tpkytpqyyshiutd2", + "is_third_party": false }, { "name": "Messaging Building Block", @@ -44,7 +61,8 @@ "redirect_uri": "", "logout_redirect_uri": "", "secret": "", - "id": "1lvmteh2ao3xrswyq7j3e" + "id": "1lvmteh2ao3xrswyq7j3e", + "is_third_party": false } ], "resources": [ @@ -68,10 +86,17 @@ "payments:transaction.self:write", "payments:provider.public:read" ] + }, + { + "resource_id": "messaging-api", + "specific_permissions": [ + "messaging:message.self:read" + ] } ], "resource_roles": [ { + "id": "bb-citizen", "name": "Citizen", "description": "A citizen using Life Events and the Building Blocks ecosystem", "permissions": [ @@ -83,6 +108,12 @@ "payments:transaction.self:write", "payments:provider.public:read" ] + }, + { + "resource_id": "messaging-api", + "specific_permissions": [ + "messaging:message.self:read" + ] } ] } @@ -145,7 +176,7 @@ ], "webhooks": [ { - "id": "login_webhook", + "id": "login-webhook", "name": "User log in", "events": [ "PostRegister", diff --git a/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts b/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts index 9210935157a..15d42d58c26 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts +++ b/packages/cli/src/commands/database/ogcio/ogcio-seeder.ts @@ -19,7 +19,7 @@ export type OgcioSeeder = { export type OrganizationSeeder = { name: string; description: string; - id?: string; + id: string; }; export type OrganizationPermissionSeeder = { @@ -27,19 +27,21 @@ export type OrganizationPermissionSeeder = { }; export type OrganizationRoleSeeder = { + id: string; name: string; specific_permissions: string[]; description: string; }; export type ApplicationSeeder = { + id: string; name: string; description: string; type: string; - redirect_uri: string; - logout_redirect_uri: string; - id: string; + redirect_uri: string | string[]; + logout_redirect_uri: string | string[]; secret: string; + is_third_party?: boolean; }; export type ResourceSeeder = { @@ -104,6 +106,7 @@ export type ResourcePermissionSeeder = { }; export type ResourceRoleSeeder = { + id: string; name: string; description: string; permissions: ScopePerResourceRoleSeeder[]; diff --git a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts index a786a87e24e..270caf3a18e 100644 --- a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts @@ -1,11 +1,18 @@ /* eslint-disable eslint-comments/disable-enable-pair */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @silverhand/fp/no-mutating-methods */ -import { OrganizationRoles, OrganizationRoleScopeRelations, OrganizationScopes } from '@logto/schemas'; +/* eslint-disable @silverhand/fp/no-mutation */ +/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ + +import { + OrganizationRoles, + OrganizationRoleScopeRelations, + OrganizationScopes, +} from '@logto/schemas'; import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; + import { type OrganizationPermissionSeeder, type OrganizationRoleSeeder } from './ogcio-seeder.js'; -import { createItem, createItemWithoutId } from './queries.js'; +import { createOrUpdateItem, createOrUpdateItemWithoutId, deleteQuery } from './queries.js'; type SeedingScope = { name: string; @@ -16,7 +23,7 @@ type ScopesByName = Record; type SeedingRole = { name: string; - id?: string; + id: string; description: string; scopes: string[]; }; @@ -28,24 +35,22 @@ const createScope = async (params: { tenantId: string; scopeToSeed: SeedingScope; }) => - createItem({ + createOrUpdateItem({ transaction: params.transaction, tenantId: params.tenantId, toInsert: params.scopeToSeed, toLogFieldName: 'name', tableName: OrganizationScopes.table, - whereClauses: [sql`name = ${params.scopeToSeed.name}`], + whereClauses: [sql`tenant_id = ${params.tenantId}`, sql`name = ${params.scopeToSeed.name}`], }); -const buildScopes = ( - scopes: string[] -): ScopesByName => { - return scopes.reduce((acc, scopeName) => { - acc[scopeName] = { +const buildScopes = (scopes: string[]): ScopesByName => { + return scopes.reduce((accumulator, scopeName) => { + accumulator[scopeName] = { name: scopeName, - description: scopeName + description: scopeName, }; - return acc; + return accumulator; }, {}); }; @@ -56,11 +61,11 @@ export const createScopes = async (params: { }) => { const scopesToCreate = buildScopes(params.scopesToSeed.specific_permissions); - const queries = Object.values(scopesToCreate).map((scope) => + const queries = Object.values(scopesToCreate).map(async (scope) => createScope({ transaction: params.transaction, tenantId: params.tenantId, - scopeToSeed: scope + scopeToSeed: scope, }) ); @@ -75,62 +80,63 @@ const createRole = async (params: { roleToSeed: { name: string; description: string; - id?: string; - } + id: string; + }; }) => { - const created = await createItem({ + await createOrUpdateItem({ transaction: params.transaction, tenantId: params.tenantId, toLogFieldName: 'name', - whereClauses: [sql`name = ${params.roleToSeed.name}`], - toInsert: { name: params.roleToSeed.name, description: params.roleToSeed.description }, + whereClauses: [sql`tenant_id = ${params.tenantId}`, sql`id = ${params.roleToSeed.id}`], + toInsert: { + id: params.roleToSeed.id, + name: params.roleToSeed.name, + description: params.roleToSeed.description, + }, tableName: OrganizationRoles.table, }); - params.roleToSeed.id = created.id; - - return { - ...params.roleToSeed, - id: created.id, - }; -} + return params.roleToSeed; +}; const createRoles = async (params: { transaction: DatabaseTransactionConnection; tenantId: string; - scopes: ScopesByName, - rolesToSeed: OrganizationRoleSeeder[] + scopes: ScopesByName; + rolesToSeed: OrganizationRoleSeeder[]; }) => { - const rolesToCreate = params.rolesToSeed.map((role) =>({ + const rolesToCreate = params.rolesToSeed.map((role) => ({ + id: role.id, name: role.name, description: role.description, - scopes: role.specific_permissions + scopes: role.specific_permissions, })); - const queries = rolesToCreate.map((role) => + const queries = rolesToCreate.map(async (role) => createRole({ transaction: params.transaction, tenantId: params.tenantId, - roleToSeed: role + roleToSeed: role, }) ); await Promise.all(queries); return rolesToCreate; -} +}; const createRoleScopeRelation = async ( transaction: DatabaseTransactionConnection, tenantId: string, relation: SeedingRelation ) => - createItemWithoutId({ + createOrUpdateItemWithoutId({ transaction, tableName: OrganizationRoleScopeRelations.table, tenantId, toLogFieldName: 'organization_role_id', whereClauses: [ + sql`tenant_id = ${tenantId}`, sql`organization_role_id = ${relation.organization_role_id}`, sql`organization_scope_id = ${relation.organization_scope_id}`, ], @@ -145,15 +151,34 @@ const createRelations = async ( roles: SeedingRole[] ) => { const queries = roles.flatMap((role) => - role.scopes.map((scope) => createRoleScopeRelation(transaction, tenantId, { - organization_role_id: role.id!, - organization_scope_id: scopes[scope]?.id! - })) + role.scopes.map(async (scope) => + createRoleScopeRelation(transaction, tenantId, { + organization_role_id: role.id, + organization_scope_id: scopes[scope]?.id!, + }) + ) ); return Promise.all(queries); }; +export const cleanScopes = async (transaction: DatabaseTransactionConnection, tenantId: string) => { + await cleanScopeRelations(transaction, tenantId); + const deleteQueryString = deleteQuery([sql`tenant_id = ${tenantId}`], OrganizationScopes.table); + return transaction.query(deleteQueryString); +}; + +export const cleanScopeRelations = async ( + transaction: DatabaseTransactionConnection, + tenantId: string +) => { + const deleteQueryString = deleteQuery( + [sql`tenant_id = ${tenantId}`], + OrganizationRoleScopeRelations.table + ); + return transaction.query(deleteQueryString); +}; + export const seedOrganizationRbacData = async (params: { transaction: DatabaseTransactionConnection; tenantId: string; @@ -163,6 +188,8 @@ export const seedOrganizationRbacData = async (params: { }; }) => { if (params.toSeed.organization_permissions && params.toSeed.organization_roles?.length) { + await cleanScopes(params.transaction, params.tenantId); + const createdScopes = await createScopes({ transaction: params.transaction, tenantId: params.tenantId, @@ -173,14 +200,9 @@ export const seedOrganizationRbacData = async (params: { transaction: params.transaction, tenantId: params.tenantId, scopes: createdScopes, - rolesToSeed: params.toSeed.organization_roles + rolesToSeed: params.toSeed.organization_roles, }); - await createRelations( - params.transaction, - params.tenantId, - createdScopes, - createdRoles - ); + await createRelations(params.transaction, params.tenantId, createdScopes, createdRoles); } }; diff --git a/packages/cli/src/commands/database/ogcio/organizations.ts b/packages/cli/src/commands/database/ogcio/organizations.ts index 372a8e21c55..5275c41433a 100644 --- a/packages/cli/src/commands/database/ogcio/organizations.ts +++ b/packages/cli/src/commands/database/ogcio/organizations.ts @@ -17,7 +17,7 @@ import { insertInto } from '../../../database.js'; import { consoleLog } from '../../../utils.js'; import { type OrganizationSeeder } from './ogcio-seeder.js'; -import { createItem, getInsertedColumnValue, updateQuery } from './queries.js'; +import { createOrUpdateItem, getInsertedColumnValue, updateQuery } from './queries.js'; const createAdminConsoleConfig = ( forTenantId: string @@ -43,7 +43,7 @@ const updateTenantConfigs = async ( const currentValue = await getInsertedColumnValue({ transaction, tenantId, - whereClauses: [sql`key = ${LogtoTenantConfigKey.AdminConsole}`], + whereClauses: [sql`key = ${LogtoTenantConfigKey.AdminConsole}`, sql`tenant_id = ${tenantId}`], tableName: LogtoConfigs.table, columnToGet: 'value', }); @@ -73,15 +73,15 @@ const createOrganization = async (params: { tenantId: string; organizationSeeder: OrganizationSeeder; }) => { - const organization = createItem({ + const organization = createOrUpdateItem({ transaction: params.transaction, tenantId: params.tenantId, toInsert: { name: params.organizationSeeder.name, description: params.organizationSeeder.description, - id: params.organizationSeeder.id ?? undefined, + id: params.organizationSeeder.id, }, - whereClauses: [sql`name = ${params.organizationSeeder.name}`], + whereClauses: [sql`tenant_id = ${params.tenantId}`, sql`id = ${params.organizationSeeder.id}`], toLogFieldName: 'name', tableName: Organizations.table, }); diff --git a/packages/cli/src/commands/database/ogcio/queries.ts b/packages/cli/src/commands/database/ogcio/queries.ts index f065694843b..d2498d004fc 100644 --- a/packages/cli/src/commands/database/ogcio/queries.ts +++ b/packages/cli/src/commands/database/ogcio/queries.ts @@ -22,7 +22,7 @@ export const getColumnValueByQueryResult = >( columnToGet: string ): string | undefined => { const camelColumn = snakeToCamel(columnToGet); - if (result.rows[0] === undefined || result.rows[0][camelColumn] === undefined) { + if (result.rows[0]?.[camelColumn] === undefined) { return undefined; } @@ -63,8 +63,23 @@ export const getInsertedId = async ( ): Promise => getInsertedColumnValue({ transaction, tenantId, whereClauses, tableName, columnToGet: 'id' }); -export const createItem = async < - T extends { id?: string } & Record, +const updateItem = async (params: { + transaction: DatabaseTransactionConnection; + toUpdate: Record; + whereClauses: ValueExpression[]; + tableName: string; +}) => { + const toUpdate = Object.entries(params.toUpdate).map( + ([key, value]) => sql`${sql.identifier([key])} = ${value ?? ''}` + ); + + const updateQueryString = updateQuery(toUpdate, params.whereClauses, params.tableName); + + return params.transaction.query(updateQueryString); +}; + +export const createOrUpdateItem = async < + T extends { id?: string } & Record, >(params: { transaction: DatabaseTransactionConnection; tenantId?: string; @@ -84,7 +99,16 @@ export const createItem = async < params.tableName ); if (scopeIdBefore !== undefined) { - consoleLog.info(`${prefixConsoleEntry}. Already exists.`); + consoleLog.info(`${prefixConsoleEntry}. Already exists. Updating entry.`); + + await updateItem({ + transaction: params.transaction, + toUpdate: params.toInsert, + whereClauses: params.whereClauses, + tableName: params.tableName, + }); + + consoleLog.info(`${prefixConsoleEntry}. Entry updated successfully.`); params.toInsert.id = scopeIdBefore; return { ...params.toInsert, id: scopeIdBefore }; } @@ -94,9 +118,7 @@ export const createItem = async < tenant_id: params.tenantId, }; - if (!toInsertData.id) { - toInsertData.id = generateStandardId(); - } + toInsertData.id ||= generateStandardId(); await params.transaction.query(insertInto(toInsertData, params.tableName)); params.toInsert.id = await getInsertedId( @@ -117,8 +139,8 @@ export const createItem = async < } }; -export const createItemWithoutId = async < - T extends Record, +export const createOrUpdateItemWithoutId = async < + T extends Record, >(params: { transaction: DatabaseTransactionConnection; tenantId: string | undefined; @@ -134,7 +156,16 @@ export const createItemWithoutId = async < consoleLog.info(prefixConsoleEntry); const scopeIdBefore = await getInsertedColumnValue(params); if (scopeIdBefore !== undefined) { - consoleLog.info(`${prefixConsoleEntry}. Already exists.`); + consoleLog.info(`${prefixConsoleEntry}. Already exists. Updating entry.`); + + await updateItem({ + transaction: params.transaction, + toUpdate: params.toInsert, + whereClauses: params.whereClauses, + tableName: params.tableName, + }); + + consoleLog.info(`${prefixConsoleEntry}. Entry updated successfully.`); return { ...params.toInsert, [params.columnToGet]: scopeIdBefore }; } @@ -163,3 +194,10 @@ export const updateQuery = ( where ${sql.join(whereClauses, sql` AND `)} `; }; + +export const deleteQuery = (whereClauses: ValueExpression[], table: string) => { + return sql` + delete from ${sql.identifier([table])} + where ${sql.join(whereClauses, sql` AND `)} + `; +}; diff --git a/packages/cli/src/commands/database/ogcio/resources-rbac.ts b/packages/cli/src/commands/database/ogcio/resources-rbac.ts index fcda585e7ee..5e3f704567d 100644 --- a/packages/cli/src/commands/database/ogcio/resources-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/resources-rbac.ts @@ -1,12 +1,20 @@ /* eslint-disable eslint-comments/disable-enable-pair */ -/* eslint-disable @silverhand/fp/no-let */ + /* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @silverhand/fp/no-mutating-methods */ /* eslint-disable @silverhand/fp/no-mutation */ + +/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ + import { Roles, RolesScopes, Scopes } from '@logto/schemas'; import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; -import { type ResourceRoleSeeder, type ResourcePermissionSeeder, ScopePerResourceRoleSeeder } from './ogcio-seeder.js'; -import { createItem } from './queries.js'; + +import { + type ResourceRoleSeeder, + type ResourcePermissionSeeder, + type ScopePerResourceRoleSeeder, +} from './ogcio-seeder.js'; +import { createOrUpdateItem, deleteQuery } from './queries.js'; import { type SeedingResource } from './resources.js'; type SeedingScope = { @@ -18,11 +26,11 @@ type SeedingScope = { type ScopesByName = Record; type ScopesByResourceId = Record; type SeededRole = { - id?: string; + id: string; name: string; description: string; - scopes: ScopePerResourceRoleSeeder[] -} + scopes: ScopePerResourceRoleSeeder[]; +}; type SeedingRelation = { role_id: string; scope_id: string; id?: string }; const createScope = async (params: { @@ -30,29 +38,27 @@ const createScope = async (params: { tenantId: string; scopeToSeed: SeedingScope; }) => - createItem({ + createOrUpdateItem({ transaction: params.transaction, tenantId: params.tenantId, toInsert: params.scopeToSeed, toLogFieldName: 'name', tableName: Scopes.table, whereClauses: [ + sql`tenant_id = ${params.tenantId}`, sql`name = ${params.scopeToSeed.name}`, - sql`resource_id = ${params.scopeToSeed.resource_id}` - ] + sql`resource_id = ${params.scopeToSeed.resource_id}`, + ], }); -const buildScopes = ( - resourceId: string, - scopes: string[] -): ScopesByName => { - return scopes.reduce((acc, scopeName) => { - acc[scopeName] = { +const buildScopes = (resourceId: string, scopes: string[]): ScopesByName => { + return scopes.reduce((accumulator, scopeName) => { + accumulator[scopeName] = { name: scopeName, description: scopeName, - resource_id: resourceId + resource_id: resourceId, }; - return acc; + return accumulator; }, {}); }; @@ -67,16 +73,16 @@ export const createScopes = async (params: { const scopesToCreate: ScopesByResourceId = {}; for (const singleSeeder of params.scopesToSeed) { - scopesToCreate[singleSeeder.resource_id] = buildScopes(singleSeeder.resource_id, singleSeeder.specific_permissions); + scopesToCreate[singleSeeder.resource_id] = buildScopes( + singleSeeder.resource_id, + singleSeeder.specific_permissions + ); } - const queries: Array< - Promise & { id: string }> - > = []; - + const queries: Array & { id: string }>> = []; - Object.values(scopesToCreate).forEach((scopes) => { - Object.values(scopes).forEach((scope) => { + for (const scopes of Object.values(scopesToCreate)) { + for (const scope of Object.values(scopes)) { queries.push( createScope({ scopeToSeed: scope, @@ -84,8 +90,8 @@ export const createScopes = async (params: { tenantId: params.tenantId, }) ); - }) - }); + } + } await Promise.all(queries); @@ -98,62 +104,66 @@ const createRole = async (params: { roleToSeed: { name: string; description: string; - id?: string; - } + id: string; + }; }) => { - const created = await createItem({ + await createOrUpdateItem({ transaction: params.transaction, tenantId: params.tenantId, toLogFieldName: 'name', - whereClauses: [sql`name = ${params.roleToSeed.name}`], - toInsert: { name: params.roleToSeed.name, description: params.roleToSeed.description }, + whereClauses: [sql`tenant_id = ${params.tenantId}`, sql`id = ${params.roleToSeed.id}`], + toInsert: { + id: params.roleToSeed.id, + name: params.roleToSeed.name, + description: params.roleToSeed.description, + }, tableName: Roles.table, }); - params.roleToSeed.id = created.id; - - return { - ...params.roleToSeed, - id: created.id, - }; -} + return params.roleToSeed; +}; const createRoles = async (params: { transaction: DatabaseTransactionConnection; tenantId: string; - scopes: ScopesByResourceId, - rolesToSeed: ResourceRoleSeeder[] + scopes: ScopesByResourceId; + rolesToSeed: ResourceRoleSeeder[]; }) => { - const rolesToCreate = params.rolesToSeed.map((role) =>({ + const rolesToCreate = params.rolesToSeed.map((role) => ({ + id: role.id, name: role.name, description: role.description, - scopes: role.permissions + scopes: role.permissions, })); - const queries = rolesToCreate.map((role) => + const queries = rolesToCreate.map(async (role) => createRole({ transaction: params.transaction, tenantId: params.tenantId, - roleToSeed: role + roleToSeed: role, }) ); await Promise.all(queries); return rolesToCreate; -} +}; const createRoleScopeRelation = async ( transaction: DatabaseTransactionConnection, tenantId: string, relation: SeedingRelation ) => - createItem({ + createOrUpdateItem({ transaction, tableName: RolesScopes.table, tenantId, toLogFieldName: 'role_id', - whereClauses: [sql`role_id = ${relation.role_id}`, sql`scope_id = ${relation.scope_id}`], + whereClauses: [ + sql`tenant_id = ${tenantId}`, + sql`role_id = ${relation.role_id}`, + sql`scope_id = ${relation.scope_id}`, + ], toInsert: relation, }); @@ -165,74 +175,43 @@ const createRelations = async (params: { }) => { const relationsToCrete: SeedingRelation[] = []; - params.roles.forEach((role) => { - role.scopes.forEach((scopeGroup) => { + for (const role of params.roles) { + for (const scopeGroup of role.scopes) { const relations = scopeGroup.specific_permissions.map((permission) => { - // @ts-ignore @typescript-eslint/no-non-null-asserted-optional-chain if (params.scopes[scopeGroup.resource_id]?.[permission]?.id === undefined) { - throw new Error("Requested permission does not exist.") + throw new Error('Requested permission does not exist.'); } return { - role_id: role.id!, - // @ts-ignore @typescript-eslint/no-non-null-asserted-optional-chain - scope_id: params.scopes[scopeGroup.resource_id]?.[permission]?.id! - } + role_id: role.id, + scope_id: params.scopes[scopeGroup.resource_id]?.[permission]?.id!, + }; }); relationsToCrete.push(...relations); - }) - }); + } + } - const queries = relationsToCrete.map((relation) => - createRoleScopeRelation( - params.transaction, - params.tenantId, - relation - ) + const queries = relationsToCrete.map(async (relation) => + createRoleScopeRelation(params.transaction, params.tenantId, relation) ); await Promise.all(queries); return relationsToCrete; -} - -const replaceWithResourceIdFromDatabase = ( - seededResources: Record, - toSeed: { - resource_permissions?: ResourcePermissionSeeder[]; - resource_roles?: ResourceRoleSeeder[]; - } -): { - resource_permissions?: ResourcePermissionSeeder[]; - resource_roles?: ResourceRoleSeeder[]; -} => { - if (toSeed.resource_permissions?.length) { - for (const permission of toSeed.resource_permissions) { - const seededResourceId = seededResources[permission.resource_id]; - if (!seededResourceId) { - throw new Error( - `Resource scopes. Referring to a not existent resource id: ${permission.resource_id}!` - ); - } - permission.resource_id = seededResourceId.id!; - } - } +}; - if (toSeed.resource_roles?.length) { - for (const roles of toSeed.resource_roles) { - for (const permissionGroup of roles.permissions) { - const seededResourceId = seededResources[permissionGroup.resource_id]; - if (!seededResourceId) { - throw new Error( - `Resource roles. Referring to a not existent resource id: ${permissionGroup.resource_id}!` - ); - } - permissionGroup.resource_id = seededResourceId.id!; - } - } - } +export const cleanScopes = async (transaction: DatabaseTransactionConnection, tenantId: string) => { + await cleanScopeRelations(transaction, tenantId); + const deleteQueryString = deleteQuery([sql`tenant_id = ${tenantId}`], Scopes.table); + return transaction.query(deleteQueryString); +}; - return toSeed; +export const cleanScopeRelations = async ( + transaction: DatabaseTransactionConnection, + tenantId: string +) => { + const deleteQueryString = deleteQuery([sql`tenant_id = ${tenantId}`], RolesScopes.table); + return transaction.query(deleteQueryString); }; export const seedResourceRbacData = async (params: { @@ -244,12 +223,13 @@ export const seedResourceRbacData = async (params: { resource_roles?: ResourceRoleSeeder[]; }; }) => { - params.toSeed = replaceWithResourceIdFromDatabase(params.seededResources, params.toSeed); if (params.toSeed.resource_permissions?.length && params.toSeed.resource_roles?.length) { + await cleanScopes(params.transaction, params.tenantId); + const createdScopes = await createScopes({ transaction: params.transaction, tenantId: params.tenantId, - scopesToSeed: params.toSeed.resource_permissions + scopesToSeed: params.toSeed.resource_permissions, }); const createdRoles = await createRoles({ @@ -263,7 +243,7 @@ export const seedResourceRbacData = async (params: { transaction: params.transaction, tenantId: params.tenantId, roles: createdRoles, - scopes: createdScopes + scopes: createdScopes, }); } }; diff --git a/packages/cli/src/commands/database/ogcio/resources.ts b/packages/cli/src/commands/database/ogcio/resources.ts index 539db60f12c..ffd386592f0 100644 --- a/packages/cli/src/commands/database/ogcio/resources.ts +++ b/packages/cli/src/commands/database/ogcio/resources.ts @@ -6,19 +6,19 @@ import { Resources } from '@logto/schemas'; import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; import { type ResourceSeeder } from './ogcio-seeder.js'; -import { createItem } from './queries.js'; +import { createOrUpdateItem } from './queries.js'; const createResource = async ( transaction: DatabaseTransactionConnection, tenantId: string, appToSeed: SeedingResource ) => - createItem({ + createOrUpdateItem({ transaction, tenantId, toInsert: appToSeed, toLogFieldName: 'name', - whereClauses: [sql`indicator = ${appToSeed.indicator}`], + whereClauses: [sql`tenant_id = ${tenantId}`, sql`id = ${appToSeed.id}`], tableName: Resources.table, }); @@ -26,18 +26,14 @@ const setResourceId = async ( element: SeedingResource, transaction: DatabaseTransactionConnection, tenantId: string -): Promise< - Omit & { - id: string; - } -> => { +): Promise => { const outputValue = await createResource(transaction, tenantId, element); return outputValue; }; export type SeedingResource = { - id?: string; + id: string; name: string; indicator: string; is_default?: boolean; @@ -45,6 +41,7 @@ export type SeedingResource = { }; const fillResource = (resourceSeeder: ResourceSeeder): SeedingResource => ({ + id: resourceSeeder.id, name: resourceSeeder.name, indicator: resourceSeeder.indicator, is_default: false, diff --git a/packages/cli/src/commands/database/ogcio/webhooks.ts b/packages/cli/src/commands/database/ogcio/webhooks.ts index 407cc1e972e..096fef61f39 100644 --- a/packages/cli/src/commands/database/ogcio/webhooks.ts +++ b/packages/cli/src/commands/database/ogcio/webhooks.ts @@ -5,7 +5,7 @@ import { Hooks } from '@logto/schemas'; import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; import { type WebhookSeeder } from './ogcio-seeder.js'; -import { createItemWithoutId } from './queries.js'; +import { createOrUpdateItemWithoutId } from './queries.js'; type SeedingWebhook = { tenant_id: string; @@ -22,20 +22,17 @@ const createWebhook = async ( tenantId: string, webhookToSeed: SeedingWebhook ) => - createItemWithoutId({ + createOrUpdateItemWithoutId({ transaction, tenantId, toInsert: webhookToSeed, toLogFieldName: 'id', - whereClauses: [sql`id = ${webhookToSeed.id}`], + whereClauses: [sql`tenant_id = ${tenantId}`, sql`id = ${webhookToSeed.id}`], tableName: Hooks.table, columnToGet: 'id', }); -const fillWebhooks = ( - inputHooks: WebhookSeeder[], - tenantId: string -): SeedingWebhook[] => { +const fillWebhooks = (inputHooks: WebhookSeeder[], tenantId: string): SeedingWebhook[] => { return inputHooks.map((hook) => ({ tenant_id: tenantId, id: hook.id, @@ -43,7 +40,7 @@ const fillWebhooks = ( events: JSON.stringify(hook.events), config: JSON.stringify(hook.config), signing_key: hook.signing_key, - enabled: hook.enabled + enabled: hook.enabled, })); }; diff --git a/packages/core/src/libraries/ogcio-constants.ts b/packages/core/src/libraries/ogcio-constants.ts new file mode 100644 index 00000000000..9fd839f244a --- /dev/null +++ b/packages/core/src/libraries/ogcio-constants.ts @@ -0,0 +1,12 @@ +export const OGCIO_ORGANIZATIONS = { + OGCIO: 'ogcio', +}; + +export const OGCIO_ORGANIZATION_ROLES = { + BB_PUBLIC_SERVANT: 'bb-public-servant', + MSG_PUBLIC_SERVANT: 'msg-public-servant', +}; + +export const OGCIO_ROLES = { + BB_CITIZEN: 'bb-citizen', +}; diff --git a/packages/core/src/libraries/ogcio-user.ts b/packages/core/src/libraries/ogcio-user.ts index d916acff866..0dbc601d36a 100644 --- a/packages/core/src/libraries/ogcio-user.ts +++ b/packages/core/src/libraries/ogcio-user.ts @@ -16,6 +16,8 @@ import { EnvSet } from '#src/env-set/index.js'; import type OrganizationQueries from '#src/queries/organization/index.js'; import assertThat from '#src/utils/assert-that.js'; +import { OGCIO_ORGANIZATION_ROLES, OGCIO_ORGANIZATIONS, OGCIO_ROLES } from './ogcio-constants.js'; + const getDefaultOrganizationsForUser = async (organizationQueries: OrganizationQueries) => { const organizationNames: string[] = deduplicate(EnvSet.values.userDefaultOrganizationNames); consoleLog.info('DEFUALT ORG NAMES', organizationNames); @@ -136,15 +138,10 @@ const getDomainFromEmail = (email: string): string | undefined => { const assignCitizenRole = async ( user: User, - getRoles: (roleName: string, excludeRoleId?: string) => Promise, + getRoles: (id: string) => Promise, insertUsersRoles: (usersRoles: CreateUsersRole[]) => Promise> ) => { - const userRole = await getRoles('Citizen'); - - if (userRole === undefined) { - consoleLog.error(phrases.en.errors.role.default_role_missing); - return; - } + const userRole = await getRoles(OGCIO_ROLES.BB_CITIZEN); return insertUsersRoles([ { @@ -158,7 +155,7 @@ const assignCitizenRole = async ( const assignUserToOrganization = async (user: User, organizationQueries: OrganizationQueries) => { try { - const organization = await organizationQueries.findById('ogcio'); + const organization = await organizationQueries.findById(OGCIO_ORGANIZATIONS.OGCIO); await organizationQueries.relations.users.insert([organization.id, user.id]); return organization; } catch { @@ -171,13 +168,9 @@ const assignOrganizationRoleToUser = async ( organization: Organization, organizationQueries: OrganizationQueries ) => { - const allOrganizationRoles = await organizationQueries.roles.findAll(100, 0); - const publicServantRole = allOrganizationRoles[1].find((role) => role.name === 'Public Servant'); - - if (publicServantRole === undefined) { - consoleLog.error(phrases.en.errors.role.default_role_missing); - return; - } + const publicServantRole = await organizationQueries.roles.findById( + OGCIO_ORGANIZATION_ROLES.BB_PUBLIC_SERVANT + ); await organizationQueries.relations.rolesUsers.insert([ organization.id, @@ -198,7 +191,7 @@ const assignPublicServantRole = async (user: User, organizationQueries: Organiza export const manageDefaultUserRole = async ( user: User, - getRoles: (roleName: string, excludeRoleId?: string) => Promise, + getRoles: (id: string) => Promise, insertUsersRoles: (usersRoles: CreateUsersRole[]) => Promise>, organizationQueries: OrganizationQueries ) => { diff --git a/packages/core/src/middleware/koa-spa-proxy.ts b/packages/core/src/middleware/koa-spa-proxy.ts index ede71a7ef4a..d207ccfa581 100644 --- a/packages/core/src/middleware/koa-spa-proxy.ts +++ b/packages/core/src/middleware/koa-spa-proxy.ts @@ -11,7 +11,8 @@ import serveStatic from '#src/middleware/koa-serve-static.js'; export default function koaSpaProxy( mountedApps: string[], packagePath = 'experience', - port = 5001, + // OGCIO - formsie port collision fixed + port = 7001, prefix = '' ): MiddlewareType { type Middleware = MiddlewareType; diff --git a/packages/core/src/routes/applications/application.test.ts b/packages/core/src/routes/applications/application.test.ts index f02353db2e1..f54689f5332 100644 --- a/packages/core/src/routes/applications/application.test.ts +++ b/packages/core/src/routes/applications/application.test.ts @@ -72,7 +72,8 @@ const applicationRoutes = await pickDefault(import('./application.js')); const customClientMetadata = { corsAllowedOrigins: [ 'http://localhost:5000', - 'http://localhost:5001', + // OGCIO - formsie port collision fixed + 'http://localhost:7001', 'https://silverhand.com', 'capacitor://localhost', ], diff --git a/packages/core/src/routes/interaction/actions/submit-interaction.ts b/packages/core/src/routes/interaction/actions/submit-interaction.ts index 988da35cd0e..8574a117b6f 100644 --- a/packages/core/src/routes/interaction/actions/submit-interaction.ts +++ b/packages/core/src/routes/interaction/actions/submit-interaction.ts @@ -195,8 +195,7 @@ async function handleSubmitRegister( // OGCIO await manageDefaultUserRole( user, - // @ts-expect-error: strange error in roles.findRoleByRoleName return type - roles.findRoleByRoleName, + roles.findRoleById, usersRoles.insertUsersRoles, organizations ); diff --git a/packages/experience/package.json b/packages/experience/package.json index 4acb97a76ce..00f8f9b083f 100644 --- a/packages/experience/package.json +++ b/packages/experience/package.json @@ -10,7 +10,7 @@ "scripts": { "precommit": "lint-staged", "start": "parcel src/index.html", - "dev": "cross-env PORT=5001 parcel src/index.html --no-cache --hmr-port 6001", + "dev": "cross-env PORT=7001 parcel src/index.html --no-cache --hmr-port 6001", "check": "tsc --noEmit", "build": "pnpm check && rm -rf dist && parcel build src/index.html --no-autoinstall --no-cache --detailed-report", "lint": "eslint --ext .ts --ext .tsx src", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b50119c4ac..39aa07f0104 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,6 +40,70 @@ importers: specifier: ^5.0.0 version: 5.0.2 + mygovid-mock-service: + dependencies: + '@fastify/cookie': + specifier: ^9.3.1 + version: 9.3.1 + '@fastify/formbody': + specifier: ^7.4.0 + version: 7.4.0 + '@fastify/sensible': + specifier: ^5.5.0 + version: 5.6.0 + '@fastify/type-provider-typebox': + specifier: ^4.0.0 + version: 4.0.0(@sinclair/typebox@0.32.34) + '@sinclair/typebox': + specifier: ^0.32.16 + version: 0.32.34 + fastify: + specifier: ^4.26.2 + version: 4.28.1 + fastify-plugin: + specifier: ^4.5.1 + version: 4.5.1 + jose: + specifier: ^5.2.4 + version: 5.2.4 + devDependencies: + '@types/node': + specifier: ^20.11.28 + version: 20.12.7 + '@typescript-eslint/eslint-plugin': + specifier: ^7.5.0 + version: 7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/parser': + specifier: ^7.5.0 + version: 7.7.0(eslint@8.57.0)(typescript@5.5.2) + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2) + pino-pretty: + specifier: ^11.0.0 + version: 11.2.1 + prettier: + specifier: ^3.2.5 + version: 3.3.2 + tap: + specifier: ^18.8.0 + version: 18.8.0(@swc/core@1.3.52)(@types/node@20.12.7)(@types/react@18.0.31)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.2) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.5.2) + tsx: + specifier: ^4.7.1 + version: 4.16.0 + typescript: + specifier: ^5.4.2 + version: 5.5.2 + packages/app-insights: dependencies: '@silverhand/essentials': @@ -3244,10 +3308,10 @@ importers: version: 3.556.0 '@azure/storage-blob': specifier: ^12.17.0 - version: 12.17.0 + version: 12.17.0(encoding@0.1.13) '@google-cloud/storage': specifier: ^7.10.0 - version: 7.10.0 + version: 7.10.0(encoding@0.1.13) '@koa/cors': specifier: ^5.0.0 version: 5.0.0 @@ -3298,7 +3362,7 @@ importers: version: 31.0.0-beta.2 '@simplewebauthn/server': specifier: ^10.0.0 - version: 10.0.0 + version: 10.0.0(encoding@0.1.13) '@withtyped/client': specifier: ^0.8.7 version: 0.8.7(zod@3.22.4) @@ -3500,7 +3564,7 @@ importers: version: 8.57.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + version: 29.7.0(@types/node@20.10.4) jest-matcher-specific-error: specifier: ^1.0.0 version: 1.0.0 @@ -3752,7 +3816,7 @@ importers: version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) + version: 29.7.0(@types/node@20.12.7) jest-environment-jsdom: specifier: ^29.0.0 version: 29.2.2 @@ -3761,7 +3825,7 @@ importers: version: 2.0.0 jest-transformer-svg: specifier: ^2.0.0 - version: 2.0.0(jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)))(react@18.2.0) + version: 2.0.0(jest@29.7.0(@types/node@20.12.7))(react@18.2.0) js-base64: specifier: ^3.7.5 version: 3.7.5 @@ -3900,7 +3964,7 @@ importers: version: 10.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + version: 29.7.0(@types/node@20.10.4) jest-matcher-specific-error: specifier: ^1.0.0 version: 1.0.0 @@ -4286,6 +4350,10 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} + '@alcalzone/ansi-tokenize@0.1.3': + resolution: {integrity: sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==} + engines: {node: '>=14.13.1'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -4782,6 +4850,9 @@ packages: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} + '@base2/pretty-print-object@1.0.1': + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -4939,138 +5010,276 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.20.2': resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.20.2': resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.20.2': resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.20.2': resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.20.2': resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.20.2': resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.20.2': resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.20.2': resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.20.2': resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.20.2': resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.20.2': resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.20.2': resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.20.2': resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.20.2': resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.20.2': resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.20.2': resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.20.2': resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-x64@0.20.2': resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.20.2': resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.20.2': resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.20.2': resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.20.2': resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + 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} @@ -5089,6 +5298,32 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fastify/ajv-compiler@3.6.0': + resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} + + '@fastify/cookie@9.3.1': + resolution: {integrity: sha512-h1NAEhB266+ZbZ0e9qUE6NnNR07i7DnNXWG9VbbZ8uC6O/hxHpl+Zoe5sw1yfdZ2U6XhToUGDnzQtWJdCaPwfg==} + + '@fastify/error@3.4.1': + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + + '@fastify/fast-json-stringify-compiler@4.3.0': + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + + '@fastify/formbody@7.4.0': + resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} + + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + + '@fastify/sensible@5.6.0': + resolution: {integrity: sha512-Vq6Z2ZQy10GDqON+hvLF52K99s9et5gVVxTul5n3SIAf0Kq5QjPRUKkAMT3zPAiiGvoHtS3APa/3uaxfDgCODQ==} + + '@fastify/type-provider-typebox@4.0.0': + resolution: {integrity: sha512-kTlN0saC/+xhcQPyBjb3YONQAMjiD/EHlCRjQjsr5E3NFjS5K8ZX5LGzXYDRjSa+sV4y8gTL5Q7FlObePv4iTA==} + peerDependencies: + '@sinclair/typebox': '>=0.26 <=0.32' + '@fontsource/roboto-mono@5.0.0': resolution: {integrity: sha512-PNxomCUy0blr1gNkc2TXfm8zMqnTVAtYfVYKBss6pgjex7lHENhqdDslCPNLwJDDqqPsWgpQ6TrMWEh4OTAVxQ==} @@ -5141,6 +5376,20 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7': + resolution: {integrity: sha512-9f0bhUr9TnwwpgUhEpr3FjxSaH/OHaARkE2F9fM0lS4nIs2GNerrvGwQz493dk0JKlTaGYVrKbq36vA/whZ34g==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=4.2' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -5361,6 +5610,10 @@ packages: peerDependencies: react: '>=16.8.0' + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -5439,6 +5692,43 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@npmcli/agent@2.2.2': + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/fs@3.1.1': + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/git@5.0.7': + resolution: {integrity: sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/installed-package-contents@2.1.0': + resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + '@npmcli/node-gyp@3.0.0': + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.2.0': + resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/redact@1.1.0': + resolution: {integrity: sha512-PfnWuOkQgu7gCbnSsAisaX7hKOdZ4wSAhAzH3/ph5dSGau52kCRrMMGbiSQLwyTZpgldkZ49b0brkOr1AzGBHQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/run-script@7.0.4': + resolution: {integrity: sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==} + engines: {node: ^16.14.0 || >=18.0.0} + '@opentelemetry/api@1.8.0': resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} engines: {node: '>=8.0.0'} @@ -6038,6 +6328,30 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sigstore/bundle@2.3.2': + resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/core@1.1.0': + resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/protobuf-specs@0.3.2': + resolution: {integrity: sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/sign@2.3.2': + resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/tuf@2.3.4': + resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/verify@1.2.1': + resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} + engines: {node: ^16.14.0 || >=18.0.0} + '@silverhand/eslint-config-react@6.0.2': resolution: {integrity: sha512-4PqhypLqrX5FVXimKBz3S1c+usDns3N/XG66n2FQtO1FIa8WUVw1CsuWHT+tkqeIxDR1PRQX1e8Iwyy7vPclPA==} engines: {node: ^20.9.0} @@ -6096,6 +6410,9 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.32.34': + resolution: {integrity: sha512-a3Z3ytYl6R/+7ldxx04PO1semkwWlX/8pTqxsPw4quIcIXDFPZhOc1Wx8azWmkU26ccK3mHwcWenn0avNgAKQg==} + '@sindresorhus/is@5.4.0': resolution: {integrity: sha512-Ggh6E9AnMpiNXlbXfFUcWE9qm408rL8jDi7+PMBBx7TMbwEmiqAiSmZ+zydYwxcJLqPGNDoLc9mXDuMDBZg0sA==} engines: {node: '>=14.16'} @@ -6472,6 +6789,139 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tapjs/after-each@1.1.22': + resolution: {integrity: sha512-KKbCnMlOFspW6YoaFfzbU3kwwolF9DfP7ikGGMZItex/EB+OcLxoFV++DCWIDIl12mzQfYZMJ0wJXtHFc0ux0Q==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/after@1.1.22': + resolution: {integrity: sha512-8Ui8dfTFgDS3ENfzKpsWGJw+v4LHXvifaSB79chQbucuggW+nM2zzWu7grw7mDUBBR3Mknk+qL4Nb1KrnZvfWQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/asserts@1.2.0': + resolution: {integrity: sha512-QTs1kALeJKrlX9Yns3f8/hfsWgf4mdFYPN3lQKxZ/3C/DkGnjlrpVd4I2fnTC7cgJ116kwEgwhxVJUpw9QPp9A==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/before-each@1.1.22': + resolution: {integrity: sha512-uKKllHDvQgTXjAm+F+29Iqcb9Bzh5U6LH45m6v/zfKPm8UNnNpJ/XxFbbsFqi0EQX2czYH0ivHfyQwiO40R8lw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/before@1.1.22': + resolution: {integrity: sha512-Uv2odGCtOgY/EevyDZv2rHbIbe9WGrouC6HI+lJv4whGUKgiIYTOjrssl4YxvqvnNWx289/6Tp4Kpu7EeXT7yA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/config@2.4.19': + resolution: {integrity: sha512-8fkUnf2d3g9wbnfSirXI92bx4ZO5X37nqYVb5fua9VDC2MsTLAmd4JyDSNG1ngn8/nO5o8aFNEeUaePswGId4A==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + '@tapjs/test': 1.4.4 + + '@tapjs/core@1.5.4': + resolution: {integrity: sha512-kDgRxTkSRxfLbX5orDmizxuyFBLLC3Mu4mQ2dMzw/UMYkrN8jZbkKZqIR0BdXgxE+GqvVFqkYvFJImXJBygBKQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + + '@tapjs/error-serdes@1.2.2': + resolution: {integrity: sha512-RW2aU50JR7SSAlvoTyuwouXETLM9lP+7oZ5Z+dyKhNp8mkbbz4mXKcgd9SDHY5qTh6zvVN7OFK7ev7dYWXbrWw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + + '@tapjs/filter@1.2.22': + resolution: {integrity: sha512-qVWbsFem2R1htQVh0+4xWMPsDPpQ2NhA/6mnlg4ApzAFvaTr5T/zK72VpR+AqPaMcMgrp4a/m5DQ03dLFqckZQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/fixture@1.2.22': + resolution: {integrity: sha512-ZYjkRzLSwW+cOg2CbL3GrgjatKVXcEGLQa7vjfmYVxDrPHkK7tiu3lf1KU6pFxTyqTlMMRUfMehHQrH+JjDC7Q==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/intercept@1.2.22': + resolution: {integrity: sha512-OiayUlV+0fxwGM3B7JyRSwryq2kRpuWiF+4wQCiufSbbF20H4uEIlkRq1YrfUlla4zWVvHeQOQlUoqb6fSEcSQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/mock@1.3.4': + resolution: {integrity: sha512-tEz5hIdJdAGzl+KxjZol4DD7cWAdYMmvLU/QCZ5BThAOJ+FUAOxtBFA31nd7IWkMseIqcbeeqLmeMtan6QlPKA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/node-serialize@1.3.4': + resolution: {integrity: sha512-OwnSWdNnukgIGBsgnPy1ZpBDxp274GwLx2Ag+CulhsQ+IF9rOCq5P0EQ2kbxhxRet1386kbNzgXgaEeXmDXlLQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/processinfo@3.1.8': + resolution: {integrity: sha512-FIriEB+qqArPhmVYc1PZwRHD99myRdl7C9Oe/uts04Q2LOxQ5MEmqP9XOP8vVYzpDOYwmL8OmL6eOYt9eZlQKQ==} + engines: {node: '>=16.17'} + + '@tapjs/reporter@1.3.20': + resolution: {integrity: sha512-OTZeTC1/dr69mtZlRulynFH7+b7/C45MwLdLqaeTTeW2saAtojDMt7K2J8c74JlOO5+EKl71rBxrdKS6VBFqLw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/run@1.5.4': + resolution: {integrity: sha512-mwzU/KalqYOGZTTf7lPyfBdRDCoIgec69NXrq/+Le7PXYWKrRoYvIUoBGwgZYyjfiYshhnzb+ayZdtd76Lj0Kw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/snapshot@1.2.22': + resolution: {integrity: sha512-6nhNY6uFPnQEVQ8vuxV3rKiC7NXDY5k/Bv1bPatfo//6z1T41INfQbnfwQXoufaHveLPpGBTLwpOWjtFsUHgdg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/spawn@1.1.22': + resolution: {integrity: sha512-/MbFSmSpvLA0N2rKd8rI0vMLYM+0E3OB+doj+YUZe5m3G0YCHTBzZrnFGLw7Am1VsaREy4fSgchNEdn1NyikcQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/stack@1.2.8': + resolution: {integrity: sha512-VC8h6U62ScerTKN+MYpRPiwH2bCL65S6v1wcj1hukE2hojLcRvVdET7S3ZtRfSj/eNWW/5OVfzTpHiGjEYD6Xg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + + '@tapjs/stdin@1.1.22': + resolution: {integrity: sha512-JUyzZHG01iM6uDfplVGRiK+OdNalwl5Okv+eljHBdZOA8kO3hHI6N9bkZa472/st4NBj0lcMMGb2IKGgIBBUQg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/test@1.4.4': + resolution: {integrity: sha512-I0mzxs8+RUULd9g0R6+LXsLzkeqhu5jJPpA7w5BzTxA++jQ0ACjyHs1BBy1IhhP9DeZ5N2LPg+WxLs7Dijs9Uw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/typescript@1.4.4': + resolution: {integrity: sha512-Mf2vIK1yk5ipQRmuIznFtC8Iboti0p0D90ENDZdEx678h60vAVPh9vebVX+oQ0LccAHGyu/CiOSFL4Za8b5/Rg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + + '@tapjs/worker@1.1.22': + resolution: {integrity: sha512-1PO9Qstfevr4Wdh318eC3O1mytSyXT3q/K6EeivBhnuPeyHsy3QCAd1bfVD7gqzWNbJ/UzeGN3knfIi5qXifmA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.5.4 + '@testing-library/dom@10.0.0': resolution: {integrity: sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==} engines: {node: '>=18'} @@ -6522,6 +6972,20 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tsconfig/node18@18.2.4': + resolution: {integrity: sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==} + + '@tsconfig/node20@20.1.4': + resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==} + + '@tufjs/canonical-json@2.0.0': + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tufjs/models@2.0.1': + resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} + engines: {node: ^16.14.0 || >=18.0.0} + '@types/accepts@1.3.5': resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} @@ -6947,6 +7411,10 @@ packages: abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -6954,6 +7422,9 @@ packages: abortcontroller-polyfill@1.7.5: resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + accepts@1.3.7: resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==} engines: {node: '>= 0.6'} @@ -7001,6 +7472,14 @@ packages: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -7017,6 +7496,14 @@ packages: ajv: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -7169,6 +7656,10 @@ packages: resolution: {integrity: sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==} hasBin: true + async-hook-domain@4.0.1: + resolution: {integrity: sha512-bSktexGodAjfHWIrSrrqxqWzf1hWBZBpmPNZv+TYUMyWa2eoefFc6q6H1+KtdHYSz35lrhWdmXt/XK9wNEZvww==} + engines: {node: '>=16'} + async-hook-jl@1.7.6: resolution: {integrity: sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==} engines: {node: ^4.7 || >=6.9 || >=7.3} @@ -7183,14 +7674,25 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + attr-accept@2.2.2: resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} engines: {node: '>=4'} + auto-bind@5.0.1: + resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + avvio@8.3.2: + resolution: {integrity: sha512-st8e519GWHa/azv8S87mcJvZs4WsgTBjOw/Ih1CP6u+8SZvcOeAYNG6JbsIrAUUJJ7JfmrnOkR8ipDS+u9SIRQ==} + axe-core@4.7.0: resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} engines: {node: '>=4'} @@ -7354,10 +7856,19 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c8@8.0.1: + resolution: {integrity: sha512-EINpopxZNH1mETuI0DzRA4MZpAUH+IFiRhnmFD3vFr3vdrgxqi3VfE3KL0AIL+zDq8rC9bZqwM/VDmmoe04y7w==} + engines: {node: '>=12'} + hasBin: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacache@18.0.3: + resolution: {integrity: sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==} + 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'} @@ -7464,6 +7975,14 @@ packages: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -7499,6 +8018,14 @@ packages: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7549,6 +8076,10 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + collapse-white-space@1.0.6: resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} @@ -7656,6 +8187,18 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cookie-signature@1.2.1: + resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + engines: {node: '>=6.6.0'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} @@ -7852,6 +8395,9 @@ packages: resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} engines: {node: '>=0.11'} + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dayjs@1.11.6: resolution: {integrity: sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==} @@ -8132,6 +8678,9 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -8161,6 +8710,9 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -8207,6 +8759,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -8480,6 +9037,10 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events-to-array@2.0.3: + resolution: {integrity: sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==} + engines: {node: '>=12'} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -8511,6 +9072,9 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -8526,6 +9090,15 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -8549,6 +9122,9 @@ packages: resolution: {integrity: sha512-4hjwZDPmgj/ZUKXhEWovGPciE/5mWtAIQQxN+2VBDFun7DRTk2oOItbu9ZZp6kqj+eZ/u7z+dgBgM74cfGRnBQ==} engines: {node: '>= 10.0.0'} + fast-json-stringify@5.16.1: + resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -8556,9 +9132,19 @@ packages: resolution: {integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==} engines: {node: '>=10.0'} + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} + fast-xml-parser@4.2.5: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true @@ -8571,9 +9157,18 @@ packages: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + fastify@4.28.1: + resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==} + fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} @@ -8611,6 +9206,10 @@ packages: resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} engines: {node: '>=0.10.0'} + find-my-way@8.2.0: + resolution: {integrity: sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==} + engines: {node: '>=14'} + find-pkg@0.1.2: resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} engines: {node: '>=0.10.0'} @@ -8660,6 +9259,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -8691,10 +9294,17 @@ packages: formidable@3.5.1: resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + fs-exists-sync@0.1.0: resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} engines: {node: '>=0.10.0'} @@ -8707,6 +9317,14 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -8721,6 +9339,9 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-loop@4.0.0: + resolution: {integrity: sha512-f34iQBedYF3XcI93uewZZOnyscDragxgTK/eTvVB74k3fCD0ZorOi5BV9GS4M8rz/JoNi0Kl3qX5Y9MH3S/CLQ==} + function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} @@ -8805,6 +9426,9 @@ packages: get-tsconfig@4.7.3: resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + get-uri@6.0.1: resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} engines: {node: '>= 14'} @@ -9002,6 +9626,9 @@ packages: resolution: {integrity: sha512-MsIgYmdBh460ZZ8cJC81q4XJknjG567wzEmv46WOBblDb6TUd3z8/GhgmsM9pn8g2B80tAJ4m5/d3Bi1KrSUBQ==} engines: {node: '>=16.0.0'} + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hexoid@1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} @@ -9026,6 +9653,10 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + hpagent@1.2.0: resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} engines: {node: '>=14'} @@ -9181,6 +9812,10 @@ packages: ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + ignore-walk@6.0.5: + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -9247,6 +9882,19 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ink@4.4.1: + resolution: {integrity: sha512-rXckvqPBB0Krifk5rn/5LvQGmyXwCUpBfmTwbkQNBY9JY8RSl3b8OftBNEYxg4+SWUhEKcPifgope28uL9inlA==} + engines: {node: '>=14.16'} + peerDependencies: + '@types/react': '>=18.0.0' + react: '>=18.0.0' + react-devtools-core: ^4.19.1 + peerDependenciesMeta: + '@types/react': + optional: true + react-devtools-core: + optional: true + inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -9265,16 +9913,27 @@ packages: internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + ip@1.1.9: resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} ip@2.0.1: resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + ipaddr.js@2.1.0: resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} engines: {node: '>= 10'} + is-actual-promise@1.0.2: + resolution: {integrity: sha512-xsFiO1of0CLsQnPZ1iXHNTyR9YszOeWKYv+q6n8oSFW3ipooFJ1j1lbRMgiMCr+pp2gLruESI4zb5Ak6eK5OnQ==} + is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -9322,9 +9981,6 @@ packages: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true - is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} - is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -9382,6 +10038,12 @@ packages: is-json@2.0.1: resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-lower-case@2.0.2: + resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -9492,6 +10154,9 @@ packages: resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} engines: {node: '>=18'} + is-upper-case@2.0.2: + resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -9526,6 +10191,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + iso8601-duration@2.1.2: resolution: {integrity: sha512-yXteYUiKv6x8seaDzyBwnZtPpmx766KfvQuaVNyPifYOjmPdOo3ajd4phDNa7Y5mTQGnXsNEcXFtVun1FjYXxQ==} @@ -9768,6 +10437,10 @@ packages: jose@5.2.4: resolution: {integrity: sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-base64@3.7.5: resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} @@ -9789,6 +10462,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsdom@20.0.2: resolution: {integrity: sha512-AHWa+QO/cgRg4N+DsmHg1Y7xnz+8KU3EflM0LVDTdmrYOc1WWTSkOjtpUveQH+1Bqd5rtcVnb/DuxV/UjDO4rA==} engines: {node: '>=14'} @@ -9821,6 +10497,13 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -9977,6 +10660,9 @@ packages: libphonenumber-js@1.10.51: resolution: {integrity: sha512-vY2I+rQwrDQzoPds0JeTEpeWzbUJgqoV0O4v31PauHBb/e+1KCXKylHcDnBMgJZ9fH9mErsEbROJY3Z3JtqEmg==} + light-my-request@5.13.0: + resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==} + lightningcss-darwin-arm64@1.16.1: resolution: {integrity: sha512-/J898YSAiGVqdybHdIF3Ao0Hbh2vyVVj5YNm3NznVzTSvkOi3qQCAtO97sfmNz+bSRHXga7ZPLm+89PpOM5gAg==} engines: {node: '>= 12.0.0'} @@ -10218,6 +10904,10 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-fetch-happen@13.0.1: + resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} + engines: {node: ^16.14.0 || >=18.0.0} + makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -10478,6 +11168,33 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@3.0.5: + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-json-stream@1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} @@ -10490,6 +11207,10 @@ packages: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + minizlib@3.0.1: resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} @@ -10501,6 +11222,11 @@ packages: resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} engines: {node: '>= 8.0.0'} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -10623,6 +11349,11 @@ packages: resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} hasBin: true + node-gyp@10.1.0: + resolution: {integrity: sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -10655,6 +11386,11 @@ packages: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -10662,6 +11398,10 @@ packages: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -10670,6 +11410,34 @@ packages: resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} engines: {node: '>=14.16'} + npm-bundled@3.0.1: + resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@11.0.2: + resolution: {integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-packlist@8.0.2: + resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-pick-manifest@9.0.1: + resolution: {integrity: sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-registry-fetch@16.2.1: + resolution: {integrity: sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA==} + engines: {node: ^16.14.0 || >=18.0.0} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -10744,6 +11512,10 @@ packages: resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} engines: {node: ^10.13.0 || >=12.0.0} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -10772,6 +11544,10 @@ packages: openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -10862,6 +11638,10 @@ packages: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + p-map@7.0.2: resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} engines: {node: '>=18'} @@ -10893,6 +11673,11 @@ packages: packet-reader@1.0.0: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + pacote@17.0.7: + resolution: {integrity: sha512-sgvnoUMlkv9xHwDUKjKQFXVyUi8dtJGKp3vg6sYy+TxbDic5RjZCHF3ygv0EJgNRZ2GfRONjlKPUfokJ9lDpwQ==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -10935,6 +11720,10 @@ packages: passthrough-counter@1.0.0: resolution: {integrity: sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA==} + patch-console@2.0.0: + resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -11069,6 +11858,20 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-pretty@11.2.1: + resolution: {integrity: sha512-O05NuD9tkRasFRWVaF/uHLOvoRDFD7tb5VMertr78rbsYFjYp48Vg3477EshVAF5eZaEw+OpDl/tu+B0R5o+7g==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.2.0: + resolution: {integrity: sha512-g3/hpwfujK5a4oVbaefoJxezLzsDgLcNJeITvC6yrfwYeT9la+edCK42j5QpEQSQCZgTKapXvnQIdgZwvRaZug==} + hasBin: true + pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} @@ -11092,6 +11895,14 @@ packages: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + polite-json@4.0.1: + resolution: {integrity: sha512-8LI5ZeCPBEb4uBbcYKNVwk4jgqNx1yHReWoW4H4uUihWlSqZsUDfSITrRhjliuPgxsNPFhNSudGO2Zu4cbWinQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + polite-json@5.0.0: + resolution: {integrity: sha512-OLS/0XeUAcE8a2fdwemNja+udKgXNnY6yKVIXqAD2zVRx1KvY6Ato/rZ2vdzbxqYwPW0u6SCNC/bAMPNzpzxbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -11251,6 +12062,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} + hasBin: true + pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -11263,10 +12079,33 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + prismjs-terminal@1.2.3: + resolution: {integrity: sha512-xc0zuJ5FMqvW+DpiRkvxURlz98DdfDsZcFHdO699+oL+ykbFfgI7O4VDEgUyc07BSL2NHl3zdb8m/tZ/aaqUrw==} + engines: {node: '>=16'} + prismjs@1.27.0: resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} engines: {node: '>=6'} + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -11275,6 +12114,18 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -11296,6 +12147,10 @@ packages: resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} engines: {node: '>=4'} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + proxy-agent@6.4.0: resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} engines: {node: '>= 14'} @@ -11360,6 +12215,9 @@ packages: queue-tick@1.0.1: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -11437,6 +12295,12 @@ packages: peerDependencies: react: '>= 16.8 || 18.0.0' + react-element-to-jsx-string@15.0.0: + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-error-boundary@3.1.4: resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} engines: {node: '>=10', npm: '>=6'} @@ -11492,6 +12356,9 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} @@ -11516,6 +12383,12 @@ packages: peerDependencies: react: ^16 || ^17 || ^18 + react-reconciler@0.29.2: + resolution: {integrity: sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^18.3.1 + react-refresh@0.9.0: resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} engines: {node: '>=0.10.0'} @@ -11587,6 +12460,15 @@ packages: peerDependencies: react: '*' + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-package-json@7.0.1: + resolution: {integrity: sha512-8PcDiZ8DXUjLf687Ol4BR8Bpm2umR7vhoZOzNRt+uxD9GpBh/K+CAAALVIiYFknmvlmyg7hM7BSNUXPaCCqd0Q==} + engines: {node: ^16.14.0 || >=18.0.0} + deprecated: This package is no longer supported. Please use @npmcli/package-json instead. + read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -11611,10 +12493,18 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} @@ -11737,6 +12627,10 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-import@1.4.5: + resolution: {integrity: sha512-HXb4YqODuuXT7Icq1Z++0g2JmhgbUHSs3VT2xR83gqvAPUikYT2Xk+562KHQgiaNkbBOlPddYrDLsC44qQggzw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + resolve-path@1.4.0: resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} engines: {node: '>= 0.8'} @@ -11748,10 +12642,6 @@ packages: resolution: {integrity: sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==} engines: {node: '>=10'} - resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -11768,10 +12658,18 @@ packages: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} + retry-request@7.0.2: resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} engines: {node: '>=14'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -11847,6 +12745,9 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} @@ -11872,6 +12773,12 @@ packages: scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -11900,6 +12807,9 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -11950,6 +12860,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sigstore@2.3.1: + resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} + engines: {node: ^16.14.0 || >=18.0.0} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -11975,6 +12889,10 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} + slice-ansi@6.0.0: + resolution: {integrity: sha512-6bn4hRfkTvDfUoEQYkERg0BVF1D0vrX9HEkMl08uDiNWvVvjylLHvZFZWkDo6wjT8tUctbYl1nCOuE66ZTaUtA==} + engines: {node: '>=14.16'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -11999,10 +12917,21 @@ packages: resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} engines: {node: '>= 14'} + socks-proxy-agent@8.0.4: + resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + engines: {node: '>= 14'} + socks@2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonic-boom@4.0.1: + resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} + source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -12065,6 +12994,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sql-parse@0.1.5: resolution: {integrity: sha512-e2ExBX6iDHoCDC1zN2NvZV49UMhKVLvvwrDjzSVHFS3TKHKtIpl2nMDQkdlbTjDVvf2bxRYBq9iXAAMZvZpGVA==} engines: {node: '>=0.10'} @@ -12073,6 +13005,10 @@ packages: resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} engines: {node: '>=12'} + ssri@10.0.6: + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' @@ -12084,6 +13020,10 @@ packages: resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} engines: {node: '>=10'} + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -12131,6 +13071,10 @@ packages: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} + string-length@6.0.0: + resolution: {integrity: sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==} + engines: {node: '>=16'} + string-similarity@4.0.4: resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -12308,6 +13252,11 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + sync-content@1.0.2: + resolution: {integrity: sha512-znd3rYiiSxU3WteWyS9a6FXkTA/Wjk8WQsOyzHbineeL837dLn3DA4MRhsIX3qGcxDMH6+uuFV4axztssk7wEQ==} + engines: {node: '>=14'} + hasBin: true + synckit@0.8.8: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -12316,6 +13265,20 @@ packages: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} + tap-parser@15.3.2: + resolution: {integrity: sha512-uvauHuQqAMwfeFVxNpFXhvnWLVL0sthnHk4TxRM3cUy6+dejO9fatoKR7YejbMu4+2/1nR6UQE9+eUcX3PUmsA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + + tap-yaml@2.2.2: + resolution: {integrity: sha512-MWG4OpAKtNoNVjCz/BqlDJiwTM99tiHRhHPS4iGOe1ZS0CgM4jSFH92lthSFvvy4EdDjQZDV7uYqUFlU9JuNhw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + + tap@18.8.0: + resolution: {integrity: sha512-tX02yXmzBcemYfNGKtTJFf3cn7e8VgBvxKswaew8YnrE+1cUZtxyN0GhMzPQ5cWznVz47DfgcuYR1QtCr+4LOw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -12326,10 +13289,18 @@ packages: tar-stream@3.1.6: resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + tar@7.0.1: resolution: {integrity: sha512-IjMhdQMZFpKsHEQT3woZVxBtCQY+0wk3CVxdRkGXEgyGa0dNS/ehPvOMr2nmfC7x5Zj2N+l6yZUpmICjLGS35w==} engines: {node: '>=18'} + tcompare@6.4.6: + resolution: {integrity: sha512-sxvgCgO2GAIWHibnK4zLvvi9GHd/ZlR9DOUJ4ufwvNtkdKE2I9MNwJUwzYvOmGrJXMcfhhw0CDBb+6j0ia+I7A==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + teeny-request@9.0.0: resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} engines: {node: '>=14'} @@ -12356,6 +13327,9 @@ packages: resolution: {integrity: sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==} engines: {node: '>=0.2.6'} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} @@ -12397,6 +13371,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -12441,6 +13419,10 @@ packages: resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} deprecated: Use String.prototype.trim() instead + trivial-deferred@2.0.0: + resolution: {integrity: sha512-iGbM7X2slv9ORDVj2y2FFUq3cP/ypbtu2nQ8S38ufjL0glBABvmR9pTdsib1XtS2LUhhLMbelaBUaf/s5J3dSw==} + engines: {node: '>= 8'} + trough@1.0.5: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} @@ -12470,6 +13452,11 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tshy@1.16.2: + resolution: {integrity: sha512-WbjEtXENqbOEIdActBHq1bTJAaSAAD+NDxPdviDrFlvT5FCSWacWlWzSEB7FNLs5qqcP5bng/4W2TuNy1bY6NQ==} + engines: {node: 16 >=16.17 || 18 >=18.15.0 || >=20.6.1} + hasBin: true + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -12486,11 +13473,20 @@ packages: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} + tsx@4.16.0: + resolution: {integrity: sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ==} + engines: {node: '>=18.0.0'} + hasBin: true + tty-table@4.1.6: resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} engines: {node: '>=8.0.0'} hasBin: true + tuf-js@2.2.1: + resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} + engines: {node: ^16.14.0 || >=18.0.0} + tunnel@0.0.6: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} @@ -12510,6 +13506,10 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + type-fest@0.12.0: + resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} + engines: {node: '>=10'} + type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -12575,11 +13575,21 @@ packages: engines: {node: '>=12.20'} hasBin: true + typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true + typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + engines: {node: '>=14.17'} + hasBin: true + ua-parser-js@1.0.37: resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} @@ -12611,6 +13621,14 @@ packages: unified@9.2.0: resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unist-builder@2.0.3: resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} @@ -12722,6 +13740,10 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -12812,6 +13834,9 @@ packages: engines: {node: '>=12.0.0'} hasBin: true + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -12886,11 +13911,20 @@ packages: engines: {node: '>= 8'} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} engines: {node: '>=8'} hasBin: true + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} @@ -12990,6 +14024,12 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yaml-types@0.3.0: + resolution: {integrity: sha512-i9RxAO/LZBiE0NJUy9pbN5jFz5EasYDImzRkj8Y81kkInTi1laia3P3K/wlMKzOxFQutZip8TejvQP/DwgbU7A==} + engines: {node: '>= 16', npm: '>= 7'} + peerDependencies: + yaml: ^2.3.0 + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -12998,6 +14038,11 @@ packages: resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} engines: {node: '>= 14'} + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -13041,6 +14086,9 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + yoga-wasm-web@0.3.3: + resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} + zod-to-ts@1.2.0: resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} peerDependencies: @@ -13060,6 +14108,11 @@ snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} + '@alcalzone/ansi-tokenize@0.1.3': + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -13661,7 +14714,7 @@ snapshots: '@azure/core-util': 1.2.0 tslib: 2.6.2 - '@azure/core-http@3.0.4': + '@azure/core-http@3.0.4(encoding@0.1.13)': dependencies: '@azure/abort-controller': 1.1.0 '@azure/core-auth': 1.7.2 @@ -13671,7 +14724,7 @@ snapshots: '@types/node-fetch': 2.6.2 '@types/tunnel': 0.0.3 form-data: 4.0.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) process: 0.11.10 tslib: 2.6.2 tunnel: 0.0.6 @@ -13742,10 +14795,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/storage-blob@12.17.0': + '@azure/storage-blob@12.17.0(encoding@0.1.13)': dependencies: '@azure/abort-controller': 1.1.0 - '@azure/core-http': 3.0.4 + '@azure/core-http': 3.0.4(encoding@0.1.13) '@azure/core-lro': 2.5.1 '@azure/core-paging': 1.5.0 '@azure/core-tracing': 1.0.0-preview.13 @@ -14059,6 +15112,8 @@ snapshots: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + '@base2/pretty-print-object@1.0.1': {} + '@bcoe/v8-coverage@0.2.3': {} '@changesets/apply-release-plan@6.1.4': @@ -14342,72 +15397,141 @@ snapshots: '@esbuild/aix-ppc64@0.20.2': optional: true + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/android-arm64@0.20.2': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm@0.20.2': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-x64@0.20.2': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.20.2': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.20.2': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.20.2': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.20.2': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.20.2': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm@0.20.2': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-ia32@0.20.2': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-loong64@0.20.2': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.20.2': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.20.2': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.20.2': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-s390x@0.20.2': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-x64@0.20.2': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.20.2': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.20.2': optional: true - '@esbuild/sunos-x64@0.20.2': + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/win32-arm64@0.20.2': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-ia32@0.20.2': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-x64@0.20.2': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 @@ -14431,6 +15555,46 @@ snapshots: '@eslint/js@8.57.0': {} + '@fastify/ajv-compiler@3.6.0': + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + fast-uri: 2.4.0 + + '@fastify/cookie@9.3.1': + dependencies: + cookie-signature: 1.2.1 + fastify-plugin: 4.5.1 + + '@fastify/error@3.4.1': {} + + '@fastify/fast-json-stringify-compiler@4.3.0': + dependencies: + fast-json-stringify: 5.16.1 + + '@fastify/formbody@7.4.0': + dependencies: + fast-querystring: 1.1.2 + fastify-plugin: 4.5.1 + + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + + '@fastify/sensible@5.6.0': + dependencies: + '@lukeed/ms': 2.0.2 + fast-deep-equal: 3.1.3 + fastify-plugin: 4.5.1 + forwarded: 0.2.0 + http-errors: 2.0.0 + type-is: 1.6.18 + vary: 1.1.2 + + '@fastify/type-provider-typebox@4.0.0(@sinclair/typebox@0.32.34)': + dependencies: + '@sinclair/typebox': 0.32.34 + '@fontsource/roboto-mono@5.0.0': {} '@google-cloud/paginator@5.0.0': @@ -14442,7 +15606,7 @@ snapshots: '@google-cloud/promisify@4.0.0': {} - '@google-cloud/storage@7.10.0': + '@google-cloud/storage@7.10.0(encoding@0.1.13)': dependencies: '@google-cloud/paginator': 5.0.0 '@google-cloud/projectify': 4.0.0 @@ -14452,12 +15616,12 @@ snapshots: duplexify: 4.1.3 ent: 2.2.0 fast-xml-parser: 4.3.6 - gaxios: 6.1.1 - google-auth-library: 9.8.0 + gaxios: 6.1.1(encoding@0.1.13) + google-auth-library: 9.8.0(encoding@0.1.13) mime: 3.0.0 p-limit: 3.1.0 - retry-request: 7.0.2 - teeny-request: 9.0.0 + retry-request: 7.0.2(encoding@0.1.13) + teeny-request: 9.0.0(encoding@0.1.13) uuid: 8.3.2 transitivePeerDependencies: - encoding @@ -14500,6 +15664,42 @@ snapshots: dependencies: minipass: 7.0.4 + '@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.2.2)': + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@tsconfig/node18': 18.2.4 + '@tsconfig/node20': 20.1.4 + '@types/node': 20.12.7 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.2.2 + v8-compile-cache-lib: 3.0.1 + optionalDependencies: + '@swc/core': 1.3.52(@swc/helpers@0.5.1) + + '@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.5.2)': + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@tsconfig/node18': 18.2.4 + '@tsconfig/node20': 20.1.4 + '@types/node': 20.12.7 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.2 + v8-compile-cache-lib: 3.0.1 + optionalDependencies: + '@swc/core': 1.3.52(@swc/helpers@0.5.1) + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -14563,41 +15763,6 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.12.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - '@jest/create-cache-key-function@27.5.1': dependencies: '@jest/types': 27.5.1 @@ -14897,6 +16062,8 @@ snapshots: '@silverhand/essentials': 2.9.1 react: 18.2.0 + '@lukeed/ms@2.0.2': {} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.21.0 @@ -14993,6 +16160,69 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 + '@npmcli/agent@2.2.2': + dependencies: + agent-base: 7.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + lru-cache: 10.2.0 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@3.1.1': + dependencies: + semver: 7.6.0 + + '@npmcli/git@5.0.7': + dependencies: + '@npmcli/promise-spawn': 7.0.2 + lru-cache: 10.2.0 + npm-pick-manifest: 9.0.1 + proc-log: 4.2.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.6.0 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + + '@npmcli/installed-package-contents@2.1.0': + dependencies: + npm-bundled: 3.0.1 + npm-normalize-package-bin: 3.0.1 + + '@npmcli/node-gyp@3.0.0': {} + + '@npmcli/package-json@5.2.0': + dependencies: + '@npmcli/git': 5.0.7 + glob: 10.3.12 + hosted-git-info: 7.0.2 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 6.0.2 + proc-log: 4.2.0 + semver: 7.6.0 + transitivePeerDependencies: + - bluebird + + '@npmcli/promise-spawn@7.0.2': + dependencies: + which: 4.0.0 + + '@npmcli/redact@1.1.0': {} + + '@npmcli/run-script@7.0.4': + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/package-json': 5.2.0 + '@npmcli/promise-spawn': 7.0.2 + node-gyp: 10.1.0 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + '@opentelemetry/api@1.8.0': {} '@opentelemetry/core@1.23.0(@opentelemetry/api@1.8.0)': @@ -15770,7 +17000,7 @@ snapshots: deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.2 + resolve: 1.22.8 optionalDependencies: rollup: 4.14.3 @@ -15910,6 +17140,38 @@ snapshots: '@sideway/pinpoint@2.0.0': {} + '@sigstore/bundle@2.3.2': + dependencies: + '@sigstore/protobuf-specs': 0.3.2 + + '@sigstore/core@1.1.0': {} + + '@sigstore/protobuf-specs@0.3.2': {} + + '@sigstore/sign@2.3.2': + dependencies: + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + make-fetch-happen: 13.0.1 + proc-log: 4.2.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@sigstore/tuf@2.3.4': + dependencies: + '@sigstore/protobuf-specs': 0.3.2 + tuf-js: 2.2.1 + transitivePeerDependencies: + - supports-color + + '@sigstore/verify@1.2.1': + dependencies: + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + '@silverhand/eslint-config-react@6.0.2(eslint@8.57.0)(postcss@8.4.31)(prettier@3.0.0)(stylelint@15.11.0(typescript@5.3.3))(typescript@5.3.3)': dependencies: '@silverhand/eslint-config': 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -15940,10 +17202,10 @@ snapshots: eslint-config-prettier: 9.1.0(eslint@8.57.0) eslint-config-xo: 0.44.0(eslint@8.57.0) eslint-config-xo-typescript: 4.0.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-consistent-default-export-name: 0.0.15 eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-n: 17.2.1(eslint@8.57.0) eslint-plugin-no-use-extend-native: 0.5.0 eslint-plugin-prettier: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.0.0) @@ -16002,7 +17264,7 @@ snapshots: dependencies: '@simplewebauthn/types': 10.0.0 - '@simplewebauthn/server@10.0.0': + '@simplewebauthn/server@10.0.0(encoding@0.1.13)': dependencies: '@hexagon/base64': 1.1.28 '@levischuck/tiny-cbor': 0.2.2 @@ -16012,7 +17274,7 @@ snapshots: '@peculiar/asn1-schema': 2.3.8 '@peculiar/asn1-x509': 2.3.8 '@simplewebauthn/types': 10.0.0 - cross-fetch: 4.0.0 + cross-fetch: 4.0.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -16024,6 +17286,8 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.32.34': {} + '@sindresorhus/is@5.4.0': {} '@sindresorhus/is@6.1.0': {} @@ -16504,6 +17768,255 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@tapjs/after-each@1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + function-loop: 4.0.0 + + '@tapjs/after@1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + is-actual-promise: 1.0.2 + + '@tapjs/asserts@1.2.0(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/stack': 1.2.8 + is-actual-promise: 1.0.2 + tcompare: 6.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + + '@tapjs/before-each@1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + function-loop: 4.0.0 + + '@tapjs/before@1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + is-actual-promise: 1.0.2 + + '@tapjs/config@2.4.19(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@tapjs/test@1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/test': 1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + chalk: 5.3.0 + jackspeak: 2.3.6 + polite-json: 4.0.1 + tap-yaml: 2.2.2 + walk-up-path: 3.0.1 + + '@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@tapjs/processinfo': 3.1.8 + '@tapjs/stack': 1.2.8 + '@tapjs/test': 1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + async-hook-domain: 4.0.1 + diff: 5.2.0 + is-actual-promise: 1.0.2 + minipass: 7.0.4 + signal-exit: 4.1.0 + tap-parser: 15.3.2 + tap-yaml: 2.2.2 + tcompare: 6.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + + '@tapjs/error-serdes@1.2.2': + dependencies: + minipass: 7.0.4 + + '@tapjs/filter@1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + + '@tapjs/fixture@1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + mkdirp: 3.0.1 + rimraf: 5.0.5 + + '@tapjs/intercept@1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/stack': 1.2.8 + + '@tapjs/mock@1.3.4(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/stack': 1.2.8 + resolve-import: 1.4.5 + walk-up-path: 3.0.1 + + '@tapjs/node-serialize@1.3.4(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/error-serdes': 1.2.2 + '@tapjs/stack': 1.2.8 + tap-parser: 15.3.2 + + '@tapjs/processinfo@3.1.8': + dependencies: + pirates: 4.0.5 + process-on-spawn: 1.0.0 + signal-exit: 4.1.0 + uuid: 8.3.2 + + '@tapjs/reporter@1.3.20(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@tapjs/test@1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.31)(react-dom@18.2.0(react@18.2.0))': + dependencies: + '@tapjs/config': 2.4.19(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@tapjs/test@1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/stack': 1.2.8 + chalk: 5.3.0 + ink: 4.4.1(@types/react@18.0.31)(react@18.2.0) + minipass: 7.0.4 + ms: 2.1.3 + patch-console: 2.0.0 + prismjs-terminal: 1.2.3 + react: 18.2.0 + string-length: 6.0.0 + tap-parser: 15.3.2 + tap-yaml: 2.2.2 + tcompare: 6.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + transitivePeerDependencies: + - '@tapjs/test' + - '@types/react' + - bufferutil + - react-devtools-core + - react-dom + - utf-8-validate + + '@tapjs/run@1.5.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(@types/react@18.0.31)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/before': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/config': 2.4.19(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@tapjs/test@1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/processinfo': 3.1.8 + '@tapjs/reporter': 1.3.20(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@tapjs/test@1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.31)(react-dom@18.2.0(react@18.2.0)) + '@tapjs/spawn': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/stdin': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/test': 1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + c8: 8.0.1 + chalk: 5.3.0 + chokidar: 3.6.0 + foreground-child: 3.1.1 + glob: 10.3.12 + minipass: 7.0.4 + mkdirp: 3.0.1 + opener: 1.5.2 + pacote: 17.0.7 + resolve-import: 1.4.5 + rimraf: 5.0.5 + semver: 7.6.0 + signal-exit: 4.1.0 + tap-parser: 15.3.2 + tap-yaml: 2.2.2 + tcompare: 6.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + trivial-deferred: 2.0.0 + which: 4.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - react + - react-devtools-core + - react-dom + - supports-color + - utf-8-validate + + '@tapjs/snapshot@1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + is-actual-promise: 1.0.2 + tcompare: 6.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + + '@tapjs/spawn@1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + + '@tapjs/stack@1.2.8': {} + + '@tapjs/stdin@1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + + '@tapjs/test@1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.2.2) + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/after-each': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/asserts': 1.2.0(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/before': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/before-each': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/filter': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/fixture': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/intercept': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/mock': 1.3.4(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/node-serialize': 1.3.4(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/snapshot': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/spawn': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/stdin': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/typescript': 1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(typescript@5.2.2) + '@tapjs/worker': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + glob: 10.3.12 + jackspeak: 2.3.6 + mkdirp: 3.0.1 + resolve-import: 1.4.5 + rimraf: 5.0.5 + sync-content: 1.0.2 + tap-parser: 15.3.2 + tshy: 1.16.2 + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + + '@tapjs/typescript@1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(typescript@5.2.2)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.2.2) + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + '@tapjs/typescript@1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(typescript@5.5.2)': + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.7(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.5.2) + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + + '@tapjs/worker@1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@testing-library/dom@10.0.0': dependencies: '@babel/code-frame': 7.22.5 @@ -16546,6 +18059,17 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tsconfig/node18@18.2.4': {} + + '@tsconfig/node20@20.1.4': {} + + '@tufjs/canonical-json@2.0.0': {} + + '@tufjs/models@2.0.1': + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.4 + '@types/accepts@1.3.5': dependencies: '@types/node': 20.12.7 @@ -16913,7 +18437,7 @@ snapshots: '@types/tar@6.1.12': dependencies: - '@types/node': 20.11.20 + '@types/node': 20.12.7 minipass: 4.2.8 '@types/through@0.0.30': @@ -16965,6 +18489,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/type-utils': 7.7.0(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3)': dependencies: '@typescript-eslint/scope-manager': 7.7.0 @@ -16978,6 +18522,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.5.2)': + dependencies: + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@7.7.0': dependencies: '@typescript-eslint/types': 7.7.0 @@ -16995,6 +18552,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@7.7.0(eslint@8.57.0)(typescript@5.5.2)': + dependencies: + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.5.2) + '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.5.2) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@7.7.0': {} '@typescript-eslint/typescript-estree@7.7.0(typescript@5.3.3)': @@ -17012,6 +18581,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@7.7.0(typescript@5.5.2)': + dependencies: + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@7.7.0(eslint@8.57.0)(typescript@5.3.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -17026,6 +18610,20 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@7.7.0(eslint@8.57.0)(typescript@5.5.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.5.2) + eslint: 8.57.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/visitor-keys@7.7.0': dependencies: '@typescript-eslint/types': 7.7.0 @@ -17149,12 +18747,16 @@ snapshots: abbrev@1.1.1: {} + abbrev@2.0.0: {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 abortcontroller-polyfill@1.7.5: {} + abstract-logging@2.0.1: {} + accepts@1.3.7: dependencies: mime-types: 2.1.35 @@ -17202,6 +18804,17 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.1: + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + ajv-draft-04@1.0.0(ajv@8.12.0): optionalDependencies: ajv: 8.12.0 @@ -17210,6 +18823,10 @@ snapshots: optionalDependencies: ajv: 8.12.0 + ajv-formats@3.0.1(ajv@8.12.0): + optionalDependencies: + ajv: 8.12.0 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -17400,6 +19017,8 @@ snapshots: astring@1.8.3: {} + async-hook-domain@4.0.1: {} + async-hook-jl@1.7.6: dependencies: stack-chain: 1.3.7 @@ -17415,12 +19034,21 @@ snapshots: asynckit@0.4.0: {} + atomic-sleep@1.0.0: {} + attr-accept@2.2.2: {} + auto-bind@5.0.1: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 + avvio@8.3.2: + dependencies: + '@fastify/error': 3.4.1 + fastq: 1.17.1 + axe-core@4.7.0: {} axios@1.6.7: @@ -17614,8 +19242,38 @@ snapshots: bytes@3.1.2: {} + c8@8.0.1: + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.7 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + cac@6.7.14: {} + cacache@18.0.3: + dependencies: + '@npmcli/fs': 3.1.1 + fs-minipass: 3.0.3 + glob: 10.3.12 + lru-cache: 10.2.0 + minipass: 7.0.4 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.6 + tar: 6.2.1 + unique-filename: 3.0.0 + cache-content-type@1.0.1: dependencies: mime-types: 2.1.35 @@ -17732,6 +19390,20 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + chownr@3.0.0: {} chrome-trace-event@1.0.3: {} @@ -17761,6 +19433,10 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + clean-stack@2.2.0: {} + + cli-boxes@3.0.0: {} + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 @@ -17809,6 +19485,10 @@ snapshots: co@4.6.0: {} + code-excerpt@4.0.0: + dependencies: + convert-to-spaces: 2.0.1 + collapse-white-space@1.0.6: {} collect-v8-coverage@1.0.1: {} @@ -17902,6 +19582,12 @@ snapshots: convert-source-map@2.0.0: {} + convert-to-spaces@2.0.1: {} + + cookie-signature@1.2.1: {} + + cookie@0.6.0: {} + cookiejar@2.1.4: {} cookies@0.8.0: @@ -17966,13 +19652,13 @@ snapshots: dependencies: lodash.get: 4.4.2 - create-jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): + create-jest@29.7.0(@types/node@20.10.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@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + jest-config: 29.7.0(@types/node@20.10.4) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -18002,9 +19688,9 @@ snapshots: dependencies: cross-spawn: 7.0.3 - cross-fetch@4.0.0: + cross-fetch@4.0.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -18144,6 +19830,8 @@ snapshots: date-fns@2.29.3: {} + dateformat@4.6.3: {} + dayjs@1.11.6: {} debug@3.2.7(supports-color@5.5.0): @@ -18375,6 +20063,11 @@ snapshots: encodeurl@1.0.2: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -18398,6 +20091,8 @@ snapshots: env-paths@2.2.1: {} + err-code@2.0.3: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -18551,6 +20246,32 @@ snapshots: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + escalade@3.1.1: {} escape-html@1.0.3: {} @@ -18620,13 +20341,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -18637,14 +20358,14 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7(supports-color@5.5.0) optionalDependencies: '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.3.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -18666,7 +20387,7 @@ snapshots: eslint: 8.57.0 ignore: 5.3.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -18676,7 +20397,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.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -18741,6 +20462,15 @@ snapshots: optionalDependencies: eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2): + dependencies: + eslint: 8.57.0 + prettier: 3.3.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-plugin-promise@6.1.1(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -18907,6 +20637,8 @@ snapshots: eventemitter3@5.0.1: {} + events-to-array@2.0.3: {} + events@3.3.0: {} execa@5.1.1: @@ -18951,6 +20683,8 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + exponential-backoff@3.1.1: {} + extend@3.0.2: {} extendable-error@0.1.7: {} @@ -18971,6 +20705,12 @@ snapshots: transitivePeerDependencies: - supports-color + fast-content-type-parse@1.1.0: {} + + fast-copy@3.0.2: {} + + fast-decode-uri-component@1.0.1: {} + fast-deep-equal@3.1.3: {} fast-diff@1.2.0: {} @@ -18996,14 +20736,32 @@ snapshots: rfdc: 1.3.0 string-similarity: 4.0.4 + fast-json-stringify@5.16.1: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.12.0 + ajv-formats: 3.0.1(ajv@8.12.0) + fast-deep-equal: 3.1.3 + fast-uri: 2.4.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.3.0 + fast-levenshtein@2.0.6: {} fast-printf@1.6.9: dependencies: boolean: 3.1.4 + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-redact@3.5.0: {} + fast-safe-stringify@2.1.1: {} + fast-uri@2.4.0: {} + fast-xml-parser@4.2.5: dependencies: strnum: 1.0.5 @@ -19014,10 +20772,35 @@ snapshots: fastest-levenshtein@1.0.16: {} + fastify-plugin@4.5.1: {} + + fastify@4.28.1: + dependencies: + '@fastify/ajv-compiler': 3.6.0 + '@fastify/error': 3.4.1 + '@fastify/fast-json-stringify-compiler': 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.3.2 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.16.1 + find-my-way: 8.2.0 + light-my-request: 5.13.0 + pino: 9.2.0 + process-warning: 3.0.0 + proxy-addr: 2.0.7 + rfdc: 1.3.0 + secure-json-parse: 2.7.0 + semver: 7.6.0 + toad-cache: 3.7.0 + fastq@1.13.0: dependencies: reusify: 1.0.4 + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + fault@1.0.4: dependencies: format: 0.2.2 @@ -19058,6 +20841,12 @@ snapshots: fs-exists-sync: 0.1.0 resolve-dir: 0.1.1 + find-my-way@8.2.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 3.1.0 + find-pkg@0.1.2: dependencies: find-file-up: 0.1.3 @@ -19112,6 +20901,11 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 @@ -19147,8 +20941,12 @@ snapshots: hexoid: 1.0.0 once: 1.4.0 + forwarded@0.2.0: {} + fresh@0.5.2: {} + fromentries@1.3.2: {} + fs-exists-sync@0.1.0: {} fs-extra@7.0.1: @@ -19163,6 +20961,14 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.0.4 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -19172,6 +20978,8 @@ snapshots: function-bind@1.1.2: {} + function-loop@4.0.0: {} + function.prototype.name@1.1.5: dependencies: call-bind: 1.0.7 @@ -19188,19 +20996,19 @@ snapshots: functions-have-names@1.2.3: {} - gaxios@6.1.1: + gaxios@6.1.1(encoding@0.1.13): dependencies: extend: 3.0.2 https-proxy-agent: 7.0.4 is-stream: 2.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - gcp-metadata@6.1.0: + gcp-metadata@6.1.0(encoding@0.1.13): dependencies: - gaxios: 6.1.1 + gaxios: 6.1.1(encoding@0.1.13) json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -19262,6 +21070,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@4.7.5: + dependencies: + resolve-pkg-maps: 1.0.0 + get-uri@6.0.1: dependencies: basic-ftp: 5.0.3 @@ -19367,13 +21179,13 @@ snapshots: dependencies: csstype: 3.0.11 - google-auth-library@9.8.0: + google-auth-library@9.8.0(encoding@0.1.13): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.1.1 - gcp-metadata: 6.1.0 - gtoken: 7.0.1 + gaxios: 6.1.1(encoding@0.1.13) + gcp-metadata: 6.1.0(encoding@0.1.13) + gtoken: 7.0.1(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding @@ -19419,9 +21231,9 @@ snapshots: graphemer@1.4.0: {} - gtoken@7.0.1: + gtoken@7.0.1(encoding@0.1.13): dependencies: - gaxios: 6.1.1 + gaxios: 6.1.1(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding @@ -19539,6 +21351,8 @@ snapshots: helmet@7.0.0: {} + help-me@5.0.0: {} + hexoid@1.0.0: {} highlight.js@10.7.3: {} @@ -19561,6 +21375,10 @@ snapshots: dependencies: lru-cache: 6.0.0 + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.2.0 + hpagent@1.2.0: {} html-encoding-sniffer@3.0.0: @@ -19713,6 +21531,10 @@ snapshots: ignore-by-default@1.0.1: {} + ignore-walk@6.0.5: + dependencies: + minimatch: 9.0.4 + ignore@5.3.1: {} immutable@4.1.0: {} @@ -19763,6 +21585,40 @@ snapshots: ini@4.1.1: {} + ink@4.4.1(@types/react@18.0.31)(react@18.2.0): + dependencies: + '@alcalzone/ansi-tokenize': 0.1.3 + ansi-escapes: 6.0.0 + auto-bind: 5.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + cli-cursor: 4.0.0 + cli-truncate: 3.1.0 + code-excerpt: 4.0.0 + indent-string: 5.0.0 + is-ci: 3.0.1 + is-lower-case: 2.0.2 + is-upper-case: 2.0.2 + lodash: 4.17.21 + patch-console: 2.0.0 + react: 18.2.0 + react-reconciler: 0.29.2(react@18.2.0) + scheduler: 0.23.0 + signal-exit: 3.0.7 + slice-ansi: 6.0.0 + stack-utils: 2.0.6 + string-width: 5.1.2 + type-fest: 0.12.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + ws: 8.16.0 + yoga-wasm-web: 0.3.3 + optionalDependencies: + '@types/react': 18.0.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + inline-style-parser@0.1.1: {} inquirer@9.1.4: @@ -19797,12 +21653,21 @@ snapshots: internmap@1.0.1: {} + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + ip@1.1.9: {} ip@2.0.1: {} + ipaddr.js@1.9.1: {} + ipaddr.js@2.1.0: {} + is-actual-promise@1.0.2: {} + is-alphabetical@1.0.4: {} is-alphanumerical@1.0.4: @@ -19848,10 +21713,6 @@ snapshots: dependencies: ci-info: 3.8.0 - is-core-module@2.12.1: - dependencies: - has: 1.0.3 - is-core-module@2.13.1: dependencies: hasown: 2.0.2 @@ -19901,6 +21762,12 @@ snapshots: is-json@2.0.1: {} + is-lambda@1.0.1: {} + + is-lower-case@2.0.2: + dependencies: + tslib: 2.6.2 + is-map@2.0.3: {} is-module@1.0.0: {} @@ -19986,6 +21853,10 @@ snapshots: is-unicode-supported@2.0.0: {} + is-upper-case@2.0.2: + dependencies: + tslib: 2.6.2 + is-weakmap@2.0.2: {} is-weakref@1.0.2: @@ -20011,6 +21882,8 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + iso8601-duration@2.1.2: {} istanbul-lib-coverage@3.2.2: {} @@ -20108,16 +21981,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): + jest-cli@29.7.0(@types/node@20.10.4): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + create-jest: 29.7.0(@types/node@20.10.4) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + jest-config: 29.7.0(@types/node@20.10.4) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -20127,7 +22000,7 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)): + jest-cli@29.7.0(@types/node@20.12.7): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) '@jest/test-result': 29.7.0 @@ -20146,38 +22019,26 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): + jest-cli@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)): dependencies: - '@babel/core': 7.24.4 - '@jest/test-sequencer': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) + '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.4) chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 + create-jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.10.4 - ts-node: 10.9.2(@types/node@20.10.4)(typescript@5.3.3) + yargs: 17.7.2 transitivePeerDependencies: + - '@types/node' - babel-plugin-macros - supports-color + - ts-node - jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)): + jest-config@29.7.0(@types/node@20.10.4): dependencies: '@babel/core': 7.24.4 '@jest/test-sequencer': 29.7.0 @@ -20202,13 +22063,12 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.12.7 - ts-node: 10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3) + '@types/node': 20.10.4 transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): + jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)): dependencies: '@babel/core': 7.24.4 '@jest/test-sequencer': 29.7.0 @@ -20234,7 +22094,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.12.7 - ts-node: 10.9.2(@types/node@20.10.4)(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -20513,6 +22373,11 @@ snapshots: jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) react: 18.2.0 + jest-transformer-svg@2.0.0(jest@29.7.0(@types/node@20.12.7))(react@18.2.0): + dependencies: + jest: 29.7.0(@types/node@20.12.7) + react: 18.2.0 + jest-util@29.5.0: dependencies: '@jest/types': 29.6.3 @@ -20565,12 +22430,24 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): + jest@29.7.0(@types/node@20.10.4): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.10.4) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(@types/node@20.12.7): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + jest-cli: 29.7.0(@types/node@20.12.7) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -20605,6 +22482,8 @@ snapshots: jose@5.2.4: {} + joycon@3.1.1: {} + js-base64@3.7.5: {} js-tokens@4.0.0: {} @@ -20622,6 +22501,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsbn@1.1.0: {} + jsdom@20.0.2: dependencies: abab: 2.0.6 @@ -20669,6 +22550,12 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} + + json-schema-ref-resolver@1.0.1: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -20902,6 +22789,12 @@ snapshots: libphonenumber-js@1.10.51: {} + light-my-request@5.13.0: + dependencies: + cookie: 0.6.0 + process-warning: 3.0.0 + set-cookie-parser: 2.6.0 + lightningcss-darwin-arm64@1.16.1: optional: true @@ -21132,6 +23025,23 @@ snapshots: make-error@1.3.6: {} + make-fetch-happen@13.0.1: + dependencies: + '@npmcli/agent': 2.2.2 + cacache: 18.0.3 + http-cache-semantics: 4.1.1 + is-lambda: 1.0.1 + minipass: 7.0.4 + minipass-fetch: 3.0.5 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + proc-log: 4.2.0 + promise-retry: 2.0.1 + ssri: 10.0.6 + transitivePeerDependencies: + - supports-color + makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -21566,12 +23476,50 @@ snapshots: minimist@1.2.8: {} + minipass-collect@2.0.1: + dependencies: + minipass: 7.0.4 + + minipass-fetch@3.0.5: + dependencies: + minipass: 7.0.4 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-json-stream@1.0.1: + dependencies: + jsonparse: 1.3.1 + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + minipass@4.2.8: {} minipass@5.0.0: {} minipass@7.0.4: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + minizlib@3.0.1: dependencies: minipass: 7.0.4 @@ -21581,6 +23529,8 @@ snapshots: mixme@0.5.4: {} + mkdirp@1.0.4: {} + mkdirp@3.0.1: {} mlly@1.6.1: @@ -21675,9 +23625,11 @@ snapshots: node-addon-api@4.3.0: {} - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-forge@1.3.1: {} @@ -21688,6 +23640,21 @@ snapshots: node-gyp-build@4.5.0: {} + node-gyp@10.1.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 10.3.12 + graceful-fs: 4.2.11 + make-fetch-happen: 13.0.1 + nopt: 7.2.1 + proc-log: 3.0.0 + semver: 7.6.0 + tar: 6.2.1 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + node-int64@0.4.0: {} node-mocks-http@1.12.1: @@ -21732,6 +23699,10 @@ snapshots: dependencies: abbrev: 1.1.1 + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -21746,10 +23717,57 @@ snapshots: semver: 7.6.0 validate-npm-package-license: 3.0.4 + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.6.0 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} normalize-url@8.0.0: {} + npm-bundled@3.0.1: + dependencies: + npm-normalize-package-bin: 3.0.1 + + npm-install-checks@6.3.0: + dependencies: + semver: 7.6.0 + + npm-normalize-package-bin@3.0.1: {} + + npm-package-arg@11.0.2: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.6.0 + validate-npm-package-name: 5.0.1 + + npm-packlist@8.0.2: + dependencies: + ignore-walk: 6.0.5 + + npm-pick-manifest@9.0.1: + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.2 + semver: 7.6.0 + + npm-registry-fetch@16.2.1: + dependencies: + '@npmcli/redact': 1.1.0 + make-fetch-happen: 13.0.1 + minipass: 7.0.4 + minipass-fetch: 3.0.5 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 11.0.2 + proc-log: 4.2.0 + transitivePeerDependencies: + - supports-color + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -21843,6 +23861,8 @@ snapshots: oidc-token-hash@5.0.3: {} + on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -21874,6 +23894,8 @@ snapshots: openapi-types@12.1.3: {} + opener@1.5.2: {} + optionator@0.8.3: dependencies: deep-is: 0.1.4 @@ -21977,6 +23999,10 @@ snapshots: p-map@2.1.0: {} + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + p-map@7.0.2: {} p-queue@8.0.1: @@ -22014,6 +24040,30 @@ snapshots: packet-reader@1.0.0: {} + pacote@17.0.7: + dependencies: + '@npmcli/git': 5.0.7 + '@npmcli/installed-package-contents': 2.1.0 + '@npmcli/promise-spawn': 7.0.2 + '@npmcli/run-script': 7.0.4 + cacache: 18.0.3 + fs-minipass: 3.0.3 + minipass: 7.0.4 + npm-package-arg: 11.0.2 + npm-packlist: 8.0.2 + npm-pick-manifest: 9.0.1 + npm-registry-fetch: 16.2.1 + proc-log: 4.2.0 + promise-retry: 2.0.1 + read-package-json: 7.0.1 + read-package-json-fast: 3.0.2 + sigstore: 2.3.1 + ssri: 10.0.6 + tar: 6.2.1 + transitivePeerDependencies: + - bluebird + - supports-color + pako@1.0.11: {} parcel-resolver-ignore@2.1.3(parcel@2.9.3(@swc/helpers@0.5.1)(postcss@8.4.31)(srcset@4.0.0)): @@ -22078,6 +24128,8 @@ snapshots: passthrough-counter@1.0.0: {} + patch-console@2.0.0: {} + path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -22196,6 +24248,44 @@ snapshots: pify@4.0.1: {} + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + + pino-pretty@11.2.1: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pump: 3.0.0 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 4.0.1 + strip-json-comments: 3.1.1 + + pino-std-serializers@7.0.0: {} + + pino@9.2.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 7.0.0 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 4.0.1 + thread-stream: 3.1.0 + pirates@4.0.5: {} pkg-dir@4.2.0: @@ -22216,6 +24306,10 @@ snapshots: pngjs@5.0.0: {} + polite-json@4.0.1: {} + + polite-json@5.0.0: {} + possible-typed-array-names@1.0.0: {} postcss-media-query-parser@0.2.3: {} @@ -22353,6 +24447,8 @@ snapshots: prettier@3.0.0: {} + prettier@3.3.2: {} + pretty-bytes@6.1.1: {} pretty-format@27.5.1: @@ -22367,12 +24463,37 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.2.0 + prismjs-terminal@1.2.3: + dependencies: + chalk: 5.3.0 + prismjs: 1.29.0 + string-length: 6.0.0 + prismjs@1.27.0: {} + prismjs@1.29.0: {} + + proc-log@3.0.0: {} + + proc-log@4.2.0: {} + + process-on-spawn@1.0.0: + dependencies: + fromentries: 1.3.2 + + process-warning@3.0.0: {} + process@0.11.10: {} progress@2.0.3: {} + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -22394,6 +24515,11 @@ snapshots: proto-props@2.0.0: {} + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + proxy-agent@6.4.0: dependencies: agent-base: 7.1.0 @@ -22477,6 +24603,8 @@ snapshots: queue-tick@1.0.1: {} + quick-format-unescaped@4.0.4: {} + quick-lru@4.0.1: {} quick-lru@5.1.1: {} @@ -22551,6 +24679,14 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 + react-element-to-jsx-string@15.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.1.0 + react-error-boundary@3.1.4(react@18.2.0): dependencies: '@babel/runtime': 7.21.0 @@ -22597,6 +24733,8 @@ snapshots: react-is@17.0.2: {} + react-is@18.1.0: {} + react-is@18.2.0: {} react-lifecycles-compat@3.0.4: {} @@ -22633,6 +24771,12 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 + react-reconciler@0.29.2(react@18.2.0): + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.2 + react-refresh@0.9.0: {} react-resize-detector@7.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): @@ -22703,6 +24847,18 @@ snapshots: lodash: 4.17.21 react: 18.2.0 + read-package-json-fast@3.0.2: + dependencies: + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + + read-package-json@7.0.1: + dependencies: + glob: 10.3.12 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 6.0.2 + npm-normalize-package-bin: 3.0.1 + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -22742,10 +24898,20 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 + real-require@0.2.0: {} + recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 @@ -22939,6 +25105,11 @@ snapshots: resolve-from@5.0.0: {} + resolve-import@1.4.5: + dependencies: + glob: 10.3.12 + walk-up-path: 3.0.1 + resolve-path@1.4.0: dependencies: http-errors: 1.6.3 @@ -22948,12 +25119,6 @@ snapshots: resolve.exports@2.0.1: {} - resolve@1.22.2: - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.8: dependencies: is-core-module: 2.13.1 @@ -22975,15 +25140,19 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retry-request@7.0.2: + ret@0.4.3: {} + + retry-request@7.0.2(encoding@0.1.13): dependencies: '@types/request': 2.48.12 extend: 3.0.2 - teeny-request: 9.0.0 + teeny-request: 9.0.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color + retry@0.12.0: {} + retry@0.13.1: {} reusify@1.0.4: {} @@ -23105,6 +25274,10 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 + safe-regex2@3.1.0: + dependencies: + ret: 0.4.3 + safe-stable-stringify@2.4.3: {} safer-buffer@2.1.2: {} @@ -23139,6 +25312,12 @@ snapshots: dependencies: loose-envify: 1.4.0 + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + secure-json-parse@2.7.0: {} + semver-compare@1.0.0: {} semver@5.7.2: {} @@ -23159,6 +25338,8 @@ snapshots: set-blocking@2.0.0: {} + set-cookie-parser@2.6.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -23208,6 +25389,17 @@ snapshots: signal-exit@4.1.0: {} + sigstore@2.3.1: + dependencies: + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/sign': 2.3.2 + '@sigstore/tuf': 2.3.4 + '@sigstore/verify': 1.2.1 + transitivePeerDependencies: + - supports-color + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -23240,6 +25432,11 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 + slice-ansi@6.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + smart-buffer@4.2.0: {} smartwrap@2.0.2: @@ -23274,11 +25471,28 @@ snapshots: transitivePeerDependencies: - supports-color + socks-proxy-agent@8.0.4: + dependencies: + agent-base: 7.1.1 + debug: 4.3.4 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + socks@2.7.1: dependencies: ip: 2.0.1 smart-buffer: 4.2.0 + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + sonic-boom@4.0.1: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.0.2: {} source-map-js@1.2.0: {} @@ -23334,10 +25548,16 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} + sql-parse@0.1.5: {} srcset@4.0.0: {} + ssri@10.0.6: + dependencies: + minipass: 7.0.4 + stable@0.1.8: {} stack-chain@1.3.7: {} @@ -23346,6 +25566,10 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + stackback@0.0.2: {} state-local@1.0.7: {} @@ -23384,6 +25608,10 @@ snapshots: char-regex: 1.0.2 strip-ansi: 6.0.1 + string-length@6.0.0: + dependencies: + strip-ansi: 7.1.0 + string-similarity@4.0.4: {} string-width@4.2.3: @@ -23637,6 +25865,13 @@ snapshots: symbol-tree@3.2.4: {} + sync-content@1.0.2: + dependencies: + glob: 10.3.12 + mkdirp: 3.0.1 + path-scurry: 1.10.2 + rimraf: 5.0.5 + synckit@0.8.8: dependencies: '@pkgr/core': 0.1.1 @@ -23650,6 +25885,51 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + tap-parser@15.3.2: + dependencies: + events-to-array: 2.0.3 + tap-yaml: 2.2.2 + + tap-yaml@2.2.2: + dependencies: + yaml: 2.4.5 + yaml-types: 0.3.0(yaml@2.4.5) + + tap@18.8.0(@swc/core@1.3.52)(@types/node@20.12.7)(@types/react@18.0.31)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.2): + dependencies: + '@tapjs/after': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/after-each': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/asserts': 1.2.0(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/before': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/before-each': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/core': 1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/filter': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/fixture': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/intercept': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/mock': 1.3.4(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/node-serialize': 1.3.4(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/run': 1.5.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(@types/react@18.0.31)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/snapshot': 1.2.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/spawn': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/stdin': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tapjs/test': 1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tapjs/typescript': 1.4.4(@swc/core@1.3.52)(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/node@20.12.7)(typescript@5.5.2) + '@tapjs/worker': 1.1.22(@tapjs/core@1.5.4(@swc/core@1.3.52)(@types/node@20.12.7)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + resolve-import: 1.4.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - react + - react-devtools-core + - react-dom + - supports-color + - typescript + - utf-8-validate + tapable@2.2.1: {} tar-fs@3.0.5: @@ -23666,6 +25946,15 @@ snapshots: fast-fifo: 1.3.2 streamx: 2.15.1 + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + tar@7.0.1: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -23675,11 +25964,19 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - teeny-request@9.0.0: + tcompare@6.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + diff: 5.2.0 + react-element-to-jsx-string: 15.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + + teeny-request@9.0.0(encoding@0.1.13): dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) stream-events: 1.0.5 uuid: 9.0.1 transitivePeerDependencies: @@ -23702,6 +25999,10 @@ snapshots: thirty-two@1.0.2: {} + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + through2@4.0.2: dependencies: readable-stream: 3.6.2 @@ -23732,6 +26033,8 @@ snapshots: dependencies: is-number: 7.0.0 + toad-cache@3.7.0: {} + toidentifier@1.0.1: {} touch@3.1.0: @@ -23767,6 +26070,8 @@ snapshots: trim@0.0.1: {} + trivial-deferred@2.0.0: {} + trough@1.0.5: {} trough@2.1.0: {} @@ -23775,6 +26080,10 @@ snapshots: dependencies: typescript: 5.3.3 + ts-api-utils@1.3.0(typescript@5.5.2): + dependencies: + typescript: 5.5.2 + ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -23795,24 +26104,25 @@ snapshots: optionalDependencies: '@swc/core': 1.3.52(@swc/helpers@0.5.1) - ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3): + ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.5.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.10.4 + '@types/node': 20.12.7 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.5.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optional: true + optionalDependencies: + '@swc/core': 1.3.52(@swc/helpers@0.5.1) tsconfig-paths@3.15.0: dependencies: @@ -23821,6 +26131,20 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tshy@1.16.2: + dependencies: + chalk: 5.3.0 + chokidar: 3.6.0 + foreground-child: 3.1.1 + minimatch: 9.0.4 + mkdirp: 3.0.1 + polite-json: 5.0.0 + resolve-import: 1.4.5 + rimraf: 5.0.5 + sync-content: 1.0.2 + typescript: 5.5.2 + walk-up-path: 3.0.1 + tslib@1.14.1: {} tslib@2.4.1: {} @@ -23831,6 +26155,13 @@ snapshots: tsscmp@1.0.6: {} + tsx@4.16.0: + dependencies: + esbuild: 0.21.5 + get-tsconfig: 4.7.5 + optionalDependencies: + fsevents: 2.3.3 + tty-table@4.1.6: dependencies: chalk: 4.1.2 @@ -23841,6 +26172,14 @@ snapshots: wcwidth: 1.0.1 yargs: 17.7.2 + tuf-js@2.2.1: + dependencies: + '@tufjs/models': 2.0.1 + debug: 4.3.4 + make-fetch-happen: 13.0.1 + transitivePeerDependencies: + - supports-color + tunnel@0.0.6: {} tween-functions@1.2.0: {} @@ -23855,6 +26194,8 @@ snapshots: type-detect@4.0.8: {} + type-fest@0.12.0: {} + type-fest@0.13.1: {} type-fest@0.20.2: {} @@ -23914,8 +26255,12 @@ snapshots: typescript@5.0.2: {} + typescript@5.2.2: {} + typescript@5.3.3: {} + typescript@5.5.2: {} + ua-parser-js@1.0.37: {} ufo@1.5.2: {} @@ -23963,6 +26308,14 @@ snapshots: trough: 1.0.5 vfile: 4.2.1 + unique-filename@3.0.0: + dependencies: + unique-slug: 4.0.0 + + unique-slug@4.0.0: + dependencies: + imurmurhash: 0.1.4 + unist-builder@2.0.3: {} unist-util-generated@1.1.6: {} @@ -24075,6 +26428,8 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + validate-npm-package-name@5.0.1: {} + vary@1.1.2: {} vfile-location@3.2.0: {} @@ -24301,6 +26656,8 @@ snapshots: transitivePeerDependencies: - debug + walk-up-path@3.0.1: {} + walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -24398,11 +26755,19 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.1 + why-is-node-running@2.2.2: dependencies: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + word-wrap@1.2.3: {} wrap-ansi@6.2.0: @@ -24481,10 +26846,16 @@ snapshots: yallist@5.0.0: {} + yaml-types@0.3.0(yaml@2.4.5): + dependencies: + yaml: 2.4.5 + yaml@1.10.2: {} yaml@2.3.3: {} + yaml@2.4.5: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -24541,6 +26912,8 @@ snapshots: yocto-queue@1.0.0: {} + yoga-wasm-web@0.3.3: {} + zod-to-ts@1.2.0(typescript@5.3.3)(zod@3.22.4): dependencies: typescript: 5.3.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 43fd2c458ab..c7e68892b3e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,3 +3,5 @@ packages: - packages/toolkit/* - packages/connectors/* - "!packages/connectors/templates" + # OGCIO - adding mygovid mock service + - mygovid-mock-service