From 41f4a545637e3ab16cf8119c4950ea7fe5ab3eb6 Mon Sep 17 00:00:00 2001 From: Denis Badurina Date: Tue, 28 Mar 2023 15:38:06 +0200 Subject: [PATCH] GraphQL Yoga driver for NestJS GraphQL (#2525) --- .changeset/happy-months-kiss.md | 5 + .changeset/little-socks-drive.md | 20 + .github/workflows/ci.yml | 46 + .pnpmfile.cjs | 59 + .../package.json | 2 +- .../apollo-federation/service/package.json | 2 +- .../docker-compose.yaml | 12 + .../package.json | 40 + .../schema.graphql | 83 + .../scripts/bundle.js | 29 + .../src/app.module.ts | 28 + .../src/deprecated-products.resolver.ts | 65 + .../src/inventory.resolver.ts | 37 + .../src/main.ts | 11 + .../src/product-research.resolver.ts | 43 + .../src/products.resolver.ts | 105 + .../src/users.resolver.ts | 21 + .../tsconfig.json | 12 + packages/nestjs-federation/README.md | 62 + packages/nestjs-federation/package.json | 77 + packages/nestjs-federation/src/index.ts | 116 ++ packages/nestjs/CHANGELOG.md | 43 + packages/nestjs/README.md | 62 + .../__tests__/fixtures/graphql/app.module.ts | 23 + .../cats/cats-request-scoped.service.ts | 25 + .../fixtures/graphql/cats/cats.guard.ts | 10 + .../fixtures/graphql/cats/cats.module.ts | 22 + .../fixtures/graphql/cats/cats.resolvers.ts | 63 + .../fixtures/graphql/cats/cats.service.ts | 25 + .../fixtures/graphql/cats/cats.types.graphql | 21 + .../graphql/cats/interfaces/cat.interface.ts | 5 + .../nestjs/__tests__/graphql-http.spec.ts | 46 + packages/nestjs/__tests__/graphql-ws.spec.ts | 84 + packages/nestjs/__tests__/graphql.spec.ts | 50 + .../subscriptions-transport-ws.spec.ts | 88 + .../nestjs/__tests__/subscriptions.spec.ts | 49 + packages/nestjs/__tests__/utils/pubsub.ts | 82 + packages/nestjs/package.json | 87 + packages/nestjs/src/index.ts | 315 +++ pnpm-lock.yaml | 1838 ++++++++++++++++- .../integrations/integration-with-nestjs.mdx | 15 +- 41 files changed, 3789 insertions(+), 39 deletions(-) create mode 100644 .changeset/happy-months-kiss.md create mode 100644 .changeset/little-socks-drive.md create mode 100644 .pnpmfile.cjs create mode 100644 examples/nestjs-apollo-federation-compatibility/docker-compose.yaml create mode 100644 examples/nestjs-apollo-federation-compatibility/package.json create mode 100644 examples/nestjs-apollo-federation-compatibility/schema.graphql create mode 100644 examples/nestjs-apollo-federation-compatibility/scripts/bundle.js create mode 100644 examples/nestjs-apollo-federation-compatibility/src/app.module.ts create mode 100644 examples/nestjs-apollo-federation-compatibility/src/deprecated-products.resolver.ts create mode 100644 examples/nestjs-apollo-federation-compatibility/src/inventory.resolver.ts create mode 100644 examples/nestjs-apollo-federation-compatibility/src/main.ts create mode 100644 examples/nestjs-apollo-federation-compatibility/src/product-research.resolver.ts create mode 100644 examples/nestjs-apollo-federation-compatibility/src/products.resolver.ts create mode 100644 examples/nestjs-apollo-federation-compatibility/src/users.resolver.ts create mode 100644 examples/nestjs-apollo-federation-compatibility/tsconfig.json create mode 100644 packages/nestjs-federation/README.md create mode 100644 packages/nestjs-federation/package.json create mode 100644 packages/nestjs-federation/src/index.ts create mode 100644 packages/nestjs/CHANGELOG.md create mode 100644 packages/nestjs/README.md create mode 100644 packages/nestjs/__tests__/fixtures/graphql/app.module.ts create mode 100644 packages/nestjs/__tests__/fixtures/graphql/cats/cats-request-scoped.service.ts create mode 100644 packages/nestjs/__tests__/fixtures/graphql/cats/cats.guard.ts create mode 100644 packages/nestjs/__tests__/fixtures/graphql/cats/cats.module.ts create mode 100644 packages/nestjs/__tests__/fixtures/graphql/cats/cats.resolvers.ts create mode 100644 packages/nestjs/__tests__/fixtures/graphql/cats/cats.service.ts create mode 100644 packages/nestjs/__tests__/fixtures/graphql/cats/cats.types.graphql create mode 100644 packages/nestjs/__tests__/fixtures/graphql/cats/interfaces/cat.interface.ts create mode 100644 packages/nestjs/__tests__/graphql-http.spec.ts create mode 100644 packages/nestjs/__tests__/graphql-ws.spec.ts create mode 100644 packages/nestjs/__tests__/graphql.spec.ts create mode 100644 packages/nestjs/__tests__/subscriptions-transport-ws.spec.ts create mode 100644 packages/nestjs/__tests__/subscriptions.spec.ts create mode 100644 packages/nestjs/__tests__/utils/pubsub.ts create mode 100644 packages/nestjs/package.json create mode 100644 packages/nestjs/src/index.ts diff --git a/.changeset/happy-months-kiss.md b/.changeset/happy-months-kiss.md new file mode 100644 index 0000000000..cb29678379 --- /dev/null +++ b/.changeset/happy-months-kiss.md @@ -0,0 +1,5 @@ +--- +'@graphql-yoga/nestjs-federation': major +--- + +GraphQL Yoga driver with Apollo Federation for NestJS GraphQL diff --git a/.changeset/little-socks-drive.md b/.changeset/little-socks-drive.md new file mode 100644 index 0000000000..e6155d92e9 --- /dev/null +++ b/.changeset/little-socks-drive.md @@ -0,0 +1,20 @@ +--- +'@graphql-yoga/nestjs': major +--- + +GraphQL Yoga driver for NestJS GraphQL. + +### BREAKING CHANGES + +- No more `subscriptionWithFilter` in YogaBaseDriver. +- `YogaBaseDriver.yogaInstance` has been renamed to `YogaBaseDriver.yoga` +- `YogaBaseDriver` has been renamed to `AbstractYogaDriver` +- Drop `@envelop/apollo-server-errors`, if you want to use it - supply it to the plugins yourself +- `graphql` is now a peer dependency +- `graphql-yoga` is now a peer dependency +- `installSubscriptionHandlers` driver option has been dropped, please use the `subscriptions` + option +- Apollo Federation v2 support +- Apollo Federation driver has been moved to a separate package `@graphql-yoga/nestjs-federation` +- Dropped support for `@nestjs/graphql@v10`, now at least v11 is required (https://github.com/nestjs/graphql/pull/2435) +- Minimum Node.js engine is v14 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 171d54cb6e..3baf7ad5a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -254,3 +254,49 @@ jobs: failOnWarning: true failOnRequired: true debug: true + + nestjs-apollo-federation-compatibility: + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v3 + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Install pnpm + uses: pnpm/action-setup@v2.2.4 + with: + version: 7 + - name: Get pnpm store path + id: pnpm-store + run: echo "PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + - name: Cache pnpm + uses: actions/cache@v3 + with: + path: ${{ steps.pnpm-store.outputs.PATH }} + key: ${{ runner.os }}-pnpm-store-graphql-v${{ matrix.graphql-version }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store-graphql-v${{ matrix.graphql-version }}- + - name: Install Dependencies + run: pnpm i + - name: Build Packages + run: pnpm build + - name: Bundle NestJS Apollo Federation Subgraph Example + run: pnpm --filter=example-nestjs-apollo-federation-compatibility build + - name: Install Rover + run: curl -sSL https://rover.apollo.dev/nix/v0.11.1 | sh + - name: Add Rover to PATH + run: echo "$HOME/.rover/bin" >> $GITHUB_PATH + - name: Apollo Federation Subgraph Compatibility + uses: apollographql/federation-subgraph-compatibility@v1 + with: + workingDirectory: examples/nestjs-apollo-federation-compatibility + compose: docker-compose.yaml + schema: schema.graphql + path: /graphql + # no token = no comment + # token: ${{ secrets.GITHUB_TOKEN }} + failOnWarning: true + failOnRequired: true + debug: true diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs new file mode 100644 index 0000000000..5ac0edc90a --- /dev/null +++ b/.pnpmfile.cjs @@ -0,0 +1,59 @@ +// WARNING: please make sure the versions are the same across all workspaces +const singletons = [ + '@nestjs/core', + '@nestjs/common', + '@nestjs/graphql', + '@apollo/subgraph', + '@apollo/federation-subgraph-compatibility', +] + +function afterAllResolved(lockfile, context) { + context.log('Enforcing single version for: ' + singletons.join(', ')) + + // find and choose one version for the singletons + const singletonsMap = {} + const danglingSingletons = [] + for (const pkg of Object.keys(lockfile.packages)) { + const singlePkg = singletons.find((singlePkg) => + pkg.startsWith(`/${singlePkg}/`), + ) + if (!singlePkg) { + continue + } + if (singlePkg in singletonsMap) { + danglingSingletons.push(pkg) + continue + } + singletonsMap[singlePkg] = pkg.replace(`/${singlePkg}/`, '') + } + + // remove dangling singletons from lockfile + for (const dangling of danglingSingletons) { + delete lockfile.packages[dangling] + } + + // apply singleton versions + ;[lockfile.packages, lockfile.importers].forEach((list) => { + for (const info of Object.values(list)) { + const deps = info.dependencies + const devDeps = info.devDependencies + + for (const [pkg, ver] of Object.entries(singletonsMap)) { + if (pkg in (deps || {})) { + deps[pkg] = ver + } + if (pkg in (devDeps || {})) { + devDeps[pkg] = ver + } + } + } + }) + + return lockfile +} + +module.exports = { + hooks: { + afterAllResolved, + }, +} diff --git a/examples/apollo-federation-compatibility/package.json b/examples/apollo-federation-compatibility/package.json index f4dd8e1565..48755c847c 100644 --- a/examples/apollo-federation-compatibility/package.json +++ b/examples/apollo-federation-compatibility/package.json @@ -14,7 +14,7 @@ "author": "Charly POLY", "license": "ISC", "dependencies": { - "@apollo/subgraph": "2.4.0", + "@apollo/subgraph": "^2.4.0", "@graphql-yoga/plugin-apollo-inline-trace": "1.7.3", "graphql": "16.6.0", "graphql-tag": "2.12.6", diff --git a/examples/apollo-federation/service/package.json b/examples/apollo-federation/service/package.json index 93a5b21da4..e436b87add 100644 --- a/examples/apollo-federation/service/package.json +++ b/examples/apollo-federation/service/package.json @@ -7,7 +7,7 @@ "check": "exit 0" }, "dependencies": { - "@apollo/subgraph": "2.4.0", + "@apollo/subgraph": "^2.4.0", "graphql-yoga": "3.7.3", "graphql": "16.6.0" } diff --git a/examples/nestjs-apollo-federation-compatibility/docker-compose.yaml b/examples/nestjs-apollo-federation-compatibility/docker-compose.yaml new file mode 100644 index 0000000000..2d8e4b67bf --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/docker-compose.yaml @@ -0,0 +1,12 @@ +services: + products: + image: 'node:19' + user: 'node' + working_dir: /web + environment: + - NODE_ENV=production + volumes: + - ./dist:/web + command: 'node index.js' + ports: + - 4001:4001 diff --git a/examples/nestjs-apollo-federation-compatibility/package.json b/examples/nestjs-apollo-federation-compatibility/package.json new file mode 100644 index 0000000000..cf655215b2 --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/package.json @@ -0,0 +1,40 @@ +{ + "name": "example-nestjs-apollo-federation-compatibility", + "version": "1.0.0", + "description": "Apollo Federation implemented with GraphQL Yoga running as a Nest.js driver.", + "private": true, + "scripts": { + "build": "nest build && node scripts/bundle.js", + "prebuild": "rimraf dist", + "start": "nest start", + "test": "fedtest docker --compose ./docker-compose.yaml --schema ./schema.graphql --path /graphql --port 4001 --debug --format markdown" + }, + "devDependencies": { + "@apollo/federation-subgraph-compatibility": "1.2.1", + "@apollo/rover": "^0.13.0", + "@graphql-yoga/nestjs-federation": "0.0.0", + "@grpc/proto-loader": "^0.7.5", + "@nestjs/cli": "^9.3.0", + "@nestjs/common": "^9.3.12", + "@nestjs/core": "^9.3.12", + "@nestjs/graphql": "^11.0.4", + "@nestjs/microservices": "^9.3.12", + "@nestjs/platform-socket.io": "^9.3.12", + "@nestjs/websockets": "^9.3.12", + "amqp-connection-manager": "^4.1.11", + "amqplib": "^0.10.3", + "cache-manager": "^5.2.0", + "class-transformer": "0.3.1", + "class-validator": "^0.14.0", + "esbuild": "0.17.12", + "graphql": "^16.6.0", + "kafkajs": "^2.2.4", + "mqtt": "^4.3.7", + "nats": "^2.13.1", + "reflect-metadata": "^0.1.13", + "rimraf": "^4.1.2", + "rxjs": "^7.8.0", + "ts-morph": "^17.0.1", + "typescript": "^4.9.5" + } +} diff --git a/examples/nestjs-apollo-federation-compatibility/schema.graphql b/examples/nestjs-apollo-federation-compatibility/schema.graphql new file mode 100644 index 0000000000..58457552e7 --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/schema.graphql @@ -0,0 +1,83 @@ +extend schema + @link( + url: "https://specs.apollo.dev/federation/v2.3" + import: [ + "@composeDirective" + "@extends" + "@external" + "@key" + "@inaccessible" + "@interfaceObject" + "@override" + "@provides" + "@requires" + "@shareable" + "@tag" + ] + ) + @link(url: "https://myspecs.dev/myCustomDirective/v1.0", import: ["@custom"]) + @composeDirective(name: "@custom") + +directive @custom on OBJECT + +type Product + @custom + @key(fields: "id") + @key(fields: "sku package") + @key(fields: "sku variation { id }") { + id: ID! + sku: String + package: String + variation: ProductVariation + dimensions: ProductDimension + createdBy: User @provides(fields: "totalProductsCreated") + notes: String @tag(name: "internal") + research: [ProductResearch!]! +} + +type DeprecatedProduct @key(fields: "sku package") { + sku: String! + package: String! + reason: String + createdBy: User +} + +type ProductVariation { + id: ID! +} + +type ProductResearch @key(fields: "study { caseNumber }") { + study: CaseStudy! + outcome: String +} + +type CaseStudy { + caseNumber: ID! + description: String +} + +type ProductDimension @shareable { + size: String + weight: Float + unit: String @inaccessible +} + +extend type Query { + product(id: ID!): Product + deprecatedProduct(sku: String!, package: String!): DeprecatedProduct + @deprecated(reason: "Use product query instead") +} + +extend type User @key(fields: "email") { + averageProductsCreatedPerYear: Int + @requires(fields: "totalProductsCreated yearsOfEmployment") + email: ID! @external + name: String @override(from: "users") + totalProductsCreated: Int @external + yearsOfEmployment: Int! @external +} + +type Inventory @interfaceObject @key(fields: "id") { + id: ID! + deprecatedProducts: [DeprecatedProduct!]! +} diff --git a/examples/nestjs-apollo-federation-compatibility/scripts/bundle.js b/examples/nestjs-apollo-federation-compatibility/scripts/bundle.js new file mode 100644 index 0000000000..e8759c8da9 --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/scripts/bundle.js @@ -0,0 +1,29 @@ +/* eslint-disable */ +const { build } = require('esbuild') +const { copyFileSync } = require('fs') +const { join } = require('path') + +async function main() { + await build({ + entryPoints: ['./dist/main.js'], + outfile: 'dist/index.js', + format: 'cjs', + minify: false, + bundle: true, + platform: 'node', + target: 'es2020', + loader: { '.node': 'file' }, + }) + + console.info(`NestJS Apollo Subgraph test build done!`) + + copyFileSync( + join(__dirname, '../schema.graphql'), + join(__dirname, '../dist/schema.graphql'), + ) +} + +main().catch((e) => { + console.error(e) + process.exit(1) +}) diff --git a/examples/nestjs-apollo-federation-compatibility/src/app.module.ts b/examples/nestjs-apollo-federation-compatibility/src/app.module.ts new file mode 100644 index 0000000000..e24895529b --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/src/app.module.ts @@ -0,0 +1,28 @@ +import { + YogaFederationDriver, + YogaFederationDriverConfig, +} from '@graphql-yoga/nestjs-federation' +import { Module } from '@nestjs/common' +import { GraphQLModule } from '@nestjs/graphql' +import { DeprecatedProductsResolver } from './deprecated-products.resolver' +import { InventoryResolver } from './inventory.resolver' +import { ProductResearchResolver } from './product-research.resolver' +import { ProductsResolver } from './products.resolver' +import { UsersResolver } from './users.resolver' + +@Module({ + imports: [ + GraphQLModule.forRoot({ + driver: YogaFederationDriver, + typePaths: ['**/*.graphql'], + }), + ], + providers: [ + UsersResolver, + ProductsResolver, + ProductResearchResolver, + DeprecatedProductsResolver, + InventoryResolver, + ], +}) +export class AppModule {} diff --git a/examples/nestjs-apollo-federation-compatibility/src/deprecated-products.resolver.ts b/examples/nestjs-apollo-federation-compatibility/src/deprecated-products.resolver.ts new file mode 100644 index 0000000000..4ee2c4b167 --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/src/deprecated-products.resolver.ts @@ -0,0 +1,65 @@ +import { + Args, + Query, + ResolveField, + Resolver, + ResolveReference, +} from '@nestjs/graphql' + +interface User { + email: string + name: string + totalProductsCreated: number +} + +interface DeprecatedProduct { + sku: string + package: string + reason: string + createdBy: User +} + +const user = { + email: 'support@apollographql.com', + name: 'Jane Smith', + totalProductsCreated: 1337, +} + +const deprecatedProduct = { + sku: 'apollo-federation-v1', + package: '@apollo/federation-v1', + reason: 'Migrate to Federation V2', +} + +@Resolver('DeprecatedProduct') +export class DeprecatedProductsResolver { + constructor() {} + + @Query() + deprecatedProduct( + @Args('sku') sku: string, + @Args('package') packageName: string, + ) { + return sku === deprecatedProduct.sku && + packageName === deprecatedProduct.package + ? deprecatedProduct + : null + } + + @ResolveField('createdBy') + getCreatedBy() { + return user + } + + @ResolveReference() + resolveReference(reference: DeprecatedProduct) { + if ( + reference.sku === deprecatedProduct.sku && + reference.package === deprecatedProduct.package + ) { + return deprecatedProduct + } else { + return null + } + } +} diff --git a/examples/nestjs-apollo-federation-compatibility/src/inventory.resolver.ts b/examples/nestjs-apollo-federation-compatibility/src/inventory.resolver.ts new file mode 100644 index 0000000000..a92a945505 --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/src/inventory.resolver.ts @@ -0,0 +1,37 @@ +import { Resolver, ResolveReference } from '@nestjs/graphql' + +interface DeprecatedProduct { + sku: string + package: string + reason: string +} + +interface Inventory { + id: string + deprecatedProducts: [DeprecatedProduct] +} + +const inventory = { + id: 'apollo-oss', + deprecatedProducts: [ + { + sku: 'apollo-federation-v1', + package: '@apollo/federation-v1', + reason: 'Migrate to Federation V2', + }, + ], +} + +@Resolver('Inventory') +export class InventoryResolver { + constructor() {} + + @ResolveReference() + resolveReference(reference: Inventory) { + if (reference.id == inventory.id) { + return inventory + } else { + return null + } + } +} diff --git a/examples/nestjs-apollo-federation-compatibility/src/main.ts b/examples/nestjs-apollo-federation-compatibility/src/main.ts new file mode 100644 index 0000000000..e938c08f5a --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/src/main.ts @@ -0,0 +1,11 @@ +import { Logger } from '@nestjs/common' +import { NestFactory } from '@nestjs/core' +import { AppModule } from './app.module' + +async function bootstrap() { + const logger = new Logger() + const app = await NestFactory.create(AppModule, { logger }) + await app.listen(4001) + logger.log('Nest.js server listening on http://localhost:4001') +} +bootstrap() diff --git a/examples/nestjs-apollo-federation-compatibility/src/product-research.resolver.ts b/examples/nestjs-apollo-federation-compatibility/src/product-research.resolver.ts new file mode 100644 index 0000000000..b9bca265fd --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/src/product-research.resolver.ts @@ -0,0 +1,43 @@ +import { ResolveField, Resolver, ResolveReference } from '@nestjs/graphql' + +interface CaseStudy { + caseNumber: string + description: string +} + +interface ProductResearch { + study: CaseStudy + outcome: string +} + +const productResearch = [ + { + study: { + caseNumber: '1234', + description: 'Federation Study', + }, + }, + { + study: { + caseNumber: '1235', + description: 'Studio Study', + }, + }, +] + +@Resolver('ProductResearch') +export class ProductResearchResolver { + constructor() {} + + @ResolveField() + getStudy() { + return productResearch[0].study + } + + @ResolveReference() + resolveReference(reference: ProductResearch) { + return productResearch.find( + (p) => reference.study.caseNumber === p.study.caseNumber, + ) + } +} diff --git a/examples/nestjs-apollo-federation-compatibility/src/products.resolver.ts b/examples/nestjs-apollo-federation-compatibility/src/products.resolver.ts new file mode 100644 index 0000000000..bb1d417924 --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/src/products.resolver.ts @@ -0,0 +1,105 @@ +import { + Args, + Parent, + Query, + ResolveField, + Resolver, + ResolveReference, +} from '@nestjs/graphql' + +interface ProductVariation { + id: string +} + +interface Product { + id: string + sku: string + package: string + variation: ProductVariation +} + +const products: Product[] = [ + { + id: 'apollo-federation', + sku: 'federation', + package: '@apollo/federation', + variation: { + id: 'OSS', + }, + }, + { + id: 'apollo-studio', + sku: 'studio', + package: '', + variation: { + id: 'platform', + }, + }, +] + +@Resolver('Product') +export class ProductsResolver { + constructor() {} + + @Query() + product(@Args('id') id: string) { + return products.find((p) => p.id == id) + } + + @ResolveField('variation') + getVariation(@Parent() parent: Product) { + if (parent.variation) return { id: parent.variation.id } + return { id: products.find((p) => p.id == parent.id)?.variation.id } + } + + @ResolveField('dimensions') + getDimensions() { + return { size: 'small', weight: 1, unit: 'kg' } + } + + @ResolveField('createdBy') + getCreatedBy() { + return { email: 'support@apollographql.com', totalProductsCreated: 1337 } + } + + @ResolveField('research') + getResearch(@Parent() parent: Product) { + if (parent.id === 'apollo-federation') { + return [ + { + study: { + caseNumber: '1234', + description: 'Federation Study', + }, + }, + ] + } else if (parent.id === 'apollo-studio') { + return [ + { + study: { + caseNumber: '1235', + description: 'Studio Study', + }, + }, + ] + } else { + return [] + } + } + + @ResolveReference() + resolveReference(productRef: Product) { + if (productRef.id) { + return products.find((p) => p.id == productRef.id) + } else if (productRef.sku && productRef.package) { + return products.find( + (p) => p.sku == productRef.sku && p.package == productRef.package, + ) + } else { + return products.find( + (p) => + p.sku == productRef.sku && p.variation.id == productRef.variation.id, + ) + } + } +} diff --git a/examples/nestjs-apollo-federation-compatibility/src/users.resolver.ts b/examples/nestjs-apollo-federation-compatibility/src/users.resolver.ts new file mode 100644 index 0000000000..18260a8ee2 --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/src/users.resolver.ts @@ -0,0 +1,21 @@ +import { ResolveField, Resolver } from '@nestjs/graphql' + +@Resolver('User') +export class UsersResolver { + constructor() {} + + @ResolveField('name') + getName() { + return 'Jane Smith' + } + + @ResolveField('averageProductsCreatedPerYear') + getAverageProductsCreatedPerYear({ + totalProductsCreated, + yearsOfEmployment, + }) { + return totalProductsCreated + ? Math.round(totalProductsCreated / yearsOfEmployment) + : null + } +} diff --git a/examples/nestjs-apollo-federation-compatibility/tsconfig.json b/examples/nestjs-apollo-federation-compatibility/tsconfig.json new file mode 100644 index 0000000000..24248acdf7 --- /dev/null +++ b/examples/nestjs-apollo-federation-compatibility/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "module": "commonjs", + "target": "esnext", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true + }, + "include": ["./src"] +} diff --git a/packages/nestjs-federation/README.md b/packages/nestjs-federation/README.md new file mode 100644 index 0000000000..4e9ec2cea0 --- /dev/null +++ b/packages/nestjs-federation/README.md @@ -0,0 +1,62 @@ +
+
+ +

+ GraphQL Yoga plugin with Apollo Federation for NestJS +

+ +
Fully-featured GraphQL server as a plugin for the progressive Node.js framework.
+ +

+Check out Yoga's documentation about NestJS integration! +

+ +
+
+ +## Getting started + +### Install + +```shell +npm i @nestjs/graphql graphql-yoga graphql @graphql-yoga/nestjs-federation +``` + +### Create application module + +```typescript +import { + YogaFederationDriver, + YogaFederationDriverConfig +} from '@graphql-yoga/nestjs-federation' +import { Module } from '@nestjs/common' +import { GraphQLModule } from '@nestjs/graphql' + +@Module({ + imports: [ + GraphQLModule.forRoot({ + driver: YogaFederationDriver, + typePaths: ['**/*.graphql'] + }) + ] +}) +export class AppModule {} +``` + +### Develop GraphQL + +This is just a federation and gateway driver; meaning, everything else should work as [showcased in NestJS federation documentation](https://docs.nestjs.com/graphql/federation). + +## Contributing + +If this is your first time contributing to this project, please do read our +[Contributor Workflow Guide](https://github.com/the-guild-org/Stack/blob/master/CONTRIBUTING.md) +before you get started off. + +Feel free to open issues, pull requests and create discussions. Community support is always welcome! + +## Code of Conduct + +Help us keep Yoga open and inclusive. Please read and follow our +[ of Conduct](https://github.com/the-guild-org/Stack/blob/master/CODE_OF_CONDUCT.md) as adopted from +[Contributor Covenant](https://www.contributor-covenant.org/). diff --git a/packages/nestjs-federation/package.json b/packages/nestjs-federation/package.json new file mode 100644 index 0000000000..7962f37ae3 --- /dev/null +++ b/packages/nestjs-federation/package.json @@ -0,0 +1,77 @@ +{ + "name": "@graphql-yoga/nestjs-federation", + "version": "0.0.0", + "description": "GraphQL Yoga driver with Apollo Federation for NestJS GraphQL.", + "repository": { + "type": "git", + "url": "https://github.com/dotansimha/graphql-yoga.git", + "directory": "packages/nestjs-federation" + }, + "author": "Denis Badurina ", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "scripts": { + "check": "tsc --pretty --noEmit" + }, + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "exports": { + ".": { + "require": { + "types": "./dist/typings/index.d.cts", + "default": "./dist/cjs/index.js" + }, + "import": { + "types": "./dist/typings/index.d.ts", + "default": "./dist/esm/index.js" + }, + "default": { + "types": "./dist/typings/index.d.ts", + "default": "./dist/esm/index.js" + } + }, + "./package.json": "./package.json" + }, + "typings": "dist/typings/index.d.ts", + "typescript": { + "definition": "dist/typings/index.d.ts" + }, + "keywords": [ + "graphql", + "server", + "nestjs", + "nest", + "driver", + "graphql-yoga", + "apollo", + "federation" + ], + "peerDependencies": { + "@nestjs/common": "^8.4.7 || ^9.0.0", + "@nestjs/core": "^8.4.7 || ^9.0.0", + "@nestjs/graphql": "^11.0.0", + "graphql": "^15.0.0 || ^16.0.0" + }, + "dependencies": { + "@apollo/gateway": "^2.4.0", + "@apollo/subgraph": "^2.4.0", + "@envelop/apollo-federation": "^3.0.6", + "@envelop/core": "^3.0.6", + "@graphql-yoga/nestjs": "0.3.1", + "@graphql-yoga/plugin-apollo-inline-trace": "1.7.3" + }, + "devDependencies": { + "@nestjs/common": "^9.3.12", + "@nestjs/core": "^9.3.12", + "@nestjs/graphql": "^11.0.4", + "graphql": "^16.6.0", + "tslib": "^2.5.0" + }, + "publishConfig": { + "access": "public" + }, + "type": "module", + "sideEffects": false +} diff --git a/packages/nestjs-federation/src/index.ts b/packages/nestjs-federation/src/index.ts new file mode 100644 index 0000000000..983e08a5fa --- /dev/null +++ b/packages/nestjs-federation/src/index.ts @@ -0,0 +1,116 @@ +import { ApolloGateway, GatewayConfig } from '@apollo/gateway' +import { printSubgraphSchema } from '@apollo/subgraph' +import { useApolloFederation } from '@envelop/apollo-federation' +import { Injectable, Type } from '@nestjs/common' +import { GraphQLFederationFactory } from '@nestjs/graphql' +import { + AbstractYogaDriver, + YogaDriver, + YogaDriverConfig, + YogaDriverPlatform, +} from '@graphql-yoga/nestjs' +import { useApolloInlineTrace } from '@graphql-yoga/plugin-apollo-inline-trace' +import { GraphQLSchema } from 'graphql' + +export type YogaFederationDriverConfig< + Platform extends YogaDriverPlatform = 'express', +> = YogaDriverConfig + +@Injectable() +export class YogaFederationDriver< + Platform extends YogaDriverPlatform = 'express', +> extends AbstractYogaDriver { + constructor( + private readonly graphqlFederationFactory: GraphQLFederationFactory, + ) { + super() + } + + async generateSchema( + options: YogaFederationDriverConfig, + ): Promise { + return await this.graphqlFederationFactory.generateSchema(options) + } + + public async start(options: YogaFederationDriverConfig) { + if (options.definitions?.path) { + if (!options.schema) { + throw new Error('Schema is required when providing definitions path') + } + await this.graphQlFactory.generateDefinitions( + printSubgraphSchema(options.schema), + options, + ) + } + + await super.start({ + ...options, + plugins: [...(options?.plugins || []), useApolloInlineTrace()], + }) + + if (options.subscriptions) { + // See more: https://github.com/apollographql/apollo-server/issues/2776 + throw new Error( + 'No support for subscriptions when using Apollo Federation', + ) + } + } +} + +export interface YogaGatewayDriverConfig< + Platform extends YogaDriverPlatform = 'express', +> { + driver?: Type> + gateway?: GatewayConfig + server?: Omit< + YogaDriverConfig, + | 'endpoint' + | 'schema' + | 'typeDefs' + | 'definitions' + | 'resolvers' + | 'resolverValidationOptions' + | 'directiveResolvers' + | 'autoSchemaFile' + | 'transformSchema' + | 'subscriptions' + | 'buildSchemaOptions' + | 'fieldResolverEnhancers' + | 'driver' + > +} + +@Injectable() +export class YogaGatewayDriver< + Platform extends YogaDriverPlatform = 'express', +> extends AbstractYogaDriver { + public async generateSchema( + _options: YogaGatewayDriverConfig, + ): Promise { + return new GraphQLSchema({}) + } + + public async start(options: YogaGatewayDriverConfig) { + const { server: serverOpts = {}, gateway: gatewayOpts = {} } = options + const gateway: ApolloGateway = new ApolloGateway(gatewayOpts) + + await gateway.load() + + await super.start({ + ...serverOpts, + plugins: [ + ...(serverOpts.plugins || []), + useApolloFederation({ gateway }), + ], + }) + } + + public async mergeDefaultOptions( + options: Record, + ): Promise> { + return { + ...options, + server: await super.mergeDefaultOptions(options?.server ?? {}), + } + } +} diff --git a/packages/nestjs/CHANGELOG.md b/packages/nestjs/CHANGELOG.md new file mode 100644 index 0000000000..4c224d210b --- /dev/null +++ b/packages/nestjs/CHANGELOG.md @@ -0,0 +1,43 @@ +# @graphql-yoga/nestjs + +## 0.3.1 + +### Patch Changes + +- 05d838c: Make Fastify platform work (#79) + +## 0.3.0 + +### Minor Changes + +- 2c1f603: @nestjs/graphql should be a peer dependency + +## 0.2.0 + +### Minor Changes + +- 8161b3e: Support NestJS v9 + +## 0.1.0 + +### Minor Changes + +- c58c7d5: Yoga v3 + +## 0.0.4 + +### Patch Changes + +- b57dd7a: Fix Federated service code-first schema generation + +## 0.0.3 + +### Patch Changes + +- 486baac: fix build + +## 0.0.2 + +### Patch Changes + +- 3237986: update documentation diff --git a/packages/nestjs/README.md b/packages/nestjs/README.md new file mode 100644 index 0000000000..df85ba7009 --- /dev/null +++ b/packages/nestjs/README.md @@ -0,0 +1,62 @@ +
+
+ +

+ GraphQL Yoga plugin for NestJS +

+ +
Fully-featured GraphQL server as a plugin for the progressive Node.js framework.
+ +

+Check out Yoga's documentation about NestJS integration! +

+ +
+
+ +## Getting started + +### Install + +```shell +npm i @nestjs/graphql graphql-yoga graphql @graphql-yoga/nestjs +``` + +### Create application module + +```typescript +import { YogaDriver, YogaDriverConfig } from '@graphql-yoga/nestjs' +import { Module } from '@nestjs/common' +import { GraphQLModule } from '@nestjs/graphql' + +@Module({ + imports: [ + GraphQLModule.forRoot({ + driver: YogaDriver + }) + ] +}) +export class AppModule {} +``` + +### Develop GraphQL + +This is just a HTTP transport driver; meaning, everything else should work as [showcased in NestJS documentation](https://docs.nestjs.com/graphql/resolvers). + +### Apollo Federation + +Separately, we offer a [`@graphql-yoga/nestjs-federation` driver](/packages/nestjs-federation) which allows building Apollo Federation Gateways and Services. Check it out! + +## Contributing + +If this is your first time contributing to this project, please do read our +[Contributor Workflow Guide](https://github.com/the-guild-org/Stack/blob/master/CONTRIBUTING.md) +before you get started off. + +Feel free to open issues, pull requests and create discussions. Community support is always welcome! + +## Code of Conduct + +Help us keep Yoga open and inclusive. Please read and follow our +[ of Conduct](https://github.com/the-guild-org/Stack/blob/master/CODE_OF_CONDUCT.md) as adopted from +[Contributor Covenant](https://www.contributor-covenant.org/). diff --git a/packages/nestjs/__tests__/fixtures/graphql/app.module.ts b/packages/nestjs/__tests__/fixtures/graphql/app.module.ts new file mode 100644 index 0000000000..2c33e49e68 --- /dev/null +++ b/packages/nestjs/__tests__/fixtures/graphql/app.module.ts @@ -0,0 +1,23 @@ +import { join } from 'path' +import { Module } from '@nestjs/common' +import { DynamicModule } from '@nestjs/common/interfaces' +import { GraphQLModule } from '@nestjs/graphql' +import { YogaDriver, YogaDriverConfig } from '../../../src' +import { CatsModule } from './cats/cats.module' + +@Module({}) +export class AppModule { + static forRoot(options?: YogaDriverConfig): DynamicModule { + return { + module: AppModule, + imports: [ + CatsModule, + GraphQLModule.forRoot({ + ...options, + driver: YogaDriver, + typePaths: [join(__dirname, '**', '*.graphql')], + }), + ], + } + } +} diff --git a/packages/nestjs/__tests__/fixtures/graphql/cats/cats-request-scoped.service.ts b/packages/nestjs/__tests__/fixtures/graphql/cats/cats-request-scoped.service.ts new file mode 100644 index 0000000000..1142bd20f1 --- /dev/null +++ b/packages/nestjs/__tests__/fixtures/graphql/cats/cats-request-scoped.service.ts @@ -0,0 +1,25 @@ +import { Injectable, Scope } from '@nestjs/common' +import { Cat } from './interfaces/cat.interface' + +@Injectable({ scope: Scope.REQUEST }) +export class CatsRequestScopedService { + static COUNTER = 0 + private readonly cats: Cat[] = [{ id: 1, name: 'Cat', age: 5 }] + + constructor() { + CatsRequestScopedService.COUNTER++ + } + + create(cat: Cat): Cat { + this.cats.push(cat) + return cat + } + + findAll(): Cat[] { + return this.cats + } + + findOneById(id: number): Cat | undefined { + return this.cats.find((cat) => cat.id === id) + } +} diff --git a/packages/nestjs/__tests__/fixtures/graphql/cats/cats.guard.ts b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.guard.ts new file mode 100644 index 0000000000..3b122709b7 --- /dev/null +++ b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.guard.ts @@ -0,0 +1,10 @@ +import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common' +import { GqlExecutionContext } from '@nestjs/graphql' + +@Injectable() +export class CatsGuard implements CanActivate { + canActivate(context: ExecutionContext): boolean { + GqlExecutionContext.create(context) + return true + } +} diff --git a/packages/nestjs/__tests__/fixtures/graphql/cats/cats.module.ts b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.module.ts new file mode 100644 index 0000000000..94614efed5 --- /dev/null +++ b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.module.ts @@ -0,0 +1,22 @@ +import { DynamicModule, Module, Scope } from '@nestjs/common' +import { CatsRequestScopedService } from './cats-request-scoped.service' +import { CatsResolvers } from './cats.resolvers' +import { CatsService } from './cats.service' + +@Module({ + providers: [CatsService, CatsResolvers], +}) +export class CatsModule { + static enableRequestScope(): DynamicModule { + return { + module: CatsModule, + providers: [ + { + provide: CatsService, + useClass: CatsRequestScopedService, + scope: Scope.REQUEST, + }, + ], + } + } +} diff --git a/packages/nestjs/__tests__/fixtures/graphql/cats/cats.resolvers.ts b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.resolvers.ts new file mode 100644 index 0000000000..ec245a390a --- /dev/null +++ b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.resolvers.ts @@ -0,0 +1,63 @@ +import { ParseIntPipe, UseGuards } from '@nestjs/common' +import { + Args, + Mutation, + Query, + ResolveField, + Resolver, + Subscription, +} from '@nestjs/graphql' +import { createPubSub } from '../../../utils/pubsub' +import { CatsGuard } from './cats.guard' +import { CatsService } from './cats.service' +import { Cat } from './interfaces/cat.interface' + +const catCreated = createPubSub<{ catCreated: Cat }>() + +@Resolver('Cat') +export class CatsResolvers { + constructor(private readonly catsService: CatsService) {} + + @Query() + @UseGuards(CatsGuard) + getCats() { + return this.catsService.findAll() + } + + @ResolveField('color') + getColor() { + return 'black' + } + + @ResolveField() + weight() { + return 5 + } + + @Query('cat') + findOneById( + @Args('id', ParseIntPipe) + id: number, + ): Cat | undefined { + return this.catsService.findOneById(id) + } + + @Mutation('createCat') + create(@Args() args: Cat): Cat { + const createdCat = this.catsService.create(args) + catCreated.pub({ catCreated: createdCat }) + return createdCat + } + + @Subscription('catCreated') + catCreated() { + return catCreated.sub() + } + + @Subscription('greetings') + async *greetings() { + for (const hi of ['Hi', 'Bonjour', 'Hola', 'Ciao', 'Zdravo']) { + yield { greetings: hi } + } + } +} diff --git a/packages/nestjs/__tests__/fixtures/graphql/cats/cats.service.ts b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.service.ts new file mode 100644 index 0000000000..993dc8871b --- /dev/null +++ b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@nestjs/common' +import { Cat } from './interfaces/cat.interface' + +@Injectable() +export class CatsService { + static COUNTER = 0 + private readonly cats: Cat[] = [{ id: 1, name: 'Cat', age: 5 }] + + constructor() { + CatsService.COUNTER++ + } + + create(cat: Cat): Cat { + this.cats.push(cat) + return cat + } + + findAll(): Cat[] { + return this.cats + } + + findOneById(id: number): Cat | undefined { + return this.cats.find((cat) => cat.id === id) + } +} diff --git a/packages/nestjs/__tests__/fixtures/graphql/cats/cats.types.graphql b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.types.graphql new file mode 100644 index 0000000000..da549320d7 --- /dev/null +++ b/packages/nestjs/__tests__/fixtures/graphql/cats/cats.types.graphql @@ -0,0 +1,21 @@ +type Query { + getCats: [Cat] + cat(id: ID!): Cat +} + +type Mutation { + createCat(name: String): Cat +} + +type Subscription { + catCreated: Cat + greetings: String +} + +type Cat { + id: Int + name: String + age: Int + color: String + weight: Int +} diff --git a/packages/nestjs/__tests__/fixtures/graphql/cats/interfaces/cat.interface.ts b/packages/nestjs/__tests__/fixtures/graphql/cats/interfaces/cat.interface.ts new file mode 100644 index 0000000000..07841b5c02 --- /dev/null +++ b/packages/nestjs/__tests__/fixtures/graphql/cats/interfaces/cat.interface.ts @@ -0,0 +1,5 @@ +export interface Cat { + readonly id: number + readonly name: string + readonly age: number +} diff --git a/packages/nestjs/__tests__/graphql-http.spec.ts b/packages/nestjs/__tests__/graphql-http.spec.ts new file mode 100644 index 0000000000..58fc4b295c --- /dev/null +++ b/packages/nestjs/__tests__/graphql-http.spec.ts @@ -0,0 +1,46 @@ +import { serverAudits } from 'graphql-http' +import { INestApplication } from '@nestjs/common' +import { Test } from '@nestjs/testing' +import { fetch } from '@whatwg-node/fetch' +import { AppModule } from './fixtures/graphql/app.module' + +let app: INestApplication, url: string + +beforeAll(async () => { + const module = await Test.createTestingModule({ + imports: [ + AppModule.forRoot({ + subscriptions: { + 'graphql-ws': true, + }, + }), + ], + }).compile() + app = module.createNestApplication() + await app.listen(0) + url = (await app.getUrl()) + '/graphql' +}) + +afterAll(() => app.close()) + +describe('GraphQL over HTTP', () => { + for (const audit of serverAudits({ + url: () => url, + fetchFn: fetch, + })) { + if ( + // we dont control the JSON parsing + audit.id === 'D477' + ) { + it.todo(audit.name) + } else { + it(audit.name, async () => { + await expect(audit.fn()).resolves.toEqual( + expect.objectContaining({ + status: 'ok', + }), + ) + }) + } + } +}) diff --git a/packages/nestjs/__tests__/graphql-ws.spec.ts b/packages/nestjs/__tests__/graphql-ws.spec.ts new file mode 100644 index 0000000000..42ca361598 --- /dev/null +++ b/packages/nestjs/__tests__/graphql-ws.spec.ts @@ -0,0 +1,84 @@ +import { createClient } from 'graphql-ws' + +import { WebSocket } from 'ws' +import { INestApplication } from '@nestjs/common' +import { Test } from '@nestjs/testing' +import { AppModule } from './fixtures/graphql/app.module' + +let app: INestApplication, url: string + +beforeAll(async () => { + const module = await Test.createTestingModule({ + imports: [ + AppModule.forRoot({ + subscriptions: { + 'graphql-ws': true, + }, + }), + ], + }).compile() + app = module.createNestApplication() + await app.listen(0) + url = (await app.getUrl()) + '/graphql' +}) + +afterAll(() => app.close()) + +it('should subscribe using graphql-ws', async () => { + const client = createClient({ + url: url.replace('http', 'ws'), + webSocketImpl: WebSocket, + lazy: true, + retryAttempts: 0, + }) + + await expect( + new Promise((resolve, reject) => { + const msgs: unknown[] = [] + client.subscribe( + { + query: /* GraphQL */ ` + subscription { + greetings + } + `, + }, + { + next(msg) { + msgs.push(msg) + }, + error: reject, + complete: () => resolve(msgs), + }, + ) + }), + ).resolves.toMatchInlineSnapshot(` + [ + { + "data": { + "greetings": "Hi", + }, + }, + { + "data": { + "greetings": "Bonjour", + }, + }, + { + "data": { + "greetings": "Hola", + }, + }, + { + "data": { + "greetings": "Ciao", + }, + }, + { + "data": { + "greetings": "Zdravo", + }, + }, + ] + `) +}) diff --git a/packages/nestjs/__tests__/graphql.spec.ts b/packages/nestjs/__tests__/graphql.spec.ts new file mode 100644 index 0000000000..e2ae352bfb --- /dev/null +++ b/packages/nestjs/__tests__/graphql.spec.ts @@ -0,0 +1,50 @@ +import { INestApplication } from '@nestjs/common' +import { Test } from '@nestjs/testing' +import { fetch } from '@whatwg-node/fetch' +import { AppModule } from './fixtures/graphql/app.module' + +let app: INestApplication, url: string + +beforeAll(async () => { + const module = await Test.createTestingModule({ + imports: [AppModule.forRoot()], + }).compile() + app = module.createNestApplication() + await app.listen(0) + url = (await app.getUrl()) + '/graphql' +}) + +afterAll(() => app.close()) + +it('should return query result', async () => { + const res = await fetch(url, { + method: 'POST', + headers: { + 'content-type': 'application/json', + }, + body: JSON.stringify({ + query: /* GraphQL */ ` + { + getCats { + id + color + weight + } + } + `, + }), + }) + await expect(res.json()).resolves.toMatchInlineSnapshot(` + { + "data": { + "getCats": [ + { + "color": "black", + "id": 1, + "weight": 5, + }, + ], + }, + } + `) +}) diff --git a/packages/nestjs/__tests__/subscriptions-transport-ws.spec.ts b/packages/nestjs/__tests__/subscriptions-transport-ws.spec.ts new file mode 100644 index 0000000000..33389e63a6 --- /dev/null +++ b/packages/nestjs/__tests__/subscriptions-transport-ws.spec.ts @@ -0,0 +1,88 @@ +import { SubscriptionClient } from 'subscriptions-transport-ws' +import { WebSocket } from 'ws' +import { INestApplication } from '@nestjs/common' +import { Test } from '@nestjs/testing' +import { AppModule } from './fixtures/graphql/app.module' + +let app: INestApplication, url: string + +beforeAll(async () => { + const module = await Test.createTestingModule({ + imports: [ + AppModule.forRoot({ + subscriptions: { + 'subscriptions-transport-ws': true, + }, + }), + ], + }).compile() + app = module.createNestApplication() + await app.listen(0) + url = (await app.getUrl()) + '/graphql' +}) + +afterAll(() => app.close()) + +it('should subscribe using subscriptions-transport-ws', async () => { + const client = new SubscriptionClient( + url.replace('http', 'ws'), + { + lazy: true, + reconnectionAttempts: 0, + }, + WebSocket, + ) + + await expect( + new Promise((resolve, reject) => { + const msgs: unknown[] = [] + const obs = client.request({ + query: /* GraphQL */ ` + subscription { + greetings + } + `, + }) + obs.subscribe({ + next(msg) { + msgs.push(msg) + }, + error: reject, + complete: () => { + resolve(msgs) + }, + }) + }), + ).resolves.toMatchInlineSnapshot(` + [ + { + "data": { + "greetings": "Hi", + }, + }, + { + "data": { + "greetings": "Bonjour", + }, + }, + { + "data": { + "greetings": "Hola", + }, + }, + { + "data": { + "greetings": "Ciao", + }, + }, + { + "data": { + "greetings": "Zdravo", + }, + }, + ] + `) + + // somehow, even in lazy mode, it keeps the connection after subscriptions complete + client.close() +}) diff --git a/packages/nestjs/__tests__/subscriptions.spec.ts b/packages/nestjs/__tests__/subscriptions.spec.ts new file mode 100644 index 0000000000..ea48c2c90b --- /dev/null +++ b/packages/nestjs/__tests__/subscriptions.spec.ts @@ -0,0 +1,49 @@ +import { INestApplication } from '@nestjs/common' +import { Test } from '@nestjs/testing' +import { fetch } from '@whatwg-node/fetch' +import { AppModule } from './fixtures/graphql/app.module' + +let app: INestApplication, url: string + +beforeAll(async () => { + const module = await Test.createTestingModule({ + imports: [AppModule.forRoot()], + }).compile() + app = module.createNestApplication() + await app.listen(0) + url = (await app.getUrl()) + '/graphql' +}) + +afterAll(() => app.close()) + +it('should subscribe using sse', async () => { + const sub = await fetch(url, { + method: 'POST', + headers: { + 'content-type': 'application/json', + }, + body: JSON.stringify({ + query: /* GraphQL */ ` + subscription { + greetings + } + `, + }), + }) + + await expect(sub.text()).resolves.toMatchInlineSnapshot(` + "data: {"data":{"greetings":"Hi"}} + + data: {"data":{"greetings":"Bonjour"}} + + data: {"data":{"greetings":"Hola"}} + + data: {"data":{"greetings":"Ciao"}} + + data: {"data":{"greetings":"Zdravo"}} + + event: complete + + " + `) +}) diff --git a/packages/nestjs/__tests__/utils/pubsub.ts b/packages/nestjs/__tests__/utils/pubsub.ts new file mode 100644 index 0000000000..1f4608871a --- /dev/null +++ b/packages/nestjs/__tests__/utils/pubsub.ts @@ -0,0 +1,82 @@ +export interface Generator { + gen: AsyncGenerator + produce(val: T): void +} + +function createGenerator(): Generator { + const pending: T[] = [] + + const deferred = { + done: false, + error: null as unknown, + resolve: () => { + // noop + }, + } + + const gen = (async function* gen() { + for (;;) { + if (!pending.length) { + // only wait if there are no pending messages available + await new Promise((resolve) => (deferred.resolve = resolve)) + } + // first flush + while (pending.length) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + yield pending.shift()! + } + // then error + if (deferred.error) { + throw deferred.error + } + // or complete + if (deferred.done) { + return + } + } + })() + + gen.throw = async (err) => { + if (!deferred.done) { + deferred.done = true + deferred.error = err + deferred.resolve() + } + return { done: true, value: undefined } + } + + gen.return = async () => { + if (!deferred.done) { + deferred.done = true + deferred.resolve() + } + return { done: true, value: undefined } + } + + return { + gen, + produce(val) { + pending.push(val) + deferred.resolve() + }, + } +} + +export function createPubSub() { + const producers: Generator['produce'][] = [] + return { + pub(val: T) { + producers.forEach((next) => next(val)) + }, + sub() { + const { gen, produce } = createGenerator() + producers.push(produce) + const origReturn = gen.return + gen.return = () => { + producers.splice(producers.indexOf(produce), 1) + return origReturn() + } + return gen + }, + } +} diff --git a/packages/nestjs/package.json b/packages/nestjs/package.json new file mode 100644 index 0000000000..fbc3cb09df --- /dev/null +++ b/packages/nestjs/package.json @@ -0,0 +1,87 @@ +{ + "name": "@graphql-yoga/nestjs", + "version": "0.3.1", + "description": "GraphQL Yoga driver for NestJS GraphQL.", + "repository": { + "type": "git", + "url": "https://github.com/dotansimha/graphql-yoga.git", + "directory": "packages/nestjs" + }, + "author": "Denis Badurina ", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "scripts": { + "check": "tsc --pretty --noEmit" + }, + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "exports": { + ".": { + "require": { + "types": "./dist/typings/index.d.cts", + "default": "./dist/cjs/index.js" + }, + "import": { + "types": "./dist/typings/index.d.ts", + "default": "./dist/esm/index.js" + }, + "default": { + "types": "./dist/typings/index.d.ts", + "default": "./dist/esm/index.js" + } + }, + "./package.json": "./package.json" + }, + "typings": "dist/typings/index.d.ts", + "typescript": { + "definition": "dist/typings/index.d.ts" + }, + "keywords": [ + "graphql", + "server", + "nestjs", + "nest", + "driver", + "graphql-yoga" + ], + "peerDependencies": { + "@nestjs/common": "^8.4.7 || ^9.0.0", + "@nestjs/core": "^8.4.7 || ^9.0.0", + "@nestjs/graphql": "^11.0.0", + "graphql-yoga": "^3.0.0", + "graphql": "^15.0.0 || ^16.0.0" + }, + "devDependencies": { + "@nestjs/common": "^9.3.12", + "@nestjs/core": "^9.3.12", + "@nestjs/graphql": "^11.0.4", + "@nestjs/platform-express": "^9.3.9", + "@nestjs/platform-fastify": "^9.3.9", + "@nestjs/testing": "^9.3.9", + "@swc/core": "^1.3.35", + "@types/express": "^4.17.17", + "@types/glob": "^8.0.1", + "@types/ws": "^8.5.4", + "@whatwg-node/fetch": "^0.8.1", + "express": "^4.18.2", + "fastify": "^4.13.0", + "glob": "^8.1.0", + "graphql": "^16.6.0", + "graphql-http": "^1.16.0", + "graphql-ws": "^5.11.3", + "graphql-yoga": "^3.7.0", + "prettier": "^2.8.3", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.8.0", + "subscriptions-transport-ws": "^0.11.0", + "tslib": "^2.5.0", + "ws": "^8.12.1" + }, + "publishConfig": { + "access": "public" + }, + "type": "module", + "sideEffects": false +} diff --git a/packages/nestjs/src/index.ts b/packages/nestjs/src/index.ts new file mode 100644 index 0000000000..8267dbeef7 --- /dev/null +++ b/packages/nestjs/src/index.ts @@ -0,0 +1,315 @@ +import type { + Express, + Request as ExpressRequest, + Response as ExpressResponse, +} from 'express' +import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify' +import { printSchema } from 'graphql' +import { createYoga, YogaServerInstance, YogaServerOptions } from 'graphql-yoga' +import type { ExecutionParams } from 'subscriptions-transport-ws' +import { Injectable, Logger } from '@nestjs/common' +import { + AbstractGraphQLDriver, + GqlModuleOptions, + GqlSubscriptionService, + SubscriptionConfig, +} from '@nestjs/graphql' + +export type YogaDriverPlatform = 'express' | 'fastify' + +export type YogaDriverServerContext = + Platform extends 'fastify' + ? { + req: FastifyRequest + reply: FastifyReply + } + : { + req: ExpressRequest + res: ExpressResponse + } + +export type YogaDriverServerOptions = Omit< + YogaServerOptions, never>, + 'context' | 'schema' +> + +export type YogaDriverServerInstance = + YogaServerInstance, never> + +export type YogaDriverConfig = + GqlModuleOptions & + YogaDriverServerOptions & { + /** + * Subscriptions configuration. Passing `true` will install only `graphql-ws`. + */ + subscriptions?: boolean | YogaDriverSubscriptionConfig + } + +export type YogaDriverSubscriptionConfig = { + 'graphql-ws'?: Omit + 'subscriptions-transport-ws'?: Omit< + SubscriptionConfig['subscriptions-transport-ws'], + 'onOperation' + > +} + +export abstract class AbstractYogaDriver< + Platform extends YogaDriverPlatform, +> extends AbstractGraphQLDriver> { + protected yoga!: YogaDriverServerInstance + + public async start(options: YogaDriverConfig) { + const platformName = this.httpAdapterHost.httpAdapter.getType() as Platform + options = { + ...options, + // disable error masking by default + maskedErrors: options.maskedErrors == null ? false : options.maskedErrors, + // disable graphiql in production + graphiql: + options.graphiql == null + ? process.env.NODE_ENV !== 'production' + : options.graphiql, + } + if (platformName === 'express') { + return this.registerExpress(options as YogaDriverConfig<'express'>) + } + if (platformName === 'fastify') { + return this.registerFastify(options as YogaDriverConfig<'fastify'>) + } + throw new Error(`Provided HttpAdapter "${platformName}" not supported`) + } + + public async stop() { + // noop + } + + protected registerExpress( + options: YogaDriverConfig<'express'>, + { preStartHook }: { preStartHook?: (app: Express) => void } = {}, + ) { + const app: Express = this.httpAdapterHost.httpAdapter.getInstance() + + preStartHook?.(app) + + // nest's logger doesnt have the info method + class LoggerWithInfo extends Logger { + constructor(context: string) { + super(context) + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + info(message: any, ...args: any[]) { + this.log(message, ...args) + } + } + + const yoga = createYoga>({ + ...options, + graphqlEndpoint: options.path, + // disable logging by default + // however, if `true` use nest logger + logging: + options.logging == null + ? false + : options.logging + ? new LoggerWithInfo('YogaDriver') + : options.logging, + }) + + this.yoga = yoga as YogaDriverServerInstance + + app.use(yoga.graphqlEndpoint, (req, res) => yoga(req, res, { req, res })) + } + + protected registerFastify( + options: YogaDriverConfig<'fastify'>, + { preStartHook }: { preStartHook?: (app: FastifyInstance) => void } = {}, + ) { + const app: FastifyInstance = this.httpAdapterHost.httpAdapter.getInstance() + + preStartHook?.(app) + + const yoga = createYoga>({ + ...options, + graphqlEndpoint: options.path, + // disable logging by default + // however, if `true` use fastify logger + logging: + options.logging == null + ? false + : options.logging + ? app.log + : options.logging, + }) + + this.yoga = yoga as YogaDriverServerInstance + + app.all(yoga.graphqlEndpoint, async (req, reply) => { + const response = await yoga.handleNodeRequest(req, { + req, + reply, + }) + response.headers.forEach((value, key) => reply.header(key, value)) + reply.status(response.status) + reply.send(response.body) + return reply + }) + } +} + +@Injectable() +export class YogaDriver< + Platform extends YogaDriverPlatform = 'express', +> extends AbstractYogaDriver { + private subscriptionService?: GqlSubscriptionService + + public async start(options: YogaDriverConfig) { + if (options.definitions?.path) { + if (!options.schema) { + throw new Error('Schema is required when generating definitions') + } + await this.graphQlFactory.generateDefinitions( + printSchema(options.schema), + options, + ) + } + + await super.start(options) + + if (options.subscriptions) { + if (!options.schema) { + throw new Error('Schema is required when using subscriptions') + } + + const config: SubscriptionConfig = + options.subscriptions === true + ? { + 'graphql-ws': true, + } + : options.subscriptions + + if (config['graphql-ws']) { + config['graphql-ws'] = + typeof config['graphql-ws'] === 'object' ? config['graphql-ws'] : {} + + config['graphql-ws'].onSubscribe = async (ctx, msg) => { + const { + schema, + execute, + subscribe, + contextFactory, + parse, + validate, + } = this.yoga.getEnveloped({ + ...ctx, + // @ts-expect-error context extra is from graphql-ws/lib/use/ws + req: ctx.extra.request, + // @ts-expect-error context extra is from graphql-ws/lib/use/ws + socket: ctx.extra.socket, + params: msg.payload, + }) + + const args = { + schema, + operationName: msg.payload.operationName, + document: parse(msg.payload.query), + variableValues: msg.payload.variables, + contextValue: await contextFactory({ execute, subscribe }), + } + + const errors = validate(args.schema, args.document) + if (errors.length) return errors + return args + } + } + + if (config['subscriptions-transport-ws']) { + config['subscriptions-transport-ws'] = + typeof config['subscriptions-transport-ws'] === 'object' + ? config['subscriptions-transport-ws'] + : {} + + config['subscriptions-transport-ws'].onOperation = async ( + _msg: unknown, + params: ExecutionParams, + ws: WebSocket, + ) => { + const { + schema, + execute, + subscribe, + contextFactory, + parse, + validate, + } = this.yoga.getEnveloped({ + ...params.context, + req: + // @ts-expect-error upgradeReq does exist but is untyped + ws.upgradeReq, + socket: ws, + params, + }) + + const args = { + schema, + operationName: params.operationName, + document: + typeof params.query === 'string' + ? parse(params.query) + : params.query, + variables: params.variables, + context: await contextFactory({ execute, subscribe }), + } + + const errors = validate(args.schema, args.document) + if (errors.length) return errors + return args + } + } + + this.subscriptionService = new GqlSubscriptionService( + { + schema: options.schema, + path: options.path, + execute: (...args) => { + const contextValue = + args[0].contextValue || + // @ts-expect-error args can be inlined with graphql-js@<=15 + args[3] + if (!contextValue) { + throw new Error( + 'Execution arguments are missing the context value', + ) + } + return ( + contextValue + // @ts-expect-error execute method will be available, see above + .execute(...args) + ) + }, + subscribe: (...args) => { + const contextValue = + args[0].contextValue || + // @ts-expect-error args can be inlined with graphql-js@<=15 + args?.[3] + if (!contextValue) { + throw new Error( + 'Subscribe arguments are missing the context value', + ) + } + return ( + contextValue + // @ts-expect-error execute method will be available, see above + .subscribe(...args) + ) + }, + ...config, + }, + this.httpAdapterHost.httpAdapter.getHttpServer(), + ) + } + } + + public async stop() { + await this.subscriptionService?.stop() + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf0437cafe..65bf8afb76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -140,7 +140,7 @@ importers: examples/apollo-federation-compatibility: specifiers: '@apollo/federation-subgraph-compatibility': 1.2.1 - '@apollo/subgraph': 2.4.0 + '@apollo/subgraph': ^2.4.0 '@graphql-codegen/cli': 3.2.2 '@graphql-codegen/typescript': 3.0.2 '@graphql-codegen/typescript-resolvers': 3.1.1 @@ -178,7 +178,7 @@ importers: examples/apollo-federation/service: specifiers: - '@apollo/subgraph': 2.4.0 + '@apollo/subgraph': ^2.4.0 graphql: 16.6.0 graphql-yoga: 3.7.3 dependencies: @@ -674,6 +674,62 @@ importers: ts-node-dev: 2.0.0_typescript@5.0.2 typescript: 5.0.2 + examples/nestjs-apollo-federation-compatibility: + specifiers: + '@apollo/federation-subgraph-compatibility': 1.2.1 + '@apollo/rover': ^0.13.0 + '@graphql-yoga/nestjs-federation': 0.0.0 + '@grpc/proto-loader': ^0.7.5 + '@nestjs/cli': ^9.3.0 + '@nestjs/common': ^9.3.12 + '@nestjs/core': ^9.3.12 + '@nestjs/graphql': ^11.0.4 + '@nestjs/microservices': ^9.3.12 + '@nestjs/platform-socket.io': ^9.3.12 + '@nestjs/websockets': ^9.3.12 + amqp-connection-manager: ^4.1.11 + amqplib: ^0.10.3 + cache-manager: ^5.2.0 + class-transformer: 0.3.1 + class-validator: ^0.14.0 + esbuild: 0.17.12 + graphql: 16.6.0 + kafkajs: ^2.2.4 + mqtt: ^4.3.7 + nats: ^2.13.1 + reflect-metadata: ^0.1.13 + rimraf: ^4.1.2 + rxjs: ^7.8.0 + ts-morph: ^17.0.1 + typescript: ^4.9.5 + devDependencies: + '@apollo/federation-subgraph-compatibility': 1.2.1_dz5zvay4fqzl7eumjnjz232jtq + '@apollo/rover': 0.13.0 + '@graphql-yoga/nestjs-federation': link:../../packages/nestjs-federation + '@grpc/proto-loader': 0.7.6 + '@nestjs/cli': 9.3.0_esbuild@0.17.12 + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/core': 9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu + '@nestjs/graphql': 11.0.4_43rkvqf6sx4pjtvxz4edigbolu + '@nestjs/microservices': 9.3.12_omcmzkvcooythqyz5b4qnmicdu + '@nestjs/platform-socket.io': 9.3.12_wrisvyl4dee7g4zqm7fsddtudy + '@nestjs/websockets': 9.3.12_co26mupaw3whrp4scxkscvfoeq + amqp-connection-manager: 4.1.11_amqplib@0.10.3 + amqplib: 0.10.3 + cache-manager: 5.2.0 + class-transformer: 0.3.1 + class-validator: 0.14.0 + esbuild: 0.17.12 + graphql: 16.6.0 + kafkajs: 2.2.4 + mqtt: 4.3.7 + nats: 2.13.1 + reflect-metadata: 0.1.13 + rimraf: 4.4.0 + rxjs: 7.8.0 + ts-morph: 17.0.1 + typescript: 4.9.5 + examples/netlify-edge: specifiers: esbuild: 0.17.14 @@ -1147,6 +1203,85 @@ importers: tslib: 2.5.0 publishDirectory: dist + packages/nestjs: + specifiers: + '@nestjs/common': ^9.3.12 + '@nestjs/core': ^9.3.12 + '@nestjs/graphql': ^11.0.4 + '@nestjs/platform-express': ^9.3.9 + '@nestjs/platform-fastify': ^9.3.9 + '@nestjs/testing': ^9.3.9 + '@swc/core': ^1.3.35 + '@types/express': ^4.17.17 + '@types/glob': ^8.0.1 + '@types/ws': ^8.5.4 + '@whatwg-node/fetch': ^0.8.1 + express: ^4.18.2 + fastify: ^4.13.0 + glob: ^8.1.0 + graphql: 16.6.0 + graphql-http: ^1.16.0 + graphql-ws: ^5.11.3 + graphql-yoga: ^3.7.0 + prettier: ^2.8.3 + reflect-metadata: ^0.1.13 + rxjs: ^7.8.0 + subscriptions-transport-ws: ^0.11.0 + tslib: ^2.5.0 + ws: ^8.12.1 + devDependencies: + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/core': 9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu + '@nestjs/graphql': 11.0.4_43rkvqf6sx4pjtvxz4edigbolu + '@nestjs/platform-express': 9.3.9_ge4qplnzbmfyi5znl534zhtkn4 + '@nestjs/platform-fastify': 9.3.9_ge4qplnzbmfyi5znl534zhtkn4 + '@nestjs/testing': 9.3.9_nhukzpae3psoar7mehaijhr7i4 + '@swc/core': 1.3.37 + '@types/express': 4.17.17 + '@types/glob': 8.1.0 + '@types/ws': 8.5.4 + '@whatwg-node/fetch': 0.8.4 + express: 4.18.2 + fastify: 4.15.0 + glob: 8.1.0 + graphql: 16.6.0 + graphql-http: 1.16.0_graphql@16.6.0 + graphql-ws: 5.11.3_graphql@16.6.0 + graphql-yoga: link:../graphql-yoga + prettier: 2.8.7 + reflect-metadata: 0.1.13 + rxjs: 7.8.0 + subscriptions-transport-ws: 0.11.0_graphql@16.6.0 + tslib: 2.5.0 + ws: 8.12.1 + + packages/nestjs-federation: + specifiers: + '@apollo/gateway': ^2.4.0 + '@apollo/subgraph': ^2.4.0 + '@envelop/apollo-federation': ^3.0.6 + '@envelop/core': 3.0.4 + '@graphql-yoga/nestjs': 0.3.1 + '@graphql-yoga/plugin-apollo-inline-trace': 1.7.3 + '@nestjs/common': ^9.3.12 + '@nestjs/core': ^9.3.12 + '@nestjs/graphql': ^11.0.4 + graphql: 16.6.0 + tslib: ^2.5.0 + dependencies: + '@apollo/gateway': 2.4.0_graphql@16.6.0 + '@apollo/subgraph': 2.4.0_graphql@16.6.0 + '@envelop/apollo-federation': 3.0.6_wiwr743igk42cpiqv5l3x32o6m + '@envelop/core': 3.0.4 + '@graphql-yoga/nestjs': link:../nestjs + '@graphql-yoga/plugin-apollo-inline-trace': link:../plugins/apollo-inline-trace + devDependencies: + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/core': 9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu + '@nestjs/graphql': 11.0.4_43rkvqf6sx4pjtvxz4edigbolu + graphql: 16.6.0 + tslib: 2.5.0 + packages/node: specifiers: graphql-yoga: 3.7.3 @@ -1320,6 +1455,17 @@ importers: packages: + /@acuminous/bitsyntax/0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /@algolia/autocomplete-core/1.8.3: resolution: {integrity: sha512-DpNL4PZTes+6pg2ysJQzZZBQUvHSYP1q8IkiJA7UoNqFMf0pdq2bSIehuiMTxNegpMjSszaB7G+o5UgxavKhWA==} dependencies: @@ -1576,6 +1722,81 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true + /@angular-devkit/core/15.0.4_chokidar@3.5.3: + resolution: {integrity: sha512-4ITpRAevd652SxB+qNesIQ9qfbm7wT5UBU5kJOPPwGL77I21g8CQpkmV1n5VSacPvC9Zbz90feOWexf7w7JzcA==} + engines: {node: ^14.20.0 || ^16.13.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + ajv: 8.11.0 + ajv-formats: 2.1.1 + chokidar: 3.5.3 + jsonc-parser: 3.2.0 + rxjs: 6.6.7 + source-map: 0.7.4 + dev: true + + /@angular-devkit/core/15.2.4_chokidar@3.5.3: + resolution: {integrity: sha512-yl+0j1bMwJLKShsyCXw77tbJG8Sd21+itisPLL2MgEpLNAO252kr9zG4TLlFRJyKVftm2l1h78KjqvM5nbOXNg==} + engines: {node: ^14.20.0 || ^16.13.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1 + chokidar: 3.5.3 + jsonc-parser: 3.2.0 + rxjs: 6.6.7 + source-map: 0.7.4 + dev: true + + /@angular-devkit/schematics-cli/15.2.4_chokidar@3.5.3: + resolution: {integrity: sha512-QTTKEH5HOkxvQtCxb2Lna2wubehkaIzA6DKUBISijPQliLomw74tzc7lXCywmMqRTbQPVRLG3kBK97hR4x67nA==} + engines: {node: ^14.20.0 || ^16.13.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + dependencies: + '@angular-devkit/core': 15.2.4_chokidar@3.5.3 + '@angular-devkit/schematics': 15.2.4_chokidar@3.5.3 + ansi-colors: 4.1.3 + inquirer: 8.2.4 + symbol-observable: 4.0.0 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - chokidar + dev: true + + /@angular-devkit/schematics/15.0.4_chokidar@3.5.3: + resolution: {integrity: sha512-/gXiLFS0+xFdx6wPoBpe/c6/K9I5edMpaASqPf4XheKtrsSvL+qTlIi3nsbfItzOiDXbaBmlbxGfkMHz/yg0Ig==} + engines: {node: ^14.20.0 || ^16.13.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 15.0.4_chokidar@3.5.3 + jsonc-parser: 3.2.0 + magic-string: 0.26.7 + ora: 5.4.1 + rxjs: 6.6.7 + transitivePeerDependencies: + - chokidar + dev: true + + /@angular-devkit/schematics/15.2.4_chokidar@3.5.3: + resolution: {integrity: sha512-/W7/vvn59PAVLzhcvD4/N/E8RDhub8ny1A7I96LTRjC5o+yvVV16YJ4YJzolrRrIEN01KmLVQJ9A58VCaweMgw==} + engines: {node: ^14.20.0 || ^16.13.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 15.2.4_chokidar@3.5.3 + jsonc-parser: 3.2.0 + magic-string: 0.29.0 + ora: 5.4.1 + rxjs: 6.6.7 + transitivePeerDependencies: + - chokidar + dev: true + /@apidevtools/json-schema-ref-parser/9.1.2: resolution: {integrity: sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==} dependencies: @@ -1591,7 +1812,6 @@ packages: graphql: 14.x || 15.x || 16.x dependencies: graphql: 16.6.0 - dev: false /@apollo/client/3.7.10: resolution: {integrity: sha512-/k1MfrqPKYiPNdHcOzdxg9cEx96vhAGxAcSorzfBvV29XtFQcYW2cPNQOTjK/fpSMtqVo8UNmu5vwQAWD1gfCg==} @@ -1669,7 +1889,6 @@ packages: graphql: 16.6.0 js-levenshtein: 1.1.6 uuid: 9.0.0 - dev: false /@apollo/federation-subgraph-compatibility-tests/1.2.1_dz5zvay4fqzl7eumjnjz232jtq: resolution: {integrity: sha512-aR8+SS8lgMa+DEc1Gjn7d1IeqJGxegfwdFhDiF2eT6T0fGujCYEgJQXqPKMXRViIiFtoqxGktvpjJmILrC5coA==} @@ -1697,6 +1916,32 @@ packages: - utf-8-validate dev: true + /@apollo/federation-subgraph-compatibility-tests/1.2.1_zofgjzmca2gwtey4x4go3tg4j4: + resolution: {integrity: sha512-aR8+SS8lgMa+DEc1Gjn7d1IeqJGxegfwdFhDiF2eT6T0fGujCYEgJQXqPKMXRViIiFtoqxGktvpjJmILrC5coA==} + dependencies: + '@apollo/rover': 0.12.2_debug@4.3.4 + debug: 4.3.4 + execa: 5.1.1 + graphql: 16.6.0 + jest: 29.4.2 + make-fetch-happen: 11.0.3 + pm2: 5.2.2 + ts-jest: 29.0.5_ggwoic2xii6eitdradnbza3bgm + transitivePeerDependencies: + - '@babel/core' + - '@jest/types' + - '@types/node' + - babel-jest + - bluebird + - bufferutil + - esbuild + - node-notifier + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: true + /@apollo/federation-subgraph-compatibility/1.2.1_dz5zvay4fqzl7eumjnjz232jtq: resolution: {integrity: sha512-0SqENVjGPgxzieZN2KuipbkDnerazZ4Sd2dIVQ5sD65PfVMkaDiZlwacA/6eJNcI6TBFyK6Wd6O0lAfiSls+Wg==} hasBin: true @@ -1886,6 +2131,20 @@ packages: - debug dev: true + /@apollo/rover/0.13.0: + resolution: {integrity: sha512-G2fd8I586ZhmfMu1nzAadi1ajBoG9dofPo219ekQnHNyNYRHGw0RVhCEWrCPfWP1qZDu1rukPdLB84NkNU159A==} + engines: {node: '>=14', npm: '>=6'} + hasBin: true + requiresBuild: true + dependencies: + axios-proxy-builder: 0.1.2 + binary-install: 1.0.6 + console.table: 0.10.0 + detect-libc: 2.0.1 + transitivePeerDependencies: + - debug + dev: true + /@apollo/server-gateway-interface/1.1.0: resolution: {integrity: sha512-0rhG++QtGfr4YhhIHgxZ9BdMFthaPY6LbhI9Au90osbfLMiZ7f8dmZsEX1mp7O1h8MJwCu6Dp0I/KcGbSvfUGA==} peerDependencies: @@ -1958,7 +2217,6 @@ packages: '@apollo/cache-control-types': 1.0.2_graphql@16.6.0 '@apollo/federation-internals': 2.4.0_graphql@16.6.0 graphql: 16.6.0 - dev: false /@apollo/usage-reporting-protobuf/4.1.0: resolution: {integrity: sha512-hXouMuw5pQVkzi8dgMybmr6Y11+eRmMQVoB5TF0HyTwAg9SOq/v3OCuiYqcVUKdBcskU9Msp+XvjAk0GKpWCwQ==} @@ -1994,7 +2252,7 @@ packages: resolution: {integrity: sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA==} dependencies: '@apollo/utils.logger': 1.0.1 - lru-cache: 7.14.1 + lru-cache: 7.18.3 dev: false /@apollo/utils.keyvaluecache/2.1.0: @@ -4649,6 +4907,23 @@ packages: kuler: 2.0.0 dev: true + /@envelop/apollo-federation/3.0.6_wiwr743igk42cpiqv5l3x32o6m: + resolution: {integrity: sha512-F2lB58aTVJ7Lwp1OHSd/AGICYSxVuEIelTB5AkwpvMokSEJvOY4HoPLc2+IJ145b35w/glbKrT5F9t3dYofXFw==} + peerDependencies: + '@apollo/gateway': ^0.41.0 || ^0.42.0 || ^0.43.0 + '@envelop/core': ^3.0.6 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@apollo/gateway': 2.4.0_graphql@16.6.0 + '@envelop/core': 3.0.4 + apollo-server-caching: 3.3.0 + apollo-server-types: 3.6.3_graphql@16.6.0 + graphql: 16.6.0 + tslib: 2.5.0 + transitivePeerDependencies: + - encoding + dev: false + /@envelop/apollo-federation/3.0.6_yiqtrka4juoc6jnbeh2mgox7y4: resolution: {integrity: sha512-F2lB58aTVJ7Lwp1OHSd/AGICYSxVuEIelTB5AkwpvMokSEJvOY4HoPLc2+IJ145b35w/glbKrT5F9t3dYofXFw==} peerDependencies: @@ -4852,6 +5127,15 @@ packages: dev: true optional: true + /@esbuild/android-arm/0.17.12: + resolution: {integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm/0.17.14: resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} engines: {node: '>=12'} @@ -4870,6 +5154,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64/0.17.12: + resolution: {integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64/0.17.14: resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} engines: {node: '>=12'} @@ -4888,6 +5181,15 @@ packages: dev: true optional: true + /@esbuild/android-x64/0.17.12: + resolution: {integrity: sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64/0.17.14: resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} engines: {node: '>=12'} @@ -4906,6 +5208,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64/0.17.12: + resolution: {integrity: sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64/0.17.14: resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} engines: {node: '>=12'} @@ -4924,6 +5235,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64/0.17.12: + resolution: {integrity: sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64/0.17.14: resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} engines: {node: '>=12'} @@ -4942,6 +5262,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64/0.17.12: + resolution: {integrity: sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64/0.17.14: resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} engines: {node: '>=12'} @@ -4960,6 +5289,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64/0.17.12: + resolution: {integrity: sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64/0.17.14: resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} engines: {node: '>=12'} @@ -4978,6 +5316,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm/0.17.12: + resolution: {integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm/0.17.14: resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} engines: {node: '>=12'} @@ -4996,6 +5343,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64/0.17.12: + resolution: {integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64/0.17.14: resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} engines: {node: '>=12'} @@ -5014,6 +5370,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32/0.17.12: + resolution: {integrity: sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32/0.17.14: resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} engines: {node: '>=12'} @@ -5041,6 +5406,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64/0.17.12: + resolution: {integrity: sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64/0.17.14: resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} engines: {node: '>=12'} @@ -5059,6 +5433,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el/0.17.12: + resolution: {integrity: sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el/0.17.14: resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} engines: {node: '>=12'} @@ -5077,6 +5460,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64/0.17.12: + resolution: {integrity: sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64/0.17.14: resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} engines: {node: '>=12'} @@ -5095,6 +5487,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64/0.17.12: + resolution: {integrity: sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64/0.17.14: resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} engines: {node: '>=12'} @@ -5113,8 +5514,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.14: - resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + /@esbuild/linux-s390x/0.17.12: + resolution: {integrity: sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -5122,8 +5523,26 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.16.3: - resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==} + /@esbuild/linux-s390x/0.17.14: + resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.16.3: + resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.17.12: + resolution: {integrity: sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -5149,6 +5568,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64/0.17.12: + resolution: {integrity: sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64/0.17.14: resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} engines: {node: '>=12'} @@ -5167,6 +5595,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64/0.17.12: + resolution: {integrity: sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64/0.17.14: resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} engines: {node: '>=12'} @@ -5185,6 +5622,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64/0.17.12: + resolution: {integrity: sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64/0.17.14: resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} engines: {node: '>=12'} @@ -5203,6 +5649,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64/0.17.12: + resolution: {integrity: sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64/0.17.14: resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} engines: {node: '>=12'} @@ -5221,6 +5676,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32/0.17.12: + resolution: {integrity: sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32/0.17.14: resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} engines: {node: '>=12'} @@ -5239,6 +5703,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64/0.17.12: + resolution: {integrity: sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64/0.17.14: resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} engines: {node: '>=12'} @@ -5415,6 +5888,13 @@ packages: dependencies: text-decoding: 1.0.0 + /@fastify/cors/8.2.0: + resolution: {integrity: sha512-qDgwpmg6C4D0D3nh8MTMuRXWyEwPnDZDBODaJv90FP2o9ukbahJByW4FtrM5Bpod5KbTf1oIExBmpItbUTQmHg==} + dependencies: + fastify-plugin: 4.5.0 + mnemonist: 0.39.5 + dev: true + /@fastify/deepmerge/1.1.0: resolution: {integrity: sha512-E8Hfdvs1bG6u0N4vN5Nty6JONUfTdOciyD5rn8KnEsLKIenvOVcr210BQR9t34PRkNyjqnMLGk3e0BsaxRdL+g==} @@ -5426,6 +5906,21 @@ packages: dependencies: fast-json-stringify: 5.4.0 + /@fastify/formbody/7.4.0: + resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} + dependencies: + fast-querystring: 1.1.1 + fastify-plugin: 4.5.0 + dev: true + + /@fastify/middie/8.1.0: + resolution: {integrity: sha512-VvUCLfKx2j6KSnh8puT8QW7d5YNzi2fD/4HcFvRQ3a7sHlCo+qtfX2fqzFvNqnMVbNft7GX1JL5if/riUiXsyg==} + dependencies: + fastify-plugin: 4.5.0 + path-to-regexp: 6.2.1 + reusify: 1.0.4 + dev: true + /@fastify/send/2.0.1: resolution: {integrity: sha512-8jdouu0o5d0FMq1+zCKeKXc1tmOQ5tTGYdQP3MpyF9+WWrZT1KCBdh6hvoEYxOm3oJG/akdE9BpehLiJgYRvGw==} dependencies: @@ -6973,6 +7468,18 @@ packages: protobufjs: 7.2.2 yargs: 16.2.0 + /@grpc/proto-loader/0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: true + /@hapi/accept/6.0.1: resolution: {integrity: sha512-aLkYj7zzgC3CSlEVOs84eBOEE3i9xZK2tdQEP+TOj2OFzMWCi9zjkRet82V3GGjecE//zFrCLKIykuaE0uM4bg==} dependencies: @@ -7720,6 +8227,11 @@ packages: engines: {node: '>=10.3.0'} dev: false + /@lukeed/csprng/1.0.1: + resolution: {integrity: sha512-uSvJdwQU5nK+Vdf6zxcWAY2A8r7uqe+gePwLWzJ+fsQehq18pc0I2hJKwypZ2aLM90+Er9u1xn4iLJPZ+xlL4g==} + engines: {node: '>=8'} + dev: true + /@lukeed/ms/2.0.1: resolution: {integrity: sha512-Xs/4RZltsAL7pkvaNStUQt7netTkyxrS0K+RILcVr3TRMS/ToOg4I6uNfhB9SlGsnWBym4U+EaXq0f0cEMNkHA==} engines: {node: '>=8'} @@ -8140,6 +8652,366 @@ packages: '@napi-rs/simple-git-win32-x64-msvc': 0.1.8 dev: false + /@nestjs/cli/9.3.0_esbuild@0.17.12: + resolution: {integrity: sha512-v/E8Y3zFk30+FljETvPgpoGIUiOfWuOe6WUFw3ExGfDeWrF/A8ceupDHPWNknBAqvNtz2kVrWu5mwsZUEKGIgg==} + engines: {node: '>= 12.9.0'} + hasBin: true + dependencies: + '@angular-devkit/core': 15.2.4_chokidar@3.5.3 + '@angular-devkit/schematics': 15.2.4_chokidar@3.5.3 + '@angular-devkit/schematics-cli': 15.2.4_chokidar@3.5.3 + '@nestjs/schematics': 9.0.4_n7i3t5jmyrdrkypb5pvfihcmg4 + chalk: 4.1.2 + chokidar: 3.5.3 + cli-table3: 0.6.3 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 8.0.0_a37q6j7dwawz22saey2vgkpwqm + inquirer: 8.2.5 + node-emoji: 1.11.0 + ora: 5.4.1 + os-name: 4.0.1 + rimraf: 4.4.0 + shelljs: 0.8.5 + source-map-support: 0.5.21 + tree-kill: 1.2.2 + tsconfig-paths: 4.1.2 + tsconfig-paths-webpack-plugin: 4.0.1 + typescript: 4.9.5 + webpack: 5.76.2_esbuild@0.17.12 + webpack-node-externals: 3.0.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: true + + /@nestjs/common/9.3.12_amodyg7qojfxktfzu4466snqfa: + resolution: {integrity: sha512-NtrUG2VgCbhmZEO1yRt/Utq16uFRV+xeHAOtdYIsfHGG0ssAV2lVLlvFFAQYh0SQ+KuYY1Gsxd3GK2JFoJCNqQ==} + peerDependencies: + cache-manager: <=5 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + cache-manager: 5.2.0 + class-transformer: 0.3.1 + class-validator: 0.14.0 + iterare: 1.2.1 + reflect-metadata: 0.1.13 + rxjs: 7.8.0 + tslib: 2.5.0 + uid: 2.0.1 + dev: true + + /@nestjs/core/9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu: + resolution: {integrity: sha512-Qe0ZjJo7bOlfudn7KHLppYrt5i4k1nR1+9d5ppYat2bb5knCIT4kIqblj666n+22/2zvsHRiTo015cLyLKsLRQ==} + requiresBuild: true + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/microservices': ^9.0.0 + '@nestjs/platform-express': ^9.0.0 + '@nestjs/websockets': ^9.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': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/microservices': 9.3.12_omcmzkvcooythqyz5b4qnmicdu + '@nestjs/websockets': 9.3.12_co26mupaw3whrp4scxkscvfoeq + '@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.13 + rxjs: 7.8.0 + tslib: 2.5.0 + uid: 2.0.1 + transitivePeerDependencies: + - encoding + dev: true + + /@nestjs/graphql/11.0.4_43rkvqf6sx4pjtvxz4edigbolu: + resolution: {integrity: sha512-D4KqFOfow18R9KrxgQBPntsKGsbZi5XQQnjwngbHXKrarRWv79yjUyHdMwZ7qnoryVx/REbFmdglF6ZpdnjiNg==} + peerDependencies: + '@apollo/subgraph': ^2.0.0 + '@nestjs/common': ^9.3.8 + '@nestjs/core': ^9.3.8 + class-transformer: '*' + class-validator: '*' + graphql: ^16.6.0 + reflect-metadata: ^0.1.13 + ts-morph: ^15.0.0 || ^16.0.0 || ^17.0.0 + peerDependenciesMeta: + '@apollo/subgraph': + optional: true + class-transformer: + optional: true + class-validator: + optional: true + ts-morph: + optional: true + dependencies: + '@graphql-tools/merge': 8.4.0_graphql@16.6.0 + '@graphql-tools/schema': 9.0.17_graphql@16.6.0 + '@graphql-tools/utils': 9.2.1_graphql@16.6.0 + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/core': 9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu + '@nestjs/mapped-types': 1.2.2_xzgs7izcyy6az2hkqxdklg4oua + chokidar: 3.5.3 + class-transformer: 0.3.1 + class-validator: 0.14.0 + fast-glob: 3.2.12 + graphql: 16.6.0 + graphql-tag: 2.12.6_graphql@16.6.0 + graphql-ws: 5.12.0_graphql@16.6.0 + lodash: 4.17.21 + normalize-path: 3.0.0 + reflect-metadata: 0.1.13 + subscriptions-transport-ws: 0.11.0_graphql@16.6.0 + ts-morph: 17.0.1 + tslib: 2.5.0 + uuid: 9.0.0 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@nestjs/mapped-types/1.2.2_@nestjs+common@9.3.12: + resolution: {integrity: sha512-3dHxLXs3M0GPiriAcCFFJQHoDFUuzTD5w6JDhE7TyfT89YKpe6tcCCIqOZWdXmt9AZjjK30RkHRSFF+QEnWFQg==} + peerDependencies: + '@nestjs/common': ^7.0.8 || ^8.0.0 || ^9.0.0 + class-transformer: ^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0 + class-validator: ^0.11.1 || ^0.12.0 || ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + dev: true + + /@nestjs/mapped-types/1.2.2_dgctl6imyfbk5gdq7xviekxosu: + resolution: {integrity: sha512-3dHxLXs3M0GPiriAcCFFJQHoDFUuzTD5w6JDhE7TyfT89YKpe6tcCCIqOZWdXmt9AZjjK30RkHRSFF+QEnWFQg==} + peerDependencies: + '@nestjs/common': ^7.0.8 || ^8.0.0 || ^9.0.0 + class-transformer: ^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0 + class-validator: ^0.11.1 || ^0.12.0 || ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + reflect-metadata: 0.1.13 + dev: true + + /@nestjs/mapped-types/1.2.2_xzgs7izcyy6az2hkqxdklg4oua: + resolution: {integrity: sha512-3dHxLXs3M0GPiriAcCFFJQHoDFUuzTD5w6JDhE7TyfT89YKpe6tcCCIqOZWdXmt9AZjjK30RkHRSFF+QEnWFQg==} + peerDependencies: + '@nestjs/common': ^7.0.8 || ^8.0.0 || ^9.0.0 + class-transformer: ^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0 + class-validator: ^0.11.1 || ^0.12.0 || ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + class-transformer: 0.3.1 + class-validator: 0.14.0 + reflect-metadata: 0.1.13 + dev: true + + /@nestjs/microservices/9.3.12_omcmzkvcooythqyz5b4qnmicdu: + resolution: {integrity: sha512-V8gd2pqKrQyeYjl0GBqMrsSzMzSZmGXCPQw9y+sDfflljTqDAYgHQJiA596UDSFw6LKLZ2pdvAZMd8QQ7MEZWw==} + peerDependencies: + '@grpc/grpc-js': '*' + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + '@nestjs/websockets': ^9.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': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/core': 9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu + '@nestjs/websockets': 9.3.12_co26mupaw3whrp4scxkscvfoeq + amqp-connection-manager: 4.1.11_amqplib@0.10.3 + amqplib: 0.10.3 + cache-manager: 5.2.0 + iterare: 1.2.1 + kafkajs: 2.2.4 + mqtt: 4.3.7 + nats: 2.13.1 + reflect-metadata: 0.1.13 + rxjs: 7.8.0 + tslib: 2.5.0 + dev: true + + /@nestjs/platform-express/9.3.9_ge4qplnzbmfyi5znl534zhtkn4: + resolution: {integrity: sha512-f8ja2sYuDGj2QSMmjg05n3WF19wJG5yTiYxRi64nsu5GKL0qLM1LzxNemehkni/knExlvF2bDpbKKpna9nC1JA==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + dependencies: + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/core': 9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu + body-parser: 1.20.1 + cors: 2.8.5 + express: 4.18.2 + multer: 1.4.4-lts.1 + tslib: 2.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@nestjs/platform-fastify/9.3.9_ge4qplnzbmfyi5znl534zhtkn4: + resolution: {integrity: sha512-+QZgd+1BDT5ZiISNWKGTsWKv6+RUYzOjOP5Iyo/hpljsGIq6GeXl90wP43FuqMp3+imVPu2AzmMa2CijT1iLXA==} + peerDependencies: + '@fastify/static': ^6.0.0 + '@fastify/view': ^7.0.0 + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + peerDependenciesMeta: + '@fastify/static': + optional: true + '@fastify/view': + optional: true + dependencies: + '@fastify/cors': 8.2.0 + '@fastify/formbody': 7.4.0 + '@fastify/middie': 8.1.0 + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/core': 9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu + fastify: 4.13.0 + light-my-request: 5.8.0 + path-to-regexp: 3.2.0 + tslib: 2.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@nestjs/platform-socket.io/9.3.12_wrisvyl4dee7g4zqm7fsddtudy: + resolution: {integrity: sha512-Zx992XJ9gUWjyxu48qfPXD+vVFWilMyoO/8M70eTKywQvst6Ch03rtdkGsQ1JDR2REAhPdiHlCx2UBXgPdEcmw==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/websockets': ^9.0.0 + rxjs: ^7.1.0 + dependencies: + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/websockets': 9.3.12_co26mupaw3whrp4scxkscvfoeq + rxjs: 7.8.0 + socket.io: 4.6.1 + tslib: 2.5.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /@nestjs/schematics/9.0.4_n7i3t5jmyrdrkypb5pvfihcmg4: + resolution: {integrity: sha512-egurCfAc4e5i1r2TmeAF0UrOKejFmT5oTdv4b7HcOVPupc3QGU7CbEfGleL3mkM5AjrixTQeMxU9bJ00ttAbGg==} + peerDependencies: + typescript: ^4.3.5 + dependencies: + '@angular-devkit/core': 15.0.4_chokidar@3.5.3 + '@angular-devkit/schematics': 15.0.4_chokidar@3.5.3 + fs-extra: 11.1.0 + jsonc-parser: 3.2.0 + pluralize: 8.0.0 + typescript: 4.9.5 + transitivePeerDependencies: + - chokidar + dev: true + + /@nestjs/testing/9.3.9_nhukzpae3psoar7mehaijhr7i4: + resolution: {integrity: sha512-+mPvSVvSC2SAkYgZZv1mOI2xsdGc1pmq7/sem7iin/JDoFtlvoGSK+pfZHD3IV3EpYtq1v/8/5gi+UFH9yZnDg==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + '@nestjs/microservices': ^9.0.0 + '@nestjs/platform-express': ^9.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + dependencies: + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/core': 9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu + '@nestjs/platform-express': 9.3.9_ge4qplnzbmfyi5znl534zhtkn4 + tslib: 2.5.0 + dev: true + + /@nestjs/websockets/9.3.12_co26mupaw3whrp4scxkscvfoeq: + resolution: {integrity: sha512-DB0HubjjzOgoPrBdCt2MHhAc3OKBQSODdDhx336TVTGZt5utYV6rLNSaGShWK696fk0fuyLSBImT9PE7igh9tQ==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + '@nestjs/platform-socket.io': ^9.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/platform-socket.io': + optional: true + dependencies: + '@nestjs/common': 9.3.12_amodyg7qojfxktfzu4466snqfa + '@nestjs/core': 9.3.12_skuq2sdvh32vi5t5ggnwn7hqiu + '@nestjs/platform-socket.io': 9.3.12_wrisvyl4dee7g4zqm7fsddtudy + iterare: 1.2.1 + object-hash: 3.0.0 + reflect-metadata: 0.1.13 + rxjs: 7.8.0 + tslib: 2.5.0 + dev: true + /@netlify/binary-info/1.0.0: resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} dev: true @@ -8937,6 +9809,18 @@ packages: dev: true optional: true + /@nuxtjs/opencollective/0.3.2: + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + consola: 2.15.3 + node-fetch: 2.6.9 + transitivePeerDependencies: + - encoding + dev: true + /@octokit/auth-token/3.0.2: resolution: {integrity: sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==} engines: {node: '>= 14'} @@ -10232,6 +11116,10 @@ packages: '@sinonjs/commons': 2.0.0 dev: true + /@socket.io/component-emitter/3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + dev: true + /@sveltejs/adapter-auto/2.0.0_7hlaraql3l3j4acwhexjo5qhge: resolution: {integrity: sha512-b+gkHFZgD771kgV3aO4avHFd7y1zhmMYy9i6xOK7m/rwmwaRO8gnF5zBc0Rgca80B2PMU1bKNxyBTHA14OzUAQ==} peerDependencies: @@ -10292,6 +11180,113 @@ packages: - supports-color dev: true + /@swc/core-darwin-arm64/1.3.37: + resolution: {integrity: sha512-iIyVqqioUpVeT/hbBVfkrsjfCyL4idNH+LVKGmoTAWaTTSB0+UNhNuA7Wh2CqIHWh1Mv7IlumitWPcqsVDdoEw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64/1.3.37: + resolution: {integrity: sha512-dao5nXPWKxtaxqak4ZkRyBoApNIelW/glantQhPhj0FjMjuIQc+v03ldJ8XDByWOG+6xuVUTheANCtEccxoQBw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf/1.3.37: + resolution: {integrity: sha512-/mVrc8H/f062CUkqKGmBiil2VIYu4mKawHxERfeP1y38X5K/OwjG5s9MgO9TVxy+Ly6vejwj70kRhSa3hVp1Bw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu/1.3.37: + resolution: {integrity: sha512-eRQ3KaZI0j5LidTfOIi/kUVOOMuVmw1HCdt/Z1TAUKoHMLVxY8xcJ3pEE3/+ednI60EmHpwpJRs6LelXyL6uzQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl/1.3.37: + resolution: {integrity: sha512-w2BRLODyxNQY2rfHZMZ5ir6QrrnGBPlnIslTrgKmVbn1OjZoxUCtuqhrYnCmybaAc4DOkeH02TqynEFXrm+EMw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu/1.3.37: + resolution: {integrity: sha512-CfoH8EsZJZ9kunjMUjBNYD5fFuO86zw+K/o4wEw72Yg6ZEiqPmeIlCKU8tpTv4sK+CbhUXrmVzMB5tqsb2jALQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl/1.3.37: + resolution: {integrity: sha512-9YPrHYNdoG7PK11gV51GfL45biI2dic+YTqHUDKyykemsD7Ot1zUFX7Ty//pdvpKcKSff6SrHbfFACD5ziNirA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc/1.3.37: + resolution: {integrity: sha512-h17Ek8/wCDje6BrXOvCXBM80oBRmTSMMdLyt87whTl5xqYlWYYs9oQIzZndNRTlNpTgjGO8Ns2eo4kwVxIkBIA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc/1.3.37: + resolution: {integrity: sha512-1BR175E1olGy/zdt94cgdb6ps/lBNissAOaxyBk8taFpcjy3zpdP30yAoH0GIsC6isnZ5JfArbOJNRXXO5tE0Q==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc/1.3.37: + resolution: {integrity: sha512-1siDQ7dccQ1pesJmgAL3BUBbRPtfbNInOWnZOkiie/DfFqGQ117QKnCVyjUvwFKfTQx1+3UUTDmMSlRd00SlXg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core/1.3.37: + resolution: {integrity: sha512-VOFlEQ1pReOM73N9A7R8rt561GU8Rxsq833jiimWDUB2sXEN3V6n6wFTgYmZuMz2T4/R0cQA1nV48KkaT4gkFw==} + engines: {node: '>=10'} + requiresBuild: true + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.37 + '@swc/core-darwin-x64': 1.3.37 + '@swc/core-linux-arm-gnueabihf': 1.3.37 + '@swc/core-linux-arm64-gnu': 1.3.37 + '@swc/core-linux-arm64-musl': 1.3.37 + '@swc/core-linux-x64-gnu': 1.3.37 + '@swc/core-linux-x64-musl': 1.3.37 + '@swc/core-win32-arm64-msvc': 1.3.37 + '@swc/core-win32-ia32-msvc': 1.3.37 + '@swc/core-win32-x64-msvc': 1.3.37 + dev: true + /@swc/helpers/0.4.14: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: @@ -10425,6 +11420,15 @@ packages: engines: {node: '>=10.13.0'} dev: true + /@ts-morph/common/0.18.1: + resolution: {integrity: sha512-RVE+zSRICWRsfrkAw5qCAK+4ZH9kwEFv5h0+/YeHTLieWP7F4wWq4JsKFuNWG+fYh/KF+8rAtgdj5zb2mm+DVA==} + dependencies: + fast-glob: 3.2.12 + minimatch: 5.1.0 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + dev: true + /@tsconfig/node10/1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} @@ -10519,6 +11523,10 @@ packages: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: false + /@types/cookie/0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + dev: true + /@types/cookie/0.5.1: resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} dev: true @@ -10531,7 +11539,7 @@ packages: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: '@types/connect': 3.4.35 - '@types/express': 4.17.14 + '@types/express': 4.17.17 '@types/keygrip': 1.0.2 '@types/node': 18.15.10 dev: false @@ -10581,12 +11589,12 @@ packages: /@types/eslint-scope/3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.4.6 + '@types/eslint': 8.21.1 '@types/estree': 1.0.0 dev: true - /@types/eslint/8.4.6: - resolution: {integrity: sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==} + /@types/eslint/8.21.1: + resolution: {integrity: sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==} dependencies: '@types/estree': 1.0.0 '@types/json-schema': 7.0.11 @@ -10611,11 +11619,18 @@ packages: '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 + /@types/express-serve-static-core/4.17.33: + resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + dependencies: + '@types/node': 18.15.10 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + /@types/express/4.17.13: resolution: {integrity: sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==} dependencies: '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.31 + '@types/express-serve-static-core': 4.17.33 '@types/qs': 6.9.7 '@types/serve-static': 1.15.0 dev: true @@ -10628,6 +11643,14 @@ packages: '@types/qs': 6.9.7 '@types/serve-static': 1.15.0 + /@types/express/4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.33 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.0 + /@types/express/4.17.3: resolution: {integrity: sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==} dependencies: @@ -10642,8 +11665,15 @@ packages: /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: - '@types/minimatch': 3.0.5 + '@types/minimatch': 5.1.2 + '@types/node': 18.15.10 + + /@types/glob/8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + dependencies: + '@types/minimatch': 5.1.2 '@types/node': 18.15.10 + dev: true /@types/got/8.3.6: resolution: {integrity: sha512-nvLlj+831dhdm4LR2Ly+HTpdLyBaMynoOr6wpIxS19d/bPeHQxFU5XQ6Gp6ohBpxvCWZM1uHQIC2+ySRH1rGrQ==} @@ -10808,6 +11838,10 @@ packages: /@types/minimatch/3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimatch/5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} /@types/minimist/1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} @@ -10961,6 +11995,10 @@ packages: /@types/uuid/9.0.1: resolution: {integrity: sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==} + /@types/validator/13.7.14: + resolution: {integrity: sha512-J6OAed6rhN6zyqL9Of6ZMamhlsOEU/poBVvbHr/dKOYKTeuYYMlDkMv+b6UUV0o2i0tw73cgyv/97WTWaUl0/g==} + dev: true + /@types/webidl-conversions/7.0.0: resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==} dev: true @@ -12064,6 +13102,28 @@ packages: resolution: {integrity: sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==} dev: true + /amqp-connection-manager/4.1.11_amqplib@0.10.3: + resolution: {integrity: sha512-amk3oWAFglMdX5PKSjpkrp/uVBWaEp9CfwQ/6jMgoVQx0DdU7G0aM8X1VilZfOBPwBSbOwUYS1c2LCwjJcdN/Q==} + engines: {node: '>=10.0.0', npm: '>5.0.0'} + peerDependencies: + amqplib: '*' + dependencies: + amqplib: 0.10.3 + promise-breaker: 6.0.0 + dev: true + + /amqplib/0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: true + /ansi-align/3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -12225,6 +13285,10 @@ packages: - encoding dev: false + /append-field/1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + dev: true + /aproba/2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: true @@ -12654,6 +13718,14 @@ packages: - debug dev: true + /axios/0.26.1: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: true + /axios/0.26.1_debug@4.3.4: resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} dependencies: @@ -12865,6 +13937,10 @@ packages: babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.3 dev: true + /backo2/1.0.2: + resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} + dev: true + /backoff/2.5.0: resolution: {integrity: sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==} engines: {node: '>= 0.6'} @@ -12894,6 +13970,11 @@ packages: /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /base64id/2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + dev: true + /basic-auth-connect/1.0.0: resolution: {integrity: sha512-kiV+/DTgVro4aZifY/hwRwALBISViL5NP4aReaR2EVJEObpbUBHIkdJh/YpcoEiYt7nBodZ6U2ajZeZvSxUCCg==} dev: true @@ -12959,6 +14040,17 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + /binary-install/1.0.6: + resolution: {integrity: sha512-h3K4jaC4jEauK3csXI9GxGBJldkpuJlHCIBv8i+XBNhPuxnlERnD1PWVczQYDqvhJfv0IHUbB3lhDrZUMHvSgw==} + engines: {node: '>=10'} + dependencies: + axios: 0.26.1 + rimraf: 3.0.2 + tar: 6.1.11 + transitivePeerDependencies: + - debug + dev: true + /binary-install/1.0.6_debug@4.3.4: resolution: {integrity: sha512-h3K4jaC4jEauK3csXI9GxGBJldkpuJlHCIBv8i+XBNhPuxnlERnD1PWVczQYDqvhJfv0IHUbB3lhDrZUMHvSgw==} engines: {node: '>=10'} @@ -13234,6 +14326,10 @@ packages: engines: {node: '>=0.10'} dev: true + /buffer-more-ints/1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: true + /buffer-writer/2.0.0: resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} engines: {node: '>=4'} @@ -13354,8 +14450,8 @@ packages: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.1 glob: 8.1.0 - lru-cache: 7.14.1 - minipass: 4.0.3 + lru-cache: 7.18.3 + minipass: 4.2.5 minipass-collect: 1.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -13390,6 +14486,13 @@ packages: ylru: 1.3.2 dev: false + /cache-manager/5.2.0: + resolution: {integrity: sha512-jwXDLtn8tQGS2vGDTKAhee2OhuX/2cgxlh97fqMnWp328VszIn064BFyKZ87dwp9GmlBFuHYfaVQehI85hFwIw==} + dependencies: + lodash.clonedeep: 4.5.0 + lru-cache: 7.18.3 + dev: true + /cacheable-lookup/5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -13742,6 +14845,10 @@ packages: json-parse-helpfulerror: 1.0.3 dev: true + /class-transformer/0.3.1: + resolution: {integrity: sha512-cKFwohpJbuMovS8xVLmn8N2AUbAuc8pVo4zEfsUVo8qgECOogns1WVk/FkOZoxhOPTyTYFckuoH+13FO+MQ8GA==} + dev: true + /class-utils/0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} @@ -13752,6 +14859,14 @@ packages: static-extend: 0.1.2 dev: true + /class-validator/0.14.0: + resolution: {integrity: sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==} + dependencies: + '@types/validator': 13.7.14 + libphonenumber-js: 1.10.24 + validator: 13.9.0 + dev: true + /classnames/2.3.2: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} dev: false @@ -13963,6 +15078,10 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + /code-block-writer/11.0.3: + resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} + dev: true + /code-point-at/1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} @@ -14129,6 +15248,13 @@ packages: repeat-string: 1.6.1 dev: true + /commist/1.1.0: + resolution: {integrity: sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==} + dependencies: + leven: 2.1.0 + minimist: 1.2.8 + dev: true + /common-path-prefix/3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} dev: true @@ -14183,6 +15309,26 @@ packages: /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /concat-stream/1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.7 + typedarray: 0.0.6 + dev: true + + /concat-stream/2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.0 + typedarray: 0.0.6 + dev: true + /concordance/5.0.4: resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} @@ -15800,6 +16946,31 @@ packages: dependencies: once: 1.4.0 + /engine.io-parser/5.0.6: + resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} + engines: {node: '>=10.0.0'} + dev: true + + /engine.io/6.4.1: + resolution: {integrity: sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.13 + '@types/node': 18.15.10 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4 + engine.io-parser: 5.0.6 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /enhanced-resolve/5.10.0: resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==} engines: {node: '>=10.13.0'} @@ -16189,6 +17360,36 @@ packages: '@esbuild/win32-x64': 0.16.3 dev: true + /esbuild/0.17.12: + resolution: {integrity: sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.12 + '@esbuild/android-arm64': 0.17.12 + '@esbuild/android-x64': 0.17.12 + '@esbuild/darwin-arm64': 0.17.12 + '@esbuild/darwin-x64': 0.17.12 + '@esbuild/freebsd-arm64': 0.17.12 + '@esbuild/freebsd-x64': 0.17.12 + '@esbuild/linux-arm': 0.17.12 + '@esbuild/linux-arm64': 0.17.12 + '@esbuild/linux-ia32': 0.17.12 + '@esbuild/linux-loong64': 0.17.12 + '@esbuild/linux-mips64el': 0.17.12 + '@esbuild/linux-ppc64': 0.17.12 + '@esbuild/linux-riscv64': 0.17.12 + '@esbuild/linux-s390x': 0.17.12 + '@esbuild/linux-x64': 0.17.12 + '@esbuild/netbsd-x64': 0.17.12 + '@esbuild/openbsd-x64': 0.17.12 + '@esbuild/sunos-x64': 0.17.12 + '@esbuild/win32-arm64': 0.17.12 + '@esbuild/win32-ia32': 0.17.12 + '@esbuild/win32-x64': 0.17.12 + dev: true + /esbuild/0.17.14: resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} engines: {node: '>=12'} @@ -16610,7 +17811,6 @@ packages: /eslint-plugin-mdx/2.0.5_eslint@8.25.0: resolution: {integrity: sha512-j2xN97jSlc5IoH94rJTHqYMztl46+hHzyC8Zqjx+OI1Rvv33isyf8xSSBHN6f0z8IJmgPgGsb/fH90JbvKplXg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - requiresBuild: true peerDependencies: eslint: '>=8.0.0' dependencies: @@ -17060,6 +18260,10 @@ packages: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} dev: true + /eventemitter3/3.1.2: + resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} + dev: true + /eventemitter3/4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true @@ -17486,6 +18690,28 @@ packages: resolution: {integrity: sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==} dev: true + /fastify/4.13.0: + resolution: {integrity: sha512-p9ibdFWH3pZ7KPgmfHPKGUy2W4EWU2TEpwlcu58w4CwGyU3ARFfh2kwq6zpZ5W2ZGVbufi4tZbqHIHAlX/9Z/A==} + dependencies: + '@fastify/ajv-compiler': 3.5.0 + '@fastify/error': 3.0.0 + '@fastify/fast-json-stringify-compiler': 4.2.0 + abstract-logging: 2.0.1 + avvio: 8.2.0 + fast-content-type-parse: 1.0.0 + find-my-way: 7.6.0 + light-my-request: 5.8.0 + pino: 8.6.1 + process-warning: 2.0.0 + proxy-addr: 2.0.7 + rfdc: 1.3.0 + secure-json-parse: 2.5.0 + semver: 7.3.8 + tiny-lru: 10.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /fastify/4.15.0: resolution: {integrity: sha512-m/CaRN8nf5uyYdrDe2qqq+0z3oGyE+A++qlKQoLJTI4WI0nWK9D6R3FxXQ3MVwt/md977GMR4F43pE9oqrS2zw==} dependencies: @@ -17994,6 +19220,16 @@ packages: from2: 2.3.0 dev: true + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + /follow-redirects/1.15.2_debug@4.3.4: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -18020,6 +19256,29 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true + /fork-ts-checker-webpack-plugin/8.0.0_a37q6j7dwawz22saey2vgkpwqm: + resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + dependencies: + '@babel/code-frame': 7.18.6 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 7.0.1 + deepmerge: 4.2.2 + fs-extra: 10.1.0 + memfs: 3.4.13 + minimatch: 3.1.2 + node-abort-controller: 3.0.1 + schema-utils: 3.1.1 + semver: 7.3.8 + tapable: 2.2.1 + typescript: 4.9.5 + webpack: 5.76.2_esbuild@0.17.12 + dev: true + /form-data-encoder/1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} dev: true @@ -18182,7 +19441,11 @@ packages: resolution: {integrity: sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minipass: 4.0.3 + minipass: 4.2.5 + + /fs-monkey/1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + dev: true /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -18587,6 +19850,16 @@ packages: minimatch: 5.1.0 once: 1.4.0 + /glob/9.3.1: + resolution: {integrity: sha512-qERvJb7IGsnkx6YYmaaGvDpf77c951hICMdWaFXyH3PlVob8sbPJJyJX0kWkiCWyXUzoy9UOTNjGg0RbD8bYIw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 7.4.2 + minipass: 4.2.5 + path-scurry: 1.6.2 + dev: true + /global-cache-dir/3.0.1: resolution: {integrity: sha512-xVtwdmwXiTDsw8/ul8WzhDdU7geUs+LVwJ28HUhNU6Wt2NRrEtFYbFMLrP4ynGLbQYU/rL5X5ZTQCnsjV9iNqQ==} engines: {node: '>=12.20.0'} @@ -18922,6 +20195,15 @@ packages: - utf-8-validate dev: true + /graphql-http/1.16.0_graphql@16.6.0: + resolution: {integrity: sha512-kgYFSCgTcvakPCobidCw5G4x9maDaOWmbSozt9g2nkqcUhf+FIDcLv+nL8asBDvas8rRJvoRoLkQYNC1AZfZDw==} + engines: {node: '>=12'} + peerDependencies: + graphql: '>=0.11 <=16' + dependencies: + graphql: 16.6.0 + dev: true + /graphql-http/1.7.2_graphql@16.6.0: resolution: {integrity: sha512-9RZcRZIHDKIcc+1xg4GwgNTT8ZCPi003sedqf9T87JOzoy4b91bVgBI2s7/4H2ktw4va9pLUz8FMbHuqIsxsvw==} engines: {node: '>=12'} @@ -19345,6 +20627,13 @@ packages: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: false + /help-me/3.0.0: + resolution: {integrity: sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==} + dependencies: + glob: 7.2.3 + readable-stream: 3.6.0 + dev: true + /help-me/4.1.0: resolution: {integrity: sha512-5HMrkOks2j8Fpu2j5nTLhrBhT7VwHwELpqnSnx802ckofys5MO2SkLpgSz3dgNFHV7IYFX2igm5CM75SmuYidw==} dependencies: @@ -19744,6 +21033,27 @@ packages: wrap-ansi: 7.0.0 dev: true + /inquirer/8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + /install-artifact-from-github/1.3.2: resolution: {integrity: sha512-yCFcLvqk0yQdxx0uJz4t9Z3adDMLAYrcGYv546uRXCSvxE+GqNYhhz/KmrGcUKGI/gVLR9n/e/zM9jX/+ASMJQ==} hasBin: true @@ -19763,6 +21073,11 @@ packages: engines: {node: '>=12'} dev: false + /interpret/1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + /intersection-observer/0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} dev: false @@ -20505,7 +21820,11 @@ packages: /iterall/1.3.0: resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} - dev: false + + /iterare/1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + dev: true /jest-changed-files/29.4.2: resolution: {integrity: sha512-Qdd+AXdqD16PQa+VsWJpxR3kN0JyOCX1iugQfx5nUgAsI4gwsKviXkpclxOK9ZnwaY2IQVHz+771eAvqeOlfuw==} @@ -20570,6 +21889,34 @@ packages: - ts-node dev: true + /jest-cli/29.4.2: + resolution: {integrity: sha512-b+eGUtXq/K2v7SH3QcJvFvaUaCDS1/YAZBYz0m28Q/Ppyr+1qNaHmVYikOrbHVbZqYQs2IeI3p76uy6BWbXq8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.4.2 + '@jest/test-result': 29.4.2 + '@jest/types': 29.4.2 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 29.4.2 + jest-util: 29.4.2 + jest-validate: 29.4.2 + prompts: 2.4.2 + yargs: 17.6.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest-cli/29.4.2_@types+node@18.15.10: resolution: {integrity: sha512-b+eGUtXq/K2v7SH3QcJvFvaUaCDS1/YAZBYz0m28Q/Ppyr+1qNaHmVYikOrbHVbZqYQs2IeI3p76uy6BWbXq8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -21030,6 +22377,26 @@ packages: - ts-node dev: true + /jest/29.4.2: + resolution: {integrity: sha512-+5hLd260vNIHu+7ZgMIooSpKl7Jp5pHKb51e73AJU3owd5dEo/RfVwHbA/na3C/eozrt3hJOLGf96c7EWwIAzg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.4.2 + '@jest/types': 29.4.2 + import-local: 3.1.0 + jest-cli: 29.4.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest/29.4.2_@types+node@18.15.10: resolution: {integrity: sha512-+5hLd260vNIHu+7ZgMIooSpKl7Jp5pHKb51e73AJU3owd5dEo/RfVwHbA/na3C/eozrt3hJOLGf96c7EWwIAzg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -21117,6 +22484,10 @@ packages: resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} dev: true + /js-sdsl/4.3.0: + resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} + dev: true + /js-string-escape/1.0.1: resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} engines: {node: '>= 0.8'} @@ -21401,6 +22772,11 @@ packages: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} dev: true + /kafkajs/2.2.4: + resolution: {integrity: sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==} + engines: {node: '>=14.0.0'} + dev: true + /kareem/2.4.1: resolution: {integrity: sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==} dev: true @@ -21592,6 +22968,11 @@ packages: readable-stream: 2.3.7 dev: true + /leven/2.1.0: + resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} + engines: {node: '>=0.10.0'} + dev: true + /leven/3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -21612,6 +22993,10 @@ packages: type-check: 0.4.0 dev: true + /libphonenumber-js/1.10.24: + resolution: {integrity: sha512-3Dk8f5AmrcWqg+oHhmm9hwSTqpWHBdSqsHmjCJGroULFubi0+x7JEIGmRZCuL3TI8Tx39xaKqfnhsDQ4ALa/Nw==} + dev: true + /libsodium-wrappers/0.7.11: resolution: {integrity: sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q==} dependencies: @@ -21629,6 +23014,14 @@ packages: process-warning: 2.0.0 set-cookie-parser: 2.5.1 + /light-my-request/5.8.0: + resolution: {integrity: sha512-4BtD5C+VmyTpzlDPCZbsatZMJVgUIciSOwYhJDCbLffPZ35KoDkDj4zubLeHDEb35b4kkPeEv5imbh+RJxK/Pg==} + dependencies: + cookie: 0.5.0 + process-warning: 2.0.0 + set-cookie-parser: 2.5.1 + dev: true + /lilconfig/2.0.5: resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} engines: {node: '>=10'} @@ -22097,6 +23490,10 @@ packages: resolution: {integrity: sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==} engines: {node: '>=12'} + /lru-cache/7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + /lru-memoizer/2.2.0: resolution: {integrity: sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==} dependencies: @@ -22108,6 +23505,11 @@ packages: engines: {node: '>=12'} dev: true + /macos-release/2.5.1: + resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} + engines: {node: '>=6'} + dev: true + /macos-release/3.1.0: resolution: {integrity: sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -22133,6 +23535,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /magic-string/0.29.0: + resolution: {integrity: sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + /make-dir/1.3.0: resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} engines: {node: '>=4'} @@ -22252,7 +23661,7 @@ packages: '@types/node': 17.0.45 denque: 2.1.0 iconv-lite: 0.6.3 - lru-cache: 7.14.1 + lru-cache: 7.18.3 moment-timezone: 0.5.38 dev: true @@ -22537,6 +23946,13 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + /memfs/3.4.13: + resolution: {integrity: sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.3 + dev: true + /memoize-one/5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} dev: false @@ -23145,6 +24561,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch/7.4.2: + resolution: {integrity: sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options/4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -23183,7 +24606,7 @@ packages: resolution: {integrity: sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minipass: 4.0.3 + minipass: 4.2.5 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: @@ -23217,6 +24640,10 @@ packages: resolution: {integrity: sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==} engines: {node: '>=8'} + /minipass/4.2.5: + resolution: {integrity: sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==} + engines: {node: '>=8'} + /minizlib/2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -23258,6 +24685,12 @@ packages: hasBin: true dev: true + /mnemonist/0.39.5: + resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} + dependencies: + obliterator: 2.0.4 + dev: true + /module-definition/4.0.0: resolution: {integrity: sha512-wntiAHV4lDn24BQn2kX6LKq0y85phHLHiv3aOPDF+lIs06kVjEMTe/ZTdrbVLnQV5FQsjik21taknvMhKY1Cug==} engines: {node: '>=12'} @@ -23346,6 +24779,44 @@ packages: engines: {node: '>=4.0.0'} dev: true + /mqtt-packet/6.10.0: + resolution: {integrity: sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==} + dependencies: + bl: 4.1.0 + debug: 4.3.4 + process-nextick-args: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /mqtt/4.3.7: + resolution: {integrity: sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + commist: 1.1.0 + concat-stream: 2.0.0 + debug: 4.3.4 + duplexify: 4.1.2 + help-me: 3.0.0 + inherits: 2.0.4 + lru-cache: 6.0.0 + minimist: 1.2.8 + mqtt-packet: 6.10.0 + number-allocator: 1.0.14 + pump: 3.0.0 + readable-stream: 3.6.0 + reinterval: 1.1.0 + rfdc: 1.3.0 + split2: 3.2.2 + ws: 7.5.9 + xtend: 4.0.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /mquery/4.0.3: resolution: {integrity: sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==} engines: {node: '>=12.0.0'} @@ -23387,6 +24858,19 @@ packages: - supports-color dev: true + /multer/1.4.4-lts.1: + resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} + engines: {node: '>= 6.0.0'} + dependencies: + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 1.6.2 + mkdirp: 0.5.6 + object-assign: 4.1.1 + type-is: 1.6.18 + xtend: 4.0.2 + dev: true + /multimatch/4.0.0: resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==} engines: {node: '>=8'} @@ -23480,6 +24964,13 @@ packages: resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} dev: true + /nats/2.13.1: + resolution: {integrity: sha512-lHV/DQREZVHXtavlAI5fFA7XDyN2/LNBtnNX76mPQV9BIKpTehzYrD1Hw7t/1mV4AGdrJj6U60JkQ8AMrVc6Mg==} + engines: {node: '>= 14.0.0'} + dependencies: + nkeys.js: 1.0.5 + dev: true + /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -23904,6 +25395,13 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true + /nkeys.js/1.0.5: + resolution: {integrity: sha512-u25YnRPHiGVsNzwyHnn+PT90sgAhnS8jUJ1nxmkHMFYCJ6+Ic0lv291w7uhRBpJVJ3PH2GWbYqA151lGCRrB5g==} + engines: {node: '>=10.0.0'} + dependencies: + tweetnacl: 1.0.3 + dev: true + /no-case/3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: @@ -24212,6 +25710,15 @@ packages: /nullthrows/1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + /number-allocator/1.0.14: + resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==} + dependencies: + debug: 4.3.4 + js-sdsl: 4.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /number-is-nan/1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} @@ -24328,6 +25835,10 @@ packages: es-abstract: 1.20.4 dev: true + /obliterator/2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + dev: true + /oidc-token-hash/5.0.1: resolution: {integrity: sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==} engines: {node: ^10.13.0 || >=12.0.0} @@ -24485,6 +25996,14 @@ packages: wcwidth: 1.0.1 dev: true + /os-name/4.0.1: + resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} + engines: {node: '>=10'} + dependencies: + macos-release: 2.5.1 + windows-release: 4.0.0 + dev: true + /os-name/5.0.1: resolution: {integrity: sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -24875,6 +26394,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /path-browserify/1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + /path-case/3.0.4: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} dependencies: @@ -24933,6 +26456,14 @@ packages: path-root-regex: 0.1.2 dev: true + /path-scurry/1.6.2: + resolution: {integrity: sha512-J6MQNh56h6eHFY3vsQ+Lq+zKPwn71POieutmVt2leU8W+zz8HVIdJyn3I3Zs6IKbIQtuKXirVjTBFNBcbFO44Q==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 7.18.3 + minipass: 4.2.5 + dev: true + /path-to-regexp/0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -24942,6 +26473,10 @@ packages: isarray: 0.0.1 dev: true + /path-to-regexp/3.2.0: + resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + dev: true + /path-to-regexp/6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: true @@ -26170,6 +27705,10 @@ packages: engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + /querystringify/2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -26582,6 +28121,13 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} + /rechoir/0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.1 + dev: true + /redent/3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -26608,7 +28154,6 @@ packages: /reflect-metadata/0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - dev: false /regenerate-unicode-properties/10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} @@ -26733,6 +28278,10 @@ packages: shiki: 0.14.1 dev: false + /reinterval/1.1.0: + resolution: {integrity: sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==} + dev: true + /relateurl/0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -27061,6 +28610,14 @@ packages: hasBin: true dev: true + /rimraf/4.4.0: + resolution: {integrity: sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 9.3.1 + dev: true + /robust-predicates/3.0.1: resolution: {integrity: sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==} dev: false @@ -27444,6 +29001,16 @@ packages: /shell-quote/1.7.4: resolution: {integrity: sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==} + /shelljs/0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + /shiki/0.14.1: resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==} dependencies: @@ -27619,6 +29186,41 @@ packages: - supports-color dev: true + /socket.io-adapter/2.5.2: + resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + dependencies: + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /socket.io-parser/4.2.2: + resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /socket.io/4.6.1: + resolution: {integrity: sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==} + engines: {node: '>=10.0.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + debug: 4.3.4 + engine.io: 6.4.1 + socket.io-adapter: 2.5.2 + socket.io-parser: 4.2.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /socks-proxy-agent/5.0.1: resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==} engines: {node: '>= 6'} @@ -27823,6 +29425,12 @@ packages: through2: 2.0.5 dev: true + /split2/3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.0 + dev: true + /split2/4.1.0: resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} engines: {node: '>= 10.x'} @@ -27860,7 +29468,7 @@ packages: resolution: {integrity: sha512-WVy6di9DlPOeBWEjMScpNipeSX2jIZBGEn5Uuo8Q7aIuFEuDX0pw8RxcOjlD1TWP4obi24ki7m/13+nFpcbXrw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minipass: 4.0.3 + minipass: 4.2.5 /ssri/9.0.1: resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} @@ -28218,6 +29826,23 @@ packages: resolution: {integrity: sha512-Nn2CCrG2ZaFziDxaZPN43CXqn+j7tcdjPFCkRBkFue8QYXC2HdEwnw5TCBo4yQZ2WxKYeSi0fdoOrtEqgDrXbA==} dev: false + /subscriptions-transport-ws/0.11.0_graphql@16.6.0: + resolution: {integrity: sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ==} + deprecated: The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md + peerDependencies: + graphql: ^15.7.2 || ^16.0.0 + dependencies: + backo2: 1.0.2 + eventemitter3: 3.1.2 + graphql: 16.6.0 + iterall: 1.3.0 + symbol-observable: 1.2.0 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + /sucrase/3.28.0: resolution: {integrity: sha512-TK9600YInjuiIhVM3729rH4ZKPOsGeyXUwY+Ugu9eilNbdTFyHr6XcAGYbRVZPDgWj6tgI7bx95aaJjHnbffag==} engines: {node: '>=8'} @@ -28746,6 +30371,31 @@ packages: supports-hyperlinks: 2.3.0 dev: true + /terser-webpack-plugin/5.3.6_6yi6rjuv5znmufbecyzcg64pca: + resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + esbuild: 0.17.12 + jest-worker: 27.5.1 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + terser: 5.15.1 + webpack: 5.76.2_esbuild@0.17.12 + dev: true + /terser-webpack-plugin/5.3.6_webpack@5.76.3: resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} @@ -29134,6 +30784,40 @@ packages: yargs-parser: 21.1.1 dev: true + /ts-jest/29.0.5_ggwoic2xii6eitdradnbza3bgm: + resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + bs-logger: 0.2.6 + esbuild: 0.17.12 + fast-json-stable-stringify: 2.1.0 + jest: 29.4.2 + jest-util: 29.4.2 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.8 + typescript: 4.9.5 + yargs-parser: 21.1.1 + dev: true + /ts-loader/9.4.2_3x6qlapdvvaw2noz63esh63n6e: resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} engines: {node: '>=12.0.0'} @@ -29153,6 +30837,13 @@ packages: resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==} dev: true + /ts-morph/17.0.1: + resolution: {integrity: sha512-10PkHyXmrtsTvZSL+cqtJLTgFXkU43Gd0JCc0Rw6GchWbqKe0Rwgt1v3ouobTZwQzF1mGhDeAlWYBMGRV7y+3g==} + dependencies: + '@ts-morph/common': 0.18.1 + code-block-writer: 11.0.3 + dev: true + /ts-node-dev/2.0.0_7y3inzlacsmw7h7ub2s2gkcfwu: resolution: {integrity: sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==} engines: {node: '>=0.8.0'} @@ -29433,6 +31124,15 @@ packages: resolution: {integrity: sha512-8beXMWTGEv1JfDjSxfNhe4uT5jKYdhmEUKzt4gZW9dmHlquq3b+IbEyA7vX9LjBfzHmvKnM4HiomAUCyaW2Pew==} dev: true + /tsconfig-paths-webpack-plugin/4.0.1: + resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + engines: {node: '>=10.13.0'} + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.10.0 + tsconfig-paths: 4.1.2 + dev: true + /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -29442,6 +31142,15 @@ packages: strip-bom: 3.0.0 dev: true + /tsconfig-paths/4.1.2: + resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + /tsconfig/7.0.0: resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} dependencies: @@ -29563,6 +31272,10 @@ packages: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} dev: true + /tweetnacl/1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + dev: true + /tx2/1.0.5: resolution: {integrity: sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==} dependencies: @@ -29640,6 +31353,10 @@ packages: is-typedarray: 1.0.0 dev: true + /typedarray/0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + /typescript/3.8.3: resolution: {integrity: sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==} engines: {node: '>=4.2.0'} @@ -29676,6 +31393,13 @@ packages: random-bytes: 1.0.0 dev: true + /uid/2.0.1: + resolution: {integrity: sha512-PF+1AnZgycpAIEmNtjxGBVmKbZAQguaa4pBUq6KNaGEcpzZ2klCNZLM34tsjp76maN00TttiiUf6zkIBpJQm2A==} + engines: {node: '>=8'} + dependencies: + '@lukeed/csprng': 1.0.1 + dev: true + /ulid/2.3.0: resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==} hasBin: true @@ -30059,6 +31783,13 @@ packages: prepend-http: 2.0.0 dev: true + /url-parse/1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + /url-to-options/1.0.1: resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==} engines: {node: '>= 4'} @@ -30220,6 +31951,11 @@ packages: builtins: 5.0.1 dev: true + /validator/13.9.0: + resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} + engines: {node: '>= 0.10'} + dev: true + /value-or-promise/1.0.11: resolution: {integrity: sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==} engines: {node: '>=12'} @@ -30447,11 +32183,56 @@ packages: - utf-8-validate dev: false + /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.76.2_esbuild@0.17.12: + resolution: {integrity: sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 0.0.51 + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/wasm-edit': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + acorn: 8.8.0 + acorn-import-assertions: 1.8.0_acorn@8.8.0 + browserslist: 4.21.4 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.10.0 + es-module-lexer: 0.9.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.10 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.1.1 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.6_6yi6rjuv5znmufbecyzcg64pca + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + /webpack/5.76.3: resolution: {integrity: sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==} engines: {node: '>=10.13.0'} @@ -30614,6 +32395,13 @@ packages: string-width: 5.1.2 dev: true + /windows-release/4.0.0: + resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} + engines: {node: '>=10'} + dependencies: + execa: 4.1.0 + dev: true + /windows-release/5.0.1: resolution: {integrity: sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} diff --git a/website/src/pages/v2/integrations/integration-with-nestjs.mdx b/website/src/pages/v2/integrations/integration-with-nestjs.mdx index 28505f4ab5..a67461f0ee 100644 --- a/website/src/pages/v2/integrations/integration-with-nestjs.mdx +++ b/website/src/pages/v2/integrations/integration-with-nestjs.mdx @@ -11,7 +11,7 @@ import { LatestVersionNotice } from '../../../components/latest-version-notice' [NestJS](https://nestjs.com) is a progressive Node.js framework for building efficient, reliable and scalable server-side applications. -GraphQL Yoga provides its [own Nest GraphQL Driver](https://github.com/charlypoly/graphql-yoga-nestjs) that supports building standalone GraphQL APIs and Federation GraphQL APIs (Gateway and Services). +GraphQL Yoga provides its own NestJS GraphQL Driver that supports building standalone GraphQL APIs and Federation GraphQL APIs (Gateway and Services). ## Standalone GraphQL API @@ -97,8 +97,6 @@ import { CatsModule } from './cats/cats.module' export class AppModule {} ``` -More information [on the dedicated example](https://github.com/charlypoly/graphql-yoga-nestjs/tree/master/examples/schema-first). - ### Code-First Approach The code-first approach generates the GraphQL Schema based on resolvers and models. @@ -165,15 +163,8 @@ import { RecipesModule } from './recipes/recipes.module' export class AppModule {} ``` -More information [on the dedicated example](https://github.com/charlypoly/graphql-yoga-nestjs/tree/master/examples/code-first). - ## Apollo Federation -Yoga Nest GraphQL integration supports building Apollo Federation Gateway and Services through the `YogaGatewayDriver` and `YogaFederationDriver` drivers. +Additionally, Yoga offers a separate driver called `@graphql-yoga/nestjs-federation` that supports building Apollo Federation Gateway and Services through the `YogaGatewayDriver` and `YogaFederationDriver` drivers. -A complete example [is available in the repository](https://github.com/charlypoly/graphql-yoga-nestjs/tree/master/examples/graphql-federation-code-first). - - - `YogaGatewayDriver` and `YogaFederationDriver` drivers should be used with - `graphql@15`. - +A complete example [is available in the repository](https://github.com/dotansimha/graphql-yoga/tree/main/examples/nestjs-apollo-federation-compatibility).