diff --git a/packages/shared-ts/package.json b/packages/shared-ts/package.json index 8df1221..60f7148 100644 --- a/packages/shared-ts/package.json +++ b/packages/shared-ts/package.json @@ -11,6 +11,10 @@ "./bff": { "types": "./dist/bff/index.d.ts", "default": "./dist/bff/index.js" + }, + "./federation": { + "types": "./dist/federation/index.d.ts", + "default": "./dist/federation/index.js" } }, "scripts": { @@ -24,8 +28,11 @@ "@nestjs/common": "^10.4.0", "@nestjs/core": "^10.4.0", "@paralleldrive/cuid2": "^2.2.2", + "dataloader": "^2.2.2", "drizzle-orm": "^0.31.0", + "graphql": "^16.9.0", "graphql-yoga": "^5.7.0", + "ioredis": "^5.4.0", "kafkajs": "^2.2.4", "pino": "^9.4.0", "prom-client": "^15.1.0", diff --git a/packages/shared-ts/src/federation/context.ts b/packages/shared-ts/src/federation/context.ts new file mode 100644 index 0000000..428fc18 --- /dev/null +++ b/packages/shared-ts/src/federation/context.ts @@ -0,0 +1,60 @@ +/** + * GraphQL Context - Apollo Router 下传的请求上下文 + * + * Apollo Router 通过 headers 传递以下信息到子图: + * - authorization: JWT token(透传) + * - x-user-id: 已认证用户 ID + * - x-user-role: 用户角色 + * - x-dataScope: 数据范围(ALL / SCHOOL / GRADE / CLASS / STUDENT) + * - x-request-id: 请求追踪 ID + * + * 子图从 HTTP headers 提取后构造 GraphqlContext,注入 Resolver。 + */ +export type DataScope = "ALL" | "SCHOOL" | "GRADE" | "CLASS" | "STUDENT"; + +export interface GraphqlContextInput { + userId?: string; + userRole?: string; + dataScope?: DataScope; + requestId?: string; + jwt?: string; +} + +export class GraphqlContext { + readonly userId?: string; + readonly userRole?: string; + readonly dataScope: DataScope; + readonly requestId: string; + readonly jwt?: string; + + constructor(input: GraphqlContextInput) { + this.userId = input.userId; + this.userRole = input.userRole; + this.dataScope = input.dataScope ?? "ALL"; + this.requestId = input.requestId ?? "unknown"; + this.jwt = input.jwt; + } + + /** 是否管理员(全量可见) */ + get isAdmin(): boolean { + return this.dataScope === "ALL" || this.userRole === "admin"; + } + + /** 是否已认证 */ + get isAuthenticated(): boolean { + return !!this.userId; + } + + /** 从 HTTP headers 构造(NestJS @Context 提取) */ + static fromHeaders( + headers: Record, + ): GraphqlContext { + return new GraphqlContext({ + userId: headers["x-user-id"], + userRole: headers["x-user-role"], + dataScope: headers["x-datapscope"] as DataScope | undefined, + requestId: headers["x-request-id"], + jwt: headers["authorization"]?.replace(/^Bearer\s+/i, ""), + }); + } +} diff --git a/packages/shared-ts/src/federation/dataloader.factory.ts b/packages/shared-ts/src/federation/dataloader.factory.ts new file mode 100644 index 0000000..e31091a --- /dev/null +++ b/packages/shared-ts/src/federation/dataloader.factory.ts @@ -0,0 +1,44 @@ +/** + * DataLoader 工厂 - @key Reference Resolver 强制请求合并 + * + * 强制约束(v2.1 §3.6 / ADR-035): + * 所有子图的 @key 解析器(Reference Resolver)必须使用 DataLoader + * 进行请求合并(Batching),禁止 N+1 查询。 + * + * 示例: + * ```typescript + * const examLoader = createDataLoader(async (examIds) => { + * const exams = await examRepo.findByIds([...examIds]); + * const map = new Map(exams.map((e) => [e.examId, e])); + * return examIds.map((id) => map.get(id) ?? new Error(`Exam ${id} not found`)); + * }); + * + * @ResolveReference() + * resolveReference(ref: { examId: string }): Promise { + * return this.examLoader.load(ref.examId); + * } + * ``` + */ +import DataLoader from "dataloader"; + +export type BatchLoadFn = ( + keys: ReadonlyArray, +) => Promise>; + +/** + * 创建 DataLoader 实例 + * + * 工厂模式确保每个 GraphQL 请求独立 DataLoader 实例(请求级缓存)。 + * 在 NestJS 中通过REQUEST scope provider或GraphQL Context注入。 + */ +export function createDataLoader( + batchLoadFn: BatchLoadFn, +): DataLoader { + return new DataLoader(batchLoadFn, { + // 使用 JSON.stringify 作为 cacheKeyFn,支持对象/数组 key + cacheKeyFn: (key: K): string => + typeof key === "string" ? key : JSON.stringify(key), + // 请求级缓存,不共享 + cache: true, + }); +} diff --git a/packages/shared-ts/src/federation/exception.filter.ts b/packages/shared-ts/src/federation/exception.filter.ts new file mode 100644 index 0000000..1557d40 --- /dev/null +++ b/packages/shared-ts/src/federation/exception.filter.ts @@ -0,0 +1,86 @@ +/** + * FederationExceptionFilter - 联邦层错误格式化 + * + * Apollo Router 期望子图返回结构化 GraphQL error,包含 extensions.code。 + * 此 filter 将 NestJS 异常转为符合 Apollo Federation 规范的格式。 + */ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException, + Logger, +} from "@nestjs/common"; +import { GraphQLError } from "graphql"; + +@Catch() +export class FederationExceptionFilter implements ExceptionFilter { + private readonly logger = new Logger(FederationExceptionFilter.name); + + catch(exception: unknown, _host: ArgumentsHost): void { + // GraphQL 错误已经格式化,直接抛出 + if (exception instanceof GraphQLError) { + throw exception; + } + + // HTTP 异常映射为 GraphQL error + if (exception instanceof HttpException) { + const status = exception.getStatus(); + const response = exception.getResponse(); + const message = + typeof response === "string" + ? response + : ((response as { message?: string }).message ?? exception.message); + + const code = this.mapStatusToCode(status); + + this.logger.warn( + `GraphQL exception: ${code} ${message} (status=${status})`, + ); + + throw new GraphQLError(message, { + extensions: { + code, + status, + ...(typeof response === "object" && response !== null + ? (response as Record) + : {}), + }, + }); + } + + // 未知异常 + this.logger.error( + `Unhandled GraphQL exception: ${ + exception instanceof Error ? exception.stack : String(exception) + }`, + ); + throw new GraphQLError("Internal server error", { + extensions: { + code: "INTERNAL_SERVER_ERROR", + status: 500, + }, + }); + } + + private mapStatusToCode(status: number): string { + switch (status) { + case 400: + return "BAD_REQUEST"; + case 401: + return "UNAUTHENTICATED"; + case 403: + return "FORBIDDEN"; + case 404: + return "NOT_FOUND"; + case 409: + return "CONFLICT"; + case 422: + return "UNPROCESSABLE_ENTITY"; + case 429: + return "TOO_MANY_REQUESTS"; + default: + return status >= 500 ? "INTERNAL_SERVER_ERROR" : "UNKNOWN"; + } + } +} diff --git a/packages/shared-ts/src/federation/index.ts b/packages/shared-ts/src/federation/index.ts new file mode 100644 index 0000000..65c81e6 --- /dev/null +++ b/packages/shared-ts/src/federation/index.ts @@ -0,0 +1,28 @@ +/** + * Apollo Federation 共享工具包(v2.1) + * + * 提供: + * - RouterAuthGuard:校验 Apollo Router 信任凭证,拒绝非 Router 的直接 GraphQL 请求 + * - DataLoader 工厂:@key Reference Resolver 强制使用 DataLoader 请求合并 + * - ScopeToken:大规模 ID 列表优化,Redis Set 引用 + * - GraphQL Context:统一上下文类型 + * - FederationExceptionFilter:联邦层错误格式化 + */ + +export { + RouterAuthGuard, + ROUTER_AUTH_HEADER, + type RouterAuthConfig, +} from "./router-auth.guard.js"; +export { createDataLoader, type BatchLoadFn } from "./dataloader.factory.js"; +export { + ScopeTokenService, + SCOPE_TOKEN_TTL_SECONDS, + type ScopeToken, +} from "./scope-token.js"; +export { + GraphqlContext, + type GraphqlContextInput, + type DataScope, +} from "./context.js"; +export { FederationExceptionFilter } from "./exception.filter.js"; diff --git a/packages/shared-ts/src/federation/router-auth.guard.ts b/packages/shared-ts/src/federation/router-auth.guard.ts new file mode 100644 index 0000000..81ffa9b --- /dev/null +++ b/packages/shared-ts/src/federation/router-auth.guard.ts @@ -0,0 +1,76 @@ +/** + * RouterAuthGuard - Apollo Router 信任凭证校验 + * + * 强制约束(v2.1 §3.7 / ADR-036): + * Apollo Router 请求子图时必须携带 Router-Authorization Header, + * 各服务 NestJS Guard 拦截并校验,拒绝任何非 Router 发起的 GraphQL 请求。 + * + * 部署模式: + * - 生产:ROUTER_AUTH_SECRET 环境变量配置共享密钥 + * - 开发:DEV_MODE=true 时跳过校验(仅限本地) + */ +import { + CanActivate, + ExecutionContext, + Injectable, + ForbiddenException, + Logger, +} from "@nestjs/common"; + +export const ROUTER_AUTH_HEADER = "router-authorization"; + +export interface RouterAuthConfig { + /** 共享密钥(生产环境由 Secret 注入) */ + secret: string; + /** 开发模式跳过校验 */ + devMode?: boolean; +} + +@Injectable() +export class RouterAuthGuard implements CanActivate { + private readonly logger = new Logger(RouterAuthGuard.name); + private readonly config: RouterAuthConfig; + + constructor(config: RouterAuthConfig) { + this.config = config; + } + + canActivate(ctx: ExecutionContext): boolean { + if (this.config.devMode === true) { + return true; + } + + const req = ctx.switchToHttp().getRequest<{ + headers: Record; + url: string; + }>(); + + // 健康检查端点豁免 + if (req.url?.startsWith("/health") || req.url?.startsWith("/ready")) { + return true; + } + + const routerAuth = req.headers[ROUTER_AUTH_HEADER]; + const expected = this.config.secret; + + if (!expected) { + this.logger.error( + `${ROUTER_AUTH_HEADER} secret not configured (ROUTER_AUTH_SECRET env required)`, + ); + throw new ForbiddenException( + "Router authorization not configured on server", + ); + } + + if (!routerAuth || routerAuth !== expected) { + this.logger.warn( + `Direct GraphQL access denied (path=${req.url}); must go through Apollo Router`, + ); + throw new ForbiddenException( + "Direct GraphQL access denied; must go through Apollo Router", + ); + } + + return true; + } +} diff --git a/packages/shared-ts/src/federation/scope-token.ts b/packages/shared-ts/src/federation/scope-token.ts new file mode 100644 index 0000000..b3ec264 --- /dev/null +++ b/packages/shared-ts/src/federation/scope-token.ts @@ -0,0 +1,105 @@ +/** + * ScopeToken - 大规模 ID 列表优化 + * + * 强制约束(v2.1 §5.2 / ADR-041): + * 不直接在 GraphQL 联邦中传递全量 ID 数组,而是传递一个轻量的 ScopeToken。 + * iam 子图计算出 visibleClassIds 后,存入 Redis Set,生成并返回极短的 scopeToken。 + * Router 仅通过 @requires 传递 scopeToken。 + * core-edu 拿到 scopeToken 后,从 Redis SMEMBERS 获取实际 ID 数组。 + * + * Token 格式:`usr:{userId}:cls_scope`(或 `usr:{userId}:stu_scope` 等) + * Redis Key:`scope:{token}` + * Redis 类型:SET + * TTL:5 分钟(SCOPE_TOKEN_TTL_SECONDS) + */ +import type { Redis } from "ioredis"; + +export const SCOPE_TOKEN_TTL_SECONDS = 300; // 5 分钟 + +export type ScopeToken = string & { readonly __brand: "ScopeToken" }; + +export type ScopeKind = "cls_scope" | "stu_scope" | "sub_scope" | "notif_scope"; + +/** + * ScopeToken 服务 + * + * 职责: + * - 生成 token(基于 userId + kind) + * - 将 ID 列表存入 Redis Set(带 TTL) + * - 读取 token 对应的 ID 列表(SMEMBERS) + * - 支持 "ALL" 特殊值(跳过 Redis,全量可见) + */ +export class ScopeTokenService { + constructor(private readonly redis: Redis) {} + + /** + * 生成并存储 ScopeToken + * + * @param userId 用户 ID + * @param kind Scope 类型 + * @param ids 可见 ID 列表 + * @returns ScopeToken(如 "usr:123:cls_scope")或 "ALL"(ids 为空表示全量可见) + */ + async issueScopeToken( + userId: string, + kind: ScopeKind, + ids: string[], + ): Promise { + // 空列表在业务上通常表示"全量可见"(管理员),返回 "ALL" 特殊值 + if (ids.length === 0) { + return "ALL"; + } + + const token = `usr:${userId}:${kind}` as ScopeToken; + const redisKey = `scope:${token}`; + + // 用 pipeline 减少 RTT + const pipeline = this.redis.pipeline(); + pipeline.del(redisKey); + pipeline.sadd(redisKey, ...ids); + pipeline.expire(redisKey, SCOPE_TOKEN_TTL_SECONDS); + await pipeline.exec(); + + return token; + } + + /** + * 解析 ScopeToken 为实际 ID 列表 + * + * @param token ScopeToken 或 "ALL" + * @returns ID 列表;"ALL" 返回 null(表示无过滤) + */ + async resolveScopeToken(token: ScopeToken | "ALL"): Promise { + if (token === "ALL") { + return null; // null 表示全量可见,调用方应跳过 WHERE IN 过滤 + } + + const redisKey = `scope:${token}`; + const ids = await this.redis.smembers(redisKey); + + if (ids.length === 0) { + // token 过期或不存在,调用方应触发重新签发(401/403 由 Resolver 处理) + return []; + } + + return ids; + } + + /** + * 刷新 token TTL(访问时续期) + */ + async refreshTtl(token: ScopeToken): Promise { + if (token === "ALL") return; + const redisKey = `scope:${token}`; + await this.redis.expire(redisKey, SCOPE_TOKEN_TTL_SECONDS); + } + + /** + * 撤销 token(用户权限变更时) + */ + async revokeToken(userId: string, kind: ScopeKind): Promise { + const token = `usr:${userId}:${kind}` as ScopeToken; + const redisKey = `scope:${token}`; + await this.redis.del(redisKey); + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0a9c9e..6fa6b19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -595,12 +595,21 @@ importers: '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 + dataloader: + specifier: ^2.2.2 + version: 2.2.3 drizzle-orm: specifier: ^0.31.0 version: 0.31.0(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(@types/react@18.3.31)(better-sqlite3@11.3.0)(mysql2@3.22.6(@types/node@22.20.1))(react@18.3.0) + graphql: + specifier: ^16.9.0 + version: 16.14.2 graphql-yoga: specifier: ^5.7.0 version: 5.21.2(graphql@16.14.2) + ioredis: + specifier: ^5.4.0 + version: 5.11.1 kafkajs: specifier: ^2.2.4 version: 2.2.4 @@ -939,6 +948,9 @@ importers: services/iam: dependencies: + '@apollo/subgraph': + specifier: ^2.2.3 + version: 2.14.2(graphql@16.14.2) '@edu/shared-ts': specifier: workspace:* version: link:../../packages/shared-ts @@ -948,12 +960,18 @@ importers: '@grpc/proto-loader': specifier: ^0.7.13 version: 0.7.13 + '@nestjs/apollo': + specifier: ^12.2.0 + version: 12.2.0(@apollo/server@4.13.0(encoding@0.1.13)(graphql@16.14.2))(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(@nestjs/graphql@12.2.0(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(graphql@16.14.2)(reflect-metadata@0.2.2))(graphql@16.14.2) '@nestjs/common': specifier: ^10.4.0 version: 10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': specifier: ^10.4.0 version: 10.4.22(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@10.4.22)(@nestjs/platform-express@10.4.22)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/graphql': + specifier: ^12.2.0 + version: 12.2.0(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(graphql@16.14.2)(reflect-metadata@0.2.2) '@nestjs/microservices': specifier: ^10.4.0 version: 10.4.22(@grpc/grpc-js@1.14.4)(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(ioredis@5.11.1)(kafkajs@2.2.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -975,9 +993,15 @@ importers: bcrypt: specifier: ^5.1.0 version: 5.1.1(encoding@0.1.13) + dataloader: + specifier: ^2.2.2 + version: 2.2.3 drizzle-orm: specifier: ^0.31.0 version: 0.31.0(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(@types/react@18.3.31)(better-sqlite3@11.3.0)(mysql2@3.22.6(@types/node@22.20.1))(react@18.3.0) + graphql: + specifier: ^16.9.0 + version: 16.14.2 ioredis: specifier: ^5.4.0 version: 5.11.1 @@ -1462,6 +1486,112 @@ packages: resolution: {integrity: sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@apollo/cache-control-types@1.0.3': + resolution: {integrity: sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g==} + peerDependencies: + graphql: 14.x || 15.x || 16.x + + '@apollo/federation-internals@2.14.2': + resolution: {integrity: sha512-6+de7KrV53x3I+RNjTaFzjT6INmI1dJ1uLbgPhVBcBEk9lbJ9BwyOWwBYpMuVFAgEuqMHb0/2qy/gme93j/ciA==} + engines: {node: '>=18'} + peerDependencies: + graphql: ^16.5.0 + + '@apollo/protobufjs@1.2.8': + resolution: {integrity: sha512-r7xNeUqZX+eBBEmyvaPw0/cSz6zgf5jdH8mjUz8ynKpNs/GU7vi2T7sNcZINk2ZID7wwjG91FCgdpCrQuJ8rzA==} + hasBin: true + + '@apollo/server-gateway-interface@1.1.1': + resolution: {integrity: sha512-pGwCl/po6+rxRmDMFgozKQo2pbsSwE91TpsDBAOgf74CRDPXHHtM88wbwjab0wMMZh95QfR45GGyDIdhY24bkQ==} + deprecated: '@apollo/server-gateway-interface v1 is part of Apollo Server v4, which is deprecated and will transition to end-of-life on January 26, 2026. As long as you are already using a non-EOL version of Node.js, upgrading to v2 should take only a few minutes. See https://www.apollographql.com/docs/apollo-server/previous-versions for details.' + peerDependencies: + graphql: 14.x || 15.x || 16.x + + '@apollo/server-plugin-landing-page-graphql-playground@4.0.0': + resolution: {integrity: sha512-PBDtKI/chJ+hHeoJUUH9Kuqu58txQl00vUGuxqiC9XcReulIg7RjsyD0G1u3drX4V709bxkL5S0nTeXfRHD0qA==} + engines: {node: '>=14.0'} + deprecated: The use of GraphQL Playground in Apollo Server was supported in previous versions, but this is no longer the case as of December 31, 2022. This package exists for v4 migration purposes only. We do not intend to resolve security issues or other bugs with this package if they arise, so please migrate away from this to [Apollo Server's default Explorer](https://www.apollographql.com/docs/apollo-server/api/plugin/landing-pages) as soon as possible. + peerDependencies: + '@apollo/server': ^4.0.0 + + '@apollo/server@4.13.0': + resolution: {integrity: sha512-t4GzaRiYIcPwYy40db6QjZzgvTr9ztDKBddykUXmBb2SVjswMKXbkaJ5nPeHqmT3awr9PAaZdCZdZhRj55I/8A==} + engines: {node: '>=14.16.0'} + peerDependencies: + graphql: ^16.6.0 + + '@apollo/subgraph@2.14.2': + resolution: {integrity: sha512-myBXcjP0tGJbd4q6JZjFfyoZnM+Pz7jXjkLMpG2WvWE4Q/9c+K1yRkqlUoX5Ls4gUyRP8xYqnDLFziBz1whtFg==} + engines: {node: '>=14.15.0'} + peerDependencies: + graphql: ^16.5.0 + + '@apollo/usage-reporting-protobuf@4.1.2': + resolution: {integrity: sha512-aTnAD41RYz0d5dawlyR5Iclkgzx0Xb0njUJmEfvZ6pS4f4HU8wCYyctPpWat/HWp2PmRwDfX5R1k4uVcDKZ4xA==} + + '@apollo/utils.createhash@2.0.2': + resolution: {integrity: sha512-UkS3xqnVFLZ3JFpEmU/2cM2iKJotQXMoSTgxXsfQgXLC5gR1WaepoXagmYnPSA7Q/2cmnyTYK5OgAgoC4RULPg==} + engines: {node: '>=14'} + + '@apollo/utils.dropunuseddefinitions@2.0.1': + resolution: {integrity: sha512-EsPIBqsSt2BwDsv8Wu76LK5R1KtsVkNoO4b0M5aK0hx+dGg9xJXuqlr7Fo34Dl+y83jmzn+UvEW+t1/GP2melA==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + + '@apollo/utils.fetcher@2.0.1': + resolution: {integrity: sha512-jvvon885hEyWXd4H6zpWeN3tl88QcWnHp5gWF5OPF34uhvoR+DFqcNxs9vrRaBBSY3qda3Qe0bdud7tz2zGx1A==} + engines: {node: '>=14'} + + '@apollo/utils.isnodelike@2.0.1': + resolution: {integrity: sha512-w41XyepR+jBEuVpoRM715N2ZD0xMD413UiJx8w5xnAZD2ZkSJnMJBoIzauK83kJpSgNuR6ywbV29jG9NmxjK0Q==} + engines: {node: '>=14'} + + '@apollo/utils.keyvaluecache@2.1.1': + resolution: {integrity: sha512-qVo5PvUUMD8oB9oYvq4ViCjYAMWnZ5zZwEjNF37L2m1u528x5mueMlU+Cr1UinupCgdB78g+egA1G98rbJ03Vw==} + engines: {node: '>=14'} + + '@apollo/utils.logger@2.0.1': + resolution: {integrity: sha512-YuplwLHaHf1oviidB7MxnCXAdHp3IqYV8n0momZ3JfLniae92eYqMIx+j5qJFX6WKJPs6q7bczmV4lXIsTu5Pg==} + engines: {node: '>=14'} + + '@apollo/utils.printwithreducedwhitespace@2.0.1': + resolution: {integrity: sha512-9M4LUXV/fQBh8vZWlLvb/HyyhjJ77/I5ZKu+NBWV/BmYGyRmoEP9EVAy7LCVoY3t8BDcyCAGfxJaLFCSuQkPUg==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + + '@apollo/utils.removealiases@2.0.1': + resolution: {integrity: sha512-0joRc2HBO4u594Op1nev+mUF6yRnxoUH64xw8x3bX7n8QBDYdeYgY4tF0vJReTy+zdn2xv6fMsquATSgC722FA==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + + '@apollo/utils.sortast@2.0.1': + resolution: {integrity: sha512-eciIavsWpJ09za1pn37wpsCGrQNXUhM0TktnZmHwO+Zy9O4fu/WdB4+5BvVhFiZYOXvfjzJUcc+hsIV8RUOtMw==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + + '@apollo/utils.stripsensitiveliterals@2.0.1': + resolution: {integrity: sha512-QJs7HtzXS/JIPMKWimFnUMK7VjkGQTzqD9bKD1h3iuPAqLsxd0mUNVbkYOPTsDhUKgcvUOfOqOJWYohAKMvcSA==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + + '@apollo/utils.usagereporting@2.1.0': + resolution: {integrity: sha512-LPSlBrn+S17oBy5eWkrRSGb98sWmnEzo3DPTZgp8IQc8sJe0prDgDuppGq4NeQlpoqEHz0hQeYHAOA0Z3aQsxQ==} + engines: {node: '>=14'} + peerDependencies: + graphql: 14.x || 15.x || 16.x + + '@apollo/utils.withrequired@2.0.1': + resolution: {integrity: sha512-YBDiuAX9i1lLc6GeTy1m7DGLFn/gMnvXqlalOIMjM7DeOgIacEjjfwPqb0M1CQ2v11HhR15d1NmxJoRCfrNqcA==} + engines: {node: '>=14'} + + '@apollographql/graphql-playground-html@1.6.29': + resolution: {integrity: sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA==} + '@ardatan/relay-compiler@13.0.1': resolution: {integrity: sha512-afG3YPwuSA0E5foouZusz5GlXKs74dObv4cuWyLyfKsYFj2r7oGRNB28v18HvwuLSQtQFCi+DpIe0TZkgQDYyg==} peerDependencies: @@ -2562,6 +2692,17 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/merge@8.3.2': + resolution: {integrity: sha512-r8TFlDFA9N4hbkKbHCUK5pkiSnVUsB5AtcyhoY1d3b9zNa9CAYgxZMkKZgDJAf9ZTIqki9t0eOW/jn1H4MCFsg==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/merge@9.0.4': + resolution: {integrity: sha512-MivbDLUQ+4Q8G/Hp/9V72hbn810IJDEZQ57F01sHnlrrijyadibfVhaQfW/pNH+9T/l8ySZpaR/DpL5i+ruZ+g==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/merge@9.2.0': resolution: {integrity: sha512-kChDH/sOxm3TCICup5NgTiz/aJBk+5GAuC0lfJS8FcRfsqZvlCkNwpsYTGAATBCJMrgZ9+csRugCjS97jPcNMw==} engines: {node: '>=16.0.0'} @@ -2593,6 +2734,17 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/schema@10.0.4': + resolution: {integrity: sha512-HuIwqbKxPaJujox25Ra4qwz0uQzlpsaBOzO6CVfzB/MemZdd+Gib8AIvfhQArK0YIN40aDran/yi+E5Xf0mQww==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/schema@9.0.0': + resolution: {integrity: sha512-H1rlt0tptzYE1jnKGjfmMvvMCwsDTUgCy3Eam9agsPP4ZtHAcwijDx3BKKJaV1fDRV5ztz2aJ5Q7+4s/SMOYvQ==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/url-loader@8.0.0': resolution: {integrity: sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==} engines: {node: '>=16.0.0'} @@ -2617,6 +2769,12 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/utils@10.2.3': + resolution: {integrity: sha512-j7x0sO0VtWVhD3FubyY42abx+g61/at5W5Y3DSOckPkBo7yVjkcnAsXoB4jiUnznhGme/o+uX5VgA8HrjyR5ZQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/utils@10.6.0': resolution: {integrity: sha512-bqSn2ekSNwFVZprY6YsrHkqPA7cPLNKxiPlEzS1djhfvx4q9tx7Uwc5dnLp3SSnKinJ8dJk9FA5sxNcKjCM44w==} engines: {node: '>=16.0.0'} @@ -2629,6 +2787,11 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/utils@8.9.1': + resolution: {integrity: sha512-LHR7U4okICeUap+WV/T1FnLOmTr3KYuphgkXYendaBVO/DXKyc+TeOFBiN1LcEjPqCB8hO+0B0iTIO0cGqhNTA==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/wrap@10.0.0': resolution: {integrity: sha512-HDOeUUh6UhpiH0WPJUQl44ODt1x5pnMUbOJZ7GjTdGQ7LK0AgVt3ftaAQ9duxLkiAtYJmu5YkULirfZGj4HzDg==} engines: {node: '>=16.0.0'} @@ -2935,6 +3098,25 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@nestjs/apollo@12.2.0': + resolution: {integrity: sha512-z1zpbgrxaEaIdP6luiDdQ6f4OH3/xhszakxekXFvLq77wqO3nezKvZvz/etTaSlVW5y06jaCYKhypfXVv4sgzQ==} + peerDependencies: + '@apollo/gateway': ^2.0.0 + '@apollo/server': ^4.3.2 + '@apollo/subgraph': ^2.0.0 + '@as-integrations/fastify': ^1.3.0 || ^2.0.0 + '@nestjs/common': ^9.3.8 || ^10.0.0 + '@nestjs/core': ^9.3.8 || ^10.0.0 + '@nestjs/graphql': ^12.0.0 + graphql: ^16.6.0 + peerDependenciesMeta: + '@apollo/gateway': + optional: true + '@apollo/subgraph': + optional: true + '@as-integrations/fastify': + optional: true + '@nestjs/cli@10.4.0': resolution: {integrity: sha512-NIoYRA5cnpQPyj+dde4CgJVEt3NUZ7xoyzyP8ANSdJYSdRe1WMryL9jzDZeIin1iPDnvbmMr+Ft20jpQmDkTXQ==} engines: {node: '>= 16.14'} @@ -2978,6 +3160,40 @@ packages: '@nestjs/websockets': optional: true + '@nestjs/graphql@12.2.0': + resolution: {integrity: sha512-du/aI+EXADxtJrHF1mAXR6RYRHuEWPNnJyHTmIOPW2Wx5qN32P7lQoHGD7TySATMl5aa47w05lPzxcasdUmpMQ==} + peerDependencies: + '@apollo/subgraph': ^2.0.0 + '@nestjs/common': ^9.3.8 || ^10.0.0 + '@nestjs/core': ^9.3.8 || ^10.0.0 + class-transformer: '*' + class-validator: '*' + graphql: ^16.6.0 + reflect-metadata: ^0.1.13 || ^0.2.0 + ts-morph: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 + peerDependenciesMeta: + '@apollo/subgraph': + optional: true + class-transformer: + optional: true + class-validator: + optional: true + ts-morph: + optional: true + + '@nestjs/mapped-types@2.0.5': + resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + '@nestjs/microservices@10.4.22': resolution: {integrity: sha512-9Oxc0jQuppGLaQv5yaB2tVS2rAZzZ9NqDS1A4UlDLiYwJB7M6e89G6tmyOQjGjPwgoXPxQS4Vg2voSiKiED2gw==} peerDependencies: @@ -4546,6 +4762,9 @@ packages: '@protobufjs/float@1.0.2': resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + '@protobufjs/inquire@1.1.2': + resolution: {integrity: sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==} + '@protobufjs/path@1.1.2': resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} @@ -5127,6 +5346,9 @@ packages: '@types/lodash@4.17.24': resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + '@types/memcached@2.2.10': resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} @@ -5142,6 +5364,9 @@ packages: '@types/mysql@2.15.26': resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + '@types/node@18.11.18': resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} @@ -5219,6 +5444,9 @@ packages: '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -5687,6 +5915,9 @@ packages: async-lock@1.4.1: resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -5732,6 +5963,9 @@ packages: react-native-b4a: optional: true + backo2@1.0.2: + resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} + balanced-match@1.0.0: resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==} @@ -6082,6 +6316,9 @@ packages: commander@2.20.0: resolution: {integrity: sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.0.0: resolution: {integrity: sha512-SEa2abMBTZuEjLVYpNrAFoRgxPwG4rXP3+SGY6CM/HZGeDzIA7Pzp+7H3AHDukKEpyy2SoSGGPShKqqfH9T9AQ==} engines: {node: '>= 6'} @@ -6174,6 +6411,10 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + cosmiconfig-typescript-loader@5.0.0: resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} @@ -6219,6 +6460,10 @@ packages: cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-inspect@1.0.0: + resolution: {integrity: sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==} + engines: {node: '>=16.0.0'} + cross-inspect@1.0.1: resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} engines: {node: '>=16.0.0'} @@ -6235,6 +6480,9 @@ packages: engines: {node: '>=4'} hasBin: true + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + cssstyle@4.0.1: resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} engines: {node: '>=18'} @@ -6785,6 +7033,9 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + eventemitter3@3.1.0: + resolution: {integrity: sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==} + eventemitter3@4.0.1: resolution: {integrity: sha512-MnI0l35oYL2C/c80rjJN7qu50MDx39yYE7y7oYck2YA3v+y7EaAenY8IU8AP4d1RWqE8VAKWFGSh3rfP87ll3g==} @@ -6840,6 +7091,10 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -7175,6 +7430,12 @@ packages: peerDependencies: graphql: 14 - 16 + graphql-tag@2.12.6: + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql-tag@2.12.7: resolution: {integrity: sha512-xnE/NFzy+0eIesvAsREJZ284zTl/wYuBAvpsFSDhRGRdRHdnE90M21Q3xAWyYInb0J756c6x0pIQ62+vtvOs1Q==} engines: {node: '>=10'} @@ -7193,6 +7454,12 @@ packages: peerDependencies: graphql: '>=0.11 <=16' + graphql-ws@5.16.0: + resolution: {integrity: sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==} + engines: {node: '>=10'} + peerDependencies: + graphql: '>=0.11 <=16' + graphql-ws@6.1.0: resolution: {integrity: sha512-7ft6KWkuaLnLABwzEIimjUMeF0iByo2ThD6q0MICgsvp6nDuT5ppubKzEHniu8Kmlp5GNsLgr5dil8JMrIwUEQ==} engines: {node: '>=20'} @@ -7683,6 +7950,9 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} + iterall@1.3.0: + resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} + iterare@1.2.1: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} @@ -7726,6 +7996,10 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + js-tokens@3.0.0: resolution: {integrity: sha512-poXEQHPMmTrYZuJgNRll2sbc3kJsSU1m/g1Q93IE6txNj3p6xOOOmdj1G/zCVGawYSPzTkSoWGg1otqbeqKJeg==} @@ -7912,6 +8186,10 @@ packages: lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + lodash.omit@4.5.0: + resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} + deprecated: This package is deprecated. Use destructuring assignment syntax instead. + lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} @@ -7933,6 +8211,9 @@ packages: lodash.upperfirst@4.3.1: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} @@ -7951,9 +8232,16 @@ packages: resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + long-timeout@0.1.1: resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -9031,6 +9319,10 @@ packages: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + rettime@0.11.11: resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} @@ -9191,6 +9483,11 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -9489,6 +9786,12 @@ packages: babel-plugin-macros: optional: true + subscriptions-transport-ws@0.11.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 + sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -9509,6 +9812,10 @@ packages: swap-case@2.0.2: resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} + symbol-observable@1.2.0: + resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} + engines: {node: '>=0.10.0'} + symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} @@ -9695,6 +10002,10 @@ packages: resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} engines: {node: '>=14.14'} + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -10041,9 +10352,17 @@ packages: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + value-or-promise@1.0.11: + resolution: {integrity: sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==} + engines: {node: '>=12'} + value-or-promise@1.0.12: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} engines: {node: '>=12'} @@ -10179,6 +10498,10 @@ packages: engines: {node: '>=18'} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} @@ -10285,6 +10608,18 @@ packages: utf-8-validate: optional: true + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} @@ -10304,6 +10639,11 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -10447,6 +10787,141 @@ snapshots: transitivePeerDependencies: - chokidar + '@apollo/cache-control-types@1.0.3(graphql@16.14.2)': + dependencies: + graphql: 16.14.2 + + '@apollo/federation-internals@2.14.2(graphql@16.14.2)': + dependencies: + '@types/uuid': 9.0.8 + chalk: 4.1.2 + graphql: 16.14.2 + js-levenshtein: 1.1.6 + uuid: 9.0.0 + + '@apollo/protobufjs@1.2.8': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.2 + '@types/long': 4.0.2 + long: 4.0.0 + + '@apollo/server-gateway-interface@1.1.1(graphql@16.14.2)': + dependencies: + '@apollo/usage-reporting-protobuf': 4.1.2 + '@apollo/utils.fetcher': 2.0.1 + '@apollo/utils.keyvaluecache': 2.1.1 + '@apollo/utils.logger': 2.0.1 + graphql: 16.14.2 + + '@apollo/server-plugin-landing-page-graphql-playground@4.0.0(@apollo/server@4.13.0(encoding@0.1.13)(graphql@16.14.2))': + dependencies: + '@apollo/server': 4.13.0(encoding@0.1.13)(graphql@16.14.2) + '@apollographql/graphql-playground-html': 1.6.29 + + '@apollo/server@4.13.0(encoding@0.1.13)(graphql@16.14.2)': + dependencies: + '@apollo/cache-control-types': 1.0.3(graphql@16.14.2) + '@apollo/server-gateway-interface': 1.1.1(graphql@16.14.2) + '@apollo/usage-reporting-protobuf': 4.1.2 + '@apollo/utils.createhash': 2.0.2 + '@apollo/utils.fetcher': 2.0.1 + '@apollo/utils.isnodelike': 2.0.1 + '@apollo/utils.keyvaluecache': 2.1.1 + '@apollo/utils.logger': 2.0.1 + '@apollo/utils.usagereporting': 2.1.0(graphql@16.14.2) + '@apollo/utils.withrequired': 2.0.1 + '@graphql-tools/schema': 9.0.0(graphql@16.14.2) + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.9 + '@types/node-fetch': 2.6.13 + async-retry: 1.3.3 + content-type: 1.0.5 + cors: 2.8.6 + express: 4.22.1 + graphql: 16.14.2 + loglevel: 1.9.2 + lru-cache: 7.14.1 + negotiator: 0.6.4 + node-abort-controller: 3.1.1 + node-fetch: 2.7.0(encoding@0.1.13) + uuid: 9.0.0 + whatwg-mimetype: 3.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@apollo/subgraph@2.14.2(graphql@16.14.2)': + dependencies: + '@apollo/cache-control-types': 1.0.3(graphql@16.14.2) + '@apollo/federation-internals': 2.14.2(graphql@16.14.2) + graphql: 16.14.2 + + '@apollo/usage-reporting-protobuf@4.1.2': + dependencies: + '@apollo/protobufjs': 1.2.8 + + '@apollo/utils.createhash@2.0.2': + dependencies: + '@apollo/utils.isnodelike': 2.0.1 + sha.js: 2.4.12 + + '@apollo/utils.dropunuseddefinitions@2.0.1(graphql@16.14.2)': + dependencies: + graphql: 16.14.2 + + '@apollo/utils.fetcher@2.0.1': {} + + '@apollo/utils.isnodelike@2.0.1': {} + + '@apollo/utils.keyvaluecache@2.1.1': + dependencies: + '@apollo/utils.logger': 2.0.1 + lru-cache: 7.14.1 + + '@apollo/utils.logger@2.0.1': {} + + '@apollo/utils.printwithreducedwhitespace@2.0.1(graphql@16.14.2)': + dependencies: + graphql: 16.14.2 + + '@apollo/utils.removealiases@2.0.1(graphql@16.14.2)': + dependencies: + graphql: 16.14.2 + + '@apollo/utils.sortast@2.0.1(graphql@16.14.2)': + dependencies: + graphql: 16.14.2 + lodash.sortby: 4.7.0 + + '@apollo/utils.stripsensitiveliterals@2.0.1(graphql@16.14.2)': + dependencies: + graphql: 16.14.2 + + '@apollo/utils.usagereporting@2.1.0(graphql@16.14.2)': + dependencies: + '@apollo/usage-reporting-protobuf': 4.1.2 + '@apollo/utils.dropunuseddefinitions': 2.0.1(graphql@16.14.2) + '@apollo/utils.printwithreducedwhitespace': 2.0.1(graphql@16.14.2) + '@apollo/utils.removealiases': 2.0.1(graphql@16.14.2) + '@apollo/utils.sortast': 2.0.1(graphql@16.14.2) + '@apollo/utils.stripsensitiveliterals': 2.0.1(graphql@16.14.2) + graphql: 16.14.2 + + '@apollo/utils.withrequired@2.0.1': {} + + '@apollographql/graphql-playground-html@1.6.29': + dependencies: + xss: 1.0.15 + '@ardatan/relay-compiler@13.0.1(graphql@16.14.2)': dependencies: '@babel/runtime': 7.29.7 @@ -11404,7 +11879,7 @@ snapshots: dependencies: graphql: 16.14.2 lodash.sortby: 4.7.0 - tslib: 2.6.3 + tslib: 2.8.1 '@graphql-tools/executor-common@1.0.6(graphql@16.14.2)': dependencies: @@ -11591,6 +12066,18 @@ snapshots: p-limit: 3.1.0 tslib: 2.8.1 + '@graphql-tools/merge@8.3.2(graphql@16.14.2)': + dependencies: + '@graphql-tools/utils': 8.9.1(graphql@16.14.2) + graphql: 16.14.2 + tslib: 2.8.1 + + '@graphql-tools/merge@9.0.4(graphql@16.14.2)': + dependencies: + '@graphql-tools/utils': 10.6.0(graphql@16.14.2) + graphql: 16.14.2 + tslib: 2.8.1 + '@graphql-tools/merge@9.2.0(graphql@16.14.2)': dependencies: '@graphql-tools/utils': 11.2.0(graphql@16.14.2) @@ -11600,7 +12087,7 @@ snapshots: '@graphql-tools/optimize@2.0.0(graphql@16.14.2)': dependencies: graphql: 16.14.2 - tslib: 2.6.3 + tslib: 2.8.1 '@graphql-tools/prisma-loader@8.0.17(@types/node@22.20.1)(encoding@0.1.13)(graphql@16.14.2)': dependencies: @@ -11633,7 +12120,7 @@ snapshots: '@ardatan/relay-compiler': 13.0.1(graphql@16.14.2) '@graphql-tools/utils': 11.2.0(graphql@16.14.2) graphql: 16.14.2 - tslib: 2.6.3 + tslib: 2.8.1 '@graphql-tools/schema@10.0.36(graphql@16.14.2)': dependencies: @@ -11642,6 +12129,22 @@ snapshots: graphql: 16.14.2 tslib: 2.8.1 + '@graphql-tools/schema@10.0.4(graphql@16.14.2)': + dependencies: + '@graphql-tools/merge': 9.2.0(graphql@16.14.2) + '@graphql-tools/utils': 10.6.0(graphql@16.14.2) + graphql: 16.14.2 + tslib: 2.8.1 + value-or-promise: 1.0.12 + + '@graphql-tools/schema@9.0.0(graphql@16.14.2)': + dependencies: + '@graphql-tools/merge': 8.3.2(graphql@16.14.2) + '@graphql-tools/utils': 8.9.1(graphql@16.14.2) + graphql: 16.14.2 + tslib: 2.8.1 + value-or-promise: 1.0.11 + '@graphql-tools/url-loader@8.0.0(@types/node@22.20.1)(encoding@0.1.13)(graphql@16.14.2)': dependencies: '@ardatan/sync-fetch': 0.0.1(encoding@0.1.13) @@ -11715,6 +12218,14 @@ snapshots: graphql: 16.14.2 tslib: 2.8.1 + '@graphql-tools/utils@10.2.3(graphql@16.14.2)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.14.2) + cross-inspect: 1.0.0 + dset: 3.1.4 + graphql: 16.14.2 + tslib: 2.8.1 + '@graphql-tools/utils@10.6.0(graphql@16.14.2)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.14.2) @@ -11731,6 +12242,11 @@ snapshots: graphql: 16.14.2 tslib: 2.8.1 + '@graphql-tools/utils@8.9.1(graphql@16.14.2)': + dependencies: + graphql: 16.14.2 + tslib: 2.8.1 + '@graphql-tools/wrap@10.0.0(graphql@16.14.2)': dependencies: '@graphql-tools/delegate': 10.0.0(graphql@16.14.2) @@ -12124,6 +12640,20 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true + '@nestjs/apollo@12.2.0(@apollo/server@4.13.0(encoding@0.1.13)(graphql@16.14.2))(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(@nestjs/graphql@12.2.0(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(graphql@16.14.2)(reflect-metadata@0.2.2))(graphql@16.14.2)': + dependencies: + '@apollo/server': 4.13.0(encoding@0.1.13)(graphql@16.14.2) + '@apollo/server-plugin-landing-page-graphql-playground': 4.0.0(@apollo/server@4.13.0(encoding@0.1.13)(graphql@16.14.2)) + '@nestjs/common': 10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 10.4.22(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@10.4.22)(@nestjs/platform-express@10.4.22)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/graphql': 12.2.0(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(graphql@16.14.2)(reflect-metadata@0.2.2) + graphql: 16.14.2 + iterall: 1.3.0 + lodash.omit: 4.5.0 + tslib: 2.6.3 + optionalDependencies: + '@apollo/subgraph': 2.14.2(graphql@16.14.2) + '@nestjs/cli@10.4.0': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) @@ -12224,6 +12754,37 @@ snapshots: transitivePeerDependencies: - encoding + '@nestjs/graphql@12.2.0(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(graphql@16.14.2)(reflect-metadata@0.2.2)': + dependencies: + '@graphql-tools/merge': 9.0.4(graphql@16.14.2) + '@graphql-tools/schema': 10.0.4(graphql@16.14.2) + '@graphql-tools/utils': 10.2.3(graphql@16.14.2) + '@nestjs/common': 10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 10.4.22(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@10.4.22)(@nestjs/platform-express@10.4.22)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2) + chokidar: 3.6.0 + fast-glob: 3.3.2 + graphql: 16.14.2 + graphql-tag: 2.12.6(graphql@16.14.2) + graphql-ws: 5.16.0(graphql@16.14.2) + lodash: 4.17.21 + normalize-path: 3.0.0 + reflect-metadata: 0.2.2 + subscriptions-transport-ws: 0.11.0(graphql@16.14.2) + tslib: 2.6.3 + uuid: 9.0.1 + ws: 8.17.1 + optionalDependencies: + '@apollo/subgraph': 2.14.2(graphql@16.14.2) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@nestjs/mapped-types@2.0.5(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)': + dependencies: + '@nestjs/common': 10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2) + reflect-metadata: 0.2.2 + '@nestjs/microservices@10.4.22(@grpc/grpc-js@1.14.4)(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(ioredis@5.11.1)(kafkajs@2.2.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: '@nestjs/common': 10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -14327,6 +14888,8 @@ snapshots: '@protobufjs/float@1.0.2': {} + '@protobufjs/inquire@1.1.2': {} + '@protobufjs/path@1.1.2': {} '@protobufjs/pool@1.1.0': {} @@ -14964,6 +15527,8 @@ snapshots: '@types/lodash@4.17.24': {} + '@types/long@4.0.2': {} + '@types/memcached@2.2.10': dependencies: '@types/node': 22.20.1 @@ -14978,6 +15543,11 @@ snapshots: dependencies: '@types/node': 22.20.1 + '@types/node-fetch@2.6.13': + dependencies: + '@types/node': 22.20.1 + form-data: 4.0.6 + '@types/node@18.11.18': {} '@types/node@22.20.1': @@ -15069,6 +15639,8 @@ snapshots: '@types/uuid@10.0.0': {} + '@types/uuid@9.0.8': {} + '@types/ws@8.18.1': dependencies: '@types/node': 22.20.1 @@ -15673,6 +16245,10 @@ snapshots: async-lock@1.4.1: {} + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + async@3.2.6: {} asynckit@0.4.0: {} @@ -15702,6 +16278,8 @@ snapshots: b4a@1.8.1: {} + backo2@1.0.2: {} + balanced-match@1.0.0: {} balanced-match@4.0.4: {} @@ -16084,6 +16662,8 @@ snapshots: commander@2.20.0: {} + commander@2.20.3: {} + commander@4.0.0: {} commander@4.1.1: {} @@ -16172,6 +16752,11 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cosmiconfig-typescript-loader@5.0.0(@types/node@22.20.1)(cosmiconfig@8.3.6(typescript@5.6.2))(typescript@5.6.2): dependencies: '@types/node': 22.20.1 @@ -16225,6 +16810,10 @@ snapshots: transitivePeerDependencies: - encoding + cross-inspect@1.0.0: + dependencies: + tslib: 2.8.1 + cross-inspect@1.0.1: dependencies: tslib: 2.8.1 @@ -16239,6 +16828,8 @@ snapshots: cssesc@3.0.0: {} + cssfilter@0.0.10: {} + cssstyle@4.0.1: dependencies: rrweb-cssom: 0.6.0 @@ -16901,6 +17492,8 @@ snapshots: event-target-shim@5.0.1: {} + eventemitter3@3.1.0: {} + eventemitter3@4.0.1: {} eventemitter3@5.0.4: {} @@ -16985,6 +17578,14 @@ snapshots: fast-fifo@1.3.2: {} + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -17402,10 +18003,15 @@ snapshots: transitivePeerDependencies: - encoding + graphql-tag@2.12.6(graphql@16.14.2): + dependencies: + graphql: 16.14.2 + tslib: 2.8.1 + graphql-tag@2.12.7(graphql@16.14.2): dependencies: graphql: 16.14.2 - tslib: 2.6.3 + tslib: 2.8.1 graphql-ws@5.13.1(graphql@16.14.2): dependencies: @@ -17415,6 +18021,10 @@ snapshots: dependencies: graphql: 16.14.2 + graphql-ws@5.16.0(graphql@16.14.2): + dependencies: + graphql: 16.14.2 + graphql-ws@6.1.0(graphql@16.14.2)(ws@8.21.0): dependencies: graphql: 16.14.2 @@ -17950,6 +18560,8 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + iterall@1.3.0: {} + iterare@1.2.1: {} jackspeak@3.1.2: @@ -17980,6 +18592,8 @@ snapshots: joycon@3.1.1: {} + js-levenshtein@1.1.6: {} + js-tokens@3.0.0: {} js-tokens@4.0.0: {} @@ -18182,6 +18796,8 @@ snapshots: lodash.mergewith@4.6.2: {} + lodash.omit@4.5.0: {} + lodash.once@4.1.1: {} lodash.set@4.3.2: {} @@ -18196,6 +18812,8 @@ snapshots: lodash.upperfirst@4.3.1: {} + lodash@4.17.21: {} + lodash@4.17.23: {} lodash@4.18.1: {} @@ -18220,8 +18838,12 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 8.1.0 + loglevel@1.9.2: {} + long-timeout@0.1.1: {} + long@4.0.0: {} + long@5.3.2: {} loose-envify@1.4.0: @@ -19328,6 +19950,8 @@ snapshots: retry@0.12.0: {} + retry@0.13.1: {} + rettime@0.11.11: {} reusify@1.1.0: {} @@ -19531,6 +20155,12 @@ snapshots: setprototypeof@1.2.0: {} + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -19852,6 +20482,18 @@ snapshots: optionalDependencies: '@babel/core': 7.29.7 + subscriptions-transport-ws@0.11.0(graphql@16.14.2): + dependencies: + backo2: 1.0.2 + eventemitter3: 3.1.0 + graphql: 16.14.2 + iterall: 1.3.0 + symbol-observable: 1.2.0 + ws: 7.5.11 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.2 @@ -19876,6 +20518,8 @@ snapshots: dependencies: tslib: 2.8.1 + symbol-observable@1.2.0: {} + symbol-observable@4.0.0: {} symbol-tree@3.2.4: {} @@ -20121,6 +20765,12 @@ snapshots: tmp@0.2.7: {} + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -20409,11 +21059,15 @@ snapshots: uuid@9.0.0: {} + uuid@9.0.1: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + value-or-promise@1.0.11: {} + value-or-promise@1.0.12: {} vary@1.1.2: {} @@ -20677,6 +21331,8 @@ snapshots: dependencies: iconv-lite: 0.6.3 + whatwg-mimetype@3.0.0: {} + whatwg-mimetype@4.0.0: {} whatwg-url@14.0.0: @@ -20791,12 +21447,19 @@ snapshots: ws@8.13.0: {} + ws@8.17.1: {} + ws@8.21.0: {} xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + xtend@4.0.2: {} y18n@5.0.8: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d183368..b70c656 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,6 +6,7 @@ packages: # pnpm 11+ build scripts 白名单(从 package.json 的 pnpm.onlyBuiltDependencies 迁移) allowBuilds: + '@apollo/protobufjs': set this to true or false '@module-federation/nextjs-mf': true '@nestjs/core': true '@sentry/cli': true