From 12a2c7a41cd890d6d5e5b441595d2e708a81785e Mon Sep 17 00:00:00 2001 From: CounterFire2023 <136581895+CounterFire2023@users.noreply.github.com> Date: Wed, 17 Jan 2024 16:22:57 +0800 Subject: [PATCH] add eslint; add some compt for controller --- .eslintignore | 1 + .eslintrc.js | 14 + .prettierrc.js | 13 + dist/common/base.controller.cjs | 34 ++ dist/common/base.controller.cjs.map | 1 + dist/common/base.controller.d.cts | 5 + dist/common/base.controller.d.ts | 5 + dist/common/base.controller.js | 10 + dist/common/base.controller.js.map | 1 + dist/index.cjs | 125 +++++ dist/index.cjs.map | 2 +- dist/index.d.cts | 58 ++- dist/index.d.ts | 58 ++- dist/index.js | 118 +++++ dist/index.js.map | 2 +- package.json | 9 +- src/common/base.controller.ts | 6 + src/decorators/router.ts | 142 ++++++ src/index.ts | 12 +- src/redis/ZRedisClient.ts | 2 +- yarn.lock | 721 +++++++++++++++++++++++++++- 21 files changed, 1285 insertions(+), 54 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .prettierrc.js create mode 100644 dist/common/base.controller.cjs create mode 100644 dist/common/base.controller.cjs.map create mode 100644 dist/common/base.controller.d.cts create mode 100644 dist/common/base.controller.d.ts create mode 100644 dist/common/base.controller.js create mode 100644 dist/common/base.controller.js.map create mode 100644 src/common/base.controller.ts create mode 100644 src/decorators/router.ts 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/.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/dist/common/base.controller.cjs b/dist/common/base.controller.cjs new file mode 100644 index 0000000..f017c3e --- /dev/null +++ b/dist/common/base.controller.cjs @@ -0,0 +1,34 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/common/base.controller.ts +var base_controller_exports = {}; +__export(base_controller_exports, { + ROLE_ANON: () => ROLE_ANON, + default: () => base_controller_default +}); +module.exports = __toCommonJS(base_controller_exports); +var ROLE_ANON = "anon"; +var BaseController = class { +}; +var base_controller_default = BaseController; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + ROLE_ANON +}); +//# sourceMappingURL=base.controller.cjs.map \ No newline at end of file diff --git a/dist/common/base.controller.cjs.map b/dist/common/base.controller.cjs.map new file mode 100644 index 0000000..40cb992 --- /dev/null +++ b/dist/common/base.controller.cjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/common/base.controller.ts"],"sourcesContent":["\nexport const ROLE_ANON = 'anon'\nclass BaseController {\n \n}\nexport default BaseController\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,IAAM,YAAY;AACzB,IAAM,iBAAN,MAAqB;AAErB;AACA,IAAO,0BAAQ;","names":[]} \ No newline at end of file diff --git a/dist/common/base.controller.d.cts b/dist/common/base.controller.d.cts new file mode 100644 index 0000000..245a0e2 --- /dev/null +++ b/dist/common/base.controller.d.cts @@ -0,0 +1,5 @@ +declare const ROLE_ANON = "anon"; +declare class BaseController { +} + +export { ROLE_ANON, BaseController as default }; diff --git a/dist/common/base.controller.d.ts b/dist/common/base.controller.d.ts new file mode 100644 index 0000000..245a0e2 --- /dev/null +++ b/dist/common/base.controller.d.ts @@ -0,0 +1,5 @@ +declare const ROLE_ANON = "anon"; +declare class BaseController { +} + +export { ROLE_ANON, BaseController as default }; diff --git a/dist/common/base.controller.js b/dist/common/base.controller.js new file mode 100644 index 0000000..e71d9ac --- /dev/null +++ b/dist/common/base.controller.js @@ -0,0 +1,10 @@ +// src/common/base.controller.ts +var ROLE_ANON = "anon"; +var BaseController = class { +}; +var base_controller_default = BaseController; +export { + ROLE_ANON, + base_controller_default as default +}; +//# sourceMappingURL=base.controller.js.map \ No newline at end of file diff --git a/dist/common/base.controller.js.map b/dist/common/base.controller.js.map new file mode 100644 index 0000000..a4fee2c --- /dev/null +++ b/dist/common/base.controller.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/common/base.controller.ts"],"sourcesContent":["\nexport const ROLE_ANON = 'anon'\nclass BaseController {\n \n}\nexport default BaseController\n"],"mappings":";AACO,IAAM,YAAY;AACzB,IAAM,iBAAN,MAAqB;AAErB;AACA,IAAO,0BAAQ;","names":[]} \ No newline at end of file diff --git a/dist/index.cjs b/dist/index.cjs index 881bc11..36bd1ab 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -28,12 +28,19 @@ var __decorateClass = (decorators, target, key, kind) => { // src/index.ts var src_exports = {}; __export(src_exports, { + ROLE_ANON: () => ROLE_ANON, + RouterData: () => RouterData, + RouterMap: () => RouterMap, SINGLETON_KEY: () => SINGLETON_KEY, SyncLocker: () => SyncLocker, ZError: () => ZError, ZRedisClient: () => ZRedisClient, createAsyncQueue: () => createAsyncQueue, createAsyncQueues: () => createAsyncQueues, + dept: () => dept, + permission: () => permission, + role: () => role, + router: () => router, singleton: () => singleton }); module.exports = __toCommonJS(src_exports); @@ -94,6 +101,9 @@ SyncLocker = __decorateClass([ singleton ], SyncLocker); +// src/common/base.controller.ts +var ROLE_ANON = "anon"; + // src/common/AsyncQueue.ts function createAsyncQueue(opts = { dedupeConcurrent: false }) { const { dedupeConcurrent } = opts; @@ -410,14 +420,129 @@ var ZRedisClient = class { ZRedisClient = __decorateClass([ singleton ], ZRedisClient); + +// src/decorators/router.ts +var RouterData = class { +}; +var RouterMap = class { +}; +RouterMap.decoratedRouters = /* @__PURE__ */ new Map(); +function router(route) { + return (target, name, value) => { + 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("\u8DEF\u7531\u4E2D\u53EA\u5141\u8BB8\u4E00\u4E2A\u7A7A\u683C"); + } + const [method, path] = split; + const key = target[name]; + let routerData = new RouterData(); + routerData.target = target; + routerData.method = method; + routerData.path = path; + 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); + } + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + let routerObj = { + data: [routerData] + }; + RouterMap.decoratedRouters.set(target[name], routerObj); + } + }; +} +function role(roles) { + return (target, name, value) => { + let roleList = []; + if (roles) { + if (Array.isArray(roles)) { + roleList = roles; + } else { + roleList = [roles]; + } + } + const key = target[name]; + let roleObj = { roles: roleList }; + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key); + Object.assign(objCurrent, roleObj); + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + RouterMap.decoratedRouters.set(target[name], roleObj); + } + }; +} +function permission(permissions) { + return (target, name, value) => { + let permissionList = [[]]; + if (permissions) { + if (Array.isArray(permissions)) { + let arr = []; + for (let sub of permissions) { + arr.push(sub.split(":")); + } + permissionList = arr; + } else { + permissionList = [permissions.split(":")]; + } + } + const key = target[name]; + let permissionObj = { permissions: permissionList }; + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key); + Object.assign(objCurrent, permissionObj); + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + RouterMap.decoratedRouters.set(target[name], permissionObj); + } + }; +} +function dept(depts) { + return (target, name, value) => { + let deptList = []; + if (depts) { + if (Array.isArray(depts)) { + deptList = depts; + } else { + deptList = [depts]; + } + } + const key = target[name]; + let deptObj = { depts: deptList }; + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key); + Object.assign(objCurrent, deptObj); + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + RouterMap.decoratedRouters.set(target[name], deptObj); + } + }; +} // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { + ROLE_ANON, + RouterData, + RouterMap, SINGLETON_KEY, SyncLocker, ZError, ZRedisClient, createAsyncQueue, createAsyncQueues, + dept, + permission, + role, + router, singleton }); //# sourceMappingURL=index.cjs.map \ No newline at end of file diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 2a85cfa..991bc86 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts"],"sourcesContent":["export { ZError } from './common/ZError'\nexport { SyncLocker } from './common/SyncLocker'\nexport * from './decorators/singleton'\nexport * from './common/AsyncQueue'\nexport { ZRedisClient } from './redis/ZRedisClient'","\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n\n// function main() {\n// const queue = createAsyncQueue()\n// queue.push(async () => {\n// console.log(0)\n// }) // returns 0\n// queue.push(async () => {\n// console.log(1)\n\n// return new Promise((resolve, reject) => {\n// setTimeout(() => {\n// console.log('12')\n// resolve()\n// }, 1000)\n// })\n// }) // returns 3\n// queue.push(async () => console.log(2)) // returns 3\n// queue.push(async () => console.log(3)) // returns 3\n// console.log('hi')\n// }\n\n// main()\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from 'util'\n\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["export * from './common/ZError'\nexport * from './common/SyncLocker'\nexport * from './common/base.controller'\nexport * from './common/AsyncQueue'\n\nexport * from './redis/ZRedisClient'\n\nexport * from './decorators/router'\nexport * from './decorators/singleton'","\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","\nexport const ROLE_ANON = 'anon'\nclass BaseController {\n \n}\nexport default BaseController\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n\n// function main() {\n// const queue = createAsyncQueue()\n// queue.push(async () => {\n// console.log(0)\n// }) // returns 0\n// queue.push(async () => {\n// console.log(1)\n\n// return new Promise((resolve, reject) => {\n// setTimeout(() => {\n// console.log('12')\n// resolve()\n// }, 1000)\n// })\n// }) // returns 3\n// queue.push(async () => console.log(2)) // returns 3\n// queue.push(async () => console.log(3)) // returns 3\n// console.log('hi')\n// }\n\n// main()\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from \"util\";\n\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import BaseController from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('路由中只允许一个空格')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * 有dept修饰器的, 需要验证部门id是否存在\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/dist/index.d.cts b/dist/index.d.cts index 1d0a55c..69bc6b0 100644 --- a/dist/index.d.cts +++ b/dist/index.d.cts @@ -1,24 +1,10 @@ export { ZError } from './common/ZError.cjs'; export { SyncLocker } from './common/SyncLocker.cjs'; +import BaseController from './common/base.controller.cjs'; +export { ROLE_ANON } from './common/base.controller.cjs'; export { AsyncQueue, createAsyncQueue, createAsyncQueues } from './common/AsyncQueue.cjs'; import { RedisClient, ClientOpts } from 'redis'; -/** - * 单例化一个class - * 使用方法: - * @singleton - * class Test {} - * new Test() === new Test() // returns `true` - * 也可以不使用 decorator - * const TestSingleton = singleton(Test) - * new TestSingleton() === new TestSingleton() //returns 'true' - */ -declare const SINGLETON_KEY: unique symbol; -type Singleton any> = T & { - [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never; -}; -declare const singleton: any>(classTarget: T) => T; - type Callback = (...args: any[]) => void; declare class ZRedisClient { pub: RedisClient; @@ -74,4 +60,42 @@ declare class ZRedisClient { protected handleSubscription: (channel: string, message: string) => void; } -export { SINGLETON_KEY, type Singleton, ZRedisClient, singleton }; +declare class RouterData { + target?: any; + method?: string; + path?: string; + fun?: Function; +} +declare class RouterMap { + static decoratedRouters: Map; +} +declare function router(route?: string): (target: BaseController, name: string, value: PropertyDescriptor) => void; +declare function role(roles?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void; +declare function permission(permissions?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void; +/** + * 有dept修饰器的, 需要验证部门id是否存在 + */ +declare function dept(depts?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void; + +/** + * 单例化一个class + * 使用方法: + * @singleton + * class Test {} + * new Test() === new Test() // returns `true` + * 也可以不使用 decorator + * const TestSingleton = singleton(Test) + * new TestSingleton() === new TestSingleton() //returns 'true' + */ +declare const SINGLETON_KEY: unique symbol; +type Singleton any> = T & { + [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never; +}; +declare const singleton: any>(classTarget: T) => T; + +export { RouterData, RouterMap, SINGLETON_KEY, type Singleton, ZRedisClient, dept, permission, role, router, singleton }; diff --git a/dist/index.d.ts b/dist/index.d.ts index ee5e8e8..500ddea 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,24 +1,10 @@ export { ZError } from './common/ZError.js'; export { SyncLocker } from './common/SyncLocker.js'; +import BaseController from './common/base.controller.js'; +export { ROLE_ANON } from './common/base.controller.js'; export { AsyncQueue, createAsyncQueue, createAsyncQueues } from './common/AsyncQueue.js'; import { RedisClient, ClientOpts } from 'redis'; -/** - * 单例化一个class - * 使用方法: - * @singleton - * class Test {} - * new Test() === new Test() // returns `true` - * 也可以不使用 decorator - * const TestSingleton = singleton(Test) - * new TestSingleton() === new TestSingleton() //returns 'true' - */ -declare const SINGLETON_KEY: unique symbol; -type Singleton any> = T & { - [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never; -}; -declare const singleton: any>(classTarget: T) => T; - type Callback = (...args: any[]) => void; declare class ZRedisClient { pub: RedisClient; @@ -74,4 +60,42 @@ declare class ZRedisClient { protected handleSubscription: (channel: string, message: string) => void; } -export { SINGLETON_KEY, type Singleton, ZRedisClient, singleton }; +declare class RouterData { + target?: any; + method?: string; + path?: string; + fun?: Function; +} +declare class RouterMap { + static decoratedRouters: Map; +} +declare function router(route?: string): (target: BaseController, name: string, value: PropertyDescriptor) => void; +declare function role(roles?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void; +declare function permission(permissions?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void; +/** + * 有dept修饰器的, 需要验证部门id是否存在 + */ +declare function dept(depts?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void; + +/** + * 单例化一个class + * 使用方法: + * @singleton + * class Test {} + * new Test() === new Test() // returns `true` + * 也可以不使用 decorator + * const TestSingleton = singleton(Test) + * new TestSingleton() === new TestSingleton() //returns 'true' + */ +declare const SINGLETON_KEY: unique symbol; +type Singleton any> = T & { + [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never; +}; +declare const singleton: any>(classTarget: T) => T; + +export { RouterData, RouterMap, SINGLETON_KEY, type Singleton, ZRedisClient, dept, permission, role, router, singleton }; diff --git a/dist/index.js b/dist/index.js index ddee5e8..2a78a73 100644 --- a/dist/index.js +++ b/dist/index.js @@ -66,6 +66,9 @@ SyncLocker = __decorateClass([ singleton ], SyncLocker); +// src/common/base.controller.ts +var ROLE_ANON = "anon"; + // src/common/AsyncQueue.ts function createAsyncQueue(opts = { dedupeConcurrent: false }) { const { dedupeConcurrent } = opts; @@ -382,13 +385,128 @@ var ZRedisClient = class { ZRedisClient = __decorateClass([ singleton ], ZRedisClient); + +// src/decorators/router.ts +var RouterData = class { +}; +var RouterMap = class { +}; +RouterMap.decoratedRouters = /* @__PURE__ */ new Map(); +function router(route) { + return (target, name, value) => { + 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("\u8DEF\u7531\u4E2D\u53EA\u5141\u8BB8\u4E00\u4E2A\u7A7A\u683C"); + } + const [method, path] = split; + const key = target[name]; + let routerData = new RouterData(); + routerData.target = target; + routerData.method = method; + routerData.path = path; + 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); + } + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + let routerObj = { + data: [routerData] + }; + RouterMap.decoratedRouters.set(target[name], routerObj); + } + }; +} +function role(roles) { + return (target, name, value) => { + let roleList = []; + if (roles) { + if (Array.isArray(roles)) { + roleList = roles; + } else { + roleList = [roles]; + } + } + const key = target[name]; + let roleObj = { roles: roleList }; + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key); + Object.assign(objCurrent, roleObj); + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + RouterMap.decoratedRouters.set(target[name], roleObj); + } + }; +} +function permission(permissions) { + return (target, name, value) => { + let permissionList = [[]]; + if (permissions) { + if (Array.isArray(permissions)) { + let arr = []; + for (let sub of permissions) { + arr.push(sub.split(":")); + } + permissionList = arr; + } else { + permissionList = [permissions.split(":")]; + } + } + const key = target[name]; + let permissionObj = { permissions: permissionList }; + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key); + Object.assign(objCurrent, permissionObj); + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + RouterMap.decoratedRouters.set(target[name], permissionObj); + } + }; +} +function dept(depts) { + return (target, name, value) => { + let deptList = []; + if (depts) { + if (Array.isArray(depts)) { + deptList = depts; + } else { + deptList = [depts]; + } + } + const key = target[name]; + let deptObj = { depts: deptList }; + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key); + Object.assign(objCurrent, deptObj); + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + RouterMap.decoratedRouters.set(target[name], deptObj); + } + }; +} export { + ROLE_ANON, + RouterData, + RouterMap, SINGLETON_KEY, SyncLocker, ZError, ZRedisClient, createAsyncQueue, createAsyncQueues, + dept, + permission, + role, + router, singleton }; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index a61dcbd..38acfed 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts"],"sourcesContent":["\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n\n// function main() {\n// const queue = createAsyncQueue()\n// queue.push(async () => {\n// console.log(0)\n// }) // returns 0\n// queue.push(async () => {\n// console.log(1)\n\n// return new Promise((resolve, reject) => {\n// setTimeout(() => {\n// console.log('12')\n// resolve()\n// }, 1000)\n// })\n// }) // returns 3\n// queue.push(async () => console.log(2)) // returns 3\n// queue.push(async () => console.log(3)) // returns 3\n// console.log('hi')\n// }\n\n// main()\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from 'util'\n\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file +{"version":3,"sources":["../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","\nexport const ROLE_ANON = 'anon'\nclass BaseController {\n \n}\nexport default BaseController\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n\n// function main() {\n// const queue = createAsyncQueue()\n// queue.push(async () => {\n// console.log(0)\n// }) // returns 0\n// queue.push(async () => {\n// console.log(1)\n\n// return new Promise((resolve, reject) => {\n// setTimeout(() => {\n// console.log('12')\n// resolve()\n// }, 1000)\n// })\n// }) // returns 3\n// queue.push(async () => console.log(2)) // returns 3\n// queue.push(async () => console.log(3)) // returns 3\n// console.log('hi')\n// }\n\n// main()\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from \"util\";\n\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import BaseController from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('路由中只允许一个空格')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * 有dept修饰器的, 需要验证部门id是否存在\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/package.json b/package.json index a5e756d..ee7ab24 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "type": "module", "scripts": { "build": "tsup", - "test": "echo \"Error: no test specified\" && exit 1" + "lint": "eslint --ext .ts src/**", + "format": "eslint --ext .ts src/** --fix" }, "author": "", "license": "ISC", @@ -38,6 +39,12 @@ }, "devDependencies": { "@types/redis": "^2.8.28", + "@typescript-eslint/eslint-plugin": "^4.25.0", + "@typescript-eslint/parser": "^4.25.0", + "eslint": "^7.27.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^3.4.0", + "prettier": "^2.3.0", "ts-node": "^10.9.2", "tsup": "^8.0.1", "typescript": "^5.3.3" diff --git a/src/common/base.controller.ts b/src/common/base.controller.ts new file mode 100644 index 0000000..bb230ec --- /dev/null +++ b/src/common/base.controller.ts @@ -0,0 +1,6 @@ + +export const ROLE_ANON = 'anon' +class BaseController { + +} +export default BaseController 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/index.ts b/src/index.ts index d4fd04a..cbf6f9e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,9 @@ -export { ZError } from './common/ZError' -export { SyncLocker } from './common/SyncLocker' -export * from './decorators/singleton' +export * from './common/ZError' +export * from './common/SyncLocker' +export * from './common/base.controller' export * from './common/AsyncQueue' -export { ZRedisClient } from './redis/ZRedisClient' \ No newline at end of file + +export * from './redis/ZRedisClient' + +export * from './decorators/router' +export * from './decorators/singleton' \ No newline at end of file diff --git a/src/redis/ZRedisClient.ts b/src/redis/ZRedisClient.ts index 3e938b7..2d55ac8 100644 --- a/src/redis/ZRedisClient.ts +++ b/src/redis/ZRedisClient.ts @@ -1,6 +1,6 @@ import { singleton } from 'decorators/singleton' import { ClientOpts, RedisClient, createClient } from 'redis' -import { promisify } from 'util' +import { promisify } from "util"; type Callback = (...args: any[]) => void diff --git a/yarn.lock b/yarn.lock index f9e2587..44878db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,32 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/highlight@^7.10.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -124,6 +150,21 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@ethereumjs/common@2.6.5", "@ethereumjs/common@^2.6.4": version "2.6.5" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" @@ -331,6 +372,20 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -597,6 +652,11 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== +"@types/json-schema@^7.0.7": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/keyv@^3.1.4": version "3.1.4" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" @@ -644,6 +704,76 @@ dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@^4.25.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" + integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== + dependencies: + "@typescript-eslint/experimental-utils" "4.33.0" + "@typescript-eslint/scope-manager" "4.33.0" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.25.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== + dependencies: + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + +"@typescript-eslint/typescript-estree@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== + dependencies: + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" + abortcontroller-polyfill@^1.7.5: version "1.7.5" resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" @@ -657,17 +787,27 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^8.1.1: version "8.3.2" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + acorn@^8.4.1: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -ajv@^6.12.3: +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -677,6 +817,21 @@ ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + 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-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -687,7 +842,14 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^4.0.0: +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -717,6 +879,13 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -739,6 +908,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -859,6 +1033,14 @@ body-parser@^1.16.0: type-is "~1.6.18" unpipe "1.0.0" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.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" + brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" @@ -980,11 +1162,33 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4: get-intrinsic "^1.2.1" set-function-length "^1.1.1" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.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.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -1036,6 +1240,13 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1043,6 +1254,11 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -1060,6 +1276,11 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -1144,7 +1365,7 @@ cross-fetch@^4.0.0: dependencies: node-fetch "^2.6.12" -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1180,7 +1401,7 @@ debug@2.6.9, debug@^2.2.0: dependencies: ms "2.0.0" -debug@^4.3.1: +debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1206,6 +1427,11 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" @@ -1252,6 +1478,13 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -1310,6 +1543,14 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +enquirer@^2.3.5: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + es5-ext@^0.10.35, es5-ext@^0.10.50: version "0.10.62" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" @@ -1375,6 +1616,149 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.3.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-plugin-prettier@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" + integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.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-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.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@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.27.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.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.yarnpkg.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.yarnpkg.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.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -1582,11 +1966,16 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.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.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + fast-glob@^3.2.9: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -1603,6 +1992,11 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fastq@^1.6.0: version "1.16.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" @@ -1610,6 +2004,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.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.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1630,6 +2031,20 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -1690,6 +2105,11 @@ fs-minipass@^1.2.7: dependencies: minipass "^2.6.0" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -1700,6 +2120,11 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" @@ -1747,6 +2172,18 @@ glob@^10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.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" + global@~4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -1755,6 +2192,13 @@ global@~4.4.0: min-document "^2.19.0" process "^0.11.10" +globals@^13.6.0, globals@^13.9.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + globby@^11.0.3: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -1828,6 +2272,16 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" @@ -1955,12 +2409,38 @@ ieee754@^1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.8, ignore@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== -inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.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.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.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.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2012,7 +2492,7 @@ is-generator-function@^1.0.7: dependencies: has-tostringtag "^1.0.0" -is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -2080,6 +2560,19 @@ js-sha3@^0.5.7: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -2095,11 +2588,21 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.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.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -2131,13 +2634,21 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" -keyv@^4.0.0: +keyv@^4.0.0, keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.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" + lilconfig@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" @@ -2153,11 +2664,21 @@ load-tsconfig@^0.2.3: resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" @@ -2168,6 +2689,13 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + "lru-cache@^9.1.1 || ^10.0.0": version "10.1.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" @@ -2274,6 +2802,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^9.0.1: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -2399,6 +2934,11 @@ nano-json-stream-parser@^0.1.2: resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -2480,7 +3020,7 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -2494,6 +3034,18 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +optionator@^0.9.1: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" @@ -2504,6 +3056,13 @@ p-cancelable@^3.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-headers@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" @@ -2514,6 +3073,11 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -2571,11 +3135,33 @@ postcss-load-config@^4.0.1: lilconfig "^3.0.0" yaml "^2.3.4" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.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.yarnpkg.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.3.0: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -2713,6 +3299,11 @@ redis@^3.1.2: redis-errors "^1.2.0" redis-parser "^3.0.0" +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + request@^2.79.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -2739,11 +3330,21 @@ request@^2.79.0: tunnel-agent "^0.6.0" uuid "^3.3.2" +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -2761,6 +3362,13 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -2834,6 +3442,13 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" +semver@^7.2.1, semver@^7.3.5: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -2953,6 +3568,15 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + source-map@0.8.0-beta.0: version "0.8.0-beta.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" @@ -2960,6 +3584,11 @@ source-map@0.8.0-beta.0: dependencies: whatwg-url "^7.0.0" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + sshpk@^1.7.0: version "1.18.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" @@ -2985,8 +3614,7 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3038,6 +3666,11 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + sucrase@^3.20.3: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" @@ -3051,6 +3684,20 @@ sucrase@^3.20.3: pirates "^4.0.1" ts-interface-checker "^0.1.9" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + swarm-js@^0.1.40: version "0.1.42" resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" @@ -3068,6 +3715,17 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" +table@^6.0.9: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + tar@^4.0.2: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" @@ -3081,6 +3739,11 @@ tar@^4.0.2: safe-buffer "^5.2.1" yallist "^3.1.1" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" @@ -3161,6 +3824,11 @@ ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tsup@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.0.1.tgz#04a0170f7bbe77e81da3b53006b0a40282291833" @@ -3181,6 +3849,13 @@ tsup@^8.0.1: sucrase "^3.20.3" tree-kill "^1.2.2" +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -3203,6 +3878,18 @@ tweetnacl@^1.0.3: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.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.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -3313,6 +4000,11 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +v8-compile-cache@^2.0.3: + version "2.4.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== + varint@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" @@ -3696,6 +4388,11 @@ yallist@^3.0.0, yallist@^3.1.1: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2"