From b49cd63c61018fe591f9ddf31cd9af6b2937257e Mon Sep 17 00:00:00 2001 From: kokokuo Date: Thu, 28 Apr 2022 16:33:49 +0800 Subject: [PATCH 1/4] add serve package. - use "nx generate @nrwl/js:library" command to create "serve" package based on typescript --- packages/serve/.eslintrc.json | 18 ++++++++++++++++ packages/serve/README.md | 11 ++++++++++ packages/serve/jest.config.ts | 14 ++++++++++++ packages/serve/package.json | 5 +++++ packages/serve/project.json | 32 ++++++++++++++++++++++++++++ packages/serve/src/index.ts | 1 + packages/serve/src/lib/serve.spec.ts | 7 ++++++ packages/serve/src/lib/serve.ts | 3 +++ packages/serve/tsconfig.json | 22 +++++++++++++++++++ packages/serve/tsconfig.lib.json | 10 +++++++++ packages/serve/tsconfig.spec.json | 9 ++++++++ tsconfig.base.json | 3 ++- workspace.json | 3 ++- 13 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 packages/serve/.eslintrc.json create mode 100644 packages/serve/README.md create mode 100644 packages/serve/jest.config.ts create mode 100644 packages/serve/package.json create mode 100644 packages/serve/project.json create mode 100644 packages/serve/src/index.ts create mode 100644 packages/serve/src/lib/serve.spec.ts create mode 100644 packages/serve/src/lib/serve.ts create mode 100644 packages/serve/tsconfig.json create mode 100644 packages/serve/tsconfig.lib.json create mode 100644 packages/serve/tsconfig.spec.json diff --git a/packages/serve/.eslintrc.json b/packages/serve/.eslintrc.json new file mode 100644 index 00000000..9d9c0db5 --- /dev/null +++ b/packages/serve/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/packages/serve/README.md b/packages/serve/README.md new file mode 100644 index 00000000..c3d79888 --- /dev/null +++ b/packages/serve/README.md @@ -0,0 +1,11 @@ +# serve + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build serve` to build the library. + +## Running unit tests + +Run `nx test serve` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/packages/serve/jest.config.ts b/packages/serve/jest.config.ts new file mode 100644 index 00000000..25fe8d70 --- /dev/null +++ b/packages/serve/jest.config.ts @@ -0,0 +1,14 @@ +module.exports = { + displayName: 'serve', + preset: '../../jest.preset.ts', + globals: { + 'ts-jest': { + tsconfig: '/tsconfig.spec.json', + }, + }, + transform: { + '^.+\\.[tj]s$': 'ts-jest', + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../coverage/packages/serve', +}; diff --git a/packages/serve/package.json b/packages/serve/package.json new file mode 100644 index 00000000..14adf2f5 --- /dev/null +++ b/packages/serve/package.json @@ -0,0 +1,5 @@ +{ + "name": "@vulcan/serve", + "version": "0.0.1", + "type": "commonjs" +} diff --git a/packages/serve/project.json b/packages/serve/project.json new file mode 100644 index 00000000..3f1c7cfb --- /dev/null +++ b/packages/serve/project.json @@ -0,0 +1,32 @@ +{ + "root": "packages/serve", + "sourceRoot": "packages/serve/src", + "targets": { + "build": { + "executor": "@nrwl/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/packages/serve", + "main": "packages/serve/src/index.ts", + "tsConfig": "packages/serve/tsconfig.lib.json", + "assets": ["packages/serve/*.md"] + } + }, + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["packages/serve/**/*.ts"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["coverage/packages/serve"], + "options": { + "jestConfig": "packages/serve/jest.config.ts", + "passWithNoTests": true + } + } + }, + "tags": [] +} diff --git a/packages/serve/src/index.ts b/packages/serve/src/index.ts new file mode 100644 index 00000000..9ed89839 --- /dev/null +++ b/packages/serve/src/index.ts @@ -0,0 +1 @@ +export * from './lib/serve'; diff --git a/packages/serve/src/lib/serve.spec.ts b/packages/serve/src/lib/serve.spec.ts new file mode 100644 index 00000000..4e6a0f3b --- /dev/null +++ b/packages/serve/src/lib/serve.spec.ts @@ -0,0 +1,7 @@ +import { serve } from './serve'; + +describe('serve', () => { + it('should work', () => { + expect(serve()).toEqual('serve'); + }); +}); diff --git a/packages/serve/src/lib/serve.ts b/packages/serve/src/lib/serve.ts new file mode 100644 index 00000000..f6e1a4a2 --- /dev/null +++ b/packages/serve/src/lib/serve.ts @@ -0,0 +1,3 @@ +export function serve(): string { + return 'serve'; +} diff --git a/packages/serve/tsconfig.json b/packages/serve/tsconfig.json new file mode 100644 index 00000000..f5b85657 --- /dev/null +++ b/packages/serve/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/serve/tsconfig.lib.json b/packages/serve/tsconfig.lib.json new file mode 100644 index 00000000..e85ef50f --- /dev/null +++ b/packages/serve/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": [] + }, + "include": ["**/*.ts"], + "exclude": ["jest.config.ts", "**/*.spec.ts", "**/*.test.ts"] +} diff --git a/packages/serve/tsconfig.spec.json b/packages/serve/tsconfig.spec.json new file mode 100644 index 00000000..546f1287 --- /dev/null +++ b/packages/serve/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json index ccf6316b..5dafa361 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -16,7 +16,8 @@ "baseUrl": ".", "paths": { "@vulcan/build": ["packages/build/src/index.ts"], - "@vulcan/core": ["packages/core/src/index.ts"] + "@vulcan/core": ["packages/core/src/index.ts"], + "@vulcan/serve": ["packages/serve/src/index.ts"] } }, "exclude": ["node_modules", "tmp"] diff --git a/workspace.json b/workspace.json index f847a057..099ae337 100644 --- a/workspace.json +++ b/workspace.json @@ -2,6 +2,7 @@ "version": 2, "projects": { "build": "packages/build", - "core": "packages/core" + "core": "packages/core", + "serve": "packages/serve" } } From e595d6fa48b767e3a4e8b56dbbf8f3f3c9a43ddd Mon Sep 17 00:00:00 2001 From: kokokuo Date: Fri, 6 May 2022 12:34:21 +0800 Subject: [PATCH 2/4] feature(core): add built-in data type validators and testcase - add "DateTypeValidator", "IntegerTypeValidator", "StringTypeValidator", "UUIDTypeValidator" and its test cases. - add "loadedValidators" for loading all built-in and user-defined validator dynamically. - install joi, moment plugins at package.json in core folder. - install faker, ts-sinon, uuid plugins at vulcan package.json. --- package.json | 9 +- packages/core/package.json | 6 +- packages/core/src/index.ts | 25 +- .../data-type-validators/dateTypeValidator.ts | 43 ++ .../validators/data-type-validators/index.ts | 4 + .../integerTypeValidator.ts | 59 ++ .../stringTypeValidator.ts | 59 ++ .../data-type-validators/uuidTypeValidator.ts | 52 ++ packages/core/src/lib/validators/index.ts | 18 + packages/core/src/lib/validators/validator.ts | 8 + packages/core/src/models/artifact.ts | 17 +- .../test/validators/dataTypeValidator.spec.ts | 80 +++ .../validators/integerTypeValidator.spec.ts | 96 +++ .../validators/stringTypeValidator.spec.ts | 83 +++ .../test/validators/uuidTypeValidator.spec.ts | 83 +++ packages/core/src/validators/index.ts | 1 - packages/core/src/validators/interface.ts | 8 - packages/core/tsconfig.json | 5 +- packages/core/yarn.lock | 48 ++ packages/serve/package.json | 12 +- packages/serve/yarn.lock | 556 ++++++++++++++++++ yarn.lock | 10 + 22 files changed, 1263 insertions(+), 19 deletions(-) create mode 100644 packages/core/src/lib/validators/data-type-validators/dateTypeValidator.ts create mode 100644 packages/core/src/lib/validators/data-type-validators/index.ts create mode 100644 packages/core/src/lib/validators/data-type-validators/integerTypeValidator.ts create mode 100644 packages/core/src/lib/validators/data-type-validators/stringTypeValidator.ts create mode 100644 packages/core/src/lib/validators/data-type-validators/uuidTypeValidator.ts create mode 100644 packages/core/src/lib/validators/index.ts create mode 100644 packages/core/src/lib/validators/validator.ts create mode 100644 packages/core/src/test/validators/dataTypeValidator.spec.ts create mode 100644 packages/core/src/test/validators/integerTypeValidator.spec.ts create mode 100644 packages/core/src/test/validators/stringTypeValidator.spec.ts create mode 100644 packages/core/src/test/validators/uuidTypeValidator.spec.ts delete mode 100644 packages/core/src/validators/index.ts delete mode 100644 packages/core/src/validators/interface.ts create mode 100644 packages/core/yarn.lock create mode 100644 packages/serve/yarn.lock diff --git a/package.json b/package.json index 508dc5e8..042222c5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,9 @@ "name": "vulcan", "version": "0.0.0", "license": "MIT", - "scripts": {}, + "scripts": { + "test": "jest" + }, "private": true, "dependencies": { "glob": "^8.0.1", @@ -10,9 +12,11 @@ "koa-compose": "^4.1.0", "lodash": "^4.17.21", "nunjucks": "^3.2.3", - "tslib": "^2.3.0" + "tslib": "^2.3.0", + "uuid": "^8.3.2" }, "devDependencies": { + "@faker-js/faker": "^6.3.1", "@nrwl/cli": "14.0.3", "@nrwl/eslint-plugin-nx": "14.0.3", "@nrwl/jest": "14.0.3", @@ -25,6 +29,7 @@ "@types/koa-compose": "^3.2.5", "@types/lodash": "^4.14.182", "@types/node": "16.11.7", + "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "~5.18.0", "@typescript-eslint/parser": "~5.18.0", "cz-conventional-changelog": "3.3.0", diff --git a/packages/core/package.json b/packages/core/package.json index 145a1038..423fb9a7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,5 +1,9 @@ { "name": "@vulcan/core", "version": "0.0.1", - "type": "commonjs" + "type": "commonjs", + "dependencies": { + "joi": "^17.6.0", + "moment": "^2.29.3" + } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 56c81439..9a456984 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,4 +1,27 @@ export * from './lib/template-engine'; export * from './models'; -export * from './validators'; export * from './lib/artifact-builder'; +// import built-in validators +import builtInValidatorClasses from './lib/validators'; +import IValidator from './lib/validators/validator'; + +// TODO: Import user-defined validators dynamically in specific directory + +// defined all validators and change to key-value object format for export +const loadedValidators: { [name: string]: IValidator } = Object.assign( + {}, + ...builtInValidatorClasses.map((validatorClass) => { + const validator = new validatorClass(); + return { + [validator.name as string]: validator, + }; + }) +); + +// export all other non-default objects of validators module +export * from './lib/validators'; +// Export all other modules +export * from './models'; +export * from './lib/validators/validator'; + +export { loadedValidators, IValidator }; diff --git a/packages/core/src/lib/validators/data-type-validators/dateTypeValidator.ts b/packages/core/src/lib/validators/data-type-validators/dateTypeValidator.ts new file mode 100644 index 00000000..1f7dbbed --- /dev/null +++ b/packages/core/src/lib/validators/data-type-validators/dateTypeValidator.ts @@ -0,0 +1,43 @@ +import * as Joi from 'joi'; +import { isUndefined } from 'lodash'; +import moment from 'moment'; +import IValidator from '../validator'; + +export interface DateInputArgs { + // The date needed format, supported ISO_8601 token, ref: https://www.w3.org/TR/NOTE-datetime + // e.g: "YYYYMMDD", "YYYY-MM-DD", "YYYY-MM-DD HH:mm", + format?: string; +} + +export class DateTypeValidator implements IValidator { + public readonly name = 'date'; + // Validator for arguments schema in schema.yaml, should match DateInputArgs + private argsValidator = Joi.object({ + format: Joi.string().optional(), + }); + + public validateSchema(args: DateInputArgs): boolean { + try { + // validate arguments schema + Joi.assert(args, this.argsValidator); + return true; + } catch { + throw new Error('The arguments schema for date type is incorrect'); + } + } + + validateData(value: string, args: DateInputArgs): boolean { + // close warning to prevent showing deprecation warning message + moment.suppressDeprecationWarnings = true; + let valid = moment(value).isValid(); + // if there are args passed + if (!isUndefined(args)) { + // validate date, support format validator if input field existed + valid = args.format ? moment(value, args.format, true).isValid() : valid; + } + + if (!valid) + throw new Error('The input parameter is invalid, it should be date type'); + return true; + } +} diff --git a/packages/core/src/lib/validators/data-type-validators/index.ts b/packages/core/src/lib/validators/data-type-validators/index.ts new file mode 100644 index 00000000..1bb1f725 --- /dev/null +++ b/packages/core/src/lib/validators/data-type-validators/index.ts @@ -0,0 +1,4 @@ +export * from './integerTypeValidator'; +export * from './stringTypeValidator'; +export * from './dateTypeValidator'; +export * from './uuidTypeValidator'; diff --git a/packages/core/src/lib/validators/data-type-validators/integerTypeValidator.ts b/packages/core/src/lib/validators/data-type-validators/integerTypeValidator.ts new file mode 100644 index 00000000..8953f9ba --- /dev/null +++ b/packages/core/src/lib/validators/data-type-validators/integerTypeValidator.ts @@ -0,0 +1,59 @@ +import * as Joi from 'joi'; +import { isUndefined } from 'lodash'; +import IValidator from '../validator'; + +export interface IntInputArgs { + // The integer minimum value + min?: number; + // The integer maximum value + max?: number; + // The integer should greater than value + greater?: number; + // The integer should less than value + less?: number; +} + +export class IntegerTypeValidator implements IValidator { + public readonly name = 'integer'; + // Validator for arguments schema in schema.yaml, should match IntInputArgs + private argsValidator = Joi.object({ + min: Joi.number().integer().optional(), + max: Joi.number().integer().optional(), + greater: Joi.number().integer().optional(), + less: Joi.number().integer().optional(), + }); + + validateSchema(args: IntInputArgs): boolean { + try { + // validate arguments schema + Joi.assert(args, this.argsValidator); + return true; + } catch { + throw new Error('The arguments schema for integer type is incorrect'); + } + } + + validateData(value: string, args: IntInputArgs): boolean { + // parse arguments + + // schema is integer type + let schema = Joi.number().integer(); + + // if there are args passed + if (!isUndefined(args)) { + // support min, max, greater, less validator if input field existed + schema = args.min ? schema.min(args.min) : schema; + schema = args.max ? schema.max(args.max) : schema; + schema = args.greater ? schema.greater(args.greater) : schema; + schema = args.less ? schema.less(args.less) : schema; + } + try { + Joi.assert(value, schema); + return true; + } catch { + throw new Error( + 'The input parameter is invalid, it should be integer type' + ); + } + } +} diff --git a/packages/core/src/lib/validators/data-type-validators/stringTypeValidator.ts b/packages/core/src/lib/validators/data-type-validators/stringTypeValidator.ts new file mode 100644 index 00000000..6c7f76c9 --- /dev/null +++ b/packages/core/src/lib/validators/data-type-validators/stringTypeValidator.ts @@ -0,0 +1,59 @@ +import * as Joi from 'joi'; +import { isUndefined } from 'lodash'; +import IValidator from '../validator'; + +export interface StringInputArgs { + // The string regex format pattern + format?: string; + // The string length + length?: number; + // The string minimum value + min?: number; + // The string maximum value + max?: number; +} + +export class StringTypeValidator implements IValidator { + public readonly name = 'string'; + // Validator for arguments schema in schema.yaml, should match StringInputArgs + private argsValidator = Joi.object({ + format: Joi.string().optional(), + length: Joi.number().optional(), + min: Joi.number().optional(), + max: Joi.number().optional(), + }); + + validateSchema(args: StringInputArgs): boolean { + try { + // validate arguments schema + Joi.assert(args, this.argsValidator); + return true; + } catch { + throw new Error('The arguments schema for string type is incorrect'); + } + } + + validateData(value: string, args: StringInputArgs): boolean { + // schema is string type + let schema = Joi.string(); + + // if there are args passed + if (!isUndefined(args)) { + // support length, min, max validator if input field existed + schema = args.length ? schema.length(args.length) : schema; + schema = args.min ? schema.min(args.min) : schema; + schema = args.max ? schema.max(args.max) : schema; + // support regular expression pattern when input field existed + schema = args.format ? schema.pattern(new RegExp(args.format)) : schema; + } + try { + // validate data value + Joi.assert(value, schema); + return true; + } catch { + throw new Error( + 'The input parameter is invalid, it should be string type' + ); + } + } +} diff --git a/packages/core/src/lib/validators/data-type-validators/uuidTypeValidator.ts b/packages/core/src/lib/validators/data-type-validators/uuidTypeValidator.ts new file mode 100644 index 00000000..4941b668 --- /dev/null +++ b/packages/core/src/lib/validators/data-type-validators/uuidTypeValidator.ts @@ -0,0 +1,52 @@ +import * as Joi from 'joi'; +import { GuidVersions } from 'joi'; +import { isUndefined } from 'lodash'; +import IValidator from '../validator'; + +type UUIDVersion = 'uuid_v1' | 'uuid_v4' | 'uuid_v5'; + +export interface UUIDInputArgs { + // The uuid supported version, including uuidv1, uuidv4, uuidv5 + version?: UUIDVersion; +} + +export class UUIDTypeValidator implements IValidator { + public readonly name = 'uuid'; + // Validator for arguments schema in schema.yaml, should match UUIDInputArgs + private argsValidator = Joi.object({ + version: Joi.string().optional(), + }); + + validateSchema(args: UUIDInputArgs): boolean { + try { + // validate arguments schema + Joi.assert(args, this.argsValidator); + return true; + } catch { + throw new Error('The arguments schema for uuid type is incorrect'); + } + } + + validateData(value: string, args: UUIDInputArgs): boolean { + // schema is string type + let schema = Joi.string().uuid(); + + // if there are args passed + if (!isUndefined(args)) { + // support uuid version if input field existed + schema = args.version + ? Joi.string().uuid({ + // remove "_" and convert to Joi supported type + version: args.version.replace('_', '') as GuidVersions, + }) + : Joi.string().uuid(); + } + try { + // validate data value + Joi.assert(value, schema); + return true; + } catch { + throw new Error('The input parameter is invalid, it should be uuid type'); + } + } +} diff --git a/packages/core/src/lib/validators/index.ts b/packages/core/src/lib/validators/index.ts new file mode 100644 index 00000000..9d31295a --- /dev/null +++ b/packages/core/src/lib/validators/index.ts @@ -0,0 +1,18 @@ +// Data Type Validators +import { IntInputArgs, IntegerTypeValidator } from './data-type-validators'; +import { DateInputArgs, DateTypeValidator } from './data-type-validators'; +import { StringInputArgs, StringTypeValidator } from './data-type-validators'; +import { UUIDInputArgs, UUIDTypeValidator } from './data-type-validators'; + +// TODO: Other Built-in Validators + +// export all validators needed args interface +export { IntInputArgs, DateInputArgs, StringInputArgs, UUIDInputArgs }; + +// export default all validators of IValidator for use +export default [ + DateTypeValidator, + IntegerTypeValidator, + StringTypeValidator, + UUIDTypeValidator, +]; diff --git a/packages/core/src/lib/validators/validator.ts b/packages/core/src/lib/validators/validator.ts new file mode 100644 index 00000000..073705ca --- /dev/null +++ b/packages/core/src/lib/validators/validator.ts @@ -0,0 +1,8 @@ +export default interface IValidator { + // validator name + readonly name: string; + // validate Schema format + validateSchema(args: T): boolean; + // validate input value + validateData(value: string, args: T): boolean; +} diff --git a/packages/core/src/models/artifact.ts b/packages/core/src/models/artifact.ts index 43cadac4..015459ce 100644 --- a/packages/core/src/models/artifact.ts +++ b/packages/core/src/models/artifact.ts @@ -5,10 +5,11 @@ url: /user/:id request: parameters: id: - in: query # path / query / header + in: query # three source: path / query / header description: user id + type: integer # three types: boolean / number / string validators: - - name: Date + - name: date args: format: 'yyyy-MM-dd' - name: required @@ -20,6 +21,13 @@ error: export enum FieldInType { QUERY = 'QUERY', HEADER = 'HEADER', + PATH = 'PATH', +} + +export enum FieldDataType { + BOOLEAN = 'BOOLEAN', + NUMBER = 'NUMBER', + STRING = 'STRING', } export interface ValidatorDefinition { @@ -27,11 +35,12 @@ export interface ValidatorDefinition { args: T; } -export interface RequestParameter { +export interface RequestSchema { fieldName: string; // the field put in query parameter or headers fieldIn: FieldInType; description: string; + type: FieldDataType; validators: Array; } @@ -47,7 +56,7 @@ export interface APISchema { urlPath: string; // template, could be name or path templateSource: string; - request: Array; + request: Array; errors: Array; response: any; } diff --git a/packages/core/src/test/validators/dataTypeValidator.spec.ts b/packages/core/src/test/validators/dataTypeValidator.spec.ts new file mode 100644 index 00000000..20e23c3d --- /dev/null +++ b/packages/core/src/test/validators/dataTypeValidator.spec.ts @@ -0,0 +1,80 @@ +import { DateTypeValidator } from '@validators/data-type-validators'; + +describe('Test "date" type validator', () => { + it.each([ + ['{}'], + ['{"format": "123"}'], + ['{"format": "DD/MM/YYYY"}'], + ['{"format": "YYYY-MM-DD"}'], + ])( + 'Should be valid when validate args schema %p', + async (inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new DateTypeValidator(); + const result = validator.validateSchema(args); + + // Assert + expect(result).toBe(true); + } + ); + + it.each([ + ['[]'], + ['{"non-key": "non-value"}'], + ['{"key1": "value1"}'], + ['{"key2": "value2"}'], + ])( + 'Should be invalid when validate args schema %p', + async (inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new DateTypeValidator(); + + // Assert + expect(() => validator.validateSchema(args)).toThrow(); + } + ); + + it.each([ + ['2022', '{"format": "YYYY"}'], + ['202210', '{"format": "YYYYMM"}'], + ['10/10/2021', '{"format": "DD/MM/YYYY"}'], + ['2021-10-10', '{"format": "YYYY-MM-DD"}'], + ['2021 10 10', '{"format": "YYYY MM DD"}'], + ['24 12 2019 09:15:00', '{"format": "DD MM YYYY hh:mm:ss"}'], + ])( + 'Should be valid when validate data %p with args is %p', + async (data: string, inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + + // Act + const validator = new DateTypeValidator(); + const result = validator.validateData(data, args); + + // Assert + expect(result).toBe(true); + } + ); + + it.each([ + ['2021-10-10', '{"format": "DD/MM/YYYY"}'], + ['2021/10/10', '{"format": "YYYY-MM-DD"}'], + ['2021/10', '{"format": "YYYY-MM-DD"}'], + ])( + 'Should be invalid when validate data %p with args is %p', + async (data: string, inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + + // Act + const validator = new DateTypeValidator(); + + // Assert + expect(() => validator.validateData(data, args)).toThrow(); + } + ); +}); diff --git a/packages/core/src/test/validators/integerTypeValidator.spec.ts b/packages/core/src/test/validators/integerTypeValidator.spec.ts new file mode 100644 index 00000000..8b9432f7 --- /dev/null +++ b/packages/core/src/test/validators/integerTypeValidator.spec.ts @@ -0,0 +1,96 @@ +import { IntegerTypeValidator } from '@validators/data-type-validators'; + +describe('Test "integer" type validator', () => { + it.each([ + ['{}'], + ['{"min": 1}'], + ['{"min": "1"}'], + ['{"max": 100}'], + ['{"max": "100"}'], + ['{"less": 10}'], + ['{"less": "10"}'], + ['{"greater": 50}'], + ['{"greater": "50"}'], + ['{"min": 1, "max": 100}'], + ['{"min": 1, "less": 10}'], + ['{"min": 1, "greater": 50}'], + ['{"less": 10, "max": 100}'], + ['{"greater": 50, "max": 100}'], + ['{"less": 10, "greater": 50, "max": 100}'], + ['{"min": 10 ,"less": 10, "greater": 50}'], + ['{"min": 10 ,"less": 10, "greater": 50, "max": 100}'], + ['{"min": "10", "less": "10", "greater": "50", "max": "100"}'], + ])( + 'Should be valid when validate args schema %p', + async (inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new IntegerTypeValidator(); + const result = validator.validateSchema(args); + + // Assert + expect(result).toBe(true); + } + ); + + it.each([ + ['[]'], + ['{"non-key": 1}'], + ['{"key1": 1}'], + ['{"key2": 2}'], + ['{"key3": "value3"}'], + ])( + 'Should be invalid when validate args schema %p', + async (inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new IntegerTypeValidator(); + + // Assert + expect(() => validator.validateSchema(args)).toThrow(); + } + ); + + it.each([ + ['1', '{"min": 1}'], + ['100', '{"max": 100}'], + ['3', '{"min": 1, "max":3}'], + ['9', '{"less": 10}'], + ['51', '{"greater": 50}'], + ['2', '{"min": 1, "less":3}'], + ['2', '{"greater": 1, "max":3}'], + ])( + 'Should be valid when validate data %p with args is %p', + async (data: string, inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new IntegerTypeValidator(); + const result = validator.validateData(data, args); + + // Assert + expect(result).toBe(true); + } + ); + it.each([ + ['0', '{"min": 1}'], + ['101', '{"max": 100}'], + ['10', '{"less": 10}'], + ['50', '{"greater": 50}'], + ['3', '{"min": 1, "less":3}'], + ['1', '{"greater": 1, "max":3}'], + ])( + 'Should be invalid when validate data %p with args is %p', + async (data: string, inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new IntegerTypeValidator(); + + // Assert + expect(() => validator.validateData(data, args)).toThrow(); + } + ); +}); diff --git a/packages/core/src/test/validators/stringTypeValidator.spec.ts b/packages/core/src/test/validators/stringTypeValidator.spec.ts new file mode 100644 index 00000000..c42680d9 --- /dev/null +++ b/packages/core/src/test/validators/stringTypeValidator.spec.ts @@ -0,0 +1,83 @@ +import faker from '@faker-js/faker'; +import { StringTypeValidator } from '@validators/data-type-validators'; + +describe('Test "string" type validator', () => { + it.each([ + ['{}'], + ['{"format": "[a-z]"}'], + ['{"length": 10}'], + ['{"length": "10"}'], + ['{"min": 2}'], + ['{"max": 10}'], + ['{"format": "[A-Z]", "length": 10}'], + ['{"format": "[A-Z]", "min": "2"}'], + ['{"format": "[A-Z]", "max": 10}'], + ])( + 'Should be valid when validate args schema %p', + async (inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new StringTypeValidator(); + const result = validator.validateSchema(args); + + // Assert + expect(result).toBe(true); + } + ); + + it.each([ + ['[]'], + ['{"non-key": 1}'], + ['{"key1": 1}'], + ['{"key2": 2}'], + ['{"key3": "value3"}'], + ])( + 'Should be invalid when validate args schema %p', + async (inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new StringTypeValidator(); + + // Assert + expect(() => validator.validateSchema(args)).toThrow(); + } + ); + + it.each([ + [faker.datatype.string(), '{}'], + ['abc', '{"format": "[a-z]"}'], + ['a123456789', '{"length": 10}'], + ['ABCDEFGHIJ', '{"format": "[A-Z]", "length": 10}'], + ])( + 'Should be valid when validate data %p with args is %p', + async (data: string, inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new StringTypeValidator(); + const result = validator.validateData(data, args); + + // Assert + expect(result).toBe(true); + } + ); + it.each([ + ['ABC', '{"format": "[a-z]"}'], + ['ab123456789', '{"length": "10"}'], + ['ABCDEFGHIJK', '{"format": "[A-Z]", "length": 10}'], + ['abcdefghijk', '{"format": "[A-Z]", "length": 10}'], + ])( + 'Should be invalid when validate data %p with args is %p', + async (data: string, inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new StringTypeValidator(); + + // Assert + expect(() => validator.validateData(data, args)).toThrow(); + } + ); +}); diff --git a/packages/core/src/test/validators/uuidTypeValidator.spec.ts b/packages/core/src/test/validators/uuidTypeValidator.spec.ts new file mode 100644 index 00000000..874915f6 --- /dev/null +++ b/packages/core/src/test/validators/uuidTypeValidator.spec.ts @@ -0,0 +1,83 @@ +import * as uuid from 'uuid'; +import { UUIDTypeValidator } from '@validators/data-type-validators'; + +describe('Test "uuid" type validator ', () => { + it.each([ + ['{}'], + ['{"version": "uuid_v1"}'], + ['{"version": "uuid_v4"}'], + ['{"version": "uuid_v5"}'], + ])( + 'Should be valid when validate args schema %p', + async (inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new UUIDTypeValidator(); + const result = validator.validateSchema(args); + + // Assert + expect(result).toBe(true); + } + ); + + it.each([ + ['[]'], + ['{"non-key": 1}'], + ['{"key1": 1}'], + ['{"key2": 2}'], + ['{"key3": "value3"}'], + ])( + 'Should be invalid when validate args schema %p', + async (inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new UUIDTypeValidator(); + + // Assert + expect(() => validator.validateSchema(args)).toThrow(); + } + ); + + it.each([ + [uuid.v1(), '{}'], + [uuid.v4(), '{}'], + [uuid.v1(), '{"version": "uuid_v1"}'], + [uuid.v4(), '{"version": "uuid_v4"}'], + [ + uuid.v5('canner.com', 'da327b91-b802-4f1f-9d25-91d23eecca32'), + '{"version": "uuid_v5"}', + ], + ])( + 'Should be valid when validate data %p with args is %p', + async (data: string, inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new UUIDTypeValidator(); + const result = validator.validateData(data, args); + + // Assert + expect(result).toBe(true); + } + ); + it.each([ + [uuid.v4(), '{"version": "uuid_v1"}'], + [ + uuid.v5('canner.com', 'da327b91-b802-4f1f-9d25-91d23eecca32'), + '{"version": "uuid_v1"}', + ], + ])( + 'Should be invalid when validate data %p with args is %p', + async (data: string, inputArgs: string) => { + // Arrange + const args = JSON.parse(inputArgs); + // Act + const validator = new UUIDTypeValidator(); + + // Assert + expect(() => validator.validateData(data, args)).toThrow(); + } + ); +}); diff --git a/packages/core/src/validators/index.ts b/packages/core/src/validators/index.ts deleted file mode 100644 index fc141f79..00000000 --- a/packages/core/src/validators/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './interface'; diff --git a/packages/core/src/validators/interface.ts b/packages/core/src/validators/interface.ts deleted file mode 100644 index 4794d9ee..00000000 --- a/packages/core/src/validators/interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface IValidator { - // validator name - name: string; - // validate Schema format - validateSchema(args: T): boolean; - // validate input data - validateData(data: string, args: T): boolean; -} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 5efcd389..87e9baab 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -8,10 +8,13 @@ "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, "typeRoots": ["../../node_modules/@types"], "paths": { "@artifact-builder/*": ["packages/core/src/lib/artifact-builder/*"], - "@template-engine/*": ["packages/core/src/lib/template-engine/*"] + "@template-engine/*": ["packages/core/src/lib/template-engine/*"], + "@validators/*": ["packages/core/src/lib/validators/*"], + "@models/": ["packages/core/src/models"] } }, "references": [ diff --git a/packages/core/yarn.lock b/packages/core/yarn.lock new file mode 100644 index 00000000..5303cc42 --- /dev/null +++ b/packages/core/yarn.lock @@ -0,0 +1,48 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +joi@^17.6.0: + version "17.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +moment@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3" + integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw== diff --git a/packages/serve/package.json b/packages/serve/package.json index 14adf2f5..729a06b8 100644 --- a/packages/serve/package.json +++ b/packages/serve/package.json @@ -1,5 +1,15 @@ { "name": "@vulcan/serve", "version": "0.0.1", - "type": "commonjs" + "type": "commonjs", + "dependencies": { + "koa": "^2.13.4", + "koa-bodyparser": "^4.3.0", + "koa-router": "^10.1.1" + }, + "devDependencies": { + "@types/koa": "^2.13.4", + "@types/koa-bodyparser": "^4.3.7", + "@types/koa-router": "^7.4.4" + } } diff --git a/packages/serve/yarn.lock b/packages/serve/yarn.lock new file mode 100644 index 00000000..7ebf3341 --- /dev/null +++ b/packages/serve/yarn.lock @@ -0,0 +1,556 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/accepts@*": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.5.tgz#650820e95de346e1f84e30667d168c8fd25aa6e3" + integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA== + +"@types/cookies@*": + version "0.7.7" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" + integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-assert@*": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" + integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== + +"@types/http-errors@*": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1" + integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w== + +"@types/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + +"@types/koa-bodyparser@^4.3.7": + version "4.3.7" + resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.3.7.tgz#3ac41f2dec9d97db7a6f798bbb2e2368be762714" + integrity sha512-21NhEp7LjZm4zbNV5alHHmrNY4J+S7B8lYTO6CzRL8ShTMnl20Gd14dRgVhAxraLaW5iZMofox+BycbuiDvj2Q== + dependencies: + "@types/koa" "*" + +"@types/koa-compose@*": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + +"@types/koa-router@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.4.4.tgz#db72bde3616365d74f00178d5f243c4fce7da572" + integrity sha512-3dHlZ6CkhgcWeF6wafEUvyyqjWYfKmev3vy1PtOmr0mBc3wpXPU5E8fBBd4YQo5bRpHPfmwC5yDaX7s4jhIN6A== + dependencies: + "@types/koa" "*" + +"@types/koa@*", "@types/koa@^2.13.4": + version "2.13.4" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" + integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*": + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" + integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +accepts@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +co-body@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" + integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== + dependencies: + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +content-disposition@~0.5.2: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookies@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" + integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== + dependencies: + depd "~2.0.0" + keygrip "~1.1.0" + +copy-to@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" + integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU= + +debug@^4.1.1, debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +fresh@~0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +http-assert@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" + integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== + dependencies: + deep-equal "~1.0.1" + http-errors "~1.8.0" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inflation@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" + integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" + integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + dependencies: + tsscmp "1.0.6" + +koa-bodyparser@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a" + integrity sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw== + dependencies: + co-body "^6.0.0" + copy-to "^2.0.1" + +koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== + +koa-convert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" + integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== + dependencies: + co "^4.6.0" + koa-compose "^4.1.0" + +koa-router@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-10.1.1.tgz#20809f82648518b84726cd445037813cd99f17ff" + integrity sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ== + dependencies: + debug "^4.1.1" + http-errors "^1.7.3" + koa-compose "^4.1.0" + methods "^1.1.2" + path-to-regexp "^6.1.0" + +koa@^2.13.4: + version "2.13.4" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e" + integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g== + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.8.0" + debug "^4.3.2" + delegates "^1.0.0" + depd "^2.0.0" + destroy "^1.0.4" + encodeurl "^1.0.2" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^2.0.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +methods@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.18, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +on-finished@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +only@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= + +parseurl@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38" + integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg== + +qs@^6.5.2: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +raw-body@^2.3.3: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.5.0 < 2", statuses@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + +type-is@^1.6.16: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +vary@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +ylru@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.3.2.tgz#0de48017473275a4cbdfc83a1eaf67c01af8a785" + integrity sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA== diff --git a/yarn.lock b/yarn.lock index 6b122db4..b0ff33d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -362,6 +362,11 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@faker-js/faker@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-6.3.1.tgz#1ae963dd40405450a2945408cba553e1afa3e0fb" + integrity sha512-8YXBE2ZcU/pImVOHX7MWrSR/X5up7t6rPWZlk34RwZEcdr3ua6X+32pSd6XuOQRN+vbuvYNfA6iey8NbrjuMFQ== + "@humanwhocodes/config-array@^0.9.2": version "0.9.5" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" @@ -1191,6 +1196,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" From 14e3e6c8108a6b0cc6acd107059b5e391b0a6208 Mon Sep 17 00:00:00 2001 From: kokokuo Date: Fri, 13 May 2022 17:01:15 +0800 Subject: [PATCH 3/4] feature(serve): add request transformer, validator and route generator to generate routes for handling and check request - add "ReuqestTransformer", "RequestValidator", for converting request data format and validating. - add "BaseRoute", "RestfulRoute", "GraphQLRoute" to create route. - add "RouteGenerator" to generate Route according api route type. - add "VulcanApplication" to add routes and create server. - add test cases for "ReuqestTransformer", "RequestValidator", "RouteGenerator" and "VulcanApplication" - install "suepertest" in package.json for testing koa server. - add "start" command to run serve package directly for testing in project.json. - update tsconfig.json for making alias path could be run by ts-node in nx. --- packages/serve/package.json | 4 +- packages/serve/project.json | 7 + packages/serve/src/index.ts | 3 +- packages/serve/src/lib/app.ts | 58 +++++ .../serve/src/lib/route-generator/index.ts | 2 + .../route-component/baseRoute.ts | 41 +++ .../route-component/graphQLRoute.ts | 34 +++ .../route-generator/route-component/index.ts | 5 + .../route-component/requestTransformer.ts | 84 ++++++ .../route-component/requestValidator.ts | 43 ++++ .../route-component/restfulRoute.ts | 31 +++ .../src/lib/route-generator/routeGenerator.ts | 59 +++++ packages/serve/src/lib/serve.spec.ts | 7 - packages/serve/src/lib/serve.ts | 3 - packages/serve/test/app.spec.ts | 239 ++++++++++++++++++ .../requestTransformer.spec.ts | 156 ++++++++++++ .../route-component/requestValidator.spec.ts | 152 +++++++++++ .../route-generator/routeGenerator.spec.ts | 79 ++++++ packages/serve/tsconfig.json | 15 +- packages/serve/yarn.lock | 186 +++++++++++++- 20 files changed, 1189 insertions(+), 19 deletions(-) create mode 100644 packages/serve/src/lib/app.ts create mode 100644 packages/serve/src/lib/route-generator/index.ts create mode 100644 packages/serve/src/lib/route-generator/route-component/baseRoute.ts create mode 100644 packages/serve/src/lib/route-generator/route-component/graphQLRoute.ts create mode 100644 packages/serve/src/lib/route-generator/route-component/index.ts create mode 100644 packages/serve/src/lib/route-generator/route-component/requestTransformer.ts create mode 100644 packages/serve/src/lib/route-generator/route-component/requestValidator.ts create mode 100644 packages/serve/src/lib/route-generator/route-component/restfulRoute.ts create mode 100644 packages/serve/src/lib/route-generator/routeGenerator.ts delete mode 100644 packages/serve/src/lib/serve.spec.ts delete mode 100644 packages/serve/src/lib/serve.ts create mode 100644 packages/serve/test/app.spec.ts create mode 100644 packages/serve/test/route-generator/route-component/requestTransformer.spec.ts create mode 100644 packages/serve/test/route-generator/route-component/requestValidator.spec.ts create mode 100644 packages/serve/test/route-generator/routeGenerator.spec.ts diff --git a/packages/serve/package.json b/packages/serve/package.json index 729a06b8..e2d4f385 100644 --- a/packages/serve/package.json +++ b/packages/serve/package.json @@ -10,6 +10,8 @@ "devDependencies": { "@types/koa": "^2.13.4", "@types/koa-bodyparser": "^4.3.7", - "@types/koa-router": "^7.4.4" + "@types/koa-router": "^7.4.4", + "@types/supertest": "^2.0.12", + "supertest": "^6.2.3" } } diff --git a/packages/serve/project.json b/packages/serve/project.json index 3f1c7cfb..2108d3ec 100644 --- a/packages/serve/project.json +++ b/packages/serve/project.json @@ -2,6 +2,13 @@ "root": "packages/serve", "sourceRoot": "packages/serve/src", "targets": { + "start": { + "executor": "@nrwl/workspace:run-commands", + "outputs": [], + "options": { + "command": "ts-node --project packages/serve/tsconfig.json packages/serve/src/index.ts" + } + }, "build": { "executor": "@nrwl/js:tsc", "outputs": ["{options.outputPath}"], diff --git a/packages/serve/src/index.ts b/packages/serve/src/index.ts index 9ed89839..d3659c89 100644 --- a/packages/serve/src/index.ts +++ b/packages/serve/src/index.ts @@ -1 +1,2 @@ -export * from './lib/serve'; +export * from './lib/route-generator'; +export * from './lib/app'; diff --git a/packages/serve/src/lib/app.ts b/packages/serve/src/lib/app.ts new file mode 100644 index 00000000..b4e4e521 --- /dev/null +++ b/packages/serve/src/lib/app.ts @@ -0,0 +1,58 @@ +import { Server } from 'http'; +import Koa from 'koa'; +import KoaRouter from 'koa-router'; +import { + RestfulRoute, + BaseRoute, + APIProviderType, + GraphQLRoute, +} from './route-generator'; + +export type VulcanServer = Server; + +export class VulcanApplication { + private app: Koa; + private restfulRouter: KoaRouter; + private graphqlRouter: KoaRouter; + constructor() { + this.app = new Koa(); + this.restfulRouter = new KoaRouter(); + this.graphqlRouter = new KoaRouter(); + } + + public listen(port: number): VulcanServer { + return this.app.listen(port); + } + + public async setRoutes(routes: Array, type: APIProviderType) { + const setRouteMapper = { + [APIProviderType.RESTFUL]: (routes: Array) => + this.setRestfulRoutes(routes as Array), + [APIProviderType.GRAPHQL]: (routes: Array) => + this.setGraphQLRoutes(routes as Array), + }; + if (!(type in setRouteMapper)) + throw new Error(`The API ${type} not provided now`); + // Set Routes to koa router according to API type + await setRouteMapper[type](routes); + } + // Setup restful routes to server + private async setRestfulRoutes(routes: Array) { + await Promise.all( + routes.map((route) => { + // currently only provide get method + this.restfulRouter.get(route.urlPath, route.respond.bind(route)); + }) + ); + + this.app.use(this.restfulRouter.routes()); + this.app.use(this.restfulRouter.allowedMethods()); + } + + private async setGraphQLRoutes(routes: Array) { + console.log(routes); + // TODO: Still building GraphQL... + this.app.use(this.graphqlRouter.routes()); + this.app.use(this.restfulRouter.allowedMethods()); + } +} diff --git a/packages/serve/src/lib/route-generator/index.ts b/packages/serve/src/lib/route-generator/index.ts new file mode 100644 index 00000000..aebeeeca --- /dev/null +++ b/packages/serve/src/lib/route-generator/index.ts @@ -0,0 +1,2 @@ +export * from './route-component'; +export * from './routeGenerator'; diff --git a/packages/serve/src/lib/route-generator/route-component/baseRoute.ts b/packages/serve/src/lib/route-generator/route-component/baseRoute.ts new file mode 100644 index 00000000..abe73178 --- /dev/null +++ b/packages/serve/src/lib/route-generator/route-component/baseRoute.ts @@ -0,0 +1,41 @@ +import { Next as KoaNext } from 'koa'; +import { RouterContext as KoaRouterContext } from 'koa-router'; +import { IRequestTransformer, RequestParameters } from './requestTransformer'; +import { IRequestValidator } from './requestValidator'; +import { APISchema } from '@vulcan/core'; +export { KoaRouterContext, KoaNext }; + +interface IRoute { + respond(ctx: KoaRouterContext): Promise; +} + +export abstract class BaseRoute implements IRoute { + public readonly apiSchema: APISchema; + private readonly reqTransformer: IRequestTransformer; + private readonly reqValidator: IRequestValidator; + + constructor({ + apiSchema, + reqTransformer, + reqValidator, + }: { + apiSchema: APISchema; + reqTransformer: IRequestTransformer; + reqValidator: IRequestValidator; + }) { + this.apiSchema = apiSchema; + this.reqTransformer = reqTransformer; + this.reqValidator = reqValidator; + } + + public async respond(ctx: KoaRouterContext) { + const params = await this.reqTransformer.transform(ctx, this.apiSchema); + await this.reqValidator.validate(params, this.apiSchema); + return await this.handleRequest(ctx, params); + } + + protected abstract handleRequest( + ctx: KoaRouterContext, + reqParams: RequestParameters + ): Promise; +} diff --git a/packages/serve/src/lib/route-generator/route-component/graphQLRoute.ts b/packages/serve/src/lib/route-generator/route-component/graphQLRoute.ts new file mode 100644 index 00000000..b8f9fc74 --- /dev/null +++ b/packages/serve/src/lib/route-generator/route-component/graphQLRoute.ts @@ -0,0 +1,34 @@ +import { APISchema } from '@vulcan/core'; +import { IRequestTransformer, RequestParameters } from './requestTransformer'; +import { IRequestValidator } from './requestValidator'; +import { BaseRoute, KoaRouterContext } from './baseRoute'; + +export class GraphQLRoute extends BaseRoute { + public readonly operationName: string; + + constructor({ + apiSchema, + reqTransformer, + reqValidator, + }: { + apiSchema: APISchema; + reqTransformer: IRequestTransformer; + reqValidator: IRequestValidator; + }) { + super({ apiSchema, reqTransformer, reqValidator }); + + this.operationName = apiSchema.operationName; + } + + public async makeTypeDefs() { + // TODO: generate graphql type by api schema + } + + protected async handleRequest( + ctx: KoaRouterContext, + reqParams: RequestParameters + ) { + // TODO: implement query by dataset + return reqParams; + } +} diff --git a/packages/serve/src/lib/route-generator/route-component/index.ts b/packages/serve/src/lib/route-generator/route-component/index.ts new file mode 100644 index 00000000..68e3312f --- /dev/null +++ b/packages/serve/src/lib/route-generator/route-component/index.ts @@ -0,0 +1,5 @@ +export * from './requestValidator'; +export * from './requestTransformer'; +export * from './baseRoute'; +export * from './restfulRoute'; +export * from './graphQLRoute'; diff --git a/packages/serve/src/lib/route-generator/route-component/requestTransformer.ts b/packages/serve/src/lib/route-generator/route-component/requestTransformer.ts new file mode 100644 index 00000000..dfd9309d --- /dev/null +++ b/packages/serve/src/lib/route-generator/route-component/requestTransformer.ts @@ -0,0 +1,84 @@ +import { + APISchema, + FieldDataType, + FieldInType, + RequestSchema, +} from '@vulcan/core'; +import { assign } from 'lodash'; +import { KoaRouterContext } from './baseRoute'; + +export interface RequestParameters { + [name: string]: any; +} + +export interface IRequestTransformer { + transform( + ctx: KoaRouterContext, + apiSchema: APISchema + ): Promise; +} + +export class RequestTransformer implements IRequestTransformer { + public static readonly fieldInMapper: { + [type in FieldInType]: (ctx: KoaRouterContext, fieldName: string) => string; + } = { + [FieldInType.HEADER]: (ctx: KoaRouterContext, fieldName: string) => + ctx.request.header[fieldName] as string, + [FieldInType.QUERY]: (ctx: KoaRouterContext, fieldName: string) => + ctx.request.query[fieldName] as string, + [FieldInType.PATH]: (ctx: KoaRouterContext, fieldName: string) => + ctx.params[fieldName] as string, + }; + + public static readonly convertTypeMapper: { + [type in FieldDataType]: (value: string) => any; + } = { + [FieldDataType.NUMBER]: (value: string) => Number(value), + [FieldDataType.STRING]: (value: string) => String(value), + [FieldDataType.BOOLEAN]: (value: string) => Boolean(value), + }; + + public async transform( + ctx: KoaRouterContext, + apiSchema: APISchema + ): Promise { + const paramList = await Promise.all( + apiSchema.request.map(async (schemaReqParam: RequestSchema) => { + const { fieldName, fieldIn, type } = schemaReqParam; + // Get request value according field-in type + const fieldValue = RequestTransformer.fieldInMapper[fieldIn]( + ctx, + fieldName + ); + const formattedValue = await this.convertDataType( + fieldName, + fieldValue, + type + ); + // transform format to { name: value } + return { [fieldName]: formattedValue }; + }) + ); + // combine all param list to one object for { name: value } format + const params = assign({}, ...paramList); + return params; + } + + // check data type of one parameter by input type and convert it + private async convertDataType( + name: string, + value: string, + type: FieldDataType + ) { + try { + if (!(type in FieldDataType)) + throw new Error(`The ${type} type not been implemented now.`); + + return RequestTransformer.convertTypeMapper[type](value); + } catch { + throw new Error( + `The value of field "${name}" not belong to ${type} type` + ); + } + } +} diff --git a/packages/serve/src/lib/route-generator/route-component/requestValidator.ts b/packages/serve/src/lib/route-generator/route-component/requestValidator.ts new file mode 100644 index 00000000..9cc97bd0 --- /dev/null +++ b/packages/serve/src/lib/route-generator/route-component/requestValidator.ts @@ -0,0 +1,43 @@ +import { + APISchema, + loadedValidators, + RequestSchema, + ValidatorDefinition, +} from '@vulcan/core'; +import { RequestParameters } from './requestTransformer'; + +export interface IRequestValidator { + validate(reqParams: RequestParameters, apiSchema: APISchema): Promise; +} + +export class RequestValidator implements IRequestValidator { + // validate each parameters of request and transform the request content of koa ctx to "RequestParameters" format + public async validate(reqParams: RequestParameters, apiSchema: APISchema) { + await Promise.all( + apiSchema.request.map(async (schemaParam: RequestSchema) => { + const { fieldName, validators } = schemaParam; + // validate format through validators + await this.validateFieldFormat(reqParams[fieldName], validators); + }) + ); + } + // validate one parameter by input validator + private async validateFieldFormat( + fieldValue: string, + schemaValidators: Array + ) { + await Promise.all( + schemaValidators.map((schemaValidator) => { + if (!(schemaValidator.name in loadedValidators)) { + throw new Error( + `The name "${schemaValidator.name}" of validator not defined, please defined it through IValidator.` + ); + } + loadedValidators[schemaValidator.name].validateData( + fieldValue, + schemaValidator.args + ); + }) + ); + } +} diff --git a/packages/serve/src/lib/route-generator/route-component/restfulRoute.ts b/packages/serve/src/lib/route-generator/route-component/restfulRoute.ts new file mode 100644 index 00000000..dd5d39d0 --- /dev/null +++ b/packages/serve/src/lib/route-generator/route-component/restfulRoute.ts @@ -0,0 +1,31 @@ +import { APISchema } from '@vulcan/core'; +import { IRequestTransformer, RequestParameters } from './requestTransformer'; +import { IRequestValidator } from './requestValidator'; +import { BaseRoute, KoaRouterContext } from './baseRoute'; + +export class RestfulRoute extends BaseRoute { + public readonly urlPath: string; + + constructor({ + apiSchema, + reqTransformer, + reqValidator, + }: { + apiSchema: APISchema; + reqTransformer: IRequestTransformer; + reqValidator: IRequestValidator; + }) { + super({ apiSchema, reqTransformer, reqValidator }); + + this.urlPath = apiSchema.urlPath; + } + + protected async handleRequest( + ctx: KoaRouterContext, + reqParams: RequestParameters + ) { + // TODO: implement query by dataset + ctx.response.body = reqParams; + return; + } +} diff --git a/packages/serve/src/lib/route-generator/routeGenerator.ts b/packages/serve/src/lib/route-generator/routeGenerator.ts new file mode 100644 index 00000000..3948111e --- /dev/null +++ b/packages/serve/src/lib/route-generator/routeGenerator.ts @@ -0,0 +1,59 @@ +import { APISchema } from '@vulcan/core'; + +import { + RestfulRoute, + GraphQLRoute, + IRequestValidator, + IRequestTransformer, +} from './route-component'; + +export enum APIProviderType { + RESTFUL = 'RESTFUL', + GRAPHQL = 'GRAPHQL', +} + +type RouteComponentType = typeof RestfulRoute | typeof GraphQLRoute; + +type APIRouteBuilderOption = { + [K in APIProviderType]: RouteComponentType; +}; + +export class RouteGenerator { + private reqValidator: IRequestValidator; + private reqTransformer: IRequestTransformer; + private apiOptions: APIRouteBuilderOption = { + [APIProviderType.RESTFUL]: RestfulRoute, + [APIProviderType.GRAPHQL]: GraphQLRoute, + }; + + constructor({ + reqValidator, + reqTransformer, + }: { + reqValidator: IRequestValidator; + reqTransformer: IRequestTransformer; + }) { + this.reqValidator = reqValidator; + this.reqTransformer = reqTransformer; + } + + public async generate(apiSchema: APISchema, optionType: APIProviderType) { + if (!(optionType in this.apiOptions)) + throw new Error(`The API type: ${optionType} currently not provided now`); + + return new this.apiOptions[optionType]({ + apiSchema, + reqTransformer: this.reqTransformer, + reqValidator: this.reqValidator, + }); + } + + public async multiGenerate( + schemas: Array, + optionType: APIProviderType + ) { + return Promise.all( + schemas.map(async (schema) => await this.generate(schema, optionType)) + ); + } +} diff --git a/packages/serve/src/lib/serve.spec.ts b/packages/serve/src/lib/serve.spec.ts deleted file mode 100644 index 4e6a0f3b..00000000 --- a/packages/serve/src/lib/serve.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { serve } from './serve'; - -describe('serve', () => { - it('should work', () => { - expect(serve()).toEqual('serve'); - }); -}); diff --git a/packages/serve/src/lib/serve.ts b/packages/serve/src/lib/serve.ts deleted file mode 100644 index f6e1a4a2..00000000 --- a/packages/serve/src/lib/serve.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function serve(): string { - return 'serve'; -} diff --git a/packages/serve/test/app.spec.ts b/packages/serve/test/app.spec.ts new file mode 100644 index 00000000..c19511b1 --- /dev/null +++ b/packages/serve/test/app.spec.ts @@ -0,0 +1,239 @@ +import * as sinon from 'ts-sinon'; +import supertest from 'supertest'; +import faker from '@faker-js/faker'; +import { Request } from 'koa'; +import KoaRouter from 'koa-router'; +import { VulcanApplication, VulcanServer } from '@app'; +import { + APISchema, + FieldDataType, + FieldInType, + RequestSchema, + ValidatorDefinition, +} from '@vulcan/core'; + +import { + RouteGenerator, + APIProviderType, + KoaRouterContext, + RequestParameters, + RequestTransformer, + RequestValidator, +} from '@route-generator/.'; + +describe('Test vulcan server to call restful APIs', () => { + let server: VulcanServer; + + const fakeSchemas: Array = [ + { + ...sinon.stubInterface(), + urlPath: `/department/:id/employees/:uuid`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'id', + type: FieldDataType.NUMBER, + fieldIn: FieldInType.PATH, + validators: [ + { + name: 'integer', + }, + ] as Array, + }, + { + ...sinon.stubInterface(), + fieldName: 'uuid', + type: FieldDataType.STRING, + fieldIn: FieldInType.PATH, + validators: [ + { + name: 'uuid', + }, + ] as Array, + }, + ], + }, + { + ...sinon.stubInterface(), + urlPath: `/orders/:uuid`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'uuid', + type: FieldDataType.STRING, + fieldIn: FieldInType.PATH, + validators: [ + { + name: 'uuid', + }, + ] as Array, + }, + { + ...sinon.stubInterface(), + fieldName: 'domain', + type: FieldDataType.STRING, + fieldIn: FieldInType.HEADER, + validators: [ + { + name: 'string', + }, + ] as Array, + }, + ], + }, + { + ...sinon.stubInterface(), + urlPath: `/searchOrders`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'keywords', + type: FieldDataType.STRING, + fieldIn: FieldInType.QUERY, + validators: [ + { + name: 'string', + }, + ] as Array, + }, + { + ...sinon.stubInterface(), + fieldName: 'domain', + type: FieldDataType.STRING, + fieldIn: FieldInType.HEADER, + validators: [ + { + name: 'string', + }, + ] as Array, + }, + ], + }, + { + ...sinon.stubInterface(), + urlPath: `/searchProducts`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'keywords', + type: FieldDataType.STRING, + fieldIn: FieldInType.QUERY, + validators: [ + { + name: 'string', + }, + ] as Array, + }, + ], + }, + ]; + + const fakeKoaContexts: Array = [ + { + ...sinon.stubInterface(), + params: { + id: faker.datatype.number().toString(), + uuid: faker.datatype.uuid(), + }, + }, + { + ...sinon.stubInterface(), + params: { + uuid: faker.datatype.uuid(), + }, + request: { + ...sinon.stubInterface(), + header: { + domain: faker.internet.domainName(), + }, + }, + }, + { + ...sinon.stubInterface(), + request: { + ...sinon.stubInterface(), + header: { + domain: faker.internet.domainName(), + }, + query: { + keywords: faker.random.words(), + }, + }, + }, + { + ...sinon.stubInterface(), + request: { + ...sinon.stubInterface(), + query: { + keywords: faker.random.words(), + }, + }, + }, + ]; + + beforeAll(async () => { + const reqTransformer = new RequestTransformer(); + const reqValidator = new RequestValidator(); + + const generator = new RouteGenerator({ + reqTransformer, + reqValidator, + }); + const routes = await generator.multiGenerate( + fakeSchemas, + APIProviderType.RESTFUL + ); + const app = new VulcanApplication(); + await app.setRoutes(routes, APIProviderType.RESTFUL); + server = app.listen(3000); + }); + + afterAll(() => { + server.close(); + }); + + it.each([ + ['path nested parameters', fakeSchemas[0], fakeKoaContexts[0]], + ['path & header parameters', fakeSchemas[1], fakeKoaContexts[1]], + ['query & header parameters', fakeSchemas[2], fakeKoaContexts[2]], + ['query parameters', fakeSchemas[3], fakeKoaContexts[3]], + ])( + 'Should be correct when given validated koa context request from %p', + async (_: string, schema: APISchema, ctx: KoaRouterContext) => { + // Arrange + + // arrange input api url + const apiUrl = KoaRouter.url(schema.urlPath, ctx.params); + + // arrange expected result + const expected: RequestParameters = {}; + schema.request.map((param: RequestSchema) => { + const fieldValue = RequestTransformer.fieldInMapper[param.fieldIn]( + ctx, + param.fieldName + ); + expected[param.fieldName] = + RequestTransformer.convertTypeMapper[param.type](fieldValue); + }); + + // Act + let reqOperation = supertest(server).get(apiUrl); + + // if request context exist setting the request input + if (ctx.request) { + // set query data to request if exist + reqOperation = ctx.request.query + ? reqOperation.query(ctx.request.query) + : reqOperation; + // set header data to request if exist + reqOperation = ctx.request.header + ? reqOperation.set(ctx.request.header) + : reqOperation; + } + const response = await reqOperation; + + // Assert + expect(response.body).toEqual(expected); + } + ); +}); diff --git a/packages/serve/test/route-generator/route-component/requestTransformer.spec.ts b/packages/serve/test/route-generator/route-component/requestTransformer.spec.ts new file mode 100644 index 00000000..bc870e96 --- /dev/null +++ b/packages/serve/test/route-generator/route-component/requestTransformer.spec.ts @@ -0,0 +1,156 @@ +import * as sinon from 'ts-sinon'; +import { Request } from 'koa'; +import faker from '@faker-js/faker'; +import { + APISchema, + FieldDataType, + FieldInType, + RequestSchema, +} from '@vulcan/core'; +import { + KoaRouterContext, + RequestParameters, + RequestTransformer, +} from '@route-generator/.'; + +describe('Test request transformer - transform successfully', () => { + const fakeSchemas: Array = [ + { + ...sinon.stubInterface(), + urlPath: `/${faker.word.noun()}/:id/${faker.word.noun()}/:uuid`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'id', + type: FieldDataType.NUMBER, + fieldIn: FieldInType.PATH, + }, + { + ...sinon.stubInterface(), + fieldName: 'uuid', + type: FieldDataType.STRING, + fieldIn: FieldInType.PATH, + }, + ], + }, + { + ...sinon.stubInterface(), + urlPath: `/${faker.word.noun()}/:uuid`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'uuid', + type: FieldDataType.STRING, + fieldIn: FieldInType.PATH, + }, + { + ...sinon.stubInterface(), + fieldName: 'domain', + type: FieldDataType.STRING, + fieldIn: FieldInType.HEADER, + }, + ], + }, + { + ...sinon.stubInterface(), + urlPath: `/${faker.word.noun()}`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'keywords', + type: FieldDataType.STRING, + fieldIn: FieldInType.QUERY, + }, + { + ...sinon.stubInterface(), + fieldName: 'domain', + type: FieldDataType.STRING, + fieldIn: FieldInType.HEADER, + }, + ], + }, + { + ...sinon.stubInterface(), + urlPath: `/${faker.word.noun()}`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'sort', + type: FieldDataType.BOOLEAN, + fieldIn: FieldInType.QUERY, + }, + ], + }, + ]; + const fakeKoaContexts: Array = [ + { + ...sinon.stubInterface(), + params: { + id: faker.datatype.number().toString(), + uuid: faker.datatype.uuid(), + }, + }, + { + ...sinon.stubInterface(), + params: { + uuid: faker.datatype.uuid(), + }, + request: { + ...sinon.stubInterface(), + header: { + domain: faker.internet.domainName(), + }, + }, + }, + { + ...sinon.stubInterface(), + request: { + ...sinon.stubInterface(), + header: { + domain: faker.internet.domainName(), + }, + query: { + keywords: faker.random.words(), + }, + }, + }, + { + ...sinon.stubInterface(), + request: { + ...sinon.stubInterface(), + query: { + sort: faker.datatype.string(), + }, + }, + }, + ]; + + it.each([ + ['path nested parameters', fakeSchemas[0], fakeKoaContexts[0]], + ['path & header parameters', fakeSchemas[1], fakeKoaContexts[1]], + ['query & header parameters', fakeSchemas[2], fakeKoaContexts[2]], + ['query parameters', fakeSchemas[3], fakeKoaContexts[3]], + ])( + 'Should success when give api schema and koa context request from %p', + async (_: string, schema: APISchema, ctx: KoaRouterContext) => { + // Arrange + const expected: RequestParameters = {}; + schema.request.map((param: RequestSchema) => { + const fieldValue = RequestTransformer.fieldInMapper[param.fieldIn]( + ctx, + param.fieldName + ); + expected[param.fieldName] = + RequestTransformer.convertTypeMapper[param.type](fieldValue); + }); + // Act + const transformer = new RequestTransformer(); + const result = await transformer.transform(ctx, schema); + + // Assert + expect(result).toEqual(expected); + } + ); +}); + +// TODO: Failed case for transformer diff --git a/packages/serve/test/route-generator/route-component/requestValidator.spec.ts b/packages/serve/test/route-generator/route-component/requestValidator.spec.ts new file mode 100644 index 00000000..618c305e --- /dev/null +++ b/packages/serve/test/route-generator/route-component/requestValidator.spec.ts @@ -0,0 +1,152 @@ +import * as sinon from 'ts-sinon'; +import faker from '@faker-js/faker'; +import { RequestValidator, RequestParameters } from '@route-generator/.'; +import { + APISchema, + FieldDataType, + FieldInType, + RequestSchema, + ValidatorDefinition, +} from '@vulcan/core'; + +describe('Test request validator - validate successfully', () => { + const fakeSchemas: Array = [ + { + ...sinon.stubInterface(), + urlPath: `/${faker.word.noun()}/:id/${faker.word.noun()}/:uuid`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'id', + type: FieldDataType.NUMBER, + fieldIn: FieldInType.PATH, + validators: [ + { + name: 'integer', + }, + ] as Array, + }, + { + ...sinon.stubInterface(), + fieldName: 'uuid', + type: FieldDataType.STRING, + fieldIn: FieldInType.PATH, + validators: [ + { + name: 'uuid', + }, + ] as Array, + }, + ], + }, + { + ...sinon.stubInterface(), + urlPath: `/${faker.word.noun()}/:uuid`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'uuid', + type: FieldDataType.STRING, + fieldIn: FieldInType.PATH, + validators: [ + { + name: 'uuid', + }, + ] as Array, + }, + { + ...sinon.stubInterface(), + fieldName: 'domain', + type: FieldDataType.STRING, + fieldIn: FieldInType.HEADER, + validators: [ + { + name: 'string', + }, + ] as Array, + }, + ], + }, + { + ...sinon.stubInterface(), + urlPath: `/${faker.word.noun()}`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'keywords', + type: FieldDataType.STRING, + fieldIn: FieldInType.QUERY, + validators: [ + { + name: 'string', + }, + ] as Array, + }, + { + ...sinon.stubInterface(), + fieldName: 'domain', + type: FieldDataType.STRING, + fieldIn: FieldInType.HEADER, + validators: [ + { + name: 'string', + }, + ] as Array, + }, + ], + }, + { + ...sinon.stubInterface(), + urlPath: `/${faker.word.noun()}`, + request: [ + { + ...sinon.stubInterface(), + fieldName: 'sort', + type: FieldDataType.STRING, + fieldIn: FieldInType.QUERY, + validators: [ + { + name: 'string', + args: {}, + }, + ] as Array, + }, + ], + }, + ]; + const fakeKoaContexts: Array = [ + { + id: faker.datatype.number(), + uuid: faker.datatype.uuid(), + }, + { + uuid: faker.datatype.uuid(), + domain: faker.internet.domainName(), + }, + { + domain: faker.internet.domainName(), + keywords: faker.random.words(), + }, + { + sort: faker.helpers.arrayElement(['ASC', 'DESC']), + }, + ]; + + it.each([ + [fakeSchemas[0], fakeKoaContexts[0]], + [fakeSchemas[1], fakeKoaContexts[1]], + [fakeSchemas[2], fakeKoaContexts[2]], + [fakeSchemas[3], fakeKoaContexts[3]], + ])( + 'Should success when give matched request parameters and api schema', + async (schema: APISchema, reqParams: RequestParameters) => { + // Act + const validator = new RequestValidator(); + const validateAction = validator.validate(reqParams, schema); + const result = expect(validateAction).resolves; + await result.not.toThrow(); + } + ); +}); + +// TODO: Failed case for validator diff --git a/packages/serve/test/route-generator/routeGenerator.spec.ts b/packages/serve/test/route-generator/routeGenerator.spec.ts new file mode 100644 index 00000000..a5b04f9c --- /dev/null +++ b/packages/serve/test/route-generator/routeGenerator.spec.ts @@ -0,0 +1,79 @@ +import faker from '@faker-js/faker'; +import * as sinon from 'ts-sinon'; +import { APISchema } from '@vulcan/core'; +import { + APIProviderType, + GraphQLRoute, + IRequestTransformer, + IRequestValidator, + RestfulRoute, + RouteGenerator, +} from '@route-generator/.'; + +describe('Test route generator ', () => { + let stubReqTransformer: sinon.StubbedInstance; + let stubReqValidator: sinon.StubbedInstance; + const fakeSchemas: Array = Array( + faker.datatype.number({ min: 2, max: 4 }) + ).fill(sinon.stubInterface()); + + beforeEach(() => { + stubReqTransformer = sinon.stubInterface(); + stubReqValidator = sinon.stubInterface(); + }); + + it.each(fakeSchemas)( + 'Should generate restful routes when input schemas and provide restful type', + async (apiSchema: APISchema) => { + // Arrange + const expectedRoute: RestfulRoute = new RestfulRoute({ + apiSchema, + reqTransformer: stubReqTransformer, + reqValidator: stubReqValidator, + }); + const routeGenerator = new RouteGenerator({ + reqTransformer: stubReqTransformer, + reqValidator: stubReqValidator, + }); + + // Act + const resultRoute = await routeGenerator.generate( + apiSchema, + APIProviderType.RESTFUL + ); + + // Assert + // Need to become json format for matching a object of class + expect(JSON.stringify(resultRoute)).toEqual( + JSON.stringify(expectedRoute) + ); + } + ); + + it.each(fakeSchemas)( + 'Should generate graphQL routes when input schemas and provide graphQL type', + async (apiSchema: APISchema) => { + // Arrange + const expectedRoute: GraphQLRoute = new GraphQLRoute({ + apiSchema, + reqTransformer: stubReqTransformer, + reqValidator: stubReqValidator, + }); + const routeGenerator = new RouteGenerator({ + reqTransformer: stubReqTransformer, + reqValidator: stubReqValidator, + }); + + // Act + const resultRoute = await routeGenerator.generate( + apiSchema, + APIProviderType.GRAPHQL + ); + // Assert + // Need to become json format for matching a object of class + expect(JSON.stringify(resultRoute)).toEqual( + JSON.stringify(expectedRoute) + ); + } + ); +}); diff --git a/packages/serve/tsconfig.json b/packages/serve/tsconfig.json index f5b85657..8bb83d70 100644 --- a/packages/serve/tsconfig.json +++ b/packages/serve/tsconfig.json @@ -7,7 +7,14 @@ "noImplicitOverride": true, "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "paths": { + // specify vulcan/core package for link and make us could import by @vulcan/core + "@vulcan/core": ["packages/core/src/index.ts"], + "@route-generator/*": ["packages/serve/src/lib/route-generator/*"], + "@app": ["packages/serve/src/lib/app.ts"] + } }, "files": [], "include": [], @@ -18,5 +25,9 @@ { "path": "./tsconfig.spec.json" } - ] + ], + // make above paths configuration could run ts-node + "ts-node": { + "require": ["tsconfig-paths/register"] + } } diff --git a/packages/serve/yarn.lock b/packages/serve/yarn.lock index 7ebf3341..fb3f8543 100644 --- a/packages/serve/yarn.lock +++ b/packages/serve/yarn.lock @@ -29,6 +29,11 @@ resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.5.tgz#650820e95de346e1f84e30667d168c8fd25aa6e3" integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA== +"@types/cookiejar@*": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" + integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== + "@types/cookies@*": version "0.7.7" resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" @@ -136,6 +141,21 @@ "@types/mime" "^1" "@types/node" "*" +"@types/superagent@*": + version "4.1.15" + resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.15.tgz#63297de457eba5e2bc502a7609426c4cceab434a" + integrity sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ== + dependencies: + "@types/cookiejar" "*" + "@types/node" "*" + +"@types/supertest@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" + integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== + dependencies: + "@types/superagent" "*" + accepts@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -144,6 +164,16 @@ accepts@^1.3.5: mime-types "~2.1.34" negotiator "0.6.3" +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -180,6 +210,18 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +component-emitter@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + content-disposition@~0.5.2: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -192,6 +234,11 @@ content-type@^1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +cookiejar@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== + cookies@~0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" @@ -205,7 +252,7 @@ copy-to@^2.0.1: resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU= -debug@^4.1.1, debug@^4.3.2: +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -217,6 +264,11 @@ deep-equal@~1.0.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -237,6 +289,14 @@ destroy@^1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +dezalgo@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= + dependencies: + asap "^2.0.0" + wrappy "1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -252,6 +312,30 @@ escape-html@^1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formidable@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff" + integrity sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ== + dependencies: + dezalgo "1.0.3" + hexoid "1.0.0" + once "1.4.0" + qs "6.9.3" + fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -290,6 +374,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hexoid@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + http-assert@^1.3.0: version "1.5.0" resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" @@ -332,7 +421,7 @@ inflation@^2.0.0: resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= -inherits@2.0.4: +inherits@2.0.4, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -412,6 +501,13 @@ koa@^2.13.4: type-is "^1.6.16" vary "^1.1.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -427,13 +523,18 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.18, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -456,6 +557,13 @@ on-finished@^2.3.0: dependencies: ee-first "1.1.1" +once@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + only@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" @@ -471,7 +579,12 @@ path-to-regexp@^6.1.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38" integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg== -qs@^6.5.2: +qs@6.9.3: + version "6.9.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" + integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== + +qs@^6.10.3, qs@^6.5.2: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== @@ -488,7 +601,16 @@ raw-body@^2.3.3: iconv-lite "0.4.24" unpipe "1.0.0" -safe-buffer@5.2.1: +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +safe-buffer@5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -498,6 +620,13 @@ safe-buffer@5.2.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -522,6 +651,38 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +superagent@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-7.1.3.tgz#783ff8330e7c2dad6ad8f0095edc772999273b6b" + integrity sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.3" + debug "^4.3.4" + fast-safe-stringify "^2.1.1" + form-data "^4.0.0" + formidable "^2.0.1" + methods "^1.1.2" + mime "^2.5.0" + qs "^6.10.3" + readable-stream "^3.6.0" + semver "^7.3.7" + +supertest@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.2.3.tgz#291b220126e5faa654d12abe1ada3658757c8c67" + integrity sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g== + dependencies: + methods "^1.1.2" + superagent "^7.1.3" + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -545,11 +706,26 @@ unpipe@1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + vary@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + ylru@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.3.2.tgz#0de48017473275a4cbdfc83a1eaf67c01af8a785" From bf13fd77a5a14ed5a84430e83bd4f6999359be41 Mon Sep 17 00:00:00 2001 From: kokokuo Date: Thu, 19 May 2022 16:59:41 +0800 Subject: [PATCH 4/4] fix(core,build,serve): fix unit tests and import module methods - remove "esModuleInterop" in core, serve packages. - change from "moment" to "dayjs" to use in "DateTypeValidator" - update "validateSchema" and "validateData" return void type in "IValidator". - create "normalizedStringValue" module to handle string value. - add "../../types/*.d.ts" in tsconfig of serve. - rename to "RequestParameter" from "RequestSchema" in middleware. - rename "route-generator" to "route" package --- package.json | 9 + .../middleware/checkValidator.ts | 4 +- .../schema-parser/middleware/middleware.ts | 6 +- .../middleware/checkValidator.spec.ts | 16 +- .../test/schema-parser/schemaParser.spec.ts | 2 +- packages/core/package.json | 5 +- packages/core/src/index.ts | 6 +- packages/core/src/lib/utils/index.ts | 1 + .../src/lib/utils/normalizedStringValue.ts | 46 ++ .../data-type-validators/dateTypeValidator.ts | 23 +- .../integerTypeValidator.ts | 10 +- .../stringTypeValidator.ts | 10 +- .../data-type-validators/uuidTypeValidator.ts | 10 +- packages/core/src/lib/validators/validator.ts | 4 +- .../test/validators/dataTypeValidator.spec.ts | 6 +- .../validators/integerTypeValidator.spec.ts | 6 +- .../validators/stringTypeValidator.spec.ts | 6 +- .../test/validators/uuidTypeValidator.spec.ts | 6 +- packages/core/tsconfig.json | 1 - packages/core/yarn.lock | 44 -- packages/serve/package.json | 14 +- packages/serve/src/index.ts | 2 +- packages/serve/src/lib/app.ts | 6 +- .../lib/{route-generator => route}/index.ts | 0 .../route-component/baseRoute.ts | 0 .../route-component/graphQLRoute.ts | 0 .../route-component/index.ts | 0 .../route-component/requestTransformer.ts | 14 +- .../route-component/requestValidator.ts | 0 .../route-component/restfulRoute.ts | 0 .../routeGenerator.ts | 0 packages/serve/test/app.spec.ts | 11 +- .../requestTransformer.spec.ts | 9 +- .../route-component/requestValidator.spec.ts | 2 +- .../routeGenerator.spec.ts | 2 +- packages/serve/tsconfig.json | 4 +- packages/serve/tsconfig.lib.json | 2 +- packages/serve/tsconfig.spec.json | 8 +- packages/serve/yarn.lock | 728 ------------------ yarn.lock | 536 ++++++++++++- 40 files changed, 674 insertions(+), 885 deletions(-) create mode 100644 packages/core/src/lib/utils/index.ts create mode 100644 packages/core/src/lib/utils/normalizedStringValue.ts rename packages/core/{src => }/test/validators/dataTypeValidator.spec.ts (93%) rename packages/core/{src => }/test/validators/integerTypeValidator.spec.ts (93%) rename packages/core/{src => }/test/validators/stringTypeValidator.spec.ts (92%) rename packages/core/{src => }/test/validators/uuidTypeValidator.spec.ts (91%) rename packages/serve/src/lib/{route-generator => route}/index.ts (100%) rename packages/serve/src/lib/{route-generator => route}/route-component/baseRoute.ts (100%) rename packages/serve/src/lib/{route-generator => route}/route-component/graphQLRoute.ts (100%) rename packages/serve/src/lib/{route-generator => route}/route-component/index.ts (100%) rename packages/serve/src/lib/{route-generator => route}/route-component/requestTransformer.ts (81%) rename packages/serve/src/lib/{route-generator => route}/route-component/requestValidator.ts (100%) rename packages/serve/src/lib/{route-generator => route}/route-component/restfulRoute.ts (100%) rename packages/serve/src/lib/{route-generator => route}/routeGenerator.ts (100%) rename packages/serve/test/{route-generator => route}/route-component/requestTransformer.spec.ts (94%) rename packages/serve/test/{route-generator => route}/route-component/requestValidator.spec.ts (98%) rename packages/serve/test/{route-generator => route}/routeGenerator.spec.ts (98%) diff --git a/package.json b/package.json index 042222c5..653f7326 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,14 @@ }, "private": true, "dependencies": { + "dayjs": "^1.11.2", "glob": "^8.0.1", + "joi": "^17.6.0", "js-yaml": "^4.1.0", + "koa": "^2.13.4", + "koa-bodyparser": "^4.3.0", "koa-compose": "^4.1.0", + "koa-router": "^10.1.1", "lodash": "^4.17.21", "nunjucks": "^3.2.3", "tslib": "^2.3.0", @@ -26,9 +31,12 @@ "@types/glob": "^7.2.0", "@types/jest": "27.4.1", "@types/js-yaml": "^4.0.5", + "@types/koa": "^2.13.4", "@types/koa-compose": "^3.2.5", + "@types/koa-router": "^7.4.4", "@types/lodash": "^4.14.182", "@types/node": "16.11.7", + "@types/supertest": "^2.0.12", "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "~5.18.0", "@typescript-eslint/parser": "~5.18.0", @@ -38,6 +46,7 @@ "jest": "27.5.1", "nx": "14.0.3", "prettier": "^2.5.1", + "supertest": "^6.2.3", "ts-essentials": "^9.1.2", "ts-jest": "27.1.4", "ts-node": "9.1.1", diff --git a/packages/build/src/lib/schema-parser/middleware/checkValidator.ts b/packages/build/src/lib/schema-parser/middleware/checkValidator.ts index 9ed02c07..18d7bb1c 100644 --- a/packages/build/src/lib/schema-parser/middleware/checkValidator.ts +++ b/packages/build/src/lib/schema-parser/middleware/checkValidator.ts @@ -20,8 +20,6 @@ export const checkValidator = const validator = loader.getLoader(validatorRequest.name); // TODO: indicate the detail of error - if (!validator.validateSchema(validatorRequest.args)) { - throw new Error(`Validator ${validatorRequest.name} schema invalid`); - } + validator.validateSchema(validatorRequest.args); } }; diff --git a/packages/build/src/lib/schema-parser/middleware/middleware.ts b/packages/build/src/lib/schema-parser/middleware/middleware.ts index 934b351c..e0bfa6c9 100644 --- a/packages/build/src/lib/schema-parser/middleware/middleware.ts +++ b/packages/build/src/lib/schema-parser/middleware/middleware.ts @@ -1,4 +1,8 @@ -import { APISchema, RequestParameter, ValidatorDefinition } from '@vulcan/core'; +import { + APISchema, + RequestSchema as RequestParameter, + ValidatorDefinition, +} from '@vulcan/core'; import { DeepPartial } from 'ts-essentials'; export interface RawRequestParameter diff --git a/packages/build/test/schema-parser/middleware/checkValidator.spec.ts b/packages/build/test/schema-parser/middleware/checkValidator.spec.ts index e9eb6024..0bd26a78 100644 --- a/packages/build/test/schema-parser/middleware/checkValidator.spec.ts +++ b/packages/build/test/schema-parser/middleware/checkValidator.spec.ts @@ -15,8 +15,8 @@ it('Should pass if there is no error', async () => { const stubValidatorLoader = sinon.stubInterface(); stubValidatorLoader.getLoader.returns({ name: 'validator1', - validateSchema: () => true, - validateData: () => true, + validateSchema: () => null, + validateData: () => null, }); // Act Assert @@ -38,8 +38,8 @@ it('Should throw if some validators have no name', async () => { const stubValidatorLoader = sinon.stubInterface(); stubValidatorLoader.getLoader.returns({ name: 'validator1', - validateSchema: () => true, - validateData: () => true, + validateSchema: () => null, + validateData: () => null, }); // Act Assert @@ -61,12 +61,14 @@ it('Should throw if the arguments of a validator is invalid', async () => { const stubValidatorLoader = sinon.stubInterface(); stubValidatorLoader.getLoader.returns({ name: 'validator1', - validateSchema: () => false, - validateData: () => true, + validateSchema: () => { + throw new Error(); + }, + validateData: () => null, }); // Act Assert await expect( checkValidator(stubValidatorLoader)(schema, async () => Promise.resolve()) - ).rejects.toThrow('Validator validator1 schema invalid'); + ).rejects.toThrow(); }); diff --git a/packages/build/test/schema-parser/schemaParser.spec.ts b/packages/build/test/schema-parser/schemaParser.spec.ts index cbaae8fe..73f4ee54 100644 --- a/packages/build/test/schema-parser/schemaParser.spec.ts +++ b/packages/build/test/schema-parser/schemaParser.spec.ts @@ -28,7 +28,7 @@ request: stubValidatorLoader.getLoader.returns({ name: 'validator1', validateSchema: () => true, - validateData: () => true, + validateData: () => null, }); const schemaParser = new SchemaParser({ schemaReader: stubSchemaReader, diff --git a/packages/core/package.json b/packages/core/package.json index 423fb9a7..6fc297e5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -2,8 +2,5 @@ "name": "@vulcan/core", "version": "0.0.1", "type": "commonjs", - "dependencies": { - "joi": "^17.6.0", - "moment": "^2.29.3" - } + "dependencies": {} } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 9a456984..da97c247 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,3 @@ -export * from './lib/template-engine'; -export * from './models'; -export * from './lib/artifact-builder'; // import built-in validators import builtInValidatorClasses from './lib/validators'; import IValidator from './lib/validators/validator'; @@ -22,6 +19,9 @@ const loadedValidators: { [name: string]: IValidator } = Object.assign( export * from './lib/validators'; // Export all other modules export * from './models'; +export * from './lib/utils'; export * from './lib/validators/validator'; +export * from './lib/template-engine'; +export * from './lib/artifact-builder'; export { loadedValidators, IValidator }; diff --git a/packages/core/src/lib/utils/index.ts b/packages/core/src/lib/utils/index.ts new file mode 100644 index 00000000..36d1dbe7 --- /dev/null +++ b/packages/core/src/lib/utils/index.ts @@ -0,0 +1 @@ +export * from './normalizedStringValue'; diff --git a/packages/core/src/lib/utils/normalizedStringValue.ts b/packages/core/src/lib/utils/normalizedStringValue.ts new file mode 100644 index 00000000..21fe9cfa --- /dev/null +++ b/packages/core/src/lib/utils/normalizedStringValue.ts @@ -0,0 +1,46 @@ +export const canBeNormalized = (type: string) => { + return ( + ['number', 'boolean', 'string', 'date'].indexOf(type.toLowerCase()) !== -1 + ); +}; + +export const normalizeStringValue = ( + value: string, + dataName: string, + dataType: string +) => { + switch (dataType.toLowerCase()) { + case 'number': { + if (value === '') { + throw new Error(`${dataName} must be number`); + } + const valueNumber = +value; + if (isNaN(valueNumber)) { + throw new Error(`${dataName} must be number`); + } + return valueNumber; + } + + case 'boolean': { + if (value === 'true' || value === '1' || value === '') { + return true; + } else if (value === 'false' || value === '0') { + return false; + } else { + throw new Error(`${dataName} must be boolean`); + } + } + + case 'date': { + const parsedDate = new Date(value); + if (Number.isNaN(parsedDate.getTime())) { + throw new Error(`${dataName} must be date`); + } + return parsedDate; + } + + case 'string': + default: + return value; + } +}; diff --git a/packages/core/src/lib/validators/data-type-validators/dateTypeValidator.ts b/packages/core/src/lib/validators/data-type-validators/dateTypeValidator.ts index 1f7dbbed..d85beb92 100644 --- a/packages/core/src/lib/validators/data-type-validators/dateTypeValidator.ts +++ b/packages/core/src/lib/validators/data-type-validators/dateTypeValidator.ts @@ -1,8 +1,12 @@ import * as Joi from 'joi'; import { isUndefined } from 'lodash'; -import moment from 'moment'; +import * as dayjs from 'dayjs'; +import customParseFormat = require('dayjs/plugin/customParseFormat'); import IValidator from '../validator'; +// Support custom date format -> dayjs.format(...) +dayjs.extend(customParseFormat); + export interface DateInputArgs { // The date needed format, supported ISO_8601 token, ref: https://www.w3.org/TR/NOTE-datetime // e.g: "YYYYMMDD", "YYYY-MM-DD", "YYYY-MM-DD HH:mm", @@ -16,28 +20,25 @@ export class DateTypeValidator implements IValidator { format: Joi.string().optional(), }); - public validateSchema(args: DateInputArgs): boolean { + public validateSchema(args: DateInputArgs) { try { // validate arguments schema Joi.assert(args, this.argsValidator); - return true; } catch { - throw new Error('The arguments schema for date type is incorrect'); + throw new Error( + 'The arguments schema for "date" type validator is incorrect' + ); } } - validateData(value: string, args: DateInputArgs): boolean { - // close warning to prevent showing deprecation warning message - moment.suppressDeprecationWarnings = true; - let valid = moment(value).isValid(); + public validateData(value: string, args?: DateInputArgs) { + let valid = dayjs(value).isValid(); // if there are args passed if (!isUndefined(args)) { // validate date, support format validator if input field existed - valid = args.format ? moment(value, args.format, true).isValid() : valid; + valid = args.format ? dayjs(value, args.format, true).isValid() : valid; } - if (!valid) throw new Error('The input parameter is invalid, it should be date type'); - return true; } } diff --git a/packages/core/src/lib/validators/data-type-validators/integerTypeValidator.ts b/packages/core/src/lib/validators/data-type-validators/integerTypeValidator.ts index 8953f9ba..ce17eeaa 100644 --- a/packages/core/src/lib/validators/data-type-validators/integerTypeValidator.ts +++ b/packages/core/src/lib/validators/data-type-validators/integerTypeValidator.ts @@ -23,17 +23,18 @@ export class IntegerTypeValidator implements IValidator { less: Joi.number().integer().optional(), }); - validateSchema(args: IntInputArgs): boolean { + public validateSchema(args: IntInputArgs) { try { // validate arguments schema Joi.assert(args, this.argsValidator); - return true; } catch { - throw new Error('The arguments schema for integer type is incorrect'); + throw new Error( + 'The arguments schema for "integer" type validator is incorrect' + ); } } - validateData(value: string, args: IntInputArgs): boolean { + public validateData(value: string, args?: IntInputArgs) { // parse arguments // schema is integer type @@ -49,7 +50,6 @@ export class IntegerTypeValidator implements IValidator { } try { Joi.assert(value, schema); - return true; } catch { throw new Error( 'The input parameter is invalid, it should be integer type' diff --git a/packages/core/src/lib/validators/data-type-validators/stringTypeValidator.ts b/packages/core/src/lib/validators/data-type-validators/stringTypeValidator.ts index 6c7f76c9..636c8306 100644 --- a/packages/core/src/lib/validators/data-type-validators/stringTypeValidator.ts +++ b/packages/core/src/lib/validators/data-type-validators/stringTypeValidator.ts @@ -23,17 +23,18 @@ export class StringTypeValidator implements IValidator { max: Joi.number().optional(), }); - validateSchema(args: StringInputArgs): boolean { + public validateSchema(args: StringInputArgs) { try { // validate arguments schema Joi.assert(args, this.argsValidator); - return true; } catch { - throw new Error('The arguments schema for string type is incorrect'); + throw new Error( + 'The arguments schema for "string" type validator is incorrect' + ); } } - validateData(value: string, args: StringInputArgs): boolean { + public validateData(value: string, args?: StringInputArgs) { // schema is string type let schema = Joi.string(); @@ -49,7 +50,6 @@ export class StringTypeValidator implements IValidator { try { // validate data value Joi.assert(value, schema); - return true; } catch { throw new Error( 'The input parameter is invalid, it should be string type' diff --git a/packages/core/src/lib/validators/data-type-validators/uuidTypeValidator.ts b/packages/core/src/lib/validators/data-type-validators/uuidTypeValidator.ts index 4941b668..92e7e143 100644 --- a/packages/core/src/lib/validators/data-type-validators/uuidTypeValidator.ts +++ b/packages/core/src/lib/validators/data-type-validators/uuidTypeValidator.ts @@ -17,17 +17,18 @@ export class UUIDTypeValidator implements IValidator { version: Joi.string().optional(), }); - validateSchema(args: UUIDInputArgs): boolean { + validateSchema(args: UUIDInputArgs) { try { // validate arguments schema Joi.assert(args, this.argsValidator); - return true; } catch { - throw new Error('The arguments schema for uuid type is incorrect'); + throw new Error( + 'The arguments schema for "uuid" type validator is incorrect' + ); } } - validateData(value: string, args: UUIDInputArgs): boolean { + public validateData(value: string, args: UUIDInputArgs) { // schema is string type let schema = Joi.string().uuid(); @@ -44,7 +45,6 @@ export class UUIDTypeValidator implements IValidator { try { // validate data value Joi.assert(value, schema); - return true; } catch { throw new Error('The input parameter is invalid, it should be uuid type'); } diff --git a/packages/core/src/lib/validators/validator.ts b/packages/core/src/lib/validators/validator.ts index 073705ca..4881ded3 100644 --- a/packages/core/src/lib/validators/validator.ts +++ b/packages/core/src/lib/validators/validator.ts @@ -2,7 +2,7 @@ export default interface IValidator { // validator name readonly name: string; // validate Schema format - validateSchema(args: T): boolean; + validateSchema(args: T): void; // validate input value - validateData(value: string, args: T): boolean; + validateData(value: string, args?: T): void; } diff --git a/packages/core/src/test/validators/dataTypeValidator.spec.ts b/packages/core/test/validators/dataTypeValidator.spec.ts similarity index 93% rename from packages/core/src/test/validators/dataTypeValidator.spec.ts rename to packages/core/test/validators/dataTypeValidator.spec.ts index 20e23c3d..003c1a79 100644 --- a/packages/core/src/test/validators/dataTypeValidator.spec.ts +++ b/packages/core/test/validators/dataTypeValidator.spec.ts @@ -14,9 +14,8 @@ describe('Test "date" type validator', () => { // Act const validator = new DateTypeValidator(); const result = validator.validateSchema(args); - // Assert - expect(result).toBe(true); + expect(() => validator.validateSchema(args)).not.toThrow(); } ); @@ -53,10 +52,9 @@ describe('Test "date" type validator', () => { // Act const validator = new DateTypeValidator(); - const result = validator.validateData(data, args); // Assert - expect(result).toBe(true); + expect(() => validator.validateData(data, args)).not.toThrow(); } ); diff --git a/packages/core/src/test/validators/integerTypeValidator.spec.ts b/packages/core/test/validators/integerTypeValidator.spec.ts similarity index 93% rename from packages/core/src/test/validators/integerTypeValidator.spec.ts rename to packages/core/test/validators/integerTypeValidator.spec.ts index 8b9432f7..d4de01eb 100644 --- a/packages/core/src/test/validators/integerTypeValidator.spec.ts +++ b/packages/core/test/validators/integerTypeValidator.spec.ts @@ -27,10 +27,9 @@ describe('Test "integer" type validator', () => { const args = JSON.parse(inputArgs); // Act const validator = new IntegerTypeValidator(); - const result = validator.validateSchema(args); // Assert - expect(result).toBe(true); + expect(() => validator.validateSchema(args)).not.toThrow(); } ); @@ -68,10 +67,9 @@ describe('Test "integer" type validator', () => { const args = JSON.parse(inputArgs); // Act const validator = new IntegerTypeValidator(); - const result = validator.validateData(data, args); // Assert - expect(result).toBe(true); + expect(() => validator.validateData(data, args)).not.toThrow(); } ); it.each([ diff --git a/packages/core/src/test/validators/stringTypeValidator.spec.ts b/packages/core/test/validators/stringTypeValidator.spec.ts similarity index 92% rename from packages/core/src/test/validators/stringTypeValidator.spec.ts rename to packages/core/test/validators/stringTypeValidator.spec.ts index c42680d9..259a72c4 100644 --- a/packages/core/src/test/validators/stringTypeValidator.spec.ts +++ b/packages/core/test/validators/stringTypeValidator.spec.ts @@ -19,10 +19,9 @@ describe('Test "string" type validator', () => { const args = JSON.parse(inputArgs); // Act const validator = new StringTypeValidator(); - const result = validator.validateSchema(args); // Assert - expect(result).toBe(true); + expect(() => validator.validateSchema(args)).not.toThrow(); } ); @@ -57,10 +56,9 @@ describe('Test "string" type validator', () => { const args = JSON.parse(inputArgs); // Act const validator = new StringTypeValidator(); - const result = validator.validateData(data, args); // Assert - expect(result).toBe(true); + expect(() => validator.validateData(data, args)).not.toThrow(); } ); it.each([ diff --git a/packages/core/src/test/validators/uuidTypeValidator.spec.ts b/packages/core/test/validators/uuidTypeValidator.spec.ts similarity index 91% rename from packages/core/src/test/validators/uuidTypeValidator.spec.ts rename to packages/core/test/validators/uuidTypeValidator.spec.ts index 874915f6..19bc4a66 100644 --- a/packages/core/src/test/validators/uuidTypeValidator.spec.ts +++ b/packages/core/test/validators/uuidTypeValidator.spec.ts @@ -14,10 +14,9 @@ describe('Test "uuid" type validator ', () => { const args = JSON.parse(inputArgs); // Act const validator = new UUIDTypeValidator(); - const result = validator.validateSchema(args); // Assert - expect(result).toBe(true); + expect(() => validator.validateSchema(args)).not.toThrow(); } ); @@ -56,10 +55,9 @@ describe('Test "uuid" type validator ', () => { const args = JSON.parse(inputArgs); // Act const validator = new UUIDTypeValidator(); - const result = validator.validateData(data, args); // Assert - expect(result).toBe(true); + expect(() => validator.validateData(data, args)).not.toThrow(); } ); it.each([ diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 87e9baab..b8d88bce 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -8,7 +8,6 @@ "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "esModuleInterop": true, "typeRoots": ["../../node_modules/@types"], "paths": { "@artifact-builder/*": ["packages/core/src/lib/artifact-builder/*"], diff --git a/packages/core/yarn.lock b/packages/core/yarn.lock index 5303cc42..fb57ccd1 100644 --- a/packages/core/yarn.lock +++ b/packages/core/yarn.lock @@ -2,47 +2,3 @@ # yarn lockfile v1 -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" - integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -joi@^17.6.0: - version "17.6.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" - integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.0" - "@sideway/pinpoint" "^2.0.0" - -moment@^2.29.3: - version "2.29.3" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3" - integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw== diff --git a/packages/serve/package.json b/packages/serve/package.json index e2d4f385..480dbd13 100644 --- a/packages/serve/package.json +++ b/packages/serve/package.json @@ -2,16 +2,6 @@ "name": "@vulcan/serve", "version": "0.0.1", "type": "commonjs", - "dependencies": { - "koa": "^2.13.4", - "koa-bodyparser": "^4.3.0", - "koa-router": "^10.1.1" - }, - "devDependencies": { - "@types/koa": "^2.13.4", - "@types/koa-bodyparser": "^4.3.7", - "@types/koa-router": "^7.4.4", - "@types/supertest": "^2.0.12", - "supertest": "^6.2.3" - } + "dependencies": {}, + "devDependencies": {} } diff --git a/packages/serve/src/index.ts b/packages/serve/src/index.ts index d3659c89..92cf7c78 100644 --- a/packages/serve/src/index.ts +++ b/packages/serve/src/index.ts @@ -1,2 +1,2 @@ -export * from './lib/route-generator'; +export * from './lib/route'; export * from './lib/app'; diff --git a/packages/serve/src/lib/app.ts b/packages/serve/src/lib/app.ts index b4e4e521..73b8169f 100644 --- a/packages/serve/src/lib/app.ts +++ b/packages/serve/src/lib/app.ts @@ -1,12 +1,12 @@ import { Server } from 'http'; -import Koa from 'koa'; -import KoaRouter from 'koa-router'; +import * as Koa from 'koa'; +import * as KoaRouter from 'koa-router'; import { RestfulRoute, BaseRoute, APIProviderType, GraphQLRoute, -} from './route-generator'; +} from './route'; export type VulcanServer = Server; diff --git a/packages/serve/src/lib/route-generator/index.ts b/packages/serve/src/lib/route/index.ts similarity index 100% rename from packages/serve/src/lib/route-generator/index.ts rename to packages/serve/src/lib/route/index.ts diff --git a/packages/serve/src/lib/route-generator/route-component/baseRoute.ts b/packages/serve/src/lib/route/route-component/baseRoute.ts similarity index 100% rename from packages/serve/src/lib/route-generator/route-component/baseRoute.ts rename to packages/serve/src/lib/route/route-component/baseRoute.ts diff --git a/packages/serve/src/lib/route-generator/route-component/graphQLRoute.ts b/packages/serve/src/lib/route/route-component/graphQLRoute.ts similarity index 100% rename from packages/serve/src/lib/route-generator/route-component/graphQLRoute.ts rename to packages/serve/src/lib/route/route-component/graphQLRoute.ts diff --git a/packages/serve/src/lib/route-generator/route-component/index.ts b/packages/serve/src/lib/route/route-component/index.ts similarity index 100% rename from packages/serve/src/lib/route-generator/route-component/index.ts rename to packages/serve/src/lib/route/route-component/index.ts diff --git a/packages/serve/src/lib/route-generator/route-component/requestTransformer.ts b/packages/serve/src/lib/route/route-component/requestTransformer.ts similarity index 81% rename from packages/serve/src/lib/route-generator/route-component/requestTransformer.ts rename to packages/serve/src/lib/route/route-component/requestTransformer.ts index dfd9309d..54276c7f 100644 --- a/packages/serve/src/lib/route-generator/route-component/requestTransformer.ts +++ b/packages/serve/src/lib/route/route-component/requestTransformer.ts @@ -2,6 +2,7 @@ import { APISchema, FieldDataType, FieldInType, + normalizeStringValue, RequestSchema, } from '@vulcan/core'; import { assign } from 'lodash'; @@ -31,11 +32,14 @@ export class RequestTransformer implements IRequestTransformer { }; public static readonly convertTypeMapper: { - [type in FieldDataType]: (value: string) => any; + [type in FieldDataType]: (value: string, name: string) => any; } = { - [FieldDataType.NUMBER]: (value: string) => Number(value), - [FieldDataType.STRING]: (value: string) => String(value), - [FieldDataType.BOOLEAN]: (value: string) => Boolean(value), + [FieldDataType.NUMBER]: (value: string, name: string) => + normalizeStringValue(value, name, Number.name), + [FieldDataType.STRING]: (value: string, name: string) => + normalizeStringValue(value, name, String.name), + [FieldDataType.BOOLEAN]: (value: string, name: string) => + normalizeStringValue(value, name, Boolean.name), }; public async transform( @@ -74,7 +78,7 @@ export class RequestTransformer implements IRequestTransformer { if (!(type in FieldDataType)) throw new Error(`The ${type} type not been implemented now.`); - return RequestTransformer.convertTypeMapper[type](value); + return RequestTransformer.convertTypeMapper[type](value, name); } catch { throw new Error( `The value of field "${name}" not belong to ${type} type` diff --git a/packages/serve/src/lib/route-generator/route-component/requestValidator.ts b/packages/serve/src/lib/route/route-component/requestValidator.ts similarity index 100% rename from packages/serve/src/lib/route-generator/route-component/requestValidator.ts rename to packages/serve/src/lib/route/route-component/requestValidator.ts diff --git a/packages/serve/src/lib/route-generator/route-component/restfulRoute.ts b/packages/serve/src/lib/route/route-component/restfulRoute.ts similarity index 100% rename from packages/serve/src/lib/route-generator/route-component/restfulRoute.ts rename to packages/serve/src/lib/route/route-component/restfulRoute.ts diff --git a/packages/serve/src/lib/route-generator/routeGenerator.ts b/packages/serve/src/lib/route/routeGenerator.ts similarity index 100% rename from packages/serve/src/lib/route-generator/routeGenerator.ts rename to packages/serve/src/lib/route/routeGenerator.ts diff --git a/packages/serve/test/app.spec.ts b/packages/serve/test/app.spec.ts index c19511b1..7ebeffa1 100644 --- a/packages/serve/test/app.spec.ts +++ b/packages/serve/test/app.spec.ts @@ -1,8 +1,8 @@ import * as sinon from 'ts-sinon'; -import supertest from 'supertest'; +import * as supertest from 'supertest'; import faker from '@faker-js/faker'; import { Request } from 'koa'; -import KoaRouter from 'koa-router'; +import * as KoaRouter from 'koa-router'; import { VulcanApplication, VulcanServer } from '@app'; import { APISchema, @@ -19,7 +19,7 @@ import { RequestParameters, RequestTransformer, RequestValidator, -} from '@route-generator/.'; +} from '@route/.'; describe('Test vulcan server to call restful APIs', () => { let server: VulcanServer; @@ -212,8 +212,9 @@ describe('Test vulcan server to call restful APIs', () => { ctx, param.fieldName ); - expected[param.fieldName] = - RequestTransformer.convertTypeMapper[param.type](fieldValue); + expected[param.fieldName] = RequestTransformer.convertTypeMapper[ + param.type + ](fieldValue, param.fieldName); }); // Act diff --git a/packages/serve/test/route-generator/route-component/requestTransformer.spec.ts b/packages/serve/test/route/route-component/requestTransformer.spec.ts similarity index 94% rename from packages/serve/test/route-generator/route-component/requestTransformer.spec.ts rename to packages/serve/test/route/route-component/requestTransformer.spec.ts index bc870e96..f31d093f 100644 --- a/packages/serve/test/route-generator/route-component/requestTransformer.spec.ts +++ b/packages/serve/test/route/route-component/requestTransformer.spec.ts @@ -11,7 +11,7 @@ import { KoaRouterContext, RequestParameters, RequestTransformer, -} from '@route-generator/.'; +} from '@route/.'; describe('Test request transformer - transform successfully', () => { const fakeSchemas: Array = [ @@ -119,7 +119,7 @@ describe('Test request transformer - transform successfully', () => { request: { ...sinon.stubInterface(), query: { - sort: faker.datatype.string(), + sort: faker.helpers.arrayElement(['true', 'false']), }, }, }, @@ -140,8 +140,9 @@ describe('Test request transformer - transform successfully', () => { ctx, param.fieldName ); - expected[param.fieldName] = - RequestTransformer.convertTypeMapper[param.type](fieldValue); + expected[param.fieldName] = RequestTransformer.convertTypeMapper[ + param.type + ](fieldValue, param.fieldName); }); // Act const transformer = new RequestTransformer(); diff --git a/packages/serve/test/route-generator/route-component/requestValidator.spec.ts b/packages/serve/test/route/route-component/requestValidator.spec.ts similarity index 98% rename from packages/serve/test/route-generator/route-component/requestValidator.spec.ts rename to packages/serve/test/route/route-component/requestValidator.spec.ts index 618c305e..80bc3f65 100644 --- a/packages/serve/test/route-generator/route-component/requestValidator.spec.ts +++ b/packages/serve/test/route/route-component/requestValidator.spec.ts @@ -1,6 +1,6 @@ import * as sinon from 'ts-sinon'; import faker from '@faker-js/faker'; -import { RequestValidator, RequestParameters } from '@route-generator/.'; +import { RequestValidator, RequestParameters } from '@route/.'; import { APISchema, FieldDataType, diff --git a/packages/serve/test/route-generator/routeGenerator.spec.ts b/packages/serve/test/route/routeGenerator.spec.ts similarity index 98% rename from packages/serve/test/route-generator/routeGenerator.spec.ts rename to packages/serve/test/route/routeGenerator.spec.ts index a5b04f9c..762fa2a1 100644 --- a/packages/serve/test/route-generator/routeGenerator.spec.ts +++ b/packages/serve/test/route/routeGenerator.spec.ts @@ -8,7 +8,7 @@ import { IRequestValidator, RestfulRoute, RouteGenerator, -} from '@route-generator/.'; +} from '@route/.'; describe('Test route generator ', () => { let stubReqTransformer: sinon.StubbedInstance; diff --git a/packages/serve/tsconfig.json b/packages/serve/tsconfig.json index 8bb83d70..79bf16a9 100644 --- a/packages/serve/tsconfig.json +++ b/packages/serve/tsconfig.json @@ -8,11 +8,11 @@ "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "esModuleInterop": true, + "typeRoots": ["../../node_modules/@types"], "paths": { // specify vulcan/core package for link and make us could import by @vulcan/core "@vulcan/core": ["packages/core/src/index.ts"], - "@route-generator/*": ["packages/serve/src/lib/route-generator/*"], + "@route/*": ["packages/serve/src/lib/route/*"], "@app": ["packages/serve/src/lib/app.ts"] } }, diff --git a/packages/serve/tsconfig.lib.json b/packages/serve/tsconfig.lib.json index e85ef50f..1925baa1 100644 --- a/packages/serve/tsconfig.lib.json +++ b/packages/serve/tsconfig.lib.json @@ -5,6 +5,6 @@ "declaration": true, "types": [] }, - "include": ["**/*.ts"], + "include": ["**/*.ts", "../../types/*.d.ts"], "exclude": ["jest.config.ts", "**/*.spec.ts", "**/*.test.ts"] } diff --git a/packages/serve/tsconfig.spec.json b/packages/serve/tsconfig.spec.json index 546f1287..eb72f635 100644 --- a/packages/serve/tsconfig.spec.json +++ b/packages/serve/tsconfig.spec.json @@ -5,5 +5,11 @@ "module": "commonjs", "types": ["jest", "node"] }, - "include": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.d.ts", + "../../types/*.d.ts" + ] } diff --git a/packages/serve/yarn.lock b/packages/serve/yarn.lock index fb3f8543..fb57ccd1 100644 --- a/packages/serve/yarn.lock +++ b/packages/serve/yarn.lock @@ -2,731 +2,3 @@ # yarn lockfile v1 -"@types/accepts@*": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" - integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== - dependencies: - "@types/node" "*" - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/content-disposition@*": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.5.tgz#650820e95de346e1f84e30667d168c8fd25aa6e3" - integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA== - -"@types/cookiejar@*": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" - integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== - -"@types/cookies@*": - version "0.7.7" - resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" - integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== - dependencies: - "@types/connect" "*" - "@types/express" "*" - "@types/keygrip" "*" - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.18": - version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" - integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/http-assert@*": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" - integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== - -"@types/http-errors@*": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1" - integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w== - -"@types/keygrip@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" - integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== - -"@types/koa-bodyparser@^4.3.7": - version "4.3.7" - resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.3.7.tgz#3ac41f2dec9d97db7a6f798bbb2e2368be762714" - integrity sha512-21NhEp7LjZm4zbNV5alHHmrNY4J+S7B8lYTO6CzRL8ShTMnl20Gd14dRgVhAxraLaW5iZMofox+BycbuiDvj2Q== - dependencies: - "@types/koa" "*" - -"@types/koa-compose@*": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" - integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== - dependencies: - "@types/koa" "*" - -"@types/koa-router@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.4.4.tgz#db72bde3616365d74f00178d5f243c4fce7da572" - integrity sha512-3dHlZ6CkhgcWeF6wafEUvyyqjWYfKmev3vy1PtOmr0mBc3wpXPU5E8fBBd4YQo5bRpHPfmwC5yDaX7s4jhIN6A== - dependencies: - "@types/koa" "*" - -"@types/koa@*", "@types/koa@^2.13.4": - version "2.13.4" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" - integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== - dependencies: - "@types/accepts" "*" - "@types/content-disposition" "*" - "@types/cookies" "*" - "@types/http-assert" "*" - "@types/http-errors" "*" - "@types/keygrip" "*" - "@types/koa-compose" "*" - "@types/node" "*" - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/node@*": - version "17.0.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" - integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/superagent@*": - version "4.1.15" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.15.tgz#63297de457eba5e2bc502a7609426c4cceab434a" - integrity sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ== - dependencies: - "@types/cookiejar" "*" - "@types/node" "*" - -"@types/supertest@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" - integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== - dependencies: - "@types/superagent" "*" - -accepts@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -asap@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cache-content-type@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" - integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== - dependencies: - mime-types "^2.1.18" - ylru "^1.2.0" - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -co-body@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" - integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== - dependencies: - inflation "^2.0.0" - qs "^6.5.2" - raw-body "^2.3.3" - type-is "^1.6.16" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -component-emitter@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -content-disposition@~0.5.2: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookiejar@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== - -cookies@~0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" - integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== - dependencies: - depd "~2.0.0" - keygrip "~1.1.0" - -copy-to@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" - integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU= - -debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@2.0.0, depd@^2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -destroy@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -dezalgo@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= - dependencies: - asap "^2.0.0" - wrappy "1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -encodeurl@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -escape-html@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -fast-safe-stringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formidable@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff" - integrity sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ== - dependencies: - dezalgo "1.0.3" - hexoid "1.0.0" - once "1.4.0" - qs "6.9.3" - -fresh@~0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hexoid@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" - integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== - -http-assert@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" - integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== - dependencies: - deep-equal "~1.0.1" - http-errors "~1.8.0" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -inflation@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" - integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= - -inherits@2.0.4, inherits@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -keygrip@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" - integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== - dependencies: - tsscmp "1.0.6" - -koa-bodyparser@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a" - integrity sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw== - dependencies: - co-body "^6.0.0" - copy-to "^2.0.1" - -koa-compose@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" - integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== - -koa-convert@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" - integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== - dependencies: - co "^4.6.0" - koa-compose "^4.1.0" - -koa-router@^10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-10.1.1.tgz#20809f82648518b84726cd445037813cd99f17ff" - integrity sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ== - dependencies: - debug "^4.1.1" - http-errors "^1.7.3" - koa-compose "^4.1.0" - methods "^1.1.2" - path-to-regexp "^6.1.0" - -koa@^2.13.4: - version "2.13.4" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e" - integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g== - dependencies: - accepts "^1.3.5" - cache-content-type "^1.0.0" - content-disposition "~0.5.2" - content-type "^1.0.4" - cookies "~0.8.0" - debug "^4.3.2" - delegates "^1.0.0" - depd "^2.0.0" - destroy "^1.0.4" - encodeurl "^1.0.2" - escape-html "^1.0.3" - fresh "~0.5.2" - http-assert "^1.3.0" - http-errors "^1.6.3" - is-generator-function "^1.0.7" - koa-compose "^4.1.0" - koa-convert "^2.0.0" - on-finished "^2.3.0" - only "~0.0.2" - parseurl "^1.3.2" - statuses "^1.5.0" - type-is "^1.6.16" - vary "^1.1.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -methods@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - -on-finished@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -only@~0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" - integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= - -parseurl@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-to-regexp@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38" - integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg== - -qs@6.9.3: - version "6.9.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" - integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== - -qs@^6.10.3, qs@^6.5.2: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" - -raw-body@^2.3.3: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -safe-buffer@5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.5.0 < 2", statuses@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -superagent@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-7.1.3.tgz#783ff8330e7c2dad6ad8f0095edc772999273b6b" - integrity sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ== - dependencies: - component-emitter "^1.3.0" - cookiejar "^2.1.3" - debug "^4.3.4" - fast-safe-stringify "^2.1.1" - form-data "^4.0.0" - formidable "^2.0.1" - methods "^1.1.2" - mime "^2.5.0" - qs "^6.10.3" - readable-stream "^3.6.0" - semver "^7.3.7" - -supertest@^6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.2.3.tgz#291b220126e5faa654d12abe1ada3658757c8c67" - integrity sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g== - dependencies: - methods "^1.1.2" - superagent "^7.1.3" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tsscmp@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" - integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== - -type-is@^1.6.16: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -vary@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -ylru@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.3.2.tgz#0de48017473275a4cbdfc83a1eaf67c01af8a785" - integrity sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA== diff --git a/yarn.lock b/yarn.lock index b0ff33d2..af1cb8d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -367,6 +367,18 @@ resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-6.3.1.tgz#1ae963dd40405450a2945408cba553e1afa3e0fb" integrity sha512-8YXBE2ZcU/pImVOHX7MWrSR/X5up7t6rPWZlk34RwZEcdr3ua6X+32pSd6XuOQRN+vbuvYNfA6iey8NbrjuMFQ== +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@humanwhocodes/config-array@^0.9.2": version "0.9.5" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" @@ -748,6 +760,23 @@ dependencies: esquery "^1.0.1" +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -984,6 +1013,11 @@ resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8" integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== +"@types/cookiejar@*": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" + integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== + "@types/cookies@*": version "0.7.7" resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" @@ -1092,7 +1126,14 @@ dependencies: "@types/koa" "*" -"@types/koa@*": +"@types/koa-router@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.4.4.tgz#db72bde3616365d74f00178d5f243c4fce7da572" + integrity sha512-3dHlZ6CkhgcWeF6wafEUvyyqjWYfKmev3vy1PtOmr0mBc3wpXPU5E8fBBd4YQo5bRpHPfmwC5yDaX7s4jhIN6A== + dependencies: + "@types/koa" "*" + +"@types/koa@*", "@types/koa@^2.13.4": version "2.13.4" resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== @@ -1196,6 +1237,21 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/superagent@*": + version "4.1.15" + resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.15.tgz#63297de457eba5e2bc502a7609426c4cceab434a" + integrity sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ== + dependencies: + "@types/cookiejar" "*" + "@types/node" "*" + +"@types/supertest@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" + integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== + dependencies: + "@types/superagent" "*" + "@types/uuid@^8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" @@ -1310,6 +1366,14 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +accepts@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -1441,7 +1505,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -asap@^2.0.3: +asap@^2.0.0, asap@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -1611,11 +1675,32 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + cachedir@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.2.0.tgz#19afa4305e05d79e417566882e0c8f960f62ff0e" integrity sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ== +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1729,6 +1814,16 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +co-body@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" + integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== + dependencies: + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -1795,6 +1890,11 @@ commitizen@^4.0.3: strip-bom "4.0.0" strip-json-comments "3.0.1" +component-emitter@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1805,6 +1905,18 @@ confusing-browser-globals@^1.0.9: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== +content-disposition@~0.5.2: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + conventional-commit-types@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" @@ -1817,6 +1929,24 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +cookiejar@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== + +cookies@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" + integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== + dependencies: + depd "~2.0.0" + keygrip "~1.1.0" + +copy-to@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" + integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU= + cosmiconfig-typescript-loader@^1.0.0: version "1.0.9" resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz#69c523f7e8c3d9f27f563d02bbeadaf2f27212d3" @@ -1904,7 +2034,12 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3: +dayjs@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.2.tgz#fa0f5223ef0d6724b3d8327134890cfe3d72fbe5" + integrity sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw== + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1921,6 +2056,11 @@ dedent@0.7.0, dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -1941,6 +2081,26 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" @@ -1956,6 +2116,14 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +dezalgo@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= + dependencies: + asap "^2.0.0" + wrappy "1" + diff-sequences@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" @@ -1992,6 +2160,11 @@ dotenv@~10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + ejs@^3.1.5: version "3.1.7" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.7.tgz#c544d9c7f715783dd92f0bddcf73a59e6962d006" @@ -2014,6 +2187,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -2040,6 +2218,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -2272,6 +2455,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + fastq@^1.6.0: version "1.13.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" @@ -2379,6 +2567,30 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formidable@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff" + integrity sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ== + dependencies: + dezalgo "1.0.3" + hexoid "1.0.0" + once "1.4.0" + qs "6.9.3" + +fresh@~0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -2433,6 +2645,15 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -2564,6 +2785,18 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -2571,6 +2804,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hexoid@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" @@ -2590,6 +2828,36 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +http-assert@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" + integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== + dependencies: + deep-equal "~1.0.1" + http-errors "~1.8.0" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -2657,6 +2925,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +inflation@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" + integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2665,7 +2938,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2738,6 +3011,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -3249,6 +3529,17 @@ jest@27.5.1: import-local "^3.0.2" jest-cli "^27.5.1" +joi@^17.6.0: + version "17.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3360,16 +3651,79 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" + integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + dependencies: + tsscmp "1.0.6" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +koa-bodyparser@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a" + integrity sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw== + dependencies: + co-body "^6.0.0" + copy-to "^2.0.1" + koa-compose@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== +koa-convert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" + integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== + dependencies: + co "^4.6.0" + koa-compose "^4.1.0" + +koa-router@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-10.1.1.tgz#20809f82648518b84726cd445037813cd99f17ff" + integrity sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ== + dependencies: + debug "^4.1.1" + http-errors "^1.7.3" + koa-compose "^4.1.0" + methods "^1.1.2" + path-to-regexp "^6.1.0" + +koa@^2.13.4: + version "2.13.4" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e" + integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g== + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.8.0" + debug "^4.3.2" + delegates "^1.0.0" + depd "^2.0.0" + destroy "^1.0.4" + encodeurl "^1.0.2" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^2.0.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -3459,6 +3813,11 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -3474,6 +3833,11 @@ merge@^2.1.1: resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== +methods@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -3487,13 +3851,18 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12: +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -3550,6 +3919,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + nise@^4.0.4: version "4.1.0" resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6" @@ -3646,7 +4020,19 @@ nx@14.0.3: yargs "^17.4.0" yargs-parser "21.0.1" -once@^1.3.0, once@^1.4.0: +object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +on-finished@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@1.4.0, once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -3667,6 +4053,11 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +only@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= + open@^8.4.0: version "8.4.0" resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" @@ -3751,6 +4142,11 @@ parse5@6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parseurl@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -3778,6 +4174,11 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-to-regexp@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -3847,17 +4248,39 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +qs@6.9.3: + version "6.9.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" + integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== + +qs@^6.10.3, qs@^6.5.2: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +raw-body@^2.3.3: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -readable-stream@^3.1.1, readable-stream@^3.4.0: +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -3981,16 +4404,16 @@ rxjs@^6.4.0, rxjs@^6.5.4: dependencies: tslib "^1.9.0" +safe-buffer@5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -4010,7 +4433,7 @@ semver@7.3.4: dependencies: lru-cache "^6.0.0" -semver@7.x, semver@^7.3.2, semver@^7.3.5: +semver@7.x, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -4022,6 +4445,11 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4034,6 +4462,15 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -4104,6 +4541,16 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.5.0 < 2", statuses@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -4182,6 +4629,31 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +superagent@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-7.1.3.tgz#783ff8330e7c2dad6ad8f0095edc772999273b6b" + integrity sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.3" + debug "^4.3.4" + fast-safe-stringify "^2.1.1" + form-data "^4.0.0" + formidable "^2.0.1" + methods "^1.1.2" + mime "^2.5.0" + qs "^6.10.3" + readable-stream "^3.6.0" + semver "^7.3.7" + +supertest@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.2.3.tgz#291b220126e5faa654d12abe1ada3658757c8c67" + integrity sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g== + dependencies: + methods "^1.1.2" + superagent "^7.1.3" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -4295,6 +4767,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -4396,6 +4873,11 @@ tslib@^2.3.0, tslib@^2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -4432,6 +4914,14 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-is@^1.6.16: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -4454,6 +4944,11 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -4466,6 +4961,11 @@ util-deprecate@^1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache-lib@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" @@ -4485,6 +4985,11 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +vary@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -4646,6 +5151,11 @@ yargs@^17.4.0: y18n "^5.0.5" yargs-parser "^21.0.0" +ylru@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.3.2.tgz#0de48017473275a4cbdfc83a1eaf67c01af8a785" + integrity sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA== + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"