├── .eslintrc.js ├── .gitignore ├── .prettierrc ├── README.md ├── libs ├── index.ts ├── main.ts ├── mocks │ ├── constants │ │ ├── maximum-random-response.constant.ts │ │ └── mock-api-path.constant.ts │ ├── decorators │ │ ├── custom-request.decorator.ts │ │ └── validate-if-or-exclude.decorator.ts │ ├── dtos │ │ ├── create-mock-api.dto.ts │ │ └── create-property.dto.ts │ ├── enums │ │ ├── request-method.enum.ts │ │ └── type-selection.enum.ts │ ├── helpers │ │ └── check-type.helper.ts │ ├── http │ │ └── controllers │ │ │ ├── mock-api-creator.controller.ts │ │ │ └── mock-api.controller.ts │ ├── interfaces │ │ ├── api-swagger-document.interface.ts │ │ ├── column-mete-args.interface.ts │ │ ├── faker-type.interface.ts │ │ ├── mock-api-options.interface.ts │ │ ├── mock-api.interface.ts │ │ ├── swagger-spec.interface.ts │ │ └── update-mock-api-json.interface.ts │ ├── mock.module.ts │ ├── services │ │ ├── mock-api-creator.service.ts │ │ ├── mock-api.service.ts │ │ └── swagger.service.ts │ └── types │ │ └── swagger-spec-response.type.ts ├── static │ └── index.css └── views │ └── mock-api-creator.hbs ├── package-lock.json ├── package.json ├── tsconfig.build.json └── tsconfig.json /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/parser', 3 | parserOptions: { 4 | project: 'tsconfig.json', 5 | sourceType: 'module' 6 | }, 7 | plugins: ['@typescript-eslint/eslint-plugin'], 8 | extends: [ 9 | 'plugin:prettier/recommended', 10 | 'plugin:@typescript-eslint/recommended' 11 | ], 12 | root: true, 13 | env: { 14 | node: true, 15 | jest: true 16 | }, 17 | overrides: [ 18 | { 19 | 'files': ['*.e2e-spec.ts', 'country.helper.ts', '*.spec.ts'], 20 | 'rules': { 21 | 'max-lines-per-function': 'off', 22 | 'max-lines': 'off', 23 | } 24 | } 25 | ], 26 | ignorePatterns: ['.eslintrc.js'], 27 | rules: { 28 | 'max-lines': ['error', { 29 | max: 400, 30 | skipComments: true 31 | }], 32 | 'max-lines-per-function': ['error', { 33 | max: 50, 34 | skipComments: true 35 | }], 36 | '@typescript-eslint/naming-convention': [ 37 | 'error', 38 | { 'selector': 'enumMember', 'format': ['UPPER_CASE'] }, 39 | { 40 | 'selector': [ 41 | 'objectLiteralProperty' 42 | ], 43 | 'format': ['camelCase', 'PascalCase', 'UPPER_CASE'] 44 | }, 45 | { 46 | 'selector': [ 47 | 'parameter', 48 | 'variable', 49 | 'function', 50 | 'classProperty', 51 | 'typeProperty', 52 | 'parameterProperty', 53 | 'classMethod', 54 | 'objectLiteralMethod', 55 | 'typeMethod' 56 | ], 57 | 'format': ['camelCase'] 58 | }, 59 | { 60 | 'selector': [ 61 | 'class', 62 | 'interface', 63 | 'enum' 64 | ], 65 | 'format': ['PascalCase'] 66 | }, 67 | { 68 | 'selector': [ 69 | 'variable' 70 | ], 71 | 'modifiers': ['exported'], 72 | 'format': ['PascalCase', 'camelCase', 'UPPER_CASE'] 73 | }, 74 | { 75 | 'selector': [ 76 | 'function' 77 | ], 78 | 'modifiers': ['exported'], 79 | 'format': ['PascalCase', 'camelCase'] 80 | } 81 | ], 82 | '@typescript-eslint/interface-name-prefix': 'off', 83 | '@typescript-eslint/no-empty-function': 'off', 84 | '@typescript-eslint/explicit-function-return-type': 'off', 85 | '@typescript-eslint/explicit-module-boundary-types': 'off', 86 | '@typescript-eslint/no-explicit-any': 'off', 87 | '@typescript-eslint/no-inferrable-types': 'off', 88 | '@typescript-eslint/no-unused-vars': ['error', { 'args': 'none' }], 89 | 'indent': 'off', 90 | 'prettier/prettier': [ 91 | 'error', 92 | { 93 | 'useTabs': false, 94 | 'tabWidth': 4, 95 | 'printWidth': 120, 96 | 'singleQuote': true, 97 | 'trailingComma': 'none' 98 | } 99 | ], 100 | 'prefer-const': 'off' 101 | } 102 | }; 103 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | /dist 3 | /node_modules 4 | 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | 13 | # OS 14 | .DS_Store 15 | 16 | # Tests 17 | /coverage 18 | /.nyc_output 19 | 20 | # IDEs and editors 21 | /.idea 22 | .project 23 | .classpath 24 | .c9/ 25 | *.launch 26 | .settings/ 27 | *.sublime-workspace 28 | 29 | # IDE - VSCode 30 | .vscode/* 31 | !.vscode/settings.json 32 | !.vscode/tasks.json 33 | !.vscode/launch.json 34 | !.vscode/extensions.json 35 | 36 | .env -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "printWidth": 120, 4 | "proseWrap": "always", 5 | "tabWidth": 4, 6 | "useTabs": false, 7 | "trailingComma": "none", 8 | "bracketSpacing": true, 9 | "jsxBracketSameLine": false, 10 | "semi": true, 11 | "endOfLine": "auto" 12 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Nest Logo 3 |

