diff --git a/demo/api/src/app.module.ts b/demo/api/src/app.module.ts index 9612cdd121..e6ef4396d8 100644 --- a/demo/api/src/app.module.ts +++ b/demo/api/src/app.module.ts @@ -78,7 +78,6 @@ export class AppModule { AuthModule, UserPermissionsModule.forRootAsync({ useFactory: (userService: UserService, accessControlService: AccessControlService) => ({ - availablePermissions: ["news", "products"], availableContentScopes: [ { domain: "main", language: "de" }, { domain: "main", language: "en" }, diff --git a/demo/api/src/auth/permission.interface.ts b/demo/api/src/auth/permission.interface.ts deleted file mode 100644 index 4f34da4aab..0000000000 --- a/demo/api/src/auth/permission.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare module "@comet/cms-api" { - interface Permission { - news: string; - products: string; - } -} - -export {}; diff --git a/docs/docs/migration/migration-from-v5-to-v6.md b/docs/docs/migration/migration-from-v5-to-v6.md index 13d45ec364..9ab2f52938 100644 --- a/docs/docs/migration/migration-from-v5-to-v6.md +++ b/docs/docs/migration/migration-from-v5-to-v6.md @@ -75,18 +75,7 @@ It automatically installs the new versions of all `@comet` libraries, runs an ES It is not possible anymore to use a custom CurrentUserLoader neither to augment/use the CurrentUserInterface. -3. Create interface for `availablePermissions` similar to the already existing interface `interface ContentScope` - - ```ts - declare module "@comet/cms-api" { - interface Permission { - // e.g. `products: string;` - } - } - export {}; - ``` - -4. Create necessary services for the `UserPermissionsModule` (either in a new module or where it fits best) +3. Create necessary services for the `UserPermissionsModule` (either in a new module or where it fits best) ```ts // Attention: might already being provided by the library which syncs the users @@ -113,7 +102,7 @@ It automatically installs the new versions of all `@comet` libraries, runs an ES } ``` -5. Replace `ContentScopeModule` with `UserPermissionsModule` +4. Replace `ContentScopeModule` with `UserPermissionsModule` Remove `ContentScopeModule`: @@ -128,7 +117,6 @@ It automatically installs the new versions of all `@comet` libraries, runs an ES ```ts UserPermissionsModule.forRootAsync({ useFactory: (userService: UserService, accessControlService: AccessControlService) => ({ - availablePermissions: [/* Array of strings defined in interface Permission */], availableContentScopes: [/* Array of content Scopes */], userService, accessControlService, @@ -138,7 +126,7 @@ It automatically installs the new versions of all `@comet` libraries, runs an ES }), ``` -6. Adapt decorators +5. Adapt decorators Add `@RequiredPermission` to resolvers and controllers diff --git a/packages/api/cms-api/package.json b/packages/api/cms-api/package.json index ea87cfba26..0d459e1d09 100644 --- a/packages/api/cms-api/package.json +++ b/packages/api/cms-api/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@comet/blocks-api": "workspace:^6.0.0", + "@golevelup/nestjs-discovery": "^4.0.0", "@hapi/accept": "^5.0.2", "@nestjs/jwt": "^9.0.0", "@nestjs/mapped-types": "^1.2.2", diff --git a/packages/api/cms-api/src/index.ts b/packages/api/cms-api/src/index.ts index 70afa4c17f..73e0284901 100644 --- a/packages/api/cms-api/src/index.ts +++ b/packages/api/cms-api/src/index.ts @@ -148,7 +148,6 @@ export { CurrentUser } from "./user-permissions/dto/current-user"; export { FindUsersArgs } from "./user-permissions/dto/paginated-user-list"; export { User } from "./user-permissions/dto/user"; export { ContentScope } from "./user-permissions/interfaces/content-scope.interface"; -export { Permission } from "./user-permissions/interfaces/user-permission.interface"; export { UserPermissionsModule } from "./user-permissions/user-permissions.module"; export { AccessControlServiceInterface, diff --git a/packages/api/cms-api/src/user-permissions/access-control.service.ts b/packages/api/cms-api/src/user-permissions/access-control.service.ts index b3e1bc7caf..13760ce7a9 100644 --- a/packages/api/cms-api/src/user-permissions/access-control.service.ts +++ b/packages/api/cms-api/src/user-permissions/access-control.service.ts @@ -2,7 +2,6 @@ import { Injectable } from "@nestjs/common"; import { CurrentUser } from "./dto/current-user"; import { ContentScope } from "./interfaces/content-scope.interface"; -import { Permission } from "./interfaces/user-permission.interface"; import { AccessControlServiceInterface } from "./user-permissions.types"; @Injectable() @@ -10,7 +9,7 @@ export abstract class AbstractAccessControlService implements AccessControlServi private checkContentScope(userContentScopes: ContentScope[], contentScope: ContentScope): boolean { return userContentScopes.some((cs) => Object.entries(contentScope).every(([scope, value]) => cs[scope] === value)); } - isAllowed(user: CurrentUser, permission: keyof Permission, contentScope?: ContentScope): boolean { + isAllowed(user: CurrentUser, permission: string, contentScope?: ContentScope): boolean { if (!user.permissions) return false; return user.permissions.some((p) => p.permission === permission && (!contentScope || this.checkContentScope(p.contentScopes, contentScope))); } diff --git a/packages/api/cms-api/src/user-permissions/auth/user-permissions.guard.ts b/packages/api/cms-api/src/user-permissions/auth/user-permissions.guard.ts index 95500beffe..ed1c72e07d 100644 --- a/packages/api/cms-api/src/user-permissions/auth/user-permissions.guard.ts +++ b/packages/api/cms-api/src/user-permissions/auth/user-permissions.guard.ts @@ -51,9 +51,7 @@ export class UserPermissionsGuard implements CanActivate { } } - const requiredPermissions = Array.isArray(requiredPermission.requiredPermission) - ? requiredPermission.requiredPermission - : [requiredPermission.requiredPermission]; + const requiredPermissions = requiredPermission.requiredPermission; if (requiredPermissions.length === 0) { throw new Error(`RequiredPermission decorator has empty permissions in ${context.getClass().name}::${context.getHandler().name}()`); } diff --git a/packages/api/cms-api/src/user-permissions/decorators/required-permission.decorator.ts b/packages/api/cms-api/src/user-permissions/decorators/required-permission.decorator.ts index 71800b7fee..17fe656d24 100644 --- a/packages/api/cms-api/src/user-permissions/decorators/required-permission.decorator.ts +++ b/packages/api/cms-api/src/user-permissions/decorators/required-permission.decorator.ts @@ -1,19 +1,17 @@ import { CustomDecorator, SetMetadata } from "@nestjs/common"; -import { Permission } from "../interfaces/user-permission.interface"; - type RequiredPermissionOptions = { skipScopeCheck?: boolean; }; export type RequiredPermissionMetadata = { - requiredPermission: (keyof Permission)[] | keyof Permission; + requiredPermission: string[]; options: RequiredPermissionOptions | undefined; }; -export const RequiredPermission = ( - requiredPermission: (keyof Permission)[] | keyof Permission, - options?: RequiredPermissionOptions, -): CustomDecorator => { - return SetMetadata("requiredPermission", { requiredPermission, options }); +export const RequiredPermission = (requiredPermission: string | string[], options?: RequiredPermissionOptions): CustomDecorator => { + return SetMetadata("requiredPermission", { + requiredPermission: Array.isArray(requiredPermission) ? requiredPermission : [requiredPermission], + options, + }); }; diff --git a/packages/api/cms-api/src/user-permissions/interfaces/user-permission.interface.ts b/packages/api/cms-api/src/user-permissions/interfaces/user-permission.interface.ts deleted file mode 100644 index 882cb53c08..0000000000 --- a/packages/api/cms-api/src/user-permissions/interfaces/user-permission.interface.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface Permission { - dam?: string; - pageTree?: string; - userPermissions?: string; - cronJobs?: string; - builds?: string; -} diff --git a/packages/api/cms-api/src/user-permissions/user-permissions.module.ts b/packages/api/cms-api/src/user-permissions/user-permissions.module.ts index 4caedad73e..0e7573317a 100644 --- a/packages/api/cms-api/src/user-permissions/user-permissions.module.ts +++ b/packages/api/cms-api/src/user-permissions/user-permissions.module.ts @@ -1,3 +1,4 @@ +import { DiscoveryModule } from "@golevelup/nestjs-discovery"; import { MikroOrmModule } from "@mikro-orm/nestjs"; import { DynamicModule, Global, Module, Provider } from "@nestjs/common"; import { APP_GUARD } from "@nestjs/core"; @@ -20,7 +21,7 @@ import { @Global() @Module({ - imports: [MikroOrmModule.forFeature([UserPermission, UserContentScopes])], + imports: [MikroOrmModule.forFeature([UserPermission, UserContentScopes]), DiscoveryModule], providers: [ UserPermissionsService, UserResolver, diff --git a/packages/api/cms-api/src/user-permissions/user-permissions.service.ts b/packages/api/cms-api/src/user-permissions/user-permissions.service.ts index 89ca1b9d1d..5582a87e44 100644 --- a/packages/api/cms-api/src/user-permissions/user-permissions.service.ts +++ b/packages/api/cms-api/src/user-permissions/user-permissions.service.ts @@ -1,3 +1,4 @@ +import { DiscoveryService } from "@golevelup/nestjs-discovery"; import { EntityRepository } from "@mikro-orm/core"; import { InjectRepository } from "@mikro-orm/nestjs"; import { Inject, Injectable } from "@nestjs/common"; @@ -5,13 +6,13 @@ import { isFuture, isPast } from "date-fns"; import isEqual from "lodash.isequal"; import getUuid from "uuid-by-string"; +import { RequiredPermissionMetadata } from "./decorators/required-permission.decorator"; import { CurrentUser } from "./dto/current-user"; import { FindUsersArgs } from "./dto/paginated-user-list"; import { User } from "./dto/user"; import { UserContentScopes } from "./entities/user-content-scopes.entity"; import { UserPermission, UserPermissionSource } from "./entities/user-permission.entity"; import { ContentScope } from "./interfaces/content-scope.interface"; -import { Permission } from "./interfaces/user-permission.interface"; import { ACCESS_CONTROL_SERVICE, USER_PERMISSIONS_OPTIONS, USER_PERMISSIONS_USER_SERVICE } from "./user-permissions.constants"; import { AccessControlServiceInterface, @@ -28,15 +29,25 @@ export class UserPermissionsService { @Inject(ACCESS_CONTROL_SERVICE) private readonly accessControlService: AccessControlServiceInterface, @InjectRepository(UserPermission) private readonly permissionRepository: EntityRepository, @InjectRepository(UserContentScopes) private readonly contentScopeRepository: EntityRepository, + private readonly discoveryService: DiscoveryService, ) {} async getAvailableContentScopes(): Promise { return this.options.availableContentScopes ?? []; } - async getAvailablePermissions(): Promise<(keyof Permission)[]> { + async getAvailablePermissions(): Promise { return [ - ...new Set(["dam", "pageTree", "userPermissions", "cronJobs", "builds", ...(this.options.availablePermissions ?? [])]), + ...new Set( + [ + ...(await this.discoveryService.providerMethodsWithMetaAtKey("requiredPermission")), + ...(await this.discoveryService.providersWithMetaAtKey("requiredPermission")), + ...(await this.discoveryService.controllerMethodsWithMetaAtKey("requiredPermission")), + ...(await this.discoveryService.controllerMethodsWithMetaAtKey("requiredPermission")), + ] + .flatMap((p) => p.meta.requiredPermission) + .sort(), + ), ]; } @@ -88,10 +99,7 @@ export class UserPermissionsService { return permissions .filter((value) => availablePermissions.some((p) => p === value.permission)) // Filter out permissions that are not defined in availablePermissions (e.g. outdated database entries) - .sort( - (a, b) => - availablePermissions.indexOf(a.permission as keyof Permission) - availablePermissions.indexOf(b.permission as keyof Permission), - ); + .sort((a, b) => availablePermissions.indexOf(a.permission) - availablePermissions.indexOf(b.permission)); } async getContentScopes(userId: string, includeContentScopesManual = true): Promise { diff --git a/packages/api/cms-api/src/user-permissions/user-permissions.types.ts b/packages/api/cms-api/src/user-permissions/user-permissions.types.ts index b2cf8a6205..520da6d0fb 100644 --- a/packages/api/cms-api/src/user-permissions/user-permissions.types.ts +++ b/packages/api/cms-api/src/user-permissions/user-permissions.types.ts @@ -5,7 +5,6 @@ import { FindUsersArgs } from "./dto/paginated-user-list"; import { User } from "./dto/user"; import { UserPermission } from "./entities/user-permission.entity"; import { ContentScope } from "./interfaces/content-scope.interface"; -import { Permission } from "./interfaces/user-permission.interface"; export enum UserPermissions { allContentScopes = "all-content-scopes", @@ -15,7 +14,7 @@ export enum UserPermissions { export type Users = [User[], number]; type PermissionForUser = { - permission: keyof Permission; + permission: string; contentScopes?: ContentScope[]; } & Pick; export type PermissionsForUser = PermissionForUser[] | UserPermissions.allPermissions; @@ -23,7 +22,7 @@ export type PermissionsForUser = PermissionForUser[] | UserPermissions.allPermis export type ContentScopesForUser = ContentScope[] | UserPermissions.allContentScopes; export interface AccessControlServiceInterface { - isAllowed(user: CurrentUser, permission: keyof Permission, contentScope?: ContentScope): boolean; + isAllowed(user: CurrentUser, permission: string, contentScope?: ContentScope): boolean; getPermissionsForUser?: (user: User) => Promise | PermissionsForUser; getContentScopesForUser?: (user: User) => Promise | ContentScopesForUser; } @@ -34,7 +33,6 @@ export interface UserPermissionsUserServiceInterface { } export interface UserPermissionsOptions { - availablePermissions?: (keyof Permission)[]; availableContentScopes?: ContentScope[]; } export interface UserPermissionsModuleSyncOptions extends UserPermissionsOptions { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 80bbb90ab8..b3a2f465a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2136,6 +2136,9 @@ importers: '@comet/blocks-api': specifier: workspace:^6.0.0 version: link:../blocks-api + '@golevelup/nestjs-discovery': + specifier: ^4.0.0 + version: 4.0.0(@nestjs/common@9.2.1)(@nestjs/core@9.2.1) '@hapi/accept': specifier: ^5.0.2 version: 5.0.2 @@ -4297,7 +4300,7 @@ packages: '@babel/traverse': 7.22.11 '@babel/types': 7.22.11 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 lodash: 4.17.21 @@ -4320,10 +4323,10 @@ packages: '@babel/helpers': 7.20.13 '@babel/parser': 7.20.13 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 + '@babel/traverse': 7.20.13(supports-color@5.5.0) '@babel/types': 7.20.7 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.0 @@ -4345,7 +4348,7 @@ packages: '@babel/traverse': 7.22.11 '@babel/types': 7.22.11 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -4485,7 +4488,7 @@ packages: '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/traverse': 7.22.11 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.1 semver: 6.3.1 @@ -4501,7 +4504,7 @@ packages: '@babel/core': 7.20.12 '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.1 semver: 6.3.1 @@ -4516,7 +4519,7 @@ packages: '@babel/core': 7.22.11 '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.1 semver: 6.3.1 @@ -4592,7 +4595,7 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 + '@babel/traverse': 7.20.13(supports-color@5.5.0) '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -4679,7 +4682,7 @@ packages: '@babel/helper-member-expression-to-functions': 7.20.7 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 + '@babel/traverse': 7.20.13(supports-color@5.5.0) '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -4744,7 +4747,7 @@ packages: dependencies: '@babel/helper-function-name': 7.19.0 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 + '@babel/traverse': 7.20.13(supports-color@5.5.0) '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -4754,7 +4757,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 + '@babel/traverse': 7.20.13(supports-color@5.5.0) '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -6787,23 +6790,6 @@ packages: '@babel/parser': 7.22.14 '@babel/types': 7.22.11 - /@babel/traverse@7.20.13: - resolution: {integrity: sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.7 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.13 - '@babel/types': 7.20.7 - debug: 4.3.4(supports-color@9.3.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - /@babel/traverse@7.20.13(supports-color@5.5.0): resolution: {integrity: sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==} engines: {node: '>=6.9.0'} @@ -6833,7 +6819,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.22.14 '@babel/types': 7.22.11 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -7126,7 +7112,7 @@ packages: '@babel/preset-typescript': 7.18.6(@babel/core@7.22.11) '@babel/runtime': 7.20.13 '@babel/runtime-corejs3': 7.22.6 - '@babel/traverse': 7.20.13 + '@babel/traverse': 7.20.13(supports-color@5.5.0) '@docusaurus/cssnano-preset': 2.4.1 '@docusaurus/logger': 2.4.1 '@docusaurus/mdx-loader': 2.4.1(@docusaurus/types@2.4.1)(react-dom@17.0.2)(react@17.0.2) @@ -7235,7 +7221,7 @@ packages: react-dom: ^16.8.4 || ^17.0.0 dependencies: '@babel/parser': 7.20.13 - '@babel/traverse': 7.20.13 + '@babel/traverse': 7.20.13(supports-color@5.5.0) '@docusaurus/logger': 2.4.1 '@docusaurus/utils': 2.4.1(@docusaurus/types@2.4.1) '@mdx-js/mdx': 1.6.22 @@ -8186,7 +8172,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) espree: 9.5.2 globals: 13.19.0 ignore: 5.2.4 @@ -8202,7 +8188,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) espree: 9.5.2 globals: 13.19.0 ignore: 5.2.4 @@ -8502,6 +8488,17 @@ packages: xcase: 2.0.1 dev: true + /@golevelup/nestjs-discovery@4.0.0(@nestjs/common@9.2.1)(@nestjs/core@9.2.1): + resolution: {integrity: sha512-iyZLYip9rhVMR0C93vo860xmboRrD5g5F5iEOfpeblGvYSz8ymQrL9RAST7x/Fp3n+TAXSeOLzDIASt+rak68g==} + peerDependencies: + '@nestjs/common': ^10.x + '@nestjs/core': ^10.x + dependencies: + '@nestjs/common': 9.2.1(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.0) + '@nestjs/core': 9.2.1(@nestjs/common@9.2.1)(@nestjs/platform-express@9.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.0) + lodash: 4.17.21 + dev: false + /@googlemaps/js-api-loader@1.15.1: resolution: {integrity: sha512-AsnEgNsB7S/VdrHGEQUaUM2e5tmjFGKBAfzR/AqO8O7TPq/jQGvoRw5liPBw4EMF38RDsHmKDV89q/X+qiUREQ==} dependencies: @@ -9008,7 +9005,7 @@ packages: dependencies: '@babel/parser': 7.20.13 '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.20.12) - '@babel/traverse': 7.20.13 + '@babel/traverse': 7.20.13(supports-color@5.5.0) '@babel/types': 7.20.7 '@graphql-tools/utils': 9.1.4(graphql@15.8.0) graphql: 15.8.0 @@ -9191,7 +9188,7 @@ packages: '@types/json-stable-stringify': 1.0.34 '@types/jsonwebtoken': 9.0.1 chalk: 4.1.2 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) dotenv: 16.0.3 graphql: 15.8.0 graphql-request: 5.1.0(graphql@15.8.0) @@ -9542,7 +9539,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10213,7 +10210,7 @@ packages: dependencies: '@open-draft/until': 1.0.3 '@xmldom/xmldom': 0.7.10 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) headers-utils: 3.0.2 outvariant: 1.4.0 strict-event-emitter: 0.2.8 @@ -13009,7 +13006,7 @@ packages: typescript: '>= 3.x' webpack: '>= 4' dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.0.4 @@ -14579,7 +14576,7 @@ packages: '@typescript-eslint/scope-manager': 5.49.0 '@typescript-eslint/type-utils': 5.49.0(eslint@8.32.0)(typescript@4.9.4) '@typescript-eslint/utils': 5.49.0(eslint@8.32.0)(typescript@4.9.4) - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) eslint: 8.32.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -14604,7 +14601,7 @@ packages: '@typescript-eslint/scope-manager': 5.49.0 '@typescript-eslint/types': 5.49.0 '@typescript-eslint/typescript-estree': 5.49.0(typescript@4.9.4) - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) eslint: 8.32.0 typescript: 4.9.4 transitivePeerDependencies: @@ -14631,7 +14628,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.49.0(typescript@4.9.4) '@typescript-eslint/utils': 5.49.0(eslint@8.32.0)(typescript@4.9.4) - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) eslint: 8.32.0 tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 @@ -14655,7 +14652,7 @@ packages: dependencies: '@typescript-eslint/types': 5.49.0 '@typescript-eslint/visitor-keys': 5.49.0 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 @@ -15290,7 +15287,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: true @@ -15299,7 +15296,7 @@ packages: resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} engines: {node: '>= 8.0.0'} dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) depd: 1.1.2 humanize-ms: 1.2.1 transitivePeerDependencies: @@ -15345,9 +15342,6 @@ packages: /ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependenciesMeta: - ajv: - optional: true dependencies: ajv: 8.12.0 @@ -18405,6 +18399,7 @@ packages: dependencies: ms: 2.1.2 supports-color: 9.3.1 + dev: true /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} @@ -18642,7 +18637,7 @@ packages: hasBin: true dependencies: address: 1.2.2 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: false @@ -19058,7 +19053,7 @@ packages: basic-auth: 2.0.1 cookie: 0.5.0 core-util-is: 1.0.3 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) elastic-apm-http-client: 11.2.0 end-of-stream: 1.4.4 error-callsites: 2.0.4 @@ -19415,7 +19410,7 @@ packages: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) enhanced-resolve: 5.15.0 eslint: 8.32.0 eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.49.0)(eslint-import-resolver-typescript@3.5.3)(eslint@8.32.0) @@ -19702,7 +19697,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 @@ -19752,7 +19747,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 @@ -21335,7 +21330,7 @@ packages: peerDependencies: graphql: '>=0.9 <0.14 || ^14.0.2 || ^15.4.0 || ^16.3.0' dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) graphql: 15.8.0 tslib: 2.4.1 transitivePeerDependencies: @@ -21849,7 +21844,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: true @@ -21910,7 +21905,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: true @@ -22832,7 +22827,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: @@ -23726,7 +23721,7 @@ packages: dependencies: '@types/express': 4.17.16 '@types/jsonwebtoken': 9.0.1 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) jose: 4.11.2 limiter: 1.1.5 lru-memoizer: 2.1.4 @@ -23817,7 +23812,7 @@ packages: dependencies: colorette: 2.0.19 commander: 9.5.0 - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) escalade: 3.1.1 esm: 3.2.25 get-package-type: 0.1.0 @@ -28199,7 +28194,7 @@ packages: resolution: {integrity: sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==} engines: {node: '>=6'} dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) module-details-from-path: 1.0.3 resolve: 1.22.1 transitivePeerDependencies: @@ -29043,7 +29038,7 @@ packages: /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -29056,7 +29051,7 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.4(supports-color@9.3.1) + debug: 4.3.4(supports-color@5.5.0) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -29648,6 +29643,7 @@ packages: /supports-color@9.3.1: resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} engines: {node: '>=12'} + dev: true /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}