From ca492808cf18c459e4d0173b451d6118173b352d Mon Sep 17 00:00:00 2001 From: Weiko Date: Mon, 9 Oct 2023 22:54:14 +0200 Subject: [PATCH] Add metadata query resolvers (#1929) * Add metadata queries resolvers * remove hello field * fix linter --- server/package.json | 7 +- .../@ptc-org+nestjs-query-graphql+4.2.0.patch | 60 ++++++++++ .../field-metadata/field-metadata.entity.ts | 28 +++++ .../field-metadata/field-metadata.module.ts | 29 ++++- server/src/metadata/metadata.resolver.ts | 7 +- .../object-metadata/object-metadata.entity.ts | 31 +++++ .../object-metadata/object-metadata.module.ts | 29 ++++- .../graphql-types/page-info.graphql-type.ts | 12 +- server/yarn.lock | 113 ++++++++++++++++-- 9 files changed, 290 insertions(+), 26 deletions(-) create mode 100644 server/patches/@ptc-org+nestjs-query-graphql+4.2.0.patch diff --git a/server/package.json b/server/package.json index 8bcb7be19..a812e9290 100644 --- a/server/package.json +++ b/server/package.json @@ -50,6 +50,9 @@ "@nestjs/typeorm": "^10.0.0", "@paljs/plugins": "^5.3.3", "@prisma/client": "4.13.0", + "@ptc-org/nestjs-query-core": "^4.2.0", + "@ptc-org/nestjs-query-graphql": "^4.2.0", + "@ptc-org/nestjs-query-typeorm": "^4.2.1-alpha.2", "@sentry/node": "^7.66.0", "@sentry/tracing": "^7.66.0", "@types/lodash.camelcase": "^4.3.7", @@ -62,10 +65,12 @@ "bytes": "^3.1.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "dataloader": "^2.2.2", "date-fns": "^2.30.0", "file-type": "16.5.4", - "graphql": "^16.8.0", + "graphql": "16.8.0", "graphql-fields": "^2.0.3", + "graphql-subscriptions": "2.0.0", "graphql-type-json": "^0.3.2", "graphql-upload": "^13.0.0", "graphql-yoga": "^4.0.4", diff --git a/server/patches/@ptc-org+nestjs-query-graphql+4.2.0.patch b/server/patches/@ptc-org+nestjs-query-graphql+4.2.0.patch new file mode 100644 index 000000000..4ad231069 --- /dev/null +++ b/server/patches/@ptc-org+nestjs-query-graphql+4.2.0.patch @@ -0,0 +1,60 @@ +diff --git a/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/cursor/page-info.type.js b/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/cursor/page-info.type.js +index 00d836d..8eef442 100644 +--- a/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/cursor/page-info.type.js ++++ b/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/cursor/page-info.type.js +@@ -39,7 +39,6 @@ const getOrCreatePageInfoType = () => { + tslib_1.__metadata("design:type", String) + ], PageInfoTypeImpl.prototype, "endCursor", void 0); + PageInfoTypeImpl = tslib_1.__decorate([ +- (0, graphql_1.Directive)('@shareable'), + (0, graphql_1.ObjectType)('PageInfo'), + tslib_1.__metadata("design:paramtypes", [Boolean, Boolean, String, String]) + ], PageInfoTypeImpl); +diff --git a/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/offset/offset-connection.type.js b/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/offset/offset-connection.type.js +index b47564f..d33f391 100644 +--- a/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/offset/offset-connection.type.js ++++ b/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/offset/offset-connection.type.js +@@ -64,7 +64,6 @@ function getOrCreateOffsetConnectionType(TItemClass, opts) { + tslib_1.__metadata("design:paramtypes", []) + ], AbstractConnection.prototype, "totalCount", null); + AbstractConnection = AbstractConnection_1 = tslib_1.__decorate([ +- (0, graphql_1.Directive)('@shareable'), + (0, graphql_1.ObjectType)(connectionName), + tslib_1.__metadata("design:paramtypes", [Object, Array, Function]) + ], AbstractConnection); +diff --git a/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/offset/offset-page-info.type.js b/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/offset/offset-page-info.type.js +index 4803306..d459b16 100644 +--- a/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/offset/offset-page-info.type.js ++++ b/node_modules/@ptc-org/nestjs-query-graphql/src/types/connection/offset/offset-page-info.type.js +@@ -25,7 +25,6 @@ const getOrCreateOffsetPageInfoType = () => { + tslib_1.__metadata("design:type", Boolean) + ], PageInfoTypeImpl.prototype, "hasPreviousPage", void 0); + PageInfoTypeImpl = tslib_1.__decorate([ +- (0, graphql_1.Directive)('@shareable'), + (0, graphql_1.ObjectType)('OffsetPageInfo'), + tslib_1.__metadata("design:paramtypes", [Boolean, Boolean]) + ], PageInfoTypeImpl); +diff --git a/node_modules/@ptc-org/nestjs-query-graphql/src/types/delete-many-reponse.type.js b/node_modules/@ptc-org/nestjs-query-graphql/src/types/delete-many-reponse.type.js +index 4de72de..b42f05f 100644 +--- a/node_modules/@ptc-org/nestjs-query-graphql/src/types/delete-many-reponse.type.js ++++ b/node_modules/@ptc-org/nestjs-query-graphql/src/types/delete-many-reponse.type.js +@@ -16,7 +16,6 @@ const DeleteManyResponseType = () => { + tslib_1.__metadata("design:type", Number) + ], DeleteManyResponseTypeImpl.prototype, "deletedCount", void 0); + DeleteManyResponseTypeImpl = tslib_1.__decorate([ +- (0, graphql_1.Directive)('@shareable'), + (0, graphql_1.ObjectType)('DeleteManyResponse') + ], DeleteManyResponseTypeImpl); + deleteManyResponseType = DeleteManyResponseTypeImpl; +diff --git a/node_modules/@ptc-org/nestjs-query-graphql/src/types/update-many-response.type.js b/node_modules/@ptc-org/nestjs-query-graphql/src/types/update-many-response.type.js +index c525d14..74be84f 100644 +--- a/node_modules/@ptc-org/nestjs-query-graphql/src/types/update-many-response.type.js ++++ b/node_modules/@ptc-org/nestjs-query-graphql/src/types/update-many-response.type.js +@@ -16,7 +16,6 @@ const UpdateManyResponseType = () => { + tslib_1.__metadata("design:type", Number) + ], UpdateManyResponseTypeImpl.prototype, "updatedCount", void 0); + UpdateManyResponseTypeImpl = tslib_1.__decorate([ +- (0, graphql_1.Directive)('@shareable'), + (0, graphql_1.ObjectType)('UpdateManyResponse') + ], UpdateManyResponseTypeImpl); + updateManyResponseType = UpdateManyResponseTypeImpl; diff --git a/server/src/metadata/field-metadata/field-metadata.entity.ts b/server/src/metadata/field-metadata/field-metadata.entity.ts index 4578bbb04..93b15e4f3 100644 --- a/server/src/metadata/field-metadata/field-metadata.entity.ts +++ b/server/src/metadata/field-metadata/field-metadata.entity.ts @@ -1,3 +1,5 @@ +import { Field, ID, ObjectType } from '@nestjs/graphql'; + import { Column, CreateDateColumn, @@ -7,6 +9,11 @@ import { PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; +import { + Authorize, + IDField, + QueryOptions, +} from '@ptc-org/nestjs-query-graphql'; import { ObjectMetadata } from 'src/metadata/object-metadata/object-metadata.entity'; @@ -14,29 +21,47 @@ export type FieldMetadataTargetColumnMap = { [key: string]: string; }; +@ObjectType('field') +@QueryOptions({ + defaultResultSize: 10, + maxResultsSize: 100, + disableFilter: true, + disableSort: true, +}) +@Authorize({ + authorize: (context: any) => ({ + workspaceId: { eq: context?.req?.user?.workspace?.id }, + }), +}) @Entity('field_metadata') export class FieldMetadata { + @IDField(() => ID) @PrimaryGeneratedColumn('uuid') id: string; @Column({ nullable: false, name: 'object_id' }) objectId: string; + @Field() @Column({ nullable: false }) type: string; + @Field() @Column({ nullable: false, name: 'display_name' }) displayName: string; @Column({ nullable: false, name: 'target_column_name' }) targetColumnName: string; + @Field({ nullable: true }) @Column({ nullable: true, name: 'description', type: 'text' }) description: string; + @Field({ nullable: true }) @Column({ nullable: true, name: 'icon' }) icon: string; + @Field({ nullable: true }) @Column({ nullable: true, name: 'placeholder' }) placeholder: string; @@ -46,12 +71,15 @@ export class FieldMetadata { @Column('text', { nullable: true, array: true }) enums: string[]; + @Field() @Column({ default: false, name: 'is_custom' }) isCustom: boolean; + @Field() @Column({ default: false, name: 'is_active' }) isActive: boolean; + @Field() @Column({ nullable: true, default: true, name: 'is_nullable' }) isNullable: boolean; diff --git a/server/src/metadata/field-metadata/field-metadata.module.ts b/server/src/metadata/field-metadata/field-metadata.module.ts index f7692c037..6a5662a6a 100644 --- a/server/src/metadata/field-metadata/field-metadata.module.ts +++ b/server/src/metadata/field-metadata/field-metadata.module.ts @@ -1,11 +1,36 @@ import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; + +import { + NestjsQueryGraphQLModule, + PagingStrategies, +} from '@ptc-org/nestjs-query-graphql'; +import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; + +import { JwtAuthGuard } from 'src/guards/jwt.auth.guard'; import { FieldMetadataService } from './field-metadata.service'; import { FieldMetadata } from './field-metadata.entity'; @Module({ - imports: [TypeOrmModule.forFeature([FieldMetadata], 'metadata')], + imports: [ + NestjsQueryGraphQLModule.forFeature({ + imports: [ + NestjsQueryTypeOrmModule.forFeature([FieldMetadata], 'metadata'), + ], + resolvers: [ + { + EntityClass: FieldMetadata, + DTOClass: FieldMetadata, + enableTotalCount: true, + pagingStrategy: PagingStrategies.CURSOR, + create: { disabled: true }, + update: { disabled: true }, + delete: { disabled: true }, + guards: [JwtAuthGuard], + }, + ], + }), + ], providers: [FieldMetadataService], exports: [FieldMetadataService], }) diff --git a/server/src/metadata/metadata.resolver.ts b/server/src/metadata/metadata.resolver.ts index 22c5de6bc..1405fa765 100644 --- a/server/src/metadata/metadata.resolver.ts +++ b/server/src/metadata/metadata.resolver.ts @@ -1,5 +1,5 @@ import { UseGuards } from '@nestjs/common'; -import { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; +import { Args, Mutation, Resolver } from '@nestjs/graphql'; import { Workspace } from '@prisma/client'; @@ -15,11 +15,6 @@ import { CreateCustomFieldInput } from './args/create-custom-field.input'; export class MetadataResolver { constructor(private readonly metadataService: MetadataService) {} - @Query(() => String) - async hello(): Promise { - return 'Hello World!'; - } - @Mutation(() => String) async createCustomField( @Args() createCustomFieldInput: CreateCustomFieldInput, diff --git a/server/src/metadata/object-metadata/object-metadata.entity.ts b/server/src/metadata/object-metadata/object-metadata.entity.ts index d93e16537..5a47aee80 100644 --- a/server/src/metadata/object-metadata/object-metadata.entity.ts +++ b/server/src/metadata/object-metadata/object-metadata.entity.ts @@ -1,3 +1,5 @@ +import { ObjectType, ID, Field } from '@nestjs/graphql'; + import { Column, CreateDateColumn, @@ -6,11 +8,31 @@ import { PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; +import { + Authorize, + CursorConnection, + IDField, + QueryOptions, +} from '@ptc-org/nestjs-query-graphql'; import { FieldMetadata } from 'src/metadata/field-metadata/field-metadata.entity'; +@ObjectType('object') +@QueryOptions({ + defaultResultSize: 10, + maxResultsSize: 100, + disableFilter: true, + disableSort: true, +}) +@Authorize({ + authorize: (context: any) => ({ + workspaceId: { eq: context?.req?.user?.workspace?.id }, + }), +}) +@CursorConnection('fields', () => FieldMetadata) @Entity('object_metadata') export class ObjectMetadata { + @IDField(() => ID) @PrimaryGeneratedColumn('uuid') id: string; @@ -18,27 +40,34 @@ export class ObjectMetadata { dataSourceId: string; // Deprecated + @Field() @Column({ nullable: false, name: 'display_name' }) displayName: string; + @Field() @Column({ nullable: true, name: 'display_name_singular' }) displayNameSingular: string; + @Field() @Column({ nullable: true, name: 'display_name_plural' }) displayNamePlural: string; + @Field() @Column({ nullable: true, name: 'description', type: 'text' }) description: string; + @Field() @Column({ nullable: true, name: 'icon' }) icon: string; @Column({ nullable: false, name: 'target_table_name' }) targetTableName: string; + @Field() @Column({ default: false, name: 'is_custom' }) isCustom: boolean; + @Field() @Column({ default: false, name: 'is_active' }) isActive: boolean; @@ -48,9 +77,11 @@ export class ObjectMetadata { @OneToMany(() => FieldMetadata, (field) => field.object) fields: FieldMetadata[]; + @Field() @CreateDateColumn({ name: 'created_at' }) createdAt: Date; + @Field() @UpdateDateColumn({ name: 'updated_at' }) updatedAt: Date; } diff --git a/server/src/metadata/object-metadata/object-metadata.module.ts b/server/src/metadata/object-metadata/object-metadata.module.ts index 35bcf3187..6bb06f951 100644 --- a/server/src/metadata/object-metadata/object-metadata.module.ts +++ b/server/src/metadata/object-metadata/object-metadata.module.ts @@ -1,11 +1,36 @@ import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; + +import { + NestjsQueryGraphQLModule, + PagingStrategies, +} from '@ptc-org/nestjs-query-graphql'; +import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; + +import { JwtAuthGuard } from 'src/guards/jwt.auth.guard'; import { ObjectMetadataService } from './object-metadata.service'; import { ObjectMetadata } from './object-metadata.entity'; @Module({ - imports: [TypeOrmModule.forFeature([ObjectMetadata], 'metadata')], + imports: [ + NestjsQueryGraphQLModule.forFeature({ + imports: [ + NestjsQueryTypeOrmModule.forFeature([ObjectMetadata], 'metadata'), + ], + resolvers: [ + { + EntityClass: ObjectMetadata, + DTOClass: ObjectMetadata, + enableTotalCount: true, + pagingStrategy: PagingStrategies.CURSOR, + create: { disabled: true }, + update: { disabled: true }, + delete: { disabled: true }, + guards: [JwtAuthGuard], + }, + ], + }), + ], providers: [ObjectMetadataService], exports: [ObjectMetadataService], }) diff --git a/server/src/tenant/schema-generation/graphql-types/page-info.graphql-type.ts b/server/src/tenant/schema-generation/graphql-types/page-info.graphql-type.ts index 74a1a0d98..f6618f142 100644 --- a/server/src/tenant/schema-generation/graphql-types/page-info.graphql-type.ts +++ b/server/src/tenant/schema-generation/graphql-types/page-info.graphql-type.ts @@ -1,9 +1,5 @@ -import { - GraphQLBoolean, - GraphQLNonNull, - GraphQLObjectType, - GraphQLString, -} from 'graphql'; +import { ConnectionCursorScalar } from '@ptc-org/nestjs-query-graphql'; +import { GraphQLBoolean, GraphQLNonNull, GraphQLObjectType } from 'graphql'; /** * GraphQL PageInfo type. @@ -11,8 +7,8 @@ import { export const PageInfoType = new GraphQLObjectType({ name: 'PageInfo', fields: { - startCursor: { type: GraphQLString }, - endCursor: { type: GraphQLString }, + startCursor: { type: ConnectionCursorScalar }, + endCursor: { type: ConnectionCursorScalar }, hasNextPage: { type: new GraphQLNonNull(GraphQLBoolean) }, hasPreviousPage: { type: new GraphQLNonNull(GraphQLBoolean) }, }, diff --git a/server/yarn.lock b/server/yarn.lock index 8e6b937f8..af7f101b2 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -2206,6 +2206,43 @@ resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@ptc-org/nestjs-query-core@4.2.0", "@ptc-org/nestjs-query-core@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@ptc-org/nestjs-query-core/-/nestjs-query-core-4.2.0.tgz#0724056c0de4846cf5f06833a72f0dfe127a7609" + integrity sha512-6IDHTmQI32jjOQj+yQp0zGZ/Y7E9IUH5nAO8XLNNZ1IN76cDNQcoYYrS06JopQ/LP9wJRusHQgD0cEVUMobh7g== + dependencies: + lodash.merge "^4.6.2" + reflect-metadata "^0.1.13" + tslib "^2.6.2" + +"@ptc-org/nestjs-query-graphql@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@ptc-org/nestjs-query-graphql/-/nestjs-query-graphql-4.2.0.tgz#e4209569a87465b5af7a78733fbb494b19231c24" + integrity sha512-BjPoNjT5UjhpvSK0wJ/exeWpjzOTQsgQgOuYOuPzMx9pwf2zYL1GD+aH08vog3OkK5o/0g/pV3I6XTIBsxAN4g== + dependencies: + "@ptc-org/nestjs-query-core" "4.2.0" + dataloader "^2.2.2" + graphql-fields "^2.0.3" + lodash.merge "4.6.2" + lodash.omit "^4.5.0" + lower-case-first "^2.0.2" + pluralize "^8.0.0" + reflect-metadata "0.1.13" + tslib "^2.6.2" + upper-case-first "^2.0.2" + +"@ptc-org/nestjs-query-typeorm@^4.2.1-alpha.2": + version "4.2.1-alpha.2" + resolved "https://registry.yarnpkg.com/@ptc-org/nestjs-query-typeorm/-/nestjs-query-typeorm-4.2.1-alpha.2.tgz#8cc44ce9e8322662e45cbb773f8d1c1fed6acec1" + integrity sha512-100zvXIfWhI7Nk3aURuk1xPmAYd/9RXrt/mFqXPhJDVOHtzi30r/42+vOIq8l38uIQNeT78eYRlV2C/glzRIBA== + dependencies: + camel-case "^4.1.2" + lodash.filter "^4.6.0" + lodash.merge "^4.6.2" + lodash.omit "^4.5.0" + tslib "^2.6.2" + uuid "^9.0.0" + "@repeaterjs/repeater@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" @@ -4195,6 +4232,14 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" @@ -4608,6 +4653,11 @@ cssfilter@0.0.10: resolved "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz" integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw== +dataloader@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" + integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== + date-fns@*, date-fns@^2.29.3, date-fns@^2.30.0: version "2.30.0" resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" @@ -5261,7 +5311,7 @@ fast-diff@^1.1.2: fast-glob@3.2.12, fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -5792,6 +5842,13 @@ graphql-parse-resolve-info@^4.13.0: debug "^4.1.1" tslib "^2.0.1" +graphql-subscriptions@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-2.0.0.tgz#11ec181d475852d8aec879183e8e1eb94f2eb79a" + integrity sha512-s6k2b8mmt9gF9pEfkxsaO1lTxaySfKoEJzEfmwguBbQ//Oq23hIXCfR1hm4kdh5hnR20RdwB+s3BCb+0duHSZA== + dependencies: + iterall "^1.3.0" + graphql-tag@2.12.6, graphql-tag@^2.11.0, graphql-tag@^2.12.6: version "2.12.6" resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" @@ -5836,7 +5893,7 @@ graphql-yoga@^4.0.4: lru-cache "^10.0.0" tslib "^2.5.2" -graphql@*, "graphql@0.13.1 - 16", graphql@16.8.0, graphql@^16.8.0: +graphql@*, "graphql@0.13.1 - 16", graphql@16.8.0: version "16.8.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.0.tgz#374478b7f27b2dc6153c8f42c1b80157f79d79d4" integrity sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg== @@ -6356,7 +6413,7 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@1.3.0, iterall@^1.2.1: +iterall@1.3.0, iterall@^1.2.1, iterall@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== @@ -6931,6 +6988,11 @@ lodash.difference@^4.5.0: resolved "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz" integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== +lodash.filter@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ== + lodash.flatten@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" @@ -6961,12 +7023,12 @@ lodash.memoize@4.x: resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -lodash.merge@^4.6.2: +lodash.merge@4.6.2, lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.omit@4.5.0: +lodash.omit@4.5.0, lodash.omit@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz" integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg== @@ -7009,6 +7071,20 @@ long@^4.0.0: resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +lower-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" + integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== + dependencies: + tslib "^2.0.3" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + "lru-cache@7.10.1 - 7.13.1": version "7.13.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz" @@ -7306,6 +7382,14 @@ new-github-issue-url@0.2.1: resolved "https://registry.npmjs.org/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz" integrity sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-abi@^3.3.0: version "3.45.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.45.0.tgz#f568f163a3bfca5aacfce1fbeee1fa2cc98441f5" @@ -7635,6 +7719,14 @@ parseurl@^1.3.3, parseurl@~1.3.3: resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + passport-google-oauth20@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz" @@ -8156,7 +8248,7 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -reflect-metadata@^0.1.13: +reflect-metadata@0.1.13, reflect-metadata@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== @@ -9097,7 +9189,7 @@ tslib@^1.11.1, tslib@^1.8.1: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -"tslib@^2.4.1 || ^1.9.3", tslib@^2.5.2: +tslib@^2.0.3, "tslib@^2.4.1 || ^1.9.3", tslib@^2.5.2, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -9283,6 +9375,13 @@ update-browserslist-db@^1.0.11: escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"