From ac132ad2f021faaa4005d2225a585a332bb86d87 Mon Sep 17 00:00:00 2001 From: cebgcontract <99630598+cebgcontract@users.noreply.github.com> Date: Tue, 18 Oct 2022 15:00:38 +0800 Subject: [PATCH] project init --- .env.development | 7 + .env.production | 6 + .eslintignore | 1 + .eslintrc.js | 14 + .gitignore | 5 + .prettierrc.js | 13 + package.json | 41 + pm2_dev.sh | 1 + src/api.server.ts | 177 +++ src/api.ts | 12 + src/clock/Clock.ts | 56 + src/clock/ClockTimer.ts | 50 + src/clock/Delayed.ts | 61 + src/clock/Schedule.ts | 73 + src/common/AsyncQueue.ts | 107 ++ src/common/Debug.ts | 6 + src/common/Extend.ts | 966 +++++++++++++ src/common/ZError.ts | 13 + src/common/base.controller.ts | 6 + src/config/config.ts | 29 + src/controllers/main.controllers.ts | 11 + src/decorators/dbconn.ts | 18 + src/decorators/nojson.ts | 29 + src/decorators/router.ts | 142 ++ src/decorators/singleton.ts | 29 + src/logger/logger.ts | 2 + src/plugins/apiauth.ts | 55 + src/plugins/zReqParser.ts | 37 + src/plugins/zTokenParser.ts | 73 + src/plugins/zrbac.ts | 26 + tsconfig.json | 22 + yarn.lock | 1976 +++++++++++++++++++++++++++ 32 files changed, 4064 insertions(+) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .prettierrc.js create mode 100644 package.json create mode 100755 pm2_dev.sh create mode 100644 src/api.server.ts create mode 100644 src/api.ts create mode 100644 src/clock/Clock.ts create mode 100644 src/clock/ClockTimer.ts create mode 100644 src/clock/Delayed.ts create mode 100644 src/clock/Schedule.ts create mode 100644 src/common/AsyncQueue.ts create mode 100644 src/common/Debug.ts create mode 100644 src/common/Extend.ts create mode 100644 src/common/ZError.ts create mode 100644 src/common/base.controller.ts create mode 100644 src/config/config.ts create mode 100644 src/controllers/main.controllers.ts create mode 100644 src/decorators/dbconn.ts create mode 100644 src/decorators/nojson.ts create mode 100644 src/decorators/router.ts create mode 100644 src/decorators/singleton.ts create mode 100644 src/logger/logger.ts create mode 100644 src/plugins/apiauth.ts create mode 100644 src/plugins/zReqParser.ts create mode 100644 src/plugins/zTokenParser.ts create mode 100644 src/plugins/zrbac.ts create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..7eda8d1 --- /dev/null +++ b/.env.development @@ -0,0 +1,7 @@ +API_PORT=3006 +API_HOST=127.0.0.1 +API_TOKEN_SECRET=sdf(**&*&xx2213 +API_TOKEN_EXPIRESIN=1d + + +DB_MAIN=mongodb://localhost/wallet-development \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..abf4611 --- /dev/null +++ b/.env.production @@ -0,0 +1,6 @@ +API_PORT=3001 +API_HOST=127.0.0.1 +API_TOKEN_SECRET=sdf(**&*&xx2214 +API_TOKEN_EXPIRESIN=1d + +DB_MAIN=mongodb://localhost/wallet-production \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..5f98501 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +dist/*.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..ec6ee13 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,14 @@ +/** @format */ + +module.exports = { + parser: '@typescript-eslint/parser', //定义ESLint的解析器 + extends: [ + 'plugin:prettier/recommended', // 使用prettier中的样式规范,且如果使得ESLint会检测prettier的格式问题,同样将格式问题以error的形式抛出 + ], + parserOptions: {ecmaVersion: 2019, sourceType: 'module'}, + env: { + //指定代码的运行环境 + browser: true, + node: true, + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..391972d --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea +node_modules +build +dist +.DS_Store diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..1e80711 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,13 @@ +module.exports = { + "printWidth": 120, + "semi": false, // 在语句末尾添加分号 + "singleQuote": true, // 使用单引号而非双引号 + "trailingComma": "all", // 在任何可能的多行中输入尾逗号 + "bracketSpacing": true, // 在对象字面量声明所使用的的花括号前后({})输出空格 + "jsxBracketSameLine": true, // 在多行JSX元素最后一行的末尾添加 > 而使 > 单独一行(不适用于自闭和元素) + "arrowParens": "avoid", // 为单行箭头函数的参数添加圆括号。 + "requirePragma": false, // Prettier可以严格按照按照文件顶部的一些特殊的注释格式化代码 + "insertPragma": false, // 顶部插入一个 @format + "tabWidth": 2, + "useTabs": false, +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..f8d6c36 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "wallet-svr", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev:api": "ts-node -r tsconfig-paths/register src/api.ts", + "prod:api": "NODE_PATH=./dist node dist/api.js", + "lint": "eslint --ext .ts src/**", + "format": "eslint --ext .ts src/** --fix" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@fastify/cors": "^8.1.0", + "@fastify/formbody": "^7.3.0", + "@fastify/helmet": "^10.0.1", + "@fastify/jwt": "^6.3.2", + "@typegoose/typegoose": "^9.12.1", + "axios": "^1.1.3", + "dotenv": "^16.0.3", + "fastify": "^4.8.1", + "fastify-plugin": "^4.2.1", + "mongoose": "^6.6.5", + "mongoose-findorcreate": "^3.0.0", + "tracer": "^1.1.6" + }, + "devDependencies": { + "@types/dotenv": "^8.2.0", + "@typescript-eslint/eslint-plugin": "^5.40.1", + "@typescript-eslint/parser": "^5.40.1", + "eslint": "^8.25.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "prettier": "^2.7.1", + "ts-node": "^10.9.1", + "ts-node-dev": "^2.0.0", + "tsconfig-paths": "^4.1.0", + "typescript": "^4.8.4" + } +} diff --git a/pm2_dev.sh b/pm2_dev.sh new file mode 100755 index 0000000..dd7d5e4 --- /dev/null +++ b/pm2_dev.sh @@ -0,0 +1 @@ +pm2 start npm --name "wallet-svr" --log-date-format "YYYY-MM-DD HH:mm:ss" -- run "dev:api" diff --git a/src/api.server.ts b/src/api.server.ts new file mode 100644 index 0000000..7c23a87 --- /dev/null +++ b/src/api.server.ts @@ -0,0 +1,177 @@ +import fastify, { + FastifyError, + FastifyInstance, + FastifyReply, + FastifyRequest, +} from "fastify"; +import helmet from "@fastify/helmet"; +import { IncomingMessage, Server, ServerResponse } from "http"; +import { RouterMap } from "decorators/router"; +import { mongoose } from "@typegoose/typegoose"; +import logger from "logger/logger"; +import config from "config/config"; + +const zReqParserPlugin = require("plugins/zReqParser"); + +const zTokenParserPlugin = require("plugins/zTokenParser"); + +const apiAuthPlugin = require("plugins/apiauth"); + +const fs = require("fs"); +const join = require("path").join; + +require("./common/Extend"); + +export class ApiServer { + server: FastifyInstance; + + public constructor() { + this.server = fastify({ logger: true, trustProxy: true }); + this.registerPlugins(); + } + private registerPlugins() { + this.server.register(require("@fastify/formbody")); + this.server.register(zReqParserPlugin); + this.server.register(helmet, { hidePoweredBy: false }); + this.server.register(zTokenParserPlugin); + + this.server.register(apiAuthPlugin, { + secret: config.api.token_secret, + expiresIn: config.api.token_expiresIn, + }); + + this.server.register(require("@fastify/cors"), {}); + } + + private registerRouter() { + logger.log("register api routers"); + let self = this; + for (let [controller, config] of RouterMap.decoratedRouters) { + for (let data of config.data) { + logger.info( + "add router", + data.method || "all", + data.path, + `${data.target.constructor.name}.${controller.name}()` + ); + // @ts-ignore + self.server[data.method || "all"]( + data.path, + { + preValidation: async function ( + request: FastifyRequest, + reply: FastifyReply + ) { + request.roles = config.roles; + await this.apiAuth(request, reply); + }, + }, + controller + ); + } + } + } + /** + * 加载所有的controller + */ + initControllers() { + logger.info("Bootstrap controllers..."); + const controllers = join(__dirname, "./controllers"); + fs.readdirSync(controllers) + .filter((file: string) => ~file.search(/^[^.].*\.(ts|js)$/)) + .forEach((file: any) => { + // logger.log(file); + return require(join(controllers, file)); + }); + } + async connectDB() { + const options = { + useNewUrlParser: true, + poolSize: 5, + keepAlive: true, + keepAliveInitialDelay: 300000, + useUnifiedTopology: true, + }; + const uri = config.db_main; + logger.info(`connect to ${uri} ...`); + try { + // await mongoose.createConnection(uri, options) + await mongoose.connect(uri, options); + logger.log("DB Connected"); + } catch (err) { + logger.log(`DB Connection Error: ${err.message}`); + } + } + private setErrHandler() { + this.server.setNotFoundHandler(function ( + request: any, + reply: { send: (arg0: { errcode: number; errmsg: string }) => void } + ) { + reply.send({ errcode: 404, errmsg: "page not found" }); + }); + this.server.setErrorHandler(function ( + error: FastifyError, + request: FastifyRequest, + reply: FastifyReply + ) { + let statusCode = (error && error.statusCode) || 100; + if (statusCode >= 500) { + logger.error(error); + } else if (statusCode >= 400) { + logger.info(error); + } else { + logger.error(error); + } + reply.code(200).send({ + errcode: statusCode, + errmsg: error ? error.message : "unknown error", + }); + }); + } + /** + * 格式化接口返回数据, 统一封装成如下格式 + * { + * code: 0, + * msg?: '', + * data: any + * } + * @private + */ + private setFormatSend() { + this.server.addHook( + "preSerialization", + async (request: FastifyRequest, reply: FastifyReply, payload) => { + reply.header("X-Powered-By", "PHP/5.4.16"); + // @ts-ignore + if (!payload.errcode) { + payload = { + errcode: 0, + data: payload, + }; + } + return payload; + } + ); + } + public async start() { + let self = this; + return new Promise(async (resolve, reject) => { + await self.connectDB(); + self.initControllers(); + self.registerRouter(); + self.setErrHandler(); + self.setFormatSend(); + // new Schedule().start(); + this.server.listen( + { port: config.api.port }, + (err: any, address: any) => { + if (err) { + logger.log(err); + process.exit(0); + } + resolve && resolve(address); + } + ); + }); + } +} diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 0000000..af26fb7 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,12 @@ +import { ApiServer } from "api.server"; +import logger from "./logger/logger"; + +class Server extends ApiServer { + constructor() { + super(); + } +} +let server = new Server(); +server.start().then((address) => { + logger.log(`Api Server listening at ${address}`); +}); diff --git a/src/clock/Clock.ts b/src/clock/Clock.ts new file mode 100644 index 0000000..4905226 --- /dev/null +++ b/src/clock/Clock.ts @@ -0,0 +1,56 @@ +export class Clock { + public running: boolean = false + public paused: boolean = false + + public deltaTime: number + public currentTime: number + public elapsedTime: number + + protected now: Function = + (typeof window !== 'undefined' && + window.performance && + window.performance.now && + window.performance.now.bind(window.performance)) || + Date.now + protected _interval + + constructor(useInterval: boolean = true) { + this.start(useInterval) + } + + start(useInterval: boolean = true) { + this.deltaTime = 0 + this.currentTime = this.now() + this.elapsedTime = 0 + this.running = true + + if (useInterval) { + // auto set interval to 60 ticks per second + this._interval = setInterval(this.tick.bind(this), 1000 / 60) + } + } + + stop() { + this.running = false + + if (this._interval) { + clearInterval(this._interval) + } + } + + tick(newTime = this.now()) { + if (!this.paused) { + this.deltaTime = newTime - this.currentTime + this.elapsedTime += this.deltaTime + } + this.currentTime = newTime + } + + pause() { + this.paused = true + } + + resume() { + this.paused = false + } +} diff --git a/src/clock/ClockTimer.ts b/src/clock/ClockTimer.ts new file mode 100644 index 0000000..cdfbe2e --- /dev/null +++ b/src/clock/ClockTimer.ts @@ -0,0 +1,50 @@ +import { Delayed, Type } from './Delayed' +import { Clock } from './Clock' + +export default class ClockTimer extends Clock { + delayed: Delayed[] = [] + + constructor(autoStart: boolean = false) { + super(autoStart) + } + + tick() { + super.tick() + if (this.paused) { + return + } + let delayedList = this.delayed + let i = delayedList.length + + while (i--) { + const delayed = delayedList[i] + + if (delayed.active) { + delayed.tick(this.deltaTime) + } else { + delayedList.splice(i, 1) + continue + } + } + } + + setInterval(handler: Function, time: number, ...args: any[]) { + let delayed = new Delayed(handler, args, time, Type.Interval) + this.delayed.push(delayed) + return delayed + } + + setTimeout(handler: Function, time: number, ...args: any[]) { + let delayed = new Delayed(handler, args, time, Type.Timeout) + this.delayed.push(delayed) + return delayed + } + + clear() { + let i = this.delayed.length + while (i--) { + this.delayed[i].clear() + } + this.delayed = [] + } +} diff --git a/src/clock/Delayed.ts b/src/clock/Delayed.ts new file mode 100644 index 0000000..6fa0feb --- /dev/null +++ b/src/clock/Delayed.ts @@ -0,0 +1,61 @@ +export enum Type { + Interval, + Timeout, +} + +export class Delayed { + public active: boolean = true + public paused: boolean = false + + public time: number + public elapsedTime: number = 0 + + protected handler: Function + protected args: any + protected type: number + + constructor(handler: Function, args: any, time: number, type: number) { + this.handler = handler + this.args = args + this.time = time + this.type = type + } + + tick(deltaTime: number) { + if (this.paused) { + return + } + + this.elapsedTime += deltaTime + + if (this.elapsedTime >= this.time) { + this.execute() + } + } + + execute() { + this.handler.apply(this, this.args) + + if (this.type === Type.Timeout) { + this.active = false + } else { + this.elapsedTime -= this.time + } + } + + reset() { + this.elapsedTime = 0 + } + + pause() { + this.paused = true + } + + resume() { + this.paused = false + } + + clear() { + this.active = false + } +} diff --git a/src/clock/Schedule.ts b/src/clock/Schedule.ts new file mode 100644 index 0000000..5b9466f --- /dev/null +++ b/src/clock/Schedule.ts @@ -0,0 +1,73 @@ +import { singleton } from '../decorators/singleton' +import Clock from './ClockTimer' +import { Delayed } from './Delayed' + +/** + * 全局定时器 + */ +@singleton +export class Schedule { + clock: Clock = new Clock() + gameClock: Map = new Map() + + public start() { + this.clock.start() + } + + beginSchedule(millisecond: number, handler: Function, name: string): void { + if (this.gameClock.has(name) && this.gameClock.get(name)?.active) { + console.log(`当前已存在进行中的clock: ${name}`) + this.gameClock.get(name).clear() + this.gameClock.delete(name) + } + let timeOverFun = function () { + handler && handler() + } + this.gameClock.set(name, this.clock.setTimeout(timeOverFun, millisecond, name)) + } + + /** + * 取消某个计时器 + */ + stopSchedule(name: string): number { + console.log(`manual stop schedule: ${name}`) + if (!this.gameClock.has(name)) { + return -1 + } + let clock = this.gameClock.get(name) + if (!clock.active) { + this.gameClock.delete(name) + return -1 + } + let time = clock.elapsedTime + clock.clear() + this.gameClock.delete(name) + return time + } + + /** + * 判断某个定时器是否active + * @param {string} name + * @return {boolean} + */ + scheduleActive(name: string): boolean { + return this.gameClock.has(name) && this.gameClock.get(name).active + } + + /** + * 获取某个计时器剩余时间 + * @param {string} name + * @return {number} + */ + getLeftTime(name: string) { + if (!this.gameClock.has(name)) { + return 0 + } + let clock = this.gameClock.get(name) + if (!clock.active) { + this.gameClock.delete(name) + return 0 + } + return clock.time - clock.elapsedTime + } +} diff --git a/src/common/AsyncQueue.ts b/src/common/AsyncQueue.ts new file mode 100644 index 0000000..792c27e --- /dev/null +++ b/src/common/AsyncQueue.ts @@ -0,0 +1,107 @@ +type Callback = () => Promise + +export type AsyncQueue = { + push: (task: Callback) => Promise + flush: () => Promise + size: number +} + +/** + * Ensures that each callback pushed onto the queue is executed in series. + * Such a quetie 😻 + * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple + * tasks are pushed onto the queue while there is an active task, only the + * last one will be executed, once the active task has completed. + * e.g. in the below example, only 0 and 3 will be executed. + * ``` + * const queue = createAsyncQueue({ dedupeConcurrent: true }) + * queue.push(async () => console.log(0)) // returns 0 + * queue.push(async () => console.log(1)) // returns 3 + * queue.push(async () => console.log(2)) // returns 3 + * queue.push(async () => console.log(3)) // returns 3 + * ``` + * */ +export function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue { + const { dedupeConcurrent } = opts + let queue: Callback[] = [] + let running: Promise | undefined + let nextPromise = new DeferredPromise() + const push = (task: Callback) => { + let taskPromise = new DeferredPromise() + if (dedupeConcurrent) { + queue = [] + if (nextPromise.started) nextPromise = new DeferredPromise() + taskPromise = nextPromise + } + queue.push(() => { + taskPromise.started = true + task().then(taskPromise.resolve).catch(taskPromise.reject) + return taskPromise.promise + }) + if (!running) running = start() + return taskPromise.promise + } + const start = async () => { + while (queue.length) { + const task = queue.shift()! + await task().catch(() => {}) + } + running = undefined + } + return { + push, + flush: () => running || Promise.resolve(), + get size() { + return queue.length + }, + } +} + +export const createAsyncQueues = (opts = { dedupeConcurrent: false }) => { + const queues: { [queueId: string]: AsyncQueue } = {} + const push = (queueId: string, task: Callback) => { + if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts) + return queues[queueId].push(task) + } + const flush = (queueId: string) => { + if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts) + return queues[queueId].flush() + } + return { push, flush } +} + +class DeferredPromise { + started = false + resolve: (x: T | PromiseLike) => void = () => {} + reject: (x: E) => void = () => {} + promise: Promise + + constructor() { + this.promise = new Promise((res, rej) => { + this.resolve = res + this.reject = rej + }) + } +} + +// function main() { +// const queue = createAsyncQueue() +// queue.push(async () => { +// console.log(0) +// }) // returns 0 +// queue.push(async () => { +// console.log(1) + +// return new Promise((resolve, reject) => { +// setTimeout(() => { +// console.log('12') +// resolve() +// }, 1000) +// }) +// }) // returns 3 +// queue.push(async () => console.log(2)) // returns 3 +// queue.push(async () => console.log(3)) // returns 3 +// console.log('hi') +// } + +// main() diff --git a/src/common/Debug.ts b/src/common/Debug.ts new file mode 100644 index 0000000..ca8801c --- /dev/null +++ b/src/common/Debug.ts @@ -0,0 +1,6 @@ +import debug from 'debug' + +debug.log = console.info.bind(console) + +export const error = debug('chain:error') +error.log = console.error.bind(console) diff --git a/src/common/Extend.ts b/src/common/Extend.ts new file mode 100644 index 0000000..dfe36b5 --- /dev/null +++ b/src/common/Extend.ts @@ -0,0 +1,966 @@ +/** + * 对数字进行补0操作 + * @param value 要补0的数值 + * @param length 要补的总长度 + * @return 补0之后的字符串 + */ +function zeroize(value: number | string, length: number = 2): string { + let str = '' + value + let zeros = '' + for (let i = 0, len = length - str.length; i < len; i++) { + zeros += '0' + } + return zeros + str +} + +/****************************************扩展Object****************************************/ +interface Object { + /** + * 返回一个浅副本的对象 + * 此对象会拷贝key value + * + * @memberOf Object + */ + clone?(): Object + + /** + * 将数据拷贝到 to + * @param to 目标 + */ + copyto?(to: Object): void + + /** + * 获取指定属性的描述,会查找当前数据和原型数据 + * @param property 指定的属性名字 + */ + getPropertyDescriptor?(property: string): PropertyDescriptor + + zssign?(target: any): any +} + +Object.defineProperties(Object.prototype, { + clone: { + value: function () { + let o = {} + for (let n in this) { + // @ts-ignore + o[n] = this[n] + } + return o + }, + writable: true, + }, + getPropertyDescriptor: { + value: function (property: string): any { + let data = Object.getOwnPropertyDescriptor(this, property) + if (data) { + return data + } + let prototype = Object.getPrototypeOf(this) + if (prototype) { + return prototype.getPropertyDescriptor(property) + } + return + }, + writable: true, + }, + copyto: { + value: function (to: Object) { + for (let p in this) { + if (!(p in to)) { + // 本身没有这个属性 + // @ts-ignore + to[p] = this[p] + } else { + let data: PropertyDescriptor = to.getPropertyDescriptor(p) + if (data) { + if (data.set || data.writable) { + // 可进行赋值 + // @ts-ignore + to[p] = this[p] + } + } + } + } + }, + writable: true, + }, + zssign: { + value: function (target: Object) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object') + } + + let output = Object(target) + for (let nextKey in this) { + if (!(nextKey in output)) { + // 本身没有这个属性 + output[nextKey] = this[nextKey] + } + // else { + // let data: PropertyDescriptor = output.getPropertyDescriptor(nextKey); + // if (data) { + // if (data.set || data.writable) {// 可进行赋值 + // output[nextKey] = this[nextKey]; + // } + // } + // } + } + return output + }, + writable: true, + }, +}) + +/****************************************扩展Math****************************************/ +interface Math { + /** + * 角度转弧度的乘数 + * Math.PI / 180 + * @type {number} + * @memberOf Math + */ + DEG_TO_RAD: number + /** + * 弧度转角度的乘数 + * 180 / Math.PI + */ + RAD_TO_DEG: number + /** + * 整圆的弧度 + */ + PI2: number + /** + * 90°的弧度 + * + * @type {number} + * @memberOf Math + */ + PI_1_2: number + + /** + * 让数值处于指定的最大值和最小值之间,低于最小值取最小值,高于最大值取最大值 + * @param value 要处理的数值 + * @param min 最小值 + * @param max 最大值 + */ + clamp?(value: number, min: number, max: number): number + + /** + * 从最小值到最大值之间随机[min,max) + */ + random2?(min: number, max: number): number +} + +Math.DEG_TO_RAD = Math.PI / 180 + +Math.RAD_TO_DEG = 180 / Math.PI + +Math.PI2 = 2 * Math.PI + +Math.PI_1_2 = Math.PI * 0.5 + +Math.clamp = (value, min, max) => { + if (value < min) { + value = min + } + if (value > max) { + value = max + } + return value +} + +Math.random2 = (min, max) => { + return min + Math.random() * (max - min) +} + +/****************************************扩展Number********************************************/ +interface Number { + /** + * 对数字进行补0操作 + * @param length 要补的总长度 + * @return 补0之后的字符串 + */ + zeroize?(length: number): string + + /** + * 数值介于,`min` `max`直接,包含min,max + * 即:[min,max] + * + * @param {number} min + * @param {number} max + * @returns {boolean} + */ + between?(min: number, max: number): boolean +} + +Object.defineProperties(Number.prototype, { + zeroize: { + value: function (this: number, length: number) { + return zeroize(this, length) + }, + writable: true, + }, + between: { + value: function (this: number, min: number, max: number) { + return min <= this && max >= this + }, + writable: true, + }, +}) + +/****************************************扩展String****************************************/ +interface String { + /** + * 替换字符串中{0}{1}{2}{a} {b}这样的数据,用obj对应key替换,或者是数组中对应key的数据替换 + */ + substitute?(args: any[]): string + + /** + * 对数字进行补0操作 + * @param length 要补的总长度 + * @return 补0之后的字符串 + */ + zeroize?(length: number): string + + /** + * 将一个字符串转换成一个很小几率重复的数值 + * 此方法hash的字符串并不一定唯一,慎用 + */ + hash?(): number + + /** + * 获取字符串长度,中文方块字符算两个长度 + */ + trueLength?(): number + + /** + * 中文字符个数 + * */ + cnLength?(): number + + /** + * 比较版本号 + * */ + versionCompare?(target: string): number +} + +Object.defineProperties(String.prototype, { + zeroize: { + value: function (length: number) { + return zeroize(this, length) + }, + writable: true, + }, + substitute: { + value: function (this: string) { + let len = arguments.length + if (len > 0) { + let obj: IArguments + if (len == 1) { + obj = arguments[0] + if (typeof obj !== 'object') { + obj = arguments + } + } else { + obj = arguments + } + if (obj instanceof Object && !(obj instanceof RegExp)) { + return this.replace(/\{(?:%([^{}]+)%)?([^{}]+)\}/g, function (match: string, handler: string, key: string) { + //检查key中,是否为%开头,如果是,则尝试按方法处理 + // @ts-ignore + let value = obj[key] + if (handler) { + //如果有处理器,拆分处理器 + let func = String.subHandler[handler] + if (func) { + value = func(value) + } + } + return value !== undefined ? '' + value : match + }) + } + } + return this.toString() //防止生成String对象,ios反射String对象会当成一个NSDictionary处理 + }, + writable: true, + }, + hash: { + value: function () { + let len = this.length + let hash = 5381 + for (let i = 0; i < len; i++) { + hash += (hash << 5) + this.charCodeAt(i) + } + return hash & 0x7fffffff + }, + writable: true, + }, + trueLength: { + value: function () { + let arr: string[] = this.match(/[^x00-xff]/gi) + return this.length + (arr ? arr.length : 0) + }, + writable: true, + }, + cnLength: { + value: function () { + // /[\u2E80-\u9FBF] + let arr: string[] = this.match(/[^x00-xff]/gi) + return arr ? arr.length : 0 + }, + writable: true, + }, + versionCompare: { + value: function (target: string): number { + const GTR = 1 //大于 + const LSS = -1 //小于 + const EQU = 0 //等于 + if (!target) { + return GTR + } + let v1arr = String(this) + .split('.') + .map(function (a) { + return parseInt(a) + }) + let v2arr = String(target) + .split('.') + .map(function (a) { + return parseInt(a) + }) + let arrLen = Math.max(v1arr.length, v2arr.length) + let result + + //排除错误调用 + if (this == undefined || target == undefined) { + throw new Error() + } + + //检查空字符串,任何非空字符串都大于空字符串 + if (this.length == 0 && target.length == 0) { + return EQU + } else if (this.length == 0) { + return LSS + } else if (target.length == 0) { + return GTR + } + //循环比较版本号 + for (let i = 0; i < arrLen; i++) { + result = versionComp(v1arr[i], v2arr[i]) + if (result == EQU) { + continue + } else { + break + } + } + return result + + function versionComp(n1: number, n2: number) { + if (typeof n1 != 'number') { + n1 = 0 + } + if (typeof n2 != 'number') { + n2 = 0 + } + if (n1 > n2) { + return GTR + } else if (n1 < n2) { + return LSS + } else { + return EQU + } + } + }, + writable: true, + }, +}) + +interface StringConstructor { + /** + * 对数字进行补0操作 + * @param value 要补0的数值 + * @param length 要补的总长度 + * @return 补0之后的字符串 + */ + zeroize?: (value: number, length: number) => string + + /** + * substitute的回调函数 + * + * @type {Readonly<{ [index: string]: { (input: any): string } }>} + * @memberOf StringConstructor + */ + subHandler?: Readonly<{ [index: string]: { (input: any): string } }> +} + +String.zeroize = zeroize + +/****************************************扩展Date****************************************/ + +interface Date { + /** + * 格式化日期 + * + * @param {string} mask 时间字符串 + * @param {boolean} [local] 是否基于本地时间显示,目前项目,除了报错信息,其他时间都用UTC时间显示 + * @returns {string} 格式化后的时间 + */ + format(mask: string, local?: boolean): string + + /** + * 增加n天 + * @param {number} days + * @return {Date} + */ + addDays(days: number): Date +} + +Object.defineProperties(Date.prototype, { + format: { + value: function (mask: string, local?: boolean) { + let d: Date = this + // @ts-ignore + return mask.replace(/"[^"]*"|'[^']*'|(?:d{1,2}|m{1,2}|yy(?:yy)?|([hHMs])\1?)/g, function ($0: string) { + switch ($0) { + case 'd': + return gd() + case 'dd': + return zeroize(gd()) + case 'M': + return gM() + 1 + case 'MM': + return zeroize(gM() + 1) + case 'yy': + return (gy() + '').substr(2) + case 'yyyy': + return gy() + case 'h': + return gH() % 12 || 12 + case 'hh': + return zeroize(gH() % 12 || 12) + case 'H': + return gH() + case 'HH': + return zeroize(gH()) + case 'm': + return gm() + case 'mm': + return zeroize(gm()) + case 's': + return gs() + case 'ss': + return zeroize(gs()) + default: + return $0.substr(1, $0.length - 2) + } + }) + + function gd() { + return local ? d.getDate() : d.getUTCDate() + } + + function gM() { + return local ? d.getMonth() : d.getUTCMonth() + } + + function gy() { + return local ? d.getFullYear() : d.getUTCFullYear() + } + + function gH() { + return local ? d.getHours() : d.getUTCHours() + } + + function gm() { + return local ? d.getMinutes() : d.getUTCMinutes() + } + + function gs() { + return local ? d.getSeconds() : d.getUTCSeconds() + } + }, + writable: true, + }, + + addDays: { + value: function (days: number) { + this.setDate(this.getDate() + days) + return this + }, + writable: true, + }, +}) + +/****************************************扩展Array****************************************/ +const enum ArraySort { + /** + * 升序 + */ + ASC = 0, + /** + * 降序 + */ + DESC = 1, +} + +interface ArrayConstructor { + // binaryInsert(partArr: T[], item: T, filter: { (tester: T, ...args): boolean }, ...args); + SORT_DEFAULT: { number: 0; string: ''; boolean: false } +} + +/** + * 用于对Array排序时,处理undefined + */ +Array.SORT_DEFAULT = { + number: 0, + string: '', + boolean: false, +} +Object.freeze(Array.SORT_DEFAULT) + +interface Array { + /** + * 如果数组中没有要放入的对象,则将对象放入数组 + * + * @param {T} t 要放入的对象 + * @returns {number} 放入的对象,在数组中的索引 + * + * @member Array + */ + pushOnce?(t: T): number + + /** + * + * 删除某个数据 + * @param {T} t + * @returns {boolean} true 有这个数据并且删除成功 + * false 没有这个数据 + */ + zremove?(t: T): boolean + + /** + * 排序 支持多重排序 + * 降序, 升序 + * @param {(keyof T)[]} kArr 参数属性列表 + * @param {(boolean[] | ArraySort[])} [dArr] 是否降序,默认升序 + * @returns {this} + * + * @member Array + */ + multiSort?(kArr: (keyof T)[], dArr?: boolean[] | ArraySort[]): this + + /** + * 默认排序 + * + * @param {string} [key] + * @param {boolean} [descend] + * + * @member Array + */ + doSort?(key?: keyof T, descend?: boolean | ArraySort): this + + doSort?(descend?: boolean | ArraySort, key?: keyof T): this + + /** + * 将数组克隆到to + * to的数组长度会和当前数组一致 + * + * @template T + * @param {Array} to + */ + cloneTo?(to: Array): void + + /** + * 将数组附加到to中 + * + * @template T + * @param {Array} to + * + * @member ArrayConstructor + */ + appendTo?(to: Array): void + + /** + * 移除数组index位置的元素, 比slice效率高 + * @param index + */ + spliceOne?(index: number): boolean + + /** + * 随机排序 + */ + randomSort?(): void + + /** + * 检查数组中是否含有另外一个object + * @param obj 与数组同类型的obj | 同类型的数组 | 指定child字段的值 | 指定child字段的数组 + * @param child 比较字段 + */ + contains?(obj: T | T[] | {} | {}[], child?: string): boolean + + /** + * 将数组随机插入当前数组中 + * @param arr + */ + randomInsert?(arr: Array): void + + /** + * 随机获取n个元素 + * @param count + */ + randomGet?(count?: number): T[] + + /** + * 随机获取1个元素 + */ + randomOne?(): T + + /** + * 随机移除n个元素 + * @param count + */ + randomRemove?(count?: number): T[] + + /** + * 数组移动n位 + * @param n n > 0 右移, n<0 左移 + */ + moveElement?(n: number): T[] + + /** + * 两个数组并集 + * @param arr + */ + union?(arr: T[]): T[] + + /** + * 两个数组交集 + * @param arr + */ + intersect?(arr: T[]): T[] + + /** + * 相对于arr的差集 + * @param arr + */ + difference?(arr: T[]): T[] + + /** + * 转换成Map + * @param {string} key 用于生成map的key字段名 + * @return {Map} + */ + toMap?(key: string): Map +} + +Object.defineProperties(Array.prototype, { + cloneTo: { + value: function (this: T[], b: any[]) { + b.length = this.length + let len = this.length + b.length = len + for (let i = 0; i < len; i++) { + b[i] = this[i] + } + }, + writable: true, + }, + appendTo: { + value: function (this: T[], b: any[]) { + let len = this.length + for (let i = 0; i < len; i++) { + b.push(this[i]) + } + }, + writable: true, + }, + pushOnce: { + value: function (this: T[], t: T) { + let idx = this.indexOf(t) + if (!~idx) { + idx = this.length + this.push(t) + } + return idx + }, + writable: true, + }, + zremove: { + value: function (this: T[], t: T) { + let idx = this.indexOf(t) + if (~idx) { + this.splice(idx, 1) + return true + } + return false + }, + writable: true, + }, + doSort: { + value: function () { + let key: string, descend: boolean + let len = arguments.length + + for (let i = 0; i < len; i++) { + let arg = arguments[i] + let t = typeof arg + if (t === 'string') { + key = arg + } else { + descend = !!arg + } + } + if (key) { + return this.sort((a: any, b: any) => (descend ? b[key] - a[key] : a[key] - b[key])) + } else { + return this.sort((a: any, b: any) => (descend ? b - a : a - b)) + } + }, + writable: true, + }, + multiSort: { + value: function (kArr: string[], dArr?: boolean[] | boolean) { + let isArr = Array.isArray(dArr) + return this.sort((a: any, b: any): number => { + const def = Array.SORT_DEFAULT + for (let idx = 0, len = kArr.length; idx < len; idx++) { + let key = kArr[idx] + // @ts-ignore + let mode = isArr ? !!dArr[idx] : !!dArr + let av = a[key] + let bv = b[key] + let typea = typeof av + let typeb = typeof bv + if (typea == 'object' || typeb == 'object') { + return 0 + } else if (typea != typeb) { + if (typea == 'undefined') { + // @ts-ignore + bv = def[typeb] + } else if (typeb == 'undefined') { + // @ts-ignore + av = def[typea] + } else { + return 0 + } + } + if (av < bv) { + return mode ? 1 : -1 + } else if (av > bv) { + return mode ? -1 : 1 + } else { + continue + } + } + return 0 + }) + }, + writable: true, + }, + spliceOne: { + value: function (index: number): boolean { + if (index === -1 || index >= this.length) { + return false + } + const len = this.length - 1 + for (let i = index; i < len; i++) { + this[i] = this[i + 1] + } + this.length = len + return true + }, + writable: true, + }, + + randomSort: { + value: function () { + for (let j, x, i = this.length; i; j = (Math.random() * i) | 0, x = this[--i], this[i] = this[j], this[j] = x) {} + }, + writable: true, + }, + contains: { + value: function (obj: T | T[] | {} | {}[], child?: string): boolean { + let result = false + if (child) { + const isArr = Array.isArray(obj) + if (isArr) { + // @ts-ignore + if (obj[0].hasOwnProperty(child)) { + let set0 = new Set() + // @ts-ignore + for (let s of obj) { + // @ts-ignore + set0.add(s[child]) + } + // @ts-ignore + let set1 = new Set(this.filter(x => set0.has(x))) + return set0.size === set1.size + } else { + // @ts-ignore + let set0 = new Set(obj) + let set1 = new Set(this.filter((x: {}) => set0.has(x))) + return set1.size === set0.size + } + } else { + if (obj.hasOwnProperty(child)) { + for (let sub of this) { + if (sub.hasOwnProperty(child)) { + // @ts-ignore + if (sub[child] === obj[child]) { + result = true + break + } + } + } + } else { + for (let sub of this) { + if (sub.hasOwnProperty(child)) { + // @ts-ignore + if (sub[child] === obj) { + result = true + break + } + } + } + } + } + } else { + // 不指定 比较字段 的话, 只处理2种情况 + // 1: obj 为数组 + // 2: obj 不是数组 + if (Array.isArray(obj)) { + let set0 = new Set(obj) + // @ts-ignore + let set1 = new Set(this.filter(x => set0.has(x))) + return set1.size === set0.size + } else { + let idx = this.indexOf(obj) + return !!~idx + } + } + return result + }, + writable: true, + }, + randomInsert: { + value: function (arr: Array) { + const length = this.length + arr.forEach(value => { + this.splice(Math.random() * length, 0, value) + }) + }, + writable: true, + }, + randomGet: { + value: function (count: number = 1): T[] { + let shuffled: T[] = this.slice(0), + i = this.length, + min = i - count, + temp, + index + if (min < 0) { + return shuffled + } + while (i-- > min) { + index = Math.floor((i + 1) * Math.random()) + temp = shuffled[index] + shuffled[index] = shuffled[i] + shuffled[i] = temp + } + return shuffled.slice(min) + }, + writable: true, + }, + randomOne: { + value: function (): T { + let results = this.randomGet(1) + if (results.length > 0) { + return results[0] + } else { + return null + } + }, + writable: true, + }, + randomRemove: { + value: function (count: number = 1): T[] { + let result = [] + while (count-- > 0 && this.length > 0) { + let index = (Math.random() * this.length) | 0 + result.push(...this.splice(index, 1)) + } + return result + }, + writable: true, + }, + + moveElement: { + value: function (n: number): T[] { + if (Math.abs(n) > this.length) n = n % this.length + return this.slice(-n).concat(this.slice(0, -n)) + }, + writable: true, + }, + + union: { + value: function (this: T[], b: any[]): T[] { + let a = this.concat(b) + return [...new Set(a)] + }, + writable: true, + }, + + intersect: { + value: function (this: T[], b: any[]): T[] { + let set0 = new Set(b) + let set1 = new Set(this.filter(x => set0.has(x))) + return [...set1] + }, + writable: true, + }, + + difference: { + value: function (this: T[], b: any[]): T[] { + let set0 = new Set(b) + let set1 = new Set(this.filter(x => !set0.has(x))) + return [...set1] + }, + writable: true, + }, + + toMap: { + value: function (this: T[], key: string) { + let result: Map = new Map() + for (const o of this) { + // @ts-ignore + result.set(o[key], o) + } + return result + }, + writable: true, + }, +}) + +interface Map { + /** + * 只针对V为number的Map, 有值的话, 加上V, 没值则直接set + * V为其他类型时, 直接set + * @param key + * @param value + */ + inc?(key: K, value: V): number +} + +Object.defineProperties(Map.prototype, { + inc: { + value: function (key: K, value: V) { + if (typeof value == 'number') { + this.set(key, (this.get(key) || 0) + value) + } else { + this.set(key, value) + } + return this.get(key) + }, + }, +}) diff --git a/src/common/ZError.ts b/src/common/ZError.ts new file mode 100644 index 0000000..ffe0623 --- /dev/null +++ b/src/common/ZError.ts @@ -0,0 +1,13 @@ +import { FastifyError } from 'fastify' + +export class ZError implements FastifyError { + code: string + statusCode?: number + message: string + name: string + + constructor(statusCode: number, message: string) { + this.statusCode = statusCode + this.message = message + } +} diff --git a/src/common/base.controller.ts b/src/common/base.controller.ts new file mode 100644 index 0000000..8187a7b --- /dev/null +++ b/src/common/base.controller.ts @@ -0,0 +1,6 @@ +import fastify = require('fastify') + +class BaseController { + aotoRoute(req: fastify.FastifyRequest, res) {} +} +export default BaseController diff --git a/src/config/config.ts b/src/config/config.ts new file mode 100644 index 0000000..c264deb --- /dev/null +++ b/src/config/config.ts @@ -0,0 +1,29 @@ +import * as dotenv from "dotenv"; +const NODE_ENV = process.env.NODE_ENV || "development"; + +dotenv.config(); +let path; +switch (process.env.NODE_ENV) { + case "test": + path = `${__dirname}/../../.env.development`; + break; + case "production": + path = `${__dirname}/../../.env.production`; + break; + default: + path = `${__dirname}/../../.env.development`; +} +dotenv.config({ path: path, debug: NODE_ENV === "development" }); +let baseConfig = { + api: { + port: parseInt(process.env.API_PORT), + host: process.env.API_HOST, + token_secret: process.env.API_TOKEN_SECRET, + token_expiresIn: process.env.API_TOKEN_EXPIRESIN, + }, + + db_main: process.env.DB_MAIN, + db_second: process.env.DB_SECOND, +}; + +export default baseConfig; diff --git a/src/controllers/main.controllers.ts b/src/controllers/main.controllers.ts new file mode 100644 index 0000000..8bb445c --- /dev/null +++ b/src/controllers/main.controllers.ts @@ -0,0 +1,11 @@ +import BaseController from "common/base.controller"; +import { role, router } from "decorators/router"; + +class MainController extends BaseController { + @role("anon") + @router("post /client/login") + async clientLogin(req, res) { + const { code, token } = req.params; + return {}; + } +} diff --git a/src/decorators/dbconn.ts b/src/decorators/dbconn.ts new file mode 100644 index 0000000..a170f6c --- /dev/null +++ b/src/decorators/dbconn.ts @@ -0,0 +1,18 @@ +import { mongoose } from '@typegoose/typegoose' +import config from 'config/config' +/** + * 为model指定数据库连接 + * @param {string} name 数据库连接名字, 在config中必须要有对应的配置, 比如main, 则必须要有 db_main + * */ +export function dbconn(name?: string) { + return target => { + name = name || 'main' + const url = config['db_' + name] + target['db'] = mongoose.createConnection(url, { + useNewUrlParser: true, + useCreateIndex: true, + useFindAndModify: false, + useUnifiedTopology: true, + }) + } +} diff --git a/src/decorators/nojson.ts b/src/decorators/nojson.ts new file mode 100644 index 0000000..90f4ba2 --- /dev/null +++ b/src/decorators/nojson.ts @@ -0,0 +1,29 @@ +import 'reflect-metadata' +import { singleton } from './singleton' + +@singleton +export class NoJsonClass { + private noJsonPropSet: Set = new Set() + + public addKey(className: string, propertyKey: string) { + this.noJsonPropSet.add(className + '_' + propertyKey) + } + + public checkExist(className: string, propertyKey: string) { + return this.noJsonPropSet.has(className + '_' + propertyKey) + } +} +/** + * 在不需要toJson方法输出的字段上加上 @noJson + * @return {{(target: Function): void, (target: Object, propertyKey: (string | symbol)): void}} + */ +export function noJson() { + // return Reflect.metadata(noJsonMetadataKey, !0) + return function (target: Object, propertyKey: string) { + new NoJsonClass().addKey(target.constructor.name, propertyKey) + } +} + +export function checkJson(target: any, propertyKey: string) { + return !new NoJsonClass().checkExist(target.constructor.modelName, propertyKey) +} diff --git a/src/decorators/router.ts b/src/decorators/router.ts new file mode 100644 index 0000000..366aa6f --- /dev/null +++ b/src/decorators/router.ts @@ -0,0 +1,142 @@ +import BaseController from '../common/base.controller' + +export class RouterData { + target?: any + method?: string + path?: string + fun?: Function +} + +export class RouterMap { + static decoratedRouters: Map< + Function, + { + roles?: string[] + permissions?: string[][] + data?: RouterData[] + depts?: string[] + } + > = new Map() +} + +export function router(route?: string) { + return (target: BaseController, name: string, value: PropertyDescriptor) => { + if (!route) { + const controller = target.constructor.name + const controllerName = controller.toLowerCase().replace('.controller', '') + route = 'all ' + ['', controllerName, name].join('/') + } + const split = route.split(' ') + if (split.length > 2) { + throw new Error('路由中只允许一个空格') + } + const [method, path] = split + // @ts-ignore + const key = target[name] + let routerData = new RouterData() + routerData.target = target + routerData.method = method + routerData.path = path + // @ts-ignore + routerData.fun = target[name] + + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key) + if (!objCurrent.data) { + objCurrent.data = [routerData] + } else { + objCurrent.data.push(routerData) + } + // @ts-ignore + RouterMap.decoratedRouters.set(target[name], objCurrent) + } else { + let routerObj = { + data: [routerData], + } + // @ts-ignore + RouterMap.decoratedRouters.set(target[name], routerObj) + } + } +} + +export function role(roles?: string | string[]) { + return (target: BaseController, name: string, value: PropertyDescriptor) => { + let roleList: string[] = [] + if (roles) { + if (Array.isArray(roles)) { + roleList = roles + } else { + roleList = [roles] + } + } + // @ts-ignore + const key = target[name] + let roleObj = { roles: roleList } + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key) + Object.assign(objCurrent, roleObj) + // @ts-ignore + RouterMap.decoratedRouters.set(target[name], objCurrent) + } else { + // @ts-ignore + RouterMap.decoratedRouters.set(target[name], roleObj) + } + } +} + +export function permission(permissions?: string | string[]) { + return (target: BaseController, name: string, value: PropertyDescriptor) => { + let permissionList: string[][] = [[]] + if (permissions) { + if (Array.isArray(permissions)) { + let arr = [] + for (let sub of permissions) { + arr.push(sub.split(':')) + } + permissionList = arr + } else { + permissionList = [permissions.split(':')] + } + } + // @ts-ignore + const key = target[name] + let permissionObj = { permissions: permissionList } + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key) + Object.assign(objCurrent, permissionObj) + // @ts-ignore + RouterMap.decoratedRouters.set(target[name], objCurrent) + } else { + // @ts-ignore + RouterMap.decoratedRouters.set(target[name], permissionObj) + } + } +} + +/** + * 有dept修饰器的, 需要验证部门id是否存在 + */ +export function dept(depts?: string | string[]) { + return (target: BaseController, name: string, value: PropertyDescriptor) => { + let deptList: string[] = [] + if (depts) { + if (Array.isArray(depts)) { + deptList = depts + } else { + deptList = [depts] + } + } + // @ts-ignore + const key = target[name] + let deptObj = { depts: deptList } + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key) + Object.assign(objCurrent, deptObj) + // @ts-ignore + RouterMap.decoratedRouters.set(target[name], objCurrent) + } else { + // @ts-ignore + RouterMap.decoratedRouters.set(target[name], deptObj) + } + } +} diff --git a/src/decorators/singleton.ts b/src/decorators/singleton.ts new file mode 100644 index 0000000..c43327d --- /dev/null +++ b/src/decorators/singleton.ts @@ -0,0 +1,29 @@ +/** + * 单例化一个class + * 使用方法: + * @singleton + * class Test {} + * new Test() === new Test() // returns `true` + * 也可以不使用 decorator + * const TestSingleton = singleton(Test) + * new TestSingleton() === new TestSingleton() //returns 'true' + */ + +export const SINGLETON_KEY = Symbol() + +export type Singleton any> = T & { + [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never +} +export const singleton = any>(classTarget: T) => + new Proxy(classTarget, { + construct(target: Singleton, argumentsList, newTarget) { + // Skip proxy for children + if (target.prototype !== newTarget.prototype) { + return Reflect.construct(target, argumentsList, newTarget) + } + if (!target[SINGLETON_KEY]) { + target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget) + } + return target[SINGLETON_KEY] + }, + }) diff --git a/src/logger/logger.ts b/src/logger/logger.ts new file mode 100644 index 0000000..6051b1b --- /dev/null +++ b/src/logger/logger.ts @@ -0,0 +1,2 @@ +const logger = require('tracer').colorConsole({ dateformat: 'yyyy-mm-dd HH:MM:ss.L' }) +export default logger diff --git a/src/plugins/apiauth.ts b/src/plugins/apiauth.ts new file mode 100644 index 0000000..abdc01a --- /dev/null +++ b/src/plugins/apiauth.ts @@ -0,0 +1,55 @@ +import { FastifyPluginAsync, FastifyReply, FastifyRequest } from "fastify"; +import fastifyPlugin from "fastify-plugin"; + +declare module "fastify" { + interface FastifyRequest { + roles?: string[]; + user?: any; + token?: string; + } + interface FastifyInstance { + apiAuth: (request: FastifyRequest, reply: FastifyReply) => {}; + } +} + +export interface ApiAuthOptions { + secret: string; + expiresIn: string; +} + +const apiAuthPlugin: FastifyPluginAsync = async function ( + fastify, + opts +) { + fastify.register(require("@fastify/jwt"), { + secret: opts.secret, + sign: { expiresIn: opts.expiresIn }, + }); + // 只有路由配置的role为anon才不需要过滤 + fastify.decorate( + "apiAuth", + async function (request: FastifyRequest, reply: FastifyReply) { + if (!request.roles || request.roles.indexOf("anon") == -1) { + try { + if (!request.token) { + return reply.send({ code: 11, msg: "need login" }); + } + //@ts-ignore + const data = this.jwt.verify(request.token); + if (!data || !data.id) { + return reply.send({ code: 10, msg: "need login" }); + } + // let account = await Account.findById(data.id) + // if (!account) { + // return reply.send({ code: 10, msg: 'need login' }) + // } + // request.user = account + } catch (err) { + return reply.send({ code: 401, msg: "need auth" }); + } + } + } + ); +}; + +export default fastifyPlugin(apiAuthPlugin, "4.x"); diff --git a/src/plugins/zReqParser.ts b/src/plugins/zReqParser.ts new file mode 100644 index 0000000..b853d22 --- /dev/null +++ b/src/plugins/zReqParser.ts @@ -0,0 +1,37 @@ +import { + FastifyInstance, + FastifyPluginAsync, + FastifyReply, + FastifyRequest, +} from "fastify"; +import fastifyPlugin from "fastify-plugin"; + +/** + * 将post 和 get 的参数统一到 req.params + */ +declare module "fastify" { + interface FastifyInstance { + zReqParser: (request: FastifyRequest, reply: FastifyReply) => {}; + } +} +const zReqParserPlugin: FastifyPluginAsync = async function ( + fastify: FastifyInstance, + options?: any +) { + fastify.addHook( + "preValidation", + async (request: FastifyRequest, reply: FastifyReply) => { + let params = request.params || {}; + if (request.query) { + Object.assign(params, request.query); + } + if (request.body) { + Object.assign(params, request.body); + } + request.params = params; + } + ); + return; +}; + +export default fastifyPlugin(zReqParserPlugin, "4.x"); diff --git a/src/plugins/zTokenParser.ts b/src/plugins/zTokenParser.ts new file mode 100644 index 0000000..223194c --- /dev/null +++ b/src/plugins/zTokenParser.ts @@ -0,0 +1,73 @@ +import { + FastifyInstance, + FastifyPluginAsync, + FastifyReply, + FastifyRequest, +} from "fastify"; +import fastifyPlugin from "fastify-plugin"; + +const getTokenFromHeader = function (request) { + let token: string | undefined; + if (request.headers && request.headers.authorization) { + const parts = request.headers.authorization.split(" "); + if (parts.length === 2) { + const scheme = parts[0]; + if (/^Bearer$/i.test(scheme)) { + token = parts[1]; + } + } + } + return token; +}; +const getTokenFromCookie = function (request) { + let token: string | undefined; + if (request.cookies) { + if (request.cookies["token"]) { + token = request.cookies["token"]; + } + } + return token; +}; + +const getTokenFromParams = function (request) { + let token: string | undefined; + token = request.params && request.params.token; + return token; +}; + +const getTokenFromQuery = function (request) { + let token: string | undefined; + token = request.query && request.query.token; + return token; +}; + +const getTokenFromBody = function (request) { + let token: string | undefined; + token = request.body && request.body.token; + return token; +}; + +const zTokenParserPlugin: FastifyPluginAsync = async function ( + fastify: FastifyInstance, + options?: any +) { + fastify.addHook( + "preValidation", + async (request: FastifyRequest, reply: FastifyReply) => { + request["token"] = + getTokenFromHeader(request) || + getTokenFromCookie(request) || + getTokenFromParams(request) || + getTokenFromQuery(request) || + getTokenFromBody(request); + } + ); + return; +}; +/** + * 依次从request的header, cookie, params, query和body中获取token, 加入到request.token中 + * header中的字段key为authorization, 格式为 Bearer xxxx + * 其他位置的key都为 token + */ + +export default fastifyPlugin(zTokenParserPlugin, "4.x"); diff --git a/src/plugins/zrbac.ts b/src/plugins/zrbac.ts new file mode 100644 index 0000000..3206940 --- /dev/null +++ b/src/plugins/zrbac.ts @@ -0,0 +1,26 @@ +import { FastifyInstance, FastifyPluginAsync } from 'fastify' +import fastifyPlugin from 'fastify-plugin' +import RBAC from 'fast-rbac' + +declare module 'fastify' { + interface FastifyInstance { + /** + * RBAC interface + */ + rbac: RBAC + } +} + +const zRBACPlugin: FastifyPluginAsync = async function fastifyMetrics( + fastify: FastifyInstance, + options?: RBAC.Options, +) { + const rbac = new RBAC(options) + fastify.decorate('rbac', rbac) + return +} + +export = fastifyPlugin(zRBACPlugin, { + fastify: '>=3.0.0', + name: 'zrbac', +}) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a6a860c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "ts-node": { + "files": true + }, + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "module": "commonjs", + "esModuleInterop": true, + "target": "es2018", + "moduleResolution": "node", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./src", + "rootDir": "./src" + }, + "lib": ["es2018"], + "include": [ + "src/**/*.ts", + "typings/extend.d.ts" + ] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..fe4daf6 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1976 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint/eslintrc@^1.3.3": + version "1.3.3" + resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" + integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@fastify/ajv-compiler@^3.3.1": + version "3.3.1" + resolved "https://registry.npmmirror.com/@fastify/ajv-compiler/-/ajv-compiler-3.3.1.tgz#7045dbf23c11c42b50011ccc36998cd624856e5d" + integrity sha512-IRnids8lblQ8e1i8h4JLyfJmebXE+ohcj8x8X/+Ew6ZB4H0Ui05z5YL6q5FOcl0zItVpu4adRzeyVNNUwmduIg== + dependencies: + ajv "^8.11.0" + ajv-formats "^2.1.1" + fast-uri "^2.0.0" + +"@fastify/cors@^8.1.0": + version "8.1.0" + resolved "https://registry.npmmirror.com/@fastify/cors/-/cors-8.1.0.tgz#af29ddb32675310dfcbbe3aa0af4b7ed29fdb956" + integrity sha512-1OmjwyxQZ8GePxa5t1Rpsn2qS56+1ouKMvZufpgJWhXtoCeM/ffA+PsNW8pyslPr4W0E27gVoFqtvHwhXW1U2w== + dependencies: + fastify-plugin "^4.0.0" + mnemonist "0.39.2" + +"@fastify/deepmerge@^1.0.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@fastify/deepmerge/-/deepmerge-1.1.0.tgz#91f0a5a27034ff76b7bece63a5906894940ace82" + integrity sha512-E8Hfdvs1bG6u0N4vN5Nty6JONUfTdOciyD5rn8KnEsLKIenvOVcr210BQR9t34PRkNyjqnMLGk3e0BsaxRdL+g== + +"@fastify/error@^3.0.0": + version "3.0.0" + resolved "https://registry.npmmirror.com/@fastify/error/-/error-3.0.0.tgz#bfcb7b33cec0196413083a91ef2edc7b2c88455b" + integrity sha512-dPRyT40GiHRzSCll3/Jn2nPe25+E1VXc9tDwRAIKwFCxd5Np5wzgz1tmooWG3sV0qKgrBibihVoCna2ru4SEFg== + +"@fastify/fast-json-stringify-compiler@^4.1.0": + version "4.1.0" + resolved "https://registry.npmmirror.com/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.1.0.tgz#ebf657ce4ec88e27ba311f7560eaa0b37de8719d" + integrity sha512-cTKBV2J9+u6VaKDhX7HepSfPSzw+F+TSd+k0wzifj4rG+4E5PjSFJCk19P8R6tr/72cuzgGd+mbB3jFT6lvAgw== + dependencies: + fast-json-stringify "^5.0.0" + +"@fastify/formbody@^7.3.0": + version "7.3.0" + resolved "https://registry.npmmirror.com/@fastify/formbody/-/formbody-7.3.0.tgz#0da0f3e8895d7360d179020cf999be3b1d68d514" + integrity sha512-4uHTS7wH0mkUoltk4wyJ966rs/TQP0BNDSCtyqRMy7p5adGg+5ERbYue/zGh/qI9yLDPN0K98u7Fw+lLEmBZJQ== + dependencies: + fast-querystring "^1.0.0" + fastify-plugin "^4.0.0" + +"@fastify/helmet@^10.0.1": + version "10.0.1" + resolved "https://registry.npmmirror.com/@fastify/helmet/-/helmet-10.0.1.tgz#9a75a73b3d1bce9733d8b24d4feea5e7a02979b9" + integrity sha512-UW4Ip1X8sfiaQE1XU5tDYub79nMwCcsA4MCarOnHMdrODOHIkEb6RWNUcMJN2yaBPTP5dn1W/SvH2vVVA41JCg== + dependencies: + fastify-plugin "^4.2.1" + helmet "^6.0.0" + +"@fastify/jwt@^6.3.2": + version "6.3.2" + resolved "https://registry.npmmirror.com/@fastify/jwt/-/jwt-6.3.2.tgz#f29ba7e5239f07b3941bf9f63777b20e5a798149" + integrity sha512-LD41UNS55o1HyUlCiR1G2fDtqebvsSaxfWsVuerSLmyGWbCjfzNOPjEs4yUvMj2NjbV73ZzR3ZtR64vr1TeFYA== + dependencies: + "@fastify/error" "^3.0.0" + "@lukeed/ms" "^2.0.0" + fast-jwt "^1.5.1" + fastify-plugin "^4.0.0" + steed "^1.1.3" + +"@humanwhocodes/config-array@^0.10.5": + version "0.10.7" + resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" + integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@lukeed/ms@^2.0.0": + version "2.0.1" + resolved "https://registry.npmmirror.com/@lukeed/ms/-/ms-2.0.1.tgz#3c2bbc258affd9cc0e0cc7828477383c73afa6ee" + integrity sha512-Xs/4RZltsAL7pkvaNStUQt7netTkyxrS0K+RILcVr3TRMS/ToOg4I6uNfhB9SlGsnWBym4U+EaXq0f0cEMNkHA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@typegoose/typegoose@^9.12.1": + version "9.12.1" + resolved "https://registry.npmmirror.com/@typegoose/typegoose/-/typegoose-9.12.1.tgz#0552a05ec225dfd98b9c93836a0e09f8f9651dc3" + integrity sha512-whS0vIMf+xRzw6G2YgBni9LCSGnrHVY/q+KivFeg/1Oqtz0ViOLx4jCRoSwYhqJIu0UGHxOliFhJrVSrc8rrqw== + dependencies: + lodash "^4.17.20" + loglevel "^1.8.0" + reflect-metadata "^0.1.13" + semver "^7.3.7" + tslib "^2.4.0" + +"@types/dotenv@^8.2.0": + version "8.2.0" + resolved "https://registry.npmmirror.com/@types/dotenv/-/dotenv-8.2.0.tgz#5cd64710c3c98e82d9d15844375a33bf1b45d053" + integrity sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw== + dependencies: + dotenv "*" + +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/node@*": + version "18.11.0" + resolved "https://registry.npmmirror.com/@types/node/-/node-18.11.0.tgz#f38c7139247a1d619f6cc6f27b072606af7c289d" + integrity sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w== + +"@types/semver@^7.3.12": + version "7.3.12" + resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.3.12.tgz#920447fdd78d76b19de0438b7f60df3c4a80bf1c" + integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A== + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.npmmirror.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ== + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.npmmirror.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + +"@types/webidl-conversions@*": + version "7.0.0" + resolved "https://registry.npmmirror.com/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz#2b8e60e33906459219aa587e9d1a612ae994cfe7" + integrity sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog== + +"@types/whatwg-url@^8.2.1": + version "8.2.2" + resolved "https://registry.npmmirror.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" + integrity sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA== + dependencies: + "@types/node" "*" + "@types/webidl-conversions" "*" + +"@typescript-eslint/eslint-plugin@^5.40.1": + version "5.40.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz#3203a6ff396b1194083faaa6e5110c401201d7d5" + integrity sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg== + dependencies: + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/type-utils" "5.40.1" + "@typescript-eslint/utils" "5.40.1" + debug "^4.3.4" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.40.1": + version "5.40.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.40.1.tgz#e7f8295dd8154d0d37d661ddd8e2f0ecfdee28dd" + integrity sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg== + dependencies: + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/typescript-estree" "5.40.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.40.1": + version "5.40.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz#a7a5197dfd234622a2421ea590ee0ccc02e18dfe" + integrity sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg== + dependencies: + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/visitor-keys" "5.40.1" + +"@typescript-eslint/type-utils@5.40.1": + version "5.40.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz#091e4ce3bebbdb68f4980bae9dee2e4e1725f601" + integrity sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q== + dependencies: + "@typescript-eslint/typescript-estree" "5.40.1" + "@typescript-eslint/utils" "5.40.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.40.1": + version "5.40.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.40.1.tgz#de37f4f64de731ee454bb2085d71030aa832f749" + integrity sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw== + +"@typescript-eslint/typescript-estree@5.40.1": + version "5.40.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz#9a7d25492f02c69882ce5e0cd1857b0c55645d72" + integrity sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA== + dependencies: + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/visitor-keys" "5.40.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.40.1": + version "5.40.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.40.1.tgz#3204fb73a559d3b7bab7dc9d3c44487c2734a9ca" + integrity sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/typescript-estree" "5.40.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.40.1": + version "5.40.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz#f3d2bf5af192f4432b84cec6fdcb387193518754" + integrity sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw== + dependencies: + "@typescript-eslint/types" "5.40.1" + eslint-visitor-keys "^3.3.0" + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abstract-logging@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" + integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1, acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.10.0, ajv@^8.11.0: + version "8.11.0" + resolved "https://registry.npmmirror.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asn1.js@^5.3.0: + version "5.4.1" + resolved "https://registry.npmmirror.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +avvio@^8.2.0: + version "8.2.0" + resolved "https://registry.npmmirror.com/avvio/-/avvio-8.2.0.tgz#aff28b0266617bf07ffc1c2d5f4220c3663ce1c2" + integrity sha512-bbCQdg7bpEv6kGH41RO/3B2/GMMmJSo2iBK+X8AWN9mujtfUipMDfIjsgHCfpnKqoGEQrrmCDKSa5OQ19+fDmg== + dependencies: + archy "^1.0.0" + debug "^4.0.0" + fastq "^1.6.1" + +axios@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" + integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bn.js@^4.0.0: + version "4.12.0" + resolved "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +bson@^4.6.5, bson@^4.7.0: + version "4.7.0" + resolved "https://registry.npmmirror.com/bson/-/bson-4.7.0.tgz#7874a60091ffc7a45c5dd2973b5cad7cded9718a" + integrity sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA== + dependencies: + buffer "^5.6.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.1: + version "3.5.3" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +dateformat@4.5.1: + version "4.5.1" + resolved "https://registry.npmmirror.com/dateformat/-/dateformat-4.5.1.tgz#c20e7a9ca77d147906b6dc2261a8be0a5bd2173c" + integrity sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q== + +debug@4.x, debug@^4.0.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@*, dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.npmmirror.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + +dynamic-dedupe@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" + integrity sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ== + dependencies: + xtend "^4.0.0" + +ecdsa-sig-formatter@^1.0.11: + version "1.0.11" + resolved "https://registry.npmmirror.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.25.0: + version "8.25.0" + resolved "https://registry.npmmirror.com/eslint/-/eslint-8.25.0.tgz#00eb962f50962165d0c4ee3327708315eaa8058b" + integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A== + dependencies: + "@eslint/eslintrc" "^1.3.3" + "@humanwhocodes/config-array" "^0.10.5" + "@humanwhocodes/module-importer" "^1.0.1" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.4.0" + resolved "https://registry.npmmirror.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-json-stringify@^5.0.0: + version "5.4.0" + resolved "https://registry.npmmirror.com/fast-json-stringify/-/fast-json-stringify-5.4.0.tgz#6d5066a13bb84f237141375588ddaabfaad6ba2d" + integrity sha512-PIzon53oX/zEGLrGbu4DpfNcYiV4K4rk+JsVrawRPO/G8cNBEMZ3KlIk2BCGqN+m1KCCA4zt5E7Hh3GG9ojRVA== + dependencies: + "@fastify/deepmerge" "^1.0.0" + ajv "^8.10.0" + ajv-formats "^2.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^2.1.0" + rfdc "^1.2.0" + +fast-jwt@^1.5.1: + version "1.7.1" + resolved "https://registry.npmmirror.com/fast-jwt/-/fast-jwt-1.7.1.tgz#c910fcf27f741faca5d181ae8b5941a9c638614a" + integrity sha512-HdDR/k2d3qgUHDVwyhzYdHG/EK+IGhDGZFNidlSvCpVIhWMce8UYXUjx8hWEDhvOA032qoCtO1f/d/VcuzWhzA== + dependencies: + asn1.js "^5.3.0" + ecdsa-sig-formatter "^1.0.11" + mnemonist "^0.39.0" + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-querystring@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fast-querystring/-/fast-querystring-1.0.0.tgz#d6151cd025d4b100e09e24045f6c35ae9ff191ef" + integrity sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA== + dependencies: + fast-decode-uri-component "^1.0.1" + +fast-redact@^3.1.1: + version "3.1.2" + resolved "https://registry.npmmirror.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" + integrity sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw== + +fast-uri@^2.0.0, fast-uri@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fast-uri/-/fast-uri-2.1.0.tgz#9279432d6b53675c90116b947ed2bbba582d6fb5" + integrity sha512-qKRta6N7BWEFVlyonVY/V+BMLgFqktCUV0QjT259ekAIlbVrMaFnFLxJ4s/JPl4tou56S1BzPufI60bLe29fHA== + +fastfall@^1.5.0: + version "1.5.1" + resolved "https://registry.npmmirror.com/fastfall/-/fastfall-1.5.1.tgz#3fee03331a49d1d39b3cdf7a5e9cd66f475e7b94" + integrity sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q== + dependencies: + reusify "^1.0.0" + +fastify-plugin@^4.0.0, fastify-plugin@^4.2.1: + version "4.2.1" + resolved "https://registry.npmmirror.com/fastify-plugin/-/fastify-plugin-4.2.1.tgz#4b80020957938dbc44b8ad4a898fd8bcfbab3f65" + integrity sha512-dlGKiwLzRBKkEf5J5ho0uAD/Jdv8GQVUbriB3tAX3ehRUXE4gTV3lRd5inEg9li1aLzb0EGj8y2K4/8g1TN06g== + +fastify@^4.8.1: + version "4.8.1" + resolved "https://registry.npmmirror.com/fastify/-/fastify-4.8.1.tgz#45a341daa47e87e295ede5de31868ced2a1728c5" + integrity sha512-3an6yyXg7j5XPHTRxgFqUwIRaJPR7F8OPR8Uboo0SIgHx1orOqc9Y8Sl5Kz8+xK7JCy3c3mfRujskDjMu/nFfA== + dependencies: + "@fastify/ajv-compiler" "^3.3.1" + "@fastify/error" "^3.0.0" + "@fastify/fast-json-stringify-compiler" "^4.1.0" + abstract-logging "^2.0.1" + avvio "^8.2.0" + find-my-way "^7.3.0" + light-my-request "^5.6.1" + pino "^8.5.0" + process-warning "^2.0.0" + proxy-addr "^2.0.7" + rfdc "^1.3.0" + secure-json-parse "^2.5.0" + semver "^7.3.7" + tiny-lru "^9.0.2" + +fastparallel@^2.2.0: + version "2.4.1" + resolved "https://registry.npmmirror.com/fastparallel/-/fastparallel-2.4.1.tgz#0d984a5813ffa67f30b4a5cb4cb8cbe61c7ee5a5" + integrity sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q== + dependencies: + reusify "^1.0.4" + xtend "^4.0.2" + +fastq@^1.3.0, fastq@^1.6.0, fastq@^1.6.1: + version "1.13.0" + resolved "https://registry.npmmirror.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fastseries@^1.7.0: + version "1.7.2" + resolved "https://registry.npmmirror.com/fastseries/-/fastseries-1.7.2.tgz#d22ce13b9433dff3388d91dbd6b8bda9b21a0f4b" + integrity sha512-dTPFrPGS8SNSzAt7u/CbMKCJ3s01N04s4JFbORHcmyvVfVKmbhMD1VtRbh5enGHxkaQDqWyLefiKOGGmohGDDQ== + dependencies: + reusify "^1.0.0" + xtend "^4.0.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-my-way@^7.3.0: + version "7.3.1" + resolved "https://registry.npmmirror.com/find-my-way/-/find-my-way-7.3.1.tgz#fd8a0b468a18c283e05be59f93a627f37e306cfa" + integrity sha512-kGvM08SOkqvheLcuQ8GW9t/H901Qb9rZEbcNWbXopzy4jDRoaJpJoObPSKf4MnQLZ20ZTp7rL5MpF6rf+pqmyg== + dependencies: + fast-deep-equal "^3.1.3" + fast-querystring "^1.0.0" + safe-regex2 "^2.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.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" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.npmmirror.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +helmet@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/helmet/-/helmet-6.0.0.tgz#8e183820ddccd7729a206ad73c577b264f495595" + integrity sha512-FO9RpR1wNJepH/GbLPQVtkE2eESglXL641p7SdyoT4LngHFJcZheHMoyUcjCZF4qpuMMO1u5q6RK0l9Ux8JBcg== + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +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.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-sdsl@^4.1.4: + version "4.1.5" + resolved "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" + integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +kareem@2.4.1: + version "2.4.1" + resolved "https://registry.npmmirror.com/kareem/-/kareem-2.4.1.tgz#7d81ec518204a48c1cb16554af126806c3cd82b0" + integrity sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +light-my-request@^5.6.1: + version "5.6.1" + resolved "https://registry.npmmirror.com/light-my-request/-/light-my-request-5.6.1.tgz#cff5c75d8cb35a354433d75406fea74a2f8bcdb1" + integrity sha512-sbJnC1UBRivi9L1kICr3CESb82pNiPNB3TvtdIrZZqW0Qh8uDXvoywMmWKZlihDcmw952CMICCzM+54LDf+E+g== + dependencies: + cookie "^0.5.0" + process-warning "^2.0.0" + set-cookie-parser "^2.4.1" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loglevel@^1.8.0: + version "1.8.0" + resolved "https://registry.npmmirror.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" + integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.npmmirror.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mnemonist@0.39.2: + version "0.39.2" + resolved "https://registry.npmmirror.com/mnemonist/-/mnemonist-0.39.2.tgz#7e6a0bd5c7199460ee12a651103c7007adc6225a" + integrity sha512-n3ZCEosuMH03DVivZ9N0fcXPWiZrBLEdfSlEJ+S/mJxmk3zuo1ur0dj9URDczFyP1VS3wfiyKzqLLDXoPJ6rPA== + dependencies: + obliterator "^2.0.1" + +mnemonist@^0.39.0: + version "0.39.3" + resolved "https://registry.npmmirror.com/mnemonist/-/mnemonist-0.39.3.tgz#8340fc2e180b0dff20dca0a44f7af13639ca1ccb" + integrity sha512-CQ9Nq2TjXH+bybu89QHHrJnv3FnGtozaQPna3gvGpgHSJhyfHR2khMN6EOL/Z1b6ikmbZgCUD2eOBtTS9FOdFw== + dependencies: + obliterator "^2.0.1" + +mongodb-connection-string-url@^2.5.3: + version "2.5.4" + resolved "https://registry.npmmirror.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz#1ee2496f4c4eae64f63c4b2d512aebc89996160a" + integrity sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w== + dependencies: + "@types/whatwg-url" "^8.2.1" + whatwg-url "^11.0.0" + +mongodb@4.9.1: + version "4.9.1" + resolved "https://registry.npmmirror.com/mongodb/-/mongodb-4.9.1.tgz#0c769448228bcf9a6aa7d16daa3625b48312479e" + integrity sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ== + dependencies: + bson "^4.7.0" + denque "^2.1.0" + mongodb-connection-string-url "^2.5.3" + socks "^2.7.0" + optionalDependencies: + saslprep "^1.0.3" + +mongoose-findorcreate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/mongoose-findorcreate/-/mongoose-findorcreate-3.0.0.tgz#490acf67c16061de74f7d1b92906538a62554a6d" + integrity sha512-kQhDe5XDj6tMv8kq1wjK+hITGIGUl60rj8oGLupF9poNsqIDkAJBXudZKcCdSyBZ7p6DLK2+0jSBthrb26tSYQ== + +mongoose@^6.6.5: + version "6.6.5" + resolved "https://registry.npmmirror.com/mongoose/-/mongoose-6.6.5.tgz#fcc7ba9594db711b3d4d7a1b3522c5dbc8f0bf52" + integrity sha512-iA/oDpWOc+K2QYzA4Eq7Z1oUBQOz9FGDmUwPLgw872Bfs/qizA5Db+gJorAn+TnnGu3VoCK8iP4Y+TECUelwjA== + dependencies: + bson "^4.6.5" + kareem "2.4.1" + mongodb "4.9.1" + mpath "0.9.0" + mquery "4.0.3" + ms "2.1.3" + sift "16.0.0" + +mpath@0.9.0: + version "0.9.0" + resolved "https://registry.npmmirror.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" + integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== + +mquery@4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/mquery/-/mquery-4.0.3.tgz#4d15f938e6247d773a942c912d9748bd1965f89d" + integrity sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA== + dependencies: + debug "4.x" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +obliterator@^2.0.1: + version "2.0.4" + resolved "https://registry.npmmirror.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +on-exit-leak-free@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz#5c703c968f7e7f851885f6459bf8a8a57edc9cc4" + integrity sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pino-abstract-transport@v1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz#cc0d6955fffcadb91b7b49ef220a6cc111d48bb3" + integrity sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-std-serializers@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz#4c20928a1bafca122fdc2a7a4a171ca1c5f9c526" + integrity sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ== + +pino@^8.5.0: + version "8.6.1" + resolved "https://registry.npmmirror.com/pino/-/pino-8.6.1.tgz#3fc43acc79bcd3e871670347854f7359e2612f10" + integrity sha512-fi+V2K98eMZjQ/uEHHSiMALNrz7HaFdKNYuyA3ZUrbH0f1e8sPFDmeRGzg7ZH2q4QDxGnJPOswmqlEaTAZeDPA== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport v1.0.0 + pino-std-serializers "^6.0.0" + process-warning "^2.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^3.1.0" + thread-stream "^2.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.npmmirror.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +process-warning@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/process-warning/-/process-warning-2.0.0.tgz#341dbeaac985b90a04ebcd844d50097c7737b2ee" + integrity sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmmirror.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +proxy-addr@^2.0.7: + version "2.0.7" + resolved "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.npmmirror.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +readable-stream@^4.0.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-4.2.0.tgz#a7ef523d3b39e4962b0db1a1af22777b10eeca46" + integrity sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.npmmirror.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.0.0: + version "1.22.1" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +ret@~0.2.0: + version "0.2.2" + resolved "https://registry.npmmirror.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" + integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== + +reusify@^1.0.0, reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.2.0, rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex2@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/safe-regex2/-/safe-regex2-2.0.0.tgz#b287524c397c7a2994470367e0185e1916b1f5b9" + integrity sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ== + dependencies: + ret "~0.2.0" + +safe-stable-stringify@^2.3.1: + version "2.4.0" + resolved "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz#95fadb1bcf8057a1363e11052122f5da36a69215" + integrity sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA== + +safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saslprep@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" + integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== + dependencies: + sparse-bitfield "^3.0.3" + +secure-json-parse@^2.5.0: + version "2.5.0" + resolved "https://registry.npmmirror.com/secure-json-parse/-/secure-json-parse-2.5.0.tgz#f929829df2adc7ccfb53703569894d051493a6ac" + integrity sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w== + +semver@^7.3.7: + version "7.3.8" + resolved "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +set-cookie-parser@^2.4.1: + version "2.5.1" + resolved "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" + integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +sift@16.0.0: + version "16.0.0" + resolved "https://registry.npmmirror.com/sift/-/sift-16.0.0.tgz#447991577db61f1a8fab727a8a98a6db57a23eb8" + integrity sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks@^2.7.0: + version "2.7.1" + resolved "https://registry.npmmirror.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +sonic-boom@^3.1.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/sonic-boom/-/sonic-boom-3.2.0.tgz#ce9f2de7557e68be2e52c8df6d9b052e7d348143" + integrity sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA== + dependencies: + atomic-sleep "^1.0.0" + +source-map-support@^0.5.12: + version "0.5.21" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + +split2@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" + integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== + +steed@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/steed/-/steed-1.1.3.tgz#f1525dd5adb12eb21bf74749537668d625b9abc5" + integrity sha512-EUkci0FAUiE4IvGTSKcDJIQ/eRUP2JJb56+fvZ4sdnguLTqIdKjSxUe138poW8mkvKWXW2sFPrgTsxqoISnmoA== + dependencies: + fastfall "^1.5.0" + fastparallel "^2.2.0" + fastq "^1.3.0" + fastseries "^1.7.0" + reusify "^1.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thread-stream@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/thread-stream/-/thread-stream-2.2.0.tgz#310c03a253f729094ce5d4638ef5186dfa80a9e8" + integrity sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ== + dependencies: + real-require "^0.2.0" + +tiny-lru@^9.0.2: + version "9.0.3" + resolved "https://registry.npmmirror.com/tiny-lru/-/tiny-lru-9.0.3.tgz#f6a2121f433607a7f338881a23090829c1ea8cae" + integrity sha512-/i9GruRjXsnDgehxvy6iZ4AFNVxngEFbwzirhdulomMNPGPVV3ECMZOWSw0w4sRMZ9Al9m4jy08GPvRxRUGYlw== + +tinytim@0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/tinytim/-/tinytim-0.1.1.tgz#c968a1e5559ad9553224ef7627bab34e3caef8a8" + integrity sha512-NIpsp9lBIxPNzB++HnMmUd4byzJSVbbO4F+As1Gb1IG/YQT5QvmBDjpx8SpDS8fhGC+t+Qw8ldQgbcAIaU+2cA== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tracer@^1.1.6: + version "1.1.6" + resolved "https://registry.npmmirror.com/tracer/-/tracer-1.1.6.tgz#5afc5ea0d7c6026dbafb36bed86e88cafe9bebad" + integrity sha512-VKEIQRNgzSgti18whs+8l7e2y/gWcklw+C/xZtFH/AGvaN6GDlvhkQTFEsy448Gxb5MtbNbzJiG0L1TJEQnqcA== + dependencies: + colors "1.4.0" + dateformat "4.5.1" + mkdirp "^1.0.4" + tinytim "0.1.1" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-node-dev@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ts-node-dev/-/ts-node-dev-2.0.0.tgz#bdd53e17ab3b5d822ef519928dc6b4a7e0f13065" + integrity sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w== + dependencies: + chokidar "^3.5.1" + dynamic-dedupe "^0.3.0" + minimist "^1.2.6" + mkdirp "^1.0.4" + resolve "^1.0.0" + rimraf "^2.6.1" + source-map-support "^0.5.12" + tree-kill "^1.2.2" + ts-node "^10.4.0" + tsconfig "^7.0.0" + +ts-node@^10.4.0, ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz#f8ef7d467f08ae3a695335bf1ece088c5538d2c1" + integrity sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow== + dependencies: + json5 "^2.2.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@^4.8.4: + version "4.8.4" + resolved "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@^4.0.0, xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==