From f14ecc9238193993cf2002a3e0737c1259b7f02f Mon Sep 17 00:00:00 2001 From: Alex Kleshchevnikov Date: Sat, 19 Dec 2020 15:52:43 +0200 Subject: [PATCH 1/2] feat(crud): Add soft delete feature. --- .../companies/companies.controller.ts | 3 +- .../crud-typeorm/companies/company.entity.ts | 5 +- integration/crud-typeorm/seeds.ts | 2 +- .../users-profiles/user-profile.entity.ts | 5 +- integration/crud-typeorm/users/user.entity.ts | 4 + .../crud-typeorm/users/users.controller.ts | 1 + package.json | 10 +- .../create-query-params.interface.ts | 1 + .../interfaces/parsed-request.interface.ts | 1 + ...request-query-builder-options.interface.ts | 1 + .../crud-request/src/request-query.builder.ts | 12 +- .../crud-request/src/request-query.parser.ts | 9 +- .../src/request-query.validator.ts | 2 +- .../test/request-query.builder.spec.ts | 3 +- .../test/request-query.parser.spec.ts | 1 + .../crud-typeorm/src/typeorm-crud.service.ts | 46 +- .../crud-typeorm/test/c.basic-crud.spec.ts | 69 ++- packages/crud/src/crud/crud-routes.factory.ts | 30 +- packages/crud/src/crud/swagger.helper.ts | 86 +++- packages/crud/src/enums/crud-actions.enum.ts | 1 + .../interceptors/crud-response.interceptor.ts | 1 + .../interfaces/crud-controller.interface.ts | 1 + .../crud-global-config.interface.ts | 1 + .../src/interfaces/query-options.interface.ts | 1 + .../interfaces/routes-options.interface.ts | 5 + .../interfaces/serialize-options.interface.ts | 1 + .../crud/src/module/crud-config.service.ts | 1 + .../src/services/crud-service.abstract.ts | 2 + .../crud/src/types/base-route-name.type.ts | 3 +- .../services/test-serialize.service.ts | 2 + .../test/__fixture__/services/test.service.ts | 3 + .../crud/test/crud-config.service.spec.ts | 1 + .../crud/test/crud.decorator.soft.spec.ts | 88 ++++ yarn.lock | 445 +++++++++--------- 34 files changed, 567 insertions(+), 280 deletions(-) create mode 100644 packages/crud/test/crud.decorator.soft.spec.ts diff --git a/integration/crud-typeorm/companies/companies.controller.ts b/integration/crud-typeorm/companies/companies.controller.ts index dfa4ae47..1481040b 100644 --- a/integration/crud-typeorm/companies/companies.controller.ts +++ b/integration/crud-typeorm/companies/companies.controller.ts @@ -8,7 +8,7 @@ import { serialize } from './responses'; @Crud({ model: { - type: Company, + type: Company }, serialize, routes: { @@ -18,6 +18,7 @@ import { serialize } from './responses'; }, query: { alwaysPaginate: false, + softDelete: true, allow: ['name'], join: { users: { diff --git a/integration/crud-typeorm/companies/company.entity.ts b/integration/crud-typeorm/companies/company.entity.ts index c629acb5..83fc18b2 100644 --- a/integration/crud-typeorm/companies/company.entity.ts +++ b/integration/crud-typeorm/companies/company.entity.ts @@ -1,5 +1,5 @@ import { CrudValidationGroups } from '@nestjsx/crud'; -import { Entity, Column, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; +import { Entity, Column, OneToMany, PrimaryGeneratedColumn, DeleteDateColumn } from 'typeorm'; import { IsOptional, IsString, @@ -43,6 +43,9 @@ export class Company extends BaseEntity { @Column({ type: 'text', nullable: true, default: null }) description: string; + @DeleteDateColumn({ nullable: true }) + deletedAt?: Date; + /** * Relations */ diff --git a/integration/crud-typeorm/seeds.ts b/integration/crud-typeorm/seeds.ts index 6e01f7dc..38576fe6 100644 --- a/integration/crud-typeorm/seeds.ts +++ b/integration/crud-typeorm/seeds.ts @@ -41,7 +41,7 @@ export class Seeds1544303473346 implements MigrationInterface { { name: 'Name6', domain: 'Domain6' }, { name: 'Name7', domain: 'Domain7' }, { name: 'Name8', domain: 'Domain8' }, - { name: 'Name9', domain: 'Domain9' }, + { name: 'Name9', domain: 'Domain9', deletedAt: new Date() }, { name: 'Name10', domain: 'Domain10' }, ]); diff --git a/integration/crud-typeorm/users-profiles/user-profile.entity.ts b/integration/crud-typeorm/users-profiles/user-profile.entity.ts index 293dc6ef..c5410828 100644 --- a/integration/crud-typeorm/users-profiles/user-profile.entity.ts +++ b/integration/crud-typeorm/users-profiles/user-profile.entity.ts @@ -1,4 +1,4 @@ -import { Entity, Column, OneToOne } from 'typeorm'; +import { Entity, Column, OneToOne, DeleteDateColumn } from 'typeorm'; import { IsOptional, IsString, MaxLength } from 'class-validator'; import { BaseEntity } from '../base-entity'; @@ -12,6 +12,9 @@ export class UserProfile extends BaseEntity { @Column({ type: 'varchar', length: 32, nullable: true, default: null }) name: string; + @DeleteDateColumn({ nullable: true }) + deletedAt?: Date; + /** * Relations */ diff --git a/integration/crud-typeorm/users/user.entity.ts b/integration/crud-typeorm/users/user.entity.ts index 95fb8210..b8cd6c31 100644 --- a/integration/crud-typeorm/users/user.entity.ts +++ b/integration/crud-typeorm/users/user.entity.ts @@ -6,6 +6,7 @@ import { OneToMany, ManyToOne, ManyToMany, + DeleteDateColumn, } from 'typeorm'; import { IsOptional, @@ -65,6 +66,9 @@ export class User extends BaseEntity { @Column({ nullable: false }) companyId?: number; + @DeleteDateColumn({ nullable: true }) + deletedAt?: Date; + /** * Relations */ diff --git a/integration/crud-typeorm/users/users.controller.ts b/integration/crud-typeorm/users/users.controller.ts index 140d46e6..2bcd32e1 100644 --- a/integration/crud-typeorm/users/users.controller.ts +++ b/integration/crud-typeorm/users/users.controller.ts @@ -27,6 +27,7 @@ import { UsersService } from './users.service'; }, }, query: { + softDelete: true, join: { company: { exclude: ['description'], diff --git a/package.json b/package.json index 8503b07c..f9edca3f 100644 --- a/package.json +++ b/package.json @@ -58,12 +58,12 @@ "peerDependencies": {}, "optionalDependencies": {}, "dependencies": { - "@nestjs/common": "7.0.3", - "@nestjs/core": "7.0.3", + "@nestjs/common": "^7.5.1", + "@nestjs/core": "^7.5.1", "@nestjs/platform-express": "7.0.3", "@nestjs/swagger": "4.4.0", "@nestjs/testing": "7.0.3", - "@nestjs/typeorm": "7.0.0", + "@nestjs/typeorm": "^7.1.5", "@nuxtjs/opencollective": "0.2.2", "@types/jest": "24.0.18", "@types/node": "12.7.5", @@ -83,7 +83,7 @@ "npm-check": "5.9.0", "nps": "5.9.8", "nps-utils": "1.7.0", - "pg": "7.12.1", + "pg": "^8.4.2", "prettier": "1.18.2", "pretty-quick": "1.11.1", "qs": "6.8.0", @@ -99,7 +99,7 @@ "tsconfig-paths": "3.9.0", "tslint": "5.20.0", "tslint-config-prettier": "1.18.0", - "typeorm": "0.2.19", + "typeorm": "0.2.29", "typescript": "3.6.3", "validate-commit-msg": "2.14.0" }, diff --git a/packages/crud-request/src/interfaces/create-query-params.interface.ts b/packages/crud-request/src/interfaces/create-query-params.interface.ts index 2bade000..f1d165c2 100644 --- a/packages/crud-request/src/interfaces/create-query-params.interface.ts +++ b/packages/crud-request/src/interfaces/create-query-params.interface.ts @@ -20,4 +20,5 @@ export interface CreateQueryParams { offset?: number; page?: number; resetCache?: boolean; + includeDeleted?: number; } diff --git a/packages/crud-request/src/interfaces/parsed-request.interface.ts b/packages/crud-request/src/interfaces/parsed-request.interface.ts index 35bdbbb6..130fe9ed 100644 --- a/packages/crud-request/src/interfaces/parsed-request.interface.ts +++ b/packages/crud-request/src/interfaces/parsed-request.interface.ts @@ -14,4 +14,5 @@ export interface ParsedRequestParams { offset: number; page: number; cache: number; + includeDeleted: number; } diff --git a/packages/crud-request/src/interfaces/request-query-builder-options.interface.ts b/packages/crud-request/src/interfaces/request-query-builder-options.interface.ts index ff0f50ed..24f9b4be 100644 --- a/packages/crud-request/src/interfaces/request-query-builder-options.interface.ts +++ b/packages/crud-request/src/interfaces/request-query-builder-options.interface.ts @@ -12,5 +12,6 @@ export interface RequestQueryBuilderOptions { offset?: string | string[]; page?: string | string[]; cache?: string | string[]; + includeDeleted?: string | string[]; }; } diff --git a/packages/crud-request/src/request-query.builder.ts b/packages/crud-request/src/request-query.builder.ts index 82aa4d99..027b1083 100644 --- a/packages/crud-request/src/request-query.builder.ts +++ b/packages/crud-request/src/request-query.builder.ts @@ -47,6 +47,7 @@ export class RequestQueryBuilder { offset: 'offset', page: 'page', cache: 'cache', + includeDeleted: 'include_deleted', }, }; private paramNames: { @@ -166,6 +167,11 @@ export class RequestQueryBuilder { return this; } + setIncludeDeleted(n: number): this { + this.setNumeric(n, 'includeDeleted'); + return this; + } + cond( f: QueryFilter | QueryFilterArr, cond: 'filter' | 'or' | 'search' = 'search', @@ -212,6 +218,7 @@ export class RequestQueryBuilder { if (params.resetCache) { this.resetCache(); } + this.setIncludeDeleted(params.includeDeleted); return this; } @@ -241,7 +248,10 @@ export class RequestQueryBuilder { } } - private setNumeric(n: number, cond: 'limit' | 'offset' | 'page' | 'cache'): void { + private setNumeric( + n: number, + cond: 'limit' | 'offset' | 'page' | 'cache' | 'includeDeleted', + ): void { if (!isNil(n)) { validateNumeric(n, cond); this.queryObject[this.paramNames[cond]] = n; diff --git a/packages/crud-request/src/request-query.parser.ts b/packages/crud-request/src/request-query.parser.ts index 29d6ada0..db37ce9d 100644 --- a/packages/crud-request/src/request-query.parser.ts +++ b/packages/crud-request/src/request-query.parser.ts @@ -52,6 +52,7 @@ export class RequestQueryParser implements ParsedRequestParams { public offset: number; public page: number; public cache: number; + public includeDeleted: number; private _params: any; private _query: any; @@ -80,6 +81,7 @@ export class RequestQueryParser implements ParsedRequestParams { offset: this.offset, page: this.page, cache: this.cache, + includeDeleted: this.includeDeleted, }; } @@ -91,7 +93,6 @@ export class RequestQueryParser implements ParsedRequestParams { this._query = query; this._paramNames = paramNames; let searchData = this._query[this.getParamNames('search')[0]]; - this.search = this.parseSearchQueryParam(searchData) as any; if (isNil(this.search)) { this.filter = this.parseQueryParam( @@ -120,6 +121,10 @@ export class RequestQueryParser implements ParsedRequestParams { 'cache', this.numericParser.bind(this, 'cache'), )[0]; + this.includeDeleted = this.parseQueryParam( + 'includeDeleted', + this.numericParser.bind(this, 'includeDeleted'), + )[0]; } } @@ -311,7 +316,7 @@ export class RequestQueryParser implements ParsedRequestParams { } private numericParser( - num: 'limit' | 'offset' | 'page' | 'cache', + num: 'limit' | 'offset' | 'page' | 'cache' | 'includeDeleted', data: string, ): number { const val = this.parseValue(data); diff --git a/packages/crud-request/src/request-query.validator.ts b/packages/crud-request/src/request-query.validator.ts index 07813684..6c1ed9b6 100644 --- a/packages/crud-request/src/request-query.validator.ts +++ b/packages/crud-request/src/request-query.validator.ts @@ -96,7 +96,7 @@ export function validateSort(sort: QuerySort): void { export function validateNumeric( val: number, - num: 'limit' | 'offset' | 'page' | 'cache' | string, + num: 'limit' | 'offset' | 'page' | 'cache' | 'include_deleted' | string, ): void { if (!isNumber(val)) { throw new RequestQueryException(`Invalid ${num}. Number expected`); diff --git a/packages/crud-request/test/request-query.builder.spec.ts b/packages/crud-request/test/request-query.builder.spec.ts index 8b9c8dc9..fdcf3c8d 100644 --- a/packages/crud-request/test/request-query.builder.spec.ts +++ b/packages/crud-request/test/request-query.builder.spec.ts @@ -335,9 +335,10 @@ describe('#request-query', () => { .setPage(3) .sortBy({ field: 'foo', order: 'DESC' }) .resetCache() + .setIncludeDeleted(1) .query(false); const expected = - 'fields=foo,bar&filter[0]=is||notnull&or[0]=ok||ne||false&join[0]=voo||h,data&limit=1&offset=2&page=3&sort[0]=foo,DESC&cache=0'; + 'fields=foo,bar&filter[0]=is||notnull&or[0]=ok||ne||false&join[0]=voo||h,data&limit=1&offset=2&page=3&sort[0]=foo,DESC&cache=0&include_deleted=1'; expect(test).toBe(expected); }); }); diff --git a/packages/crud-request/test/request-query.parser.spec.ts b/packages/crud-request/test/request-query.parser.spec.ts index b38a8c50..2af5efae 100644 --- a/packages/crud-request/test/request-query.parser.spec.ts +++ b/packages/crud-request/test/request-query.parser.spec.ts @@ -505,6 +505,7 @@ describe('#request-query', () => { offset: undefined, page: undefined, cache: undefined, + includeDeleted: undefined, }; const test = qp.getParsed(); expect(test).toMatchObject(expected); diff --git a/packages/crud-typeorm/src/typeorm-crud.service.ts b/packages/crud-typeorm/src/typeorm-crud.service.ts index bc9344a3..87fd70b0 100644 --- a/packages/crud-typeorm/src/typeorm-crud.service.ts +++ b/packages/crud-typeorm/src/typeorm-crud.service.ts @@ -54,6 +54,7 @@ export class TypeOrmCrudService extends CrudService { protected dbName: ConnectionOptions['type']; protected entityColumns: string[]; protected entityPrimaryColumns: string[]; + protected entityHasDeleteColumn: boolean = false; protected entityColumnsHash: ObjectLiteral = {}; protected entityRelationsHash: Map = new Map(); protected sqlInjectionRegEx: RegExp[] = [ @@ -190,6 +191,16 @@ export class TypeOrmCrudService extends CrudService { } } + /** + * Recover one + * @param req + * @param dto + */ + public async recoverOne(req: CrudRequest): Promise { + const found = await this.getOneOrFail(req, false, true); + return this.repo.recover(found); + } + /** * Replace one * @param req @@ -234,8 +245,10 @@ export class TypeOrmCrudService extends CrudService { const toReturn = returnDeleted ? plainToClass(this.entityType, { ...found }) : undefined; - const deleted = await this.repo.remove(found); - + const deleted = + req.options.query.softDelete === true + ? await this.repo.softRemove(found) + : await this.repo.remove(found); return toReturn; } @@ -262,6 +275,7 @@ export class TypeOrmCrudService extends CrudService { parsed: ParsedRequestParams, options: CrudRequestOptions, many = true, + withDeleted = false, ): Promise> { // create query builder const builder = this.repo.createQueryBuilder(this.alias); @@ -301,6 +315,20 @@ export class TypeOrmCrudService extends CrudService { } } + // if soft deleted is enabled add where statement to filter deleted records + if (this.entityHasDeleteColumn && options.query.softDelete) { + if (parsed.includeDeleted === 1 || withDeleted) { + builder.withDeleted(); + } + // } else { + // this.setAndWhere( + // { field: this.repo.metadata.deleteDateColumn.databaseName, operator: 'isnull' }, + // null, + // builder + // ); + // } + } + /* istanbul ignore else */ if (many) { // set sort (order by) @@ -370,19 +398,27 @@ export class TypeOrmCrudService extends CrudService { this.entityPrimaryColumns = this.repo.metadata.columns .filter((prop) => prop.isPrimary) .map((prop) => prop.propertyName); + this.entityHasDeleteColumn = + this.repo.metadata.columns.filter((prop) => prop.isDeleteDate).length > 0; } - protected async getOneOrFail(req: CrudRequest, shallow = false): Promise { + protected async getOneOrFail( + req: CrudRequest, + shallow = false, + withDeleted = false, + ): Promise { const { parsed, options } = req; const builder = shallow ? this.repo.createQueryBuilder(this.alias) - : await this.createBuilder(parsed, options); + : await this.createBuilder(parsed, options, true, withDeleted); if (shallow) { this.setSearchCondition(builder, parsed.search); } - const found = await builder.getOne(); + const found = withDeleted + ? await builder.withDeleted().getOne() + : await builder.getOne(); if (!found) { this.throwNotFoundException(this.alias); diff --git a/packages/crud-typeorm/test/c.basic-crud.spec.ts b/packages/crud-typeorm/test/c.basic-crud.spec.ts index 3e4e206e..1e162b11 100644 --- a/packages/crud-typeorm/test/c.basic-crud.spec.ts +++ b/packages/crud-typeorm/test/c.basic-crud.spec.ts @@ -124,7 +124,7 @@ describe('#crud-typeorm', () => { .get('/companies') .end((_, res) => { expect(res.status).toBe(200); - expect(res.body.data.length).toBe(10); + expect(res.body.data.length).toBe(9); expect(res.body.page).toBe(1); done(); }); @@ -169,6 +169,9 @@ describe('#crud-typeorm', () => { @Crud({ model: { type: Company }, + query: { + softDelete: true, + }, }) @Controller('companies') class CompaniesController { @@ -296,7 +299,7 @@ describe('#crud-typeorm', () => { describe('#find', () => { it('should return entities', async () => { const data = await service.find(); - expect(data.length).toBe(10); + expect(data.length).toBe(9); }); }); @@ -317,7 +320,7 @@ describe('#crud-typeorm', () => { describe('#getAllBase', () => { it('should return an array of all entities', (done) => { return request(server) - .get('/companies') + .get('/companies?include_deleted=1') .end((_, res) => { expect(res.status).toBe(200); expect(res.body.length).toBe(10); @@ -348,9 +351,9 @@ describe('#crud-typeorm', () => { expect(res.status).toBe(200); expect(res.body.data.length).toBe(3); expect(res.body.count).toBe(3); - expect(res.body.total).toBe(10); + expect(res.body.total).toBe(9); expect(res.body.page).toBe(1); - expect(res.body.pageCount).toBe(4); + expect(res.body.pageCount).toBe(3); done(); }); }); @@ -366,10 +369,10 @@ describe('#crud-typeorm', () => { .end((_, res) => { expect(res.status).toBe(200); if (isMysql) { - expect(res.body.count).toBe(7); - expect(res.body.data.length).toBe(7); + expect(res.body.count).toBe(6); + expect(res.body.data.length).toBe(6); } else { - expect(res.body.length).toBe(7); + expect(res.body.length).toBe(6); } done(); }); @@ -385,6 +388,23 @@ describe('#crud-typeorm', () => { done(); }); }); + it('should return status 404 for deleted entity', (done) => { + return request(server) + .get('/companies/9') + .end((_, res) => { + expect(res.status).toBe(404); + done(); + }); + }); + it('should return a deleted entity if include_deleted query param is specified', (done) => { + return request(server) + .get('/companies/9?include_deleted=1') + .end((_, res) => { + expect(res.status).toBe(200); + expect(res.body.id).toBe(9); + done(); + }); + }); it('should return an entity, 1', (done) => { return request(server) .get('/companies/1') @@ -596,6 +616,39 @@ describe('#crud-typeorm', () => { done(); }); }); + it('should softly delete entity', (done) => { + return request(server) + .delete('/companies/5') + .end((_, res) => { + expect(res.status).toBe(200); + done(); + }); + }); + it('should not return softly deleted entity', (done) => { + return request(server) + .get('/companies/5') + .end((_, res) => { + expect(res.status).toBe(404); + done(); + }); + }); + it('should recover softly deleted entity', (done) => { + return request(server) + .patch('/companies/5/recover') + .end((_, res) => { + expect(res.status).toBe(200); + done(); + }); + }); + it('should return recovered entity', (done) => { + return request(server) + .get('/companies/5') + .end((_, res) => { + expect(res.status).toBe(200); + expect(res.body.id).toBe(5); + done(); + }); + }); it('should return deleted entity', (done) => { return request(server) .delete('/companies/1/users/22') diff --git a/packages/crud/src/crud/crud-routes.factory.ts b/packages/crud/src/crud/crud-routes.factory.ts index cd236a8b..e46dfd5a 100644 --- a/packages/crud/src/crud/crud-routes.factory.ts +++ b/packages/crud/src/crud/crud-routes.factory.ts @@ -58,6 +58,7 @@ export class CrudRoutesFactory { updateOneBase: CrudActions.UpdateOne, deleteOneBase: CrudActions.DeleteOne, replaceOneBase: CrudActions.ReplaceOne, + recoverOneBase: CrudActions.RecoverOne, }; } @@ -197,6 +198,14 @@ export class CrudRoutesFactory { override: false, withParams: true, }, + { + name: 'recoverOneBase', + path: '/recover', + method: RequestMethod.PATCH, + enable: false, + override: false, + withParams: true, + }, ]; } @@ -242,10 +251,21 @@ export class CrudRoutesFactory { }; } - private canCreateRoute(name: string) { + private recoverOneBase(name: BaseRouteName) { + this.targetProto[name] = function recoverOneBase(req: CrudRequest) { + return this.service.recoverOne(req); + }; + } + + private canCreateRoute(name: BaseRouteName) { const only = this.options.routes.only; const exclude = this.options.routes.exclude; + // include recover route only for models with soft delete option + if (name === 'recoverOneBase' && this.options.query.softDelete !== true) { + return false; + } + if (isArrayFull(only)) { return only.some((route) => route === name); } @@ -279,6 +299,9 @@ export class CrudRoutesFactory { this.swaggerModels.delete = isFunction(this.options.serialize.delete) ? this.options.serialize.delete : modelType; + this.swaggerModels.recover = isFunction(this.options.serialize.recover) + ? this.options.serialize.recover + : modelType; Swagger.setExtraModels(this.swaggerModels); } @@ -295,7 +318,8 @@ export class CrudRoutesFactory { } if (route.withParams && !this.options.params[primaryParam].disabled) { - route.path = `/:${primaryParam}`; + route.path = + route.path.length > 0 ? `/:${primaryParam}${route.path}` : `/:${primaryParam}`; } }); } @@ -496,7 +520,7 @@ export class CrudRoutesFactory { private setSwaggerQueryParams(name: BaseRouteName) { const metadata = Swagger.getParams(this.targetProto[name]); - const queryParamsMeta = Swagger.createQueryParamsMeta(name); + const queryParamsMeta = Swagger.createQueryParamsMeta(name, this.options); Swagger.setParams([...metadata, ...queryParamsMeta], this.targetProto[name]); } diff --git a/packages/crud/src/crud/swagger.helper.ts b/packages/crud/src/crud/swagger.helper.ts index d7f41e0f..8e005c44 100644 --- a/packages/crud/src/crud/swagger.helper.ts +++ b/packages/crud/src/crud/swagger.helper.ts @@ -21,6 +21,7 @@ export class Swagger { updateOneBase: `Update one ${modelName}`, replaceOneBase: `Replace one ${modelName}`, deleteOneBase: `Delete one ${modelName}`, + recoverOneBase: `Recover one ${modelName}`, }; } @@ -188,6 +189,27 @@ export class Swagger { description: 'Delete one base response', }, }; + case 'recoverOneBase': + /* istanbul ignore if */ + if (oldVersion) { + return { + [HttpStatus.OK]: routes.recoverOneBase.returnRecovered + ? { + type: swaggerModels.delete, + } + : {}, + }; + } + return { + [HttpStatus.OK]: routes.recoverOneBase.returnRecovered + ? { + description: 'Recover one base response', + schema: { $ref: swagger.getSchemaPath(swaggerModels.recover.name) }, + } + : { + description: 'Recover one base response', + }, + }; default: const dto = swaggerModels[name.split('OneBase')[0]]; @@ -224,7 +246,7 @@ export class Swagger { : /* istanbul ignore next */ []; } - static createQueryParamsMeta(name: BaseRouteName) { + static createQueryParamsMeta(name: BaseRouteName, options: MergedCrudOptions) { /* istanbul ignore if */ if (!swaggerConst) { return []; @@ -243,6 +265,7 @@ export class Swagger { offset, page, cache, + includeDeleted, } = Swagger.getQueryParamsNames(); const oldVersion = Swagger.getSwaggerVersion() < 4; const docsLink = (a: string) => @@ -438,22 +461,56 @@ export class Swagger { } : { ...cacheMetaBase, schema: { type: 'integer', minimum: 0, maximum: 1 } }; + const includeDeletedMetaBase = { + name: includeDeleted, + description: `Include deleted. ${docsLink('includeDeleted')}`, + required: false, + in: 'query', + }; + const includeDeletedMeta = oldVersion + ? /* istanbul ignore next */ { + ...includeDeletedMetaBase, + type: 'integer', + minimum: 0, + maximum: 1, + } + : { + ...includeDeletedMetaBase, + schema: { type: 'integer', minimum: 0, maximum: 1 }, + }; + switch (name) { case 'getManyBase': - return [ - fieldsMeta, - searchMeta, - filterMeta, - orMeta, - sortMeta, - joinMeta, - limitMeta, - offsetMeta, - pageMeta, - cacheMeta, - ]; + return options.query.softDelete + ? [ + fieldsMeta, + searchMeta, + filterMeta, + orMeta, + sortMeta, + joinMeta, + limitMeta, + offsetMeta, + pageMeta, + cacheMeta, + includeDeletedMeta, + ] + : [ + fieldsMeta, + searchMeta, + filterMeta, + orMeta, + sortMeta, + joinMeta, + limitMeta, + offsetMeta, + pageMeta, + cacheMeta, + ]; case 'getOneBase': - return [fieldsMeta, joinMeta, cacheMeta]; + return options.query.softDelete + ? [fieldsMeta, joinMeta, cacheMeta, includeDeletedMeta] + : [fieldsMeta, joinMeta, cacheMeta]; default: return []; } @@ -479,6 +536,7 @@ export class Swagger { offset: name('offset'), page: name('page'), cache: name('cache'), + includeDeleted: name('includeDeleted'), }; } diff --git a/packages/crud/src/enums/crud-actions.enum.ts b/packages/crud/src/enums/crud-actions.enum.ts index 2bae37c9..bb82f989 100644 --- a/packages/crud/src/enums/crud-actions.enum.ts +++ b/packages/crud/src/enums/crud-actions.enum.ts @@ -7,4 +7,5 @@ export enum CrudActions { ReplaceOne = 'Replace-One', DeleteOne = 'Delete-One', DeleteAll = 'Delete-All', + RecoverOne = 'Recover-One', } diff --git a/packages/crud/src/interceptors/crud-response.interceptor.ts b/packages/crud/src/interceptors/crud-response.interceptor.ts index 9b9b6fa3..98e622a9 100644 --- a/packages/crud/src/interceptors/crud-response.interceptor.ts +++ b/packages/crud/src/interceptors/crud-response.interceptor.ts @@ -23,6 +23,7 @@ const actionToDtoNameMap: { [CrudActions.ReplaceOne]: 'replace', [CrudActions.DeleteAll]: 'delete', [CrudActions.DeleteOne]: 'delete', + [CrudActions.RecoverOne]: 'recover', }; @Injectable() diff --git a/packages/crud/src/interfaces/crud-controller.interface.ts b/packages/crud/src/interfaces/crud-controller.interface.ts index 8c3d8c97..dda12af8 100644 --- a/packages/crud/src/interfaces/crud-controller.interface.ts +++ b/packages/crud/src/interfaces/crud-controller.interface.ts @@ -10,4 +10,5 @@ export interface CrudController { updateOneBase?(req: CrudRequest, dto: T): Promise; replaceOneBase?(req: CrudRequest, dto: T): Promise; deleteOneBase?(req: CrudRequest): Promise; + recoverOneBase?(req: CrudRequest): Promise; } diff --git a/packages/crud/src/interfaces/crud-global-config.interface.ts b/packages/crud/src/interfaces/crud-global-config.interface.ts index eed85f2c..1fd6b09b 100644 --- a/packages/crud/src/interfaces/crud-global-config.interface.ts +++ b/packages/crud/src/interfaces/crud-global-config.interface.ts @@ -23,5 +23,6 @@ export interface CrudGlobalConfig { update?: false; replace?: false; delete?: false; + recover?: false; }; } diff --git a/packages/crud/src/interfaces/query-options.interface.ts b/packages/crud/src/interfaces/query-options.interface.ts index d2de7c22..cfb9515f 100644 --- a/packages/crud/src/interfaces/query-options.interface.ts +++ b/packages/crud/src/interfaces/query-options.interface.ts @@ -16,6 +16,7 @@ export interface QueryOptions { maxLimit?: number; cache?: number | false; alwaysPaginate?: boolean; + softDelete?: boolean; } export interface JoinOptions { diff --git a/packages/crud/src/interfaces/routes-options.interface.ts b/packages/crud/src/interfaces/routes-options.interface.ts index c1b3aa3b..9a94f0f2 100644 --- a/packages/crud/src/interfaces/routes-options.interface.ts +++ b/packages/crud/src/interfaces/routes-options.interface.ts @@ -10,6 +10,7 @@ export interface RoutesOptions { updateOneBase?: UpdateOneRouteOptions; replaceOneBase?: ReplaceOneRouteOptions; deleteOneBase?: DeleteOneRouteOptions; + recoverOneBase?: RecoverOneRouteOptions; } export interface BaseRouteOptions { @@ -40,3 +41,7 @@ export interface UpdateOneRouteOptions extends BaseRouteOptions { export interface DeleteOneRouteOptions extends BaseRouteOptions { returnDeleted?: boolean; } + +export interface RecoverOneRouteOptions extends BaseRouteOptions { + returnRecovered?: boolean; +} diff --git a/packages/crud/src/interfaces/serialize-options.interface.ts b/packages/crud/src/interfaces/serialize-options.interface.ts index 6ac0c60f..e9a09f3e 100644 --- a/packages/crud/src/interfaces/serialize-options.interface.ts +++ b/packages/crud/src/interfaces/serialize-options.interface.ts @@ -8,4 +8,5 @@ export interface SerializeOptions { update?: Type | false; replace?: Type | false; delete?: Type | false; + recover?: Type | false; } diff --git a/packages/crud/src/module/crud-config.service.ts b/packages/crud/src/module/crud-config.service.ts index 6a2a6ab5..75037ad6 100644 --- a/packages/crud/src/module/crud-config.service.ts +++ b/packages/crud/src/module/crud-config.service.ts @@ -28,6 +28,7 @@ export class CrudConfigService { returnShallow: false, }, deleteOneBase: { interceptors: [], decorators: [], returnDeleted: false }, + recoverOneBase: { interceptors: [], decorators: [], returnRecovered: false }, }, params: {}, }; diff --git a/packages/crud/src/services/crud-service.abstract.ts b/packages/crud/src/services/crud-service.abstract.ts index 4e727841..3fd79b31 100644 --- a/packages/crud/src/services/crud-service.abstract.ts +++ b/packages/crud/src/services/crud-service.abstract.ts @@ -25,6 +25,8 @@ export abstract class CrudService { abstract deleteOne(req: CrudRequest): Promise; + abstract recoverOne(req: CrudRequest): Promise; + throwBadRequestException(msg?: any): BadRequestException { throw new BadRequestException(msg); } diff --git a/packages/crud/src/types/base-route-name.type.ts b/packages/crud/src/types/base-route-name.type.ts index 9ee0f3df..26ff741f 100644 --- a/packages/crud/src/types/base-route-name.type.ts +++ b/packages/crud/src/types/base-route-name.type.ts @@ -5,4 +5,5 @@ export type BaseRouteName = | 'createManyBase' | 'updateOneBase' | 'replaceOneBase' - | 'deleteOneBase'; + | 'deleteOneBase' + | 'recoverOneBase'; diff --git a/packages/crud/test/__fixture__/services/test-serialize.service.ts b/packages/crud/test/__fixture__/services/test-serialize.service.ts index 8a60d588..c421c1db 100644 --- a/packages/crud/test/__fixture__/services/test-serialize.service.ts +++ b/packages/crud/test/__fixture__/services/test-serialize.service.ts @@ -43,4 +43,6 @@ export class TestSerializeService extends CrudService async deleteOne(req: CrudRequest): Promise { return req.options.routes.deleteOneBase.returnDeleted ? this.store[0] : undefined; } + + async recoverOne(req: CrudRequest): Promise {} } diff --git a/packages/crud/test/__fixture__/services/test.service.ts b/packages/crud/test/__fixture__/services/test.service.ts index 01a22218..91573a05 100644 --- a/packages/crud/test/__fixture__/services/test.service.ts +++ b/packages/crud/test/__fixture__/services/test.service.ts @@ -28,6 +28,9 @@ export class TestService extends CrudService { async deleteOne(req: CrudRequest): Promise { return { req }; } + async recoverOne(req: CrudRequest): Promise { + return { req }; + } decidePagination(parsed: ParsedRequestParams, options: CrudRequestOptions): boolean { return true; } diff --git a/packages/crud/test/crud-config.service.spec.ts b/packages/crud/test/crud-config.service.spec.ts index efa8187c..850f63bf 100644 --- a/packages/crud/test/crud-config.service.spec.ts +++ b/packages/crud/test/crud-config.service.spec.ts @@ -98,6 +98,7 @@ describe('#crud', () => { returnShallow: false, }, deleteOneBase: { interceptors: [], decorators: [], returnDeleted: false }, + recoverOneBase: { interceptors: [], decorators: [], returnRecovered: false }, }, }; CrudConfigService.load(conf); diff --git a/packages/crud/test/crud.decorator.soft.spec.ts b/packages/crud/test/crud.decorator.soft.spec.ts new file mode 100644 index 00000000..11654fde --- /dev/null +++ b/packages/crud/test/crud.decorator.soft.spec.ts @@ -0,0 +1,88 @@ +import * as request from 'supertest'; +import { Test } from '@nestjs/testing'; +import { Controller, INestApplication } from '@nestjs/common'; +import { APP_FILTER } from '@nestjs/core'; + +import { Crud } from '../src/decorators'; +import { HttpExceptionFilter } from './__fixture__/exception.filter'; +import { TestModel } from './__fixture__/models'; +import { TestService } from './__fixture__/services'; + +describe('#crud', () => { + describe('#soft delete disabled', () => { + let app: INestApplication; + let server: any; + + @Crud({ + model: { type: TestModel }, + }) + @Controller('test') + class TestController { + constructor(public service: TestService) {} + } + + beforeAll(async () => { + const fixture = await Test.createTestingModule({ + controllers: [TestController], + providers: [{ provide: APP_FILTER, useClass: HttpExceptionFilter }, TestService], + }).compile(); + + app = fixture.createNestApplication(); + + await app.init(); + server = app.getHttpServer(); + }); + + afterAll(async () => { + app.close(); + }); + + describe('#recoverOneBase', () => { + it('should return status 404 if controller does not have soft delete', () => { + return request(server) + .patch('/test/1/recover') + .expect(404); + }); + }); + }); + + describe('#soft delete enabled', () => { + let app: INestApplication; + let server: any; + + @Crud({ + model: { type: TestModel }, + query: { + softDelete: true, + }, + }) + @Controller('test') + class TestController { + constructor(public service: TestService) {} + } + + beforeAll(async () => { + const fixture = await Test.createTestingModule({ + controllers: [TestController], + providers: [{ provide: APP_FILTER, useClass: HttpExceptionFilter }, TestService], + }).compile(); + + app = fixture.createNestApplication(); + + await app.init(); + server = app.getHttpServer(); + }); + + afterAll(async () => { + app.close(); + }); + + describe('#recoverOneBase', () => { + it('should return status 200 if controller has soft delete', () => { + return request(server) + .patch('/test/1/recover') + .expect(200); + }); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index bd8ddc36..6c6fee9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1085,28 +1085,28 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@nestjs/common@7.0.3": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-7.0.3.tgz#89258b411b2f1a1704ba0289473f2ed8e32423db" - integrity sha512-ENfgocjBC8aWAvvjjCq/JFN94CIVX4FrXr12r66UEcw/GtCW/qAc/BVWGX//7MRtk95me82hBEQQx2kovL91bA== +"@nestjs/common@^7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-7.5.1.tgz#a4bbe1f69f48d0f46839f5e26d9cb244bb4db3bf" + integrity sha512-UKTWa/MFTryRm4L9b+lsKFg+m/B4zDCsx/pQAMZVCYMW4FRg6QH4BIaq5fMz5G2hL5IFlFVoOC/eXJwhGDOrYA== dependencies: - axios "0.19.2" - cli-color "2.0.0" - tslib "1.11.1" - uuid "7.0.2" + axios "0.21.0" + iterare "1.2.1" + tslib "2.0.3" + uuid "8.3.1" -"@nestjs/core@7.0.3": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-7.0.3.tgz#4e2e653d640b9dff4d0574cb7147f12c1322bbd8" - integrity sha512-uIIcM+a2IoV2aqHHMtnDGOy81CMNNNm3xpJIFLjS74OqCGpE4skqiFIZRsB1cIeip1EtVh7IzU0xXo0JrIZEQA== +"@nestjs/core@^7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-7.5.1.tgz#5de809d85fb5d3bbb008fffeb4297c3bb5591aa9" + integrity sha512-aJ1w5tQPkVEmH5QRe1echV5NFWAcHAVQJX/jvfCSK4M5VSkIBN9zreZg8UnYf8sbW5YEaizPts07veeTPsG3FQ== dependencies: "@nuxtjs/opencollective" "0.2.2" fast-safe-stringify "2.0.7" - iterare "1.2.0" + iterare "1.2.1" object-hash "2.0.3" path-to-regexp "3.2.0" - tslib "1.11.1" - uuid "7.0.2" + tslib "2.0.3" + uuid "8.3.1" "@nestjs/platform-express@7.0.3": version "7.0.3" @@ -1135,12 +1135,12 @@ optional "0.1.4" tslib "1.11.1" -"@nestjs/typeorm@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@nestjs/typeorm/-/typeorm-7.0.0.tgz#0993a949bba81756317e8e865882184bd7f16133" - integrity sha512-oIiQRihMVNQPE6PzEaB7UDfGlktCtkHNxI2HeSf/Uyrjl7DspPSHNLg9IVVSztk+L9kJquYMXhzApr2PxoK3EQ== +"@nestjs/typeorm@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@nestjs/typeorm/-/typeorm-7.1.5.tgz#50e3bf85ff8cf78d47d8dd19210c5f02b488f5e3" + integrity sha512-utE1FkYM/gyCXUqw3zKYYS0YZ3DfkAnzsCx4T48cNnSDTCeWS+u3yt0FMDFjwSiQSaLrzpiSff/FaxJQvRlYow== dependencies: - uuid "7.0.2" + uuid "8.3.1" "@nodelib/fs.stat@^1.1.2": version "1.1.3" @@ -1249,6 +1249,11 @@ dependencies: "@types/node" ">= 8" +"@sqltools/formatter@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.2.tgz#9390a8127c0dcba61ebd7fdcc748655e191bdd68" + integrity sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q== + "@types/babel__core@^7.1.0": version "7.1.6" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" @@ -1525,7 +1530,7 @@ ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-regex@^2.0.0, ansi-regex@^2.1.1: +ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= @@ -1583,10 +1588,10 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -app-root-path@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" - integrity sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA== +app-root-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" + integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== append-field@^1.0.0: version "1.0.0" @@ -1747,12 +1752,12 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -axios@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== +axios@0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.0.tgz#26df088803a2350dff2c27f96fef99fe49442aca" + integrity sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw== dependencies: - follow-redirects "1.5.10" + follow-redirects "^1.10.0" babel-code-frame@^6.26.0: version "6.26.0" @@ -1851,7 +1856,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.0.2: +base64-js@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== @@ -1997,13 +2002,13 @@ buffer-writer@2.0.0: resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== -buffer@^5.1.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce" - integrity sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" + base64-js "^1.3.1" + ieee754 "^1.1.13" builtin-modules@^1.1.1: version "1.1.1" @@ -2202,6 +2207,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -2270,18 +2283,6 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= -cli-color@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.0.tgz#11ecfb58a79278cf6035a60c54e338f9d837897c" - integrity sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A== - dependencies: - ansi-regex "^2.1.1" - d "^1.0.1" - es5-ext "^0.10.51" - es6-iterator "^2.0.3" - memoizee "^0.4.14" - timers-ext "^0.1.7" - cli-cursor@^1.0.1, cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -2296,16 +2297,16 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-highlight@^2.0.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.4.tgz#098cb642cf17f42adc1c1145e07f960ec4d7522b" - integrity sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ== +cli-highlight@^2.1.4: + version "2.1.8" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.8.tgz#aa3130b481649d631ab913ae60becf81c69c3887" + integrity sha512-mFuTW5UOV3/S0wZE9/1b0EcAM0XOJIhoAWPhWm5voiJ6ugVBkvYBIEL7sbHo9sEtWdEmwDIWab32qpaRI3cfqQ== dependencies: - chalk "^3.0.0" - highlight.js "^9.6.0" + chalk "^4.0.0" + highlight.js "^10.0.0" mz "^2.4.0" parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" yargs "^15.0.0" cli-spinners@^0.1.2: @@ -2354,6 +2355,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -2858,14 +2868,6 @@ cz-conventional-changelog@3.0.2: optionalDependencies: "@commitlint/load" ">6.1.1" -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - dargs@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" @@ -2906,7 +2908,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: dependencies: ms "2.0.0" -debug@3.1.0, debug@=3.1.0: +debug@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -3137,10 +3139,10 @@ dot-prop@^4.1.0, dot-prop@^4.2.0: dependencies: is-obj "^1.0.0" -dotenv@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" - integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== +dotenv@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== double-ended-queue@^2.1.0-0: version "2.1.0-0" @@ -3259,24 +3261,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.51, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-iterator@^2.0.3, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -3289,23 +3273,10 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -es6-symbol@^3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -es6-weak-map@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" @@ -3349,14 +3320,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - event-stream@=3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" @@ -3508,13 +3471,6 @@ express@4.17.1: utils-merge "1.0.1" vary "~1.1.2" -ext@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== - dependencies: - type "^2.0.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -3739,12 +3695,10 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" +follow-redirects@^1.10.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== for-in@^1.0.2: version "1.0.2" @@ -3882,7 +3836,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -4039,7 +3993,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -4254,10 +4208,10 @@ highlight-es@^1.0.0: is-es2016-keyword "^1.0.0" js-tokens "^3.0.0" -highlight.js@^9.6.0: - version "9.18.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c" - integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg== +highlight.js@^10.0.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.0.tgz#ef3ce475e5dfa7a48484260b49ea242ddab823a0" + integrity sha512-EfrUGcQ63oLJbj0J0RI9ebX6TAITbsDBLbsjr881L/X5fMO9+oadKzEF21C7R3ULKG6Gv3uoab2HiqVJa/4+oA== homedir-polyfill@^1.0.1: version "1.0.3" @@ -4366,10 +4320,10 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== iferr@^0.1.5: version "0.1.5" @@ -4786,7 +4740,7 @@ is-plain-object@^3.0.0: dependencies: isobject "^4.0.0" -is-promise@^2.1, is-promise@^2.1.0: +is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= @@ -4936,10 +4890,10 @@ istanbul-reports@^2.2.6: dependencies: html-escaper "^2.0.0" -iterare@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.0.tgz#7427f5ed45986e4b73e2fea903579f1117f3dd15" - integrity sha512-RxMV9p/UzdK0Iplnd8mVgRvNdXlsTOiuDrqMRnDi3wIhbT+JP4xDquAX9ay13R3CH72NBzQ91KWe0+C168QAyQ== +iterare@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" + integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== jest-changed-files@^24.9.0: version "24.9.0" @@ -5351,6 +5305,14 @@ js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.4.2, js-yaml@^3.9.0: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -5740,13 +5702,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-queue@0.1: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= - dependencies: - es5-ext "~0.10.2" - macos-release@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" @@ -5856,20 +5811,6 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -memoizee@^0.4.14: - version "0.4.14" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== - dependencies: - d "1" - es5-ext "^0.10.45" - es6-weak-map "^2.0.2" - event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.5" - meow@^3.3.0, meow@^3.6.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -6075,6 +6016,11 @@ mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "^1.2.5" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -6219,16 +6165,6 @@ nested-error-stacks@^1.0.0, nested-error-stacks@^1.0.1: dependencies: inherits "~2.0.1" -next-tick@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -6897,12 +6833,12 @@ parse-url@^5.0.0: parse-path "^4.0.0" protocols "^1.4.0" -parse5-htmlparser2-tree-adapter@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz#e8c743d4e92194d5293ecde2b08be31e67461cbc" - integrity sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw== +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== dependencies: - parse5 "^5.1.1" + parse5 "^6.0.1" parse5@4.0.0: version "4.0.0" @@ -6914,6 +6850,11 @@ parse5@^5.1.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -7016,20 +6957,25 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pg-connection-string@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" - integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= +pg-connection-string@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.4.0.tgz#c979922eb47832999a204da5dbe1ebf2341b6a10" + integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ== pg-int8@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.10.tgz#842ee23b04e86824ce9d786430f8365082d81c4a" - integrity sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg== +pg-pool@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.2.2.tgz#a560e433443ed4ad946b84d774b3f22452694dff" + integrity sha512-ORJoFxAlmmros8igi608iVEbQNNZlp89diFVx6yV5v+ehmpMY9sK6QgpmgoXbmkNaBAx8cOOZh9g80kJv1ooyA== + +pg-protocol@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.3.0.tgz#3c8fb7ca34dbbfcc42776ce34ac5f537d6e34770" + integrity sha512-64/bYByMrhWULUaCd+6/72c9PMWhiVFs3EVxl9Ct6a3v/U8+rKgqP2w+kKg/BIGgMJyB+Bk/eNivT32Al+Jghw== pg-types@^2.1.0: version "2.2.0" @@ -7042,18 +6988,18 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@7.12.1: - version "7.12.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-7.12.1.tgz#880636d46d2efbe0968e64e9fe0eeece8ef72a7e" - integrity sha512-l1UuyfEvoswYfcUe6k+JaxiN+5vkOgYcVSbSuw3FvdLqDbaoa2RJo1zfJKfPsSYPFVERd4GHvX3s2PjG1asSDA== +pg@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.4.2.tgz#2aa58166a23391e91d56a7ea57c6d99931c0642a" + integrity sha512-E9FlUrrc7w3+sbRmL1CSw99vifACzB2TjhMM9J5w9D1LIg+6un0jKkpHS1EQf2CWhKhec2bhrBLVMmUBDbjPRQ== dependencies: buffer-writer "2.0.0" packet-reader "1.0.0" - pg-connection-string "0.1.3" - pg-pool "^2.0.4" + pg-connection-string "^2.4.0" + pg-pool "^3.2.2" + pg-protocol "^1.3.0" pg-types "^2.1.0" pgpass "1.x" - semver "4.3.2" pgpass@1.x: version "1.0.2" @@ -7950,11 +7896,6 @@ semver-regex@1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" - integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= - semver@^6.0.0, semver@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -8009,6 +7950,14 @@ setprototypeof@1.1.1: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -8660,14 +8609,6 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= -timers-ext@^0.1.5, timers-ext@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== - dependencies: - es5-ext "~0.10.46" - next-tick "1" - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -8809,6 +8750,16 @@ tslib@1.11.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +tslib@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + +tslib@^1.13.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslint-config-prettier@1.18.0: version "1.18.0" resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" @@ -8882,40 +8833,32 @@ type-is@^1.6.4, type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" - integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typeorm@0.2.19: - version "0.2.19" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.19.tgz#a0cff0714180e5720df157df02c5759a1a646dc3" - integrity sha512-xKVx/W41zckQ7v8WYcpRhSKpjXDKG/Jgjy0RWvYelR8ZnfyblNRL12jF4P8tIhwXv6l5t01s7HEc9lR+zb6Gtg== +typeorm@0.2.29: + version "0.2.29" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.29.tgz#401289dc91900d72eccb26e31cdb7f0591a2272e" + integrity sha512-ih1vrTe3gEAGKRcWlcsTRxTL7gNjacQE498wVGuJ3ZRujtMqPZlbAWuC7xDzWCRjQnkZYNwZQeG9UgKfxSHB5g== dependencies: - app-root-path "^2.0.1" - buffer "^5.1.0" - chalk "^2.4.2" - cli-highlight "^2.0.0" + "@sqltools/formatter" "1.2.2" + app-root-path "^3.0.0" + buffer "^5.5.0" + chalk "^4.1.0" + cli-highlight "^2.1.4" debug "^4.1.1" - dotenv "^6.2.0" - glob "^7.1.2" - js-yaml "^3.13.1" - mkdirp "^0.5.1" + dotenv "^8.2.0" + glob "^7.1.6" + js-yaml "^3.14.0" + mkdirp "^1.0.4" reflect-metadata "^0.1.13" - tslib "^1.9.0" - xml2js "^0.4.17" + sha.js "^2.4.11" + tslib "^1.13.0" + xml2js "^0.4.23" yargonaut "^1.1.2" - yargs "^13.2.1" + yargs "^16.0.3" typescript@3.6.3: version "3.6.3" @@ -9087,10 +9030,10 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.2.tgz#7ff5c203467e91f5e0d85cfcbaaf7d2ebbca9be6" - integrity sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw== +uuid@8.3.1: + version "8.3.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" + integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== uuid@^2.0.1: version "2.0.3" @@ -9284,6 +9227,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -9356,7 +9308,7 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@^0.4.17: +xml2js@^0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== @@ -9384,6 +9336,11 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -9434,6 +9391,11 @@ yargs-parser@^18.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" @@ -9459,7 +9421,7 @@ yargs@^12.0.1: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" -yargs@^13.2.1, yargs@^13.3.0: +yargs@^13.3.0: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -9492,6 +9454,19 @@ yargs@^15.0.0: y18n "^4.0.0" yargs-parser "^18.1.1" +yargs@^16.0.3: + version "16.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.1.1.tgz#5a4a095bd1ca806b0a50d0c03611d38034d219a1" + integrity sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" From bbc24cf532e695dd2b8852523149961d96c26b6c Mon Sep 17 00:00:00 2001 From: Alex Kleshchevnikov Date: Sat, 19 Dec 2020 15:56:49 +0200 Subject: [PATCH 2/2] fix(crud): Remove unnecessary comments. --- packages/crud-typeorm/src/typeorm-crud.service.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/crud-typeorm/src/typeorm-crud.service.ts b/packages/crud-typeorm/src/typeorm-crud.service.ts index 87fd70b0..2f28f14d 100644 --- a/packages/crud-typeorm/src/typeorm-crud.service.ts +++ b/packages/crud-typeorm/src/typeorm-crud.service.ts @@ -320,13 +320,6 @@ export class TypeOrmCrudService extends CrudService { if (parsed.includeDeleted === 1 || withDeleted) { builder.withDeleted(); } - // } else { - // this.setAndWhere( - // { field: this.repo.metadata.deleteDateColumn.databaseName, operator: 'isnull' }, - // null, - // builder - // ); - // } } /* istanbul ignore else */