4 | 5 | # nestjs-mocker 6 | 7 | ## Description 8 | -------------------------------------------------------------------------------- /libs/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hodfords-solutions/nestjs-mocker/df081ed7e3d7dd2bfc28fbc1b8d014930d7b6f53/libs/index.ts -------------------------------------------------------------------------------- /libs/main.ts: -------------------------------------------------------------------------------- 1 | import hbs from 'hbs'; 2 | import { join } from 'path'; 3 | import { NestFactory } from '@nestjs/core'; 4 | import { MockApiModule } from '~mocks/mock.module'; 5 | import { NestExpressApplication } from '@nestjs/platform-express'; 6 | 7 | async function boostrap() { 8 | const app = await NestFactory.create(MockApiModule); 9 | app.useStaticAssets(join(__dirname, 'static')); 10 | app.setBaseViewsDir(join(__dirname, 'views')); 11 | app.setViewEngine('hbs'); 12 | hbs.registerHelper('json', function (obj) { 13 | return new hbs.SafeString(JSON.stringify(obj)); 14 | }); 15 | } 16 | 17 | boostrap(); 18 | -------------------------------------------------------------------------------- /libs/mocks/constants/maximum-random-response.constant.ts: -------------------------------------------------------------------------------- 1 | export const MAXIMUM_RANDOM_RESPONSE = 'MAXIMUM_RANDOM_RESPONSE'; 2 | -------------------------------------------------------------------------------- /libs/mocks/constants/mock-api-path.constant.ts: -------------------------------------------------------------------------------- 1 | export const MOCK_API_PATH = 'MOCK_API_PATH'; 2 | -------------------------------------------------------------------------------- /libs/mocks/decorators/custom-request.decorator.ts: -------------------------------------------------------------------------------- 1 | import { createParamDecorator, ExecutionContext } from '@nestjs/common'; 2 | import { RequestMethodEnum } from '~mocks/enums/request-method.enum'; 3 | 4 | export const CustomRequest = createParamDecorator((pathParams, ctx: ExecutionContext) => { 5 | const request = ctx.switchToHttp().getRequest(); 6 | return { 7 | endpoint: request.url, 8 | method: request.method.toLowerCase() 9 | }; 10 | }); 11 | 12 | export interface CustomRequest { 13 | endpoint: string; 14 | method: RequestMethodEnum; 15 | } 16 | -------------------------------------------------------------------------------- /libs/mocks/decorators/validate-if-or-exclude.decorator.ts: -------------------------------------------------------------------------------- 1 | import { ValidateIf, ValidationOptions } from 'class-validator'; 2 | 3 | export const TRANSFORMER_EXCLUDE_KEY = 'transformer:exclude'; 4 | 5 | export function ValidateIfOrExclude( 6 | condition: (object: any, value: any) => boolean, 7 | validationOptions?: ValidationOptions 8 | ): PropertyDecorator { 9 | return function (object, propertyName: string): void { 10 | const metadatas = Reflect.getMetadata(TRANSFORMER_EXCLUDE_KEY, object.constructor) || []; 11 | Reflect.defineMetadata( 12 | TRANSFORMER_EXCLUDE_KEY, 13 | [...metadatas, { propertyName, condition }], 14 | object.constructor 15 | ); 16 | 17 | ValidateIf(condition, validationOptions)(object, propertyName); 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /libs/mocks/dtos/create-mock-api.dto.ts: -------------------------------------------------------------------------------- 1 | import { RequestMethodEnum } from '~mocks/enums/request-method.enum'; 2 | import { ApiProperty } from '@nestjs/swagger'; 3 | import { IsEnum, IsNotEmpty, IsNumber, IsOptional } from 'class-validator'; 4 | import { CreatePropertyDto } from '~mocks/dtos/create-property.dto'; 5 | 6 | export class CreateMockApiDto { 7 | @ApiProperty({ 8 | enum: RequestMethodEnum, 9 | default: RequestMethodEnum.GET 10 | }) 11 | @IsNotEmpty() 12 | @IsEnum(RequestMethodEnum) 13 | method: RequestMethodEnum; 14 | 15 | @ApiProperty() 16 | @IsNotEmpty() 17 | endpoint: string; 18 | 19 | @ApiProperty() 20 | @IsOptional() 21 | @IsNumber() 22 | delay?: number; 23 | 24 | @ApiProperty() 25 | @IsOptional() 26 | body?: CreatePropertyDto[]; 27 | 28 | @ApiProperty() 29 | @IsNotEmpty() 30 | response: CreatePropertyDto[]; 31 | } 32 | -------------------------------------------------------------------------------- /libs/mocks/dtos/create-property.dto.ts: -------------------------------------------------------------------------------- 1 | import { ApiProperty } from '@nestjs/swagger'; 2 | import { IsBoolean, IsNotEmpty, IsOptional } from 'class-validator'; 3 | import { TypeSelectionEnum } from '~mocks/enums/type-selection.enum'; 4 | import { FakerType } from '~mocks/interfaces/faker-type.interface'; 5 | import { ValidateIfOrExclude } from '~mocks/decorators/validate-if-or-exclude.decorator'; 6 | 7 | export class CreatePropertyDto { 8 | @ApiProperty() 9 | @IsNotEmpty() 10 | key?: string; 11 | 12 | @ApiProperty({ 13 | enum: TypeSelectionEnum, 14 | default: TypeSelectionEnum.UUID 15 | }) 16 | @IsNotEmpty() 17 | type: TypeSelectionEnum; 18 | 19 | @ApiProperty({ required: false }) 20 | @IsOptional() 21 | @ValidateIfOrExclude(({ type }) => type === TypeSelectionEnum.FAKER) 22 | fakerType?: FakerType; 23 | 24 | @ApiProperty({ required: false }) 25 | @IsOptional() 26 | overrideValue?: string | number; 27 | 28 | @ApiProperty({ required: false }) 29 | @IsOptional() 30 | defaultValue?: string | number; 31 | 32 | @ApiProperty({ default: true }) 33 | @IsBoolean() 34 | isRequired: boolean; 35 | 36 | @ApiProperty({ required: false }) 37 | @IsOptional() 38 | items: CreatePropertyDto[]; 39 | } 40 | -------------------------------------------------------------------------------- /libs/mocks/enums/request-method.enum.ts: -------------------------------------------------------------------------------- 1 | export enum RequestMethodEnum { 2 | GET = 'GET', 3 | POST = 'POST', 4 | PUT = 'PUT', 5 | PATCH = 'PATCH', 6 | DELETE = 'DELETE' 7 | } 8 | -------------------------------------------------------------------------------- /libs/mocks/enums/type-selection.enum.ts: -------------------------------------------------------------------------------- 1 | export enum TypeSelectionEnum { 2 | UUID = 'UUID', 3 | STRING = 'STRING', 4 | NUMBER = 'NUMBER', 5 | BOOLEAN = 'BOOLEAN', 6 | DATE = 'DATE', 7 | FAKER = 'FAKER', 8 | OBJECT = 'OBJECT', 9 | ARRAY_OBJECT = 'ARRAY_OBJECT', 10 | ARRAY_STRING = 'ARRAY_STRING', 11 | ARRAY_NUMBER = 'ARRAY_NUMBER', 12 | ENUM = 'ENUM', 13 | ENTITIES = 'ENTITIES' 14 | } 15 | -------------------------------------------------------------------------------- /libs/mocks/helpers/check-type.helper.ts: -------------------------------------------------------------------------------- 1 | import { TypeSelectionEnum } from '~mocks/enums/type-selection.enum'; 2 | 3 | export const isArrayOfObjectType = (type) => type === TypeSelectionEnum.ARRAY_OBJECT; 4 | export const isArrayOfPrimitiveType = (type) => 5 | type === TypeSelectionEnum.ARRAY_STRING || type === TypeSelectionEnum.ARRAY_NUMBER; 6 | 7 | export const isObjectType = (type) => type === TypeSelectionEnum.OBJECT; 8 | export const isUUIDType = (type) => type === TypeSelectionEnum.UUID; 9 | export const isFakerType = (type) => type === TypeSelectionEnum.FAKER; 10 | export const isEnumType = (type) => type === TypeSelectionEnum.ENUM; 11 | export const isEntitiesType = (type) => type === TypeSelectionEnum.ENTITIES; 12 | export const isPrimitive = (type) => 13 | type === TypeSelectionEnum.UUID || 14 | type === TypeSelectionEnum.STRING || 15 | type === TypeSelectionEnum.NUMBER || 16 | type === TypeSelectionEnum.BOOLEAN || 17 | type === TypeSelectionEnum.FAKER; 18 | -------------------------------------------------------------------------------- /libs/mocks/http/controllers/mock-api-creator.controller.ts: -------------------------------------------------------------------------------- 1 | import { Body, Controller, Get, Post, Render } from '@nestjs/common'; 2 | import { ApiOperation } from '@nestjs/swagger'; 3 | import { MockApiCreatorService } from '~mocks/services/mock-api-creator.service'; 4 | import { CreateMockApiDto } from '~mocks/dtos/create-mock-api.dto'; 5 | import { RequestMethodEnum } from '~mocks/enums/request-method.enum'; 6 | import { TypeSelectionEnum } from '~mocks/enums/type-selection.enum'; 7 | 8 | @Controller('mock-api-creator') 9 | export class MockApiCreatorController { 10 | constructor(private mockApiCreatorService: MockApiCreatorService) {} 11 | 12 | @Post() 13 | @ApiOperation({ 14 | description: 'Create a new mocking api endpoint' 15 | }) 16 | create(@Body() dto: CreateMockApiDto) { 17 | return this.mockApiCreatorService.createMockApi(dto); 18 | } 19 | 20 | @Get('') 21 | @ApiOperation({ 22 | description: 'Create mock api page' 23 | }) 24 | @Render('mock-api-creator') 25 | loadMockApiCreatePage() { 26 | const fakerMethods = MockApiCreatorService.listFakerMethods(); 27 | const entities = MockApiCreatorService.getCurrentEntities(['File', 'User', 'Otp']); 28 | const requestMethods = Object.keys(RequestMethodEnum); 29 | const typeSelection = Object.keys(TypeSelectionEnum); 30 | const delaySelection = ['0', '1', '3', '5', '8']; 31 | 32 | return { 33 | entities, 34 | fakerMethods, 35 | requestMethods, 36 | typeSelection, 37 | delaySelection 38 | }; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /libs/mocks/http/controllers/mock-api.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Delete, Get, Patch, Post, Put } from '@nestjs/common'; 2 | import { ApiOperation, ApiTags } from '@nestjs/swagger'; 3 | import { MockApiService } from '~mocks/services/mock-api.service'; 4 | import { CustomRequest } from '~mocks/decorators/custom-request.decorator'; 5 | 6 | @Controller('mocks') 7 | @ApiTags('Mocks') 8 | export class MockApiController { 9 | constructor(private readonly mockApiService: MockApiService) {} 10 | 11 | @Get('*') 12 | @ApiOperation({ 13 | description: 'Get response of mock api for GET method' 14 | }) 15 | getResponseForGetMethod(@CustomRequest() customRequest: CustomRequest) { 16 | return this.mockApiService.getMockApiResponse(customRequest); 17 | } 18 | 19 | @Put('*') 20 | @ApiOperation({ 21 | description: 'Get response of mock api for POST method' 22 | }) 23 | getResponseForPutMethod(@CustomRequest() customRequest: CustomRequest) { 24 | return this.mockApiService.getMockApiResponse(customRequest); 25 | } 26 | 27 | @Patch('*') 28 | @ApiOperation({ 29 | description: 'Get response of mock api for PATCH method' 30 | }) 31 | getResponseForPatchMethod(@CustomRequest() customRequest: CustomRequest) { 32 | return this.mockApiService.getMockApiResponse(customRequest); 33 | } 34 | 35 | @Post('*') 36 | @ApiOperation({ 37 | description: 'Get response of mock api for POST method' 38 | }) 39 | getResponseForPostMethod(@CustomRequest() customRequest: CustomRequest) { 40 | return this.mockApiService.getMockApiResponse(customRequest); 41 | } 42 | 43 | @Delete('*') 44 | @ApiOperation({ 45 | description: 'Get response of mock api for DELETE method' 46 | }) 47 | getResponseForDeleteMethod(@CustomRequest() customRequest: CustomRequest) { 48 | return this.mockApiService.getMockApiResponse(customRequest); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /libs/mocks/interfaces/api-swagger-document.interface.ts: -------------------------------------------------------------------------------- 1 | interface Endpoint { 2 | operationId: string; 3 | summary?: string; 4 | description?: string; 5 | tags: string[]; 6 | } 7 | 8 | interface Endpoints { 9 | [method: string]: Endpoint; 10 | } 11 | 12 | export interface ApiSwaggerDocumentInterface { 13 | [endpoint: string]: Endpoints; 14 | } 15 | -------------------------------------------------------------------------------- /libs/mocks/interfaces/column-mete-args.interface.ts: -------------------------------------------------------------------------------- 1 | import { ColumnType } from 'typeorm'; 2 | 3 | export interface ColumnMeteArgs { 4 | key: string; 5 | type: ColumnType; 6 | isRequired: boolean; 7 | } 8 | -------------------------------------------------------------------------------- /libs/mocks/interfaces/faker-type.interface.ts: -------------------------------------------------------------------------------- 1 | export interface FakerType { 2 | category: string; 3 | method: string; 4 | } 5 | -------------------------------------------------------------------------------- /libs/mocks/interfaces/mock-api-options.interface.ts: -------------------------------------------------------------------------------- 1 | export interface MockApiOptions { 2 | path: string; 3 | maximumRandomResponse: number; 4 | } 5 | -------------------------------------------------------------------------------- /libs/mocks/interfaces/mock-api.interface.ts: -------------------------------------------------------------------------------- 1 | import { RequestMethodEnum } from '~mocks/enums/request-method.enum'; 2 | 3 | export interface MockApi { 4 | method: RequestMethodEnum; 5 | response: any[]; 6 | } 7 | -------------------------------------------------------------------------------- /libs/mocks/interfaces/swagger-spec.interface.ts: -------------------------------------------------------------------------------- 1 | import { PathsObject, SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; 2 | 3 | export interface SwaggerSpec { 4 | pathObject: PathsObject; 5 | schemaObject: { 6 | key: string; 7 | value: SchemaObject; 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /libs/mocks/interfaces/update-mock-api-json.interface.ts: -------------------------------------------------------------------------------- 1 | import { RequestMethodEnum } from '~mocks/enums/request-method.enum'; 2 | import { PathsObject, SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; 3 | 4 | export interface UpdateMockApiJson { 5 | method: RequestMethodEnum; 6 | endpoint: string; 7 | pathObject: PathsObject; 8 | schemaObject?: { 9 | key: string; 10 | value: SchemaObject; 11 | }; 12 | responses?: any[]; 13 | } 14 | -------------------------------------------------------------------------------- /libs/mocks/mock.module.ts: -------------------------------------------------------------------------------- 1 | import { DynamicModule, Module, ValueProvider } from '@nestjs/common'; 2 | import { MockApiCreatorController } from '~mocks/http/controllers/mock-api-creator.controller'; 3 | import { MockApiController } from '~mocks/http/controllers/mock-api.controller'; 4 | import { MockApiCreatorService } from '~mocks/services/mock-api-creator.service'; 5 | import { SwaggerService } from '~mocks/services/swagger.service'; 6 | import { MockApiService } from '~mocks/services/mock-api.service'; 7 | import { MOCK_API_PATH } from '~mocks/constants/mock-api-path.constant'; 8 | import { MockApiOptions } from '~mocks/interfaces/mock-api-options.interface'; 9 | import { MAXIMUM_RANDOM_RESPONSE } from '~mocks/constants/maximum-random-response.constant'; 10 | 11 | @Module({ 12 | providers: [MockApiCreatorService, MockApiService, SwaggerService], 13 | controllers: [MockApiCreatorController, MockApiController], 14 | imports: [], 15 | exports: [] 16 | }) 17 | export class MockApiModule { 18 | static forRoot(options: MockApiOptions): DynamicModule { 19 | const mockApiPathProvider: ValueProvider = { 20 | provide: MOCK_API_PATH, 21 | useValue: options.path 22 | }; 23 | 24 | const maximumRandomResponse: ValueProvider = { 25 | provide: MAXIMUM_RANDOM_RESPONSE, 26 | useValue: options.maximumRandomResponse || 10 27 | }; 28 | 29 | return { 30 | module: MockApiModule, 31 | providers: [mockApiPathProvider, maximumRandomResponse], 32 | exports: [] 33 | }; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /libs/mocks/services/mock-api-creator.service.ts: -------------------------------------------------------------------------------- 1 | import { Inject, Injectable } from '@nestjs/common'; 2 | import { CreateMockApiDto } from '~mocks/dtos/create-mock-api.dto'; 3 | import * as faker from 'faker'; 4 | import { v4 as uuidv4 } from 'uuid'; 5 | import { CreatePropertyDto } from '~mocks/dtos/create-property.dto'; 6 | import { TypeSelectionEnum } from '~mocks/enums/type-selection.enum'; 7 | import { FakerType } from '~mocks/interfaces/faker-type.interface'; 8 | import { SwaggerService } from '~mocks/services/swagger.service'; 9 | import { 10 | isArrayOfObjectType, 11 | isArrayOfPrimitiveType, 12 | isEnumType, 13 | isObjectType, 14 | isPrimitive 15 | } from '~mocks/helpers/check-type.helper'; 16 | import { readFileSync, writeFileSync } from 'fs'; 17 | import { UpdateMockApiJson } from '~mocks/interfaces/update-mock-api-json.interface'; 18 | import { map } from 'lodash'; 19 | import { getMetadataArgsStorage } from 'typeorm'; 20 | import { ColumnMeteArgs } from '~mocks/interfaces/column-mete-args.interface'; 21 | import { MOCK_API_PATH } from '~mocks/constants/mock-api-path.constant'; 22 | import { MAXIMUM_RANDOM_RESPONSE } from '~mocks/constants/maximum-random-response.constant'; 23 | 24 | @Injectable() 25 | export class MockApiCreatorService { 26 | constructor( 27 | @Inject(MOCK_API_PATH) private mockApiPath, 28 | @Inject(MAXIMUM_RANDOM_RESPONSE) private randomDataCount, 29 | private swaggerService: SwaggerService 30 | ) {} 31 | 32 | static listFakerMethods() { 33 | const fakerMethods = [ 34 | 'address', 35 | 'commerce', 36 | 'company', 37 | 'database', 38 | 'datatype', 39 | 'date', 40 | 'finance', 41 | 'git', 42 | 'hacker', 43 | 'helpers', 44 | 'image', 45 | 'internet', 46 | 'lorem', 47 | 'name', 48 | 'music', 49 | 'phone', 50 | 'random', 51 | 'system', 52 | 'time', 53 | 'vehicle' 54 | ]; 55 | return fakerMethods.map((category) => ({ 56 | category, 57 | methods: Object.keys(faker[category]) 58 | })); 59 | } 60 | 61 | static getCurrentEntities(excludes: string[] = []): Record { 62 | const tables = getMetadataArgsStorage().tables; 63 | const columns = getMetadataArgsStorage().columns; 64 | const mapColumnsToTable = tables.reduce((acc, table) => { 65 | if (!excludes.includes(table.name)) { 66 | acc[table.name] = []; 67 | } 68 | return acc; 69 | }, {}); 70 | 71 | for (const { 72 | target, 73 | propertyName, 74 | options: { type, nullable } 75 | } of columns) { 76 | const columnData = { 77 | key: propertyName, 78 | type, 79 | isRequired: !nullable 80 | }; 81 | 82 | const table = Object.getOwnPropertyDescriptor(target, 'name').value.replace('Entity', ''); 83 | if (!excludes.includes(table)) { 84 | mapColumnsToTable[table]?.push(columnData); 85 | } 86 | } 87 | return mapColumnsToTable; 88 | } 89 | 90 | static generateValueByType( 91 | type: TypeSelectionEnum, 92 | fakerType?: FakerType, 93 | overrideValue?: string | number 94 | ): string | number | boolean | Date { 95 | if (overrideValue) { 96 | return overrideValue; 97 | } 98 | switch (type) { 99 | case TypeSelectionEnum.UUID: 100 | return uuidv4(); 101 | case TypeSelectionEnum.STRING: 102 | return faker.name.title(); 103 | case TypeSelectionEnum.NUMBER: 104 | return faker.datatype.number(); 105 | case TypeSelectionEnum.BOOLEAN: 106 | return Math.floor(Math.random() * 3) > 1; 107 | case TypeSelectionEnum.DATE: 108 | return faker.date.future().getTime(); 109 | case TypeSelectionEnum.FAKER: 110 | const { category, method } = fakerType; 111 | return faker[category][method](); 112 | } 113 | } 114 | 115 | static generateNestedProperty(nestedProperty: CreatePropertyDto) { 116 | const { key, type, fakerType, overrideValue } = nestedProperty; 117 | return key 118 | ? { [key]: MockApiCreatorService.generateValueByType(type, fakerType, overrideValue) } 119 | : MockApiCreatorService.generateValueByType(type, fakerType, overrideValue); 120 | } 121 | 122 | static initSchemaIfNotExist(mockApiJSON: any, endpoint: string) { 123 | if (!mockApiJSON.paths[endpoint]) { 124 | mockApiJSON.paths[endpoint] = {}; 125 | } 126 | if (!mockApiJSON.responses[endpoint]) { 127 | mockApiJSON.responses[endpoint] = {}; 128 | } 129 | } 130 | 131 | public createMockApi(dto: CreateMockApiDto) { 132 | const { method, body, endpoint, response } = dto; 133 | const mockEndpoint = `/mocks${endpoint}`; 134 | const { pathObject, schemaObject } = this.swaggerService.buildSwaggerSpec({ 135 | method, 136 | endpoint: mockEndpoint, 137 | body 138 | }); 139 | 140 | const data: UpdateMockApiJson = { 141 | method, 142 | endpoint: mockEndpoint, 143 | pathObject, 144 | schemaObject 145 | }; 146 | if (response.length) { 147 | data.responses = this.generateResponse(dto.response); 148 | } 149 | return this.updateMockApiJSON(data); 150 | } 151 | 152 | private generateData(properties: CreatePropertyDto[]) { 153 | const responses: any = {}; 154 | for (const property of properties) { 155 | const { key, type, fakerType, overrideValue, items } = property; 156 | 157 | if (isArrayOfObjectType(type)) { 158 | responses[key] = this.generateData(items); 159 | } 160 | 161 | if (isArrayOfPrimitiveType(type)) { 162 | responses[key] = items.map((nestedProperty) => 163 | MockApiCreatorService.generateNestedProperty(nestedProperty) 164 | ); 165 | } 166 | 167 | if (isObjectType(type)) { 168 | responses[key] = this.generateData(items); 169 | } 170 | 171 | if (isPrimitive(type)) { 172 | responses[key] = MockApiCreatorService.generateValueByType(type, fakerType, overrideValue); 173 | } 174 | 175 | if (isEnumType(type)) { 176 | const enumValues = map(items, 'key'); 177 | const randomEnumValue = enumValues[Math.floor(Math.random() * enumValues.length)]; 178 | responses[key] = randomEnumValue; 179 | } 180 | } 181 | return responses; 182 | } 183 | 184 | private generateResponse(properties: CreatePropertyDto[], times: number = this.randomDataCount) { 185 | const responses = []; 186 | for (let i = 0; i <= times; i++) { 187 | responses.push(this.generateData(properties)); 188 | } 189 | return responses; 190 | } 191 | 192 | private parseMockApiJsonFile() { 193 | return JSON.parse(readFileSync(this.mockApiPath, { encoding: 'utf-8' })); 194 | } 195 | 196 | private saveMockApiJSON(mockApiJSON) { 197 | writeFileSync(this.mockApiPath, JSON.stringify(mockApiJSON)); 198 | } 199 | 200 | private updateMockApiJSON({ method, endpoint, pathObject, schemaObject, responses }: UpdateMockApiJson) { 201 | const mockApiJSON = this.parseMockApiJsonFile(); 202 | MockApiCreatorService.initSchemaIfNotExist(mockApiJSON, endpoint); 203 | 204 | const lowerMethod = method.toLowerCase(); 205 | mockApiJSON.paths[endpoint][lowerMethod] = pathObject[endpoint][lowerMethod]; 206 | if (schemaObject) { 207 | mockApiJSON.components.schemas[schemaObject.key] = schemaObject.value; 208 | } 209 | if (responses) { 210 | mockApiJSON.responses[endpoint][lowerMethod] = responses; 211 | } 212 | this.saveMockApiJSON(mockApiJSON); 213 | return 1; 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /libs/mocks/services/mock-api.service.ts: -------------------------------------------------------------------------------- 1 | import { Inject, Injectable } from '@nestjs/common'; 2 | import { readFileSync } from 'fs'; 3 | import { resolve } from 'path'; 4 | import { CustomRequest } from '~mocks/decorators/custom-request.decorator'; 5 | import { MOCK_API_PATH } from '~mocks/constants/mock-api-path.constant'; 6 | 7 | @Injectable() 8 | export class MockApiService { 9 | constructor(@Inject(MOCK_API_PATH) private mockApiPath) {} 10 | 11 | private parseMockApiResponseData() { 12 | return JSON.parse(readFileSync(resolve(this.mockApiPath), { encoding: 'utf-8' })); 13 | } 14 | 15 | public getMockApiResponse(request: CustomRequest) { 16 | const { endpoint, method } = request; 17 | const data = this.parseMockApiResponseData(); 18 | return data.responses[endpoint]?.[method]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /libs/mocks/services/swagger.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { CreatePropertyDto } from '~mocks/dtos/create-property.dto'; 3 | import { PathsObject, SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; 4 | import { TypeSelectionEnum } from '~mocks/enums/type-selection.enum'; 5 | import { RequestMethodEnum } from '~mocks/enums/request-method.enum'; 6 | import { v4 as uuidv4 } from 'uuid'; 7 | import { 8 | isArrayOfObjectType, 9 | isArrayOfPrimitiveType, 10 | isEnumType, 11 | isFakerType, 12 | isObjectType, 13 | isUUIDType 14 | } from '~mocks/helpers/check-type.helper'; 15 | import { FakerType } from '~mocks/interfaces/faker-type.interface'; 16 | import { map } from 'lodash'; 17 | import { SwaggerSpecResponse } from '~mocks/types/swagger-spec-response.type'; 18 | 19 | @Injectable() 20 | export class SwaggerService { 21 | static mapResponseByMethod(method: RequestMethodEnum) { 22 | switch (method) { 23 | case RequestMethodEnum.POST: 24 | return { '201': { description: '' } }; 25 | case RequestMethodEnum.GET: 26 | case RequestMethodEnum.PATCH: 27 | case RequestMethodEnum.PUT: 28 | case RequestMethodEnum.DELETE: 29 | return { '200': { description: '' } }; 30 | } 31 | } 32 | 33 | static splitEndpoint(endpoint: string): { prefix: string; resource: string } { 34 | const splitEndpoint = endpoint.split('/'); 35 | return { 36 | prefix: splitEndpoint[1], 37 | resource: splitEndpoint[2] 38 | }; 39 | } 40 | 41 | static capitalizeFirstLetter(prefix) { 42 | return prefix.charAt(0).toUpperCase() + prefix.slice(1); 43 | } 44 | 45 | static buildDtoObject(method: RequestMethodEnum, resource: string) { 46 | const requestMethodDtoMapper = { 47 | [RequestMethodEnum.PUT]: 'Update', 48 | [RequestMethodEnum.PATCH]: 'Modifies', 49 | [RequestMethodEnum.POST]: 'Create', 50 | [RequestMethodEnum.DELETE]: 'Delete' 51 | }; 52 | const capitalizedResource = SwaggerService.capitalizeFirstLetter(resource); 53 | const standardizedResource = capitalizedResource.slice(0, capitalizedResource.length - 1); 54 | return `${requestMethodDtoMapper[method]}${standardizedResource}Dto`; 55 | } 56 | 57 | static maybeHavingRequestBody(method) { 58 | return ( 59 | method === RequestMethodEnum.POST || 60 | method === RequestMethodEnum.PUT || 61 | method === RequestMethodEnum.PATCH || 62 | method === RequestMethodEnum.DELETE 63 | ); 64 | } 65 | 66 | static buildPathObject(endpoint: string, method: RequestMethodEnum, body?: CreatePropertyDto[]): PathsObject { 67 | const { prefix, resource } = SwaggerService.splitEndpoint(endpoint); 68 | const pathObject: PathsObject = { 69 | [endpoint]: { 70 | [method.toLowerCase()]: { 71 | operationId: uuidv4(), 72 | summary: '', 73 | description: '', 74 | tags: [SwaggerService.capitalizeFirstLetter(prefix)], 75 | responses: SwaggerService.mapResponseByMethod(method) 76 | } 77 | } 78 | }; 79 | const operationObject = pathObject[endpoint][method.toLowerCase()]; 80 | if (SwaggerService.maybeHavingRequestBody(method)) { 81 | operationObject.requestBody = body 82 | ? { 83 | require: true, 84 | content: { 85 | 'application/json': { 86 | schema: { 87 | $ref: `#/components/schemas/${SwaggerService.buildDtoObject(method, resource)}` 88 | } 89 | } 90 | } 91 | } 92 | : {}; 93 | } 94 | 95 | return pathObject; 96 | } 97 | 98 | public buildSwaggerSpec(data: { 99 | method: RequestMethodEnum; 100 | endpoint: string; 101 | body?: CreatePropertyDto[]; 102 | }): SwaggerSpecResponse { 103 | const { method, endpoint, body } = data; 104 | const { resource } = SwaggerService.splitEndpoint(endpoint); 105 | 106 | const pathObject = SwaggerService.buildPathObject(endpoint, method, body); 107 | if (SwaggerService.maybeHavingRequestBody(method) && body) { 108 | const schemaObject = { 109 | key: SwaggerService.buildDtoObject(method, resource), 110 | value: this.buildSchemeObject(body) 111 | }; 112 | 113 | return { 114 | pathObject, 115 | schemaObject 116 | }; 117 | } 118 | 119 | return { 120 | pathObject 121 | }; 122 | } 123 | 124 | private mapSchemaFakerType(schema: SchemaObject, fakerType: FakerType): SchemaObject { 125 | const { category, method } = fakerType; 126 | schema.type = TypeSelectionEnum.STRING.toLowerCase(); 127 | schema.example = `${category.toUpperCase()}_${method}`; 128 | return schema; 129 | } 130 | 131 | private mapSchemaEnumType(schema: SchemaObject, items: CreatePropertyDto[]): SchemaObject { 132 | schema.type = TypeSelectionEnum.STRING.toLowerCase(); 133 | schema.enum = map(items, 'key'); 134 | return schema; 135 | } 136 | 137 | private mapSchemaUUIDType(schema: SchemaObject): SchemaObject { 138 | schema.type = TypeSelectionEnum.STRING.toLowerCase(); 139 | schema.example = uuidv4(); 140 | return schema; 141 | } 142 | 143 | private mapSchemaObjectType(schema: SchemaObject, items: CreatePropertyDto[]): SchemaObject { 144 | schema.type = TypeSelectionEnum.OBJECT.toLowerCase(); 145 | for (const nestedProperty of items) { 146 | if (!schema.properties) { 147 | schema.properties = {}; 148 | } 149 | schema.properties[nestedProperty.key] = this.buildSchema(nestedProperty); 150 | } 151 | return schema; 152 | } 153 | 154 | private mapSchemaArrayOfObjectType(schema: SchemaObject, items: CreatePropertyDto[]): SchemaObject { 155 | schema.type = 'array'; 156 | for (const nestedProperty of items) { 157 | if (!schema.items) { 158 | schema.items = {}; 159 | } 160 | schema.items[nestedProperty.key] = this.buildSchema(nestedProperty); 161 | } 162 | return schema; 163 | } 164 | 165 | private mapSchemaArrayOfPrimitiveType(schema: SchemaObject, items: CreatePropertyDto[]): SchemaObject { 166 | schema.type = 'array'; 167 | for (const nestedProperty of items) { 168 | if (!schema.items) { 169 | schema.items = {}; 170 | } 171 | schema.items = { type: nestedProperty.type }; 172 | } 173 | return schema; 174 | } 175 | 176 | private buildSchema(property: CreatePropertyDto) { 177 | const { type, fakerType, overrideValue, defaultValue, items } = property; 178 | 179 | let schema: SchemaObject = { type: type.toLowerCase() }; 180 | if (overrideValue) { 181 | schema.example = overrideValue; 182 | } 183 | if (defaultValue) { 184 | schema.default = defaultValue; 185 | } 186 | if (isArrayOfObjectType(type)) { 187 | schema = this.mapSchemaArrayOfObjectType(schema, items); 188 | } 189 | if (isArrayOfPrimitiveType(type)) { 190 | schema = this.mapSchemaArrayOfPrimitiveType(schema, items); 191 | } 192 | if (isObjectType(type)) { 193 | schema = this.mapSchemaObjectType(schema, items); 194 | } 195 | if (isUUIDType(type)) { 196 | schema = this.mapSchemaUUIDType(schema); 197 | } 198 | if (isFakerType(type)) { 199 | schema = this.mapSchemaFakerType(schema, fakerType); 200 | } 201 | if (isEnumType(type)) { 202 | schema = this.mapSchemaEnumType(schema, items); 203 | } 204 | return schema; 205 | } 206 | 207 | private buildSchemeObject(properties: CreatePropertyDto[]): SchemaObject { 208 | const schemas: SchemaObject = { 209 | type: 'object', 210 | required: [], 211 | properties: {} 212 | }; 213 | for (const property of properties) { 214 | if (property.isRequired) { 215 | schemas.required.push(property.key); 216 | } 217 | schemas.properties[property.key] = this.buildSchema(property); 218 | } 219 | return schemas; 220 | } 221 | } 222 | -------------------------------------------------------------------------------- /libs/mocks/types/swagger-spec-response.type.ts: -------------------------------------------------------------------------------- 1 | import { SwaggerSpec } from '~mocks/interfaces/swagger-spec.interface'; 2 | 3 | export type SwaggerSpecResponse = Partial; 4 | -------------------------------------------------------------------------------- /libs/static/index.css: -------------------------------------------------------------------------------- 1 | .toast { 2 | position: fixed; 3 | top: 10px; 4 | right: 10px; 5 | } 6 | 7 | .form-wrapper { 8 | margin: 30px 450px; 9 | } 10 | 11 | .action-container { 12 | display: flex; 13 | padding: 0 !important; 14 | height: 40px; 15 | } 16 | 17 | .action-container > div { 18 | padding-right: 10px; 19 | } 20 | 21 | .request-methods-wrapper { 22 | width: 16%; 23 | } 24 | 25 | #endpoint-wrapper { 26 | width: 75%; 27 | } 28 | 29 | .delay-wrapper { 30 | width: 15%; 31 | } 32 | 33 | .form-select-property { 34 | width: 20% !important; 35 | margin: 0 36 | } 37 | 38 | .faker-methods-select { 39 | width: 250px !important; 40 | } 41 | 42 | .form-control-key { 43 | width: 25% !important; 44 | } 45 | 46 | .override-value-input { 47 | width: 250px !important; 48 | } 49 | 50 | .add-nested-property-btn { 51 | width: 35px; 52 | } 53 | 54 | .endpoint-group { 55 | height: 30px !important; 56 | } 57 | 58 | .remove-property-btn { 59 | opacity: 0 !important; 60 | } 61 | 62 | .remove-property-btn:hover { 63 | opacity: 100 !important; 64 | transition: opacity 0.7s; 65 | } 66 | 67 | .is-required-checkbox { 68 | width: 28px; 69 | height: 16px; 70 | margin: 12px 2px 0px 10px; 71 | } 72 | -------------------------------------------------------------------------------- /libs/views/mock-api-creator.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Mock Api Creat page 6 | 7 | 8 | 10 | 13 | 14 | 15 |
16 |
17 | Success 18 |
19 |
20 | Add mock API successfully! 21 |
22 |
23 |
24 |
25 | Failed! 26 |
27 |
28 | Please check your input again! 29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | 41 |
42 |
43 | Endpoint 44 | 50 |
51 |
52 | 57 | 58 |
59 |
60 |
61 |
62 | Body 63 |
64 |
65 | 68 | 71 |
72 |
73 |
74 |
75 | 78 |
79 |
80 | Response 81 |
82 | 86 |
87 |
88 | 94 |
95 |
96 |
97 |
98 | 99 | 100 | 762 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nestjs-mocker", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@nestjs/common": { 8 | "version": "8.0.6", 9 | "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-8.0.6.tgz", 10 | "integrity": "sha512-mSD000iYJDN2wjL2hbygCVNVvzvi3VW5EDc25gK1Bj3wUU2HR8m1qOAUBqcCaGIuvBb2cD/pnVkKklnsY0rKhw==", 11 | "dev": true, 12 | "requires": { 13 | "axios": "0.21.1", 14 | "iterare": "1.2.1", 15 | "tslib": "2.3.0", 16 | "uuid": "8.3.2" 17 | } 18 | }, 19 | "@nestjs/core": { 20 | "version": "8.0.6", 21 | "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.0.6.tgz", 22 | "integrity": "sha512-PIGL4TMjVkAsiv5hJinaTx3WdoftYh7pJDwIUQPvRZPLhboGbOJlVapN0Cw5SL7XgNWojQiAsbgLmnGJVDO3Sw==", 23 | "dev": true, 24 | "requires": { 25 | "@nuxtjs/opencollective": "0.3.2", 26 | "fast-safe-stringify": "2.0.8", 27 | "iterare": "1.2.1", 28 | "object-hash": "2.2.0", 29 | "path-to-regexp": "3.2.0", 30 | "tslib": "2.3.0", 31 | "uuid": "8.3.2" 32 | } 33 | }, 34 | "@nestjs/mapped-types": { 35 | "version": "1.0.0", 36 | "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.0.tgz", 37 | "integrity": "sha512-26AW5jHadLXtvHs+M+Agd9KZ92dDlBrmD0rORlBlvn2KvsWs4JRaKl2mUsrW7YsdZeAu3Hc4ukqyYyDdyCmMWQ==", 38 | "dev": true 39 | }, 40 | "@nestjs/platform-express": { 41 | "version": "8.0.6", 42 | "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.0.6.tgz", 43 | "integrity": "sha512-1nIWd2w3aq3k0UNThDI6VWLqurc0Fvw3FO6BHWHK+Y7H/z9KFHZ0W/HdD9IJH05m4Smp/2neZoMkKdlXeh9wpQ==", 44 | "requires": { 45 | "body-parser": "1.19.0", 46 | "cors": "2.8.5", 47 | "express": "4.17.1", 48 | "multer": "1.4.2", 49 | "tslib": "2.3.0" 50 | } 51 | }, 52 | "@nestjs/swagger": { 53 | "version": "5.0.9", 54 | "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-5.0.9.tgz", 55 | "integrity": "sha512-KivZeDgn/VeDn81Rnd/0Cbv7M4kuHRb+Rlri+YsUrw3h9or4bxxRiUg7Yjjt368KxfJgR7C3lc6kltvoI7ucQg==", 56 | "dev": true, 57 | "requires": { 58 | "@nestjs/mapped-types": "1.0.0", 59 | "lodash": "4.17.21", 60 | "path-to-regexp": "3.2.0" 61 | } 62 | }, 63 | "@nestjs/typeorm": { 64 | "version": "github:nestjs/typeorm#fb1158edf1b82cdf080df583cd7f1c4636d56f64", 65 | "from": "github:nestjs/typeorm", 66 | "requires": { 67 | "uuid": "8.3.2" 68 | } 69 | }, 70 | "@nuxtjs/opencollective": { 71 | "version": "0.3.2", 72 | "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", 73 | "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", 74 | "dev": true, 75 | "requires": { 76 | "chalk": "^4.1.0", 77 | "consola": "^2.15.0", 78 | "node-fetch": "^2.6.1" 79 | } 80 | }, 81 | "@sqltools/formatter": { 82 | "version": "1.2.3", 83 | "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", 84 | "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" 85 | }, 86 | "@types/node": { 87 | "version": "16.9.1", 88 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", 89 | "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", 90 | "dev": true 91 | }, 92 | "@types/validator": { 93 | "version": "13.6.3", 94 | "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.6.3.tgz", 95 | "integrity": "sha512-fWG42pMJOL4jKsDDZZREnXLjc3UE0R8LOJfARWYg6U966rxDT7TYejYzLnUF5cvSObGg34nd0+H2wHHU5Omdfw==" 96 | }, 97 | "@types/zen-observable": { 98 | "version": "0.8.3", 99 | "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz", 100 | "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==" 101 | }, 102 | "accepts": { 103 | "version": "1.3.7", 104 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 105 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 106 | "requires": { 107 | "mime-types": "~2.1.24", 108 | "negotiator": "0.6.2" 109 | } 110 | }, 111 | "ansi-regex": { 112 | "version": "5.0.0", 113 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 114 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 115 | }, 116 | "ansi-styles": { 117 | "version": "4.3.0", 118 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 119 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 120 | "requires": { 121 | "color-convert": "^2.0.1" 122 | } 123 | }, 124 | "any-promise": { 125 | "version": "1.3.0", 126 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 127 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 128 | }, 129 | "app-root-path": { 130 | "version": "3.0.0", 131 | "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", 132 | "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" 133 | }, 134 | "append-field": { 135 | "version": "1.0.0", 136 | "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", 137 | "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" 138 | }, 139 | "argparse": { 140 | "version": "2.0.1", 141 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 142 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 143 | }, 144 | "array-flatten": { 145 | "version": "1.1.1", 146 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 147 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 148 | }, 149 | "axios": { 150 | "version": "0.21.1", 151 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", 152 | "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", 153 | "dev": true, 154 | "requires": { 155 | "follow-redirects": "^1.10.0" 156 | } 157 | }, 158 | "balanced-match": { 159 | "version": "1.0.2", 160 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 161 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 162 | }, 163 | "base64-js": { 164 | "version": "1.5.1", 165 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 166 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 167 | }, 168 | "body-parser": { 169 | "version": "1.19.0", 170 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 171 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 172 | "requires": { 173 | "bytes": "3.1.0", 174 | "content-type": "~1.0.4", 175 | "debug": "2.6.9", 176 | "depd": "~1.1.2", 177 | "http-errors": "1.7.2", 178 | "iconv-lite": "0.4.24", 179 | "on-finished": "~2.3.0", 180 | "qs": "6.7.0", 181 | "raw-body": "2.4.0", 182 | "type-is": "~1.6.17" 183 | } 184 | }, 185 | "brace-expansion": { 186 | "version": "1.1.11", 187 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 188 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 189 | "requires": { 190 | "balanced-match": "^1.0.0", 191 | "concat-map": "0.0.1" 192 | } 193 | }, 194 | "buffer": { 195 | "version": "6.0.3", 196 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 197 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 198 | "requires": { 199 | "base64-js": "^1.3.1", 200 | "ieee754": "^1.2.1" 201 | } 202 | }, 203 | "buffer-from": { 204 | "version": "1.1.2", 205 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 206 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 207 | }, 208 | "busboy": { 209 | "version": "0.2.14", 210 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", 211 | "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", 212 | "requires": { 213 | "dicer": "0.2.5", 214 | "readable-stream": "1.1.x" 215 | } 216 | }, 217 | "bytes": { 218 | "version": "3.1.0", 219 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 220 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 221 | }, 222 | "chalk": { 223 | "version": "4.1.2", 224 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 225 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 226 | "requires": { 227 | "ansi-styles": "^4.1.0", 228 | "supports-color": "^7.1.0" 229 | } 230 | }, 231 | "class-validator": { 232 | "version": "0.13.1", 233 | "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.1.tgz", 234 | "integrity": "sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg==", 235 | "requires": { 236 | "@types/validator": "^13.1.3", 237 | "libphonenumber-js": "^1.9.7", 238 | "validator": "^13.5.2" 239 | } 240 | }, 241 | "cli-highlight": { 242 | "version": "2.1.11", 243 | "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", 244 | "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", 245 | "requires": { 246 | "chalk": "^4.0.0", 247 | "highlight.js": "^10.7.1", 248 | "mz": "^2.4.0", 249 | "parse5": "^5.1.1", 250 | "parse5-htmlparser2-tree-adapter": "^6.0.0", 251 | "yargs": "^16.0.0" 252 | }, 253 | "dependencies": { 254 | "yargs": { 255 | "version": "16.2.0", 256 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 257 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 258 | "requires": { 259 | "cliui": "^7.0.2", 260 | "escalade": "^3.1.1", 261 | "get-caller-file": "^2.0.5", 262 | "require-directory": "^2.1.1", 263 | "string-width": "^4.2.0", 264 | "y18n": "^5.0.5", 265 | "yargs-parser": "^20.2.2" 266 | } 267 | } 268 | } 269 | }, 270 | "cliui": { 271 | "version": "7.0.4", 272 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 273 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 274 | "requires": { 275 | "string-width": "^4.2.0", 276 | "strip-ansi": "^6.0.0", 277 | "wrap-ansi": "^7.0.0" 278 | } 279 | }, 280 | "color-convert": { 281 | "version": "2.0.1", 282 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 283 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 284 | "requires": { 285 | "color-name": "~1.1.4" 286 | } 287 | }, 288 | "color-name": { 289 | "version": "1.1.4", 290 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 291 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 292 | }, 293 | "concat-map": { 294 | "version": "0.0.1", 295 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 296 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 297 | }, 298 | "concat-stream": { 299 | "version": "1.6.2", 300 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 301 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 302 | "requires": { 303 | "buffer-from": "^1.0.0", 304 | "inherits": "^2.0.3", 305 | "readable-stream": "^2.2.2", 306 | "typedarray": "^0.0.6" 307 | }, 308 | "dependencies": { 309 | "isarray": { 310 | "version": "1.0.0", 311 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 312 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 313 | }, 314 | "readable-stream": { 315 | "version": "2.3.7", 316 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 317 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 318 | "requires": { 319 | "core-util-is": "~1.0.0", 320 | "inherits": "~2.0.3", 321 | "isarray": "~1.0.0", 322 | "process-nextick-args": "~2.0.0", 323 | "safe-buffer": "~5.1.1", 324 | "string_decoder": "~1.1.1", 325 | "util-deprecate": "~1.0.1" 326 | } 327 | }, 328 | "string_decoder": { 329 | "version": "1.1.1", 330 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 331 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 332 | "requires": { 333 | "safe-buffer": "~5.1.0" 334 | } 335 | } 336 | } 337 | }, 338 | "consola": { 339 | "version": "2.15.3", 340 | "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", 341 | "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", 342 | "dev": true 343 | }, 344 | "content-disposition": { 345 | "version": "0.5.3", 346 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 347 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 348 | "requires": { 349 | "safe-buffer": "5.1.2" 350 | } 351 | }, 352 | "content-type": { 353 | "version": "1.0.4", 354 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 355 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 356 | }, 357 | "cookie": { 358 | "version": "0.4.0", 359 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 360 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 361 | }, 362 | "cookie-signature": { 363 | "version": "1.0.6", 364 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 365 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 366 | }, 367 | "core-util-is": { 368 | "version": "1.0.3", 369 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 370 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 371 | }, 372 | "cors": { 373 | "version": "2.8.5", 374 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 375 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 376 | "requires": { 377 | "object-assign": "^4", 378 | "vary": "^1" 379 | } 380 | }, 381 | "debug": { 382 | "version": "2.6.9", 383 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 384 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 385 | "requires": { 386 | "ms": "2.0.0" 387 | } 388 | }, 389 | "depd": { 390 | "version": "1.1.2", 391 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 392 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 393 | }, 394 | "destroy": { 395 | "version": "1.0.4", 396 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 397 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 398 | }, 399 | "dicer": { 400 | "version": "0.2.5", 401 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", 402 | "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", 403 | "requires": { 404 | "readable-stream": "1.1.x", 405 | "streamsearch": "0.1.2" 406 | } 407 | }, 408 | "dotenv": { 409 | "version": "8.6.0", 410 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", 411 | "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" 412 | }, 413 | "ee-first": { 414 | "version": "1.1.1", 415 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 416 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 417 | }, 418 | "emoji-regex": { 419 | "version": "8.0.0", 420 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 421 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 422 | }, 423 | "encodeurl": { 424 | "version": "1.0.2", 425 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 426 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 427 | }, 428 | "escalade": { 429 | "version": "3.1.1", 430 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 431 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 432 | }, 433 | "escape-html": { 434 | "version": "1.0.3", 435 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 436 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 437 | }, 438 | "escape-string-regexp": { 439 | "version": "1.0.5", 440 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 441 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 442 | }, 443 | "etag": { 444 | "version": "1.8.1", 445 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 446 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 447 | }, 448 | "express": { 449 | "version": "4.17.1", 450 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 451 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 452 | "requires": { 453 | "accepts": "~1.3.7", 454 | "array-flatten": "1.1.1", 455 | "body-parser": "1.19.0", 456 | "content-disposition": "0.5.3", 457 | "content-type": "~1.0.4", 458 | "cookie": "0.4.0", 459 | "cookie-signature": "1.0.6", 460 | "debug": "2.6.9", 461 | "depd": "~1.1.2", 462 | "encodeurl": "~1.0.2", 463 | "escape-html": "~1.0.3", 464 | "etag": "~1.8.1", 465 | "finalhandler": "~1.1.2", 466 | "fresh": "0.5.2", 467 | "merge-descriptors": "1.0.1", 468 | "methods": "~1.1.2", 469 | "on-finished": "~2.3.0", 470 | "parseurl": "~1.3.3", 471 | "path-to-regexp": "0.1.7", 472 | "proxy-addr": "~2.0.5", 473 | "qs": "6.7.0", 474 | "range-parser": "~1.2.1", 475 | "safe-buffer": "5.1.2", 476 | "send": "0.17.1", 477 | "serve-static": "1.14.1", 478 | "setprototypeof": "1.1.1", 479 | "statuses": "~1.5.0", 480 | "type-is": "~1.6.18", 481 | "utils-merge": "1.0.1", 482 | "vary": "~1.1.2" 483 | }, 484 | "dependencies": { 485 | "path-to-regexp": { 486 | "version": "0.1.7", 487 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 488 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 489 | } 490 | } 491 | }, 492 | "faker": { 493 | "version": "5.5.3", 494 | "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", 495 | "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==" 496 | }, 497 | "fast-safe-stringify": { 498 | "version": "2.0.8", 499 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", 500 | "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==", 501 | "dev": true 502 | }, 503 | "figlet": { 504 | "version": "1.5.2", 505 | "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", 506 | "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==" 507 | }, 508 | "finalhandler": { 509 | "version": "1.1.2", 510 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 511 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 512 | "requires": { 513 | "debug": "2.6.9", 514 | "encodeurl": "~1.0.2", 515 | "escape-html": "~1.0.3", 516 | "on-finished": "~2.3.0", 517 | "parseurl": "~1.3.3", 518 | "statuses": "~1.5.0", 519 | "unpipe": "~1.0.0" 520 | } 521 | }, 522 | "follow-redirects": { 523 | "version": "1.14.3", 524 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", 525 | "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==", 526 | "dev": true 527 | }, 528 | "foreachasync": { 529 | "version": "3.0.0", 530 | "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", 531 | "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" 532 | }, 533 | "forwarded": { 534 | "version": "0.2.0", 535 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 536 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 537 | }, 538 | "fresh": { 539 | "version": "0.5.2", 540 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 541 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 542 | }, 543 | "fs.realpath": { 544 | "version": "1.0.0", 545 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 546 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 547 | }, 548 | "get-caller-file": { 549 | "version": "2.0.5", 550 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 551 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 552 | }, 553 | "glob": { 554 | "version": "7.1.7", 555 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 556 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 557 | "requires": { 558 | "fs.realpath": "^1.0.0", 559 | "inflight": "^1.0.4", 560 | "inherits": "2", 561 | "minimatch": "^3.0.4", 562 | "once": "^1.3.0", 563 | "path-is-absolute": "^1.0.0" 564 | } 565 | }, 566 | "handlebars": { 567 | "version": "4.7.7", 568 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", 569 | "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", 570 | "requires": { 571 | "minimist": "^1.2.5", 572 | "neo-async": "^2.6.0", 573 | "source-map": "^0.6.1", 574 | "uglify-js": "^3.1.4", 575 | "wordwrap": "^1.0.0" 576 | } 577 | }, 578 | "has-ansi": { 579 | "version": "2.0.0", 580 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 581 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 582 | "requires": { 583 | "ansi-regex": "^2.0.0" 584 | }, 585 | "dependencies": { 586 | "ansi-regex": { 587 | "version": "2.1.1", 588 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 589 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 590 | } 591 | } 592 | }, 593 | "has-flag": { 594 | "version": "4.0.0", 595 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 596 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 597 | }, 598 | "hbs": { 599 | "version": "4.1.2", 600 | "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.1.2.tgz", 601 | "integrity": "sha512-WfBnQbozbdiTLjJu6P6Wturgvy0FN8xtRmIjmP0ebX9OGQrt+2S6UC7xX0IebHTCS1sXe20zfTzQ7yhjrEvrfQ==", 602 | "requires": { 603 | "handlebars": "4.7.7", 604 | "walk": "2.3.14" 605 | } 606 | }, 607 | "highlight.js": { 608 | "version": "10.7.3", 609 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", 610 | "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" 611 | }, 612 | "http-errors": { 613 | "version": "1.7.2", 614 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 615 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 616 | "requires": { 617 | "depd": "~1.1.2", 618 | "inherits": "2.0.3", 619 | "setprototypeof": "1.1.1", 620 | "statuses": ">= 1.5.0 < 2", 621 | "toidentifier": "1.0.0" 622 | }, 623 | "dependencies": { 624 | "inherits": { 625 | "version": "2.0.3", 626 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 627 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 628 | } 629 | } 630 | }, 631 | "iconv-lite": { 632 | "version": "0.4.24", 633 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 634 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 635 | "requires": { 636 | "safer-buffer": ">= 2.1.2 < 3" 637 | } 638 | }, 639 | "ieee754": { 640 | "version": "1.2.1", 641 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 642 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 643 | }, 644 | "inflight": { 645 | "version": "1.0.6", 646 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 647 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 648 | "requires": { 649 | "once": "^1.3.0", 650 | "wrappy": "1" 651 | } 652 | }, 653 | "inherits": { 654 | "version": "2.0.4", 655 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 656 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 657 | }, 658 | "ipaddr.js": { 659 | "version": "1.9.1", 660 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 661 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 662 | }, 663 | "is-fullwidth-code-point": { 664 | "version": "3.0.0", 665 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 666 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 667 | }, 668 | "isarray": { 669 | "version": "0.0.1", 670 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 671 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 672 | }, 673 | "iterare": { 674 | "version": "1.2.1", 675 | "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", 676 | "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", 677 | "dev": true 678 | }, 679 | "js-yaml": { 680 | "version": "4.1.0", 681 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 682 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 683 | "requires": { 684 | "argparse": "^2.0.1" 685 | } 686 | }, 687 | "libphonenumber-js": { 688 | "version": "1.9.32", 689 | "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.32.tgz", 690 | "integrity": "sha512-sXuNLzTU/lNUZ78eWUi5JvqaHAhwBMuMT17613EjLZl/ejIoDe0EV225Xhw4vuZ6FcqkiwsF8qHcOyyn1dBEWQ==" 691 | }, 692 | "lodash": { 693 | "version": "4.17.21", 694 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 695 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 696 | "dev": true 697 | }, 698 | "media-typer": { 699 | "version": "0.3.0", 700 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 701 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 702 | }, 703 | "merge-descriptors": { 704 | "version": "1.0.1", 705 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 706 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 707 | }, 708 | "methods": { 709 | "version": "1.1.2", 710 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 711 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 712 | }, 713 | "mime": { 714 | "version": "1.6.0", 715 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 716 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 717 | }, 718 | "mime-db": { 719 | "version": "1.49.0", 720 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", 721 | "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" 722 | }, 723 | "mime-types": { 724 | "version": "2.1.32", 725 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", 726 | "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", 727 | "requires": { 728 | "mime-db": "1.49.0" 729 | } 730 | }, 731 | "minimatch": { 732 | "version": "3.0.4", 733 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 734 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 735 | "requires": { 736 | "brace-expansion": "^1.1.7" 737 | } 738 | }, 739 | "minimist": { 740 | "version": "1.2.5", 741 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 742 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 743 | }, 744 | "mkdirp": { 745 | "version": "0.5.5", 746 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 747 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 748 | "requires": { 749 | "minimist": "^1.2.5" 750 | } 751 | }, 752 | "ms": { 753 | "version": "2.0.0", 754 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 755 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 756 | }, 757 | "multer": { 758 | "version": "1.4.2", 759 | "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", 760 | "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", 761 | "requires": { 762 | "append-field": "^1.0.0", 763 | "busboy": "^0.2.11", 764 | "concat-stream": "^1.5.2", 765 | "mkdirp": "^0.5.1", 766 | "object-assign": "^4.1.1", 767 | "on-finished": "^2.3.0", 768 | "type-is": "^1.6.4", 769 | "xtend": "^4.0.0" 770 | } 771 | }, 772 | "mz": { 773 | "version": "2.7.0", 774 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 775 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 776 | "requires": { 777 | "any-promise": "^1.0.0", 778 | "object-assign": "^4.0.1", 779 | "thenify-all": "^1.0.0" 780 | } 781 | }, 782 | "negotiator": { 783 | "version": "0.6.2", 784 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 785 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 786 | }, 787 | "neo-async": { 788 | "version": "2.6.2", 789 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 790 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" 791 | }, 792 | "node-fetch": { 793 | "version": "2.6.2", 794 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", 795 | "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==", 796 | "dev": true 797 | }, 798 | "object-assign": { 799 | "version": "4.1.1", 800 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 801 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 802 | }, 803 | "object-hash": { 804 | "version": "2.2.0", 805 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", 806 | "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", 807 | "dev": true 808 | }, 809 | "on-finished": { 810 | "version": "2.3.0", 811 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 812 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 813 | "requires": { 814 | "ee-first": "1.1.1" 815 | } 816 | }, 817 | "once": { 818 | "version": "1.4.0", 819 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 820 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 821 | "requires": { 822 | "wrappy": "1" 823 | } 824 | }, 825 | "parent-require": { 826 | "version": "1.0.0", 827 | "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", 828 | "integrity": "sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=" 829 | }, 830 | "parse5": { 831 | "version": "5.1.1", 832 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", 833 | "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" 834 | }, 835 | "parse5-htmlparser2-tree-adapter": { 836 | "version": "6.0.1", 837 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", 838 | "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", 839 | "requires": { 840 | "parse5": "^6.0.1" 841 | }, 842 | "dependencies": { 843 | "parse5": { 844 | "version": "6.0.1", 845 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", 846 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" 847 | } 848 | } 849 | }, 850 | "parseurl": { 851 | "version": "1.3.3", 852 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 853 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 854 | }, 855 | "path-is-absolute": { 856 | "version": "1.0.1", 857 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 858 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 859 | }, 860 | "path-to-regexp": { 861 | "version": "3.2.0", 862 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", 863 | "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==", 864 | "dev": true 865 | }, 866 | "prettier": { 867 | "version": "2.4.0", 868 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", 869 | "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", 870 | "dev": true 871 | }, 872 | "process-nextick-args": { 873 | "version": "2.0.1", 874 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 875 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 876 | }, 877 | "proxy-addr": { 878 | "version": "2.0.7", 879 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 880 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 881 | "requires": { 882 | "forwarded": "0.2.0", 883 | "ipaddr.js": "1.9.1" 884 | } 885 | }, 886 | "qs": { 887 | "version": "6.7.0", 888 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 889 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 890 | }, 891 | "range-parser": { 892 | "version": "1.2.1", 893 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 894 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 895 | }, 896 | "raw-body": { 897 | "version": "2.4.0", 898 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 899 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 900 | "requires": { 901 | "bytes": "3.1.0", 902 | "http-errors": "1.7.2", 903 | "iconv-lite": "0.4.24", 904 | "unpipe": "1.0.0" 905 | } 906 | }, 907 | "readable-stream": { 908 | "version": "1.1.14", 909 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 910 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 911 | "requires": { 912 | "core-util-is": "~1.0.0", 913 | "inherits": "~2.0.1", 914 | "isarray": "0.0.1", 915 | "string_decoder": "~0.10.x" 916 | } 917 | }, 918 | "reflect-metadata": { 919 | "version": "0.1.13", 920 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", 921 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" 922 | }, 923 | "require-directory": { 924 | "version": "2.1.1", 925 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 926 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 927 | }, 928 | "rimraf": { 929 | "version": "3.0.2", 930 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 931 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 932 | "dev": true, 933 | "requires": { 934 | "glob": "^7.1.3" 935 | } 936 | }, 937 | "rxjs": { 938 | "version": "7.3.0", 939 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", 940 | "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", 941 | "dev": true, 942 | "requires": { 943 | "tslib": "~2.1.0" 944 | }, 945 | "dependencies": { 946 | "tslib": { 947 | "version": "2.1.0", 948 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", 949 | "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", 950 | "dev": true 951 | } 952 | } 953 | }, 954 | "safe-buffer": { 955 | "version": "5.1.2", 956 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 957 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 958 | }, 959 | "safer-buffer": { 960 | "version": "2.1.2", 961 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 962 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 963 | }, 964 | "sax": { 965 | "version": "1.2.4", 966 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 967 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 968 | }, 969 | "send": { 970 | "version": "0.17.1", 971 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 972 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 973 | "requires": { 974 | "debug": "2.6.9", 975 | "depd": "~1.1.2", 976 | "destroy": "~1.0.4", 977 | "encodeurl": "~1.0.2", 978 | "escape-html": "~1.0.3", 979 | "etag": "~1.8.1", 980 | "fresh": "0.5.2", 981 | "http-errors": "~1.7.2", 982 | "mime": "1.6.0", 983 | "ms": "2.1.1", 984 | "on-finished": "~2.3.0", 985 | "range-parser": "~1.2.1", 986 | "statuses": "~1.5.0" 987 | }, 988 | "dependencies": { 989 | "ms": { 990 | "version": "2.1.1", 991 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 992 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 993 | } 994 | } 995 | }, 996 | "serve-static": { 997 | "version": "1.14.1", 998 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 999 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1000 | "requires": { 1001 | "encodeurl": "~1.0.2", 1002 | "escape-html": "~1.0.3", 1003 | "parseurl": "~1.3.3", 1004 | "send": "0.17.1" 1005 | } 1006 | }, 1007 | "setprototypeof": { 1008 | "version": "1.1.1", 1009 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1010 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1011 | }, 1012 | "sha.js": { 1013 | "version": "2.4.11", 1014 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1015 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1016 | "requires": { 1017 | "inherits": "^2.0.1", 1018 | "safe-buffer": "^5.0.1" 1019 | } 1020 | }, 1021 | "source-map": { 1022 | "version": "0.6.1", 1023 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1024 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1025 | }, 1026 | "statuses": { 1027 | "version": "1.5.0", 1028 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1029 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1030 | }, 1031 | "streamsearch": { 1032 | "version": "0.1.2", 1033 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 1034 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 1035 | }, 1036 | "string-width": { 1037 | "version": "4.2.2", 1038 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 1039 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 1040 | "requires": { 1041 | "emoji-regex": "^8.0.0", 1042 | "is-fullwidth-code-point": "^3.0.0", 1043 | "strip-ansi": "^6.0.0" 1044 | } 1045 | }, 1046 | "string_decoder": { 1047 | "version": "0.10.31", 1048 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1049 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1050 | }, 1051 | "strip-ansi": { 1052 | "version": "6.0.0", 1053 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1054 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1055 | "requires": { 1056 | "ansi-regex": "^5.0.0" 1057 | } 1058 | }, 1059 | "supports-color": { 1060 | "version": "7.2.0", 1061 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1062 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1063 | "requires": { 1064 | "has-flag": "^4.0.0" 1065 | } 1066 | }, 1067 | "thenify": { 1068 | "version": "3.3.1", 1069 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 1070 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 1071 | "requires": { 1072 | "any-promise": "^1.0.0" 1073 | } 1074 | }, 1075 | "thenify-all": { 1076 | "version": "1.6.0", 1077 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 1078 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", 1079 | "requires": { 1080 | "thenify": ">= 3.1.0 < 4" 1081 | } 1082 | }, 1083 | "toidentifier": { 1084 | "version": "1.0.0", 1085 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1086 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1087 | }, 1088 | "tslib": { 1089 | "version": "2.3.0", 1090 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", 1091 | "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" 1092 | }, 1093 | "type-is": { 1094 | "version": "1.6.18", 1095 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1096 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1097 | "requires": { 1098 | "media-typer": "0.3.0", 1099 | "mime-types": "~2.1.24" 1100 | } 1101 | }, 1102 | "typedarray": { 1103 | "version": "0.0.6", 1104 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1105 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1106 | }, 1107 | "typeorm": { 1108 | "version": "0.2.37", 1109 | "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.37.tgz", 1110 | "integrity": "sha512-7rkW0yCgFC24I5T0f3S/twmLSuccPh1SQmxET/oDWn2sSDVzbyWdnItSdKy27CdJGTlKHYtUVeOcMYw5LRsXVw==", 1111 | "requires": { 1112 | "@sqltools/formatter": "^1.2.2", 1113 | "app-root-path": "^3.0.0", 1114 | "buffer": "^6.0.3", 1115 | "chalk": "^4.1.0", 1116 | "cli-highlight": "^2.1.11", 1117 | "debug": "^4.3.1", 1118 | "dotenv": "^8.2.0", 1119 | "glob": "^7.1.6", 1120 | "js-yaml": "^4.0.0", 1121 | "mkdirp": "^1.0.4", 1122 | "reflect-metadata": "^0.1.13", 1123 | "sha.js": "^2.4.11", 1124 | "tslib": "^2.1.0", 1125 | "xml2js": "^0.4.23", 1126 | "yargonaut": "^1.1.4", 1127 | "yargs": "^17.0.1", 1128 | "zen-observable-ts": "^1.0.0" 1129 | }, 1130 | "dependencies": { 1131 | "debug": { 1132 | "version": "4.3.2", 1133 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 1134 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 1135 | "requires": { 1136 | "ms": "2.1.2" 1137 | } 1138 | }, 1139 | "mkdirp": { 1140 | "version": "1.0.4", 1141 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1142 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 1143 | }, 1144 | "ms": { 1145 | "version": "2.1.2", 1146 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1147 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1148 | } 1149 | } 1150 | }, 1151 | "typescript": { 1152 | "version": "4.4.3", 1153 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", 1154 | "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", 1155 | "dev": true 1156 | }, 1157 | "uglify-js": { 1158 | "version": "3.14.2", 1159 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", 1160 | "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", 1161 | "optional": true 1162 | }, 1163 | "unpipe": { 1164 | "version": "1.0.0", 1165 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1166 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1167 | }, 1168 | "util-deprecate": { 1169 | "version": "1.0.2", 1170 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1171 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1172 | }, 1173 | "utils-merge": { 1174 | "version": "1.0.1", 1175 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1176 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1177 | }, 1178 | "uuid": { 1179 | "version": "8.3.2", 1180 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1181 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 1182 | }, 1183 | "validator": { 1184 | "version": "13.6.0", 1185 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", 1186 | "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==" 1187 | }, 1188 | "vary": { 1189 | "version": "1.1.2", 1190 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1191 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1192 | }, 1193 | "walk": { 1194 | "version": "2.3.14", 1195 | "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", 1196 | "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", 1197 | "requires": { 1198 | "foreachasync": "^3.0.0" 1199 | } 1200 | }, 1201 | "wordwrap": { 1202 | "version": "1.0.0", 1203 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1204 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1205 | }, 1206 | "wrap-ansi": { 1207 | "version": "7.0.0", 1208 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1209 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1210 | "requires": { 1211 | "ansi-styles": "^4.0.0", 1212 | "string-width": "^4.1.0", 1213 | "strip-ansi": "^6.0.0" 1214 | } 1215 | }, 1216 | "wrappy": { 1217 | "version": "1.0.2", 1218 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1219 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1220 | }, 1221 | "xml2js": { 1222 | "version": "0.4.23", 1223 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 1224 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 1225 | "requires": { 1226 | "sax": ">=0.6.0", 1227 | "xmlbuilder": "~11.0.0" 1228 | } 1229 | }, 1230 | "xmlbuilder": { 1231 | "version": "11.0.1", 1232 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1233 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" 1234 | }, 1235 | "xtend": { 1236 | "version": "4.0.2", 1237 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1238 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1239 | }, 1240 | "y18n": { 1241 | "version": "5.0.8", 1242 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1243 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 1244 | }, 1245 | "yargonaut": { 1246 | "version": "1.1.4", 1247 | "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", 1248 | "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", 1249 | "requires": { 1250 | "chalk": "^1.1.1", 1251 | "figlet": "^1.1.1", 1252 | "parent-require": "^1.0.0" 1253 | }, 1254 | "dependencies": { 1255 | "ansi-regex": { 1256 | "version": "2.1.1", 1257 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1258 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 1259 | }, 1260 | "ansi-styles": { 1261 | "version": "2.2.1", 1262 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 1263 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 1264 | }, 1265 | "chalk": { 1266 | "version": "1.1.3", 1267 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1268 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1269 | "requires": { 1270 | "ansi-styles": "^2.2.1", 1271 | "escape-string-regexp": "^1.0.2", 1272 | "has-ansi": "^2.0.0", 1273 | "strip-ansi": "^3.0.0", 1274 | "supports-color": "^2.0.0" 1275 | } 1276 | }, 1277 | "strip-ansi": { 1278 | "version": "3.0.1", 1279 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1280 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1281 | "requires": { 1282 | "ansi-regex": "^2.0.0" 1283 | } 1284 | }, 1285 | "supports-color": { 1286 | "version": "2.0.0", 1287 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1288 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 1289 | } 1290 | } 1291 | }, 1292 | "yargs": { 1293 | "version": "17.1.1", 1294 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", 1295 | "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", 1296 | "requires": { 1297 | "cliui": "^7.0.2", 1298 | "escalade": "^3.1.1", 1299 | "get-caller-file": "^2.0.5", 1300 | "require-directory": "^2.1.1", 1301 | "string-width": "^4.2.0", 1302 | "y18n": "^5.0.5", 1303 | "yargs-parser": "^20.2.2" 1304 | } 1305 | }, 1306 | "yargs-parser": { 1307 | "version": "20.2.9", 1308 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1309 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" 1310 | }, 1311 | "zen-observable": { 1312 | "version": "0.8.15", 1313 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", 1314 | "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" 1315 | }, 1316 | "zen-observable-ts": { 1317 | "version": "1.1.0", 1318 | "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz", 1319 | "integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==", 1320 | "requires": { 1321 | "@types/zen-observable": "0.8.3", 1322 | "zen-observable": "0.8.15" 1323 | } 1324 | } 1325 | } 1326 | } 1327 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nestjs-mocker", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": ".eslintrc.js", 6 | "scripts": { 7 | "format": "prettier --write \"libs/**/*.ts\"", 8 | "prebuild": "rimraf dist", 9 | "build": "tsc", 10 | "start:dev": "npm run prebuild && nest start --watch" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/hodford/nestjs-mocker.git" 15 | }, 16 | "author": "", 17 | "license": "ISC", 18 | "bugs": { 19 | "url": "https://github.com/hodford/nestjs-mocker/issues" 20 | }, 21 | "homepage": "https://github.com/hodford/nestjs-mocker#readme", 22 | "devDependencies": { 23 | "@nestjs/common": "^8.0.6", 24 | "@nestjs/core": "^8.0.6", 25 | "@nestjs/swagger": "^5.0.9", 26 | "@types/node": "^16.9.1", 27 | "prettier": "^2.4.0", 28 | "rimraf": "^3.0.2", 29 | "rxjs": "^7.3.0", 30 | "typescript": "^4.4.3" 31 | }, 32 | "dependencies": { 33 | "@nestjs/platform-express": "^8.0.6", 34 | "@nestjs/typeorm": "github:nestjs/typeorm", 35 | "class-validator": "^0.13.1", 36 | "faker": "^5.5.3", 37 | "hbs": "^4.1.2", 38 | "typeorm": "^0.2.37", 39 | "uuid": "^8.3.2" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "moduleResolution": "node", 5 | "esModuleInterop": true, 6 | "declaration": true, 7 | "removeComments": true, 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "allowSyntheticDefaultImports": true, 11 | "target": "es2017", 12 | "sourceMap": true, 13 | "outDir": "dist", 14 | "baseUrl": "./", 15 | "incremental": true, 16 | "paths": { 17 | "~*": ["libs/*"] 18 | } 19 | }, 20 | "include": [ 21 | "libs" 22 | ], 23 | "exclude": [ 24 | "tests", 25 | "src", 26 | "dist", 27 | "node_modules" 28 | ] 29 | } 30 | --------------------------------------------------------------------------------