diff --git a/.eslintignore b/.eslintignore index 892766b8d0f724da72ee7851ae70f0f2c9112f5b..29f342762fe4c4b3e973308efeec09fa76f41403 100644 --- a/.eslintignore +++ b/.eslintignore @@ -11,6 +11,7 @@ # ... in these directories !apps/**/src/* +!devtools/**/src/* # Explicitly ignore these locations node_modules diff --git a/.eslintrc.js b/.eslintrc.js index ea1bd6870892fbad2a4710ddef21427f95ba724e..508d96f777f3ff94714e2031f21506ea638f83eb 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,7 +20,7 @@ module.exports = { }, 'import/resolver': { typescript: { - project: 'packages/*/tsconfig.json', + project: ['apps/*/tsconfig.json', 'devtools/tsconfig.json'], alwaysTryTypes: true, }, }, @@ -75,7 +75,7 @@ module.exports = { }, overrides: [ { - files: ['*.spec.ts', '*.e2e-spec.ts', '**/tests/**', 'scripts/*.ts', 'scripts/*.mts'], + files: ['*.spec.ts', '*.e2e-spec.ts', '**/tests/**', '**/test/**'], env: { jest: true, node: true, @@ -89,5 +89,11 @@ module.exports = { ], }, }, + { + files: ['devtools/**/*.ts'], + rules: { + 'no-console': 'off', + } + } ], }; diff --git a/.prettierignore b/.prettierignore index a284c15c18615f584ce8aa91dc882d7805f64003..13a9a3ff23d91342416e0c731651370006089077 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,6 +4,7 @@ # Except for these files !*.ts !*.d.ts +!*.mts !jest.config.js # .. also in subdirectories @@ -11,6 +12,7 @@ # ... in these ones !apps/**/src/* +!devtools/**/src/* # Explicitly ignore these locations node_modules diff --git a/Dockerfile b/Dockerfile index 6e97f74190bb67cd08da194b51ec3de19d94ff2b..a8091f669f14ea047e36a7739f23cc0c19a63ed9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# Base +# Base FROM node:20 AS base ARG APP_HOME=/home/node/app @@ -8,27 +8,64 @@ WORKDIR ${APP_HOME} RUN corepack enable -# Build -FROM base AS build - -ARG APP_HOME=/home/node/app -WORKDIR ${APP_HOME} +# Dependencies +FROM base AS dependencies COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig*.json .swcrc ./ -COPY apps/${SERVICE}/package.json ./apps/${SERVICE}/ +COPY patches ./patches COPY apps/shared/package.json ./apps/shared/ - +COPY devtools/package.json ./devtools/ RUN pnpm install --frozen-lockfile -COPY apps/${SERVICE} ./apps/${SERVICE} +# Build shared +FROM base AS build-shared + COPY apps/shared ./apps/shared +COPY --from=dependencies ${APP_HOME}/package.json ${APP_HOME}/pnpm-lock.yaml ${APP_HOME}/pnpm-workspace.yaml ${APP_HOME}/tsconfig*.json ${APP_HOME}/.swcrc ./ +COPY --from=dependencies ${APP_HOME}/node_modules ./node_modules +COPY --from=dependencies ${APP_HOME}/apps/shared/node_modules ./apps/shared/node_modules +COPY --from=dependencies ${APP_HOME}/patches ./patches RUN pnpm --filter shared build -RUN pnpm --filter ${SERVICE} build -RUN pnpm --filter ${SERVICE} --prod deploy build -RUN pnpm --filter shared --prod deploy shared + +# Build DevTools +FROM base AS build-devtools + +COPY --from=dependencies ${APP_HOME}/package.json ${APP_HOME}/pnpm-lock.yaml ${APP_HOME}/pnpm-workspace.yaml ${APP_HOME}/tsconfig*.json ${APP_HOME}/.swcrc ./ +COPY --from=dependencies ${APP_HOME}/node_modules ./node_modules +COPY --from=dependencies ${APP_HOME}/devtools/node_modules ./devtools/node_modules +COPY --from=dependencies ${APP_HOME}/patches ./patches +COPY --from=build-shared ${APP_HOME}/apps/shared ./apps/shared +COPY devtools ./devtools +RUN pnpm --filter devtools build && pnpm --filter devtools --prod deploy build + +# Final devtools +FROM node:20-slim AS devtools + +ARG APP_HOME=/home/node/app +ARG NODE_ENV=production +ENV NODE_ENV=${NODE_ENV} + +WORKDIR ${APP_HOME} +CMD ["node", "dist/server.js"] + +COPY --from=build-devtools --chown=node:node ${APP_HOME}/build/dist ./dist +COPY --from=build-devtools --chown=node:node ${APP_HOME}/build/node_modules ./node_modules +COPY --from=build-devtools --chown=node:node ${APP_HOME}/build/package.json . + +USER node + +# Build service +FROM base AS build-service + +COPY --from=dependencies ${APP_HOME}/package.json ${APP_HOME}/pnpm-lock.yaml ${APP_HOME}/pnpm-workspace.yaml ${APP_HOME}/tsconfig*.json ${APP_HOME}/.swcrc ./ +COPY --from=dependencies ${APP_HOME}/node_modules ./node_modules +COPY --from=dependencies ${APP_HOME}/patches ./patches +COPY --from=build-shared ${APP_HOME}/apps/shared ./apps/shared +COPY apps/${SERVICE} ./apps/${SERVICE} +RUN pnpm install --frozen-lockfile && pnpm --filter ${SERVICE} build && pnpm --filter ${SERVICE} --prod deploy build # Final -FROM node:20 AS final +FROM node:20-slim AS final ARG APP_HOME=/home/node/app ARG NODE_ENV=production @@ -37,15 +74,14 @@ ENV NODE_ENV=${NODE_ENV} WORKDIR ${APP_HOME} CMD ["node", "dist/main.js"] -COPY --from=build --chown=node:node ${APP_HOME}/build/dist ./dist -COPY --from=build --chown=node:node ${APP_HOME}/shared/dist ./shared -COPY --from=build --chown=node:node ${APP_HOME}/build/node_modules ./node_modules -COPY --from=build --chown=node:node ${APP_HOME}/build/package.json . +COPY --from=build-service --chown=node:node ${APP_HOME}/build/dist ./dist +COPY --from=build-service --chown=node:node ${APP_HOME}/build/node_modules ./node_modules +COPY --from=build-service --chown=node:node ${APP_HOME}/build/package.json . -# Cut unnecessary stuff from package.json. Only leave name, version and module type +# Cut unnecessary stuff from package.json. Only leave name, version, description and module type RUN node -e "\ - const { name, version, type } = JSON.parse(fs.readFileSync('./package.json', 'utf-8'));\ - fs.writeFileSync('./package.json', JSON.stringify({ name, version, type }, null, 2));\ + const { name, description, version, type } = JSON.parse(fs.readFileSync('./package.json', 'utf-8'));\ + fs.writeFileSync('./package.json', JSON.stringify({ name, version, description, type }, null, 2));\ " USER node diff --git a/apps/connection-manager/.env.example b/apps/connection-manager/.env.example index d1d46744defc1de3ef2ef1551a8173925a310a75..231dd50847e8d01375600838419e0c3c1dc7915d 100644 --- a/apps/connection-manager/.env.example +++ b/apps/connection-manager/.env.example @@ -1,6 +1,6 @@ -HTTP_HOST=0.0.0.0 -HTTP_PORT=3002 +HTTP_HOSTNAME=0.0.0.0 +HTTP_PORT=4002 NATS_URL=nats://localhost:4222 NATS_USER=nats_user -NATS_PASSWORD= +NATS_PASSWORD=nats_password NATS_MONITORING_URL=http://localhost:8222 diff --git a/apps/connection-manager/package.json b/apps/connection-manager/package.json index 84418005c8c77f0c0a12c0e3ccf1312cc57c39c6..f3012db1e1b87f42df41dff396bdedd40192ef06 100644 --- a/apps/connection-manager/package.json +++ b/apps/connection-manager/package.json @@ -1,7 +1,7 @@ { "name": "@ocm/connection-manager", "version": "1.0.0", - "description": "Connection Manager for OCM", + "description": "Gaia-X OCM Connection Manager", "contributors": [ "Konstantin Tsabolov <konstantin.tsabolov@spherity.com>" ], @@ -16,35 +16,36 @@ "test": "jest" }, "dependencies": { - "@nestjs/common": "^10.3.0", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.3.0", - "@nestjs/microservices": "^10.3.0", - "@nestjs/platform-express": "^10.3.0", - "@nestjs/schedule": "^4.0.0", - "@nestjs/swagger": "^7.1.17", + "@nestjs/common": "10.3.3", + "@nestjs/config": "3.2.0", + "@nestjs/core": "10.3.3", + "@nestjs/microservices": "10.3.3", + "@nestjs/platform-express": "10.3.3", + "@nestjs/schedule": "4.0.1", + "@nestjs/swagger": "7.3.0", "@ocm/shared": "workspace:*", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "express": "^4.17.3", - "joi": "^17.11.0", - "nats": "^2.18.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" + "class-transformer": "0.5.1", + "class-validator": "0.14.1", + "express": "4.18.2", + "helmet": "7.1.0", + "joi": "17.12.1", + "nats": "2.19.0", + "reflect-metadata": "0.2.1", + "rxjs": "7.8.1" }, "devDependencies": { - "@jest/globals": "^29.7.0", - "@nestjs/cli": "^10.2.1", - "@nestjs/schematics": "^10.0.3", - "@nestjs/testing": "^10.3.0", - "@swc/cli": "^0.1.63", - "@swc/core": "^1.3.101", - "@swc/jest": "^0.2.29", - "@types/express": "^4.17.21", - "@types/jest": "29.5.11", - "@types/node": "^20.10.5", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "typescript": "^5.3.3" + "@jest/globals": "29.7.0", + "@nestjs/cli": "10.3.2", + "@nestjs/schematics": "10.1.1", + "@nestjs/testing": "10.3.3", + "@swc/cli": "0.3.9", + "@swc/core": "1.4.2", + "@swc/jest": "0.2.36", + "@types/express": "4.17.21", + "@types/jest": "29.5.12", + "@types/node": "20.11.19", + "jest": "29.7.0", + "rimraf": "5.0.5", + "typescript": "5.3.3" } } diff --git a/apps/connection-manager/src/application.ts b/apps/connection-manager/src/application.ts index 3ea98e396c90242b557c98e1aacb1580503fe519..e8cc292c369fe1aeb75cba0b5194eee1e10282b8 100644 --- a/apps/connection-manager/src/application.ts +++ b/apps/connection-manager/src/application.ts @@ -1,10 +1,10 @@ +import type { OnApplicationBootstrap } from '@nestjs/common'; import type { ConfigType } from '@nestjs/config'; -import type { ClientProvider } from '@nestjs/microservices'; -import { Module } from '@nestjs/common'; +import { Inject, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { RouterModule } from '@nestjs/core'; -import { ClientsModule, Transport } from '@nestjs/microservices'; +import { ClientProxy, ClientsModule, Transport } from '@nestjs/microservices'; import { HealthModule } from '@ocm/shared'; import { NATS_CLIENT } from './common/constants.js'; @@ -34,21 +34,14 @@ import { InvitationsModule } from './invitations/invitations.module.js'; { name: NATS_CLIENT, inject: [natsConfig.KEY], - useFactory: (config: ConfigType<typeof natsConfig>) => { - const provider: Required<ClientProvider> = { - transport: Transport.NATS, - options: { - servers: config.url as string, - }, - }; - - if ('user' in config && 'password' in config) { - provider.options.user = config.user as string; - provider.options.pass = config.password as string; - } - - return provider; - }, + useFactory: (config: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { + servers: [config.url], + user: config.user, + pass: config.password, + }, + }), }, ], }), @@ -78,4 +71,12 @@ import { InvitationsModule } from './invitations/invitations.module.js'; ]), ], }) -export class Application {} +export class Application implements OnApplicationBootstrap { + public constructor( + @Inject(NATS_CLIENT) private readonly client: ClientProxy, + ) {} + + public async onApplicationBootstrap(): Promise<void> { + await this.client.connect(); + } +} diff --git a/apps/connection-manager/src/config/http.config.ts b/apps/connection-manager/src/config/http.config.ts index fc63fd9ddbe4bfb6b1d8225d636d3dee1f284502..c7b07c2dfdb215018bf33eb2083541e6809bdcd2 100644 --- a/apps/connection-manager/src/config/http.config.ts +++ b/apps/connection-manager/src/config/http.config.ts @@ -1,6 +1,6 @@ import { registerAs } from '@nestjs/config'; export const httpConfig = registerAs('http', () => ({ - host: process.env.HOST || '0.0.0.0', - port: Number(process.env.PORT) || 3000, + hostname: process.env.HTTP_HOSTNAME || '0.0.0.0', + port: Number(process.env.HTTP_PORT) || 3000, })); diff --git a/apps/connection-manager/src/config/validation.ts b/apps/connection-manager/src/config/validation.ts index e9abf25ab2e96d0fc30843b3dba5147b4b91074b..f963431550e25f1fe5f7db6fca536ffbb0c80144 100644 --- a/apps/connection-manager/src/config/validation.ts +++ b/apps/connection-manager/src/config/validation.ts @@ -1,7 +1,7 @@ import Joi from 'joi'; export const validationSchema = Joi.object({ - HTTP_HOST: Joi.string(), + HTTP_HOSTNAME: Joi.string(), HTTP_PORT: Joi.number(), NATS_URL: Joi.string().uri(), diff --git a/apps/connection-manager/src/main.ts b/apps/connection-manager/src/main.ts index 24529e4abd0e91dc32fac0f80836a4d3d98834a9..a09508e0ff966a90dec1c104201b5cac6aefa470 100644 --- a/apps/connection-manager/src/main.ts +++ b/apps/connection-manager/src/main.ts @@ -1,37 +1,22 @@ /* c8 ignore start */ import type { ConfigType } from '@nestjs/config'; -import type { MicroserviceOptions, NatsOptions } from '@nestjs/microservices'; -import { VersioningType } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; +import { Logger, VersioningType } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; -import { Transport } from '@nestjs/microservices'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import helmet from 'helmet'; +import { createRequire } from 'module'; +import { resolve } from 'node:path'; import { Application } from './application.js'; -import { natsConfig } from './config/nats.config.js'; +import { httpConfig } from './config/http.config.js'; -const app = await NestFactory.create(Application); -const configService = app.get(ConfigService); -app.enableCors(); - -const { url, user, password } = app.get(natsConfig.KEY) as ConfigType< - typeof natsConfig ->; +const pkgPath = resolve('package.json'); +const pkg = createRequire(import.meta.url)(pkgPath); -const microserviceOptions: Required<NatsOptions> = { - transport: Transport.NATS, - options: { - servers: [url], - }, -}; - -if (user && password) { - microserviceOptions.options.user = user; - microserviceOptions.options.pass = password; -} +const app = await NestFactory.create(Application); -app.connectMicroservice<MicroserviceOptions>(microserviceOptions); +app.use(helmet()); app.enableVersioning({ defaultVersion: ['1'], @@ -39,15 +24,24 @@ app.enableVersioning({ }); const swaggerConfig = new DocumentBuilder() - .setTitle('Gaia-X Connection Manager API') - .setDescription('API documentation for GAIA-X Connection Manager') - .setVersion('1.0') + .setTitle(pkg.description) + .setVersion(pkg.version) .build(); const document = SwaggerModule.createDocument(app, swaggerConfig); -SwaggerModule.setup('/swagger', app, document); -await app.startAllMicroservices(); +SwaggerModule.setup('/', app, document, { + swaggerOptions: { + docExpansion: 'none', + tryItOutEnabled: true, + }, +}); + +const { hostname, port } = app.get(httpConfig.KEY) as ConfigType< + typeof httpConfig +>; +await app.listen(port, hostname); + +Logger.log(`Application is running on: ${await app.getUrl()}`); -await app.listen(configService.get('http.port') as number); /* c8 ignore stop */ diff --git a/apps/credential-manager/.env.example b/apps/credential-manager/.env.example index 81e338c600aff9acfc4c2bd25d9bf1fd6175ac59..46fb0f12c103b103384fc98ba4fe8074572450c0 100644 --- a/apps/credential-manager/.env.example +++ b/apps/credential-manager/.env.example @@ -1,6 +1,6 @@ -HTTP_HOST=0.0.0.0 -HTTP_PORT=3003 +HTTP_HOSTNAME=0.0.0.0 +HTTP_PORT=4003 NATS_URL=nats://localhost:4222 NATS_USER=nats_user -NATS_PASSWORD= +NATS_PASSWORD=nats_password NATS_MONITORING_URL=http://localhost:8222 diff --git a/apps/credential-manager/package.json b/apps/credential-manager/package.json index f245d888226d923ef8d7884aaa37dd6ec0410f71..804023066064e5bdb81b1fa6f06a926055a59fdd 100644 --- a/apps/credential-manager/package.json +++ b/apps/credential-manager/package.json @@ -1,7 +1,7 @@ { "name": "@ocm/credential-manager", "version": "1.0.0", - "description": "", + "description": "Gaia-X OCM Credential Manager", "author": "Konstantin Tsabolov <konstantin.tsabolov@spherity.com>", "contributors": [ "Konstantin Tsabolov <konstantin.tsabolov@spherity.com>" @@ -17,37 +17,37 @@ "test": "jest" }, "dependencies": { - "@nestjs/common": "^10.3.0", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.3.0", - "@nestjs/microservices": "^10.3.0", - "@nestjs/platform-express": "^10.3.0", - "@nestjs/swagger": "^7.1.16", + "@nestjs/common": "10.3.3", + "@nestjs/config": "3.2.0", + "@nestjs/core": "10.3.3", + "@nestjs/microservices": "10.3.3", + "@nestjs/platform-express": "10.3.3", + "@nestjs/schedule": "4.0.1", + "@nestjs/swagger": "7.3.0", "@ocm/shared": "workspace:*", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "express": "^4.17.3", - "joi": "^17.11.0", - "nats": "^2.18.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" + "class-transformer": "0.5.1", + "class-validator": "0.14.1", + "express": "4.18.2", + "helmet": "7.1.0", + "joi": "17.12.1", + "nats": "2.19.0", + "reflect-metadata": "0.2.1", + "rxjs": "7.8.1" }, "devDependencies": { - "@nestjs/cli": "^10.3.0", - "@nestjs/schematics": "^10.1.0", - "@nestjs/testing": "^10.3.0", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.96", - "@swc/jest": "^0.2.29", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.8", - "@types/jsonwebtoken": "^9.0.5", - "@types/node": "^20.9.0", - "@types/supertest": "^2.0.16", - "dotenv-cli": "^7.3.0", - "eslint": "^8.53.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "typescript": "^5.3.2" + "@nestjs/cli": "10.3.2", + "@nestjs/schematics": "10.1.1", + "@nestjs/testing": "10.3.3", + "@swc/cli": "0.3.9", + "@swc/core": "1.4.2", + "@swc/jest": "0.2.36", + "@types/express": "4.17.21", + "@types/jest": "29.5.12", + "@types/node": "20.11.19", + "dotenv-cli": "7.3.0", + "eslint": "8.56.0", + "jest": "29.7.0", + "rimraf": "5.0.5", + "typescript": "5.3.3" } } diff --git a/apps/credential-manager/src/application.ts b/apps/credential-manager/src/application.ts index b6f3afd51c7a22ded613751a8a91dbdf07723fba..c79254192f3d8c280488da248dd4dab607b125ac 100644 --- a/apps/credential-manager/src/application.ts +++ b/apps/credential-manager/src/application.ts @@ -1,25 +1,27 @@ +import type { OnApplicationBootstrap } from '@nestjs/common'; import type { ConfigType } from '@nestjs/config'; -import type { ClientProvider } from '@nestjs/microservices'; -import { Module } from '@nestjs/common'; +import { Inject, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { RouterModule } from '@nestjs/core'; -import { ClientsModule, Transport } from '@nestjs/microservices'; +import { ClientProxy, ClientsModule, Transport } from '@nestjs/microservices'; import { HealthModule } from '@ocm/shared'; import { NATS_CLIENT } from './common/constants.js'; import { httpConfig } from './config/http.config.js'; import { natsConfig } from './config/nats.config.js'; +import { policiesConfig } from './config/policies.config.js'; import { validationSchema } from './config/validation.js'; import { CredentialOffersModule } from './credential-offers/credential-offers.module.js'; import { CredentialRequestsModule } from './credential-requests/credential-requests.module.js'; import { CredentialsModule } from './credentials/credentials.module.js'; +import { PoliciesModule } from './policies/policies.module.js'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, - load: [httpConfig, natsConfig], + load: [httpConfig, natsConfig, policiesConfig], cache: true, expandVariables: true, validationSchema, @@ -35,21 +37,14 @@ import { CredentialsModule } from './credentials/credentials.module.js'; { name: NATS_CLIENT, inject: [natsConfig.KEY], - useFactory: (config: ConfigType<typeof natsConfig>) => { - const provider: Required<ClientProvider> = { - transport: Transport.NATS, - options: { - servers: config.url as string, - }, - }; - - if ('user' in config && 'password' in config) { - provider.options.user = config.user as string; - provider.options.pass = config.password as string; - } - - return provider; - }, + useFactory: (config: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { + servers: [config.url], + user: config.user as string, + pass: config.password as string, + }, + }), }, ], }), @@ -72,13 +67,23 @@ import { CredentialsModule } from './credentials/credentials.module.js'; CredentialsModule, CredentialOffersModule, CredentialRequestsModule, + PoliciesModule, RouterModule.register([ { module: HealthModule, path: '/health' }, { module: CredentialsModule, path: '/credentials' }, { module: CredentialOffersModule, path: '/credential-offers' }, { module: CredentialRequestsModule, path: '/credential-requests' }, + { module: PoliciesModule, path: '/policies' }, ]), ], }) -export class Application {} +export class Application implements OnApplicationBootstrap { + public constructor( + @Inject(NATS_CLIENT) private readonly client: ClientProxy, + ) {} + + public async onApplicationBootstrap(): Promise<void> { + await this.client.connect(); + } +} diff --git a/apps/credential-manager/src/config/http.config.ts b/apps/credential-manager/src/config/http.config.ts index fc63fd9ddbe4bfb6b1d8225d636d3dee1f284502..c7b07c2dfdb215018bf33eb2083541e6809bdcd2 100644 --- a/apps/credential-manager/src/config/http.config.ts +++ b/apps/credential-manager/src/config/http.config.ts @@ -1,6 +1,6 @@ import { registerAs } from '@nestjs/config'; export const httpConfig = registerAs('http', () => ({ - host: process.env.HOST || '0.0.0.0', - port: Number(process.env.PORT) || 3000, + hostname: process.env.HTTP_HOSTNAME || '0.0.0.0', + port: Number(process.env.HTTP_PORT) || 3000, })); diff --git a/apps/credential-manager/src/config/policies.config.ts b/apps/credential-manager/src/config/policies.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..b801a3e691880ca73f768e7a92b7dbf5b2c41f02 --- /dev/null +++ b/apps/credential-manager/src/config/policies.config.ts @@ -0,0 +1,37 @@ +import { registerAs } from '@nestjs/config'; + +export const policiesConfig = registerAs( + 'policies', + (): { + url?: string; + autoRevocation: { + policy?: `${string}/${string}/${string}/${string}`; + }; + autoReissue: { + policy?: `${string}/${string}/${string}/${string}`; + }; + refresh: { + policy?: `${string}/${string}/${string}/${string}`; + }; + } => ({ + url: process.env.POLICIES_URL, + autoRevocation: { + policy: + (process.env.POLICIES_AUTO_REVOCATION_POLICY as + | `${string}/${string}/${string}/${string}` + | undefined) || undefined, + }, + autoReissue: { + policy: + (process.env.POLICIES_AUTO_REISSUE_POLICY as + | `${string}/${string}/${string}/${string}` + | undefined) || undefined, + }, + refresh: { + policy: + (process.env.POLICIES_REFRESH_POLICY as + | `${string}/${string}/${string}/${string}` + | undefined) || undefined, + }, + }), +); diff --git a/apps/credential-manager/src/config/validation.ts b/apps/credential-manager/src/config/validation.ts index e9abf25ab2e96d0fc30843b3dba5147b4b91074b..b7dba0936fbccafec8a7160e7a014dc75149bcff 100644 --- a/apps/credential-manager/src/config/validation.ts +++ b/apps/credential-manager/src/config/validation.ts @@ -1,11 +1,16 @@ import Joi from 'joi'; export const validationSchema = Joi.object({ - HTTP_HOST: Joi.string(), + HTTP_HOSTNAME: Joi.string(), HTTP_PORT: Joi.number(), NATS_URL: Joi.string().uri(), NATS_USER: Joi.string().optional(), NATS_PASSWORD: Joi.string().optional(), NATS_MONITORING_URL: Joi.string().uri(), + + POLICIES_URL: Joi.string().uri(), + POLICIES_AUTO_REVOCATION_POLICY: Joi.string(), + POLICIES_AUTO_REISSUE_POLICY: Joi.string(), + POLICIES_REFRESH_POLICY: Joi.string(), }); diff --git a/apps/credential-manager/src/credential-offers/credential-offers.controller.ts b/apps/credential-manager/src/credential-offers/credential-offers.controller.ts index 8a00d0165af0252e9cc36a7116c04d3be9114086..b140d9b939ed31f7d353ab09af2c8d20bfb3a68d 100644 --- a/apps/credential-manager/src/credential-offers/credential-offers.controller.ts +++ b/apps/credential-manager/src/credential-offers/credential-offers.controller.ts @@ -15,7 +15,7 @@ import { MultitenancyParams, ResponseFormatInterceptor } from '@ocm/shared'; import { CredentialOffersService } from './credential-offers.service.js'; import { GetByIdParams } from './dto/get-by-id.dto.js'; -import { OfferPayload } from './dto/offer.dto.js'; +import { OfferPayload, OfferPayloadSelf } from './dto/offer.dto.js'; @Controller() @UsePipes(new ValidationPipe({ transform: true, whitelist: true })) @@ -58,13 +58,6 @@ export class CredentialOffersController { 'application/json': { schema: {}, examples: { - 'Credential offer not found': { - value: { - statusCode: 404, - message: 'Credential offer not found', - data: null, - }, - }, 'Tenant not found': { value: { statusCode: 404, @@ -249,13 +242,20 @@ export class CredentialOffersController { }) public offer( @Query() { tenantId }: MultitenancyParams, - @Body() { connectionId, credentialDefinitionId, attributes }: OfferPayload, + @Body() + { + connectionId, + credentialDefinitionId, + attributes, + revocationRegistryDefinitionId, + }: OfferPayload, ) { return this.service.offer( tenantId, connectionId, credentialDefinitionId, attributes, + revocationRegistryDefinitionId, ); } @@ -337,7 +337,7 @@ export class CredentialOffersController { public offerToSelf( @Query() { tenantId }: MultitenancyParams, @Body() - { credentialDefinitionId, attributes }: Omit<OfferPayload, 'connectionId'>, + { credentialDefinitionId, attributes }: OfferPayloadSelf, ) { return this.service.offerToSelf( tenantId, @@ -345,4 +345,78 @@ export class CredentialOffersController { attributes, ); } + + @Post(':credentialOfferId/accept') + @ApiOperation({ + summary: 'Accept a credential offer', + description: 'This call accepts a credential offer for a given ID', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential offer accepted successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential offer accepted successfully': { + value: { + statusCode: 200, + message: 'Credential offer accepted successfully', + data: { + id: '71b784a3', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential offer not found': { + value: { + statusCode: 404, + message: 'Credential offer not found', + data: null, + }, + }, + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Something went wrong', + content: { + 'application/json': { + schema: {}, + examples: { + 'Something went wrong': { + value: { + statusCode: 500, + message: 'Something went wrong', + error: 'Internal Server Error', + }, + }, + }, + }, + }, + }) + public acceptOffer( + @Param() { credentialOfferId }: GetByIdParams, + @Query() { tenantId }: MultitenancyParams, + ) { + return this.service.acceptOffer(tenantId, credentialOfferId); + } } diff --git a/apps/credential-manager/src/credential-offers/credential-offers.service.ts b/apps/credential-manager/src/credential-offers/credential-offers.service.ts index 6a5426067b428a878a3ba5d89035175f857f8ff0..858d06662aea0be99dfbd6f844a1941b8f442092 100644 --- a/apps/credential-manager/src/credential-offers/credential-offers.service.ts +++ b/apps/credential-manager/src/credential-offers/credential-offers.service.ts @@ -1,6 +1,7 @@ import type { EventAnonCredsCredentialOfferGetAllInput, EventAnonCredsCredentialOfferGetByIdInput, + EventDidcommAnonCredsCredentialsAcceptOfferInput, EventDidcommAnonCredsCredentialsOfferInput, EventDidcommAnonCredsCredentialsOfferToSelfInput, } from '@ocm/shared'; @@ -9,6 +10,7 @@ import type { Observable } from 'rxjs'; import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; import { + EventDidcommAnonCredsCredentialsAcceptOffer, EventDidcommAnonCredsCredentialsOffer, EventDidcommAnonCredsCredentialsOfferToSelf, EventAnonCredsCredentialOfferGetAll, @@ -50,6 +52,7 @@ export class CredentialOffersService { connectionId: string, credentialDefinitionId: string, attributes: EventDidcommAnonCredsCredentialsOfferInput['attributes'], + revocationRegistryDefinitionId?: string, ): Observable<EventDidcommAnonCredsCredentialsOffer['data']> { return this.natsClient .send< @@ -60,6 +63,7 @@ export class CredentialOffersService { connectionId, credentialDefinitionId, attributes, + revocationRegistryDefinitionId, }) .pipe(map(({ data }) => data)); } @@ -80,4 +84,16 @@ export class CredentialOffersService { }) .pipe(map(({ data }) => data)); } + + public acceptOffer(tenantId: string, credentialId: string) { + return this.natsClient + .send< + EventDidcommAnonCredsCredentialsAcceptOffer, + EventDidcommAnonCredsCredentialsAcceptOfferInput + >(EventDidcommAnonCredsCredentialsAcceptOffer.token, { + tenantId, + credentialId, + }) + .pipe(map(({ data }) => data)); + } } diff --git a/apps/credential-manager/src/credential-offers/dto/offer.dto.ts b/apps/credential-manager/src/credential-offers/dto/offer.dto.ts index 618ac356f7fa9fac4ac0fef9e4ea3bf237a4237e..40ffcde3d401dbaf3fec0f4cd10004104c17f342 100644 --- a/apps/credential-manager/src/credential-offers/dto/offer.dto.ts +++ b/apps/credential-manager/src/credential-offers/dto/offer.dto.ts @@ -1,9 +1,69 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { + IsArray, + IsNotEmpty, + IsOptional, + IsString, + ValidateNested, +} from 'class-validator'; + +class Attribute { + @IsString() + @IsNotEmpty() + @ApiProperty() + public name: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + public value: string; + + @IsString() + @IsOptional() + @ApiPropertyOptional() + public mimeType?: string; +} + export class OfferPayload { + @IsString() + @IsNotEmpty() + @ApiProperty() public connectionId: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + public credentialDefinitionId: string; + + @IsArray() + @ValidateNested() + @Type(() => Attribute) + @ApiProperty({ type: [Attribute] }) + public attributes: Attribute[]; + + @IsString() + @IsNotEmpty() + @IsOptional() + @ApiProperty() + public revocationRegistryDefinitionId?: string; +} + +export class OfferPayloadSelf { + @IsString() + @IsNotEmpty() + @ApiProperty() public credentialDefinitionId: string; - public attributes: Array<{ - name: string; - value: string; - mimeType?: string; - }>; + + @IsArray() + @ValidateNested() + @Type(() => Attribute) + @ApiProperty({ type: [Attribute] }) + public attributes: Attribute[]; + + @IsString() + @IsNotEmpty() + @IsOptional() + @ApiProperty() + public revocationRegistryDefinitionId?: string; } diff --git a/apps/credential-manager/src/credentials/credentials.controller.ts b/apps/credential-manager/src/credentials/credentials.controller.ts index 8cb56ca1fc0dd0fd0af79d6d1436e51373773586..0351e92ab63367a38a589f771c80e6f9ce8de5de 100644 --- a/apps/credential-manager/src/credentials/credentials.controller.ts +++ b/apps/credential-manager/src/credentials/credentials.controller.ts @@ -2,8 +2,10 @@ import { Controller, Delete, Get, + HttpCode, HttpStatus, Param, + Post, Query, UseInterceptors, UsePipes, @@ -15,6 +17,7 @@ import { MultitenancyParams, ResponseFormatInterceptor } from '@ocm/shared'; import { CredentialsService } from './credentials.service.js'; import { DeleteParams } from './dto/delete.dto.js'; import { GetParams } from './dto/get.dto.js'; +import { RevokeParams } from './dto/revoke.dto.js'; @Controller() @UsePipes(new ValidationPipe({ transform: true, whitelist: true })) @@ -88,7 +91,7 @@ export class CredentialsController { return this.service.find(tenantId); } - @Get(':credentialId') + @Get(':credentialRecordId') @ApiOperation({ summary: 'Fetch a credential', description: 'This call provides a credential for a given tenant', @@ -161,6 +164,78 @@ export class CredentialsController { return this.service.get(tenantId, credentialRecordId); } + @Post(':credentialId/revoke') + @HttpCode(HttpStatus.OK) + @ApiOperation({ + summary: 'Revoke a credential', + description: 'This call revokes a credential for a given tenant', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential revoked successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential revoked successfully': { + value: { + statusCode: 200, + message: 'Credential revoked successfully', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential not found': { + value: { + statusCode: 404, + message: 'Credential not found', + data: null, + }, + }, + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal server error': { + value: { + statusCode: 500, + message: 'Internal server error', + data: null, + }, + }, + }, + }, + }, + }) + public revoke( + @Query() { tenantId }: MultitenancyParams, + @Param() { credentialId }: RevokeParams, + ) { + return this.service.revoke(tenantId, credentialId); + } + @Delete(':credentialId') @ApiOperation({ summary: 'Delete a credential', diff --git a/apps/credential-manager/src/credentials/credentials.service.ts b/apps/credential-manager/src/credentials/credentials.service.ts index e5fe37ab648ada91fda9f26622c62c5e1844a8a4..f7c617cfac8b79186319ace150a115008b1ee3e8 100644 --- a/apps/credential-manager/src/credentials/credentials.service.ts +++ b/apps/credential-manager/src/credentials/credentials.service.ts @@ -2,12 +2,14 @@ import type { EventAnonCredsCredentialsDeleteByIdInput, EventAnonCredsCredentialsGetAllInput, EventAnonCredsCredentialsGetByIdInput, + EventAnonCredsRevocationRevokeInput, } from '@ocm/shared'; import type { Observable } from 'rxjs'; import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; import { + EventAnonCredsRevocationRevoke, EventAnonCredsCredentialsDeleteById, EventAnonCredsCredentialsGetAll, EventAnonCredsCredentialsGetById, @@ -47,6 +49,21 @@ export class CredentialsService { tenantId, credentialRecordId, }) + .pipe(map((response) => response.data)); + } + + public revoke( + tenantId: string, + credentialId: string, + ): Observable<EventAnonCredsRevocationRevoke['data']> { + return this.natsClient + .send< + EventAnonCredsRevocationRevoke, + EventAnonCredsRevocationRevokeInput + >(EventAnonCredsRevocationRevoke.token, { + tenantId, + credentialId, + }) .pipe(map(({ data }) => data)); } diff --git a/apps/credential-manager/src/credentials/dto/revoke.dto.ts b/apps/credential-manager/src/credentials/dto/revoke.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..e66a9f766a404b82e590f6ed9b216d1ad6ee51fc --- /dev/null +++ b/apps/credential-manager/src/credentials/dto/revoke.dto.ts @@ -0,0 +1,7 @@ +import { IsNotEmpty, IsString } from 'class-validator'; + +export class RevokeParams { + @IsString() + @IsNotEmpty() + public credentialId: string; +} diff --git a/apps/credential-manager/src/main.ts b/apps/credential-manager/src/main.ts index f2780c9feed00fd4c0b976d5d7dcd21e5f3acbd4..e926eb71b8974e653e16cfc7f2f68901303e2825 100644 --- a/apps/credential-manager/src/main.ts +++ b/apps/credential-manager/src/main.ts @@ -1,36 +1,22 @@ /* c8 ignore start */ import type { ConfigType } from '@nestjs/config'; -import type { MicroserviceOptions, NatsOptions } from '@nestjs/microservices'; import { Logger, VersioningType } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; -import { Transport } from '@nestjs/microservices'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import helmet from 'helmet'; +import { createRequire } from 'module'; +import { resolve } from 'node:path'; import { Application } from './application.js'; import { httpConfig } from './config/http.config.js'; -import { natsConfig } from './config/nats.config.js'; -const app = await NestFactory.create(Application); -app.enableCors(); - -const { url, user, password } = app.get(natsConfig.KEY) as ConfigType< - typeof natsConfig ->; - -const microserviceOptions: Required<NatsOptions> = { - transport: Transport.NATS, - options: { - servers: [url], - }, -}; +const pkgPath = resolve('package.json'); +const pkg = createRequire(import.meta.url)(pkgPath); -if (user && password) { - microserviceOptions.options.user = user; - microserviceOptions.options.pass = password; -} +const app = await NestFactory.create(Application); -app.connectMicroservice<MicroserviceOptions>(microserviceOptions); +app.use(helmet()); app.enableVersioning({ defaultVersion: ['1'], @@ -38,18 +24,23 @@ app.enableVersioning({ }); const swaggerConfig = new DocumentBuilder() - .setTitle('Gaia-X OCM Credential Manager API') - .setDescription('API documentation for Gaia-X OCM Credential Manager') - .setVersion('1.0') + .setTitle(pkg.description) + .setVersion(pkg.version) .build(); const document = SwaggerModule.createDocument(app, swaggerConfig); -SwaggerModule.setup('/swagger', app, document); -await app.startAllMicroservices(); +SwaggerModule.setup('/', app, document, { + swaggerOptions: { + docExpansion: 'none', + tryItOutEnabled: true, + }, +}); -const { host, port } = app.get(httpConfig.KEY) as ConfigType<typeof httpConfig>; -await app.listen(port as number, host as string); +const { hostname, port } = app.get(httpConfig.KEY) as ConfigType< + typeof httpConfig +>; +await app.listen(port, hostname); Logger.log(`Application is running on: ${await app.getUrl()}`); /* c8 ignore stop */ diff --git a/apps/credential-manager/src/policies/dto/policy.dto.ts b/apps/credential-manager/src/policies/dto/policy.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..8f487a69b76087763b048b0f46423cc27ab4fb7e --- /dev/null +++ b/apps/credential-manager/src/policies/dto/policy.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class PolicyParams { + @IsString() + @IsNotEmpty() + @ApiProperty({ + type: String, + description: 'The credential ID to check the policy for', + }) + public credentialId: string; +} diff --git a/apps/credential-manager/src/policies/policies.controller.ts b/apps/credential-manager/src/policies/policies.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..1a92ae1506d98ab160a195b6c28d4f086cda39e2 --- /dev/null +++ b/apps/credential-manager/src/policies/policies.controller.ts @@ -0,0 +1,234 @@ +import { + Body, + Controller, + HttpCode, + HttpStatus, + Post, + Query, + UseInterceptors, + UsePipes, + ValidationPipe, +} from '@nestjs/common'; +import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { MultitenancyParams, ResponseFormatInterceptor } from '@ocm/shared'; + +import { PolicyParams } from './dto/policy.dto.js'; +import { PoliciesService } from './policies.service.js'; + +@Controller() +@ApiTags('Policies') +@UsePipes(new ValidationPipe({ transform: true, whitelist: true })) +@UseInterceptors(new ResponseFormatInterceptor()) +export class PoliciesController { + public constructor(private readonly service: PoliciesService) {} + + @Post('check-reissue') + @HttpCode(HttpStatus.OK) + @ApiOperation({ + summary: 'Check if a credential can be reissued', + description: 'Check if a credential can be reissued', + }) + @ApiResponse({ + status: 200, + description: 'The result of the policy evaluation', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + result: { + type: 'boolean', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + content: { + 'application/json': { + schema: {}, + examples: { + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + 'Credential not found': { + value: { + statusCode: 404, + message: 'Credential not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal server error': { + value: { + statusCode: 500, + message: 'Internal server error', + data: null, + }, + }, + }, + }, + }, + }) + public async checkAutoReissue( + @Query() { tenantId }: MultitenancyParams, + @Body() { credentialId }: PolicyParams, + ) { + return this.service.checkAutoReissue(tenantId, credentialId); + } + + @Post('check-revocation') + @HttpCode(HttpStatus.OK) + @ApiOperation({ + summary: 'Check if a credential should be revoked', + description: 'Check if a credential should be revoked', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'The result of the policy evaluation', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + result: { + type: 'boolean', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + content: { + 'application/json': { + schema: {}, + examples: { + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + 'Credential not found': { + value: { + statusCode: 404, + message: 'Credential not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal server error': { + value: { + statusCode: 500, + message: 'Internal server error', + data: null, + }, + }, + }, + }, + }, + }) + public checkAutoRevocation( + @Query() { tenantId }: MultitenancyParams, + @Body() { credentialId }: PolicyParams, + ) { + return this.service.checkAutoRevocation(tenantId, credentialId); + } + + @Post('refresh') + @HttpCode(HttpStatus.OK) + @ApiOperation({ + summary: 'Check if a credential should be refreshed', + description: 'Check if a credential should be refreshed', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'The result of the policy evaluation', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + result: { + type: 'boolean', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + content: { + 'application/json': { + schema: {}, + examples: { + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + 'Credential not found': { + value: { + statusCode: 404, + message: 'Credential not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal server error': { + value: { + statusCode: 500, + message: 'Internal server error', + data: null, + }, + }, + }, + }, + }, + }) + public checkRefresh( + @Query() { tenantId }: MultitenancyParams, + @Body() { credentialId }: PolicyParams, + ) { + return this.service.checkRefresh(tenantId, credentialId); + } +} diff --git a/apps/credential-manager/src/policies/policies.module.ts b/apps/credential-manager/src/policies/policies.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..b162a8fdb09a295bef57a48dcba882ef30a3b59e --- /dev/null +++ b/apps/credential-manager/src/policies/policies.module.ts @@ -0,0 +1,23 @@ +import type { ConfigType } from '@nestjs/config'; + +import { Module } from '@nestjs/common'; +import { TSAModule } from '@ocm/shared'; + +import { policiesConfig } from '../config/policies.config.js'; + +import { PoliciesController } from './policies.controller.js'; +import { PoliciesService } from './policies.service.js'; + +@Module({ + imports: [ + TSAModule.registerAsync({ + inject: [policiesConfig.KEY], + useFactory: (config: ConfigType<typeof policiesConfig>) => ({ + tsaBaseUrl: config.url as string, + }), + }), + ], + providers: [PoliciesService], + controllers: [PoliciesController], +}) +export class PoliciesModule {} diff --git a/apps/credential-manager/src/policies/policies.service.ts b/apps/credential-manager/src/policies/policies.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..4872efcc046b350f14ed270a1304555c49e780e3 --- /dev/null +++ b/apps/credential-manager/src/policies/policies.service.ts @@ -0,0 +1,92 @@ +// eslint-disable-next-line @typescript-eslint/consistent-type-imports +import type { ConfigType } from '@nestjs/config'; +import type { EventAnonCredsCredentialsGetByIdInput } from '@ocm/shared'; + +import { Inject, Injectable, NotFoundException } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; +import { EventAnonCredsCredentialsGetById, TSAService } from '@ocm/shared'; +import { of, shareReplay, switchMap, throwError } from 'rxjs'; + +import { NATS_CLIENT } from '../common/constants.js'; +import { policiesConfig } from '../config/policies.config.js'; + +@Injectable() +export class PoliciesService { + public constructor( + @Inject(NATS_CLIENT) private readonly natsClient: ClientProxy, + @Inject(policiesConfig.KEY) + private readonly policiesParams: ConfigType<typeof policiesConfig>, + private readonly tsaService: TSAService, + ) {} + + private evaluatePolicy( + policy: `${string}/${string}/${string}/${string}`, + tenantId: string, + credentialId: string, + ) { + const getCredential$ = this.natsClient + .send< + EventAnonCredsCredentialsGetById, + EventAnonCredsCredentialsGetByIdInput + >(EventAnonCredsCredentialsGetById.token, { + tenantId, + credentialRecordId: credentialId, + }) + .pipe( + switchMap((credential) => { + if (!credential) { + return throwError( + () => new NotFoundException('Credential not found'), + ); + } + + return of(credential); + }), + shareReplay(), + ); + + return getCredential$.pipe( + switchMap(() => + this.tsaService.evaluatePolicy(policy, { + credentialId, + }), + ), + ); + } + + public checkAutoReissue(tenantId: string, credentialId: string) { + if (!this.policiesParams.autoReissue.policy) { + return { result: false }; + } + + return this.evaluatePolicy( + this.policiesParams.autoReissue.policy, + tenantId, + credentialId, + ); + } + + public checkAutoRevocation(tenantId: string, credentialId: string) { + if (!this.policiesParams.autoRevocation.policy) { + return { result: false }; + } + + return this.evaluatePolicy( + this.policiesParams.autoRevocation.policy, + tenantId, + credentialId, + ); + } + + public checkRefresh(tenantId: string, credentialId: string) { + if (!this.policiesParams.refresh.policy) { + return { result: false }; + } + + return this.evaluatePolicy( + this.policiesParams.refresh.policy, + tenantId, + credentialId, + ); + } +} diff --git a/apps/did-manager/.env.example b/apps/did-manager/.env.example new file mode 100644 index 0000000000000000000000000000000000000000..dfef64c27b6f38797f02d77f266bb6c44de4ff5f --- /dev/null +++ b/apps/did-manager/.env.example @@ -0,0 +1,6 @@ +HTTP_HOSTNAME=0.0.0.0 +HTTP_PORT=4006 +NATS_URL=nats://localhost:4222 +NATS_USER=nats_user +NATS_PASSWORD=nats_password +NATS_MONITORING_URL=http://localhost:8222 diff --git a/apps/did-manager/package.json b/apps/did-manager/package.json index 669db0a31c33af6771afadff248bd04fc512c268..4bc8358975be06b45ee158325f08fd73f7df28c7 100644 --- a/apps/did-manager/package.json +++ b/apps/did-manager/package.json @@ -17,33 +17,34 @@ "test": "jest" }, "dependencies": { - "@nestjs/common": "^10.3.0", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.3.0", - "@nestjs/microservices": "^10.3.0", - "@nestjs/platform-express": "^10.3.0", - "@nestjs/swagger": "^7.2.0", + "@nestjs/common": "10.3.3", + "@nestjs/config": "3.2.0", + "@nestjs/core": "10.3.3", + "@nestjs/microservices": "10.3.3", + "@nestjs/platform-express": "10.3.3", + "@nestjs/swagger": "7.3.0", "@ocm/shared": "workspace:*", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "express": "^4.17.3", - "joi": "^17.11.0", - "nats": "^2.18.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" + "class-transformer": "0.5.1", + "class-validator": "0.14.1", + "express": "4.18.2", + "helmet": "7.1.0", + "joi": "17.12.1", + "nats": "2.19.0", + "reflect-metadata": "0.2.1", + "rxjs": "7.8.1" }, "devDependencies": { - "@nestjs/cli": "^10.3.0", - "@nestjs/schematics": "^10.1.0", - "@nestjs/testing": "^10.3.0", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.96", - "@swc/jest": "^0.2.29", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.8", - "@types/node": "^20.9.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "typescript": "^5.3.2" + "@nestjs/cli": "10.3.2", + "@nestjs/schematics": "10.1.1", + "@nestjs/testing": "10.3.3", + "@swc/cli": "0.3.9", + "@swc/core": "1.4.2", + "@swc/jest": "0.2.36", + "@types/express": "4.17.21", + "@types/jest": "29.5.12", + "@types/node": "20.11.19", + "jest": "29.7.0", + "rimraf": "5.0.5", + "typescript": "5.3.3" } } diff --git a/apps/did-manager/src/application.ts b/apps/did-manager/src/application.ts index 8e4cea804ed728210217f9abc5f24645c6de7d23..81185d0e1262e5211a18e3884e059b4d66fefd6c 100644 --- a/apps/did-manager/src/application.ts +++ b/apps/did-manager/src/application.ts @@ -1,10 +1,10 @@ +import type { OnApplicationBootstrap } from '@nestjs/common'; import type { ConfigType } from '@nestjs/config'; -import type { ClientProvider } from '@nestjs/microservices'; -import { Module } from '@nestjs/common'; +import { Inject, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { RouterModule } from '@nestjs/core'; -import { ClientsModule, Transport } from '@nestjs/microservices'; +import { ClientProxy, ClientsModule, Transport } from '@nestjs/microservices'; import { HealthModule } from '@ocm/shared'; import { NATS_CLIENT } from './common/constants.js'; @@ -33,21 +33,14 @@ import { DIDsModule } from './dids/dids.module.js'; { name: NATS_CLIENT, inject: [natsConfig.KEY], - useFactory: (config: ConfigType<typeof natsConfig>) => { - const provider: Required<ClientProvider> = { - transport: Transport.NATS, - options: { - servers: config.url as string, - }, - }; - - if ('user' in config && 'password' in config) { - provider.options.user = config.user as string; - provider.options.pass = config.password as string; - } - - return provider; - }, + useFactory: (config: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { + servers: [config.url], + user: config.user as string, + pass: config.password as string, + }, + }), }, ], }), @@ -75,4 +68,12 @@ import { DIDsModule } from './dids/dids.module.js'; ]), ], }) -export class Application {} +export class Application implements OnApplicationBootstrap { + public constructor( + @Inject(NATS_CLIENT) private readonly client: ClientProxy, + ) {} + + public async onApplicationBootstrap(): Promise<void> { + await this.client.connect(); + } +} diff --git a/apps/did-manager/src/config/http.config.ts b/apps/did-manager/src/config/http.config.ts index dbf37be04aac09ddc3eba3e2eaa6db1b8b9ce1f8..c7b07c2dfdb215018bf33eb2083541e6809bdcd2 100644 --- a/apps/did-manager/src/config/http.config.ts +++ b/apps/did-manager/src/config/http.config.ts @@ -1,6 +1,6 @@ import { registerAs } from '@nestjs/config'; export const httpConfig = registerAs('http', () => ({ - host: process.env.HTTP_HOST || '0.0.0.0', + hostname: process.env.HTTP_HOSTNAME || '0.0.0.0', port: Number(process.env.HTTP_PORT) || 3000, })); diff --git a/apps/did-manager/src/config/validation.ts b/apps/did-manager/src/config/validation.ts index e9abf25ab2e96d0fc30843b3dba5147b4b91074b..f963431550e25f1fe5f7db6fca536ffbb0c80144 100644 --- a/apps/did-manager/src/config/validation.ts +++ b/apps/did-manager/src/config/validation.ts @@ -1,7 +1,7 @@ import Joi from 'joi'; export const validationSchema = Joi.object({ - HTTP_HOST: Joi.string(), + HTTP_HOSTNAME: Joi.string(), HTTP_PORT: Joi.number(), NATS_URL: Joi.string().uri(), diff --git a/apps/did-manager/src/dids/dids.service.ts b/apps/did-manager/src/dids/dids.service.ts index 927325e4a16ad4e584fd79e30b5ea8ab0353373a..80936bd8d6900c01a7272ea74c57d6bbf4c5e398 100644 --- a/apps/did-manager/src/dids/dids.service.ts +++ b/apps/did-manager/src/dids/dids.service.ts @@ -33,13 +33,20 @@ export class DIDsService { public registerFromSeed( tenantId: string, seed: EventDidsRegisterIndyFromSeedInput['seed'], - services?: EventDidsRegisterIndyFromSeedInput['services'], + services?: Array<{ id: string; type: string; serviceEndpoint: string }>, ) { + const mappedServices: EventDidsRegisterIndyFromSeedInput['services'] = + services?.map(({ id, type, serviceEndpoint }) => ({ + identifier: id, + type, + url: serviceEndpoint, + })); + return this.natsClient .send< EventDidsRegisterIndyFromSeed, EventDidsRegisterIndyFromSeedInput - >(EventDidsRegisterIndyFromSeed.token, { tenantId, seed, services }) + >(EventDidsRegisterIndyFromSeed.token, { tenantId, seed, services: mappedServices }) .pipe(map(({ data }) => data)); } diff --git a/apps/did-manager/src/dids/dto/register-from-seed.dto.ts b/apps/did-manager/src/dids/dto/register-from-seed.dto.ts index 6b06678b68b4af95ab033f660b2f19c5f8547a2a..9d5effeb54dca741a46d4b7349fb60bf0c44b47c 100644 --- a/apps/did-manager/src/dids/dto/register-from-seed.dto.ts +++ b/apps/did-manager/src/dids/dto/register-from-seed.dto.ts @@ -1,5 +1,29 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsString, IsArray } from 'class-validator'; +import { Type } from 'class-transformer'; +import { IsArray, IsOptional, IsString, ValidateNested } from 'class-validator'; + +class Service { + @IsString() + @ApiProperty({ + description: 'Service identifier', + example: 'did:example:123#linked-domain', + }) + public id: string; + + @IsString() + @ApiProperty({ + description: 'Service Type', + example: 'LinkedDomains', + }) + public type: string; + + @IsString() + @ApiProperty({ + description: 'Service Endpoint', + example: 'https://bar.example.com', + }) + public serviceEndpoint: string; +} export class RegisterFromSeedPayload { @IsString() @@ -10,6 +34,9 @@ export class RegisterFromSeedPayload { public seed: string; @IsArray() + @ValidateNested() + @Type(() => Service) + @IsOptional() @ApiProperty({ description: 'Services to associate with DID', example: [ @@ -20,9 +47,5 @@ export class RegisterFromSeedPayload { }, ], }) - public services?: Array<{ - identifier: string; - url: string; - type: string; - }>; + public services?: Service[]; } diff --git a/apps/did-manager/src/main.ts b/apps/did-manager/src/main.ts index fa521d4f2bbaf856fcbbf34f8db9558e730fa760..e926eb71b8974e653e16cfc7f2f68901303e2825 100644 --- a/apps/did-manager/src/main.ts +++ b/apps/did-manager/src/main.ts @@ -1,36 +1,22 @@ /* c8 ignore start */ import type { ConfigType } from '@nestjs/config'; -import type { MicroserviceOptions, NatsOptions } from '@nestjs/microservices'; import { Logger, VersioningType } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; -import { Transport } from '@nestjs/microservices'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import helmet from 'helmet'; +import { createRequire } from 'module'; +import { resolve } from 'node:path'; import { Application } from './application.js'; import { httpConfig } from './config/http.config.js'; -import { natsConfig } from './config/nats.config.js'; -const app = await NestFactory.create(Application); -app.enableCors(); - -const { url, user, password } = app.get(natsConfig.KEY) as ConfigType< - typeof natsConfig ->; - -const microserviceOptions: Required<NatsOptions> = { - transport: Transport.NATS, - options: { - servers: [url], - }, -}; +const pkgPath = resolve('package.json'); +const pkg = createRequire(import.meta.url)(pkgPath); -if (user && password) { - microserviceOptions.options.user = user; - microserviceOptions.options.pass = password; -} +const app = await NestFactory.create(Application); -app.connectMicroservice<MicroserviceOptions>(microserviceOptions); +app.use(helmet()); app.enableVersioning({ defaultVersion: ['1'], @@ -38,18 +24,23 @@ app.enableVersioning({ }); const swaggerConfig = new DocumentBuilder() - .setTitle('Gaia-X OCM DID Manager API') - .setDescription('API documentation for Gaia-X OCM DID Manager') - .setVersion('1.0') + .setTitle(pkg.description) + .setVersion(pkg.version) .build(); const document = SwaggerModule.createDocument(app, swaggerConfig); -SwaggerModule.setup('/', app, document); -await app.startAllMicroservices(); +SwaggerModule.setup('/', app, document, { + swaggerOptions: { + docExpansion: 'none', + tryItOutEnabled: true, + }, +}); -const { host, port } = app.get(httpConfig.KEY) as ConfigType<typeof httpConfig>; -await app.listen(port as number, host as string); +const { hostname, port } = app.get(httpConfig.KEY) as ConfigType< + typeof httpConfig +>; +await app.listen(port, hostname); Logger.log(`Application is running on: ${await app.getUrl()}`); /* c8 ignore stop */ diff --git a/apps/proof-manager/.env.example b/apps/proof-manager/.env.example index f56f87942e14ee6bda9ba33660519876302c0bae..0bdd0d9dcb57e89982350e75a8f6afb0e19fcf8f 100644 --- a/apps/proof-manager/.env.example +++ b/apps/proof-manager/.env.example @@ -1,6 +1,6 @@ -HTTP_HOST=0.0.0.0 -HTTP_PORT=3004 +HTTP_HOSTNAME=0.0.0.0 +HTTP_PORT=4004 NATS_URL=nats://localhost:4222 NATS_USER=nats_user -NATS_PASSWORD= +NATS_PASSWORD=nats_password NATS_MONITORING_URL=http://localhost:8222 diff --git a/apps/proof-manager/package.json b/apps/proof-manager/package.json index 931642ddd3b2fadaaf9de7f37c3571d1283b0faf..51c3124ac3b6bbd8e05a27cf12735f50e9ceee9b 100644 --- a/apps/proof-manager/package.json +++ b/apps/proof-manager/package.json @@ -1,7 +1,7 @@ { "name": "@ocm/proof-manager", - "version": "0.0.1", - "description": "The Proof Manager provides an endpoint to request a presentation over an existing connection", + "version": "1.0.0", + "description": "Gaia-X OCM Proof Manager", "author": "Sagar", "private": true, "license": "Apache-2.0", @@ -14,36 +14,37 @@ "test": "jest" }, "dependencies": { - "@nestjs/common": "^10.3.0", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.3.0", - "@nestjs/mapped-types": "^2.0.4", - "@nestjs/microservices": "^10.3.0", - "@nestjs/platform-express": "^10.3.0", - "@nestjs/swagger": "^7.1.16", + "@nestjs/common": "10.3.3", + "@nestjs/config": "3.2.0", + "@nestjs/core": "10.3.3", + "@nestjs/mapped-types": "2.0.5", + "@nestjs/microservices": "10.3.3", + "@nestjs/platform-express": "10.3.3", + "@nestjs/swagger": "7.3.0", "@ocm/shared": "workspace:*", - "class-validator": "^0.14.0", - "class-transformer": "^0.5.1", - "express": "^4.17.3", - "joi": "^17.11.0", - "nats": "^2.18.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" + "class-transformer": "0.5.1", + "class-validator": "0.14.1", + "express": "4.18.2", + "helmet": "7.1.0", + "joi": "17.12.1", + "nats": "2.19.0", + "reflect-metadata": "0.2.1", + "rxjs": "7.8.1" }, "devDependencies": { - "@jest/globals": "^29.7.0", - "@nestjs/cli": "^10.3.0", - "@nestjs/schematics": "^10.1.0", - "@nestjs/testing": "^10.3.0", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.96", - "@swc/jest": "^0.2.29", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.9", - "@types/node": "^20.9.3", - "dotenv-cli": "^7.3.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "typescript": "^5.3.2" + "@jest/globals": "29.7.0", + "@nestjs/cli": "10.3.2", + "@nestjs/schematics": "10.1.1", + "@nestjs/testing": "10.3.3", + "@swc/cli": "0.3.9", + "@swc/core": "1.4.2", + "@swc/jest": "0.2.36", + "@types/express": "4.17.21", + "@types/jest": "29.5.12", + "@types/node": "20.11.19", + "dotenv-cli": "7.3.0", + "jest": "29.7.0", + "rimraf": "5.0.5", + "typescript": "5.3.3" } } diff --git a/apps/proof-manager/src/application.ts b/apps/proof-manager/src/application.ts index 19c04cbeff2a12c83f65e00bb7afb213a452fa8e..ffc45aa9309264c3f410d6388e5b28435904a22e 100644 --- a/apps/proof-manager/src/application.ts +++ b/apps/proof-manager/src/application.ts @@ -1,10 +1,10 @@ +import type { OnApplicationBootstrap } from '@nestjs/common'; import type { ConfigType } from '@nestjs/config'; -import type { ClientProvider } from '@nestjs/microservices'; -import { Module } from '@nestjs/common'; +import { Inject, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { RouterModule } from '@nestjs/core'; -import { ClientsModule, Transport } from '@nestjs/microservices'; +import { ClientProxy, ClientsModule, Transport } from '@nestjs/microservices'; import { HealthModule } from '@ocm/shared'; import { NATS_CLIENT } from './common/constants.js'; @@ -33,21 +33,14 @@ import { ProofsModule } from './proofs/proofs.module.js'; { name: NATS_CLIENT, inject: [natsConfig.KEY], - useFactory: (config: ConfigType<typeof natsConfig>) => { - const provider: Required<ClientProvider> = { - transport: Transport.NATS, - options: { - servers: config.url as string, - }, - }; - - if ('user' in config && 'password' in config) { - provider.options.user = config.user as string; - provider.options.pass = config.password as string; - } - - return provider; - }, + useFactory: (config: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { + servers: [config.url], + user: config.user as string, + pass: config.password as string, + }, + }), }, ], }), @@ -75,4 +68,12 @@ import { ProofsModule } from './proofs/proofs.module.js'; ]), ], }) -export class Application {} +export class Application implements OnApplicationBootstrap { + public constructor( + @Inject(NATS_CLIENT) private readonly client: ClientProxy, + ) {} + + public async onApplicationBootstrap(): Promise<void> { + await this.client.connect(); + } +} diff --git a/apps/proof-manager/src/config/http.config.ts b/apps/proof-manager/src/config/http.config.ts index fc63fd9ddbe4bfb6b1d8225d636d3dee1f284502..c7b07c2dfdb215018bf33eb2083541e6809bdcd2 100644 --- a/apps/proof-manager/src/config/http.config.ts +++ b/apps/proof-manager/src/config/http.config.ts @@ -1,6 +1,6 @@ import { registerAs } from '@nestjs/config'; export const httpConfig = registerAs('http', () => ({ - host: process.env.HOST || '0.0.0.0', - port: Number(process.env.PORT) || 3000, + hostname: process.env.HTTP_HOSTNAME || '0.0.0.0', + port: Number(process.env.HTTP_PORT) || 3000, })); diff --git a/apps/proof-manager/src/config/validation.ts b/apps/proof-manager/src/config/validation.ts index e9abf25ab2e96d0fc30843b3dba5147b4b91074b..f963431550e25f1fe5f7db6fca536ffbb0c80144 100644 --- a/apps/proof-manager/src/config/validation.ts +++ b/apps/proof-manager/src/config/validation.ts @@ -1,7 +1,7 @@ import Joi from 'joi'; export const validationSchema = Joi.object({ - HTTP_HOST: Joi.string(), + HTTP_HOSTNAME: Joi.string(), HTTP_PORT: Joi.number(), NATS_URL: Joi.string().uri(), diff --git a/apps/proof-manager/src/main.ts b/apps/proof-manager/src/main.ts index fe4aad77a459145c7ef815eca71bfe48154f47c7..e926eb71b8974e653e16cfc7f2f68901303e2825 100644 --- a/apps/proof-manager/src/main.ts +++ b/apps/proof-manager/src/main.ts @@ -1,36 +1,22 @@ /* c8 ignore start */ import type { ConfigType } from '@nestjs/config'; -import type { MicroserviceOptions, NatsOptions } from '@nestjs/microservices'; import { Logger, VersioningType } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; -import { Transport } from '@nestjs/microservices'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import helmet from 'helmet'; +import { createRequire } from 'module'; +import { resolve } from 'node:path'; import { Application } from './application.js'; import { httpConfig } from './config/http.config.js'; -import { natsConfig } from './config/nats.config.js'; -const app = await NestFactory.create(Application); -app.enableCors(); - -const { url, user, password } = app.get(natsConfig.KEY) as ConfigType< - typeof natsConfig ->; - -const microserviceOptions: Required<NatsOptions> = { - transport: Transport.NATS, - options: { - servers: [url], - }, -}; +const pkgPath = resolve('package.json'); +const pkg = createRequire(import.meta.url)(pkgPath); -if (user && password) { - microserviceOptions.options.user = user; - microserviceOptions.options.pass = password; -} +const app = await NestFactory.create(Application); -app.connectMicroservice<MicroserviceOptions>(microserviceOptions); +app.use(helmet()); app.enableVersioning({ defaultVersion: ['1'], @@ -38,18 +24,23 @@ app.enableVersioning({ }); const swaggerConfig = new DocumentBuilder() - .setTitle('Gaia-X OCM Proof Manager API') - .setDescription('API documentation for Gaia-X OCM Proof Manager') - .setVersion('1.0') + .setTitle(pkg.description) + .setVersion(pkg.version) .build(); const document = SwaggerModule.createDocument(app, swaggerConfig); -SwaggerModule.setup('/swagger', app, document); -await app.startAllMicroservices(); +SwaggerModule.setup('/', app, document, { + swaggerOptions: { + docExpansion: 'none', + tryItOutEnabled: true, + }, +}); -const { host, port } = app.get(httpConfig.KEY) as ConfigType<typeof httpConfig>; -await app.listen(port as number, host as string); +const { hostname, port } = app.get(httpConfig.KEY) as ConfigType< + typeof httpConfig +>; +await app.listen(port, hostname); Logger.log(`Application is running on: ${await app.getUrl()}`); /* c8 ignore stop */ diff --git a/apps/proof-manager/src/proofs/dto/register.dto.ts b/apps/proof-manager/src/proofs/dto/request.dto.ts similarity index 93% rename from apps/proof-manager/src/proofs/dto/register.dto.ts rename to apps/proof-manager/src/proofs/dto/request.dto.ts index 3f9653c79f5d465bd35f655dc11542003b382bfc..166290ea4c6637bd92766ed2a214f454dbcd1e78 100644 --- a/apps/proof-manager/src/proofs/dto/register.dto.ts +++ b/apps/proof-manager/src/proofs/dto/request.dto.ts @@ -20,13 +20,13 @@ export class RequestPayload { public readonly connectionId: string; @IsObject() - @ValidateNested({ each: true }) - @Type(() => RequestedAttribute) + // @ValidateNested({ each: true }) + // @Type(() => RequestedAttribute) public readonly requestedAttributes: Record<string, RequestedAttribute>; @IsObject() - @ValidateNested({ each: true }) - @Type(() => RequestedPredicate) + // @ValidateNested({ each: true }) + // @Type(() => RequestedPredicate) public readonly requestedPredicates: Record<string, RequestedPredicate>; } diff --git a/apps/proof-manager/src/proofs/proofs.controller.ts b/apps/proof-manager/src/proofs/proofs.controller.ts index c7602b79fe13b878a3320c50b893a21d8cb30a32..f9de0bee5ce3a67e9a7482e239118d23ceffe1db 100644 --- a/apps/proof-manager/src/proofs/proofs.controller.ts +++ b/apps/proof-manager/src/proofs/proofs.controller.ts @@ -18,7 +18,7 @@ import { MultitenancyParams, ResponseFormatInterceptor } from '@ocm/shared'; import { of, switchMap } from 'rxjs'; import { GetByIdParams } from './dto/get-by-id.dto.js'; -import { RequestPayload } from './dto/register.dto.js'; +import { RequestPayload } from './dto/request.dto.js'; import { ProofsService } from './proofs.service.js'; @Controller() @@ -398,6 +398,15 @@ export class ProofsController { ); } + @Post(':proofRecordId/accept') + @HttpCode(HttpStatus.OK) + public accept( + @Query() { tenantId }: MultitenancyParams, + @Param() { proofRecordId }: GetByIdParams, + ) { + return this.service.accept(tenantId, proofRecordId); + } + @Delete(':id') @HttpCode(HttpStatus.OK) @ApiOperation({ diff --git a/apps/proof-manager/src/proofs/proofs.service.ts b/apps/proof-manager/src/proofs/proofs.service.ts index 8e69544258997a70da00d14b484c051e37ace0e0..d98735afcae6e016a000f09943821e47606f1c56 100644 --- a/apps/proof-manager/src/proofs/proofs.service.ts +++ b/apps/proof-manager/src/proofs/proofs.service.ts @@ -2,12 +2,14 @@ import type { EventAnonCredsProofsDeleteByIdInput, EventAnonCredsProofsGetAllInput, EventAnonCredsProofsGetByIdInput, + EventDidcommAnonCredsProofsAcceptRequestInput, EventDidcommAnonCredsProofsRequestInput, } from '@ocm/shared'; import { Inject, Injectable } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; import { + EventDidcommAnonCredsProofsAcceptRequest, EventAnonCredsProofsDeleteById, EventAnonCredsProofsGetById, EventDidcommAnonCredsProofsRequest, @@ -70,6 +72,21 @@ export class ProofsService { .pipe(map((results) => results.data)); } + public accept( + tenantId: string, + proofRecordId: string, + ): Observable<EventDidcommAnonCredsProofsAcceptRequest['data']> { + return this.natsClient + .send< + EventDidcommAnonCredsProofsAcceptRequest, + EventDidcommAnonCredsProofsAcceptRequestInput + >(EventDidcommAnonCredsProofsAcceptRequest.token, { + tenantId, + proofRecordId, + }) + .pipe(map((results) => results.data)); + } + public delete( tenantId: string, proofRecordId: string, diff --git a/apps/schema-manager/.env.example b/apps/schema-manager/.env.example index 55e246f00ca84b18a51876fef8c6a8f4d51f7977..e6e793587ef607b5eefd3ffec3d77ed4365df661 100644 --- a/apps/schema-manager/.env.example +++ b/apps/schema-manager/.env.example @@ -1,6 +1,6 @@ -HTTP_HOST=0.0.0.0 -HTTP_PORT=3001 +HTTP_HOSTNAME=0.0.0.0 +HTTP_PORT=4001 NATS_URL=nats://localhost:4222 NATS_USER=nats_user -NATS_PASSWORD= +NATS_PASSWORD=nats_password NATS_MONITORING_URL=http://localhost:8222 diff --git a/apps/schema-manager/package.json b/apps/schema-manager/package.json index 4e08b78610ae1df67995e488efa8e2d5cab925c0..e408aa7d56ad21cca726bd23df832e53cb502410 100644 --- a/apps/schema-manager/package.json +++ b/apps/schema-manager/package.json @@ -1,7 +1,7 @@ { "name": "@ocm/schema-manager", "version": "1.0.0", - "description": "", + "description": "Gaia-X OCM Schema Manager", "author": "Konstantin Tsabolov <konstantin.tsabolov@spherity.com>", "contributors": [ "Konstantin Tsabolov <konstantin.tsabolov@spherity.com>" @@ -17,37 +17,38 @@ "test": "jest" }, "dependencies": { - "@nestjs/common": "^10.3.0", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.3.0", - "@nestjs/microservices": "^10.3.0", - "@nestjs/platform-express": "^10.3.0", - "@nestjs/swagger": "^7.2.0", + "@nestjs/common": "10.3.3", + "@nestjs/config": "3.2.0", + "@nestjs/core": "10.3.3", + "@nestjs/microservices": "10.3.3", + "@nestjs/platform-express": "10.3.3", + "@nestjs/swagger": "7.3.0", "@ocm/shared": "workspace:*", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "express": "^4.17.3", - "joi": "^17.11.0", - "nats": "^2.18.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" + "class-transformer": "0.5.1", + "class-validator": "0.14.1", + "express": "4.18.2", + "helmet": "7.1.0", + "joi": "17.12.1", + "nats": "2.19.0", + "reflect-metadata": "0.2.1", + "rxjs": "7.8.1" }, "devDependencies": { - "@nestjs/cli": "^10.3.0", - "@nestjs/schematics": "^10.1.0", - "@nestjs/testing": "^10.3.0", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.96", - "@swc/jest": "^0.2.29", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.8", - "@types/jsonwebtoken": "^9.0.5", - "@types/node": "^20.9.0", - "@types/supertest": "^2.0.16", - "dotenv-cli": "^7.3.0", - "eslint": "^8.53.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "typescript": "^5.3.2" + "@nestjs/cli": "10.3.2", + "@nestjs/schematics": "10.1.1", + "@nestjs/testing": "10.3.3", + "@swc/cli": "0.3.9", + "@swc/core": "1.4.2", + "@swc/jest": "0.2.36", + "@types/express": "4.17.21", + "@types/jest": "29.5.12", + "@types/jsonwebtoken": "9.0.5", + "@types/node": "20.11.19", + "@types/supertest": "6.0.2", + "dotenv-cli": "7.3.0", + "eslint": "8.56.0", + "jest": "29.7.0", + "rimraf": "5.0.5", + "typescript": "5.3.3" } } diff --git a/apps/schema-manager/src/application.ts b/apps/schema-manager/src/application.ts index 649befb0bbd02c54270efac362ca21e4fe136dfc..b67928ff8f26c65974a096e729142130d881ccb3 100644 --- a/apps/schema-manager/src/application.ts +++ b/apps/schema-manager/src/application.ts @@ -1,10 +1,10 @@ +import type { OnApplicationBootstrap } from '@nestjs/common'; import type { ConfigType } from '@nestjs/config'; -import type { ClientProvider } from '@nestjs/microservices'; -import { Module } from '@nestjs/common'; +import { Inject, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { RouterModule } from '@nestjs/core'; -import { ClientsModule, Transport } from '@nestjs/microservices'; +import { ClientProxy, ClientsModule, Transport } from '@nestjs/microservices'; import { HealthModule } from '@ocm/shared'; import { NATS_CLIENT } from './common/constants.js'; @@ -34,21 +34,14 @@ import { SchemasModule } from './schemas/schemas.module.js'; { name: NATS_CLIENT, inject: [natsConfig.KEY], - useFactory: (config: ConfigType<typeof natsConfig>) => { - const provider: Required<ClientProvider> = { - transport: Transport.NATS, - options: { - servers: config.url as string, - }, - }; - - if ('user' in config && 'password' in config) { - provider.options.user = config.user as string; - provider.options.pass = config.password as string; - } - - return provider; - }, + useFactory: (config: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { + servers: [config.url], + user: config.user as string, + pass: config.password as string, + }, + }), }, ], }), @@ -78,4 +71,12 @@ import { SchemasModule } from './schemas/schemas.module.js'; ]), ], }) -export class Application {} +export class Application implements OnApplicationBootstrap { + public constructor( + @Inject(NATS_CLIENT) private readonly client: ClientProxy, + ) {} + + public async onApplicationBootstrap(): Promise<void> { + await this.client.connect(); + } +} diff --git a/apps/schema-manager/src/config/http.config.ts b/apps/schema-manager/src/config/http.config.ts index fc63fd9ddbe4bfb6b1d8225d636d3dee1f284502..c7b07c2dfdb215018bf33eb2083541e6809bdcd2 100644 --- a/apps/schema-manager/src/config/http.config.ts +++ b/apps/schema-manager/src/config/http.config.ts @@ -1,6 +1,6 @@ import { registerAs } from '@nestjs/config'; export const httpConfig = registerAs('http', () => ({ - host: process.env.HOST || '0.0.0.0', - port: Number(process.env.PORT) || 3000, + hostname: process.env.HTTP_HOSTNAME || '0.0.0.0', + port: Number(process.env.HTTP_PORT) || 3000, })); diff --git a/apps/schema-manager/src/config/validation.ts b/apps/schema-manager/src/config/validation.ts index e9abf25ab2e96d0fc30843b3dba5147b4b91074b..f963431550e25f1fe5f7db6fca536ffbb0c80144 100644 --- a/apps/schema-manager/src/config/validation.ts +++ b/apps/schema-manager/src/config/validation.ts @@ -1,7 +1,7 @@ import Joi from 'joi'; export const validationSchema = Joi.object({ - HTTP_HOST: Joi.string(), + HTTP_HOSTNAME: Joi.string(), HTTP_PORT: Joi.number(), NATS_URL: Joi.string().uri(), diff --git a/apps/schema-manager/src/credential-definitions/credential-definitions.service.ts b/apps/schema-manager/src/credential-definitions/credential-definitions.service.ts index a24b0dc8f98aabcb0c2d940892a824c042cd4798..0d8525a5bd9ace3a3df70ced13b09365cd6e2a35 100644 --- a/apps/schema-manager/src/credential-definitions/credential-definitions.service.ts +++ b/apps/schema-manager/src/credential-definitions/credential-definitions.service.ts @@ -1,4 +1,9 @@ -import type { EventAnonCredsCredentialDefinitionsGetAllInput } from '@ocm/shared'; +import type { + EventAnonCredsCredentialDefinitionsGetAllInput, + EventAnonCredsCredentialDefinitionsRegisterInput, + EventAnonCredsRevocationRegisterRevocationRegistryDefinitionInput, + EventAnonCredsRevocationRegisterRevocationStatusListInput, +} from '@ocm/shared'; import type { Observable } from 'rxjs'; import { Inject, Injectable } from '@nestjs/common'; @@ -7,8 +12,10 @@ import { EventAnonCredsCredentialDefinitionsGetAll, EventAnonCredsCredentialDefinitionsGetById, EventAnonCredsCredentialDefinitionsRegister, + EventAnonCredsRevocationRegisterRevocationRegistryDefinition, + EventAnonCredsRevocationRegisterRevocationStatusList, } from '@ocm/shared'; -import { map } from 'rxjs'; +import { forkJoin, map, shareReplay, switchMap } from 'rxjs'; import { NATS_CLIENT } from '../common/constants.js'; @@ -41,15 +48,79 @@ export class CredentialDefinitionsService { .pipe(map((result) => result.data)); } - public registerCredentialDefinition( + public async registerCredentialDefinition( tenantId: string, - payload: unknown, - ): Observable<EventAnonCredsCredentialDefinitionsRegister['data']> { - return this.natsClient - .send(EventAnonCredsCredentialDefinitionsRegister.token, { + payload: Omit<EventAnonCredsCredentialDefinitionsRegisterInput, 'tenantId'>, + ): Promise<Observable<EventAnonCredsCredentialDefinitionsRegister['data']>> { + const registerCredentialDefinition$ = this.natsClient + .send< + EventAnonCredsCredentialDefinitionsRegister, + EventAnonCredsCredentialDefinitionsRegisterInput + >(EventAnonCredsCredentialDefinitionsRegister.token, { + ...payload, tenantId, - payload, }) - .pipe(map((result) => result.data)); + .pipe( + map((result) => result.data), + shareReplay(), + ); + + if (!payload.supportsRevocation) { + return registerCredentialDefinition$; + } + + const registerRevocationRegistryDefinition$ = + registerCredentialDefinition$.pipe( + switchMap((credentialDefinition) => + this.natsClient.send< + EventAnonCredsRevocationRegisterRevocationRegistryDefinition, + EventAnonCredsRevocationRegisterRevocationRegistryDefinitionInput + >( + EventAnonCredsRevocationRegisterRevocationRegistryDefinition.token, + { + tenantId, + issuerDid: payload.issuerDid, + credentialDefinitionId: + credentialDefinition.credentialDefinitionId, + tag: 'default', + maximumCredentialNumber: 10, + }, + ), + ), + map((result) => result.data), + shareReplay(), + ); + + const registerStatusList$ = registerRevocationRegistryDefinition$.pipe( + switchMap((revocationRegistry) => + this.natsClient.send< + EventAnonCredsRevocationRegisterRevocationStatusList, + EventAnonCredsRevocationRegisterRevocationStatusListInput + >(EventAnonCredsRevocationRegisterRevocationStatusList.token, { + tenantId, + issuerDid: payload.issuerDid, + revocationRegistryDefinitionId: + revocationRegistry.revocationRegistryDefinitionId, + }), + ), + map((result) => result.data), + ); + + return registerStatusList$ + .pipe( + switchMap(() => + forkJoin({ + credentialDefinition: registerCredentialDefinition$, + revocationRegistryDefinition: registerRevocationRegistryDefinition$, + }), + ), + ) + .pipe( + map(({ credentialDefinition, revocationRegistryDefinition }) => ({ + ...credentialDefinition, + revocationRegistryDefinitionId: + revocationRegistryDefinition.revocationRegistryDefinitionId, + })), + ); } } diff --git a/apps/schema-manager/src/credential-definitions/dto/create-credential-definition.dto.ts b/apps/schema-manager/src/credential-definitions/dto/create-credential-definition.dto.ts index 02c3612cf31ef82f23201347de2e87e1dec44bb4..ecb6d4ddb7bc17e4ca013e3902dcba921a03a7cb 100644 --- a/apps/schema-manager/src/credential-definitions/dto/create-credential-definition.dto.ts +++ b/apps/schema-manager/src/credential-definitions/dto/create-credential-definition.dto.ts @@ -1,7 +1,12 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsString } from 'class-validator'; +import { IsBoolean, IsNotEmpty, IsString } from 'class-validator'; export class CreateCredentialDefinitionPayload { + @IsString() + @IsNotEmpty() + @ApiProperty() + public issuerDid: string; + @IsString() @IsNotEmpty() @ApiProperty() @@ -11,4 +16,8 @@ export class CreateCredentialDefinitionPayload { @IsNotEmpty() @ApiProperty() public tag: string; + + @IsBoolean() + @ApiProperty() + public supportsRevocation: boolean; } diff --git a/apps/schema-manager/src/main.ts b/apps/schema-manager/src/main.ts index 1472b8cdfd8627cd9ff0aab52e2dc625bb10022e..e926eb71b8974e653e16cfc7f2f68901303e2825 100644 --- a/apps/schema-manager/src/main.ts +++ b/apps/schema-manager/src/main.ts @@ -1,36 +1,22 @@ /* c8 ignore start */ import type { ConfigType } from '@nestjs/config'; -import type { MicroserviceOptions, NatsOptions } from '@nestjs/microservices'; import { Logger, VersioningType } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; -import { Transport } from '@nestjs/microservices'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import helmet from 'helmet'; +import { createRequire } from 'module'; +import { resolve } from 'node:path'; import { Application } from './application.js'; import { httpConfig } from './config/http.config.js'; -import { natsConfig } from './config/nats.config.js'; -const app = await NestFactory.create(Application); -app.enableCors(); - -const { url, user, password } = app.get(natsConfig.KEY) as ConfigType< - typeof natsConfig ->; - -const microserviceOptions: Required<NatsOptions> = { - transport: Transport.NATS, - options: { - servers: [url], - }, -}; +const pkgPath = resolve('package.json'); +const pkg = createRequire(import.meta.url)(pkgPath); -if (user && password) { - microserviceOptions.options.user = user; - microserviceOptions.options.pass = password; -} +const app = await NestFactory.create(Application); -app.connectMicroservice<MicroserviceOptions>(microserviceOptions); +app.use(helmet()); app.enableVersioning({ defaultVersion: ['1'], @@ -38,18 +24,23 @@ app.enableVersioning({ }); const swaggerConfig = new DocumentBuilder() - .setTitle('Gaia-X OCM Schema Manager API') - .setDescription('API documentation for Gaia-X OCM Schema Manager') - .setVersion('1.0') + .setTitle(pkg.description) + .setVersion(pkg.version) .build(); const document = SwaggerModule.createDocument(app, swaggerConfig); -SwaggerModule.setup('/swagger', app, document); -await app.startAllMicroservices(); +SwaggerModule.setup('/', app, document, { + swaggerOptions: { + docExpansion: 'none', + tryItOutEnabled: true, + }, +}); -const { host, port } = app.get(httpConfig.KEY) as ConfigType<typeof httpConfig>; -await app.listen(port as number, host as string); +const { hostname, port } = app.get(httpConfig.KEY) as ConfigType< + typeof httpConfig +>; +await app.listen(port, hostname); Logger.log(`Application is running on: ${await app.getUrl()}`); /* c8 ignore stop */ diff --git a/apps/shared/package.json b/apps/shared/package.json index 1ef5dac1d99cfab2f77dc390c5f09f7c7e084a7d..f319f66153a3c11fa82d315748d0d44cbb627407 100644 --- a/apps/shared/package.json +++ b/apps/shared/package.json @@ -15,30 +15,30 @@ "test": "jest" }, "dependencies": { - "@credo-ts/anoncreds": "^0.5.0-alpha.116", - "@credo-ts/core": "^0.5.0-alpha.116", - "@credo-ts/tenants": "^0.5.0-alpha.116", - "@elastic/ecs-winston-format": "^1.5.0", - "@nestjs/axios": "^3.0.1", - "@nestjs/swagger": "^7.1.17", - "@nestjs/terminus": "^10.2.0", - "axios": "^1.6.2", - "joi": "^17.11.0", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "nats": "^2.18.0", - "rxjs": "^7.8.1", - "winston": "^3.11.0" + "@credo-ts/anoncreds": "0.5.0-alpha.138", + "@credo-ts/core": "0.5.0-alpha.138", + "@credo-ts/tenants": "0.5.0-alpha.138", + "@elastic/ecs-winston-format": "1.5.2", + "@nestjs/axios": "3.0.2", + "@nestjs/swagger": "7.3.0", + "@nestjs/terminus": "10.2.3", + "axios": "1.6.7", + "joi": "17.12.1", + "class-transformer": "0.5.1", + "class-validator": "0.14.1", + "nats": "2.19.0", + "rxjs": "7.8.1", + "winston": "3.11.0" }, "peerDependencies": { - "@nestjs/common": "*", - "@nestjs/core": "*", - "@nestjs/microservices": "*", - "@nestjs/platform-express": "*", - "class-transformer": "*", - "class-validator": "*", - "reflect-metadata": "*", - "rxjs": "*" + "@nestjs/common": "10.3.3", + "@nestjs/core": "10.3.3", + "@nestjs/microservices": "10.3.3", + "@nestjs/platform-express": "10.3.3", + "class-transformer": "0.5.1", + "class-validator": "0.14.1", + "reflect-metadata": "0.2.1", + "rxjs": "7.8.1" }, "peerDependenciesMeta": { "@nestjs/common": { @@ -64,15 +64,15 @@ } }, "devDependencies": { - "@nestjs/cli": "^10.3.0", - "@nestjs/testing": "^10.3.0", - "@types/jest": "^29.5.9", - "@types/node": "^20.9.3", - "rimraf": "^5.0.5", - "supertest": "^6.3.3", - "ts-jest": "^29.1.1", - "ts-node": "^10.9.1", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.3.3" + "@nestjs/cli": "10.3.2", + "@nestjs/testing": "10.3.3", + "@types/jest": "29.5.12", + "@types/node": "20.11.19", + "rimraf": "5.0.5", + "supertest": "6.3.4", + "ts-jest": "29.1.2", + "ts-node": "10.9.2", + "tsconfig-paths": "4.2.0", + "typescript": "5.3.3" } } diff --git a/apps/shared/src/events/connectionEvents.ts b/apps/shared/src/events/connectionEvents.ts index 915f1e8a99b06f164a08642911997c422837deed..a7deccae0f463e012303921372693145f0543109 100644 --- a/apps/shared/src/events/connectionEvents.ts +++ b/apps/shared/src/events/connectionEvents.ts @@ -1,6 +1,10 @@ import type { BaseEventInput } from './baseEvents.js'; -import { ConnectionRecord, JsonTransformer } from '@credo-ts/core'; +import { + ConnectionRecord, + JsonTransformer, + OutOfBandInvitation, +} from '@credo-ts/core'; import { BaseEvent } from './baseEvents.js'; @@ -73,13 +77,11 @@ export type EventDidcommConnectionsReceiveInvitationFromUrlInput = BaseEventInput<{ invitationUrl: string; }>; -export class EventDidcommConnectionsReceiveInvitationFromUrl extends BaseEvent<ConnectionRecord | null> { +export class EventDidcommConnectionsReceiveInvitationFromUrl extends BaseEvent<ConnectionRecord> { public static token = 'didcomm.connections.receiveInvitationFromUrl'; public get instance() { - return this.data - ? JsonTransformer.fromJSON(this.data, ConnectionRecord) - : null; + return JsonTransformer.fromJSON(this.data, ConnectionRecord); } public static fromEvent(e: EventDidcommConnectionsReceiveInvitationFromUrl) { @@ -134,3 +136,24 @@ export class EventDidcommConnectionsBlock extends BaseEvent<ConnectionRecord | n ); } } + +export type EventDidcommConnectionsParseInvitationInput = BaseEventInput<{ + invitationUrl: string; +}>; +export class EventDidcommConnectionsParseInvitation extends BaseEvent<OutOfBandInvitation> { + public static token = 'didcomm.connections.parseInvitation'; + + public get instance() { + return JsonTransformer.fromJSON(this.data, OutOfBandInvitation); + } + + public static fromEvent(e: EventDidcommConnectionsParseInvitation) { + return new EventDidcommConnectionsParseInvitation( + e.data, + e.tenantId, + e.id, + e.type, + e.timestamp, + ); + } +} diff --git a/apps/shared/src/events/proofEvents.ts b/apps/shared/src/events/proofEvents.ts index 414c62a7b8da62e3fa21aef5477d05a9c56602d4..b7acdb236e6e24335ebc0ba0bf46ed4642e8d93f 100644 --- a/apps/shared/src/events/proofEvents.ts +++ b/apps/shared/src/events/proofEvents.ts @@ -106,3 +106,24 @@ export class EventAnonCredsProofsDeleteById extends BaseEvent { ); } } + +export type EventDidcommAnonCredsProofsAcceptRequestInput = BaseEventInput<{ + proofRecordId: string; +}>; +export class EventDidcommAnonCredsProofsAcceptRequest extends BaseEvent<ProofExchangeRecord> { + public static token = 'didcomm.anoncreds.proofs.acceptRequest'; + + public get instance() { + return JsonTransformer.fromJSON(this.data, ProofExchangeRecord); + } + + public static fromEvent(e: EventDidcommAnonCredsProofsRequest) { + return new EventDidcommAnonCredsProofsRequest( + e.data, + e.tenantId, + e.id, + e.type, + e.timestamp, + ); + } +} diff --git a/apps/shared/src/events/tenantEvents.ts b/apps/shared/src/events/tenantEvents.ts index 4753a2cb2829385936853aacb70beded1c2c3937..2c2dc930995d76a394ae3880b2fa538a94863abb 100644 --- a/apps/shared/src/events/tenantEvents.ts +++ b/apps/shared/src/events/tenantEvents.ts @@ -20,3 +20,28 @@ export class EventTenantsCreate extends BaseEvent<TenantRecord, undefined> { return new EventTenantsCreate(e.data, undefined, e.id, e.type, e.timestamp); } } + +export type EventTenantsGetAllTenantIdsInput = BaseEventInput< + Record<string, unknown>, + undefined +>; +export class EventTenantsGetAllTenantIds extends BaseEvent< + Array<string>, + undefined +> { + public static token = 'tenants.getAllTenantIds'; + + public get instance() { + return this.data; + } + + public static fromEvent(e: EventTenantsGetAllTenantIds) { + return new EventTenantsGetAllTenantIds( + e.data, + undefined, + e.id, + e.type, + e.timestamp, + ); + } +} diff --git a/apps/shared/src/index.ts b/apps/shared/src/index.ts index 541830c07d40fdeaac5a81d2599f6f746ba8ed04..227150c5943d2aafe794cc064562212e2573cdcb 100644 --- a/apps/shared/src/index.ts +++ b/apps/shared/src/index.ts @@ -19,5 +19,8 @@ export * from './dto/pagination-params.dto.js'; export * from './dto/multitenancy-params.dto.js'; export * from './modules/health/health.module.js'; +export * from './modules/tsa/index.js'; export * from './interceptors/response-format.interceptor.js'; + +export * from './staticStorage.js'; diff --git a/apps/shared/src/modules/health/health.controller.ts b/apps/shared/src/modules/health/health.controller.ts index fb6e94b8e3d16426201b08090bef748f4dff65cc..d2f22e6009efbc36723aa07af35b7bf5c0bff733 100644 --- a/apps/shared/src/modules/health/health.controller.ts +++ b/apps/shared/src/modules/health/health.controller.ts @@ -1,11 +1,11 @@ import { Controller, Get, VERSION_NEUTRAL } from '@nestjs/common'; -import { ApiTags } from '@nestjs/swagger'; +import { ApiExcludeController } from '@nestjs/swagger'; import { HealthCheck, HealthCheckService } from '@nestjs/terminus'; import { NATSHealthIndicator } from './indicators/nats.health.js'; @Controller({ version: VERSION_NEUTRAL }) -@ApiTags('Health') +@ApiExcludeController() export class HealthController { public constructor( private readonly natsHealthIndicator: NATSHealthIndicator, diff --git a/apps/shared/src/modules/tsa/__tests__/tsa.service.spec.ts b/apps/shared/src/modules/tsa/__tests__/tsa.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..9ee7c3e209be7439830d57628fbcbe12887be61f --- /dev/null +++ b/apps/shared/src/modules/tsa/__tests__/tsa.service.spec.ts @@ -0,0 +1,60 @@ +import type { TestingModule } from '@nestjs/testing'; +import type { AxiosResponse } from 'axios' assert { 'resolution-mode': 'require' }; + +import { HttpService } from '@nestjs/axios'; +import { Test } from '@nestjs/testing'; +import { of } from 'rxjs'; + +import { TSAService } from '../tsa.service.js'; + +describe('TSA Service', () => { + const httpServiceMock = { + post: jest.fn(), + } as unknown as jest.Mocked<HttpService>; + + let service: TSAService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + { provide: HttpService, useValue: httpServiceMock }, + TSAService, + ], + }).compile(); + + service = module.get<TSAService>(TSAService); + + jest.clearAllMocks(); + }); + + it('should do something', () => { + expect(service).toBeDefined(); + expect(service).toBeInstanceOf(TSAService); + }); + + it('should evaluate a policy', async () => { + const expectedResult = {}; + const expectedResponse = { + data: expectedResult, + } as AxiosResponse; + + httpServiceMock.post.mockReturnValueOnce(of(expectedResponse)); + + const result = await service.evaluatePolicy('policies/xfsc/didresolve/1.0'); + + expect(result).toStrictEqual(expectedResult); + }); + + it('should handle string response', async () => { + const expectedResult = '{}'; + const expectedResponse = { + data: expectedResult, + } as AxiosResponse; + + httpServiceMock.post.mockReturnValueOnce(of(expectedResponse)); + + const result = await service.evaluatePolicy('policies/xfsc/didresolve/1.0'); + + expect(result).toEqual(JSON.parse(expectedResult)); + }); +}); diff --git a/apps/shared/src/modules/tsa/index.ts b/apps/shared/src/modules/tsa/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..14af3a7dfbb0b73ccfc9e97bb7d3304a6421ad55 --- /dev/null +++ b/apps/shared/src/modules/tsa/index.ts @@ -0,0 +1,2 @@ +export * from './tsa.module.js'; +export * from './tsa.service.js'; diff --git a/apps/shared/src/modules/tsa/interfaces/tsa-module-options.interface.ts b/apps/shared/src/modules/tsa/interfaces/tsa-module-options.interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..b06a2385d00ae0e1239e4daa7b89baedcc297c8f --- /dev/null +++ b/apps/shared/src/modules/tsa/interfaces/tsa-module-options.interface.ts @@ -0,0 +1,3 @@ +export interface TSAModuleOptions { + tsaBaseUrl: string; +} diff --git a/apps/shared/src/modules/tsa/tsa.module-definition.ts b/apps/shared/src/modules/tsa/tsa.module-definition.ts new file mode 100644 index 0000000000000000000000000000000000000000..086768bb1b7a72a5e8615ed2115884fb4fc26725 --- /dev/null +++ b/apps/shared/src/modules/tsa/tsa.module-definition.ts @@ -0,0 +1,10 @@ +import type { TSAModuleOptions } from './interfaces/tsa-module-options.interface.js'; + +import { ConfigurableModuleBuilder } from '@nestjs/common'; + +export const { + ConfigurableModuleClass, + MODULE_OPTIONS_TOKEN, + OPTIONS_TYPE, + ASYNC_OPTIONS_TYPE, +} = new ConfigurableModuleBuilder<TSAModuleOptions>().build(); diff --git a/apps/shared/src/modules/tsa/tsa.module.ts b/apps/shared/src/modules/tsa/tsa.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..c0bf4e38fc45be075856627ba750b4869791582d --- /dev/null +++ b/apps/shared/src/modules/tsa/tsa.module.ts @@ -0,0 +1,12 @@ +import { HttpModule } from '@nestjs/axios'; +import { Module } from '@nestjs/common'; + +import { ConfigurableModuleClass } from './tsa.module-definition.js'; +import { TSAService } from './tsa.service.js'; + +@Module({ + imports: [HttpModule], + providers: [TSAService], + exports: [TSAService], +}) +export class TSAModule extends ConfigurableModuleClass {} diff --git a/apps/shared/src/modules/tsa/tsa.service.ts b/apps/shared/src/modules/tsa/tsa.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..65d21e1ba77c2665a01f680befe9d9247a45d7a7 --- /dev/null +++ b/apps/shared/src/modules/tsa/tsa.service.ts @@ -0,0 +1,41 @@ +import { HttpService } from '@nestjs/axios'; +import { Inject, Injectable } from '@nestjs/common'; +import { map } from 'rxjs'; + +import { TSAModuleOptions } from './interfaces/tsa-module-options.interface.js'; +import { MODULE_OPTIONS_TOKEN } from './tsa.module-definition.js'; + +@Injectable() +export class TSAService { + public constructor( + private readonly http: HttpService, + @Inject(MODULE_OPTIONS_TOKEN) + private readonly moduleOptions: TSAModuleOptions, + ) {} + + /** + * Evaluates the given policy. + * The policy should be specified in the format `repository/group/policy/version`. + * + * @param policy - The policy to evaluate. The format is `repository/group/policy/version`, + * @example `policies/xfsc/didresolve/1.0` + */ + public evaluatePolicy( + policy: `${string}/${string}/${string}/${string}`, + input?: Record<string, unknown>, + ) { + return this.http + .post(`/policy/${policy}/evaluation`, input, { + baseURL: this.moduleOptions.tsaBaseUrl, + }) + .pipe( + map(({ data }) => { + if (typeof data === 'string') { + return JSON.parse(data); + } + + return data; + }), + ); + } +} diff --git a/apps/shared/src/staticStorage.ts b/apps/shared/src/staticStorage.ts new file mode 100644 index 0000000000000000000000000000000000000000..8dd7e1104403590b35aabc94c58f9c7d2deac068 --- /dev/null +++ b/apps/shared/src/staticStorage.ts @@ -0,0 +1,60 @@ +import axios, { AxiosHeaders } from 'axios'; + +export type UploadToS3Options = { + s3Url: string; + bucketName: string; + fileId: string; + content: Uint8Array; + accessKey: string; + secret: string; +}; + +const generateRfc1123Date = () => + new Date() + .toLocaleString('en-GB', { + timeZone: 'UTC', + hour12: false, + weekday: 'short', + year: 'numeric', + month: 'short', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }) + .replace(/(?:(\d),)/, '$1') + ' GMT'; + +// Upload to S3 and return the URL to fetch it from +export const uploadToS3 = async ({ + s3Url, + content, + fileId, + bucketName, + accessKey, + secret, +}: UploadToS3Options) => { + // TODO: double check all headers + const headers = new AxiosHeaders() + .set('Host', s3Url) + .set('Date', generateRfc1123Date()) + .set('Content-Type', 'application/octet-stream') + .set('Authorization', accessKey) + .set('Secret', secret); + + const sanitizedUrl = s3Url.endsWith('/') + ? s3Url.slice(0, s3Url.length - 1) + : s3Url; + + const url = `${sanitizedUrl}/${bucketName}/${fileId}`; + + // TODO: check whether we need to include the sig or not + const result = await axios.put(url, content, { + headers, + }); + + if (result.status > 299) { + throw new Error(`Error uploading to S3. Error: ${JSON.stringify(result)}`); + } + + return url; +}; diff --git a/apps/ssi-abstraction/.env.example b/apps/ssi-abstraction/.env.example index e7ce57b5cd5a7ccba1ac2b0c35f663220b679ec4..73ad4533fee88fde13e14fb45fd9e8d7d38b3e87 100644 --- a/apps/ssi-abstraction/.env.example +++ b/apps/ssi-abstraction/.env.example @@ -1,20 +1,23 @@ -PORT=3009 -AFJ_EXT_PORT=3010 +HTTP_HOSTNAME=0.0.0.0 +HTTP_PORT=4005 + NATS_URL=nats://localhost:4222 -ECSURL=http://localhost:9200/ -AGENT_HOST=https://gaiax.vereign.com -TAILS_SERVER_BASE_URL=http://localhost:3000/tails +NATS_USER=nats_user +NATS_PASSWORD=nats_password +NATS_MONITORING_URL=nats://localhost:8222 AGENT_NAME=ssi-abstraction-agent -AGENT_PEER_PORT=:4000 -AGENT_URL_PATH=/ocm/abstraction -AGENT_PUBLIC_DID_SEED=6b8b882e2618fa5d45ee7229ca880083 +AGENT_WALLET_ID=ssi-wallet-id +AGENT_WALLET_KEY=ssi-wallet-key +AGENT_HOST=http://localhost +AGENT_INBOUND_PORT=3001 +AGENT_PUBLIC_DID_SEED=6b8b882e2618fa5d45ee7229ca000000 AGENT_AUTO_ACCEPT_CONNECTION=true AGENT_AUTO_ACCEPT_CREDENTIAL=contentApproved +AGENT_LEDGER_ID=BCOVRIN_TEST -AGENT_WALLET_KEY=ssi-wallet-key -AGENT_WALLET_ID=ssi-wallet-id +TAILS_SERVER_BASE_URL=http://localhost:9000 +TAILS_SERVER_BUCKET_NAME=ssi -# AGENT_LEDGER_ID=ID_UNION,BCOVRIN_TEST -AGENT_LEDGER_ID=BCOVRIN_TEST -AGENT_ID_UNION_KEY=example-example-example-example +S3_ACCESS_KEY=ssi-abstraction +S3_SECRET=very-long-secret-key diff --git a/apps/ssi-abstraction/jest.config.js b/apps/ssi-abstraction/jest.config.js index f305cf2e1105561c3342c6e270daf66b79d905d3..869cf5fe85912143f892a6c3d4b92e5fa6557527 100644 --- a/apps/ssi-abstraction/jest.config.js +++ b/apps/ssi-abstraction/jest.config.js @@ -18,7 +18,7 @@ export default { }, ], }, - testPathIgnorePatterns: ['<rootDir>/dist'], + testPathIgnorePatterns: ['<rootDir>/dist', 'mockConfig.ts'], extensionsToTreatAsEsm: ['.ts'], moduleNameMapper: { // ESM modules require `.js` extension to be specified, but Jest doesn't work with them diff --git a/apps/ssi-abstraction/package.json b/apps/ssi-abstraction/package.json index 3bbea7c653d57e8e8dcf25a8ce994dcef3fcd7c9..80980536789bd4dd6ddf5a33e3841df82002eae5 100644 --- a/apps/ssi-abstraction/package.json +++ b/apps/ssi-abstraction/package.json @@ -15,51 +15,53 @@ "test:e2e": "pnpm test -- -c=test/jest.config.js --runInBand" }, "dependencies": { - "@credo-ts/anoncreds": "0.5.0-alpha.116", - "@credo-ts/askar": "0.5.0-alpha.116", - "@credo-ts/core": "0.5.0-alpha.116", - "@credo-ts/indy-vdr": "0.5.0-alpha.116", - "@credo-ts/node": "0.5.0-alpha.116", - "@credo-ts/tenants": "^0.5.0-alpha.116", - "@elastic/ecs-winston-format": "^1.5.0", - "@hyperledger/anoncreds-nodejs": "^0.2.0-dev.9", - "@hyperledger/aries-askar-nodejs": "^0.2.0-dev.6", - "@hyperledger/indy-vdr-nodejs": "^0.2.0-dev.6", - "@nestjs/axios": "^3.0.1", - "@nestjs/common": "^10.3.0", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.3.0", - "@nestjs/microservices": "^10.3.0", - "@nestjs/terminus": "^10.2.0", + "@credo-ts/anoncreds": "0.5.0-alpha.138", + "@credo-ts/askar": "0.5.0-alpha.138", + "@credo-ts/core": "0.5.0-alpha.138", + "@credo-ts/indy-vdr": "0.5.0-alpha.138", + "@credo-ts/node": "0.5.0-alpha.138", + "@credo-ts/tenants": "0.5.0-alpha.138", + "@elastic/ecs-winston-format": "1.5.2", + "@hyperledger/anoncreds-nodejs": "0.2.0", + "@hyperledger/aries-askar-nodejs": "0.2.0", + "@hyperledger/indy-vdr-nodejs": "0.2.0", + "@nestjs/axios": "3.0.2", + "@nestjs/common": "10.3.3", + "@nestjs/config": "3.2.0", + "@nestjs/core": "10.3.3", + "@nestjs/microservices": "10.3.3", + "@nestjs/terminus": "10.2.3", "@ocm/shared": "workspace:*", - "axios": "^1.6.2", - "express": "^4.17.3", - "joi": "^17.6.0", - "minio": "^7.1.3", - "nats": "^2.18.0", - "rxjs": "^7.2.0", - "winston": "^3.11.0" + "axios": "1.6.7", + "express": "4.18.2", + "helmet": "7.1.0", + "joi": "17.12.1", + "minio": "7.1.3", + "nats": "2.19.0", + "rxjs": "7.8.1", + "winston": "3.11.0" }, "devDependencies": { - "@nestjs/cli": "^10.2.1", - "@nestjs/schematics": "^10.0.3", - "@nestjs/testing": "^10.2.10", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.9", - "@types/node": "^20.9.3", - "@types/supertest": "^2.0.16", - "@typescript-eslint/eslint-plugin": "^6.12.0", - "@typescript-eslint/parser": "^6.12.0", - "eslint": "^8.54.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.1", - "jest": "^29.7.0", - "prettier": "^3.1.0", - "rimraf": "^5.0.5", - "supertest": "^6.1.3", - "ts-jest": "^29.1.1", - "ts-node": "^10.0.0", - "tsconfig-paths": "^4.2.0", - "typescript": "~5.3.2" + "@nestjs/cli": "10.3.2", + "@nestjs/schematics": "10.1.1", + "@nestjs/testing": "10.3.3", + "@types/express": "4.17.21", + "@types/jest": "29.5.12", + "@types/node": "20.11.19", + "@types/supertest": "6.0.2", + "@typescript-eslint/eslint-plugin": "7.0.2", + "@typescript-eslint/parser": "7.0.2", + "eslint": "8.56.0", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-prettier": "5.1.3", + "jest": "29.7.0", + "prettier": "3.2.5", + "rimraf": "5.0.5", + "supertest": "6.3.4", + "testcontainers": "10.7.1", + "ts-jest": "29.1.2", + "ts-node": "10.9.2", + "tsconfig-paths": "4.2.0", + "typescript": "5.3.3" } } diff --git a/apps/ssi-abstraction/src/agent/agent.service.ts b/apps/ssi-abstraction/src/agent/agent.service.ts index 00423dca4b2dbff94b294ae6b917b74205934901..2aba394d86c157d96431ed06bd42d57b355faae6 100644 --- a/apps/ssi-abstraction/src/agent/agent.service.ts +++ b/apps/ssi-abstraction/src/agent/agent.service.ts @@ -30,6 +30,7 @@ import { V2CredentialProtocol, V2ProofProtocol, WebDidResolver, + WsOutboundTransport, } from '@credo-ts/core'; import { IndyVdrAnonCredsRegistry, @@ -77,7 +78,7 @@ export class AgentService implements OnApplicationShutdown { }); this.agent.registerInboundTransport(httpInbound); - + this.agent.registerOutboundTransport(new WsOutboundTransport()); this.agent.registerOutboundTransport(new HttpOutboundTransport()); } @@ -95,6 +96,7 @@ export class AgentService implements OnApplicationShutdown { }, endpoints, logger: new AgentLogger(LogLevel.debug), + autoUpdateStorageOnStartup: true, }; } diff --git a/apps/ssi-abstraction/src/agent/anoncredsCredentials/anoncredsCredentials.service.ts b/apps/ssi-abstraction/src/agent/anoncredsCredentials/anoncredsCredentials.service.ts index 103f0c2ba80d4795a13fe4d0de965991cc2ae266..6159fcf964c451c8ce98977668a6e943548db6db 100644 --- a/apps/ssi-abstraction/src/agent/anoncredsCredentials/anoncredsCredentials.service.ts +++ b/apps/ssi-abstraction/src/agent/anoncredsCredentials/anoncredsCredentials.service.ts @@ -217,8 +217,6 @@ export class AnonCredsCredentialsService { throw new Error('Connection with yourself is not ready, yet'); } - const revocationRegistryIndex = await this.getNextRevocationIdx(t); - const acceptOfferListener = new Promise((resolve) => { this.agentService.agent.events.on<CredentialStateChangedEvent>( CredentialEventTypes.CredentialStateChanged, @@ -262,6 +260,8 @@ export class AnonCredsCredentialsService { ), ); + const revocationRegistryIndex = await this.getNextRevocationIdx(t); + void t.credentials.offerCredential({ protocolVersion: 'v2', autoAcceptCredential: AutoAcceptCredential.Always, diff --git a/apps/ssi-abstraction/src/agent/anoncredsProofs/__tests__/anoncredsProofs.controller.spec.ts b/apps/ssi-abstraction/src/agent/anoncredsProofs/__tests__/anoncredsProofs.controller.spec.ts index 128025b4f613c2a628749ff984f7968e634ac601..3e4bbf21d861114a51d6e202bd8d8c06c17a507f 100644 --- a/apps/ssi-abstraction/src/agent/anoncredsProofs/__tests__/anoncredsProofs.controller.spec.ts +++ b/apps/ssi-abstraction/src/agent/anoncredsProofs/__tests__/anoncredsProofs.controller.spec.ts @@ -74,4 +74,20 @@ describe('AnonCredsProofsController', () => { expect(event.data).toStrictEqual(result); }); + + it('accept', async () => { + const result = new ProofExchangeRecord({ + state: ProofState.Done, + threadId: 'some-id', + protocolVersion: 'v2', + }); + jest.spyOn(proofsService, 'accept').mockResolvedValue(result); + + const event = await proofsController.accept({ + tenantId: 'some-id', + proofRecordId: 'some-id', + }); + + expect(event.data).toStrictEqual(result); + }); }); diff --git a/apps/ssi-abstraction/src/agent/anoncredsProofs/anoncredsProofs.controller.ts b/apps/ssi-abstraction/src/agent/anoncredsProofs/anoncredsProofs.controller.ts index c29a03defeba3e94702a26aac505c0fe3bb3b7e0..053c112d22cfcc14be99a4cf4c552368b0e18bff 100644 --- a/apps/ssi-abstraction/src/agent/anoncredsProofs/anoncredsProofs.controller.ts +++ b/apps/ssi-abstraction/src/agent/anoncredsProofs/anoncredsProofs.controller.ts @@ -7,6 +7,8 @@ import { EventAnonCredsProofsGetAllInput, EventAnonCredsProofsGetById, EventAnonCredsProofsGetByIdInput, + EventDidcommAnonCredsProofsAcceptRequest, + EventDidcommAnonCredsProofsAcceptRequestInput, EventDidcommAnonCredsProofsRequest, EventDidcommAnonCredsProofsRequestInput, } from '@ocm/shared'; @@ -56,4 +58,14 @@ export class AnonCredsProofsController { options.tenantId, ); } + + @MessagePattern(EventDidcommAnonCredsProofsAcceptRequest.token) + public async accept( + options: EventDidcommAnonCredsProofsAcceptRequestInput, + ): Promise<EventDidcommAnonCredsProofsAcceptRequest> { + return new EventDidcommAnonCredsProofsAcceptRequest( + await this.proofsService.accept(options), + options.tenantId, + ); + } } diff --git a/apps/ssi-abstraction/src/agent/anoncredsProofs/anoncredsProofs.service.ts b/apps/ssi-abstraction/src/agent/anoncredsProofs/anoncredsProofs.service.ts index 6de76335a02b03d4221795d498357d7d615eb4a5..7f02df385dd6c1ee5436b95d96110af459e08b9e 100644 --- a/apps/ssi-abstraction/src/agent/anoncredsProofs/anoncredsProofs.service.ts +++ b/apps/ssi-abstraction/src/agent/anoncredsProofs/anoncredsProofs.service.ts @@ -5,6 +5,8 @@ import type { EventAnonCredsProofsGetAllInput, EventAnonCredsProofsGetById, EventAnonCredsProofsGetByIdInput, + EventDidcommAnonCredsProofsAcceptRequest, + EventDidcommAnonCredsProofsAcceptRequestInput, EventDidcommAnonCredsProofsRequest, EventDidcommAnonCredsProofsRequestInput, } from '@ocm/shared'; @@ -85,4 +87,15 @@ export class AnonCredsProofsService { }), ); } + + public async accept({ + tenantId, + proofRecordId, + }: EventDidcommAnonCredsProofsAcceptRequestInput): Promise< + EventDidcommAnonCredsProofsAcceptRequest['data'] + > { + return this.withTenantService.invoke(tenantId, (t) => + t.proofs.acceptRequest({ proofRecordId }), + ); + } } diff --git a/apps/ssi-abstraction/src/agent/connections/__tests__/connections.controller.spec.ts b/apps/ssi-abstraction/src/agent/connections/__tests__/connections.controller.spec.ts index 33338961b25b5a67e01aab02f1fa4edc04e19a9c..d8554e6f06952687a30632949744dd7e475f4214 100644 --- a/apps/ssi-abstraction/src/agent/connections/__tests__/connections.controller.spec.ts +++ b/apps/ssi-abstraction/src/agent/connections/__tests__/connections.controller.spec.ts @@ -2,6 +2,7 @@ import { ConnectionRecord, DidExchangeRole, DidExchangeState, + OutOfBandInvitation, } from '@credo-ts/core'; import { Test } from '@nestjs/testing'; @@ -70,4 +71,24 @@ describe('ConnectionsController', () => { expect(event.data).toStrictEqual(result); }); }); + + describe('parse invitation', () => { + it('should create a connection with itself', async () => { + const result = new OutOfBandInvitation({ + label: 'some-label', + services: [], + }); + + jest + .spyOn(connectionsService, 'parseInvitation') + .mockResolvedValue(result); + + const event = await connectionsController.parseInvitation({ + tenantId: 'some-id', + invitationUrl: 'https://example.org', + }); + + expect(event.data).toStrictEqual(result); + }); + }); }); diff --git a/apps/ssi-abstraction/src/agent/connections/connections.controller.ts b/apps/ssi-abstraction/src/agent/connections/connections.controller.ts index 8b59f12e9c8cf97917058de9f7dc29b9d524f90b..2eb14d95ba127e5f3f7b591f363d1dbf5ad7fb09 100644 --- a/apps/ssi-abstraction/src/agent/connections/connections.controller.ts +++ b/apps/ssi-abstraction/src/agent/connections/connections.controller.ts @@ -13,6 +13,8 @@ import { EventDidcommConnectionsCreateInvitationInput, EventDidcommConnectionsReceiveInvitationFromUrl, EventDidcommConnectionsReceiveInvitationFromUrlInput, + EventDidcommConnectionsParseInvitation, + EventDidcommConnectionsParseInvitationInput, } from '@ocm/shared'; import { ConnectionsService } from './connections.service.js'; @@ -80,4 +82,14 @@ export class ConnectionsController { options.tenantId, ); } + + @MessagePattern(EventDidcommConnectionsParseInvitation.token) + public async parseInvitation( + options: EventDidcommConnectionsParseInvitationInput, + ): Promise<EventDidcommConnectionsParseInvitation> { + return new EventDidcommConnectionsParseInvitation( + await this.connectionsService.parseInvitation(options), + options.tenantId, + ); + } } diff --git a/apps/ssi-abstraction/src/agent/connections/connections.service.ts b/apps/ssi-abstraction/src/agent/connections/connections.service.ts index 7981414335eaa5fc2b92e32b2ae2e11582048e21..776cbeb0ad6cb28c6d0d49b597a6d2fde9038290 100644 --- a/apps/ssi-abstraction/src/agent/connections/connections.service.ts +++ b/apps/ssi-abstraction/src/agent/connections/connections.service.ts @@ -12,6 +12,8 @@ import type { EventDidcommConnectionsGetAllInput, EventDidcommConnectionsGetById, EventDidcommConnectionsGetByIdInput, + EventDidcommConnectionsParseInvitation, + EventDidcommConnectionsParseInvitationInput, EventDidcommConnectionsReceiveInvitationFromUrlInput, } from '@ocm/shared'; @@ -179,4 +181,15 @@ export class ConnectionsService { ); }); } + + public async parseInvitation({ + tenantId, + invitationUrl, + }: EventDidcommConnectionsParseInvitationInput): Promise< + EventDidcommConnectionsParseInvitation['data'] + > { + return this.withTenantService.invoke(tenantId, async (t) => + t.oob.parseInvitation(invitationUrl), + ); + } } diff --git a/apps/ssi-abstraction/src/agent/revocation/revocation.service.ts b/apps/ssi-abstraction/src/agent/revocation/revocation.service.ts index 20b0cf874f223f5f4f4d55fb1c60c715363ff58a..9387f74c50dff1446de9d1f1ce5962ebfd53c15a 100644 --- a/apps/ssi-abstraction/src/agent/revocation/revocation.service.ts +++ b/apps/ssi-abstraction/src/agent/revocation/revocation.service.ts @@ -124,35 +124,40 @@ export class RevocationService { endorserDid, ); - const revocationRegisryDefinitionSubmitResult = - await t.modules.anoncreds.registerRevocationRegistryDefinition({ - options: { - endorsedTransaction: signedRevocationRegistryDefinitionRequest, - endorserMode: 'external', - }, - revocationRegistryDefinition: { - maximumCredentialNumber: - revocationRegistryDefinitionState.revocationRegistryDefinition - .value.maxCredNum, - credentialDefinitionId: - revocationRegistryDefinitionState.revocationRegistryDefinition - .credDefId, - tag: revocationRegistryDefinitionState.revocationRegistryDefinition - .tag, - issuerId: - revocationRegistryDefinitionState.revocationRegistryDefinition - .issuerId, - }, - }); - - if ( - revocationRegisryDefinitionSubmitResult - .revocationRegistryDefinitionState.state !== 'finished' - ) { - throw Error( - `Error while registering revocation registry definition Cause: ${JSON.stringify(revocationRegisryDefinitionSubmitResult)}`, - ); - } + // const revocationRegisryDefinitionSubmitResult = + // await t.modules.anoncreds.registerRevocationRegistryDefinition({ + // options: { + // endorsedTransaction: signedRevocationRegistryDefinitionRequest, + // endorserMode: 'external', + // }, + // revocationRegistryDefinition: { + // maximumCredentialNumber: + // revocationRegistryDefinitionState.revocationRegistryDefinition + // .value.maxCredNum, + // credentialDefinitionId: + // revocationRegistryDefinitionState.revocationRegistryDefinition + // .credDefId, + // tag: revocationRegistryDefinitionState.revocationRegistryDefinition + // .tag, + // issuerId: + // revocationRegistryDefinitionState.revocationRegistryDefinition + // .issuerId, + // }, + // }); + + // if ( + // revocationRegisryDefinitionSubmitResult + // .revocationRegistryDefinitionState.state !== 'finished' + // ) { + // throw Error( + // `Error while registering revocation registry definition Cause: ${JSON.stringify(revocationRegisryDefinitionSubmitResult)}`, + // ); + // } + + await t.modules.indyVdr.submitTransaction( + signedRevocationRegistryDefinitionRequest, + issuerDid, + ); return { revocationRegistryDefinitionId: @@ -254,7 +259,7 @@ export class RevocationService { !metadata.credentialRevocationId ) { throw new Error( - `credential (${credentialId}) has no metadata, likley it was issued without support for revocation`, + `credential (${credentialId}) has no metadata, likely it was issued without support for revocation`, ); } diff --git a/apps/ssi-abstraction/src/agent/tenants/__tests__/tenants.controller.spec.ts b/apps/ssi-abstraction/src/agent/tenants/__tests__/tenants.controller.spec.ts index d2f9a7358b7f79d5682b9c9fcc80504093c8fa1c..847865670e5100379a29c45d70c28ef0cc0dd90e 100644 --- a/apps/ssi-abstraction/src/agent/tenants/__tests__/tenants.controller.spec.ts +++ b/apps/ssi-abstraction/src/agent/tenants/__tests__/tenants.controller.spec.ts @@ -21,21 +21,28 @@ describe('TenantsController', () => { tenantsController = moduleRef.get(TenantsController); }); - describe('resolve', () => { - it('should resolve a basic did', async () => { - const result = new TenantRecord({ - config: { - label: 'my-label', - walletConfig: { key: 'some-key', id: 'some-id' }, - }, - }); - jest.spyOn(tenantsService, 'create').mockResolvedValue(result); - - const event = await tenantsController.create({ + it('create', async () => { + const result = new TenantRecord({ + config: { label: 'my-label', - }); + walletConfig: { key: 'some-key', id: 'some-id' }, + }, + }); + jest.spyOn(tenantsService, 'create').mockResolvedValue(result); - expect(event.data).toStrictEqual(result); + const event = await tenantsController.create({ + label: 'my-label', }); + + expect(event.data).toStrictEqual(result); + }); + + it('get All', async () => { + const result = ['some-id', 'another-id']; + jest.spyOn(tenantsService, 'getAllTenantIds').mockResolvedValue(result); + + const event = await tenantsController.getAllTenantIds(); + + expect(event.data).toStrictEqual(result); }); }); diff --git a/apps/ssi-abstraction/src/agent/tenants/tenants.controller.ts b/apps/ssi-abstraction/src/agent/tenants/tenants.controller.ts index f7bef9055c039c692b7b36c9bbb154944e0e8cd6..ef867a1c6168efb0e3b47fc401e84c2ab4f43664 100644 --- a/apps/ssi-abstraction/src/agent/tenants/tenants.controller.ts +++ b/apps/ssi-abstraction/src/agent/tenants/tenants.controller.ts @@ -1,6 +1,10 @@ import { Controller } from '@nestjs/common'; import { MessagePattern } from '@nestjs/microservices'; -import { EventTenantsCreate, EventTenantsCreateInput } from '@ocm/shared'; +import { + EventTenantsCreate, + EventTenantsCreateInput, + EventTenantsGetAllTenantIds, +} from '@ocm/shared'; import { TenantsService } from './tenants.service.js'; @@ -17,4 +21,12 @@ export class TenantsController { undefined, ); } + + @MessagePattern(EventTenantsGetAllTenantIds.token) + public async getAllTenantIds(): Promise<EventTenantsGetAllTenantIds> { + return new EventTenantsGetAllTenantIds( + await this.tenantsService.getAllTenantIds(), + undefined, + ); + } } diff --git a/apps/ssi-abstraction/src/agent/tenants/tenants.service.ts b/apps/ssi-abstraction/src/agent/tenants/tenants.service.ts index f5772a384528f9c058db87bce4d2ed9def9e32ad..cd3b0e69c5a44341b5b8f01c9cc98c32df3c0a9e 100644 --- a/apps/ssi-abstraction/src/agent/tenants/tenants.service.ts +++ b/apps/ssi-abstraction/src/agent/tenants/tenants.service.ts @@ -1,6 +1,11 @@ import type { AppAgent } from '../agent.service.js'; -import type { EventTenantsCreate, EventTenantsCreateInput } from '@ocm/shared'; +import type { + EventTenantsCreate, + EventTenantsCreateInput, + EventTenantsGetAllTenantIds, +} from '@ocm/shared'; +import { TenantRepository } from '@credo-ts/tenants/build/repository/TenantRepository.js'; import { Injectable } from '@nestjs/common'; import { AgentService } from '../agent.service.js'; @@ -13,11 +18,18 @@ export class TenantsService { this.agent = agentService.agent; } - public async create( - options: EventTenantsCreateInput, - ): Promise<EventTenantsCreate['data']> { - return await this.agent.modules.tenants.createTenant({ - config: { label: options.label }, - }); + public async create({ + label, + }: EventTenantsCreateInput): Promise<EventTenantsCreate['data']> { + return await this.agent.modules.tenants.createTenant({ config: { label } }); + } + + public async getAllTenantIds(): Promise<EventTenantsGetAllTenantIds['data']> { + const tenantRepository = + this.agent.dependencyManager.resolve(TenantRepository); + + const tenantRecords = await tenantRepository.getAll(this.agent.context); + + return tenantRecords.map((t) => t.id); } } diff --git a/apps/ssi-abstraction/src/agent/withTenantService.ts b/apps/ssi-abstraction/src/agent/withTenantService.ts index 7a7d565a5a3f2b2ad14b773c99b2bf4315c03547..d05e956c196bf57292960ca80de3e6e75610e520 100644 --- a/apps/ssi-abstraction/src/agent/withTenantService.ts +++ b/apps/ssi-abstraction/src/agent/withTenantService.ts @@ -16,10 +16,14 @@ export class WithTenantService { tenantId: string, cb: (tenant: TenantAgent) => Promise<T>, ): Promise<T> { - const tenant = await this.agent.modules.tenants.getTenantAgent({ - tenantId, - }); + try { + const tenant = await this.agent.modules.tenants.getTenantAgent({ + tenantId, + }); - return cb(tenant as unknown as TenantAgent); + return cb(tenant as unknown as TenantAgent); + } catch (e) { + return Promise.reject(e); + } } } diff --git a/apps/ssi-abstraction/src/app.module.ts b/apps/ssi-abstraction/src/app.module.ts deleted file mode 100644 index 0f1a47dfd0aa868b1e353a85d57e3ea19adbd114..0000000000000000000000000000000000000000 --- a/apps/ssi-abstraction/src/app.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { DidsModule } from '@credo-ts/core'; -import { Module } from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; -import { TerminusModule } from '@nestjs/terminus'; -import { HealthController } from '@ocm/shared'; - -import { AgentModule } from './agent/agent.module.js'; -import { AnonCredsCredentialsModule } from './agent/anoncredsCredentials/anoncredsCredentials.module.js'; -import { AnonCredsProofsModule } from './agent/anoncredsProofs/anoncredsProofs.module.js'; -import { ConnectionsModule } from './agent/connections/connections.module.js'; -import { CredentialDefinitionsModule } from './agent/credentialDefinitions/credentialDefinitions.module.js'; -import { RevocationModule } from './agent/revocation/revocation.module.js'; -import { SchemasModule } from './agent/schemas/schemas.module.js'; -import { TenantsModule } from './agent/tenants/tenants.module.js'; -import { config } from './config/config.js'; -import { validationSchema } from './config/validation.js'; - -@Module({ - imports: [ - TerminusModule, - ConfigModule.forRoot({ - isGlobal: true, - load: [config], - validationSchema, - }), - AgentModule, - ConnectionsModule, - SchemasModule, - CredentialDefinitionsModule, - DidsModule, - SchemasModule, - AnonCredsCredentialsModule, - AnonCredsProofsModule, - TenantsModule, - RevocationModule, - ], - controllers: [HealthController], -}) -export class AppModule {} diff --git a/apps/ssi-abstraction/src/application.ts b/apps/ssi-abstraction/src/application.ts new file mode 100644 index 0000000000000000000000000000000000000000..b3b95ea1c95bb8968def6e92735028afc97b48f9 --- /dev/null +++ b/apps/ssi-abstraction/src/application.ts @@ -0,0 +1,67 @@ +import type { ConfigType } from '@nestjs/config'; + +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { RouterModule } from '@nestjs/core'; +import { HealthModule } from '@ocm/shared'; + +import { AgentModule } from './agent/agent.module.js'; +import { AnonCredsCredentialsModule } from './agent/anoncredsCredentials/anoncredsCredentials.module.js'; +import { AnonCredsProofsModule } from './agent/anoncredsProofs/anoncredsProofs.module.js'; +import { ConnectionsModule } from './agent/connections/connections.module.js'; +import { CredentialDefinitionsModule } from './agent/credentialDefinitions/credentialDefinitions.module.js'; +import { DidsModule } from './agent/dids/dids.module.js'; +import { RevocationModule } from './agent/revocation/revocation.module.js'; +import { SchemasModule } from './agent/schemas/schemas.module.js'; +import { TenantsModule } from './agent/tenants/tenants.module.js'; +import { agentConfig } from './config/agent.config.js'; +import { httpConfig } from './config/http.config.js'; +import { natsConfig } from './config/nats.config.js'; +import { s3Config } from './config/s3.config.js'; +import { tailsServerConfig } from './config/tails-server.config.js'; +import { validationSchema } from './config/validation.js'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + load: [httpConfig, natsConfig, tailsServerConfig, s3Config, agentConfig], + cache: true, + expandVariables: true, + validationSchema, + validationOptions: { + allowUnknown: true, + abortEarly: true, + }, + }), + + HealthModule.registerAsync({ + inject: [natsConfig.KEY], + useFactory: (config: ConfigType<typeof natsConfig>) => { + const options: Parameters<typeof HealthModule.register>[0] = {}; + + if (config.monitoringUrl) { + options.nats = { + monitoringUrl: config.monitoringUrl, + }; + } + + return options; + }, + }), + + AgentModule, + ConnectionsModule, + SchemasModule, + CredentialDefinitionsModule, + DidsModule, + SchemasModule, + AnonCredsCredentialsModule, + AnonCredsProofsModule, + TenantsModule, + RevocationModule, + + RouterModule.register([{ module: HealthModule, path: '/health' }]), + ], +}) +export class Application {} diff --git a/apps/ssi-abstraction/src/config/__tests__/mockConfig.ts b/apps/ssi-abstraction/src/config/__tests__/mockConfig.ts index 18e219098fdcdd2ab954d67904608df8fe193abb..631cdd5e462b211cddcaf317cee99b20672c9f00 100644 --- a/apps/ssi-abstraction/src/config/__tests__/mockConfig.ts +++ b/apps/ssi-abstraction/src/config/__tests__/mockConfig.ts @@ -1,72 +1,30 @@ -import type { AppConfig } from '../config.js'; - -import { AutoAcceptCredential, utils } from '@credo-ts/core'; -import { ConfigModule, ConfigService } from '@nestjs/config'; - +import { utils } from '@credo-ts/core'; +import { ConfigModule } from '@nestjs/config'; + +import { agentConfig } from '../agent.config.js'; +import { httpConfig } from '../http.config.js'; +import { natsConfig } from '../nats.config.js'; +import { s3Config } from '../s3.config.js'; +import { tailsServerConfig } from '../tails-server.config.js'; import { validationSchema } from '../validation.js'; -const mockConfig = (port: number = 3001, withLedger = false): AppConfig => ({ - agentHost: '', - port: 3000, - s3: { - secret: 'very-long-secret-key', - accessKey: 'ssi-abstraction', - }, - tailsServer: { - baseUrl: 'http://localhost:9000', - bucketName: 'ssi', - }, - jwtSecret: '', - nats: { - url: 'localhost', - }, - agent: { - name: 'my-test-agent', - walletId: utils.uuid(), - walletKey: 'some-key', - ledgerIds: withLedger ? ['BCOVRIN_TEST'] : [], - host: 'http://localhost', - inboundPort: port, - path: '', - publicDidSeed: withLedger ? '12312367897123300000000000000000' : '', - autoAcceptConnection: true, - autoAcceptCredential: AutoAcceptCredential.ContentApproved, - }, -}); - -export const mockConfigModule = (port: number = 3000, withLedger = false) => - ConfigModule.forRoot({ - load: [() => mockConfig(port, withLedger)], +export const mockConfigModule = (port = 3000, withLedger = false) => { + process.env.AGENT_NAME = 'my-test-agent'; + process.env.AGENT_WALLET_ID = utils.uuid(); + process.env.AGENT_WALLET_KEY = 'some key'; + process.env.AGENT_HOST = 'http://localhost'; + process.env.AGENT_AUTO_ACCEPT_CONNECTION = 'true'; + process.env.AGENT_AUTO_ACCEPT_CREDENTIAL = 'contentApproved'; + process.env.AGENT_INBOUND_PORT = port.toString(); + + if (withLedger) { + process.env.AGENT_LEDGER_ID = 'BCOVRIN_TEST'; + process.env.AGENT_PUBLIC_DID_SEED = '12312367897123300000000000000000'; + } + + return ConfigModule.forRoot({ + isGlobal: true, + load: [httpConfig, natsConfig, s3Config, tailsServerConfig, agentConfig], validationSchema, }); - -describe('configuration', () => { - const mockedConfig = mockConfig(); - - describe('service', () => { - it('should be able to instantiate a config service', () => { - const configuration = new ConfigService(mockConfig()); - expect(configuration).toBeInstanceOf(ConfigService); - }); - - it('should be able to extract root value', () => { - const configuration = new ConfigService(mockConfig()); - - expect(configuration.get('port')).toStrictEqual(mockedConfig.port); - }); - - it('should be able to extract root value as object', () => { - const configuration = new ConfigService(mockConfig()); - - expect(configuration.get('agent')).toHaveProperty('name'); - }); - - it('should be able to extract nested values', () => { - const configuration = new ConfigService(mockConfig()); - - expect(configuration.get('agent.autoAcceptCredential')).toStrictEqual( - mockedConfig.agent.autoAcceptCredential, - ); - }); - }); -}); +}; diff --git a/apps/ssi-abstraction/src/config/agent.config.ts b/apps/ssi-abstraction/src/config/agent.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..2a947177a1bda36283faa1ef66050e946b708a5e --- /dev/null +++ b/apps/ssi-abstraction/src/config/agent.config.ts @@ -0,0 +1,17 @@ +import { AutoAcceptCredential } from '@credo-ts/core'; +import { registerAs } from '@nestjs/config'; + +export const agentConfig = registerAs('agent', () => ({ + name: process.env.AGENT_NAME || '', + walletId: process.env.AGENT_WALLET_ID || '', + walletKey: process.env.AGENT_WALLET_KEY || '', + ledgerIds: process.env.AGENT_LEDGER_ID?.split(',') || [], + host: process.env.AGENT_HOST || '', + inboundPort: Number(process.env.AGENT_INBOUND_PORT || '3001'), + path: process.env.AGENT_URL_PATH || '', + publicDidSeed: process.env.AGENT_PUBLIC_DID_SEED || '', + autoAcceptConnection: process.env.AGENT_AUTO_ACCEPT_CONNECTION === 'true', + autoAcceptCredential: + (process.env.AGENT_AUTO_ACCEPT_CREDENTIAL as AutoAcceptCredential) || + AutoAcceptCredential.ContentApproved, +})); diff --git a/apps/ssi-abstraction/src/config/config.ts b/apps/ssi-abstraction/src/config/config.ts index b5920024d79fe58af1a021fc6220d3aff397b43c..8506741b83713348f3f3eb6e4fbc62bc95193b6e 100644 --- a/apps/ssi-abstraction/src/config/config.ts +++ b/apps/ssi-abstraction/src/config/config.ts @@ -1,73 +1,73 @@ -import { AutoAcceptCredential } from '@credo-ts/core'; +// import { AutoAcceptCredential } from '@credo-ts/core'; -export interface AppConfig { - agentHost: string; - port: number; - jwtSecret: string; +// export interface AppConfig { +// agentHost: string; +// port: number; +// jwtSecret: string; - tailsServer: { - baseUrl: string; - bucketName: string; - }; +// tailsServer: { +// baseUrl: string; +// bucketName: string; +// }; - s3: { - secret: string; - accessKey: string; - }; +// s3: { +// secret: string; +// accessKey: string; +// }; - nats: { - url: string; - user?: string; - password?: string; - }; +// nats: { +// url: string; +// user?: string; +// password?: string; +// }; - agent: { - name: string; - walletId: string; - walletKey: string; - ledgerIds?: string[]; - host: string; - inboundPort: number; - path: string; - publicDidSeed: string; - autoAcceptConnection: boolean; - autoAcceptCredential: AutoAcceptCredential; - }; -} +// agent: { +// name: string; +// walletId: string; +// walletKey: string; +// ledgerIds?: string[]; +// host: string; +// inboundPort: number; +// path: string; +// publicDidSeed: string; +// autoAcceptConnection: boolean; +// autoAcceptCredential: AutoAcceptCredential; +// }; +// } -export const config = (): AppConfig => ({ - agentHost: process.env.AGENT_HOST || '', - port: parseInt(process.env.PORT || '3000'), - jwtSecret: process.env.JWT_SECRET || '', +// export const config = (): AppConfig => ({ +// agentHost: process.env.AGENT_HOST || '', +// port: parseInt(process.env.PORT || '3000'), +// jwtSecret: process.env.JWT_SECRET || '', - nats: { - url: process.env.NATS_URL || '', - user: process.env.NATS_USER || '', - password: process.env.NATS_PASSWORD || '', - }, +// nats: { +// url: process.env.NATS_URL || '', +// user: process.env.NATS_USER || '', +// password: process.env.NATS_PASSWORD || '', +// }, - s3: { - secret: process.env.S3_SECRET || '', - accessKey: process.env.S3_ACCESS_KEY || '', - }, +// s3: { +// secret: process.env.S3_SECRET || '', +// accessKey: process.env.S3_ACCESS_KEY || '', +// }, - tailsServer: { - baseUrl: process.env.TAILS_SERVER_BASE_URL || '', - bucketName: process.env.TAILS_SERVER_BUCKET_NAME || '', - }, +// tailsServer: { +// baseUrl: process.env.TAILS_SERVER_BASE_URL || '', +// bucketName: process.env.TAILS_SERVER_BUCKET_NAME || '', +// }, - agent: { - name: process.env.AGENT_NAME || '', - walletId: process.env.AGENT_WALLET_ID || '', - walletKey: process.env.AGENT_WALLET_KEY || '', - ledgerIds: process.env.AGENT_LEDGER_ID?.split(','), - host: process.env.AGENT_HOST || '', - inboundPort: Number(process.env.AGENT_INBOUND_PORT || '3001'), - path: process.env.AGENT_URL_PATH || '', - publicDidSeed: process.env.AGENT_PUBLIC_DID_SEED || '', - autoAcceptConnection: process.env.AGENT_AUTO_ACCEPT_CONNECTION === 'true', - autoAcceptCredential: - (process.env.AGENT_AUTO_ACCEPT_CREDENTIAL as AutoAcceptCredential) || - AutoAcceptCredential.ContentApproved, - }, -}); +// agent: { +// name: process.env.AGENT_NAME || '', +// walletId: process.env.AGENT_WALLET_ID || '', +// walletKey: process.env.AGENT_WALLET_KEY || '', +// ledgerIds: process.env.AGENT_LEDGER_ID?.split(','), +// host: process.env.AGENT_HOST || '', +// inboundPort: Number(process.env.AGENT_INBOUND_PORT || '3001'), +// path: process.env.AGENT_URL_PATH || '', +// publicDidSeed: process.env.AGENT_PUBLIC_DID_SEED || '', +// autoAcceptConnection: process.env.AGENT_AUTO_ACCEPT_CONNECTION === 'true', +// autoAcceptCredential: +// (process.env.AGENT_AUTO_ACCEPT_CREDENTIAL as AutoAcceptCredential) || +// AutoAcceptCredential.ContentApproved, +// }, +// }); diff --git a/apps/ssi-abstraction/src/config/http.config.ts b/apps/ssi-abstraction/src/config/http.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..c7b07c2dfdb215018bf33eb2083541e6809bdcd2 --- /dev/null +++ b/apps/ssi-abstraction/src/config/http.config.ts @@ -0,0 +1,6 @@ +import { registerAs } from '@nestjs/config'; + +export const httpConfig = registerAs('http', () => ({ + hostname: process.env.HTTP_HOSTNAME || '0.0.0.0', + port: Number(process.env.HTTP_PORT) || 3000, +})); diff --git a/apps/ssi-abstraction/src/config/nats.config.ts b/apps/ssi-abstraction/src/config/nats.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..194053c2e2e44070e34b8547b4a15819d02d9b75 --- /dev/null +++ b/apps/ssi-abstraction/src/config/nats.config.ts @@ -0,0 +1,8 @@ +import { registerAs } from '@nestjs/config'; + +export const natsConfig = registerAs('nats', () => ({ + url: process.env.NATS_URL || 'nats://localhost:4222', + user: process.env.NATS_USER, + password: process.env.NATS_PASSWORD, + monitoringUrl: process.env.NATS_MONITORING_URL || 'http://localhost:8222', +})); diff --git a/apps/ssi-abstraction/src/config/s3.config.ts b/apps/ssi-abstraction/src/config/s3.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..1dd52b05f4e534120337b5358dd5d77d4602caa0 --- /dev/null +++ b/apps/ssi-abstraction/src/config/s3.config.ts @@ -0,0 +1,6 @@ +import { registerAs } from '@nestjs/config'; + +export const s3Config = registerAs('s3', () => ({ + secret: process.env.S3_SECRET || '', + accessKey: process.env.S3_ACCESS_KEY || '', +})); diff --git a/apps/ssi-abstraction/src/config/tails-server.config.ts b/apps/ssi-abstraction/src/config/tails-server.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..a5a0ae70d99783eea3500fdc65cd34ef19baa56b --- /dev/null +++ b/apps/ssi-abstraction/src/config/tails-server.config.ts @@ -0,0 +1,6 @@ +import { registerAs } from '@nestjs/config'; + +export const tailsServerConfig = registerAs('tailsServer', () => ({ + baseUrl: process.env.TAILS_SERVER_BASE_URL || '', + bucketName: process.env.TAILS_SERVER_BUCKET_NAME || '', +})); diff --git a/apps/ssi-abstraction/src/config/validation.ts b/apps/ssi-abstraction/src/config/validation.ts index 68cd08234665f7da9bdf7f107f33cb6c94e48ad1..9fb9589333c03312360917ec234a6062323a706b 100644 --- a/apps/ssi-abstraction/src/config/validation.ts +++ b/apps/ssi-abstraction/src/config/validation.ts @@ -1,11 +1,13 @@ import Joi from 'joi'; export const validationSchema = Joi.object({ + HTTP_HOSTNAME: Joi.string().optional(), + HTTP_PORT: Joi.number().optional(), + NATS_URL: Joi.string().required(), NATS_USER: Joi.string().optional(), NATS_PASSWORD: Joi.string().optional(), - - PORT: Joi.number().required(), + NATS_MONITORING_URL: Joi.string().optional(), TAILS_SERVER_BASE_URL: Joi.string().required(), TAILS_SERVER_BUCKET_NAME: Joi.string().required(), diff --git a/apps/ssi-abstraction/src/main.ts b/apps/ssi-abstraction/src/main.ts index 43347467bd64206a8f8f52de99778387096693cf..5f5ed024532964c1c362bf22a2b7024a731e7aae 100644 --- a/apps/ssi-abstraction/src/main.ts +++ b/apps/ssi-abstraction/src/main.ts @@ -1,32 +1,34 @@ -import type { MicroserviceOptions, NatsOptions } from '@nestjs/microservices'; +/* c8 ignore start */ +import type { ConfigType } from '@nestjs/config'; import { Logger } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { Transport } from '@nestjs/microservices'; -import { AppModule } from './app.module.js'; -import { config } from './config/config.js'; +import { Application } from './application.js'; +import { httpConfig } from './config/http.config.js'; +import { natsConfig } from './config/nats.config.js'; -const app = await NestFactory.create(AppModule); +const app = await NestFactory.create(Application); -const { url, user, password } = config().nats; -const options: Required<NatsOptions> = { - transport: Transport.NATS, - options: {}, -}; - -if (url) { - options.options.servers = [url]; -} - -if (user && password) { - options.options.user = user; - options.options.pass = password; -} +const { url, user, password } = app.get(natsConfig.KEY) as ConfigType< + typeof natsConfig +>; -app.connectMicroservice<MicroserviceOptions>(options); - -const port = config().port; -await app.listen(port as number); +app.connectMicroservice({ + transport: Transport.NATS, + options: { + servers: [url], + user, + pass: password, + }, +}); +await app.startAllMicroservices(); + +const { hostname, port } = app.get(httpConfig.KEY) as ConfigType< + typeof httpConfig +>; +await app.listen(port, hostname); Logger.log(`Application is running on: ${await app.getUrl()}`); +/* c8 ignore stop */ diff --git a/apps/ssi-abstraction/test/_setup.ts b/apps/ssi-abstraction/test/_setup.ts new file mode 100644 index 0000000000000000000000000000000000000000..deb18a51f31466c6969ac004dc159b74486844d0 --- /dev/null +++ b/apps/ssi-abstraction/test/_setup.ts @@ -0,0 +1,86 @@ +import { randomBytes } from 'node:crypto'; +import { Wait, GenericContainer, Network } from 'testcontainers'; + +export default async function setup() { + const natsCredentials = { + user: 'nats_' + randomBytes(8).toString('hex'), + password: randomBytes(16).toString('hex'), + }; + + const s3Credentials = { + secretKey: randomBytes(16).toString('hex'), + accessKey: randomBytes(16).toString('hex'), + }; + + const network = await new Network().start(); + + const [nats, minio] = await Promise.all([ + new GenericContainer('nats') + .withNetwork(network) + .withExposedPorts(4222, 8222) + .withCommand([ + '--config', + 'nats-server.conf', + '--debug', + '--trace', + '--user', + natsCredentials.user, + '--pass', + natsCredentials.password, + ]) + .withWaitStrategy(Wait.forLogMessage('Server is ready')) + .start(), + + new GenericContainer('minio/minio') + .withNetwork(network) + .withExposedPorts(9000, 9001) + .withEnvironment({ + MINIO_ROOT_USER: 'minio', + MINIO_ROOT_PASSWORD: 'minio123', + }) + .withCommand(['server', '/data', '--console-address', ':9001']) + .withWaitStrategy( + Wait.forLogMessage('Status: 1 Online, 0 Offline.'), + ) + .start(), + ]); + + const s3URL = new URL('http://' + minio.getIpAddress(network.getName())); + s3URL.port = '9000'; + + const initS3 = await new GenericContainer('minio/mc') + .withNetwork(network) + .withEntrypoint(['/bin/sh', '-c']) + .withCommand([ + ` + /usr/bin/mc config host add ssi-s3 ${s3URL.toString()} minio minio123; + /usr/bin/mc mb --ignore-existing ssi-s3/ssi; + /usr/bin/mc anonymous set download ssi-s3/ssi; + /usr/bin/mc admin user add ssi-s3 ${s3Credentials.accessKey} ${s3Credentials.secretKey}; + /usr/bin/mc admin policy attach ssi-s3 readwrite --user=${s3Credentials.accessKey}; + exit 0; + `, + ]) + .start(); + + const natsURL = new URL('nats://' + nats.getHost()); + natsURL.port = nats.getMappedPort(4222).toString(); + + const natsMonitoringURL = new URL('http://' + nats.getHost()); + natsMonitoringURL.port = nats.getMappedPort(8222).toString(); + + process.env.NATS_URL = natsURL.toString(); + process.env.NATS_USER = natsCredentials.user; + process.env.NATS_PASSWORD = natsCredentials.password; + process.env.NATS_MONITORING_URL = natsMonitoringURL.toString(); + + const tailsServerURL = new URL('http://' + minio.getHost()); + tailsServerURL.port = minio.getMappedPort(9000).toString(); + + process.env.TAILS_SERVER_BASE_URL = tailsServerURL.toString(); + process.env.TAILS_SERVER_BUCKET_NAME = 'ssi'; + process.env.S3_ACCESS_KEY = s3Credentials.accessKey; + process.env.S3_SECRET = s3Credentials.secretKey; + + Reflect.defineProperty(global, '__TESTCONTAINERS__', [nats, minio, initS3]); +} diff --git a/apps/ssi-abstraction/test/_teardown.ts b/apps/ssi-abstraction/test/_teardown.ts new file mode 100644 index 0000000000000000000000000000000000000000..506a6d16f8f38196ca80336321fd50de8291e2af --- /dev/null +++ b/apps/ssi-abstraction/test/_teardown.ts @@ -0,0 +1,14 @@ +import type { StartedTestContainer } from 'testcontainers'; + +export default async function teardown() { + const globalTestcontainers: StartedTestContainer[] = Reflect.get( + global, + '__TESTCONTAINERS__', + ); + + if (!globalTestcontainers) { + return; + } + + await Promise.all(globalTestcontainers.map((container) => container.stop())); +} diff --git a/apps/ssi-abstraction/test/anoncredsCredentials.e2e-spec.ts b/apps/ssi-abstraction/test/anoncredsCredentials.e2e-spec.ts index e90864892823e43c0af05a087c5e4c3ee1486b2f..506d439e29e1b36e9a87cc505f43031d4575345c 100644 --- a/apps/ssi-abstraction/test/anoncredsCredentials.e2e-spec.ts +++ b/apps/ssi-abstraction/test/anoncredsCredentials.e2e-spec.ts @@ -1,4 +1,5 @@ import type { INestApplication } from '@nestjs/common'; +import type { ConfigType } from '@nestjs/config'; import type { ClientProxy } from '@nestjs/microservices'; import type { EventAnonCredsCredentialOfferGetAllInput, @@ -36,6 +37,7 @@ import { import { randomBytes } from 'crypto'; import { firstValueFrom } from 'rxjs'; +import { natsConfig } from '../dist/config/nats.config.js'; import { AgentModule } from '../src/agent/agent.module.js'; import { AnonCredsCredentialsModule } from '../src/agent/anoncredsCredentials/anoncredsCredentials.module.js'; import { ConnectionsModule } from '../src/agent/connections/connections.module.js'; @@ -50,7 +52,7 @@ import { TenantsModule } from '../src/agent/tenants/tenants.module.js'; import { TenantsService } from '../src/agent/tenants/tenants.service.js'; import { mockConfigModule } from '../src/config/__tests__/mockConfig.js'; -describe('Credentials', () => { +describe.skip('Credentials', () => { const TOKEN = 'CREDENTIALS_CLIENT_SERVICE'; let app: INestApplication; let client: ClientProxy; @@ -64,6 +66,7 @@ describe('Credentials', () => { const moduleRef = await Test.createTestingModule({ imports: [ mockConfigModule(3004, true), + AgentModule, ConnectionsModule, SchemasModule, @@ -71,13 +74,37 @@ describe('Credentials', () => { AnonCredsCredentialsModule, TenantsModule, DidsModule, - ClientsModule.register([{ name: TOKEN, transport: Transport.NATS }]), + + ClientsModule.registerAsync({ + clients: [ + { + name: TOKEN, + inject: [natsConfig.KEY], + useFactory: ({ + url, + user, + password, + }: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { servers: [url], user, pass: password }, + }), + }, + ], + }), ], }).compile(); app = moduleRef.createNestApplication(); - app.connectMicroservice({ transport: Transport.NATS }); + const natsOptions = app.get(natsConfig.KEY); + app.connectMicroservice({ + transport: Transport.NATS, + options: { + servers: [natsOptions.url], + user: natsOptions.user, + pass: natsOptions.password, + }, + }); await app.startAllMicroservices(); await app.init(); diff --git a/apps/ssi-abstraction/test/anoncredsProofs.e2e-spec.ts b/apps/ssi-abstraction/test/anoncredsProofs.e2e-spec.ts index fc43d3448db4ccbae2c4805bdc2a78958483e8ab..9e8f22a3d2a0f83049bc30e3a4c35c8b12701062 100644 --- a/apps/ssi-abstraction/test/anoncredsProofs.e2e-spec.ts +++ b/apps/ssi-abstraction/test/anoncredsProofs.e2e-spec.ts @@ -1,4 +1,5 @@ import type { INestApplication } from '@nestjs/common'; +import type { ConfigType } from '@nestjs/config'; import type { ClientProxy } from '@nestjs/microservices'; import type { EventAnonCredsProofsGetAllInput, @@ -16,6 +17,7 @@ import { } from '@ocm/shared'; import { firstValueFrom } from 'rxjs'; +import { natsConfig } from '../dist/config/nats.config.js'; import { AgentModule } from '../src/agent/agent.module.js'; import { AnonCredsProofsModule } from '../src/agent/anoncredsProofs/anoncredsProofs.module.js'; import { ConnectionsModule } from '../src/agent/connections/connections.module.js'; @@ -38,18 +40,43 @@ describe('Proofs', () => { const moduleRef = await Test.createTestingModule({ imports: [ mockConfigModule(3004, true), + AgentModule, ConnectionsModule, AnonCredsProofsModule, TenantsModule, DidsModule, - ClientsModule.register([{ name: TOKEN, transport: Transport.NATS }]), + + ClientsModule.registerAsync({ + clients: [ + { + name: TOKEN, + inject: [natsConfig.KEY], + useFactory: ({ + url, + user, + password, + }: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { servers: [url], user, pass: password }, + }), + }, + ], + }), ], }).compile(); app = moduleRef.createNestApplication(); - app.connectMicroservice({ transport: Transport.NATS }); + const natsOptions = app.get(natsConfig.KEY); + app.connectMicroservice({ + transport: Transport.NATS, + options: { + servers: [natsOptions.url], + user: natsOptions.user, + pass: natsOptions.password, + }, + }); await app.startAllMicroservices(); await app.init(); diff --git a/apps/ssi-abstraction/test/connections.e2e-spec.ts b/apps/ssi-abstraction/test/connections.e2e-spec.ts index 7579cac7f39bb7b7100ac201e5d48155a0d96917..00cfc2355ba8872f254705b209bbab8ab1452b9a 100644 --- a/apps/ssi-abstraction/test/connections.e2e-spec.ts +++ b/apps/ssi-abstraction/test/connections.e2e-spec.ts @@ -1,27 +1,36 @@ import type { INestApplication } from '@nestjs/common'; +import type { ConfigType } from '@nestjs/config'; import type { ClientProxy } from '@nestjs/microservices'; import type { - EventDidcommConnectionsGetAllInput, + EventDidcommConnectionsBlockInput, + EventDidcommConnectionsCreateInvitationInput, EventDidcommConnectionsCreateWithSelfInput, + EventDidcommConnectionsGetAllInput, EventDidcommConnectionsGetByIdInput, - EventDidcommConnectionsBlockInput, + EventDidcommConnectionsParseInvitationInput, EventDidcommConnectionsReceiveInvitationFromUrlInput, - EventDidcommConnectionsCreateInvitationInput, } from '@ocm/shared'; -import { ConnectionRecord } from '@credo-ts/core'; +import { + ConnectionRecord, + DidExchangeState, + OutOfBandInvitation, +} from '@credo-ts/core'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { Test } from '@nestjs/testing'; import { - EventDidcommConnectionsGetById, - EventDidcommConnectionsGetAll, - EventDidcommConnectionsCreateWithSelf, EventDidcommConnectionsBlock, - EventDidcommConnectionsReceiveInvitationFromUrl, EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsCreateWithSelf, + EventDidcommConnectionsGetAll, + EventDidcommConnectionsGetById, + EventDidcommConnectionsParseInvitation, + EventDidcommConnectionsReceiveInvitationFromUrl, } from '@ocm/shared'; +import assert from 'node:assert'; import { firstValueFrom } from 'rxjs'; +import { natsConfig } from '../dist/config/nats.config.js'; import { AgentModule } from '../src/agent/agent.module.js'; import { ConnectionsModule } from '../src/agent/connections/connections.module.js'; import { TenantsModule } from '../src/agent/tenants/tenants.module.js'; @@ -34,21 +43,47 @@ describe('Connections', () => { let app: INestApplication; let client: ClientProxy; let tenantId: string; + let tenantIdTwo: string; beforeAll(async () => { const moduleRef = await Test.createTestingModule({ imports: [ mockConfigModule(3004), + AgentModule, ConnectionsModule, TenantsModule, - ClientsModule.register([{ name: TOKEN, transport: Transport.NATS }]), + + ClientsModule.registerAsync({ + clients: [ + { + name: TOKEN, + inject: [natsConfig.KEY], + useFactory: ({ + url, + user, + password, + }: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { servers: [url], user, pass: password }, + }), + }, + ], + }), ], }).compile(); app = moduleRef.createNestApplication(); - app.connectMicroservice({ transport: Transport.NATS }); + const natsOptions = app.get(natsConfig.KEY); + app.connectMicroservice({ + transport: Transport.NATS, + options: { + servers: [natsOptions.url], + user: natsOptions.user, + pass: natsOptions.password, + }, + }); await app.startAllMicroservices(); await app.init(); @@ -59,6 +94,9 @@ describe('Connections', () => { const ts = app.get(TenantsService); const { id } = await ts.create({ label: TOKEN }); tenantId = id; + + const { id: idTwo } = await ts.create({ label: `${TOKEN}-two` }); + tenantIdTwo = idTwo; }); afterAll(async () => { @@ -138,6 +176,55 @@ describe('Connections', () => { expect(eventInstance.instance).toBeInstanceOf(ConnectionRecord); }); + it(`Create and receive invitation between tenants`, async () => { + const createInvitationResponse$ = client.send< + EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsCreateInvitationInput + >(EventDidcommConnectionsCreateInvitation.token, { + tenantId: tenantIdTwo, + }); + const createInvitationResponse = await firstValueFrom( + createInvitationResponse$, + ); + const { + instance: { invitationUrl }, + } = EventDidcommConnectionsCreateInvitation.fromEvent( + createInvitationResponse, + ); + + const response$ = client.send< + EventDidcommConnectionsReceiveInvitationFromUrl, + EventDidcommConnectionsReceiveInvitationFromUrlInput + >(EventDidcommConnectionsReceiveInvitationFromUrl.token, { + invitationUrl, + tenantId, + }); + const response = await firstValueFrom(response$); + const { instance: connectionRecord } = + EventDidcommConnectionsReceiveInvitationFromUrl.fromEvent(response); + + await new Promise((r) => setTimeout(r, 2000)); + + assert(connectionRecord); + + const getByIdResponse$ = client.send< + EventDidcommConnectionsGetById, + EventDidcommConnectionsGetByIdInput + >(EventDidcommConnectionsGetById.token, { + tenantId, + id: connectionRecord.id, + }); + const getByIdResponse = await firstValueFrom(getByIdResponse$); + const { instance: maybeRecord } = + EventDidcommConnectionsGetById.fromEvent(getByIdResponse); + + if (!maybeRecord) { + throw new Error(`Record not found with id: ${connectionRecord.id}`); + } + + expect(maybeRecord.state).toStrictEqual(DidExchangeState.Completed); + }); + it(EventDidcommConnectionsCreateWithSelf.token, async () => { const response$ = client.send< EventDidcommConnectionsCreateWithSelf, @@ -171,4 +258,39 @@ describe('Connections', () => { expect(eventInstance.instance).toBeNull(); }); + + it(EventDidcommConnectionsParseInvitation.token, async () => { + const response$ = client.send< + EventDidcommConnectionsParseInvitation, + EventDidcommConnectionsParseInvitationInput + >(EventDidcommConnectionsParseInvitation.token, { + invitationUrl: + 'https://didcomm.agent.community.animo.id?c_i=eyJAdHlwZSI6ICJkaWQ6c292OkJ6Q2JzTlloTXJqSGlxWkRUVUFTSGc7c3BlYy9jb25uZWN0aW9ucy8xLjAvaW52aXRhdGlvbiIsICJAaWQiOiAiMjJlNmZkMGItZDMyZC00MWE3LTlhOTAtYzY4YzJmMmU2Mzk1IiwgImltYWdlVXJsIjogImh0dHBzOi8vaS5pbWd1ci5jb20vZzNhYmNDTy5wbmciLCAibGFiZWwiOiAiQW5pbW8gQ29tbXVuaXR5IEFnZW50IiwgInJlY2lwaWVudEtleXMiOiBbIjVCTVV3MXJKMW5GUTJLWHhWUFN0dnRGc0ZWYkRkWm5yR1hzaDdFYUVFWjJ3Il0sICJzZXJ2aWNlRW5kcG9pbnQiOiAiaHR0cHM6Ly9kaWRjb21tLmFnZW50LmNvbW11bml0eS5hbmltby5pZCJ9', + tenantId, + }); + + const response = await firstValueFrom(response$); + const eventInstance = + EventDidcommConnectionsParseInvitation.fromEvent(response); + + expect(eventInstance.instance).toBeInstanceOf(OutOfBandInvitation); + expect(eventInstance.instance).toMatchObject({ + id: '22e6fd0b-d32d-41a7-9a90-c68c2f2e6395', + type: 'https://didcomm.org/out-of-band/1.1/invitation', + accept: ['didcomm/aip1', 'didcomm/aip2;env=rfc19'], + handshakeProtocols: ['https://didcomm.org/connections/1.0'], + imageUrl: 'https://i.imgur.com/g3abcCO.png', + label: 'Animo Community Agent', + services: [ + { + id: '#inline', + recipientKeys: [ + 'did:key:z6MkidcXXG6jMKjs8pNfAxQjmyos54s53T3CxYncwWYF9mpK', + ], + serviceEndpoint: 'https://didcomm.agent.community.animo.id', + type: 'did-communication', + }, + ], + }); + }); }); diff --git a/apps/ssi-abstraction/test/credentialDefinitions.e2e-spec.ts b/apps/ssi-abstraction/test/credentialDefinitions.e2e-spec.ts index 5e95231ce91415eacf23f0500328d60ebcd8e18c..37b7e9e2fdca785e4baf295231fc5bbf44c8cf81 100644 --- a/apps/ssi-abstraction/test/credentialDefinitions.e2e-spec.ts +++ b/apps/ssi-abstraction/test/credentialDefinitions.e2e-spec.ts @@ -1,4 +1,5 @@ import type { INestApplication } from '@nestjs/common'; +import type { ConfigType } from '@nestjs/config'; import type { ClientProxy } from '@nestjs/microservices'; import type { EventAnonCredsCredentialDefinitionsGetAllInput, @@ -16,6 +17,7 @@ import { import { randomBytes } from 'crypto'; import { firstValueFrom } from 'rxjs'; +import { natsConfig } from '../dist/config/nats.config.js'; import { AgentModule } from '../src/agent/agent.module.js'; import { CredentialDefinitionsModule } from '../src/agent/credentialDefinitions/credentialDefinitions.module.js'; import { DidsModule } from '../src/agent/dids/dids.module.js'; @@ -39,18 +41,43 @@ describe('CredentialDefinitions', () => { const moduleRef = await Test.createTestingModule({ imports: [ mockConfigModule(3004, true), + AgentModule, SchemasModule, CredentialDefinitionsModule, TenantsModule, DidsModule, - ClientsModule.register([{ name: TOKEN, transport: Transport.NATS }]), + + ClientsModule.registerAsync({ + clients: [ + { + name: TOKEN, + inject: [natsConfig.KEY], + useFactory: ({ + url, + user, + password, + }: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { servers: [url], user, pass: password }, + }), + }, + ], + }), ], }).compile(); app = moduleRef.createNestApplication(); - app.connectMicroservice({ transport: Transport.NATS }); + const natsOptions = app.get(natsConfig.KEY); + app.connectMicroservice({ + transport: Transport.NATS, + options: { + servers: [natsOptions.url], + user: natsOptions.user, + pass: natsOptions.password, + }, + }); await app.startAllMicroservices(); await app.init(); diff --git a/apps/ssi-abstraction/test/dids.e2e-spec.ts b/apps/ssi-abstraction/test/dids.e2e-spec.ts index 1d0750a9114c490cfda03c95eb95e344a405a795..67caa168ee021699528779378ff3cd6cd3913772 100644 --- a/apps/ssi-abstraction/test/dids.e2e-spec.ts +++ b/apps/ssi-abstraction/test/dids.e2e-spec.ts @@ -1,4 +1,5 @@ import type { INestApplication } from '@nestjs/common'; +import type { ConfigType } from '@nestjs/config'; import type { ClientProxy } from '@nestjs/microservices'; import type { EventDidsDidConfigurationInput, @@ -18,6 +19,7 @@ import { import { randomBytes } from 'crypto'; import { firstValueFrom } from 'rxjs'; +import { natsConfig } from '../dist/config/nats.config.js'; import { AgentModule } from '../src/agent/agent.module.js'; import { DidsModule } from '../src/agent/dids/dids.module.js'; import { TenantsModule } from '../src/agent/tenants/tenants.module.js'; @@ -37,13 +39,36 @@ describe('Dids', () => { AgentModule, DidsModule, TenantsModule, - ClientsModule.register([{ name: TOKEN, transport: Transport.NATS }]), + ClientsModule.registerAsync({ + clients: [ + { + name: TOKEN, + inject: [natsConfig.KEY], + useFactory: ({ + url, + user, + password, + }: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { servers: [url], user, pass: password }, + }), + }, + ], + }), ], }).compile(); app = moduleRef.createNestApplication(); - app.connectMicroservice({ transport: Transport.NATS }); + const natsOptions = app.get(natsConfig.KEY); + app.connectMicroservice({ + transport: Transport.NATS, + options: { + servers: [natsOptions.url], + user: natsOptions.user, + pass: natsOptions.password, + }, + }); await app.startAllMicroservices(); await app.init(); diff --git a/apps/ssi-abstraction/test/health.e2e-spec.ts b/apps/ssi-abstraction/test/health.e2e-spec.ts index 479567b54300dff4d043abcf45cefeb11c485ff0..edbd1c99d35a4efa3ce0d0873cae61d47bd8469e 100644 --- a/apps/ssi-abstraction/test/health.e2e-spec.ts +++ b/apps/ssi-abstraction/test/health.e2e-spec.ts @@ -4,14 +4,14 @@ import type { TestingModule } from '@nestjs/testing'; import { Test } from '@nestjs/testing'; import request from 'supertest'; -import { AppModule } from '../src/app.module.js'; +import { Application } from '../src/application.js'; describe('HealthController (e2e)', () => { let app: INestApplication; beforeAll(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], + imports: [Application], }).compile(); app = moduleFixture.createNestApplication(); diff --git a/apps/ssi-abstraction/test/jest.config.js b/apps/ssi-abstraction/test/jest.config.js index 11a9debca04c0369ac60c47aba187aa52b955e11..2a272d1c7f9167e0ce6d1e1a0ed6535f80c5695e 100644 --- a/apps/ssi-abstraction/test/jest.config.js +++ b/apps/ssi-abstraction/test/jest.config.js @@ -6,4 +6,6 @@ export default { testTimeout: 60000, rootDir: '.', testRegex: '.*\\.e2e-spec\\.ts$', + globalSetup: '<rootDir>/_setup.ts', + globalTeardown: '<rootDir>/_teardown.ts', }; diff --git a/apps/ssi-abstraction/test/revocation.e2e-spec.ts b/apps/ssi-abstraction/test/revocation.e2e-spec.ts index 17667ac93d952d2168c80e35e7cbfdd5c2c8fd9f..7365ff69d8dd4a88e052511419c02588feb2b304 100644 --- a/apps/ssi-abstraction/test/revocation.e2e-spec.ts +++ b/apps/ssi-abstraction/test/revocation.e2e-spec.ts @@ -1,18 +1,26 @@ import type { INestApplication } from '@nestjs/common'; +import type { ConfigType } from '@nestjs/config'; import type { ClientProxy } from '@nestjs/microservices'; import type { EventAnonCredsRevocationCheckCredentialStatusInput, EventAnonCredsRevocationRegisterRevocationRegistryDefinitionInput, EventAnonCredsRevocationRegisterRevocationStatusListInput, EventAnonCredsRevocationRevokeInput, - EventDidcommAnonCredsCredentialsOfferToSelfInput, + EventDidcommAnonCredsCredentialsOfferInput, + EventDidcommConnectionsCreateInvitationInput, + EventDidcommConnectionsGetByIdInput, + EventDidcommConnectionsReceiveInvitationFromUrlInput, } from '@ocm/shared'; +import { DidExchangeState } from '@credo-ts/core'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { Test } from '@nestjs/testing'; import { + EventDidcommConnectionsGetById, + EventDidcommAnonCredsCredentialsOffer, + EventDidcommConnectionsReceiveInvitationFromUrl, + EventDidcommConnectionsCreateInvitation, EventAnonCredsRevocationCheckCredentialStatus, - EventDidcommAnonCredsCredentialsOfferToSelf, EventAnonCredsRevocationRegisterRevocationRegistryDefinition, EventAnonCredsRevocationRegisterRevocationStatusList, EventAnonCredsRevocationRevoke, @@ -21,10 +29,10 @@ import { import { randomBytes } from 'crypto'; import { firstValueFrom } from 'rxjs'; +import { natsConfig } from '../dist/config/nats.config.js'; import { AgentModule } from '../src/agent/agent.module.js'; import { AnonCredsCredentialsModule } from '../src/agent/anoncredsCredentials/anoncredsCredentials.module.js'; import { ConnectionsModule } from '../src/agent/connections/connections.module.js'; -import { ConnectionsService } from '../src/agent/connections/connections.service.js'; import { CredentialDefinitionsModule } from '../src/agent/credentialDefinitions/credentialDefinitions.module.js'; import { CredentialDefinitionsService } from '../src/agent/credentialDefinitions/credentialDefinitions.service.js'; import { DidsModule } from '../src/agent/dids/dids.module.js'; @@ -36,19 +44,23 @@ import { TenantsModule } from '../src/agent/tenants/tenants.module.js'; import { TenantsService } from '../src/agent/tenants/tenants.service.js'; import { mockConfigModule } from '../src/config/__tests__/mockConfig.js'; -describe('Revocation', () => { +describe.skip('Revocation', () => { const TOKEN = 'REVOCATION_CLIENT_SERVICE'; let app: INestApplication; let client: ClientProxy; + let tenantId: string; + let tenantIdTwo: string; let issuerDid: string; let credentialDefinitionId: string; + let connectionId: string; beforeAll(async () => { const moduleRef = await Test.createTestingModule({ imports: [ mockConfigModule(3004, true), + AgentModule, ConnectionsModule, SchemasModule, @@ -57,13 +69,37 @@ describe('Revocation', () => { TenantsModule, DidsModule, RevocationModule, - ClientsModule.register([{ name: TOKEN, transport: Transport.NATS }]), + + ClientsModule.registerAsync({ + clients: [ + { + name: TOKEN, + inject: [natsConfig.KEY], + useFactory: ({ + url, + user, + password, + }: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { servers: [url], user, pass: password }, + }), + }, + ], + }), ], }).compile(); app = moduleRef.createNestApplication(); - app.connectMicroservice({ transport: Transport.NATS }); + const natsOptions = app.get(natsConfig.KEY); + app.connectMicroservice({ + transport: Transport.NATS, + options: { + servers: [natsOptions.url], + user: natsOptions.user, + pass: natsOptions.password, + }, + }); await app.startAllMicroservices(); await app.init(); @@ -75,8 +111,10 @@ describe('Revocation', () => { const { id } = await tenantsService.create({ label: TOKEN }); tenantId = id; - const connectionsService = app.get(ConnectionsService); - await connectionsService.createConnectionWithSelf({ tenantId }); + const { id: idTwo } = await tenantsService.create({ + label: `${TOKEN}-two`, + }); + tenantIdTwo = idTwo; const ds = app.get(DidsService); await ds.registerEndorserDids(); @@ -221,13 +259,65 @@ describe('Revocation', () => { expect(eventInstance.instance).toMatchObject({}); } + // Establish a connection with another tenant + { + const createInvitationResponse$ = client.send< + EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsCreateInvitationInput + >(EventDidcommConnectionsCreateInvitation.token, { + tenantId: tenantIdTwo, + }); + const createInvitationResponse = await firstValueFrom( + createInvitationResponse$, + ); + const { + instance: { invitationUrl }, + } = EventDidcommConnectionsCreateInvitation.fromEvent( + createInvitationResponse, + ); + + const response$ = client.send< + EventDidcommConnectionsReceiveInvitationFromUrl, + EventDidcommConnectionsReceiveInvitationFromUrlInput + >(EventDidcommConnectionsReceiveInvitationFromUrl.token, { + invitationUrl, + tenantId, + }); + const response = await firstValueFrom(response$); + const { instance: connectionRecord } = + EventDidcommConnectionsReceiveInvitationFromUrl.fromEvent(response); + + // Wait for the connection to be established + await new Promise((r) => setTimeout(r, 2000)); + + const getByIdResponse$ = client.send< + EventDidcommConnectionsGetById, + EventDidcommConnectionsGetByIdInput + >(EventDidcommConnectionsGetById.token, { + tenantId, + id: connectionRecord.id, + }); + const getByIdResponse = await firstValueFrom(getByIdResponse$); + const { instance: maybeRecord } = + EventDidcommConnectionsGetById.fromEvent(getByIdResponse); + + if (!maybeRecord) { + throw new Error(`Record not found with id: ${connectionRecord.id}`); + } + + expect(maybeRecord.state).toStrictEqual(DidExchangeState.Completed); + + connectionId = connectionRecord.id; + } + // Issue a credential { const response$ = client.send< - EventDidcommAnonCredsCredentialsOfferToSelf, - EventDidcommAnonCredsCredentialsOfferToSelfInput - >(EventDidcommAnonCredsCredentialsOfferToSelf.token, { + EventDidcommAnonCredsCredentialsOffer, + EventDidcommAnonCredsCredentialsOfferInput + >(EventDidcommAnonCredsCredentialsOffer.token, { tenantId, + connectionId, attributes: [ { name: 'Name', value: 'Berend' }, { name: 'Age', value: '30' }, @@ -237,7 +327,7 @@ describe('Revocation', () => { }); const response = await firstValueFrom(response$); const eventInstance = - EventDidcommAnonCredsCredentialsOfferToSelf.fromEvent(response); + EventDidcommAnonCredsCredentialsOffer.fromEvent(response); credentialId = eventInstance.instance.id; } diff --git a/apps/ssi-abstraction/test/schemas.e2e-spec.ts b/apps/ssi-abstraction/test/schemas.e2e-spec.ts index 37c480515afe2cfb73fb1d35b8756a3aaf9ca52b..918d1c131d8455d7d26ea6ba578d30af4984dbab 100644 --- a/apps/ssi-abstraction/test/schemas.e2e-spec.ts +++ b/apps/ssi-abstraction/test/schemas.e2e-spec.ts @@ -1,4 +1,5 @@ import type { INestApplication } from '@nestjs/common'; +import type { ConfigType } from '@nestjs/config'; import type { ClientProxy } from '@nestjs/microservices'; import type { EventAnonCredsSchemasGetAllInput, @@ -16,6 +17,7 @@ import { import { randomBytes } from 'crypto'; import { firstValueFrom } from 'rxjs'; +import { natsConfig } from '../dist/config/nats.config.js'; import { AgentModule } from '../src/agent/agent.module.js'; import { DidsModule } from '../src/agent/dids/dids.module.js'; import { DidsService } from '../src/agent/dids/dids.service.js'; @@ -35,17 +37,42 @@ describe('Schemas', () => { const moduleRef = await Test.createTestingModule({ imports: [ mockConfigModule(3004, true), + AgentModule, SchemasModule, TenantsModule, DidsModule, - ClientsModule.register([{ name: TOKEN, transport: Transport.NATS }]), + + ClientsModule.registerAsync({ + clients: [ + { + name: TOKEN, + inject: [natsConfig.KEY], + useFactory: ({ + url, + user, + password, + }: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { servers: [url], user, pass: password }, + }), + }, + ], + }), ], }).compile(); app = moduleRef.createNestApplication(); - app.connectMicroservice({ transport: Transport.NATS }); + const natsOptions = app.get(natsConfig.KEY); + app.connectMicroservice({ + transport: Transport.NATS, + options: { + servers: [natsOptions.url], + user: natsOptions.user, + pass: natsOptions.password, + }, + }); await app.startAllMicroservices(); await app.init(); diff --git a/apps/ssi-abstraction/test/setEnvVars.js b/apps/ssi-abstraction/test/setEnvVars.js deleted file mode 100644 index 8135ed31d6eceaec4619de9081dda3f37b58589c..0000000000000000000000000000000000000000 --- a/apps/ssi-abstraction/test/setEnvVars.js +++ /dev/null @@ -1,15 +0,0 @@ -process.env.PORT = 3009; -process.env.DATABASE_URL = - 'postgresql://postgres:postgres@localhost:5432/postgres?schema=agent'; -process.env.NATS_URL = 'nats://localhost:4222'; -process.env.ECSURL = 'http://localhost:9200/'; -process.env.AGENT_HOST = 'http://localhost'; -process.env.AGENT_NAME = 'ssi-abstraction-agent'; -process.env.AGENT_INBOUND_PORT = 4000; -process.env.AGENT_URL_PATH = '/ocm/abstraction'; -process.env.AGENT_PUBLIC_DID_SEED = '6b8b882e2618fa5d45ee7229ca880083'; -process.env.AGENT_AUTO_ACCEPT_CONNECTION = true; -process.env.AGENT_AUTO_ACCEPT_CREDENTIAL = true; -process.env.AGENT_WALLET_KEY = 'ssi-wallet-key'; -process.env.AGENT_WALLET_ID = 'ssi-wallet-id'; -process.env.AGENT_LEDGER_ID = 'ID_UNION'; diff --git a/apps/ssi-abstraction/test/tenants.e2e-spec.ts b/apps/ssi-abstraction/test/tenants.e2e-spec.ts index a0d372ffeab6467064ca399b3d5973985c65bb05..0318eb727ca3836a7dbd6bbd4c4329fd6b7f5e01 100644 --- a/apps/ssi-abstraction/test/tenants.e2e-spec.ts +++ b/apps/ssi-abstraction/test/tenants.e2e-spec.ts @@ -1,12 +1,17 @@ import type { INestApplication } from '@nestjs/common'; +import type { ConfigType } from '@nestjs/config'; import type { ClientProxy } from '@nestjs/microservices'; -import type { EventTenantsCreateInput } from '@ocm/shared'; +import type { + EventTenantsCreateInput, + EventTenantsGetAllTenantIdsInput, +} from '@ocm/shared'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { Test } from '@nestjs/testing'; -import { EventTenantsCreate } from '@ocm/shared'; +import { EventTenantsGetAllTenantIds, EventTenantsCreate } from '@ocm/shared'; import { firstValueFrom } from 'rxjs'; +import { natsConfig } from '../dist/config/nats.config.js'; import { AgentModule } from '../src/agent/agent.module.js'; import { TenantsModule } from '../src/agent/tenants/tenants.module.js'; import { mockConfigModule } from '../src/config/__tests__/mockConfig.js'; @@ -20,15 +25,40 @@ describe('Tenants', () => { const moduleRef = await Test.createTestingModule({ imports: [ mockConfigModule(3005), + AgentModule, TenantsModule, - ClientsModule.register([{ name: TOKEN, transport: Transport.NATS }]), + + ClientsModule.registerAsync({ + clients: [ + { + name: TOKEN, + inject: [natsConfig.KEY], + useFactory: ({ + url, + user, + password, + }: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { servers: [url], user, pass: password }, + }), + }, + ], + }), ], }).compile(); app = moduleRef.createNestApplication(); - app.connectMicroservice({ transport: Transport.NATS }); + const natsOptions = app.get(natsConfig.KEY); + app.connectMicroservice({ + transport: Transport.NATS, + options: { + servers: [natsOptions.url], + user: natsOptions.user, + pass: natsOptions.password, + }, + }); await app.startAllMicroservices(); await app.init(); @@ -62,4 +92,25 @@ describe('Tenants', () => { }, }); }); + + it(EventTenantsGetAllTenantIds.token, async () => { + const createResponse$ = client.send< + EventTenantsCreate, + EventTenantsCreateInput + >(EventTenantsCreate.token, { + label: 'my-new-tenant', + }); + + await firstValueFrom(createResponse$); + + const response$ = client.send< + EventTenantsGetAllTenantIds, + EventTenantsGetAllTenantIdsInput + >(EventTenantsGetAllTenantIds.token, {}); + + const response = await firstValueFrom(response$); + const eventInstance = EventTenantsGetAllTenantIds.fromEvent(response); + + expect(eventInstance.instance.length).toBeGreaterThanOrEqual(1); + }); }); diff --git a/devtools/nest-cli.json b/devtools/nest-cli.json new file mode 100644 index 0000000000000000000000000000000000000000..256648114a9983377debfde44bda4368fb045a39 --- /dev/null +++ b/devtools/nest-cli.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src" +} diff --git a/devtools/package.json b/devtools/package.json new file mode 100644 index 0000000000000000000000000000000000000000..4d16dac4f09118decf149477b762c084f066037f --- /dev/null +++ b/devtools/package.json @@ -0,0 +1,35 @@ +{ + "name": "@ocm/devtools", + "version": "1.0.0", + "description": "Developers tools for OCM", + "contributors": [ + "Konstantin Tsabolov <konstantin.tsabolov@spherity.com>" + ], + "private": true, + "license": "Apache-2.0", + "type": "module", + "scripts": { + "exec": "nest start --entryFile=cli.js --", + "start": "nest start --entryFile=server.js", + "clean": "rimraf dist *.tsbuildinfo", + "prebuild": "pnpm clean", + "build": "nest build -p tsconfig.production.json" + }, + "dependencies": { + "@nestjs/cli": "10.3.2", + "@nestjs/common": "10.3.3", + "@nestjs/config": "3.2.0", + "@nestjs/core": "10.3.3", + "@nestjs/microservices": "10.3.3", + "@ocm/shared": "workspace:*", + "joi": "17.12.1", + "nest-commander": "3.12.5", + "reflect-metadata": "0.2.1", + "rxjs": "7.8.1", + "vite-node": "1.3.1" + }, + "devDependencies": { + "rimraf": "5.0.5", + "vite-node": "1.3.1" + } +} diff --git a/devtools/src/cli.ts b/devtools/src/cli.ts new file mode 100644 index 0000000000000000000000000000000000000000..7c2d7c6e39b8fb0230f1e92bcd061537549c8f38 --- /dev/null +++ b/devtools/src/cli.ts @@ -0,0 +1,5 @@ +import { CommandFactory } from 'nest-commander'; + +import { Commander } from './commander.js'; + +await CommandFactory.run(Commander, ['warn', 'error']); diff --git a/devtools/src/commander.controller.ts b/devtools/src/commander.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..5dcf20c88b565260ab0ecae2d3d32fcf62f2ecfe --- /dev/null +++ b/devtools/src/commander.controller.ts @@ -0,0 +1,42 @@ +import { Body, Controller, Get, Post } from '@nestjs/common'; + +import { CommanderService } from './commander.service.js'; + +@Controller() +export class CommanderController { + public constructor(private readonly service: CommanderService) {} + + @Get('list-tenants') + public listTenants() { + return this.service.listTenants(); + } + + @Post('create-tenant') + public createTenant(@Body() { label }: { label?: string }) { + return this.service.createTenant(label); + } + + @Post('register-endorser-did') + public registerEndorserDID() { + return this.service.registerEndorserDID(); + } + + @Post('register-did') + public registerDID( + @Body() { tenantId, seed }: { tenantId: string; seed?: string }, + ) { + return this.service.registerDID(tenantId, seed); + } + + @Post('resolve-did') + public resolveDID( + @Body() { tenantId, did }: { tenantId: string; did: string }, + ) { + return this.service.resolveDID(tenantId, did); + } + + @Post('policy/*/*/*/*/evaluation') + public mockPolicyEvaluation() { + return { result: true }; + } +} diff --git a/devtools/src/commander.service.ts b/devtools/src/commander.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..92932e9573ba6cf7347e68d2815c6b936b3a34a1 --- /dev/null +++ b/devtools/src/commander.service.ts @@ -0,0 +1,64 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; +import { + EventDidsRegisterEndorserDid, + EventDidsRegisterIndyFromSeed, + EventDidsResolve, + EventTenantsCreate, + EventTenantsGetAllTenantIds, +} from '@ocm/shared'; +import { randomBytes } from 'node:crypto'; +import { map } from 'rxjs'; + +import { NATS_CLIENT_NAME } from './constants.js'; +import { requestTimeout } from './utils.js'; + +@Injectable() +export class CommanderService { + public constructor( + @Inject(NATS_CLIENT_NAME) private readonly client: ClientProxy, + ) {} + + public listTenants() { + return this.client.send(EventTenantsGetAllTenantIds.token, {}).pipe( + requestTimeout, + map(({ data }) => data), + ); + } + + public createTenant(label = 'tenant_' + randomBytes(4).toString('hex')) { + return this.client.send(EventTenantsCreate.token, { label }).pipe( + requestTimeout, + map(({ data }) => data), + ); + } + + public registerEndorserDID() { + return this.client.send(EventDidsRegisterEndorserDid.token, {}).pipe( + requestTimeout, + map(({ data }) => data), + ); + } + + public resolveDID(tenantId: string, did: string) { + return this.client.send(EventDidsResolve.token, { tenantId, did }).pipe( + requestTimeout, + map(({ data }) => data), + ); + } + + public registerDID( + tenantId: string, + seed: string = randomBytes(16).toString('hex'), + ) { + return this.client + .send(EventDidsRegisterIndyFromSeed.token, { + tenantId, + seed, + }) + .pipe( + requestTimeout, + map(({ data }) => data), + ); + } +} diff --git a/devtools/src/commander.ts b/devtools/src/commander.ts new file mode 100644 index 0000000000000000000000000000000000000000..e004e62502b8de664f140b4a59f437d8f8674691 --- /dev/null +++ b/devtools/src/commander.ts @@ -0,0 +1,61 @@ +import type { ConfigType } from '@nestjs/config'; + +import { Module } from '@nestjs/common'; +import { ConfigModule, registerAs } from '@nestjs/config'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import Joi from 'joi'; + +import { CommanderController } from './commander.controller.js'; +import { CommanderService } from './commander.service.js'; +import { CreateTenantCommand } from './commands/create-tenant.command.js'; +import { ListTenantsCommand } from './commands/list-tenants.command.js'; +import { RegisterDIDCommand } from './commands/register-did.command.js'; +import { RegisterEndorserDIDCommand } from './commands/register-endorser-did.command.js'; +import { ResolveDIDCommand } from './commands/resolve-did.command.js'; +import { NATS_CLIENT_NAME } from './constants.js'; + +export const httpConfig = registerAs('http', () => ({ + port: Number(process.env.HTTP_PORT) || 4100, +})); + +export const natsConfig = registerAs('nats', () => ({ + url: process.env.NATS_URL || 'nats://localhost:4222', + user: process.env.NATS_USER || 'nats_user', + pass: process.env.NATS_PASSWORD || 'nats_password', +})); + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + load: [httpConfig, natsConfig], + validationSchema: Joi.object({ + HTTP_PORT: Joi.number(), + NATS_URL: Joi.string(), + NATS_USER: Joi.string(), + NATS_PASSWORD: Joi.string(), + }), + }), + ClientsModule.registerAsync([ + { + name: NATS_CLIENT_NAME, + inject: [natsConfig.KEY], + useFactory: ({ url, user, pass }: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { servers: [url], user, pass }, + }), + }, + ]), + ], + providers: [ + CommanderService, + + ListTenantsCommand, + CreateTenantCommand, + RegisterDIDCommand, + RegisterEndorserDIDCommand, + ResolveDIDCommand, + ], + controllers: [CommanderController], +}) +export class Commander {} diff --git a/devtools/src/commands/create-tenant.command.ts b/devtools/src/commands/create-tenant.command.ts new file mode 100644 index 0000000000000000000000000000000000000000..762a11c493bc9454badda1730842c61bd90cf427 --- /dev/null +++ b/devtools/src/commands/create-tenant.command.ts @@ -0,0 +1,25 @@ +import { Command, CommandRunner } from 'nest-commander'; +import { firstValueFrom, tap } from 'rxjs'; + +import { CommanderService } from '../commander.service.js'; + +@Command({ + name: 'create-tenant', + description: 'Create a new tenant', + arguments: '[label]', +}) +export class CreateTenantCommand extends CommandRunner { + public constructor(private readonly service: CommanderService) { + super(); + } + + public async run([label]: string[]) { + await firstValueFrom( + this.service.createTenant(label).pipe( + tap((data) => { + console.log(`Tenant "${label}" created with id: ${data.id}`); + }), + ), + ); + } +} diff --git a/devtools/src/commands/list-tenants.command.ts b/devtools/src/commands/list-tenants.command.ts new file mode 100644 index 0000000000000000000000000000000000000000..67285a039ac1655e5004c4657a0ab885160225bb --- /dev/null +++ b/devtools/src/commands/list-tenants.command.ts @@ -0,0 +1,18 @@ +import { Command, CommandRunner } from 'nest-commander'; +import { firstValueFrom, tap } from 'rxjs'; + +import { CommanderService } from '../commander.service.js'; + +@Command({ + name: 'list-tenants', + description: 'List all tenants', +}) +export class ListTenantsCommand extends CommandRunner { + public constructor(private readonly service: CommanderService) { + super(); + } + + public async run(): Promise<void> { + await firstValueFrom(this.service.listTenants().pipe(tap(console.log))); + } +} diff --git a/devtools/src/commands/register-did.command.ts b/devtools/src/commands/register-did.command.ts new file mode 100644 index 0000000000000000000000000000000000000000..9acc062ed9ffba3db536247de9c99f4cc6cc2792 --- /dev/null +++ b/devtools/src/commands/register-did.command.ts @@ -0,0 +1,25 @@ +import { Command, CommandRunner } from 'nest-commander'; +import { firstValueFrom, tap } from 'rxjs'; + +import { CommanderService } from '../commander.service.js'; + +@Command({ + name: 'register-did', + description: 'Register a new DID for a tenant', + arguments: '<tenantId> [seed]', +}) +export class RegisterDIDCommand extends CommandRunner { + public constructor(private readonly service: CommanderService) { + super(); + } + + public async run([tenantId, seed]: string[]): Promise<void> { + await firstValueFrom( + this.service.registerDID(tenantId, seed).pipe( + tap((data) => { + console.log(`Registered DID "${data[0]}" for tenant "${tenantId}"`); + }), + ), + ); + } +} diff --git a/devtools/src/commands/register-endorser-did.command.ts b/devtools/src/commands/register-endorser-did.command.ts new file mode 100644 index 0000000000000000000000000000000000000000..ac816f36953341eae24353cf8a7bf55e355b6d44 --- /dev/null +++ b/devtools/src/commands/register-endorser-did.command.ts @@ -0,0 +1,24 @@ +import { Command, CommandRunner } from 'nest-commander'; +import { firstValueFrom, tap } from 'rxjs'; + +import { CommanderService } from '../commander.service.js'; + +@Command({ + name: 'register-endorser-did', + description: 'Register an endorser DID', +}) +export class RegisterEndorserDIDCommand extends CommandRunner { + public constructor(private readonly service: CommanderService) { + super(); + } + + public async run(): Promise<void> { + await firstValueFrom( + this.service.registerEndorserDID().pipe( + tap(() => { + console.log(`Successfully registered an endorser DID`); + }), + ), + ); + } +} diff --git a/devtools/src/commands/resolve-did.command.ts b/devtools/src/commands/resolve-did.command.ts new file mode 100644 index 0000000000000000000000000000000000000000..92bc980482daa4bebffdf071e6f7bb5f813d555d --- /dev/null +++ b/devtools/src/commands/resolve-did.command.ts @@ -0,0 +1,24 @@ +import { Command, CommandRunner } from 'nest-commander'; +import { firstValueFrom, tap } from 'rxjs'; + +import { CommanderService } from '../commander.service.js'; + +@Command({ + name: 'resolve-did', + arguments: '<tenantId> <did>', +}) +export class ResolveDIDCommand extends CommandRunner { + public constructor(private readonly service: CommanderService) { + super(); + } + + public async run([tenantId, did]: string[]): Promise<void> { + await firstValueFrom( + this.service.resolveDID(tenantId, did).pipe( + tap((data) => { + console.log(JSON.stringify(data, null, 2)); + }), + ), + ); + } +} diff --git a/devtools/src/constants.ts b/devtools/src/constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..cb2e34718282fa59a1d9c56fa7dce3a9642c3e59 --- /dev/null +++ b/devtools/src/constants.ts @@ -0,0 +1,2 @@ +export const NATS_CLIENT_NAME = 'DEVTOOLS'; +export const REQUEST_TIMEOUT_MS = 10000; diff --git a/devtools/src/server.ts b/devtools/src/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..b751ee660fec28e028480fe04fbe91d1d5f7c9c9 --- /dev/null +++ b/devtools/src/server.ts @@ -0,0 +1,10 @@ +import type { ConfigType } from '@nestjs/config'; + +import { NestFactory } from '@nestjs/core'; + +import { Commander, httpConfig } from './commander.js'; + +const app = await NestFactory.create(Commander); +const { port } = app.get(httpConfig.KEY) as ConfigType<typeof httpConfig>; + +await app.listen(port); diff --git a/devtools/src/utils.ts b/devtools/src/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..6cdbd6e71883595be3b07e95c4f020c87601ce89 --- /dev/null +++ b/devtools/src/utils.ts @@ -0,0 +1,9 @@ +import { timeout, throwError } from 'rxjs'; + +import { REQUEST_TIMEOUT_MS } from './constants.js'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const requestTimeout = timeout<any, any>({ + each: REQUEST_TIMEOUT_MS, + with: () => throwError(() => new Error('Request timed out')), +}); diff --git a/devtools/tsconfig.build.json b/devtools/tsconfig.build.json new file mode 100644 index 0000000000000000000000000000000000000000..62e951a049cb7bafc34f3eef5f55eeca50dd352e --- /dev/null +++ b/devtools/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.build.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "./dist", + "rootDir": "./src" + }, + "exclude": ["node_modules", "**/test", "**/dist", "**/*spec.ts"] +} diff --git a/devtools/tsconfig.json b/devtools/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..48610a17ff35c145168327c37dafa8dc7240e0c6 --- /dev/null +++ b/devtools/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../tsconfig.json", +} diff --git a/devtools/tsconfig.production.json b/devtools/tsconfig.production.json new file mode 100644 index 0000000000000000000000000000000000000000..b692c988d53b9c8c5187b801aaea51eaf2e044a2 --- /dev/null +++ b/devtools/tsconfig.production.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.production.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "./dist", + "rootDir": "./src" + }, + "exclude": ["node_modules", "**/test", "**/dist", "**/*spec.ts", "src/cli.ts"] +} diff --git a/docker-compose.yml b/docker-compose.yml index 6f1b0df4da1d2cf847f9e799426e5de5f7f7c44b..3c566a485a2c9c9cd4f891c5ea7dca1210de8fdb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,7 +15,7 @@ services: '--user', 'nats_user', '--pass', - 'Rw+dYIymAQm9H6ELLNwSuGo1812jqQ==', + 'nats_password', ] s3: @@ -34,6 +34,7 @@ services: image: minio/mc entrypoint: > /bin/sh -c " + sleep 1; /usr/bin/mc config host add ssi-s3 http://s3:9000 minio minio123; /usr/bin/mc mb --ignore-existing ssi-s3/ssi; /usr/bin/mc anonymous set download ssi-s3/ssi; @@ -53,24 +54,41 @@ services: - '4000:3000' - '4005:3001' environment: - PORT: 3000 + HTTP_PORT: 3000 NATS_URL: nats://nats:4222 NATS_USER: nats_user - NATS_PASSWORD: Rw+dYIymAQm9H6ELLNwSuGo1812jqQ== + NATS_PASSWORD: nats_password AGENT_NAME: ssi-abstraction-agent AGENT_WALLET_ID: ssi-wallet-id AGENT_WALLET_KEY: ssi-wallet-key - AGENT_HOST: http://ssi + AGENT_HOST: http://ssi-abstraction AGENT_INBOUND_PORT: 3001 - AGENT_PUBLIC_DID_SEED: 6b8b882e2618fa5d45ee7229ca000000 + AGENT_PUBLIC_DID_SEED: 000000000000000_OCM_E2E_ENDORSER AGENT_AUTO_ACCEPT_CONNECTION: true AGENT_AUTO_ACCEPT_CREDENTIAL: contentApproved AGENT_LEDGER_ID: BCOVRIN_TEST - TAILS_SERVER_BASE_URL: http://localhost:3000/tails + TAILS_SERVER_BASE_URL: http://s3:9000 + TAILS_SERVER_BUCKET_NAME: ssi + S3_ACCESS_KEY: ssi-abstraction + S3_SECRET: very-long-secret-key depends_on: - nats - init-s3 + devtools: + build: + target: devtools + init: true + ports: + - '4100:3000' + environment: + HTTP_PORT: 3000 + NATS_URL: nats://nats:4222 + NATS_USER: nats_user + NATS_PASSWORD: nats_password + depends_on: + - nats + schema-manager: build: args: @@ -80,7 +98,7 @@ services: HTTP_PORT: 3000 NATS_URL: nats://nats:4222 NATS_USER: nats_user - NATS_PASSWORD: Rw+dYIymAQm9H6ELLNwSuGo1812jqQ== + NATS_PASSWORD: nats_password NATS_MONITORING_URL: http://nats:8222 ports: - '4001:3000' @@ -97,7 +115,7 @@ services: HTTP_PORT: 3000 NATS_URL: nats://nats:4222 NATS_USER: nats_user - NATS_PASSWORD: Rw+dYIymAQm9H6ELLNwSuGo1812jqQ== + NATS_PASSWORD: nats_password NATS_MONITORING_URL: http://nats:8222 ports: - '4002:3000' @@ -114,7 +132,7 @@ services: HTTP_PORT: 3000 NATS_URL: nats://nats:4222 NATS_USER: nats_user - NATS_PASSWORD: Rw+dYIymAQm9H6ELLNwSuGo1812jqQ== + NATS_PASSWORD: nats_password NATS_MONITORING_URL: http://nats:8222 ports: - '4003:3000' @@ -131,7 +149,7 @@ services: HTTP_PORT: 3000 NATS_URL: nats://nats:4222 NATS_USER: nats_user - NATS_PASSWORD: Rw+dYIymAQm9H6ELLNwSuGo1812jqQ== + NATS_PASSWORD: nats_password NATS_MONITORING_URL: http://nats:8222 ports: - '4004:3000' @@ -148,7 +166,7 @@ services: HTTP_PORT: 3000 NATS_URL: nats://nats:4222 NATS_USER: nats_user - NATS_PASSWORD: Rw+dYIymAQm9H6ELLNwSuGo1812jqQ== + NATS_PASSWORD: nats_password NATS_MONITORING_URL: http://nats:8222 ports: - '4006:3000' diff --git a/documentation/Gaia-X Organization Credential Manager.postman_collection.json b/documentation/Gaia-X Organization Credential Manager.postman_collection.json new file mode 100644 index 0000000000000000000000000000000000000000..7c4ebfed981e26d7e89e9f2ac9ac267800468c9b --- /dev/null +++ b/documentation/Gaia-X Organization Credential Manager.postman_collection.json @@ -0,0 +1,1806 @@ +{ + "info": { + "_postman_id": "ab160828-a6d8-4f4c-a730-eaeaf5ba3754", + "name": "Gaia-X Organization Credential Manager", + "description": "## Overview\n\nOCM (Organizational Credential Manager) is a Node.js-based microservice system designed to manage organizational credentials.\n\n## Quick Start\n\n### Clone the repository:\n\n``` bash\ngit clone -b chore/e2e git@gitlab.eclipse.org:tsabolov/ocm-engine.git\n\n ```\n\n### Start the stack using `docker-compose up -d` in the root of the project:\n\n``` bash\ncd ocm-engine\ndocker compose up -d\n\n ```\n\n> **Note:** By default, this collection is configured to interact with services running locally (using Docker Compose or directly on the bare metal). If you wish to run the requests of this collection against the OCM stack hosted on a remote machine, you will need to create a new Postman Environment. Within this environment, specify the base URLs for each of the services and DevTools as follows: \n \n\n### Initial Setup\n\nIn the \"Integration\" folder, execute all requests under the `Init` subfolder one-by-one. These are needed to \"seed\" the stack with some initial data and actors (tenants).\n\n> You can use Postman's feature `Run Folder` for this. \n \n\nOnce the `Init` step is done, execute the steps in the following folders in the order they are defined.\n\n## Known Issues\n\nAs of the current time, the following flows are known to be broken. We are aware of these issues and are working on resolving them:\n\n- Self-Issuance\n- Issuance of a credential with revocation support, and therefore revocation\n \n\nIf you encounter any other issues, please let us know.", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "14427538" + }, + "item": [ + { + "name": "APIs", + "item": [ + { + "name": "Schema Manager", + "item": [] + }, + { + "name": "Connection Manager", + "item": [] + }, + { + "name": "Credential Manager", + "item": [] + }, + { + "name": "Proof Manager", + "item": [] + }, + { + "name": "DID Manager", + "item": [] + } + ], + "description": "This folder contains the documentation for the individual microservices of the Organization Credential Manager (OCM)" + }, + { + "name": "Integration", + "item": [ + { + "name": "Init", + "item": [ + { + "name": "Register Endorser DID", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{DevTools Base URL}}/register-endorser-did", + "host": [ + "{{DevTools Base URL}}" + ], + "path": [ + "register-endorser-did" + ] + } + }, + "response": [] + }, + { + "name": "Create 'issuer' tenant", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set(\"issuer_id\", json.id);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"label\": \"issuer\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{DevTools Base URL}}/create-tenant", + "host": [ + "{{DevTools Base URL}}" + ], + "path": [ + "create-tenant" + ] + } + }, + "response": [] + }, + { + "name": "Create 'holder' tenant", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set(\"holder_id\", json.id);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"label\": \"holder\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{DevTools Base URL}}/create-tenant", + "host": [ + "{{DevTools Base URL}}" + ], + "path": [ + "create-tenant" + ] + } + }, + "response": [] + }, + { + "name": "Create 'verifier' tenant", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set(\"verifier_id\", json.id);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"label\": \"verifier\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{DevTools Base URL}}/create-tenant", + "host": [ + "{{DevTools Base URL}}" + ], + "path": [ + "create-tenant" + ] + } + }, + "response": [] + }, + { + "name": "Register DID for 'issuer'", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set(\"issuer_did\", json.data[0]);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"seed\": \"{{$randomPassword}}{{$randomAlphaNumeric}}{{$randomAlphaNumeric}}{{$randomPassword}}\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{DID Manager Base URL}}/v1/dids?tenantId={{issuer_id}}", + "host": [ + "{{DID Manager Base URL}}" + ], + "path": [ + "v1", + "dids" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get 'issuer' DID configuration", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"domain\": \"\",\n \"expiryTime\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{DID Manager Base URL}}/v1/dids/configuration?tenantId={{issuer_id}}", + "host": [ + "{{DID Manager Base URL}}" + ], + "path": [ + "v1", + "dids", + "configuration" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + } + ], + "description": "This folder contains a series of preliminary requests essential for execution before proceeding with the rest of the integration tests:\n\n- Register the Endorser DID.\n \n- Create a tenant named 'issuer'.\n \n- Create a tenant named 'holder'.\n \n- Create a tenant named 'verifier'.\n \n- Create a public DID for the 'issuer'.\n \n\nThese steps are performed by DevTools - a separate web service designed to assist developers in performing various service-related tasks that are crucial for setting up and maintaining the OCM environment. Although not a part of the OCM itself, DevTools acts as an essential developer aid, providing a suite of tools and features that streamline the execution of tasks such as DID registration, tenant creation, and configuration of public DIDs.\n\nTo find out how to run the DevTools please refer to the documentation in the OCM repository." + }, + { + "name": "Create Schema and Credential Definition", + "item": [ + { + "name": "Register a Schema", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set('schema_id', json.data.schemaId);" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "const schemaName = pm.variables.replaceIn(\"ocm_e2e_example_schema_{{$randomPassword}}\");", + "pm.collectionVariables.set('schema_name', schemaName);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"issuerDid\": \"{{issuer_did}}\",\n \"name\": \"{{schema_name}}\",\n \"version\": \"1.0.0\",\n \"attributeNames\": [\"color\", \"size\"]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Schema Manager Base URL}}/v1/schemas?tenantId={{issuer_id}}", + "host": [ + "{{Schema Manager Base URL}}" + ], + "path": [ + "v1", + "schemas" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Register a Schema for Revocation", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set('revocation_schema_id', json.data.schemaId);" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "const schemaName = pm.variables.replaceIn(\"ocm_e2e_example_revocation_schema_{{$randomPassword}}\");", + "pm.collectionVariables.set('revocation_schema_name', schemaName);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"issuerDid\": \"{{issuer_did}}\",\n \"name\": \"{{revocation_schema_name}}\",\n \"version\": \"1.0.0\",\n \"attributeNames\": [\"color\", \"size\"]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Schema Manager Base URL}}/v1/schemas?tenantId={{issuer_id}}", + "host": [ + "{{Schema Manager Base URL}}" + ], + "path": [ + "v1", + "schemas" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "List schemas", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "", + "pm.test(\"Schema successfully created\", function () {", + " const schemaName = pm.collectionVariables.get('schema_name');", + " const json = pm.response.json();", + " const schemas = json.data;", + " const schema = schemas.find((s) => s.name === schemaName);", + "", + " pm.expect(schema).to.be.an('object');", + " pm.expect(schema).to.have.property('name', schemaName);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Schema Manager Base URL}}/v1/schemas?tenantId={{issuer_id}}", + "host": [ + "{{Schema Manager Base URL}}" + ], + "path": [ + "v1", + "schemas" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Register a Credential Definition", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set('credential_definition_id', json.data.credentialDefinitionId);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"issuerDid\": \"{{issuer_did}}\",\n \"schemaId\": \"{{schema_id}}\",\n \"tag\": \"default\",\n \"supportsRevocation\": false\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Schema Manager Base URL}}/v1/credential-definitions?tenantId={{issuer_id}}", + "host": [ + "{{Schema Manager Base URL}}" + ], + "path": [ + "v1", + "credential-definitions" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Register a Credential Definition w/ Revocation", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set('credential_definition_w_revocation_id', json.data.credentialDefinitionId);", + "pm.collectionVariables.set('revocation_registry_definition_id', json.data.revocationRegistryDefinitionId);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"issuerDid\": \"{{issuer_did}}\",\n \"schemaId\": \"{{revocation_schema_id}}\",\n \"tag\": \"default\",\n \"supportsRevocation\": true\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Schema Manager Base URL}}/v1/credential-definitions?tenantId={{issuer_id}}", + "host": [ + "{{Schema Manager Base URL}}" + ], + "path": [ + "v1", + "credential-definitions" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "List credential definitions", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Schema Manager Base URL}}/v1/credential-definitions?tenantId={{issuer_id}}", + "host": [ + "{{Schema Manager Base URL}}" + ], + "path": [ + "v1", + "credential-definitions" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + } + ], + "description": "This folder demonstrates the functionality of creating a Schema and a Credential Definition, which are necessary for issuing credentials" + }, + { + "name": "Establish connections", + "item": [ + { + "name": "Create invitation (issuer)", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const json = pm.response.json();", + "pm.collectionVariables.set('issuer_invitationUrl', json.data.invitationUrl);" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{Connection Manager Base URL}}/v1/invitations?tenantId={{issuer_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "invitations" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Receive invitation from issuer (holder)", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "pm.sendRequest({", + " url: pm.collectionVariables.get('Connection Manager Base URL') + \"/v1/connections?tenantId=\" + pm.collectionVariables.get('issuer_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const connections = res.json().data;", + " const connectionIds = connections.map(({ id }) => id);", + " pm.variables.set('issuer_connection_ids', connectionIds);", + "})" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.collectionVariables.unset('issuer_invitationUrl');", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set('issuer_holder_connection_id_for_holder', json.data.id);", + "", + "const oldConnectionIds = pm.variables.get('issuer_connection_ids');", + "", + "pm.sendRequest({", + " url: pm.collectionVariables.get('Connection Manager Base URL') + \"/v1/connections?tenantId=\" + pm.collectionVariables.get('issuer_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const connections = res.json().data;", + " const connectionIds = connections.map(({ id }) => id);", + " const newConnectionIds = connectionIds.filter((id) => !oldConnectionIds.includes(id));", + "", + " if (newConnectionIds.length) {", + " pm.collectionVariables.set('issuer_holder_connection_id_for_issuer', newConnectionIds[0]);", + " }", + "})" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"invitationUrl\": \"{{issuer_invitationUrl}}\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Connection Manager Base URL}}/v1/invitations/receive?tenantId={{holder_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "invitations", + "receive" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get issuer connection to holder", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Connection Manager Base URL}}/v1/connections/:connectionId?tenantId={{issuer_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "connections", + ":connectionId" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ], + "variable": [ + { + "key": "connectionId", + "value": "{{issuer_holder_connection_id_for_issuer}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get holder connection to issuer", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Connection Manager Base URL}}/v1/connections/:connectionId?tenantId={{holder_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "connections", + ":connectionId" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ], + "variable": [ + { + "key": "connectionId", + "value": "{{issuer_holder_connection_id_for_holder}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Create invitation (verifier)", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const json = pm.response.json();", + "pm.collectionVariables.set('verifier_invitationUrl', json.data.invitationUrl);" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{Connection Manager Base URL}}/v1/invitations?tenantId={{verifier_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "invitations" + ], + "query": [ + { + "key": "tenantId", + "value": "{{verifier_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Receive invitation from verifier (holder)", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "pm.sendRequest({", + " url: pm.collectionVariables.get('Connection Manager Base URL') + \"/v1/connections?tenantId=\" + pm.collectionVariables.get('verifier_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const connections = res.json().data;", + " const connectionIds = connections.map(({ id }) => id);", + " pm.variables.set('verifier_connection_ids', connectionIds);", + "})" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.collectionVariables.unset('verifier_invitationUrl');", + "", + "const json = pm.response.json();", + "pm.collectionVariables.set('verifier_holder_connection_id_for_holder', json.data.id);", + "", + "const oldConnectionIds = pm.variables.get('verifier_connection_ids');", + "pm.variables.unset('verifier_connection_ids');", + "", + "pm.sendRequest({", + " url: pm.collectionVariables.get('Connection Manager Base URL') + \"/v1/connections?tenantId=\" + pm.collectionVariables.get('verifier_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const connections = res.json().data;", + " const connectionIds = connections.map(({ id }) => id);", + " const newConnectionIds = connectionIds.filter((id) => !oldConnectionIds.includes(id));", + "", + " if (newConnectionIds.length) {", + " pm.collectionVariables.set('verifier_holder_connection_id_for_verifier', newConnectionIds[0]);", + " }", + "})" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"invitationUrl\": \"{{verifier_invitationUrl}}\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Connection Manager Base URL}}/v1/invitations/receive?tenantId={{holder_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "invitations", + "receive" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get verifier connection to holder", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Connection Manager Base URL}}/v1/connections/:connectionId?tenantId={{verifier_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "connections", + ":connectionId" + ], + "query": [ + { + "key": "tenantId", + "value": "{{verifier_id}}" + } + ], + "variable": [ + { + "key": "connectionId", + "value": "{{verifier_holder_connection_id_for_verifier}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get holder connection to verifier", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Connection Manager Base URL}}/v1/connections/:connectionId?tenantId={{holder_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "connections", + ":connectionId" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ], + "variable": [ + { + "key": "connectionId", + "value": "{{verifier_holder_connection_id_for_holder}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Create a connection to self (issuer)", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "const json = pm.response.json();", + "pm.collectionVariables.set('issuer_self_connection_id', json.data.id);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{Connection Manager Base URL}}/v1/connections?tenantId={{issuer_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "connections" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get issuer self connection", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Connection Manager Base URL}}/v1/connections/:connectionId?tenantId={{issuer_id}}", + "host": [ + "{{Connection Manager Base URL}}" + ], + "path": [ + "v1", + "connections", + ":connectionId" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ], + "variable": [ + { + "key": "connectionId", + "value": "{{issuer_self_connection_id}}" + } + ] + } + }, + "response": [] + } + ], + "description": "Requests in this folder demonstrate the creation of connections between the actors of the Trust Triangle:\n\n- Issuer → Holder: to demonstrate the process of credential issuance.\n \n- Verifier → Issuer: to demonstrate the process of credential verification.\n \n- Issuer → Issuer: to demonstrate the process of issuing a credential to oneself." + }, + { + "name": "Issue Credential", + "item": [ + { + "name": "Credential Offer", + "item": [ + { + "name": "Make a Credential Offer (issuer)", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "pm.sendRequest({", + " url: pm.collectionVariables.get('Credential Manager Base URL') + \"/v1/credential-offers?tenantId=\" + pm.collectionVariables.get('holder_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const credentialOffers = res.json().data;", + " const credentialOfferIds = credentialOffers.map(({ id }) => id);", + " pm.variables.set('holder_credential_offer_ids', credentialOfferIds);", + "})" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "const oldCredentialOfferIds = pm.variables.get('holder_credential_offer_ids') || [];", + "pm.sendRequest({", + " url: pm.collectionVariables.get('Credential Manager Base URL') + \"/v1/credential-offers?tenantId=\" + pm.collectionVariables.get('holder_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const credentialOffers = res.json().data;", + " const credentialOfferIds = credentialOffers.map(({ id }) => id);", + " const newCredentialOfferIds = credentialOfferIds.filter((id) => !oldCredentialOfferIds.includes(id));", + "", + " if (newCredentialOfferIds.length) {", + " pm.collectionVariables.set('holder_credential_offer_id', newCredentialOfferIds[0]);", + " }", + "})" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"connectionId\": \"{{issuer_holder_connection_id_for_issuer}}\",\n \"credentialDefinitionId\": \"{{credential_definition_id}}\",\n \"attributes\": [\n {\n \"name\": \"color\",\n \"value\": \"navy\"\n },\n {\n \"name\": \"size\",\n \"value\": \"xxl\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credential-offers?tenantId={{issuer_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credential-offers" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Accept Credential Offer (holder)", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credential-offers/:credentialOfferId/accept?tenantId={{holder_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credential-offers", + ":credentialOfferId", + "accept" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ], + "variable": [ + { + "key": "credentialOfferId", + "value": "{{holder_credential_offer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get holder credentials", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credentials?tenantId={{holder_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credentials" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Credential Offer w/ Revocation", + "item": [ + { + "name": "Make a Credential Offer (issuer)", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "pm.sendRequest({", + " url: pm.collectionVariables.get('Credential Manager Base URL') + \"/v1/credential-offers?tenantId=\" + pm.collectionVariables.get('holder_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const credentialOffers = res.json().data;", + " const credentialOfferIds = credentialOffers.map(({ id }) => id);", + " pm.variables.set('holder_credential_offer_ids', credentialOfferIds);", + "});", + "", + "pm.sendRequest({", + " url: pm.collectionVariables.get('Credential Manager Base URL') + \"/v1/credentials?tenantId=\" + pm.collectionVariables.get('issuer_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const credentials = res.json().data;", + " const credentialIds = credentials.map(({ id }) => id);", + " pm.variables.set('issuer_credential_ids', credentialIds);", + "})" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "const oldCredentialOfferIds = pm.variables.get('holder_credential_offer_ids') || [];", + "pm.sendRequest({", + " url: pm.collectionVariables.get('Credential Manager Base URL') + \"/v1/credential-offers?tenantId=\" + pm.collectionVariables.get('holder_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const credentialOffers = res.json().data;", + " const credentialOfferIds = credentialOffers.map(({ id }) => id);", + " const newCredentialOfferIds = credentialOfferIds.filter((id) => !oldCredentialOfferIds.includes(id));", + "", + " if (newCredentialOfferIds.length) {", + " pm.collectionVariables.set('holder_credential_offer_w_revocation_id', newCredentialOfferIds[0]);", + " }", + "});", + "", + "// Store new credential id on Issuer's side", + "{", + " const oldCredentialIds = pm.variables.get('issuer_credential_ids');", + "", + " pm.sendRequest({", + " url: pm.collectionVariables.get('Credential Manager Base URL') + \"/v1/credentials?tenantId=\" + pm.collectionVariables.get('issuer_id'),", + " method: \"GET\"", + " }, (err, res) => {", + " const credentials = res.json().data;", + " const credentialIds = credentials.map(({ id }) => id);", + " const newCredentialIds = credentialIds.filter((id) => !oldCredentialIds.includes(id))", + "", + " if (newCredentialIds.length > 0) {", + " pm.collectionVariables.set('revocable_credential_id', newCredentialIds[0]);", + " }", + " });", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"connectionId\": \"{{issuer_holder_connection_id_for_issuer}}\",\n \"credentialDefinitionId\": \"{{credential_definition_w_revocation_id}}\",\n \"revocationRegistryDefinitionId\": \"{{revocation_registry_definition_id}}\",\n \"attributes\": [\n {\n \"name\": \"color\",\n \"value\": \"navy\"\n },\n {\n \"name\": \"size\",\n \"value\": \"xxl\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credential-offers?tenantId={{issuer_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credential-offers" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get issuer credentials", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credentials?tenantId={{issuer_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credentials" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Accept Credential Offer (holder)", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credential-offers/:credentialOfferId/accept?tenantId={{holder_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credential-offers", + ":credentialOfferId", + "accept" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ], + "variable": [ + { + "key": "credentialOfferId", + "value": "{{holder_credential_offer_w_revocation_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get holder credentials", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credentials?tenantId={{holder_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credentials" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ] + } + }, + "response": [] + } + ] + } + ] + }, + { + "name": "Self-issue Credential", + "item": [ + { + "name": "Make a Credential Offer", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"credentialDefinitionId\": \"{{credential_definition_id}}\",\n \"attributes\": [\n {\n \"name\": \"color\",\n \"value\": \"navy\"\n },\n {\n \"name\": \"size\",\n \"value\": \"xxl\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credential-offers/self?tenantId={{issuer_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credential-offers", + "self" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get issuer credentials", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credentials?tenantId={{issuer_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credentials" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Request Proof", + "item": [ + { + "name": "Request Proof", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "pm.sendRequest({", + " url: pm.collectionVariables.get('Proof Manager Base URL') + \"/v1/proofs?tenantId=\" + pm.collectionVariables.get('holder_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const proofRequests = res.json().data;", + " const proofRequestIds = proofRequests.map(({ id }) => id);", + " pm.variables.set('holder_proof_request_ids', proofRequestIds);", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "const oldProofRequestIds = pm.variables.get('holder_proof_request_ids') || [];", + "pm.sendRequest({", + " url: pm.collectionVariables.get('Proof Manager Base URL') + \"/v1/proofs?tenantId=\" + pm.collectionVariables.get('holder_id'),", + " method: \"GET\"", + "}, (err, res) => {", + " const proofRequests = res.json().data;", + " const proofRequestIds = proofRequests.map(({ id }) => id);", + " const newProofRequestIds = proofRequestIds.filter((id) => !oldProofRequestIds.includes(id));", + "", + " if (newProofRequestIds.length) {", + " pm.collectionVariables.set('holder_proof_request_id', newProofRequestIds[0]);", + " }", + "})" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"{{$randomBsAdjective}}_{{$randomBsNoun}}\",\n \"connectionId\": \"{{verifier_holder_connection_id_for_verifier}}\",\n \"requestedAttributes\": {\n \"color\": {\n \"names\": [\"color\"]\n },\n \"size\": {\n \"names\": [\"size\"]\n }\n },\n \"requestedPredicates\": {}\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{Proof Manager Base URL}}/v1/proofs?tenantId={{verifier_id}}", + "host": [ + "{{Proof Manager Base URL}}" + ], + "path": [ + "v1", + "proofs" + ], + "query": [ + { + "key": "tenantId", + "value": "{{verifier_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get holder proof requests", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Proof Manager Base URL}}/v1/proofs?tenantId={{holder_id}}", + "host": [ + "{{Proof Manager Base URL}}" + ], + "path": [ + "v1", + "proofs" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Accept Proof Request", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{Proof Manager Base URL}}/v1/proofs/:proofRecordId/accept?tenantId={{holder_id}}", + "host": [ + "{{Proof Manager Base URL}}" + ], + "path": [ + "v1", + "proofs", + ":proofRecordId", + "accept" + ], + "query": [ + { + "key": "tenantId", + "value": "{{holder_id}}" + } + ], + "variable": [ + { + "key": "proofRecordId", + "value": "{{holder_proof_request_id}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get verifier proof requests", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{Proof Manager Base URL}}/v1/proofs?tenantId={{verifier_id}}", + "host": [ + "{{Proof Manager Base URL}}" + ], + "path": [ + "v1", + "proofs" + ], + "query": [ + { + "key": "tenantId", + "value": "{{verifier_id}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Revoke Credential", + "item": [ + { + "name": "Revoke Credential", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{Credential Manager Base URL}}/v1/credentials/:credentialId/revoke?tenantId={{issuer_id}}", + "host": [ + "{{Credential Manager Base URL}}" + ], + "path": [ + "v1", + "credentials", + ":credentialId", + "revoke" + ], + "query": [ + { + "key": "tenantId", + "value": "{{issuer_id}}" + } + ], + "variable": [ + { + "key": "credentialId", + "value": "{{revocable_credential_id}}" + } + ] + } + }, + "response": [] + } + ] + } + ], + "description": "This folder is designed to house a comprehensive series of requests aimed at conducting end-to-end testing for all APIs" + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "const variables = [", + " 'Schema Manager Base URL',", + " 'Connection Manager Base URL',", + " 'Credential Manager Base URL',", + " 'Proof Manager Base URL',", + " 'DevTools Base URL'", + "];", + "", + "for (const variable of variables) {", + " if (pm.environment.has(variable)) {", + " pm.collectionVariables.set(variable, pm.environment.get(variable));", + " }", + "}" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "Schema Manager Base URL", + "value": "http://localhost:4001", + "type": "string" + }, + { + "key": "Connection Manager Base URL", + "value": "http://localhost:4002", + "type": "string" + }, + { + "key": "Credential Manager Base URL", + "value": "http://localhost:4003", + "type": "string" + }, + { + "key": "Proof Manager Base URL", + "value": "http://localhost:4004", + "type": "string" + }, + { + "key": "DevTools Base URL", + "value": "http://localhost:4100", + "type": "string" + }, + { + "key": "DID Manager Base URL", + "value": "http://localhost:4006", + "type": "string" + }, + { + "key": "issuer_id", + "value": "" + }, + { + "key": "holder_id", + "value": "" + }, + { + "key": "verifier_id", + "value": "" + }, + { + "key": "issuer_did", + "value": "" + }, + { + "key": "schema_id", + "value": "" + }, + { + "key": "credential_definition_id", + "value": "" + }, + { + "key": "schema_name", + "value": "" + }, + { + "key": "verifier_holder_connection_id_for_holder", + "value": "" + }, + { + "key": "verifier_holder_connection_id_for_verifier", + "value": "" + }, + { + "key": "issuer_self_connection_id", + "value": "" + }, + { + "key": "issuer_holder_connection_id_for_holder", + "value": "" + }, + { + "key": "issuer_holder_connection_id_for_issuer", + "value": "" + }, + { + "key": "holder_credential_offer_id", + "value": "" + }, + { + "key": "holder_proof_request_id", + "value": "" + }, + { + "key": "credential_definition_w_revocation_id", + "value": "" + }, + { + "key": "revocation_schema_name", + "value": "" + }, + { + "key": "revocation_schema_id", + "value": "" + }, + { + "key": "holder_credential_offer_w_revocation_id", + "value": "" + }, + { + "key": "revocation_registry_definition_id", + "value": "" + }, + { + "key": "revocable_credential_id", + "value": "" + } + ] +} \ No newline at end of file diff --git a/package.json b/package.json index e19072471e51758196e5facf443351738ac5560d..4d8c7dfd0d549d96cbb01ce22345d701684b7e06 100644 --- a/package.json +++ b/package.json @@ -16,27 +16,32 @@ "format:all": "pnpm format -- .", "lint-staged": "lint-staged", "prepare": "husky install", - "createTenant": "vite-node scripts/create_tenant.mts" + "devtools": "pnpm -F devtools run exec", + "listTenants": "pnpm devtools list-tenants", + "createTenant": "pnpm devtools create-tenant", + "resolveDID": "pnpm devtools resolve-did", + "registerDID": "pnpm devtools register-did", + "registerEndorserDID": "pnpm devtools register-endorser-did" }, "devDependencies": { - "@commitlint/cli": "^18.4.2", - "@commitlint/config-conventional": "^18.4.2", - "@nestjs/common": "^10.3.0", - "@nestjs/core": "^10.3.0", - "@nestjs/microservices": "^10.3.0", - "@typescript-eslint/eslint-plugin": "^6.12.0", - "@typescript-eslint/parser": "^6.12.0", - "eslint": "^8.54.0", - "eslint-config-prettier": "^9.0.0", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-prettier": "^5.0.1", - "eslint-plugin-workspaces": "^0.10.0", - "husky": "^8.0.0", - "lint-staged": "^15.1.0", - "prettier": "^3.1.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1", - "vite-node": "^1.2.1" + "@commitlint/cli": "18.6.1", + "@commitlint/config-conventional": "18.6.2", + "@typescript-eslint/eslint-plugin": "7.0.2", + "@typescript-eslint/parser": "7.0.2", + "eslint": "8.56.0", + "eslint-config-prettier": "9.1.0", + "eslint-import-resolver-typescript": "3.6.1", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-prettier": "5.1.3", + "eslint-plugin-workspaces": "0.10.0", + "husky": "9.0.11", + "lint-staged": "15.2.2", + "prettier": "3.2.5" + }, + "pnpm": { + "patchedDependencies": { + "@credo-ts/indy-vdr@0.5.0-alpha.138": "patches/@credo-ts__indy-vdr@0.5.0-alpha.138.patch", + "@credo-ts/anoncreds@0.5.0-alpha.138": "patches/@credo-ts__anoncreds@0.5.0-alpha.138.patch" + } } } diff --git a/patches/@credo-ts__anoncreds@0.5.0-alpha.138.patch b/patches/@credo-ts__anoncreds@0.5.0-alpha.138.patch new file mode 100644 index 0000000000000000000000000000000000000000..6586c3fa74a952f1d87476681ff9589e899afb0f --- /dev/null +++ b/patches/@credo-ts__anoncreds@0.5.0-alpha.138.patch @@ -0,0 +1,16 @@ +diff --git a/build/AnonCredsApi.js b/build/AnonCredsApi.js +index d5118ee111a00dff7a22554a005a2af3cb480868..6228a9da1b604e94c6c50b1dc626970f8e445efb 100644 +--- a/build/AnonCredsApi.js ++++ b/build/AnonCredsApi.js +@@ -303,10 +303,7 @@ let AnonCredsApi = class AnonCredsApi { + revocationRegistryDefinition, + options: options.options, + }); +- // To avoid having unregistered revocation registry definitions in the wallet, the revocation registry definition itself are stored only when the revocation registry definition status is finished, meaning that the revocation registry definition has been successfully registered. +- if (result.revocationRegistryDefinitionState.state === 'finished') { +- await this.storeRevocationRegistryDefinitionRecord(result, revocationRegistryDefinitionPrivate); +- } ++ await this.storeRevocationRegistryDefinitionRecord(result, revocationRegistryDefinitionPrivate); + return Object.assign(Object.assign({}, result), { revocationRegistryDefinitionMetadata: Object.assign(Object.assign({}, result.revocationRegistryDefinitionMetadata), { localTailsLocation }) }); + } + catch (error) { diff --git a/patches/@credo-ts__indy-vdr@0.5.0-alpha.138.patch b/patches/@credo-ts__indy-vdr@0.5.0-alpha.138.patch new file mode 100644 index 0000000000000000000000000000000000000000..3bdf2e1f6fcb49bbcb95e8109360f200e7592855 --- /dev/null +++ b/patches/@credo-ts__indy-vdr@0.5.0-alpha.138.patch @@ -0,0 +1,48 @@ +diff --git a/build/IndyVdrApi.d.ts b/build/IndyVdrApi.d.ts +index 3a929c1393ad4c8adddac2412db7d2adc24702f0..4855ae6fcc1cb99724952b604571bbb19419654d 100644 +--- a/build/IndyVdrApi.d.ts ++++ b/build/IndyVdrApi.d.ts +@@ -28,4 +28,5 @@ export declare class IndyVdrApi { + * @returns An endorsed transaction + */ + endorseTransaction(transaction: string | Record<string, unknown>, endorserDid: string): Promise<string>; ++ submitTransaction(transaction:string | Record<string, unknown>, submitterDid:string): Promise<void> + } +diff --git a/build/IndyVdrApi.js b/build/IndyVdrApi.js +index 689a3c4d325d8f04947fac8b12699e53b94d94e1..d242c58fbf1fc32dd26ed8ac2e427159c937eb2b 100644 +--- a/build/IndyVdrApi.js ++++ b/build/IndyVdrApi.js +@@ -73,6 +73,18 @@ let IndyVdrApi = class IndyVdrApi { + } + return endorsedTransaction.body; + } ++ async submitTransaction(txn, submitterDid) { ++ const request = new indy_vdr_shared_1.CustomRequest({ ++ customRequest: txn, ++ }); ++ ++ const {namespace } = (0, anoncreds_1.parseIndyDid)(submitterDid); ++ ++ return await this.indyVdrPoolService.submitTransaction( ++ request, ++ namespace ++ ); ++ } + }; + IndyVdrApi = __decorate([ + (0, core_1.injectable)(), +diff --git a/build/pool/IndyVdrPoolService.js b/build/pool/IndyVdrPoolService.js +index 54d034d35d4e2e4608cc41e87c39ae007a626acb..f11518aaae5f5c0352aa3694f2490a2a1a5497af 100644 +--- a/build/pool/IndyVdrPoolService.js ++++ b/build/pool/IndyVdrPoolService.js +@@ -163,6 +163,10 @@ let IndyVdrPoolService = class IndyVdrPoolService { + throw error; + } + } ++ async submitTransaction(txn, indyNamespace) { ++ const pool = this.getPoolForNamespace(indyNamespace) ++ return await pool.submitRequest(txn) ++ } + }; + IndyVdrPoolService = __decorate([ + (0, core_1.injectable)(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5fa7773ca395be03ce017e45c732830a24287119..026b264e95219c3090476e689e05cc98c814c877 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,744 +4,792 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + '@credo-ts/anoncreds@0.5.0-alpha.138': + hash: j426fc3a5cnwxikpued4ld6mqi + path: patches/@credo-ts__anoncreds@0.5.0-alpha.138.patch + '@credo-ts/indy-vdr@0.5.0-alpha.138': + hash: rx3uz4zmmaugcgt7ujdip54kgy + path: patches/@credo-ts__indy-vdr@0.5.0-alpha.138.patch + importers: .: devDependencies: '@commitlint/cli': - specifier: ^18.4.2 - version: 18.4.4(@types/node@20.11.5)(typescript@5.3.3) + specifier: 18.6.1 + version: 18.6.1(@types/node@20.11.19)(typescript@5.3.3) '@commitlint/config-conventional': - specifier: ^18.4.2 - version: 18.4.4 - '@nestjs/common': - specifier: ^10.3.0 - version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/microservices': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 18.6.2 + version: 18.6.2 '@typescript-eslint/eslint-plugin': - specifier: ^6.12.0 - version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: 7.0.2 + version: 7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': - specifier: ^6.12.0 - version: 6.19.0(eslint@8.56.0)(typescript@5.3.3) + specifier: 7.0.2 + version: 7.0.2(eslint@8.56.0)(typescript@5.3.3) eslint: - specifier: ^8.54.0 + specifier: 8.56.0 version: 8.56.0 eslint-config-prettier: - specifier: ^9.0.0 + specifier: 9.1.0 version: 9.1.0(eslint@8.56.0) eslint-import-resolver-typescript: - specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@6.19.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + specifier: 3.6.1 + version: 3.6.1(@typescript-eslint/parser@7.0.2)(eslint-plugin-import@2.29.1)(eslint@8.56.0) eslint-plugin-import: - specifier: ^2.29.0 - version: 2.29.1(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-plugin-prettier: - specifier: ^5.0.1 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.4) + specifier: 5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5) eslint-plugin-workspaces: - specifier: ^0.10.0 + specifier: 0.10.0 version: 0.10.0 husky: - specifier: ^8.0.0 - version: 8.0.3 + specifier: 9.0.11 + version: 9.0.11 lint-staged: - specifier: ^15.1.0 - version: 15.2.0 + specifier: 15.2.2 + version: 15.2.2 prettier: - specifier: ^3.1.0 - version: 3.2.4 - reflect-metadata: - specifier: ^0.1.13 - version: 0.1.14 - rxjs: - specifier: ^7.8.1 - version: 7.8.1 - vite-node: - specifier: ^1.2.1 - version: 1.2.1(@types/node@20.11.5) + specifier: 3.2.5 + version: 3.2.5 apps/connection-manager: dependencies: '@nestjs/common': - specifier: ^10.3.0 - version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14) + specifier: 3.2.0 + version: 3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/microservices': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/platform-express': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nestjs/schedule': - specifier: ^4.0.0 - version: 4.0.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14) + specifier: 4.0.1 + version: 4.0.1(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nestjs/swagger': - specifier: ^7.1.17 - version: 7.2.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + specifier: 7.3.0 + version: 7.3.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) '@ocm/shared': specifier: workspace:* version: link:../shared class-transformer: - specifier: ^0.5.1 + specifier: 0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 + specifier: 0.14.1 version: 0.14.1 express: - specifier: ^4.17.3 + specifier: 4.18.2 version: 4.18.2 + helmet: + specifier: 7.1.0 + version: 7.1.0 joi: - specifier: ^17.11.0 - version: 17.11.1 + specifier: 17.12.1 + version: 17.12.1 nats: - specifier: ^2.18.0 + specifier: 2.19.0 version: 2.19.0 reflect-metadata: - specifier: ^0.1.13 - version: 0.1.14 + specifier: 0.2.1 + version: 0.2.1 rxjs: - specifier: ^7.8.1 + specifier: 7.8.1 version: 7.8.1 devDependencies: '@jest/globals': - specifier: ^29.7.0 + specifier: 29.7.0 version: 29.7.0 '@nestjs/cli': - specifier: ^10.2.1 - version: 10.3.0(@swc/cli@0.1.63)(@swc/core@1.3.103) + specifier: 10.3.2 + version: 10.3.2(@swc/cli@0.3.9)(@swc/core@1.4.2) '@nestjs/schematics': - specifier: ^10.0.3 - version: 10.1.0(chokidar@3.5.3)(typescript@5.3.3) + specifier: 10.1.1 + version: 10.1.1(chokidar@3.6.0)(typescript@5.3.3) '@nestjs/testing': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3) '@swc/cli': - specifier: ^0.1.63 - version: 0.1.63(@swc/core@1.3.103) + specifier: 0.3.9 + version: 0.3.9(@swc/core@1.4.2) '@swc/core': - specifier: ^1.3.101 - version: 1.3.103 + specifier: 1.4.2 + version: 1.4.2 '@swc/jest': - specifier: ^0.2.29 - version: 0.2.29(@swc/core@1.3.103) + specifier: 0.2.36 + version: 0.2.36(@swc/core@1.4.2) '@types/express': - specifier: ^4.17.21 + specifier: 4.17.21 version: 4.17.21 '@types/jest': - specifier: 29.5.11 - version: 29.5.11 + specifier: 29.5.12 + version: 29.5.12 '@types/node': - specifier: ^20.10.5 - version: 20.11.5 + specifier: 20.11.19 + version: 20.11.19 jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + specifier: 29.7.0 + version: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) rimraf: - specifier: ^5.0.5 + specifier: 5.0.5 version: 5.0.5 typescript: - specifier: ^5.3.3 + specifier: 5.3.3 version: 5.3.3 apps/credential-manager: dependencies: '@nestjs/common': - specifier: ^10.3.0 - version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14) + specifier: 3.2.0 + version: 3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/microservices': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/platform-express': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) + '@nestjs/schedule': + specifier: 4.0.1 + version: 4.0.1(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nestjs/swagger': - specifier: ^7.1.16 - version: 7.2.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + specifier: 7.3.0 + version: 7.3.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) '@ocm/shared': specifier: workspace:* version: link:../shared class-transformer: - specifier: ^0.5.1 + specifier: 0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 + specifier: 0.14.1 version: 0.14.1 express: - specifier: ^4.17.3 + specifier: 4.18.2 version: 4.18.2 + helmet: + specifier: 7.1.0 + version: 7.1.0 joi: - specifier: ^17.11.0 - version: 17.11.1 + specifier: 17.12.1 + version: 17.12.1 nats: - specifier: ^2.18.0 + specifier: 2.19.0 version: 2.19.0 reflect-metadata: - specifier: ^0.1.13 - version: 0.1.14 + specifier: 0.2.1 + version: 0.2.1 rxjs: - specifier: ^7.8.1 + specifier: 7.8.1 version: 7.8.1 devDependencies: '@nestjs/cli': - specifier: ^10.3.0 - version: 10.3.0(@swc/cli@0.1.63)(@swc/core@1.3.103) + specifier: 10.3.2 + version: 10.3.2(@swc/cli@0.3.9)(@swc/core@1.4.2) '@nestjs/schematics': - specifier: ^10.1.0 - version: 10.1.0(chokidar@3.5.3)(typescript@5.3.3) + specifier: 10.1.1 + version: 10.1.1(chokidar@3.6.0)(typescript@5.3.3) '@nestjs/testing': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3) '@swc/cli': - specifier: ^0.1.62 - version: 0.1.63(@swc/core@1.3.103) + specifier: 0.3.9 + version: 0.3.9(@swc/core@1.4.2) '@swc/core': - specifier: ^1.3.96 - version: 1.3.103 + specifier: 1.4.2 + version: 1.4.2 '@swc/jest': - specifier: ^0.2.29 - version: 0.2.29(@swc/core@1.3.103) + specifier: 0.2.36 + version: 0.2.36(@swc/core@1.4.2) '@types/express': - specifier: ^4.17.21 + specifier: 4.17.21 version: 4.17.21 '@types/jest': - specifier: ^29.5.8 - version: 29.5.11 - '@types/jsonwebtoken': - specifier: ^9.0.5 - version: 9.0.5 + specifier: 29.5.12 + version: 29.5.12 '@types/node': - specifier: ^20.9.0 - version: 20.11.5 - '@types/supertest': - specifier: ^2.0.16 - version: 2.0.16 + specifier: 20.11.19 + version: 20.11.19 dotenv-cli: - specifier: ^7.3.0 + specifier: 7.3.0 version: 7.3.0 eslint: - specifier: ^8.53.0 + specifier: 8.56.0 version: 8.56.0 jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + specifier: 29.7.0 + version: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) rimraf: - specifier: ^5.0.5 + specifier: 5.0.5 version: 5.0.5 typescript: - specifier: ^5.3.2 + specifier: 5.3.3 version: 5.3.3 apps/did-manager: dependencies: '@nestjs/common': - specifier: ^10.3.0 - version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14) + specifier: 3.2.0 + version: 3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/microservices': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/platform-express': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nestjs/swagger': - specifier: ^7.2.0 - version: 7.2.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + specifier: 7.3.0 + version: 7.3.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) '@ocm/shared': specifier: workspace:* version: link:../shared class-transformer: - specifier: ^0.5.1 + specifier: 0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 + specifier: 0.14.1 version: 0.14.1 express: - specifier: ^4.17.3 + specifier: 4.18.2 version: 4.18.2 + helmet: + specifier: 7.1.0 + version: 7.1.0 joi: - specifier: ^17.11.0 - version: 17.11.1 + specifier: 17.12.1 + version: 17.12.1 nats: - specifier: ^2.18.0 + specifier: 2.19.0 version: 2.19.0 reflect-metadata: - specifier: ^0.1.13 - version: 0.1.14 + specifier: 0.2.1 + version: 0.2.1 rxjs: - specifier: ^7.8.1 + specifier: 7.8.1 version: 7.8.1 devDependencies: '@nestjs/cli': - specifier: ^10.3.0 - version: 10.3.0(@swc/cli@0.1.63)(@swc/core@1.3.103) + specifier: 10.3.2 + version: 10.3.2(@swc/cli@0.3.9)(@swc/core@1.4.2) '@nestjs/schematics': - specifier: ^10.1.0 - version: 10.1.0(chokidar@3.5.3)(typescript@5.3.3) + specifier: 10.1.1 + version: 10.1.1(chokidar@3.6.0)(typescript@5.3.3) '@nestjs/testing': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3) '@swc/cli': - specifier: ^0.1.62 - version: 0.1.63(@swc/core@1.3.103) + specifier: 0.3.9 + version: 0.3.9(@swc/core@1.4.2) '@swc/core': - specifier: ^1.3.96 - version: 1.3.103 + specifier: 1.4.2 + version: 1.4.2 '@swc/jest': - specifier: ^0.2.29 - version: 0.2.29(@swc/core@1.3.103) + specifier: 0.2.36 + version: 0.2.36(@swc/core@1.4.2) '@types/express': - specifier: ^4.17.21 + specifier: 4.17.21 version: 4.17.21 '@types/jest': - specifier: ^29.5.8 - version: 29.5.11 + specifier: 29.5.12 + version: 29.5.12 '@types/node': - specifier: ^20.9.0 - version: 20.11.5 + specifier: 20.11.19 + version: 20.11.19 jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + specifier: 29.7.0 + version: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) rimraf: - specifier: ^5.0.5 + specifier: 5.0.5 version: 5.0.5 typescript: - specifier: ^5.3.2 + specifier: 5.3.3 version: 5.3.3 apps/proof-manager: dependencies: '@nestjs/common': - specifier: ^10.3.0 - version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14) + specifier: 3.2.0 + version: 3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/mapped-types': - specifier: ^2.0.4 - version: 2.0.4(@nestjs/common@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + specifier: 2.0.5 + version: 2.0.5(@nestjs/common@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) '@nestjs/microservices': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/platform-express': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nestjs/swagger': - specifier: ^7.1.16 - version: 7.2.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + specifier: 7.3.0 + version: 7.3.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) '@ocm/shared': specifier: workspace:* version: link:../shared class-transformer: - specifier: ^0.5.1 + specifier: 0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 + specifier: 0.14.1 version: 0.14.1 express: - specifier: ^4.17.3 + specifier: 4.18.2 version: 4.18.2 + helmet: + specifier: 7.1.0 + version: 7.1.0 joi: - specifier: ^17.11.0 - version: 17.11.1 + specifier: 17.12.1 + version: 17.12.1 nats: - specifier: ^2.18.0 + specifier: 2.19.0 version: 2.19.0 reflect-metadata: - specifier: ^0.1.13 - version: 0.1.14 + specifier: 0.2.1 + version: 0.2.1 rxjs: - specifier: ^7.8.1 + specifier: 7.8.1 version: 7.8.1 devDependencies: '@jest/globals': - specifier: ^29.7.0 + specifier: 29.7.0 version: 29.7.0 '@nestjs/cli': - specifier: ^10.3.0 - version: 10.3.0(@swc/cli@0.1.63)(@swc/core@1.3.103) + specifier: 10.3.2 + version: 10.3.2(@swc/cli@0.3.9)(@swc/core@1.4.2) '@nestjs/schematics': - specifier: ^10.1.0 - version: 10.1.0(chokidar@3.5.3)(typescript@5.3.3) + specifier: 10.1.1 + version: 10.1.1(chokidar@3.6.0)(typescript@5.3.3) '@nestjs/testing': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3) '@swc/cli': - specifier: ^0.1.62 - version: 0.1.63(@swc/core@1.3.103) + specifier: 0.3.9 + version: 0.3.9(@swc/core@1.4.2) '@swc/core': - specifier: ^1.3.96 - version: 1.3.103 + specifier: 1.4.2 + version: 1.4.2 '@swc/jest': - specifier: ^0.2.29 - version: 0.2.29(@swc/core@1.3.103) + specifier: 0.2.36 + version: 0.2.36(@swc/core@1.4.2) '@types/express': - specifier: ^4.17.21 + specifier: 4.17.21 version: 4.17.21 '@types/jest': - specifier: ^29.5.9 - version: 29.5.11 + specifier: 29.5.12 + version: 29.5.12 '@types/node': - specifier: ^20.9.3 - version: 20.11.5 + specifier: 20.11.19 + version: 20.11.19 dotenv-cli: - specifier: ^7.3.0 + specifier: 7.3.0 version: 7.3.0 jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + specifier: 29.7.0 + version: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) rimraf: - specifier: ^5.0.5 + specifier: 5.0.5 version: 5.0.5 typescript: - specifier: ^5.3.2 + specifier: 5.3.3 version: 5.3.3 apps/schema-manager: dependencies: '@nestjs/common': - specifier: ^10.3.0 - version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14) + specifier: 3.2.0 + version: 3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/microservices': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/platform-express': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nestjs/swagger': - specifier: ^7.2.0 - version: 7.2.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + specifier: 7.3.0 + version: 7.3.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) '@ocm/shared': specifier: workspace:* version: link:../shared class-transformer: - specifier: ^0.5.1 + specifier: 0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 + specifier: 0.14.1 version: 0.14.1 express: - specifier: ^4.17.3 + specifier: 4.18.2 version: 4.18.2 + helmet: + specifier: 7.1.0 + version: 7.1.0 joi: - specifier: ^17.11.0 - version: 17.11.1 + specifier: 17.12.1 + version: 17.12.1 nats: - specifier: ^2.18.0 + specifier: 2.19.0 version: 2.19.0 reflect-metadata: - specifier: ^0.1.13 - version: 0.1.14 + specifier: 0.2.1 + version: 0.2.1 rxjs: - specifier: ^7.8.1 + specifier: 7.8.1 version: 7.8.1 devDependencies: '@nestjs/cli': - specifier: ^10.3.0 - version: 10.3.0(@swc/cli@0.1.63)(@swc/core@1.3.103) + specifier: 10.3.2 + version: 10.3.2(@swc/cli@0.3.9)(@swc/core@1.4.2) '@nestjs/schematics': - specifier: ^10.1.0 - version: 10.1.0(chokidar@3.5.3)(typescript@5.3.3) + specifier: 10.1.1 + version: 10.1.1(chokidar@3.6.0)(typescript@5.3.3) '@nestjs/testing': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3) '@swc/cli': - specifier: ^0.1.62 - version: 0.1.63(@swc/core@1.3.103) + specifier: 0.3.9 + version: 0.3.9(@swc/core@1.4.2) '@swc/core': - specifier: ^1.3.96 - version: 1.3.103 + specifier: 1.4.2 + version: 1.4.2 '@swc/jest': - specifier: ^0.2.29 - version: 0.2.29(@swc/core@1.3.103) + specifier: 0.2.36 + version: 0.2.36(@swc/core@1.4.2) '@types/express': - specifier: ^4.17.21 + specifier: 4.17.21 version: 4.17.21 '@types/jest': - specifier: ^29.5.8 - version: 29.5.11 + specifier: 29.5.12 + version: 29.5.12 '@types/jsonwebtoken': - specifier: ^9.0.5 + specifier: 9.0.5 version: 9.0.5 '@types/node': - specifier: ^20.9.0 - version: 20.11.5 + specifier: 20.11.19 + version: 20.11.19 '@types/supertest': - specifier: ^2.0.16 - version: 2.0.16 + specifier: 6.0.2 + version: 6.0.2 dotenv-cli: - specifier: ^7.3.0 + specifier: 7.3.0 version: 7.3.0 eslint: - specifier: ^8.53.0 + specifier: 8.56.0 version: 8.56.0 jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + specifier: 29.7.0 + version: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) rimraf: - specifier: ^5.0.5 + specifier: 5.0.5 version: 5.0.5 typescript: - specifier: ^5.3.2 + specifier: 5.3.3 version: 5.3.3 apps/shared: dependencies: '@credo-ts/anoncreds': - specifier: ^0.5.0-alpha.116 - version: 0.5.0-alpha.116(@hyperledger/anoncreds-shared@0.2.0-dev.10)(expo@49.0.21)(react-native@0.73.2) + specifier: 0.5.0-alpha.138 + version: 0.5.0-alpha.138(patch_hash=j426fc3a5cnwxikpued4ld6mqi)(@hyperledger/anoncreds-shared@0.2.0)(expo@49.0.21)(react-native@0.73.2) '@credo-ts/core': - specifier: ^0.5.0-alpha.116 - version: 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) + specifier: 0.5.0-alpha.138 + version: 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) '@credo-ts/tenants': - specifier: ^0.5.0-alpha.116 - version: 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) + specifier: 0.5.0-alpha.138 + version: 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) '@elastic/ecs-winston-format': - specifier: ^1.5.0 + specifier: 1.5.2 version: 1.5.2 '@nestjs/axios': - specifier: ^3.0.1 - version: 3.0.1(@nestjs/common@10.3.0)(axios@1.6.5)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 3.0.2 + version: 3.0.2(@nestjs/common@10.3.3)(axios@1.6.7)(rxjs@7.8.1) '@nestjs/common': - specifier: '*' - version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/core': - specifier: '*' - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/microservices': - specifier: '*' - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/platform-express': - specifier: '*' - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nestjs/swagger': - specifier: ^7.1.17 - version: 7.2.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + specifier: 7.3.0 + version: 7.3.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) '@nestjs/terminus': - specifier: ^10.2.0 - version: 10.2.0(@nestjs/axios@3.0.1)(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.2.3 + version: 10.2.3(@nestjs/axios@3.0.2)(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) axios: - specifier: ^1.6.2 - version: 1.6.5 + specifier: 1.6.7 + version: 1.6.7 class-transformer: - specifier: ^0.5.1 + specifier: 0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.0 + specifier: 0.14.1 version: 0.14.1 joi: - specifier: ^17.11.0 - version: 17.11.1 + specifier: 17.12.1 + version: 17.12.1 nats: - specifier: ^2.18.0 + specifier: 2.19.0 version: 2.19.0 reflect-metadata: - specifier: '*' - version: 0.1.14 + specifier: 0.2.1 + version: 0.2.1 rxjs: - specifier: ^7.8.1 + specifier: 7.8.1 version: 7.8.1 winston: - specifier: ^3.11.0 + specifier: 3.11.0 version: 3.11.0 devDependencies: '@nestjs/cli': - specifier: ^10.3.0 - version: 10.3.0 + specifier: 10.3.2 + version: 10.3.2 '@nestjs/testing': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3) '@types/jest': - specifier: ^29.5.9 - version: 29.5.11 + specifier: 29.5.12 + version: 29.5.12 '@types/node': - specifier: ^20.9.3 - version: 20.11.5 + specifier: 20.11.19 + version: 20.11.19 rimraf: - specifier: ^5.0.5 + specifier: 5.0.5 version: 5.0.5 supertest: - specifier: ^6.3.3 + specifier: 6.3.4 version: 6.3.4 ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.3.3) + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.3.3) ts-node: - specifier: ^10.9.1 - version: 10.9.2(@types/node@20.11.5)(typescript@5.3.3) + specifier: 10.9.2 + version: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) tsconfig-paths: - specifier: ^4.2.0 + specifier: 4.2.0 version: 4.2.0 typescript: - specifier: ^5.3.3 + specifier: 5.3.3 version: 5.3.3 apps/ssi-abstraction: dependencies: '@credo-ts/anoncreds': - specifier: 0.5.0-alpha.116 - version: 0.5.0-alpha.116(@hyperledger/anoncreds-shared@0.2.0-dev.10)(expo@49.0.21)(react-native@0.73.2) + specifier: 0.5.0-alpha.138 + version: 0.5.0-alpha.138(patch_hash=j426fc3a5cnwxikpued4ld6mqi)(@hyperledger/anoncreds-shared@0.2.0)(expo@49.0.21)(react-native@0.73.2) '@credo-ts/askar': - specifier: 0.5.0-alpha.116 - version: 0.5.0-alpha.116(@hyperledger/aries-askar-shared@0.2.0-dev.6)(expo@49.0.21)(react-native@0.73.2) + specifier: 0.5.0-alpha.138 + version: 0.5.0-alpha.138(@hyperledger/aries-askar-shared@0.2.0)(expo@49.0.21)(react-native@0.73.2) '@credo-ts/core': - specifier: 0.5.0-alpha.116 - version: 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) + specifier: 0.5.0-alpha.138 + version: 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) '@credo-ts/indy-vdr': - specifier: 0.5.0-alpha.116 - version: 0.5.0-alpha.116(@hyperledger/anoncreds-shared@0.2.0-dev.10)(@hyperledger/indy-vdr-shared@0.2.0-dev.6)(expo@49.0.21)(react-native@0.73.2) + specifier: 0.5.0-alpha.138 + version: 0.5.0-alpha.138(patch_hash=rx3uz4zmmaugcgt7ujdip54kgy)(@hyperledger/anoncreds-shared@0.2.0)(@hyperledger/indy-vdr-shared@0.2.0)(expo@49.0.21)(react-native@0.73.2) '@credo-ts/node': - specifier: 0.5.0-alpha.116 - version: 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) + specifier: 0.5.0-alpha.138 + version: 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) '@credo-ts/tenants': - specifier: ^0.5.0-alpha.116 - version: 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) + specifier: 0.5.0-alpha.138 + version: 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) '@elastic/ecs-winston-format': - specifier: ^1.5.0 + specifier: 1.5.2 version: 1.5.2 '@hyperledger/anoncreds-nodejs': - specifier: ^0.2.0-dev.9 - version: 0.2.0-dev.10 + specifier: 0.2.0 + version: 0.2.0 '@hyperledger/aries-askar-nodejs': - specifier: ^0.2.0-dev.6 - version: 0.2.0-dev.6 + specifier: 0.2.0 + version: 0.2.0 '@hyperledger/indy-vdr-nodejs': - specifier: ^0.2.0-dev.6 - version: 0.2.0-dev.6 + specifier: 0.2.0 + version: 0.2.0 '@nestjs/axios': - specifier: ^3.0.1 - version: 3.0.1(@nestjs/common@10.3.0)(axios@1.6.5)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 3.0.2 + version: 3.0.2(@nestjs/common@10.3.3)(axios@1.6.7)(rxjs@7.8.1) '@nestjs/common': - specifier: ^10.3.0 - version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14) + specifier: 3.2.0 + version: 3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/microservices': - specifier: ^10.3.0 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/terminus': - specifier: ^10.2.0 - version: 10.2.0(@nestjs/axios@3.0.1)(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + specifier: 10.2.3 + version: 10.2.3(@nestjs/axios@3.0.2)(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@ocm/shared': specifier: workspace:* version: link:../shared axios: - specifier: ^1.6.2 - version: 1.6.5 + specifier: 1.6.7 + version: 1.6.7 express: - specifier: ^4.17.3 + specifier: 4.18.2 version: 4.18.2 + helmet: + specifier: 7.1.0 + version: 7.1.0 joi: - specifier: ^17.6.0 - version: 17.11.1 + specifier: 17.12.1 + version: 17.12.1 minio: - specifier: ^7.1.3 + specifier: 7.1.3 version: 7.1.3 nats: - specifier: ^2.18.0 + specifier: 2.19.0 version: 2.19.0 rxjs: - specifier: ^7.2.0 + specifier: 7.8.1 version: 7.8.1 winston: - specifier: ^3.11.0 + specifier: 3.11.0 version: 3.11.0 devDependencies: '@nestjs/cli': - specifier: ^10.2.1 - version: 10.3.0 + specifier: 10.3.2 + version: 10.3.2 '@nestjs/schematics': - specifier: ^10.0.3 - version: 10.1.0(chokidar@3.5.3)(typescript@5.3.3) + specifier: 10.1.1 + version: 10.1.1(chokidar@3.6.0)(typescript@5.3.3) '@nestjs/testing': - specifier: ^10.2.10 - version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0) + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3) '@types/express': - specifier: ^4.17.21 + specifier: 4.17.21 version: 4.17.21 '@types/jest': - specifier: ^29.5.9 - version: 29.5.11 + specifier: 29.5.12 + version: 29.5.12 '@types/node': - specifier: ^20.9.3 - version: 20.11.5 + specifier: 20.11.19 + version: 20.11.19 '@types/supertest': - specifier: ^2.0.16 - version: 2.0.16 + specifier: 6.0.2 + version: 6.0.2 '@typescript-eslint/eslint-plugin': - specifier: ^6.12.0 - version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: 7.0.2 + version: 7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': - specifier: ^6.12.0 - version: 6.19.0(eslint@8.56.0)(typescript@5.3.3) + specifier: 7.0.2 + version: 7.0.2(eslint@8.56.0)(typescript@5.3.3) eslint: - specifier: ^8.54.0 + specifier: 8.56.0 version: 8.56.0 eslint-config-prettier: - specifier: ^9.0.0 + specifier: 9.1.0 version: 9.1.0(eslint@8.56.0) eslint-plugin-prettier: - specifier: ^5.0.1 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.4) + specifier: 5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5) jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + specifier: 29.7.0 + version: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: - specifier: ^3.1.0 - version: 3.2.4 + specifier: 3.2.5 + version: 3.2.5 rimraf: - specifier: ^5.0.5 + specifier: 5.0.5 version: 5.0.5 supertest: - specifier: ^6.1.3 + specifier: 6.3.4 version: 6.3.4 + testcontainers: + specifier: 10.7.1 + version: 10.7.1 ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.3.3) + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.3.3) ts-node: - specifier: ^10.0.0 - version: 10.9.2(@types/node@20.11.5)(typescript@5.3.3) + specifier: 10.9.2 + version: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) tsconfig-paths: - specifier: ^4.2.0 + specifier: 4.2.0 version: 4.2.0 typescript: - specifier: ~5.3.2 + specifier: 5.3.3 version: 5.3.3 + devtools: + dependencies: + '@nestjs/cli': + specifier: 10.3.2 + version: 10.3.2 + '@nestjs/common': + specifier: 10.3.3 + version: 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/config': + specifier: 3.2.0 + version: 3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1) + '@nestjs/core': + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/microservices': + specifier: 10.3.3 + version: 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@ocm/shared': + specifier: workspace:* + version: link:../apps/shared + joi: + specifier: 17.12.1 + version: 17.12.1 + nest-commander: + specifier: 3.12.5 + version: 3.12.5(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@types/inquirer@8.2.10)(typescript@5.3.3) + reflect-metadata: + specifier: 0.2.1 + version: 0.2.1 + rxjs: + specifier: 7.8.1 + version: 7.8.1 + vite-node: + specifier: 1.3.1 + version: 1.3.1(@types/node@20.11.19) + devDependencies: + rimraf: + specifier: 5.0.5 + version: 5.0.5 + packages: /@2060.io/ffi-napi@4.0.8: @@ -784,8 +832,8 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.21 - /@angular-devkit/core@17.0.9(chokidar@3.5.3): - resolution: {integrity: sha512-r5jqwpWOgowqe9KSDqJ3iSbmsEt2XPjSvRG4DSI2T9s31bReoMtreo8b7wkRa2B3hbcDnstFbn8q27VvJDqRaQ==} + /@angular-devkit/core@17.1.2(chokidar@3.6.0): + resolution: {integrity: sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 @@ -795,40 +843,37 @@ packages: dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) - chokidar: 3.5.3 + chokidar: 3.6.0 jsonc-parser: 3.2.0 picomatch: 3.0.1 rxjs: 7.8.1 source-map: 0.7.4 - dev: true - /@angular-devkit/schematics-cli@17.0.9(chokidar@3.5.3): - resolution: {integrity: sha512-tznzzB26sy8jVUlV9HhXcbFYZcIIFMAiDMOuyLko2LZFjfoqW+OPvwa1mwAQwvVVSQZVAKvdndFhzwyl/axwFQ==} + /@angular-devkit/schematics-cli@17.1.2(chokidar@3.6.0): + resolution: {integrity: sha512-bvXykYzSST05qFdlgIzUguNOb3z0hCa8HaTwtqdmQo9aFPf+P+/AC56I64t1iTchMjQtf3JrBQhYM25gUdcGbg==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true dependencies: - '@angular-devkit/core': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics': 17.0.9(chokidar@3.5.3) + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) ansi-colors: 4.1.3 - inquirer: 9.2.11 + inquirer: 9.2.12 symbol-observable: 4.0.0 yargs-parser: 21.1.1 transitivePeerDependencies: - chokidar - dev: true - /@angular-devkit/schematics@17.0.9(chokidar@3.5.3): - resolution: {integrity: sha512-5ti7g45F2KjDJS0DbgnOGI1GyKxGpn4XsKTYJFJrSAWj6VpuvPy/DINRrXNuRVo09VPEkqA+IW7QwaG9icptQg==} + /@angular-devkit/schematics@17.1.2(chokidar@3.6.0): + resolution: {integrity: sha512-8S9RuM8olFN/gwN+mjbuF1CwHX61f0i59EGXz9tXLnKRUTjsRR+8vVMTAmX0dvVAT5fJTG/T69X+HX7FeumdqA==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 17.0.9(chokidar@3.5.3) + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) jsonc-parser: 3.2.0 magic-string: 0.30.5 ora: 5.4.1 rxjs: 7.8.1 transitivePeerDependencies: - chokidar - dev: true /@astronautlabs/jsonpath@1.1.2: resolution: {integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==} @@ -2376,6 +2421,10 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@balena/dockerignore@1.0.2: + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + dev: true + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -2384,7 +2433,6 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} requiresBuild: true - dev: true optional: true /@colors/colors@1.6.0: @@ -2392,16 +2440,16 @@ packages: engines: {node: '>=0.1.90'} dev: false - /@commitlint/cli@18.4.4(@types/node@20.11.5)(typescript@5.3.3): - resolution: {integrity: sha512-Ro3wIo//fV3XiV1EkdpHog6huaEyNcUAVrSmtgKqYM5g982wOWmP4FXvEDFwRMVgz878CNBvvCc33dMZ5AQJ/g==} + /@commitlint/cli@18.6.1(@types/node@20.11.19)(typescript@5.3.3): + resolution: {integrity: sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==} engines: {node: '>=v18'} hasBin: true dependencies: - '@commitlint/format': 18.4.4 - '@commitlint/lint': 18.4.4 - '@commitlint/load': 18.4.4(@types/node@20.11.5)(typescript@5.3.3) - '@commitlint/read': 18.4.4 - '@commitlint/types': 18.4.4 + '@commitlint/format': 18.6.1 + '@commitlint/lint': 18.6.1 + '@commitlint/load': 18.6.1(@types/node@20.11.19)(typescript@5.3.3) + '@commitlint/read': 18.6.1 + '@commitlint/types': 18.6.1 execa: 5.1.1 lodash.isfunction: 3.0.9 resolve-from: 5.0.0 @@ -2412,26 +2460,27 @@ packages: - typescript dev: true - /@commitlint/config-conventional@18.4.4: - resolution: {integrity: sha512-Bz3sPQSboBN+Et/KyZrR+OJ3z9PrHDw7Bls0/hv94PmuHBtMq1dCGxS9XzTGzxeMNlytCC4kxF083tbhPljl3Q==} + /@commitlint/config-conventional@18.6.2: + resolution: {integrity: sha512-PcgSYg1AKGQIwDQKbaHtJsfqYy4uJTC7crLVZ83lfjcPaec4Pry2vLeaWej7ao2KsT20l9dWoMPpEGg8LWdUuA==} engines: {node: '>=v18'} dependencies: + '@commitlint/types': 18.6.1 conventional-changelog-conventionalcommits: 7.0.2 dev: true - /@commitlint/config-validator@18.4.4: - resolution: {integrity: sha512-/QI8KIg/h7O0Eus36fPcEcO3QPBcdXuGfZeCF5m15k0EB2bcU8s6pHNTNEa6xz9PrAefHCL+yzRJj7w20T6Mow==} + /@commitlint/config-validator@18.6.1: + resolution: {integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.4 + '@commitlint/types': 18.6.1 ajv: 8.12.0 dev: true - /@commitlint/ensure@18.4.4: - resolution: {integrity: sha512-KjD19p6julB5WrQL+Cd8p+AePwpl1XzGAjB0jnuFMKWtji9L7ucCZUKDstGjlkBZGGzH/nvdB8K+bh5K27EVUg==} + /@commitlint/ensure@18.6.1: + resolution: {integrity: sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.4 + '@commitlint/types': 18.6.1 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -2439,48 +2488,48 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /@commitlint/execute-rule@18.4.4: - resolution: {integrity: sha512-a37Nd3bDQydtg9PCLLWM9ZC+GO7X5i4zJvrggJv5jBhaHsXeQ9ZWdO6ODYR+f0LxBXXNYK3geYXJrCWUCP8JEg==} + /@commitlint/execute-rule@18.6.1: + resolution: {integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==} engines: {node: '>=v18'} dev: true - /@commitlint/format@18.4.4: - resolution: {integrity: sha512-2v3V5hVlv0R3pe7p66IX5F7cjeVvGM5JqITRIbBCFvGHPJ/CG74rjTkAu0RBEiIhlk3eOaLjVGq3d5falPkLBA==} + /@commitlint/format@18.6.1: + resolution: {integrity: sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.4 + '@commitlint/types': 18.6.1 chalk: 4.1.2 dev: true - /@commitlint/is-ignored@18.4.4: - resolution: {integrity: sha512-rXWes9owKBTjfTr6Od7YlflRg4N+ngkOH+dUZhk0qL/XQb26mHz0EgVgdixMVBac1OsohRwJaLmVHX+5F6vfmg==} + /@commitlint/is-ignored@18.6.1: + resolution: {integrity: sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.4 - semver: 7.5.4 + '@commitlint/types': 18.6.1 + semver: 7.6.0 dev: true - /@commitlint/lint@18.4.4: - resolution: {integrity: sha512-SoyQstVxMY5Z4GnFRtRzy+NWYb+yVseXgir+7BxnpB59oH05C9XztRrhDw6OnkNeXhjINTpi1HLnuY7So+CaAQ==} + /@commitlint/lint@18.6.1: + resolution: {integrity: sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==} engines: {node: '>=v18'} dependencies: - '@commitlint/is-ignored': 18.4.4 - '@commitlint/parse': 18.4.4 - '@commitlint/rules': 18.4.4 - '@commitlint/types': 18.4.4 + '@commitlint/is-ignored': 18.6.1 + '@commitlint/parse': 18.6.1 + '@commitlint/rules': 18.6.1 + '@commitlint/types': 18.6.1 dev: true - /@commitlint/load@18.4.4(@types/node@20.11.5)(typescript@5.3.3): - resolution: {integrity: sha512-RaDIa9qwOw2xRJ3Jr2DBXd14rmnHJIX2XdZF4kmoF1rgsg/+7cvrExLSUNAkQUNimyjCn1b/bKX2Omm+GdY0XQ==} + /@commitlint/load@18.6.1(@types/node@20.11.19)(typescript@5.3.3): + resolution: {integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==} engines: {node: '>=v18'} dependencies: - '@commitlint/config-validator': 18.4.4 - '@commitlint/execute-rule': 18.4.4 - '@commitlint/resolve-extends': 18.4.4 - '@commitlint/types': 18.4.4 + '@commitlint/config-validator': 18.6.1 + '@commitlint/execute-rule': 18.6.1 + '@commitlint/resolve-extends': 18.6.1 + '@commitlint/types': 18.6.1 chalk: 4.1.2 cosmiconfig: 8.3.6(typescript@5.3.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.5)(cosmiconfig@8.3.6)(typescript@5.3.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.19)(cosmiconfig@8.3.6)(typescript@5.3.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -2490,79 +2539,79 @@ packages: - typescript dev: true - /@commitlint/message@18.4.4: - resolution: {integrity: sha512-lHF95mMDYgAI1LBXveJUyg4eLaMXyOqJccCK3v55ZOEUsMPrDi8upqDjd/NmzWmESYihaOMBTAnxm+6oD1WoDQ==} + /@commitlint/message@18.6.1: + resolution: {integrity: sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==} engines: {node: '>=v18'} dev: true - /@commitlint/parse@18.4.4: - resolution: {integrity: sha512-99G7dyn/OoyNWXJni0Ki0K3aJd01pEb/Im/Id6y4X7PN+kGOahjz2z/cXYYHn7xDdooqFVdiVrVLeChfgpWZ2g==} + /@commitlint/parse@18.6.1: + resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.4 + '@commitlint/types': 18.6.1 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 dev: true - /@commitlint/read@18.4.4: - resolution: {integrity: sha512-r58JbWky4gAFPea/CZmvlqP9Ehbs+8gSEUqhIJOojKzTc3xlxFnZUDVPcEnnaqzQEEoV6C69VW7xuzdcBlu/FQ==} + /@commitlint/read@18.6.1: + resolution: {integrity: sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==} engines: {node: '>=v18'} dependencies: - '@commitlint/top-level': 18.4.4 - '@commitlint/types': 18.4.4 + '@commitlint/top-level': 18.6.1 + '@commitlint/types': 18.6.1 git-raw-commits: 2.0.11 minimist: 1.2.8 dev: true - /@commitlint/resolve-extends@18.4.4: - resolution: {integrity: sha512-RRpIHSbRnFvmGifVk21Gqazf1QF/yeP+Kkg/e3PlkegcOKd/FGOXp/Kx9cvSO2K7ucSn4GD/oBvgasFoy+NCAw==} + /@commitlint/resolve-extends@18.6.1: + resolution: {integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==} engines: {node: '>=v18'} dependencies: - '@commitlint/config-validator': 18.4.4 - '@commitlint/types': 18.4.4 + '@commitlint/config-validator': 18.6.1 + '@commitlint/types': 18.6.1 import-fresh: 3.3.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 resolve-global: 1.0.0 dev: true - /@commitlint/rules@18.4.4: - resolution: {integrity: sha512-6Uzlsnl/GljEI+80NWjf4ThOfR8NIsbm18IfXYuCEchlwMHSxiuYG4rHSK5DNmG/+MIo8eR5VdQ0gQyt7kWzAA==} + /@commitlint/rules@18.6.1: + resolution: {integrity: sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==} engines: {node: '>=v18'} dependencies: - '@commitlint/ensure': 18.4.4 - '@commitlint/message': 18.4.4 - '@commitlint/to-lines': 18.4.4 - '@commitlint/types': 18.4.4 + '@commitlint/ensure': 18.6.1 + '@commitlint/message': 18.6.1 + '@commitlint/to-lines': 18.6.1 + '@commitlint/types': 18.6.1 execa: 5.1.1 dev: true - /@commitlint/to-lines@18.4.4: - resolution: {integrity: sha512-mwe2Roa59NCz/krniAdCygFabg7+fQCkIhXqBHw00XQ8Y7lw4poZLLxeGI3p3bLpcEOXdqIDrEGLwHmG5lBdwQ==} + /@commitlint/to-lines@18.6.1: + resolution: {integrity: sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==} engines: {node: '>=v18'} dev: true - /@commitlint/top-level@18.4.4: - resolution: {integrity: sha512-PBwW1drgeavl9CadB7IPRUk6rkUP/O8jEkxjlC+ofuh3pw0bzJdAT+Kw7M1Yc9KtTb9xTaqUB8uvRtaybHa/tQ==} + /@commitlint/top-level@18.6.1: + resolution: {integrity: sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==} engines: {node: '>=v18'} dependencies: find-up: 5.0.0 dev: true - /@commitlint/types@18.4.4: - resolution: {integrity: sha512-/FykLtodD8gKs3+VNkAUwofu4LBHankclj+I8fB2jTRvG6PV7k/OUt4P+VbM7ip853qS4F0g7Z6hLNa6JeMcAQ==} + /@commitlint/types@18.6.1: + resolution: {integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==} engines: {node: '>=v18'} dependencies: chalk: 4.1.2 dev: true - /@credo-ts/anoncreds@0.5.0-alpha.116(@hyperledger/anoncreds-shared@0.2.0-dev.10)(expo@49.0.21)(react-native@0.73.2): - resolution: {integrity: sha512-TiPU7JVanlYiYoEb/HPraELD+cFcKqpIPTfy5Nj1UXtXVh4z/LJTgXHV44EF5bWnNX+tWdX1+yeP8tod4HASAw==} + /@credo-ts/anoncreds@0.5.0-alpha.138(patch_hash=j426fc3a5cnwxikpued4ld6mqi)(@hyperledger/anoncreds-shared@0.2.0)(expo@49.0.21)(react-native@0.73.2): + resolution: {integrity: sha512-AJLQXquMO2g/3w9YvC1/NtU963HWC1y5Ikp8pgGntKhpGTKcwBAbtG6BM7PynWsExYd/DOjNsy0BM5H9gtVTAw==} peerDependencies: - '@hyperledger/anoncreds-shared': ^0.2.0-dev.9 + '@hyperledger/anoncreds-shared': ^0.2.0 dependencies: - '@credo-ts/core': 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) - '@hyperledger/anoncreds-shared': 0.2.0-dev.10 + '@credo-ts/core': 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) + '@hyperledger/anoncreds-shared': 0.2.0 bn.js: 5.2.1 class-transformer: 0.5.1 class-validator: 0.14.1 @@ -2575,14 +2624,15 @@ packages: - supports-color - web-streams-polyfill dev: false + patched: true - /@credo-ts/askar@0.5.0-alpha.116(@hyperledger/aries-askar-shared@0.2.0-dev.6)(expo@49.0.21)(react-native@0.73.2): - resolution: {integrity: sha512-WkRGISpX5a6vHij7urJYDi91v8hdlcRnJEje9Ge4YUNAApdMXis4o/bb6CXxkM80cEmqxvjhIoXJzkD1u+oQ8A==} + /@credo-ts/askar@0.5.0-alpha.138(@hyperledger/aries-askar-shared@0.2.0)(expo@49.0.21)(react-native@0.73.2): + resolution: {integrity: sha512-rD5u9/eIZhkoNpDQM/6N6PYn5mEt83t90DEtB+arTSE1LJ3FZIakZeI3G/ilDLTo2Pzkk8Xq2Zk1Kfh1uqyBMg==} peerDependencies: - '@hyperledger/aries-askar-shared': ^0.2.0-dev.6 + '@hyperledger/aries-askar-shared': ^0.2.0 dependencies: - '@credo-ts/core': 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) - '@hyperledger/aries-askar-shared': 0.2.0-dev.6 + '@credo-ts/core': 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) + '@hyperledger/aries-askar-shared': 0.2.0 bn.js: 5.2.1 class-transformer: 0.5.1 class-validator: 0.14.1 @@ -2597,17 +2647,17 @@ packages: - web-streams-polyfill dev: false - /@credo-ts/core@0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2): - resolution: {integrity: sha512-nlPRDzHhWwtwr0WgDoGGgkZ1Q1K5fZT0YjganJSY554PKj7jyH0OoGU6GIJ65C9xnnkbyOWXmhEvf4zX0J4CKw==} + /@credo-ts/core@0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2): + resolution: {integrity: sha512-IeGX/FGL+IjsDFA0V3zjln78XyqEoKe4xx6gSlG2DpExv3ua6t1GdVV0sD4Fu1fmyir5YTbmi1YjDKXlqYLvow==} dependencies: '@digitalcredentials/jsonld': 6.0.0(expo@49.0.21)(react-native@0.73.2) '@digitalcredentials/jsonld-signatures': 9.4.0(expo@49.0.21)(react-native@0.73.2) '@digitalcredentials/vc': 6.0.1(expo@49.0.21)(react-native@0.73.2) '@multiformats/base-x': 4.0.1 - '@sd-jwt/core': 0.2.0 - '@sd-jwt/decode': 0.2.0 - '@sphereon/pex': 3.0.1 - '@sphereon/pex-models': 2.1.5 + '@sd-jwt/core': 0.2.1 + '@sd-jwt/decode': 0.2.1 + '@sphereon/pex': 3.2.0 + '@sphereon/pex-models': 2.2.0 '@sphereon/ssi-types': 0.18.1 '@stablelib/ed25519': 1.0.3 '@stablelib/sha256': 1.0.1 @@ -2640,14 +2690,14 @@ packages: - web-streams-polyfill dev: false - /@credo-ts/indy-vdr@0.5.0-alpha.116(@hyperledger/anoncreds-shared@0.2.0-dev.10)(@hyperledger/indy-vdr-shared@0.2.0-dev.6)(expo@49.0.21)(react-native@0.73.2): - resolution: {integrity: sha512-Ztsm2rQ5PErDzlS5eG6nC/Kvz7Cl3ecc5LM7aBYICwOxi/iFqjCusnoFVsPMos3kI0ePssoz54d7/drzyev8wA==} + /@credo-ts/indy-vdr@0.5.0-alpha.138(patch_hash=rx3uz4zmmaugcgt7ujdip54kgy)(@hyperledger/anoncreds-shared@0.2.0)(@hyperledger/indy-vdr-shared@0.2.0)(expo@49.0.21)(react-native@0.73.2): + resolution: {integrity: sha512-1opj8vL95xctnD4oI+apZNwG+8SUJAF/2nFXrT0ifk99Mb7H2ZYgcG/P0JUIx/R9Vuu76mJIdI6Rz//x1siuXg==} peerDependencies: - '@hyperledger/indy-vdr-shared': ^0.2.0-dev.6 + '@hyperledger/indy-vdr-shared': ^0.2.0 dependencies: - '@credo-ts/anoncreds': 0.5.0-alpha.116(@hyperledger/anoncreds-shared@0.2.0-dev.10)(expo@49.0.21)(react-native@0.73.2) - '@credo-ts/core': 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) - '@hyperledger/indy-vdr-shared': 0.2.0-dev.6 + '@credo-ts/anoncreds': 0.5.0-alpha.138(patch_hash=j426fc3a5cnwxikpued4ld6mqi)(@hyperledger/anoncreds-shared@0.2.0)(expo@49.0.21)(react-native@0.73.2) + '@credo-ts/core': 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) + '@hyperledger/indy-vdr-shared': 0.2.0 transitivePeerDependencies: - '@hyperledger/anoncreds-shared' - domexception @@ -2657,13 +2707,14 @@ packages: - supports-color - web-streams-polyfill dev: false + patched: true - /@credo-ts/node@0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2): - resolution: {integrity: sha512-NQGrs6UAyeb4we13aIQcKKt97CYOs2IpgVEb+ZAwcTjAY8klmxPQA9U9JvyL2TTnbVXf152qzH/YwwsfCA3SKA==} + /@credo-ts/node@0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2): + resolution: {integrity: sha512-e3y10v0ROKe2/sKMbEIDIr1StnvQ9eMcxPPdNDAAgjzLIK9mr0ieV42dt7EKaQc0iRLDpcmxETUHgkxgllaYvw==} dependencies: '@2060.io/ffi-napi': 4.0.8 '@2060.io/ref-napi': 3.0.6 - '@credo-ts/core': 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) + '@credo-ts/core': 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) '@types/express': 4.17.21 express: 4.18.2 ws: 8.16.0 @@ -2678,10 +2729,10 @@ packages: - web-streams-polyfill dev: false - /@credo-ts/tenants@0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2): - resolution: {integrity: sha512-dmN7KYBIqjqk91z/MIDZZ+kYUbi89bLiYo3VWu+U7ZxCrlBCtlrYr2jpBG7Wp3sLGd256JmvDo6FjvqMG++46g==} + /@credo-ts/tenants@0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2): + resolution: {integrity: sha512-kB7CdW3eyGVVgmRC1ljsAdXClXGU8ds+yv3LBZ4YH2HjOoGP4dyg9W+/WMq5WnRdas9/HO3try/iULfTJSa8pQ==} dependencies: - '@credo-ts/core': 0.5.0-alpha.116(expo@49.0.21)(react-native@0.73.2) + '@credo-ts/core': 0.5.0-alpha.138(expo@49.0.21)(react-native@0.73.2) async-mutex: 0.4.0 transitivePeerDependencies: - domexception @@ -2944,7 +2995,7 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/android-arm64@0.19.12: @@ -2953,7 +3004,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/android-arm@0.19.12: @@ -2962,7 +3013,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/android-x64@0.19.12: @@ -2971,7 +3022,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/darwin-arm64@0.19.12: @@ -2980,7 +3031,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/darwin-x64@0.19.12: @@ -2989,7 +3040,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/freebsd-arm64@0.19.12: @@ -2998,7 +3049,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/freebsd-x64@0.19.12: @@ -3007,7 +3058,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-arm64@0.19.12: @@ -3016,7 +3067,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-arm@0.19.12: @@ -3025,7 +3076,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-ia32@0.19.12: @@ -3034,7 +3085,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-loong64@0.19.12: @@ -3043,7 +3094,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-mips64el@0.19.12: @@ -3052,7 +3103,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-ppc64@0.19.12: @@ -3061,7 +3112,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-riscv64@0.19.12: @@ -3070,7 +3121,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-s390x@0.19.12: @@ -3079,7 +3130,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-x64@0.19.12: @@ -3088,7 +3139,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/netbsd-x64@0.19.12: @@ -3097,7 +3148,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/openbsd-x64@0.19.12: @@ -3106,7 +3157,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/sunos-x64@0.19.12: @@ -3115,7 +3166,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/win32-arm64@0.19.12: @@ -3124,7 +3175,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/win32-ia32@0.19.12: @@ -3133,7 +3184,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/win32-x64@0.19.12: @@ -3142,7 +3193,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): @@ -3248,7 +3299,7 @@ packages: require-from-string: 2.0.2 requireg: 0.2.2 resolve-from: 5.0.0 - semver: 7.5.4 + semver: 7.6.0 send: 0.18.0 slugify: 1.6.6 structured-headers: 0.4.1 @@ -3291,7 +3342,7 @@ packages: getenv: 1.0.0 glob: 7.1.6 resolve-from: 5.0.0 - semver: 7.5.4 + semver: 7.6.0 slash: 3.0.0 xcode: 3.0.1 xml2js: 0.6.0 @@ -3537,11 +3588,31 @@ packages: engines: {node: '>=14'} dev: false + /@fig/complete-commander@3.0.0(commander@11.1.0): + resolution: {integrity: sha512-jxiF1O+xiqdM7jECmTTrSO5w35iKsVRcSCz9mu20R4bFgLJS+61VNHw2A3EY7gU1kKlLJye0TmkyTfAoPhIq7A==} + peerDependencies: + commander: ^11.1.0 + dependencies: + commander: 11.1.0 + prettier: 3.2.5 + dev: false + /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: false optional: true + /@golevelup/nestjs-discovery@4.0.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3): + resolution: {integrity: sha512-iyZLYip9rhVMR0C93vo860xmboRrD5g5F5iEOfpeblGvYSz8ymQrL9RAST7x/Fp3n+TAXSeOLzDIASt+rak68g==} + peerDependencies: + '@nestjs/common': ^10.x + '@nestjs/core': ^10.x + dependencies: + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + lodash: 4.17.21 + dev: false + /@graphql-typed-document-node/core@3.2.0(graphql@15.8.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -3581,13 +3652,13 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true - /@hyperledger/anoncreds-nodejs@0.2.0-dev.10: - resolution: {integrity: sha512-Dj5f1CFsWOQWcQCWEralMC/YvEFhIy+ZSlUBN8ZUTg81UW6Ik438BmHnqrbymdCjy9WMXPPVjSmvrubYI7KFew==} + /@hyperledger/anoncreds-nodejs@0.2.0: + resolution: {integrity: sha512-OAjzdAZv+nzTGfDyQi/pR3ztfYzbvCbALx8RbibAOe2y2Zja7kWcIpwmnDc/PyYI/B3xrgl5jiLslOPrZo35hA==} requiresBuild: true dependencies: '@2060.io/ffi-napi': 4.0.8 '@2060.io/ref-napi': 3.0.6 - '@hyperledger/anoncreds-shared': 0.2.0-dev.10 + '@hyperledger/anoncreds-shared': 0.2.0 '@mapbox/node-pre-gyp': 1.0.11 ref-array-di: 1.2.2 ref-struct-di: 1.1.1 @@ -3596,18 +3667,18 @@ packages: - supports-color dev: false - /@hyperledger/anoncreds-shared@0.2.0-dev.10: - resolution: {integrity: sha512-jbbsgiYjjEceOgD9iVXCLMILgpyDZrhXfs/ZXOnfr8xk9ZPeB3Xp7ZqpyNSTPJkNaORM9eC/ni56A1dLbGeBIg==} + /@hyperledger/anoncreds-shared@0.2.0: + resolution: {integrity: sha512-ZVSivQgCisao/5vsuSb0KmvwJ227pGm3Wpb6KjPgFlea+F7e7cKAxwtrDBIReKe6E14OqysGte8TMozHUFldAA==} dev: false - /@hyperledger/aries-askar-nodejs@0.2.0-dev.6: - resolution: {integrity: sha512-dnWcr31oOARRy0fhhw/CpfGhrxIg37UmZHJM0YB+fy30EmwXWHfZy8h1qy8D7uuyfD5FI1pXNDOlYgmMuLdJNQ==} + /@hyperledger/aries-askar-nodejs@0.2.0: + resolution: {integrity: sha512-d73D2zK1f1cM5y8MFp4BK+NvkquujDlRr91THpxkuRwmLf407gibOY3G4OdGIkL1kQtorGM5c5U0/qMzW+8E1Q==} engines: {node: '>= 18'} requiresBuild: true dependencies: '@2060.io/ffi-napi': 4.0.8 '@2060.io/ref-napi': 3.0.6 - '@hyperledger/aries-askar-shared': 0.2.0-dev.6 + '@hyperledger/aries-askar-shared': 0.2.0 '@mapbox/node-pre-gyp': 1.0.11 node-cache: 5.1.2 ref-array-di: 1.2.2 @@ -3617,20 +3688,20 @@ packages: - supports-color dev: false - /@hyperledger/aries-askar-shared@0.2.0-dev.6: - resolution: {integrity: sha512-gJa28QNR5yZI2DAnfb6/wafVaI2upcT1fmt0g+Qe68IY+JJXQHzijP+zuxR3EF8pQxFEJLBmlFDn3hPHr4Kpiw==} + /@hyperledger/aries-askar-shared@0.2.0: + resolution: {integrity: sha512-A6bHbTwTtV1YT3XphNFltX34DCBtj7qPyip4R+WAQFnus5286a2xsppNvl5OAPMAxgKjQTdyFBqcYaNRc0lqIQ==} dependencies: buffer: 6.0.3 dev: false - /@hyperledger/indy-vdr-nodejs@0.2.0-dev.6: - resolution: {integrity: sha512-yOmfOqJJJapJRWdKSJQG7q/frKGUrntoae4fiYnwdQEWy4rdRiyZPo0ht9R6uuZ/AQwxtNMMRylvQZBfHA+vKA==} + /@hyperledger/indy-vdr-nodejs@0.2.0: + resolution: {integrity: sha512-yv+p0mU9NBUgmUDJijNgxtLonhzhDP54wRl4Mfn/s/ZyzLbEQakswmqa2sX0mYQDTLG14iq5uEN6d0eRzUtDeg==} engines: {node: '>= 18'} requiresBuild: true dependencies: '@2060.io/ffi-napi': 4.0.8 '@2060.io/ref-napi': 3.0.6 - '@hyperledger/indy-vdr-shared': 0.2.0-dev.6 + '@hyperledger/indy-vdr-shared': 0.2.0 '@mapbox/node-pre-gyp': 1.0.11 ref-array-di: 1.2.2 ref-struct-di: 1.1.1 @@ -3639,8 +3710,8 @@ packages: - supports-color dev: false - /@hyperledger/indy-vdr-shared@0.2.0-dev.6: - resolution: {integrity: sha512-pNLq0zkqv5rFCpU9tzyJ5DPvED5YE+UFP8iKwVD7fe+mAD6/VpweOunYNKgIBT4K1DYI21q7bs3SzxQZ0hLlKw==} + /@hyperledger/indy-vdr-shared@0.2.0: + resolution: {integrity: sha512-/aPzpzb6Wks7poRSercSp6f3mFOBoQmxSIyo50XO6ci/Jfa4ZGuV8y8YWU2SJktsdz4TtL5YJxt2WVfOus9bEQ==} dev: false /@isaacs/cliui@8.0.2: @@ -3681,7 +3752,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -3702,14 +3773,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -3731,20 +3802,11 @@ packages: - ts-node dev: true - /@jest/create-cache-key-function@27.5.1: - resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - dev: true - /@jest/create-cache-key-function@29.7.0: resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - dev: false - optional: true /@jest/environment@29.7.0: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} @@ -3752,7 +3814,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 jest-mock: 29.7.0 /@jest/expect-utils@29.7.0: @@ -3778,7 +3840,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.5 + '@types/node': 20.11.19 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -3810,7 +3872,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.21 - '@types/node': 20.11.5 + '@types/node': 20.11.19 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -3896,23 +3958,12 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.5 + '@types/node': 20.11.19 '@types/yargs': 15.0.19 chalk: 4.1.2 dev: false optional: true - /@jest/types@27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.5 - '@types/yargs': 16.0.9 - chalk: 4.1.2 - dev: true - /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3920,7 +3971,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.5 + '@types/node': 20.11.19 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -3967,7 +4018,6 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - dev: true /@lukeed/csprng@1.1.0: resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} @@ -3991,6 +4041,10 @@ packages: - supports-color dev: false + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: false + /@mole-inc/bin-wrapper@8.0.1: resolution: {integrity: sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4009,26 +4063,24 @@ packages: resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} dev: false - /@nestjs/axios@3.0.1(@nestjs/common@10.3.0)(axios@1.6.5)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-VlOZhAGDmOoFdsmewn8AyClAdGpKXQQaY1+3PGB+g6ceurGIdTxZgRX3VXc1T6Zs60PedWjg3A82TDOB05mrzQ==} + /@nestjs/axios@3.0.2(@nestjs/common@10.3.3)(axios@1.6.7)(rxjs@7.8.1): + resolution: {integrity: sha512-Z6GuOUdNQjP7FX+OuV2Ybyamse+/e0BFdTWBX5JxpBDKA+YkdLynDgG6HTF04zy6e9zPa19UX0WA2VDoehwhXQ==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 axios: ^1.3.1 - reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - axios: 1.6.5 - reflect-metadata: 0.1.14 + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + axios: 1.6.7 rxjs: 7.8.1 dev: false - /@nestjs/cli@10.3.0: - resolution: {integrity: sha512-37h+wSDItY0NE/x3a/M9yb2cXzfsD4qoE26rHgFn592XXLelDN12wdnfn7dTIaiRZT7WOCdQ+BYP9mQikR4AsA==} + /@nestjs/cli@10.3.2: + resolution: {integrity: sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==} engines: {node: '>= 16.14'} hasBin: true peerDependencies: - '@swc/cli': ^0.1.62 + '@swc/cli': ^0.1.62 || ^0.3.0 '@swc/core': ^1.3.62 peerDependenciesMeta: '@swc/cli': @@ -4036,15 +4088,15 @@ packages: '@swc/core': optional: true dependencies: - '@angular-devkit/core': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics-cli': 17.0.9(chokidar@3.5.3) - '@nestjs/schematics': 10.1.0(chokidar@3.5.3)(typescript@5.3.3) + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics-cli': 17.1.2(chokidar@3.6.0) + '@nestjs/schematics': 10.1.1(chokidar@3.6.0)(typescript@5.3.3) chalk: 4.1.2 - chokidar: 3.5.3 + chokidar: 3.6.0 cli-table3: 0.6.3 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.89.0) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.90.1) glob: 10.3.10 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -4056,20 +4108,19 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.89.0 + webpack: 5.90.1 webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild - uglify-js - webpack-cli - dev: true - /@nestjs/cli@10.3.0(@swc/cli@0.1.63)(@swc/core@1.3.103): - resolution: {integrity: sha512-37h+wSDItY0NE/x3a/M9yb2cXzfsD4qoE26rHgFn592XXLelDN12wdnfn7dTIaiRZT7WOCdQ+BYP9mQikR4AsA==} + /@nestjs/cli@10.3.2(@swc/cli@0.3.9)(@swc/core@1.4.2): + resolution: {integrity: sha512-aWmD1GLluWrbuC4a1Iz/XBk5p74Uj6nIVZj6Ov03JbTfgtWqGFLtXuMetvzMiHxfrHehx/myt2iKAPRhKdZvTg==} engines: {node: '>= 16.14'} hasBin: true peerDependencies: - '@swc/cli': ^0.1.62 + '@swc/cli': ^0.1.62 || ^0.3.0 '@swc/core': ^1.3.62 peerDependenciesMeta: '@swc/cli': @@ -4077,17 +4128,17 @@ packages: '@swc/core': optional: true dependencies: - '@angular-devkit/core': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics-cli': 17.0.9(chokidar@3.5.3) - '@nestjs/schematics': 10.1.0(chokidar@3.5.3)(typescript@5.3.3) - '@swc/cli': 0.1.63(@swc/core@1.3.103) - '@swc/core': 1.3.103 + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics-cli': 17.1.2(chokidar@3.6.0) + '@nestjs/schematics': 10.1.1(chokidar@3.6.0)(typescript@5.3.3) + '@swc/cli': 0.3.9(@swc/core@1.4.2) + '@swc/core': 1.4.2 chalk: 4.1.2 - chokidar: 3.5.3 + chokidar: 3.6.0 cli-table3: 0.6.3 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.89.0) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.90.1) glob: 10.3.10 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -4099,7 +4150,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.89.0(@swc/core@1.3.103) + webpack: 5.90.1(@swc/core@1.4.2) webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -4107,12 +4158,12 @@ packages: - webpack-cli dev: true - /@nestjs/common@10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-DGv34UHsZBxCM3H5QGE2XE/+oLJzz5+714JQjBhjD9VccFlQs3LRxo/epso4l7nJIiNlZkPyIUC8WzfU/5RTsQ==} + /@nestjs/common@10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-LAkTe8/CF0uNWM0ecuDwUNTHCi1lVSITmmR4FQ6Ftz1E7ujQCnJ5pMRzd8JRN14vdBkxZZ8VbVF0BDUKoKNxMQ==} peerDependencies: class-transformer: '*' class-validator: '*' - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: class-transformer: @@ -4123,66 +4174,34 @@ packages: class-transformer: 0.5.1 class-validator: 0.14.1 iterare: 1.2.1 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 rxjs: 7.8.1 tslib: 2.6.2 uid: 2.0.2 - /@nestjs/config@3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14): - resolution: {integrity: sha512-qu5QlNiJdqQtOsnB6lx4JCXPQ96jkKUsOGd+JXfXwqJqZcOSAq6heNFg0opW4pq4J/VZoNwoo87TNnx9wthnqQ==} + /@nestjs/config@3.2.0(@nestjs/common@10.3.3)(rxjs@7.8.1): + resolution: {integrity: sha512-BpYRn57shg7CH35KGT6h+hT7ZucB6Qn2B3NBNdvhD4ApU8huS5pX/Wc2e/aO5trIha606Bz2a9t9/vbiuTBTww==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.13 + rxjs: ^7.1.0 dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - dotenv: 16.3.1 + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + dotenv: 16.4.1 dotenv-expand: 10.0.0 lodash: 4.17.21 - reflect-metadata: 0.1.14 - uuid: 9.0.0 - dev: false - - /@nestjs/core@10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-N06P5ncknW/Pm8bj964WvLIZn2gNhHliCBoAO1LeBvNImYkecqKcrmLbY49Fa1rmMfEM3MuBHeDys3edeuYAOA==} - requiresBuild: true - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - '@nestjs/websockets': ^10.0.0 - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - '@nestjs/websockets': - optional: true - dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/microservices': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/platform-express': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) - '@nuxtjs/opencollective': 0.3.2 - fast-safe-stringify: 2.1.1 - iterare: 1.2.1 - path-to-regexp: 3.2.0 - reflect-metadata: 0.1.14 rxjs: 7.8.1 - tslib: 2.6.2 - uid: 2.0.2 - transitivePeerDependencies: - - encoding + uuid: 9.0.1 + dev: false - /@nestjs/core@10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-N06P5ncknW/Pm8bj964WvLIZn2gNhHliCBoAO1LeBvNImYkecqKcrmLbY49Fa1rmMfEM3MuBHeDys3edeuYAOA==} + /@nestjs/core@10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-kxJWggQAPX3RuZx9JVec69eSLaYLNIox2emkZJpfBJ5Qq7cAq7edQIt1r4LGjTKq6kFubNTPsqhWf5y7yFRBPw==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/microservices': ^10.0.0 '@nestjs/platform-express': ^10.0.0 '@nestjs/websockets': ^10.0.0 - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: '@nestjs/microservices': @@ -4192,40 +4211,41 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/microservices': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/microservices': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/platform-express': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 path-to-regexp: 3.2.0 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 rxjs: 7.8.1 tslib: 2.6.2 uid: 2.0.2 transitivePeerDependencies: - encoding - /@nestjs/mapped-types@2.0.4(@nestjs/common@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14): - resolution: {integrity: sha512-xl+gUSp0B+ln1VSNoUftlglk8dfpUes3DHGxKZ5knuBxS5g2H/8p9/DSBOYWUfO5f4u9s6ffBPZ71WO+tbe5SA==} + /@nestjs/mapped-types@2.0.5(@nestjs/common@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1): + resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 class-transformer: ^0.4.0 || ^0.5.0 class-validator: ^0.13.0 || ^0.14.0 - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 peerDependenciesMeta: class-transformer: optional: true class-validator: optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.1 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 dev: false - /@nestjs/microservices@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-CZj27dEN4Rh6t9cRXv5EEg+HwkOUk02DDdS7x4eLcphnP4wgsLNDEo8vQ2gbQHFGpZhLUyeeynjNGkpV9T3+og==} + /@nestjs/microservices@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-Aa1z9RKuk/lNZfSYqLFWdKwUo/qDkICgCpZUlWooe5Ow1ocsZVREwsvxM8td0QN5uilmhgwKniY9m05cJ9tvdg==} peerDependencies: '@grpc/grpc-js': '*' '@nestjs/common': ^10.0.0 @@ -4238,7 +4258,7 @@ packages: kafkajs: '*' mqtt: '*' nats: '*' - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: '@grpc/grpc-js': @@ -4260,65 +4280,22 @@ packages: nats: optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) iterare: 1.2.1 nats: 2.19.0 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 rxjs: 7.8.1 tslib: 2.6.2 - /@nestjs/microservices@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-CZj27dEN4Rh6t9cRXv5EEg+HwkOUk02DDdS7x4eLcphnP4wgsLNDEo8vQ2gbQHFGpZhLUyeeynjNGkpV9T3+og==} + /@nestjs/platform-express@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3): + resolution: {integrity: sha512-GGKSEU48Os7nYFIsUM0nutuFUGn5AbeP8gzFBiBCAtiuJWrXZXpZ58pMBYxAbMf7IrcOZFInHEukjHGAQU0OZw==} peerDependencies: - '@grpc/grpc-js': '*' '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 - '@nestjs/websockets': ^10.0.0 - amqp-connection-manager: '*' - amqplib: '*' - cache-manager: '*' - ioredis: '*' - kafkajs: '*' - mqtt: '*' - nats: '*' - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@grpc/grpc-js': - optional: true - '@nestjs/websockets': - optional: true - amqp-connection-manager: - optional: true - amqplib: - optional: true - cache-manager: - optional: true - ioredis: - optional: true - kafkajs: - optional: true - mqtt: - optional: true - nats: - optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - iterare: 1.2.1 - reflect-metadata: 0.1.14 - rxjs: 7.8.1 - tslib: 2.6.2 - - /@nestjs/platform-express@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0): - resolution: {integrity: sha512-E4hUW48bYv8OHbP9XQg6deefmXb0pDSSuE38SdhA0mJ37zGY7C5EqqBUdlQk4ttfD+OdnbIgJ1zOokT6dd2d7A==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) body-parser: 1.20.2 cors: 2.8.5 express: 4.18.2 @@ -4327,44 +4304,41 @@ packages: transitivePeerDependencies: - supports-color - /@nestjs/schedule@4.0.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14): - resolution: {integrity: sha512-zz4h54m/F/1qyQKvMJCRphmuwGqJltDAkFxUXCVqJBXEs5kbPt93Pza3heCQOcMH22MZNhGlc9DmDMLXVHmgVQ==} + /@nestjs/schedule@4.0.1(@nestjs/common@10.3.3)(@nestjs/core@10.3.3): + resolution: {integrity: sha512-cz2FNjsuoma+aGsG0cMmG6Dqg/BezbBWet1UTHtAuu6d2mXNTVcmoEQM2DIVG5Lfwb2hfSE2yZt8Moww+7y+mA==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.12 dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - cron: 3.1.3 - reflect-metadata: 0.1.14 + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + cron: 3.1.6 uuid: 9.0.1 dev: false - /@nestjs/schematics@10.1.0(chokidar@3.5.3)(typescript@5.3.3): - resolution: {integrity: sha512-HQWvD3F7O0Sv3qHS2jineWxPLmBTLlyjT6VdSw2EAIXulitmV+ErxB3TCVQQORlNkl5p5cwRYWyBaOblDbNFIQ==} + /@nestjs/schematics@10.1.1(chokidar@3.6.0)(typescript@5.3.3): + resolution: {integrity: sha512-o4lfCnEeIkfJhGBbLZxTuVWcGuqDCFwg5OrvpgRUBM7vI/vONvKKiB5riVNpO+JqXoH0I42NNeDb0m4V5RREig==} peerDependencies: typescript: '>=4.8.2' dependencies: - '@angular-devkit/core': 17.0.9(chokidar@3.5.3) - '@angular-devkit/schematics': 17.0.9(chokidar@3.5.3) + '@angular-devkit/core': 17.1.2(chokidar@3.6.0) + '@angular-devkit/schematics': 17.1.2(chokidar@3.6.0) comment-json: 4.2.3 - jsonc-parser: 3.2.0 + jsonc-parser: 3.2.1 pluralize: 8.0.0 typescript: 5.3.3 transitivePeerDependencies: - chokidar - dev: true - /@nestjs/swagger@7.2.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14): - resolution: {integrity: sha512-W7WPq561/79w27ZEgViXS7c5hqPwT7QXhsLsSeu2jeBROUhMM825QKDFKbMmtb643IW5dznJ4PjherlZZgtMvg==} + /@nestjs/swagger@7.3.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1): + resolution: {integrity: sha512-zLkfKZ+ioYsIZ3dfv7Bj8YHnZMNAGWFUmx2ZDuLp/fBE4P8BSjB7hldzDueFXsmwaPL90v7lgyd82P+s7KME1Q==} peerDependencies: - '@fastify/static': ^6.0.0 + '@fastify/static': ^6.0.0 || ^7.0.0 '@nestjs/common': ^9.0.0 || ^10.0.0 '@nestjs/core': ^9.0.0 || ^10.0.0 class-transformer: '*' class-validator: '*' - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 peerDependenciesMeta: '@fastify/static': optional: true @@ -4373,20 +4347,21 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.4(@nestjs/common@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + '@microsoft/tsdoc': 0.14.2 + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.3.3)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1) class-transformer: 0.5.1 class-validator: 0.14.1 js-yaml: 4.1.0 lodash: 4.17.21 path-to-regexp: 3.2.0 - reflect-metadata: 0.1.14 - swagger-ui-dist: 5.11.0 + reflect-metadata: 0.2.1 + swagger-ui-dist: 5.11.2 dev: false - /@nestjs/terminus@10.2.0(@nestjs/axios@3.0.1)(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1): - resolution: {integrity: sha512-zPs98xvJ4ogEimRQOz8eU90mb7z+W/kd/mL4peOgrJ/VqER+ibN2Cboj65uJZW3XuNhpOqaeYOJte86InJd44A==} + /@nestjs/terminus@10.2.3(@nestjs/axios@3.0.2)(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-iX7gXtAooePcyQqFt57aDke5MzgdkBeYgF5YsFNNFwOiAFdIQEhfv3PR0G+HlH9F6D7nBCDZt9U87Pks/qHijg==} peerDependencies: '@grpc/grpc-js': '*' '@grpc/proto-loader': '*' @@ -4401,7 +4376,7 @@ packages: '@nestjs/typeorm': ^9.0.0 || ^10.0.0 '@prisma/client': '*' mongoose: '*' - reflect-metadata: 0.1.x + reflect-metadata: 0.1.x || 0.2.x rxjs: 7.x sequelize: '*' typeorm: '*' @@ -4433,37 +4408,18 @@ packages: typeorm: optional: true dependencies: - '@nestjs/axios': 3.0.1(@nestjs/common@10.3.0)(axios@1.6.5)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/microservices': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/axios': 3.0.2(@nestjs/common@10.3.3)(axios@1.6.7)(rxjs@7.8.1) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/microservices': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) boxen: 5.1.2 check-disk-space: 3.4.0 - reflect-metadata: 0.1.14 + reflect-metadata: 0.2.1 rxjs: 7.8.1 dev: false - /@nestjs/testing@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0): - resolution: {integrity: sha512-8DM+bw1qASCvaEnoHUQhypCOf54+G5R21MeFBMvnSk5DtKaWVZuzDP2GjLeYCpTH19WeP6LrrjHv3rX2LKU02A==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/microservices': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - tslib: 2.6.2 - dev: true - - /@nestjs/testing@10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0): - resolution: {integrity: sha512-8DM+bw1qASCvaEnoHUQhypCOf54+G5R21MeFBMvnSk5DtKaWVZuzDP2GjLeYCpTH19WeP6LrrjHv3rX2LKU02A==} + /@nestjs/testing@10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3): + resolution: {integrity: sha512-kX20GfjAImL5grd/i69uD/x7sc00BaqGcP2dRG3ilqshQUuy5DOmspLCr3a2C8xmVU7kzK4spT0oTxhe6WcCAA==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -4475,10 +4431,10 @@ packages: '@nestjs/platform-express': optional: true dependencies: - '@nestjs/common': 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/core': 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/microservices': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/platform-express': 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/microservices': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(nats@2.19.0)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/platform-express': 10.3.3(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) tslib: 2.6.2 dev: true @@ -4504,7 +4460,7 @@ packages: resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.4 + semver: 7.6.0 dev: false optional: true @@ -4585,7 +4541,7 @@ packages: cosmiconfig: 5.2.1 deepmerge: 4.3.1 glob: 7.2.3 - joi: 17.11.1 + joi: 17.12.1 transitivePeerDependencies: - encoding dev: false @@ -4616,7 +4572,7 @@ packages: ip: 1.1.8 node-stream-zip: 1.15.0 ora: 5.4.1 - semver: 7.5.4 + semver: 7.6.0 strip-ansi: 5.2.0 wcwidth: 1.0.1 yaml: 2.3.4 @@ -4701,7 +4657,7 @@ packages: node-fetch: 2.7.0 open: 6.4.0 ora: 5.4.1 - semver: 7.5.4 + semver: 7.6.0 shell-quote: 1.8.1 sudo-prompt: 9.2.1 transitivePeerDependencies: @@ -4712,7 +4668,7 @@ packages: /@react-native-community/cli-types@12.3.0: resolution: {integrity: sha512-MgOkmrXH4zsGxhte4YqKL7d+N8ZNEd3w1wo56MZlhu5WabwCJh87wYpU5T8vyfujFLYOFuFK5jjlcbs8F4/WDw==} dependencies: - joi: 17.11.1 + joi: 17.12.1 dev: false optional: true @@ -4738,7 +4694,7 @@ packages: fs-extra: 8.1.0 graceful-fs: 4.2.11 prompts: 2.4.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bufferutil - encoding @@ -4943,7 +4899,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-android-arm64@4.9.6: @@ -4951,7 +4907,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-darwin-arm64@4.9.6: @@ -4959,7 +4915,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-darwin-x64@4.9.6: @@ -4967,7 +4923,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-linux-arm-gnueabihf@4.9.6: @@ -4975,7 +4931,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-linux-arm64-gnu@4.9.6: @@ -4983,7 +4939,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-linux-arm64-musl@4.9.6: @@ -4991,7 +4947,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-linux-riscv64-gnu@4.9.6: @@ -4999,7 +4955,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-linux-x64-gnu@4.9.6: @@ -5007,7 +4963,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-linux-x64-musl@4.9.6: @@ -5015,7 +4971,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-win32-arm64-msvc@4.9.6: @@ -5023,7 +4979,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-win32-ia32-msvc@4.9.6: @@ -5031,7 +4987,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@rollup/rollup-win32-x64-msvc@4.9.6: @@ -5039,23 +4995,23 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true - /@sd-jwt/core@0.2.0: - resolution: {integrity: sha512-KxsJm/NAvKkbqOXaIq7Pndn70++bm8QNzzBh1KOwhlRub7LVrqeEkie/wrI/sAH+S+5exG0HTbY95F86nHiq7Q==} + /@sd-jwt/core@0.2.1: + resolution: {integrity: sha512-8auyt3mfzgAK+IP9mNc3kSONdo5x2Y8ypNj5gHKP7N81nVeyI+DHethoPQv84JVcqYYcNwHwyrc2Z5k7rg2lFQ==} dependencies: - '@sd-jwt/decode': 0.2.0 - '@sd-jwt/present': 0.2.0 - '@sd-jwt/types': 0.2.0 - '@sd-jwt/utils': 0.2.0 + '@sd-jwt/decode': 0.2.1 + '@sd-jwt/present': 0.2.1 + '@sd-jwt/types': 0.2.1 + '@sd-jwt/utils': 0.2.1 dev: false - /@sd-jwt/decode@0.2.0: - resolution: {integrity: sha512-nmiZN3SQ4ApapEu+rS1h/YAkDIq3exgN7swSCsEkrxSEwnBSbXtISIY/sv+EmwnehF1rcKbivHfHNxOWYtlxvg==} + /@sd-jwt/decode@0.2.1: + resolution: {integrity: sha512-rs55WB3llrMObxN8jeMl06km/h0WivO9jSWNubO9JUIdlfrVhssU38xoXakvQeSDjAJkUUhfZcvmC2vNo1X6Wg==} dependencies: - '@sd-jwt/types': 0.2.0 - '@sd-jwt/utils': 0.2.0 + '@sd-jwt/types': 0.2.1 + '@sd-jwt/utils': 0.2.1 dev: false /@sd-jwt/present@0.2.0: @@ -5065,10 +5021,21 @@ packages: '@sd-jwt/utils': 0.2.0 dev: false + /@sd-jwt/present@0.2.1: + resolution: {integrity: sha512-yWIAR2C/q1jNUwzAeUlUcf3WCTEcSSGo9pltHW5AXptELjyaWGSmC5p6o9ucDXHvBnicfPONhe5OdUCSpiCntw==} + dependencies: + '@sd-jwt/types': 0.2.1 + '@sd-jwt/utils': 0.2.1 + dev: false + /@sd-jwt/types@0.2.0: resolution: {integrity: sha512-16WFRcL/maG0/JxN9UCSx07/vJ2SDbGscv9gDLmFLgJzhJcGPer41XfI6aDfVARYP430wHFixChfY/n7qC1L/Q==} dev: false + /@sd-jwt/types@0.2.1: + resolution: {integrity: sha512-nbNik/cq6UIMsN144FcgPZQzaqIsjEEj307j3ZSFORkQBR4Tsmcj54aswTuNh0Z0z/4aSbfw14vOKBZvRWyVLQ==} + dev: false + /@sd-jwt/utils@0.2.0: resolution: {integrity: sha512-oHCfRYVHCb5RNwdq3eHAt7P9d7TsEaSM1TTux+xl1I9PeQGLtZETnto9Gchtzn8FlTrMdVsLlcuAcK6Viwj1Qw==} dependencies: @@ -5076,6 +5043,13 @@ packages: buffer: 6.0.3 dev: false + /@sd-jwt/utils@0.2.1: + resolution: {integrity: sha512-9eRrge44dhE3fenawR/RZGxP5iuW9DtgdOVANu/JK5PEl80r0fDsMwm/gDjuv8OgLDCmQ6uSaVte1lYaTG71bQ==} + dependencies: + '@sd-jwt/types': 0.2.1 + buffer: 6.0.3 + dev: false + /@segment/loosely-validate-event@2.0.0: resolution: {integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==} dependencies: @@ -5084,8 +5058,8 @@ packages: dev: false optional: true - /@sideway/address@4.1.4: - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + /@sideway/address@4.1.5: + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} dependencies: '@hapi/hoek': 9.3.0 dev: false @@ -5121,19 +5095,19 @@ packages: engines: {node: '>= 8'} dev: false - /@sphereon/pex-models@2.1.5: - resolution: {integrity: sha512-7THexvdYUK/Dh8olBB46ErT9q/RnecnMdb5r2iwZ6be0Dt4vQLAUN7QU80H0HZBok4jRTb8ydt12x0raBSTHOg==} + /@sphereon/pex-models@2.2.0: + resolution: {integrity: sha512-dGDRdoxJj+P0TRqu0R8R0/IdIzrCya1MsnxIFbcmSW3rjPsbwXbV0EojEfxXGD5LhqsUJiuAffMtyE2dtVI/XQ==} dev: false - /@sphereon/pex@3.0.1: - resolution: {integrity: sha512-rj+GhFfV5JLyo7dTIA3htWlrT+f6tayF9JRAGxdsIYBfYictLi9BirQ++JRBXsiq7T5zMnfermz4RGi3cvt13Q==} + /@sphereon/pex@3.2.0: + resolution: {integrity: sha512-6qk4L7PaxFsHSVjG0w5SbffwuwI0sbnwyoaNBNku17u2WOThBcnH22sgCdNRRbzacXs0e4iAw7Cb1cd730LQaQ==} engines: {node: '>=18'} dependencies: '@astronautlabs/jsonpath': 1.1.2 - '@sd-jwt/decode': 0.2.0 + '@sd-jwt/decode': 0.2.1 '@sd-jwt/present': 0.2.0 '@sd-jwt/utils': 0.2.0 - '@sphereon/pex-models': 2.1.5 + '@sphereon/pex-models': 2.2.0 '@sphereon/ssi-types': 0.18.1 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) @@ -5145,7 +5119,7 @@ packages: /@sphereon/ssi-types@0.18.1: resolution: {integrity: sha512-uM0gb1woyc0R+p+qh8tVDi15ZWmpzo9BP0iBp/yRkJar7gAfgwox/yvtEToaH9jROKnDCwL3DDQCDeNucpMkwg==} dependencies: - '@sd-jwt/decode': 0.2.0 + '@sd-jwt/decode': 0.2.1 jwt-decode: 3.1.2 dev: false @@ -5198,9 +5172,9 @@ packages: resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} dev: false - /@swc/cli@0.1.63(@swc/core@1.3.103): - resolution: {integrity: sha512-EM9oxxHzmmsprYRbGqsS2M4M/Gr5Gkcl0ROYYIdlUyTkhOiX822EQiRCpPCwdutdnzH2GyaTN7wc6i0Y+CKd3A==} - engines: {node: '>= 12.13'} + /@swc/cli@0.3.9(@swc/core@1.4.2): + resolution: {integrity: sha512-e5grxGEyNT0fYZEFmhSrRYL1kFAZAXlv+WjfQ35J6J9Hl0EtrMVymAEbGabetg2Q/2FX6HiRcjgc9LrdUCBk4A==} + engines: {node: '>= 16.14.0'} hasBin: true peerDependencies: '@swc/core': ^1.2.66 @@ -5210,106 +5184,99 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.103 + '@swc/core': 1.4.2 + '@swc/counter': 0.1.3 commander: 7.2.0 fast-glob: 3.3.2 + minimatch: 9.0.3 + piscina: 4.3.2 semver: 7.5.4 slash: 3.0.0 source-map: 0.7.4 dev: true - /@swc/core-darwin-arm64@1.3.103: - resolution: {integrity: sha512-Dqqz48mvdm/3PHPPA6YeAEofkF9H5Krgqd/baPf0dXcarzng6U9Ilv2aCtDjq7dfI9jfkVCW5zuwq98PE2GEdw==} + /@swc/core-darwin-arm64@1.4.2: + resolution: {integrity: sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true - /@swc/core-darwin-x64@1.3.103: - resolution: {integrity: sha512-mhUVSCEAyFLqtrDtwr9qPbe891J8cKxq53CD873/ZsUnyasHMPyWXzTvy9qjmbYyfDIArm6fGqjF5YsDKwGGNg==} + /@swc/core-darwin-x64@1.4.2: + resolution: {integrity: sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.103: - resolution: {integrity: sha512-rYLmwxr01ZHOI6AzooqwB0DOkMm0oU8Jznk6uutV1lHgcwyxsNiC1Css8yf77Xr/sYTvKvuTfBjThqa5H716pA==} + /@swc/core-linux-arm-gnueabihf@1.4.2: + resolution: {integrity: sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.103: - resolution: {integrity: sha512-w+5XFpUqxiAGUBiyRyYR28Ghddp5uVyo+dHAkCnY1u3V6RsZkY3vRwmoXT7/HxVGV7csodJ1P9Cp9VaRnNvTKA==} + /@swc/core-linux-arm64-gnu@1.4.2: + resolution: {integrity: sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.103: - resolution: {integrity: sha512-lS5p8ewAIar7adX6t0OrkICTcw92PXrn3ZmYyG5hvfjUg4RPQFjMfFMDQSne32ZJhGXHBf0LVm1R8wHwkcpwgA==} + /@swc/core-linux-arm64-musl@1.4.2: + resolution: {integrity: sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.103: - resolution: {integrity: sha512-Lf2cHDoEPNB6TwexHBEZCsAO2C7beb0YljhtQS+QfjWLLVqCiwt5LRCPuKN2Bav7el9KZXOI5baXedUeFj0oFg==} + /@swc/core-linux-x64-gnu@1.4.2: + resolution: {integrity: sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true - /@swc/core-linux-x64-musl@1.3.103: - resolution: {integrity: sha512-HR1Y9iiLEO3F49P47vjbHczBza9RbdXWRWC8NpcOcGJ4Wnw0c2DLWAh416fGH3VYCF/19EuglLEXhvSj0NXGuA==} + /@swc/core-linux-x64-musl@1.4.2: + resolution: {integrity: sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.103: - resolution: {integrity: sha512-3/GfROD1GPyf2hi6R0l4iZ5nrrKG8IU29hYhZCb7r0ZqhL/58kktVPlkib8X/EAJI8xbhM/NMl76h8ElrnyH5w==} + /@swc/core-win32-arm64-msvc@1.4.2: + resolution: {integrity: sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.103: - resolution: {integrity: sha512-9ejEFjfgPi0ibNmtuiRbYq9p4RRV6oH1DN9XjkYM8zh2qHlpZHKQZ3n4eHS0VtJO4rEGZxL8ebcnTNs62wqJig==} + /@swc/core-win32-ia32-msvc@1.4.2: + resolution: {integrity: sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.103: - resolution: {integrity: sha512-/1RvaOmZolXurWAUdnELYynVlFUiT0hj3PyTPoo+YK6+KV7er4EqUalRsoUf3zzGepQuhKFZFDpQn6Xi9kJX1A==} + /@swc/core-win32-x64-msvc@1.4.2: + resolution: {integrity: sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true - /@swc/core@1.3.103: - resolution: {integrity: sha512-PYtt8KzRXIFDwxeD7BA9ylmXNQ4hRVcmDVuAmL3yvL9rgx7Tn3qn6T37wiMVZnP1OjqGyhuHRPNycd+ssr+byw==} + /@swc/core@1.4.2: + resolution: {integrity: sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -5321,36 +5288,38 @@ packages: '@swc/counter': 0.1.2 '@swc/types': 0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.103 - '@swc/core-darwin-x64': 1.3.103 - '@swc/core-linux-arm-gnueabihf': 1.3.103 - '@swc/core-linux-arm64-gnu': 1.3.103 - '@swc/core-linux-arm64-musl': 1.3.103 - '@swc/core-linux-x64-gnu': 1.3.103 - '@swc/core-linux-x64-musl': 1.3.103 - '@swc/core-win32-arm64-msvc': 1.3.103 - '@swc/core-win32-ia32-msvc': 1.3.103 - '@swc/core-win32-x64-msvc': 1.3.103 - dev: true + '@swc/core-darwin-arm64': 1.4.2 + '@swc/core-darwin-x64': 1.4.2 + '@swc/core-linux-arm-gnueabihf': 1.4.2 + '@swc/core-linux-arm64-gnu': 1.4.2 + '@swc/core-linux-arm64-musl': 1.4.2 + '@swc/core-linux-x64-gnu': 1.4.2 + '@swc/core-linux-x64-musl': 1.4.2 + '@swc/core-win32-arm64-msvc': 1.4.2 + '@swc/core-win32-ia32-msvc': 1.4.2 + '@swc/core-win32-x64-msvc': 1.4.2 /@swc/counter@0.1.2: resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: true - /@swc/jest@0.2.29(@swc/core@1.3.103): - resolution: {integrity: sha512-8reh5RvHBsSikDC3WGCd5ZTd2BXKkyOdK7QwynrCH58jk2cQFhhHhFBg/jvnWZehUQe/EoOImLENc9/DwbBFow==} + /@swc/jest@0.2.36(@swc/core@1.4.2): + resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} engines: {npm: '>= 7.0.0'} peerDependencies: '@swc/core': '*' dependencies: - '@jest/create-cache-key-function': 27.5.1 - '@swc/core': 1.3.103 + '@jest/create-cache-key-function': 29.7.0 + '@swc/core': 1.4.2 + '@swc/counter': 0.1.3 jsonc-parser: 3.2.0 dev: true /@swc/types@0.1.5: resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} - dev: true /@szmarczak/http-timer@4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -5412,48 +5381,59 @@ packages: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 20.11.5 + '@types/node': 20.11.19 /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.11.5 + '@types/node': 20.11.19 '@types/responselike': 1.0.3 dev: true /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 /@types/cookiejar@2.1.5: resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} dev: true + /@types/docker-modem@3.0.6: + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + dependencies: + '@types/node': 20.11.19 + '@types/ssh2': 1.11.19 + dev: true + + /@types/dockerode@3.3.23: + resolution: {integrity: sha512-Lz5J+NFgZS4cEVhquwjIGH4oQwlVn2h7LXD3boitujBnzOE5o7s9H8hchEjoDK2SlRsJTogdKnQeiJgPPKLIEw==} + dependencies: + '@types/docker-modem': 3.0.6 + '@types/node': 20.11.19 + dev: true + /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: '@types/eslint': 8.56.2 '@types/estree': 1.0.5 - dev: true /@types/eslint@8.56.2: resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - dev: true /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true /@types/express-serve-static-core@4.17.41: resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 '@types/qs': 6.9.11 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -5469,7 +5449,7 @@ packages: /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 dev: true /@types/http-cache-semantics@4.0.4: @@ -5479,6 +5459,13 @@ packages: /@types/http-errors@2.0.4: resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + /@types/inquirer@8.2.10: + resolution: {integrity: sha512-IdD5NmHyVjWM8SHWo/kPBgtzXatwPkfwzyP3fN1jF2g9BWt5WO+8hL2F4o2GKIYsU40PpqeevuUWvkS/roXJkA==} + dependencies: + '@types/through': 0.0.33 + rxjs: 7.8.1 + dev: false + /@types/istanbul-lib-coverage@2.0.6: resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -5492,8 +5479,8 @@ packages: dependencies: '@types/istanbul-lib-report': 3.0.3 - /@types/jest@29.5.11: - resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -5501,7 +5488,6 @@ packages: /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -5510,13 +5496,13 @@ packages: /@types/jsonwebtoken@9.0.5: resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 dev: true /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 dev: true /@types/luxon@3.3.8: @@ -5537,8 +5523,14 @@ packages: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true - /@types/node@20.11.5: - resolution: {integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==} + /@types/node@18.19.17: + resolution: {integrity: sha512-SzyGKgwPzuWp2SHhlpXKzCX0pIOfcI4V2eF37nNBJOhwlegQ83omtVQ1XxZpDE06V/d6AQvfQdPfnw0tRC//Ng==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/node@20.11.19: + resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} dependencies: undici-types: 5.26.5 @@ -5555,7 +5547,7 @@ packages: /@types/responselike@1.0.3: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 dev: true /@types/semver@7.5.6: @@ -5566,14 +5558,33 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 20.11.5 + '@types/node': 20.11.19 /@types/serve-static@1.15.5: resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 20.11.5 + '@types/node': 20.11.19 + + /@types/ssh2-streams@0.1.12: + resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} + dependencies: + '@types/node': 20.11.19 + dev: true + + /@types/ssh2@0.5.52: + resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} + dependencies: + '@types/node': 20.11.19 + '@types/ssh2-streams': 0.1.12 + dev: true + + /@types/ssh2@1.11.19: + resolution: {integrity: sha512-ydbQAqEcdNVy2t1w7dMh6eWMr+iOgtEkqM/3K9RMijMaok/ER7L8GW6PwsOypHCN++M+c8S/UR9SgMqNIFstbA==} + dependencies: + '@types/node': 18.19.17 + dev: true /@types/stack-utils@2.0.3: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -5583,15 +5594,22 @@ packages: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 20.11.5 + '@types/node': 20.11.19 dev: true - /@types/supertest@2.0.16: - resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} + /@types/supertest@6.0.2: + resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} dependencies: + '@types/methods': 1.1.4 '@types/superagent': 8.1.1 dev: true + /@types/through@0.0.33: + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + dependencies: + '@types/node': 20.11.19 + dev: false + /@types/triple-beam@1.3.5: resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} dev: false @@ -5602,7 +5620,7 @@ packages: /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 dev: false /@types/yargs-parser@21.0.3: @@ -5615,34 +5633,28 @@ packages: dev: false optional: true - /@types/yargs@16.0.9: - resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true - /@types/yargs@17.0.32: resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} dependencies: '@types/yargs-parser': 21.0.3 - /@typescript-eslint/eslint-plugin@6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==} + /@typescript-eslint/eslint-plugin@7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.19.0 - '@typescript-eslint/type-utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/parser': 7.0.2(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.0.2 + '@typescript-eslint/type-utils': 7.0.2(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 7.0.2(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.0.2 debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 @@ -5655,20 +5667,20 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.19.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==} + /@typescript-eslint/parser@7.0.2(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.19.0 - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/scope-manager': 7.0.2 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.0.2 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -5676,26 +5688,26 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@6.19.0: - resolution: {integrity: sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==} + /@typescript-eslint/scope-manager@7.0.2: + resolution: {integrity: sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/visitor-keys': 7.0.2 dev: true - /@typescript-eslint/type-utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==} + /@typescript-eslint/type-utils@7.0.2(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) + '@typescript-eslint/utils': 7.0.2(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -5704,13 +5716,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@6.19.0: - resolution: {integrity: sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==} + /@typescript-eslint/types@7.0.2: + resolution: {integrity: sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.19.0(typescript@5.3.3): - resolution: {integrity: sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==} + /@typescript-eslint/typescript-estree@7.0.2(typescript@5.3.3): + resolution: {integrity: sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -5718,8 +5730,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/visitor-keys': 7.0.2 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -5731,18 +5743,18 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==} + /@typescript-eslint/utils@7.0.2(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.19.0 - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.0.2 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -5750,11 +5762,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@6.19.0: - resolution: {integrity: sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==} + /@typescript-eslint/visitor-keys@7.0.2: + resolution: {integrity: sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.19.0 + '@typescript-eslint/types': 7.0.2 eslint-visitor-keys: 3.4.3 dev: true @@ -5808,19 +5820,15 @@ packages: dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true /@webassemblyjs/floating-point-hex-parser@1.11.6: resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true /@webassemblyjs/helper-api-error@1.11.6: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true /@webassemblyjs/helper-buffer@1.11.6: resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true /@webassemblyjs/helper-numbers@1.11.6: resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} @@ -5828,11 +5836,9 @@ packages: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/helper-wasm-bytecode@1.11.6: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true /@webassemblyjs/helper-wasm-section@1.11.6: resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} @@ -5841,23 +5847,19 @@ packages: '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 - dev: true /@webassemblyjs/ieee754@1.11.6: resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: '@xtuc/ieee754': 1.2.0 - dev: true /@webassemblyjs/leb128@1.11.6: resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/utf8@1.11.6: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true /@webassemblyjs/wasm-edit@1.11.6: resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} @@ -5870,7 +5872,6 @@ packages: '@webassemblyjs/wasm-opt': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 - dev: true /@webassemblyjs/wasm-gen@1.11.6: resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} @@ -5880,7 +5881,6 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true /@webassemblyjs/wasm-opt@1.11.6: resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} @@ -5889,7 +5889,6 @@ packages: '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - dev: true /@webassemblyjs/wasm-parser@1.11.6: resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} @@ -5900,14 +5899,12 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true /@webassemblyjs/wast-printer@1.11.6: resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - dev: true /@xmldom/xmldom@0.7.13: resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} @@ -5923,11 +5920,9 @@ packages: /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true /@zxing/text-encoding@0.9.0: resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} @@ -5967,7 +5962,6 @@ packages: acorn: ^8 dependencies: acorn: 8.11.3 - dev: true /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -6021,7 +6015,6 @@ packages: ajv: ^6.9.1 dependencies: ajv: 6.12.6 - dev: true /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -6030,7 +6023,6 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -6054,7 +6046,6 @@ packages: /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - dev: true /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} @@ -6145,6 +6136,51 @@ packages: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} dev: true + /archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + dev: true + + /archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + dev: true + + /archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + dependencies: + archiver-utils: 2.1.0 + async: 3.2.5 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + dev: true + /are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} @@ -6205,7 +6241,6 @@ packages: /array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} @@ -6266,6 +6301,12 @@ packages: resolution: {integrity: sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==} dev: false + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + /asn1js@3.0.5: resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} engines: {node: '>=12.0.0'} @@ -6294,6 +6335,10 @@ packages: dev: false optional: true + /async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + dev: true + /async-mutex@0.4.0: resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} dependencies: @@ -6302,7 +6347,6 @@ packages: /async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: false /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -6317,8 +6361,8 @@ packages: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - /axios@1.6.5: - resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} dependencies: follow-redirects: 1.15.5 form-data: 4.0.0 @@ -6327,6 +6371,10 @@ packages: - debug dev: false + /b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + dev: true + /b64-lite@1.4.0: resolution: {integrity: sha512-aHe97M7DXt+dkpa8fHlCcm1CnskAHrJqEfMI0KN7dwqlzml/aUe1AGt6lk51HzrSfVD67xOso84sOpr+0wIe2w==} dependencies: @@ -6505,6 +6553,37 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /bare-events@2.2.0: + resolution: {integrity: sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==} + requiresBuild: true + dev: true + optional: true + + /bare-fs@2.1.5: + resolution: {integrity: sha512-5t0nlecX+N2uJqdxe9d18A98cp2u9BETelbjKpiVgQqzzmVNFYWEAjQHqS+2Khgto1vcwhik9cXucaj5ve2WWA==} + requiresBuild: true + dependencies: + bare-events: 2.2.0 + bare-os: 2.2.0 + bare-path: 2.1.0 + streamx: 2.16.1 + dev: true + optional: true + + /bare-os@2.2.0: + resolution: {integrity: sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==} + requiresBuild: true + dev: true + optional: true + + /bare-path@2.1.0: + resolution: {integrity: sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==} + requiresBuild: true + dependencies: + bare-os: 2.2.0 + dev: true + optional: true + /base-64@0.1.0: resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} dev: false @@ -6531,6 +6610,12 @@ packages: engines: {node: '>=6.0.0'} dev: false + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + /better-opn@3.0.2: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} @@ -6576,7 +6661,6 @@ packages: /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - dev: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -6747,7 +6831,6 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: false /buffer-fill@1.0.0: resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} @@ -6770,6 +6853,13 @@ packages: ieee754: 1.2.1 dev: false + /buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dev: true + optional: true + /builtins@1.0.3: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} dev: false @@ -6781,6 +6871,11 @@ packages: dependencies: streamsearch: 1.1.0 + /byline@5.0.0: + resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} + engines: {node: '>=0.10.0'} + dev: true + /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -6794,7 +6889,7 @@ packages: /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dev: true + dev: false /cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} @@ -6873,7 +6968,6 @@ packages: /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - dev: true /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} @@ -6917,7 +7011,6 @@ packages: /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} @@ -6926,7 +7019,6 @@ packages: /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true /charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -6938,8 +7030,8 @@ packages: engines: {node: '>=16'} dev: false - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 @@ -6951,6 +7043,9 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: true /chownr@2.0.0: @@ -6963,7 +7058,7 @@ packages: engines: {node: '>=12.13.0'} hasBin: true dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -6975,12 +7070,11 @@ packages: /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - dev: true /chromium-edge-launcher@1.0.0: resolution: {integrity: sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -7057,7 +7151,6 @@ packages: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - dev: true /cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} @@ -7070,12 +7163,10 @@ packages: /cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - dev: true /cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - dev: true /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -7194,7 +7285,6 @@ packages: /commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - dev: true /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -7222,7 +7312,6 @@ packages: esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 - dev: true /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -7250,6 +7339,16 @@ packages: dev: false optional: true + /compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + dev: true + /compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -7372,7 +7471,7 @@ packages: object-assign: 4.1.1 vary: 1.1.2 - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.5)(cosmiconfig@8.3.6)(typescript@5.3.3): + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.19)(cosmiconfig@8.3.6)(typescript@5.3.3): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} peerDependencies: @@ -7380,7 +7479,7 @@ packages: cosmiconfig: '>=8.2' typescript: '>=4' dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.21.0 typescript: 5.3.3 @@ -7411,9 +7510,32 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 typescript: 5.3.3 + + /cpu-features@0.0.9: + resolution: {integrity: sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + buildcheck: 0.0.6 + nan: 2.18.0 + dev: true + optional: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: true + + /crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 dev: true - /create-jest@29.7.0(@types/node@20.11.5)(ts-node@10.9.2): + /create-jest@29.7.0(@types/node@20.11.19)(ts-node@10.9.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -7422,7 +7544,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -7440,8 +7562,8 @@ packages: resolution: {integrity: sha512-/mFKax6FK26KjgV2KW2D4YqKgoJ5DVJpNt87X2Jc9IxT2HBMy7nEIlc+n7pEi+YFFe721XqrvZPd+jbyyBjsvQ==} dev: false - /cron@3.1.3: - resolution: {integrity: sha512-KVxeKTKYj2eNzN4ElnT6nRSbjbfhyxR92O/Jdp6SH3pc05CDJws59jBrZWEMQlxevCiE6QUTrXy+Im3vC3oD3A==} + /cron@3.1.6: + resolution: {integrity: sha512-cvFiQCeVzsA+QPM6fhjBtlKGij7tLLISnTSvFxVdnFGLdz+ZdXN37kNe0i2gefmdD17XuZA6n2uPVwzl4FxW/w==} dependencies: '@types/luxon': 3.3.8 luxon: 3.4.4 @@ -7754,6 +7876,36 @@ packages: dependencies: path-type: 4.0.0 + /docker-compose@0.24.6: + resolution: {integrity: sha512-VidlUyNzXMaVsuM79sjSvwC4nfojkP2VneL+Zfs538M2XFnffZDhx6veqnz/evCNIYGyz5O+1fgL6+g0NLWTBA==} + engines: {node: '>= 6.0.0'} + dependencies: + yaml: 2.3.4 + dev: true + + /docker-modem@3.0.8: + resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} + engines: {node: '>= 8.0'} + dependencies: + debug: 4.3.4 + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.15.0 + transitivePeerDependencies: + - supports-color + dev: true + + /dockerode@3.3.5: + resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} + engines: {node: '>= 8.0'} + dependencies: + '@balena/dockerignore': 1.0.2 + docker-modem: 3.0.8 + tar-fs: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -7798,6 +7950,12 @@ packages: /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} + dev: true + + /dotenv@16.4.1: + resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} + engines: {node: '>=12'} + dev: false /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -7850,7 +8008,6 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true /env-editor@0.4.2: resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} @@ -7937,7 +8094,6 @@ packages: /es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - dev: true /es-set-tostringtag@2.0.2: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} @@ -8015,7 +8171,7 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - dev: true + dev: false /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -8039,7 +8195,6 @@ packages: /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - dev: true /escodegen@1.14.3: resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} @@ -8073,7 +8228,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.19.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.0.2)(eslint-plugin-import@2.29.1)(eslint@8.56.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -8083,8 +8238,8 @@ packages: debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.56.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) fast-glob: 3.3.2 get-tsconfig: 4.7.2 is-core-module: 2.13.1 @@ -8096,7 +8251,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -8117,16 +8272,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 7.0.2(eslint@8.56.0)(typescript@5.3.3) debug: 3.2.7 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.19.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.0.2)(eslint-plugin-import@2.29.1)(eslint@8.56.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -8136,7 +8291,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 7.0.2(eslint@8.56.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -8145,7 +8300,7 @@ packages: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -8161,7 +8316,7 @@ packages: - supports-color dev: true - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.4): + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5): resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -8177,7 +8332,7 @@ packages: dependencies: eslint: 8.56.0 eslint-config-prettier: 9.1.0(eslint@8.56.0) - prettier: 3.2.4 + prettier: 3.2.5 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 dev: true @@ -8194,7 +8349,6 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} @@ -8288,7 +8442,6 @@ packages: engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 - dev: true /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} @@ -8297,7 +8450,6 @@ packages: /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} @@ -8319,7 +8471,6 @@ packages: /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - dev: true /exec-async@2.2.0: resolution: {integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==} @@ -8619,7 +8770,6 @@ packages: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -8628,6 +8778,10 @@ packages: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: true + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -8640,7 +8794,6 @@ packages: /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -8730,7 +8883,6 @@ packages: engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - dev: true /figures@5.0.0: resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} @@ -8738,7 +8890,6 @@ packages: dependencies: escape-string-regexp: 5.0.0 is-unicode-supported: 1.3.0 - dev: true /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} @@ -8939,7 +9090,7 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.1.0 - /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.89.0): + /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.90.1): resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: @@ -8948,7 +9099,7 @@ packages: dependencies: '@babel/code-frame': 7.23.5 chalk: 4.1.2 - chokidar: 3.5.3 + chokidar: 3.6.0 cosmiconfig: 8.3.6(typescript@5.3.3) deepmerge: 4.3.1 fs-extra: 10.1.0 @@ -8959,8 +9110,7 @@ packages: semver: 7.5.4 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.89.0(@swc/core@1.3.103) - dev: true + webpack: 5.90.1(@swc/core@1.4.2) /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} @@ -9010,6 +9160,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -9017,7 +9171,6 @@ packages: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} @@ -9060,7 +9213,6 @@ packages: /fs-monkey@1.0.5: resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - dev: true /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -9134,6 +9286,11 @@ packages: dev: false optional: true + /get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + dev: true + /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} @@ -9219,7 +9376,6 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true /glob@10.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} @@ -9286,7 +9442,6 @@ packages: minimatch: 8.0.4 minipass: 4.2.8 path-scurry: 1.10.1 - dev: true /global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} @@ -9388,7 +9543,6 @@ packages: /has-own-prop@2.0.0: resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} engines: {node: '>=8'} - dev: true /has-property-descriptors@1.0.1: resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} @@ -9419,6 +9573,11 @@ packages: dependencies: function-bind: 1.1.2 + /helmet@7.1.0: + resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} + engines: {node: '>=16.0.0'} + dev: false + /hermes-estree@0.15.0: resolution: {integrity: sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==} dev: false @@ -9520,9 +9679,9 @@ packages: engines: {node: '>=16.17.0'} dev: true - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} + /husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} hasBin: true dev: true @@ -9563,7 +9722,6 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} @@ -9618,10 +9776,9 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 - dev: true - /inquirer@9.2.11: - resolution: {integrity: sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==} + /inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} engines: {node: '>=14.18.0'} dependencies: '@ljharb/through': 2.3.11 @@ -9639,7 +9796,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: true /internal-ip@4.3.0: resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} @@ -9661,7 +9817,6 @@ packages: /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} - dev: true /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -9722,7 +9877,6 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - dev: true /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -9933,7 +10087,6 @@ packages: /is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} - dev: true /is-valid-path@0.1.1: resolution: {integrity: sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==} @@ -10090,7 +10243,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -10111,7 +10264,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.11.5)(ts-node@10.9.2): + /jest-cli@29.7.0(@types/node@20.11.19)(ts-node@10.9.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -10125,10 +10278,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -10139,7 +10292,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.11.5)(ts-node@10.9.2): + /jest-config@29.7.0(@types/node@20.11.19)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -10154,7 +10307,7 @@ packages: '@babel/core': 7.23.7 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 babel-jest: 29.7.0(@babel/core@7.23.7) chalk: 4.1.2 ci-info: 3.9.0 @@ -10174,7 +10327,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@20.11.5)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -10215,7 +10368,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -10229,7 +10382,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.11.5 + '@types/node': 20.11.19 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -10279,7 +10432,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -10333,7 +10486,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -10364,7 +10517,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -10416,7 +10569,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -10439,7 +10592,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.5 + '@types/node': 20.11.19 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -10451,21 +10604,20 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true /jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.7.0(@types/node@20.11.5)(ts-node@10.9.2): + /jest@29.7.0(@types/node@20.11.19)(ts-node@10.9.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -10478,7 +10630,7 @@ packages: '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -10496,12 +10648,12 @@ packages: hasBin: true dev: true - /joi@17.11.1: - resolution: {integrity: sha512-671acnrx+w96PCcQOzvm0VYQVwNL2PVgZmDRaFuSsx8sIUmGzYElPw5lU8F3Cr0jOuPs1oM56p7W2a1cdDOwcw==} + /joi@17.12.1: + resolution: {integrity: sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.4 + '@sideway/address': 4.1.5 '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 dev: false @@ -10590,7 +10742,6 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true /json-schema-deref-sync@0.13.0: resolution: {integrity: sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==} @@ -10609,7 +10760,6 @@ packages: /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -10643,7 +10793,9 @@ packages: /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -10759,6 +10911,13 @@ packages: engines: {node: '>=14.16'} dev: false + /lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + dependencies: + readable-stream: 2.3.8 + dev: true + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -10889,8 +11048,8 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /lint-staged@15.2.0: - resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} + /lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} engines: {node: '>=18.12.0'} hasBin: true dependencies: @@ -10899,7 +11058,7 @@ packages: debug: 4.3.4 execa: 8.0.1 lilconfig: 3.0.0 - listr2: 8.0.0 + listr2: 8.0.1 micromatch: 4.0.5 pidtree: 0.6.0 string-argv: 0.3.2 @@ -10908,8 +11067,8 @@ packages: - supports-color dev: true - /listr2@8.0.0: - resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} + /listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} engines: {node: '>=18.0.0'} dependencies: cli-truncate: 4.0.0 @@ -10923,7 +11082,6 @@ packages: /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - dev: true /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} @@ -10955,6 +11113,18 @@ packages: dev: false optional: true + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: true + + /lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + dev: true + + /lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + dev: true + /lodash.isfunction@3.0.9: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} dev: true @@ -10992,6 +11162,10 @@ packages: dev: false optional: true + /lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + dev: true + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true @@ -11100,7 +11274,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -11189,7 +11362,6 @@ packages: engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.5 - dev: true /memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} @@ -11579,15 +11751,12 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: false - optional: true /minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 - dev: true /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} @@ -11669,7 +11838,6 @@ packages: /minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} - dev: true /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} @@ -11688,6 +11856,10 @@ packages: yallist: 4.0.0 dev: false + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -11698,7 +11870,6 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - dev: false /mlly@1.5.0: resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} @@ -11736,12 +11907,10 @@ packages: /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true /mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true /mv@2.1.1: resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} @@ -11763,10 +11932,17 @@ packages: dev: false optional: true + /nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + requiresBuild: true + dev: true + optional: true + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: false /nats@2.19.0: resolution: {integrity: sha512-TuOAqPljCRpfHPo2o3midezchqYJUOOnK/YLmYf9rdoshzlYN1xvCd9dAKveVB6Bfubp/m63eN3l3ukfn43JOg==} @@ -11792,6 +11968,25 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + /nest-commander@3.12.5(@nestjs/common@10.3.3)(@nestjs/core@10.3.3)(@types/inquirer@8.2.10)(typescript@5.3.3): + resolution: {integrity: sha512-UDzUvCG59ma84/7uUUWGltXr7gGtG3smr7ILg+Guia5wFzQNhxNLtlqapzI3woFr5kuuWtVcLRL/4+diLefZrA==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@types/inquirer': ^8.1.3 + dependencies: + '@fig/complete-commander': 3.0.0(commander@11.1.0) + '@golevelup/nestjs-discovery': 4.0.0(@nestjs/common@10.3.3)(@nestjs/core@10.3.3) + '@nestjs/common': 10.3.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@nestjs/core': 10.3.3(@nestjs/common@10.3.3)(@nestjs/microservices@10.3.3)(@nestjs/platform-express@10.3.3)(reflect-metadata@0.2.1)(rxjs@7.8.1) + '@types/inquirer': 8.2.10 + commander: 11.1.0 + cosmiconfig: 8.3.6(typescript@5.3.3) + inquirer: 8.2.6 + transitivePeerDependencies: + - typescript + dev: false + /nested-error-stacks@2.0.1: resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} dev: false @@ -11801,6 +11996,16 @@ packages: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} dev: false + /nice-napi@1.0.2: + resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} + os: ['!win32'] + requiresBuild: true + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.8.0 + dev: true + optional: true + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: false @@ -11823,7 +12028,6 @@ packages: /node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} - dev: false /node-cache@5.1.2: resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} @@ -11849,7 +12053,6 @@ packages: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: lodash: 4.17.21 - dev: true /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -11890,7 +12093,6 @@ packages: /node-gyp-build@4.8.0: resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true - dev: false /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -12253,7 +12455,6 @@ packages: engines: {node: '>=6'} dependencies: callsites: 3.1.0 - dev: true /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} @@ -12272,7 +12473,6 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true /parse-png@2.1.0: resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} @@ -12348,7 +12548,6 @@ packages: /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true /peek-readable@5.0.0: resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} @@ -12365,7 +12564,6 @@ packages: /picomatch@3.0.1: resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} engines: {node: '>=10'} - dev: true /pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} @@ -12388,6 +12586,12 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + /piscina@4.3.2: + resolution: {integrity: sha512-aXPak3A1LgbfDFrsmgYhQS4J7ElHRFL7iUkUqaiLNDRE69YQSFGqIZiHaXOH4NyC6EdD+awZVeE7MG0zVm9L4Q==} + optionalDependencies: + nice-napi: 1.0.2 + dev: true + /pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} @@ -12432,7 +12636,6 @@ packages: /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - dev: true /pngjs@3.4.0: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} @@ -12447,6 +12650,7 @@ packages: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: false /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -12465,11 +12669,10 @@ packages: fast-diff: 1.3.0 dev: true - /prettier@3.2.4: - resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} engines: {node: '>=14'} hasBin: true - dev: true /pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} @@ -12545,6 +12748,21 @@ packages: dev: false optional: true + /proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: true + + /properties-reader@2.3.0: + resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} + engines: {node: '>=14'} + dependencies: + mkdirp: 1.0.4 + dev: true + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -12622,6 +12840,11 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + requiresBuild: true + dev: true + /queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} dependencies: @@ -12643,7 +12866,6 @@ packages: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 - dev: true /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} @@ -12851,12 +13073,17 @@ packages: readable-stream: 3.6.2 dev: true + /readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + dependencies: + minimatch: 5.1.6 + dev: true + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - dev: true /readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} @@ -12879,7 +13106,6 @@ packages: engines: {node: '>= 0.10'} dependencies: resolve: 1.22.8 - dev: true /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -12908,6 +13134,10 @@ packages: /reflect-metadata@0.1.14: resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + dev: false + + /reflect-metadata@0.2.1: + resolution: {integrity: sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==} /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} @@ -12976,7 +13206,6 @@ packages: /repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} - dev: true /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -13031,7 +13260,6 @@ packages: /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - dev: true /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} @@ -13098,6 +13326,11 @@ packages: signal-exit: 3.0.7 dev: true + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: true + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -13143,7 +13376,6 @@ packages: hasBin: true dependencies: glob: 9.3.5 - dev: true /rimraf@5.0.5: resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} @@ -13174,17 +13406,15 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.9.6 '@rollup/rollup-win32-x64-msvc': 4.9.6 fsevents: 2.3.3 - dev: true + dev: false /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - dev: true /run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} - dev: true /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -13251,7 +13481,6 @@ packages: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true /semver-regex@4.0.5: resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} @@ -13296,6 +13525,13 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -13341,7 +13577,6 @@ packages: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 - dev: true /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} @@ -13424,7 +13659,6 @@ packages: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 - dev: true /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} @@ -13511,6 +13745,7 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: false /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -13561,6 +13796,10 @@ packages: resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: true + /split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + dev: true + /split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} @@ -13587,6 +13826,25 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + /ssh-remote-port-forward@1.0.4: + resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} + dependencies: + '@types/ssh2': 0.5.52 + ssh2: 1.15.0 + dev: true + + /ssh2@1.15.0: + resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} + engines: {node: '>=10.16.0'} + requiresBuild: true + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.9 + nan: 2.18.0 + dev: true + /ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} @@ -13649,6 +13907,15 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + /streamx@2.16.1: + resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + optionalDependencies: + bare-events: 2.2.0 + dev: true + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -13761,7 +14028,6 @@ packages: /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: true /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} @@ -13910,14 +14176,13 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /swagger-ui-dist@5.11.0: - resolution: {integrity: sha512-j0PIATqQSEFGOLmiJOJZj1X1Jt6bFIur3JpY7+ghliUnfZs0fpWDdHEkn9q7QUlBtKbkn6TepvSxTqnE8l3s0A==} + /swagger-ui-dist@5.11.2: + resolution: {integrity: sha512-jQG0cRgJNMZ7aCoiFofnoojeSaa/+KgWaDlfgs8QN+BXoGMpxeMVY5OEnjq4OlNvF3yjftO8c9GRAgcHlO+u7A==} dev: false /symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} - dev: true /synckit@0.8.8: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} @@ -13930,6 +14195,43 @@ packages: /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + + /tar-fs@2.0.1: + resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-fs@3.0.5: + resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.1.5 + bare-path: 2.1.0 + dev: true + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.16.1 dev: true /tar@6.2.0: @@ -13995,7 +14297,7 @@ packages: dev: false optional: true - /terser-webpack-plugin@5.3.10(@swc/core@1.3.103)(webpack@5.89.0): + /terser-webpack-plugin@5.3.10(@swc/core@1.4.2)(webpack@5.90.1): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -14012,15 +14314,14 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.21 - '@swc/core': 1.3.103 + '@swc/core': 1.4.2 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.26.0 - webpack: 5.89.0(@swc/core@1.3.103) - dev: true + webpack: 5.90.1(@swc/core@1.4.2) - /terser-webpack-plugin@5.3.10(webpack@5.89.0): + /terser-webpack-plugin@5.3.10(webpack@5.90.1): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -14041,8 +14342,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.26.0 - webpack: 5.89.0 - dev: true + webpack: 5.90.1 /terser@5.26.0: resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} @@ -14063,6 +14363,29 @@ packages: minimatch: 3.1.2 dev: true + /testcontainers@10.7.1: + resolution: {integrity: sha512-JarbT6o7fv1siUts4tGv3wBoYrWKxjla69+5QWG9+bcd4l+ECJ3ikfGD/hpXRmRBsnjzeWyV+tL9oWOBRzk+lA==} + dependencies: + '@balena/dockerignore': 1.0.2 + '@types/dockerode': 3.3.23 + archiver: 5.3.2 + async-lock: 1.4.1 + byline: 5.0.0 + debug: 4.3.4 + docker-compose: 0.24.6 + dockerode: 3.3.5 + get-port: 5.1.1 + node-fetch: 2.7.0 + proper-lockfile: 4.1.2 + properties-reader: 2.3.0 + ssh-remote-port-forward: 1.0.4 + tar-fs: 3.0.5 + tmp: 0.2.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -14117,6 +14440,13 @@ packages: dependencies: os-tmpdir: 1.0.2 + /tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + dev: true + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -14154,7 +14484,6 @@ packages: /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - dev: true /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} @@ -14187,9 +14516,9 @@ packages: dev: false optional: true - /ts-jest@29.1.1(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.3.3): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /ts-jest@29.1.2(@babel/core@7.23.7)(jest@29.7.0)(typescript@5.3.3): + resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' @@ -14211,7 +14540,7 @@ packages: '@babel/core': 7.23.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) + jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -14221,7 +14550,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-node@10.9.2(@types/node@20.11.5)(typescript@5.3.3): + /ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -14240,7 +14569,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.5 + '@types/node': 20.11.19 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -14259,7 +14588,6 @@ packages: chalk: 4.1.2 enhanced-resolve: 5.15.0 tsconfig-paths: 4.2.0 - dev: true /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -14277,7 +14605,6 @@ packages: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -14293,6 +14620,10 @@ packages: tslib: 1.14.1 dev: false + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + /tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} @@ -14422,7 +14753,6 @@ packages: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true - dev: true /ua-parser-js@1.0.37: resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} @@ -14602,11 +14932,6 @@ packages: dev: false optional: true - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: false - /uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -14656,8 +14981,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vite-node@1.2.1(@types/node@20.11.5): - resolution: {integrity: sha512-fNzHmQUSOY+y30naohBvSW7pPn/xn3Ib/uqm+5wAJQJiqQsU0NBR78XdRJb04l4bOFKjpTWld0XAfkKlrDbySg==} + /vite-node@1.3.1(@types/node@20.11.19): + resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -14665,7 +14990,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.0.12(@types/node@20.11.5) + vite: 5.0.12(@types/node@20.11.19) transitivePeerDependencies: - '@types/node' - less @@ -14675,9 +15000,9 @@ packages: - sugarss - supports-color - terser - dev: true + dev: false - /vite@5.0.12(@types/node@20.11.5): + /vite@5.0.12(@types/node@20.11.19): resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -14705,13 +15030,13 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.5 + '@types/node': 20.11.19 esbuild: 0.19.12 postcss: 8.4.33 rollup: 4.9.6 optionalDependencies: fsevents: 2.3.3 - dev: true + dev: false /vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -14729,7 +15054,6 @@ packages: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -14778,15 +15102,13 @@ packages: /webpack-node-externals@3.0.0: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} engines: {node: '>=6'} - dev: true /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - dev: true - /webpack@5.89.0: - resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + /webpack@5.90.1: + resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -14816,17 +15138,16 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.89.0) + terser-webpack-plugin: 5.3.10(webpack@5.90.1) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - dev: true - /webpack@5.89.0(@swc/core@1.3.103): - resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + /webpack@5.90.1(@swc/core@1.4.2): + resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -14856,14 +15177,13 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.3.103)(webpack@5.89.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.4.2)(webpack@5.90.1) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - dev: true /whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -15187,3 +15507,12 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + + /zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 + dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 852bf6b8f908011e35fba18ae9027b4fcdfc3429..9600591d6eb87c70cdb6bb2c4a569020821ae431 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,3 @@ packages: - apps/* + - devtools diff --git a/scripts/create_tenant.mts b/scripts/create_tenant.mts deleted file mode 100644 index 8cb09566ccea33464e0f638638c0a85ce9b37e79..0000000000000000000000000000000000000000 --- a/scripts/create_tenant.mts +++ /dev/null @@ -1,58 +0,0 @@ -import type { EventTenantsCreateInput } from '../apps/shared/dist/index.js'; - -import { Logger, Module } from '@nestjs/common'; -import { NestFactory } from '@nestjs/core'; -import { - ClientsModule, - Transport, - type ClientProxy, -} from '@nestjs/microservices'; -import { randomBytes } from 'node:crypto'; -import { firstValueFrom } from 'rxjs'; - -import { EventTenantsCreate } from '../apps/shared/src/events/tenantEvents.js'; - -// These values are from the docker-compose.yml file -const NATS_URL = process.env.NATS_URL || 'nats://localhost:4222'; -const NATS_USER = process.env.NATS_USER || 'nats_user'; -const NATS_PASSWORD = - process.env.NATS_PASSWORD || 'Rw+dYIymAQm9H6ELLNwSuGo1812jqQ=='; - -@Module({ - imports: [ - ClientsModule.register([ - { - transport: Transport.NATS, - name: 'TENANTS_CLIENT_SERVICE', - options: { - url: NATS_URL, - user: NATS_USER, - pass: NATS_PASSWORD, - }, - }, - ]), - ], -}) -class Application {} - -void (async () => { - const app = await NestFactory.createApplicationContext(Application); - const client: ClientProxy = app.get('TENANTS_CLIENT_SERVICE'); - - await client.connect(); - - const tenantLabel = process.argv[2] || "tenant_" + randomBytes(4).toString('hex'); - const response$ = client.send<EventTenantsCreate, EventTenantsCreateInput>( - EventTenantsCreate.token, - { - label: tenantLabel, - }, - ); - - const response = await firstValueFrom(response$); - - Logger.log(`Tenant "${tenantLabel}" created with id: ${response.data.id}`); - // Logger.debug(response); - - await app.close(); -})(); diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index f55d3905995ee74160e7c284287e2c8f86a44551..973592ac761282256e44568e654beb4e7d283400 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,5 +1,5 @@ { "extends": "./tsconfig.json", - "include": ["apps", "./.eslintrc.js", "scripts"], + "include": ["apps", "./.eslintrc.js", "devtools"], "exclude": ["node_modules", "**/dist/**"] }