From e743a53f1848335c36b5581b364062b38b83e825 Mon Sep 17 00:00:00 2001 From: JianMiau Date: Thu, 31 Aug 2023 19:28:35 +0800 Subject: [PATCH] [mod] TSRPC --- .env | 9 + .eslintrc.json | 368 ++++++ .gitignore | 8 +- .mocharc.js | 11 + .vscode/launch.json | 22 + .vscode/settings.json | 3 + Dockerfile | 47 +- README.md | 31 + docs/openapi.json | 164 +++ docs/tsapi.md | 34 + package.json | 50 +- src/Client/Client.ts | 106 -- src/DataReceived/MainControlData.ts | 28 - src/Lobby/Lobby.ts | 50 - src/MainControl/MainControl.ts | 21 - src/NetManager/WebSocketServerClass.ts | 79 -- src/Utils/DBTools.ts | 44 - src/Utils/Tools.ts | 13 - src/api/ApiAccountLogin.ts | 24 + src/api/ApiLobbyList.ts | 12 + src/api/ApiSend.ts | 26 + src/app.ts | 18 - src/component/Client/Client.ts | 128 ++ src/component/Client/User.ts | 29 + src/component/Lobby/Lobby.ts | 77 ++ src/{ => component}/Room/Room.ts | 8 + src/define/Request/.ExampleCodeRequest.ts | 28 - src/define/Request/LobbyRequest.ts | 23 - src/index.ts | 34 + src/shared/protocols | 1 + test/api/ApiSend.test.ts | 53 + test/tsconfig.json | 19 + tsconfig.json | 29 +- tsrpc.config.ts | 38 + yarn.lock | 1335 +++++++++++++++++++++ 35 files changed, 2494 insertions(+), 476 deletions(-) create mode 100644 .env create mode 100644 .eslintrc.json create mode 100644 .mocharc.js create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 docs/openapi.json create mode 100644 docs/tsapi.md delete mode 100644 src/Client/Client.ts delete mode 100644 src/DataReceived/MainControlData.ts delete mode 100644 src/Lobby/Lobby.ts delete mode 100644 src/MainControl/MainControl.ts delete mode 100644 src/NetManager/WebSocketServerClass.ts delete mode 100644 src/Utils/DBTools.ts delete mode 100644 src/Utils/Tools.ts create mode 100644 src/api/ApiAccountLogin.ts create mode 100644 src/api/ApiLobbyList.ts create mode 100644 src/api/ApiSend.ts delete mode 100644 src/app.ts create mode 100644 src/component/Client/Client.ts create mode 100644 src/component/Client/User.ts create mode 100644 src/component/Lobby/Lobby.ts rename src/{ => component}/Room/Room.ts (75%) delete mode 100644 src/define/Request/.ExampleCodeRequest.ts delete mode 100644 src/define/Request/LobbyRequest.ts create mode 100644 src/index.ts create mode 160000 src/shared/protocols create mode 100644 test/api/ApiSend.test.ts create mode 100644 test/tsconfig.json create mode 100644 tsrpc.config.ts create mode 100644 yarn.lock diff --git a/.env b/.env new file mode 100644 index 0000000..136a84b --- /dev/null +++ b/.env @@ -0,0 +1,9 @@ +URLPATH = /linewebhook +PORT = 3003 + +# DB---------------------------------------------- +DB_HOST = 192.168.0.15 +DB_PORT = 3307 +DB_USER = jianmiau +DB_PASSWORD = VQ*ZetC7xcc9%dTW +DB_DATABASE = badminton \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..d3bbc45 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,368 @@ +{ + "env": { + "browser": true, + "es2021": true, + "jest": true + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "overrides": [], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "react", + "@typescript-eslint", + "react-hooks", + "prettier" + ], + "rules": { + "no-alert": 0, //禁止使用alert confirm prompt + "no-bitwise": 0, //禁止使用按位运算符 + "no-console": "off", //禁止使用console + "no-continue": 0, //禁止使用continue + "no-debugger": 2, //禁止使用debugger + "no-delete-var": 2, //不能对var声明的变量使用delete操作符 + "no-div-regex": 1, //不能使用看起来像除法的正则表达式/=foo/ + "no-dupe-args": 2, //函数参数不能重复 + "no-duplicate-case": 2, //switch中的case标签不能重复 + "no-else-return": "off", //如果if语句里面有return,后面不能跟else语句 + "no-empty-label": "off", //禁止使用空label + "no-eq-null": "off", //禁止对null使用==或!=运算符 + "no-extend-native": "off", //禁止扩展native对象 + "no-extra-parens": "off", //禁止非必要的括号 + "no-extra-semi": 2, //禁止多余的冒号 + "no-floating-decimal": 2, //禁止省略浮点数中的0 .5 3. + "no-implicit-coercion": "off", //禁止隐式转换 + "no-inline-comments": 0, //禁止行内备注 + "no-invalid-this": 2, //禁止无效的this,只能用在构造器,类,对象字面量 + "no-iterator": 2, //禁止使用__iterator__ 属性 + "no-lonely-if": "off", //禁止else语句内只有if语句 + "no-mixed-requires": [ + 0, + false + ], //声明时不能混用声明类型 + "no-mixed-spaces-and-tabs": "off", //禁止混用tab和空格 + "no-multiple-empty-lines": [ + 1, + { + "max": 2 + } + ], //空行最多不能超过2行 + "no-nested-ternary": 0, //禁止使用嵌套的三目运算 + "no-new": "off", //禁止在使用new构造一个实例后不赋值 + "no-new-require": 2, //禁止使用new require + "no-param-reassign": "off", //禁止给参数重新赋值 + "no-path-concat": 0, //node中不能使用__dirname或__filename做路径拼接 + "no-plusplus": 0, //禁止使用++,-- + "no-process-env": 0, //禁止使用process.env + "no-process-exit": 0, //禁止使用process.exit() + "no-redeclare": "off", //禁止重复声明变量 + "no-restricted-modules": 0, //如果禁用了指定模块,使用就会报错 + "no-return-assign": "off", //return 语句中不能有赋值表达式 + "no-self-compare": 2, //不能比较自身 + "no-sequences": 0, //禁止使用逗号运算符 + "no-shadow": "off", //外部作用域中的变量不能与它所包含的作用域中的变量或参数同名 + "no-sync": 0, //nodejs 禁止同步方法 + "no-ternary": 0, //禁止使用三目运算符 + "no-this-before-super": 0, //在调用super()之前不能使用this或super + "no-throw-literal": 2, //禁止抛出字面量错误 throw "error"; + "no-undef": "off", //不能有未定义的变量 + "no-undef-init": "off", //变量初始化时不能直接给它赋值为undefined + "no-undefined": "off", //不能使用undefined + "no-unexpected-multiline": 2, //避免多行表达式 + "no-underscore-dangle": "off", //标识符不能以_开头或结尾 + "no-unneeded-ternary": 2, //禁止不必要的嵌套 var isYes = answer === 1 ? true : false; + "no-unused-expressions": "off", //禁止无用的表达式 + "no-unused-vars": "off", //不能有声明后未被使用的变量或参数 + "no-use-before-define": "off", //未定义前不能使用 + "no-useless-call": "off", //禁止不必要的call和apply + "no-void": "off", //禁用void操作符 + "no-var": 0, //禁用var,用let和const代替 + "no-warning-comments": "off", //不能有警告备注 + "no-array-constructor": "error", // 禁止使用数组构造器 + "no-caller": "error", // 禁止使用arguments.caller或arguments.callee + "no-catch-shadow": "error", // 禁止catch子句参数与外部作用域变量同名 + "no-class-assign": "error", // 禁止给类赋值 + "no-cond-assign": [ + "error", + "except-parens" + ], // 禁止在条件表达式中使用赋值语句 + "no-constant-condition": "error", // 禁止在条件中使用常量表达式 if(true) if(1) + "no-control-regex": "error", // 禁止在正则表达式中使用控制字符 + "no-dupe-keys": "error", // 在创建对象字面量时不允许键重复 {a: 1, a: 1} + "no-empty": "error", // 块语句中的内容不能为空 + "no-empty-character-class": "error", // 正则表达式中的[]内容不能为空 + "no-eval": "error", // 禁止使用eval + "no-ex-assign": "error", // 禁止给catch语句中的异常参数赋值 + "no-extra-bind": "error", // 禁止不必要的函数绑定 + "no-extra-boolean-cast": "off", // 禁止不必要的bool转换 + "no-fallthrough": "error", // 禁止switch穿透 + "no-func-assign": "error", // 禁止重复的函数声明 + "no-implied-eval": "error", // 禁止使用隐式eval + "no-inner-declarations": "off", // 禁止在块语句中使用声明函数 + "no-invalid-regexp": "error", // 禁止无效的正则表达式 + "no-irregular-whitespace": "error", // 不能有不规则的空格 + "no-label-var": "error", // label名不能与var声明的变量名相同 + "no-labels": "error", // 禁止标签声明 + "no-lone-blocks": "error", // 禁止不必要的嵌套块 + "no-loop-func": "error", // 禁止在循环中使用函数(如果没有引用外部变量不形成闭包就可以) + "no-multi-spaces": "error", // 不能用多余的空格 + "no-multi-str": "error", // 字符串不能用\换行 + "no-native-reassign": "error", // 不能重写native对象 + "no-negated-in-lhs": "error", // in 操作符的左边不能有! + "no-new-func": "error", // 禁止使用new Function + "no-new-object": "error", // 禁止使用new Object() + "no-new-wrappers": "error", // 禁止使用new创建包装实例,new String new Boolean new Number + "no-obj-calls": "error", // 不能调用内置的全局对象,比如Math() JSON() + "no-octal": "error", // 禁止使用八进制数字(因为八进制数字以0开头) + "no-octal-escape": "error", // 禁止使用八进制转义序列 + "no-proto": "error", // 禁止使用__proto__属性(按照标准,__proto__为私有属性,不应公开) + "no-regex-spaces": "error", // 禁止在正则表达式字面量中使用多个空格 /foo bar/ + "no-script-url": "off", // 禁止使用javascript:void(0) + "no-shadow-restricted-names": "error", // 严格模式中规定的限制标识符不能作为声明时的变量名使用 + "no-spaced-func": "error", // 函数调用时 函数名与()之间不能有空格 + "no-sparse-arrays": "error", // 禁止稀疏数组, [1,,2] + "no-trailing-spaces": [ + "error", + { + "skipBlankLines": true + } + ], // 一行结束后面不要有空格( 空白行忽略 ) + "no-unreachable": "error", // 不能有无法执行的代码 + "no-const-assign": "error", // 禁止修改const声明的变量 + "no-with": "error", // 禁用with + "comma-dangle": "off", // 数组或对象最后不允许出现多余的逗号 + "comma-spacing": "error", // 逗号前面不允许有空格,后面还有东西的时候必须有一个空格 + "curly": [ + "error", + "multi-line" + ], // 块级代码需要换行的时候必须使用 {}将代码裹起来 + "eqeqeq": "off", // 必须使用全等 + "indent": [ + "off", + "tab", + { + "SwitchCase": 1 + } + ], // 缩进用tab + "key-spacing": [ + "error", + { + "beforeColon": false, + "afterColon": true + } + ], // 对象字面量中冒号的后面必须有空格,前面不允许有空格 + "keyword-spacing": "off", // 关键字前后必须存在空格 + "new-parens": "error", // new时必须加小括号 const person = new Person(); + "quotes": [ + "error", + "double", + { + "allowTemplateLiterals": true + } + ], // 引号类型 '' + "semi": [ + "error", + "always" + ], // 语句必须分号结尾 + "semi-spacing": [ + 0, + { + "before": false, + "after": true + } + ], // 分号前面不允许有空格,后面有其他东西的时候必须空一空格 + "space-before-blocks": [ + "error", + "always" + ], // 不以新行开始的块 { 前面要有空格 + // "space-before-function-paren": ["error", "never"], // 函数定义时括号前面不允许有空格 + "space-infix-ops": "error", // 中缀操作符周围必须有空格 a + b + "space-unary-ops": [ + "error", + { + "words": true, + "nonwords": false + } + ], // 一元运算符的前/后如果是单词则空一空格,如果是运算符则不需要空空格 new Foo √ 1++ √ + // "spaced-comment": ["error", "always", { "markers": ["*!"] }], // 注释风格, 双斜杠后面空一格空格再写注释 + "strict": [ + "error", + "global" + ], // 使用全局严格模式 + "use-isnan": "error", // 禁止比较时使用NaN,只能用isNaN() + "arrow-parens": 0, //箭头函数用小括号括起来 + "arrow-spacing": 0, //=>的前/后括号 + "accessor-pairs": 0, //在对象中使用getter/setter + "block-scoped-var": 0, //块语句中使用var + "brace-style": "off", //大括号风格 + "callback-return": "off", //避免多次调用回调什么的 + "comma-style": [ + "error", + "last" + ], //逗号风格,换行时在行首还是行尾 + "complexity": [ + 0, + 11 + ], //循环复杂度 + "computed-property-spacing": [ + 0, + "never" + ], //是否允许计算后的键名什么的 + "consistent-return": 0, //return 后面是否允许省略 + "consistent-this": "off", //this别名 + "constructor-super": 0, //非派生类不能调用super,派生类必须调用super + "default-case": "off", //switch语句最后必须有default + "dot-location": 0, //对象访问符的位置,换行的时候在行首还是行尾 + "dot-notation": [ + 0, + { + "allowKeywords": true + } + ], //避免不必要的方括号 + "eol-last": 0, //文件以单一的换行符结束 + "func-names": 0, //函数表达式必须有名字 + "func-style": [ + 0, + "declaration" + ], //函数风格,规定只能使用函数声明/函数表达式 + "generator-star-spacing": 0, //生成器函数*的前后空格 + "guard-for-in": 0, //for in循环要用if语句过滤 + "handle-callback-err": 0, //nodejs 处理错误 + "id-length": 0, //变量名长度 + "init-declarations": 0, //声明时必须赋初值 + "lines-around-comment": 0, //行前/行后备注 + "max-depth": [ + 0, + 4 + ], //嵌套块深度 + "max-len": [ + 0, + 80, + 4 + ], //字符串最大长度 + "max-nested-callbacks": [ + 0, + 2 + ], //回调嵌套深度 + "max-params": [ + 0, + 3 + ], //函数最多只能有3个参数 + "max-statements": [ + 0, + 10 + ], //函数内最多有几个声明 + "new-cap": "off", //函数名首行大写必须使用new方式调用,首行小写必须用不带new方式调用 + "newline-after-var": "off", //变量声明后是否需要空一行 + "object-shorthand": 0, //强制对象字面量缩写语法 + "one-var": "off", //连续声明 + "operator-assignment": [ + 0, + "always" + ], //赋值运算符 += -=什么的 + "operator-linebreak": "off", //换行时运算符在行尾还是行首 + "padded-blocks": 0, //块语句内行首行尾是否要空行 + "prefer-spread": 0, //首选展开运算 + "prefer-reflect": 0, //首选Reflect的方法 + "quote-props": "off", //对象字面量中的属性名是否强制双引号 + "radix": "off", //parseInt必须指定第二个参数 + "id-match": 0, //命名检测 + "sort-vars": 0, //变量声明时排序 + "space-after-keywords": [ + 0, + "always" + ], //关键字后面是否要空一格 + "space-before-function-paren": [ + 0, + "always" + ], //函数定义时括号前面要不要有空格 + "space-in-parens": [ + 0, + "never" + ], //小括号里面要不要有空格 + "space-return-throw-case": "off", //return throw case后面要不要加空格 + "spaced-comment": 0, //注释风格不要有空格什么的 + "valid-jsdoc": 0, //jsdoc规则 + "valid-typeof": "error", //必须使用合法的typeof的值 + "vars-on-top": "error", //var必须放在作用域顶部 + "wrap-iife": [ + "error", + "inside" + ], //立即执行函数表达式的小括号风格 + "wrap-regex": 0, //正则表达式字面量用小括号包起来 + "yoda": [ + "error", + "never" + ], //禁止尤达条件 + "linebreak-style": [ + 0, + "windows" + ], //换行风格 + "array-bracket-spacing": [ + 2, + "never" + ], //是否允许非空数组里面有多余的空格 + "react/react-in-jsx-scope": "off", + "camelcase": "off", + "block-spacing": "error", + "no-duplicate-imports": "error", + "require-yield": "off", + "prefer-const": "off", + "object-curly-spacing": [ + "error", + "always" + ], + "react/jsx-curly-spacing": [ + "error", + "never" + ], + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/prefer-namespace-keyword": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/explicit-function-return-type": [ + "off", + { + "allowExpressions": true + } + ], + "@typescript-eslint/typedef": [ + "warn", + { + "arrayDestructuring": false, + "arrowParameter": false, + "objectDestructuring": false, + "memberVariableDeclaration": true, + "parameter": true, + "propertyDeclaration": true, + "variableDeclaration": false, + "variableDeclarationIgnoreFunction": true + } + ] + }, + "settings": { + "import/resolver": { + "typescript": {} + }, + "react": { + "version": "detect" + } + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3467cb6..dbf2fae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,3 @@ node_modules -.env -package-lock.json -*.pem -.foreverignore -.vscode -/yarn.lock +dist +.DS_STORE \ No newline at end of file diff --git a/.mocharc.js b/.mocharc.js new file mode 100644 index 0000000..c7aec06 --- /dev/null +++ b/.mocharc.js @@ -0,0 +1,11 @@ +module.exports = { + require: [ + 'ts-node/register', + ], + timeout: 999999, + exit: true, + spec: [ + './test/**/*.test.ts' + ], + 'preserve-symlinks': true +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..ed52292 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + // 使用 IntelliSense 以得知可用的屬性。 + // 暫留以檢視現有屬性的描述。 + // 如需詳細資訊,請瀏覽: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "attach", + "name": "Attach to Remote", + // "address": "jianmiau.tk:9229/87f42d5b-97bf-4d25-a4d7-37306985459a", + "address": "192.168.5.36:9229/87f42d5b-97bf-4d25-a4d7-37306985459a", + "port": 9229, + "localRoot": "${workspaceFolder}", + "remoteRoot": "D:/Users/JianMiau/Downloads/guesswhoiams/backend", + // "remoteRoot": "/volume1/homes/JianMiau/www/line-bot-ts", + "skipFiles": [ + "/**" + ] + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e9b3c5f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules\\typescript\\lib" +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 1b7093b..d1d63a4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,30 @@ -# sudo docker build -t linebotts . -# sudo docker exec -it 2e8e3995aa52 /bin/bash +FROM node -# 選擇node -FROM node:19.4.0 +# 使用淘宝 NPM 镜像(国内机器构建推荐启用) +# RUN npm config set registry https://registry.npm.taobao.org/ -# 指定NODE_ENV為production -ENV NODE_ENV=production +# npm install +ADD package*.json /src/ +WORKDIR /src +RUN npm i + +# build +ADD . /src +RUN npm run build + +# clean +RUN npm prune --production + +# move +RUN rm -rf /app \ + && mv dist /app \ + && mv node_modules /app/ \ + && rm -rf /src + +# ENV +ENV NODE_ENV production + +EXPOSE 3000 -# 指定預設/工作資料夾 WORKDIR /app - -# 只copy package.json檔案 -COPY ["package.json", "./"] - -# 安裝dependencies -# If you are building your code for production -# RUN npm ci --only=production -RUN npm install - -# copy其餘目錄及檔案 -COPY . . - -# 指定啟動container後執行命令 -CMD [ "npm", "start" ] \ No newline at end of file +CMD node index.js \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d79ac50 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# TSRPC Server + +## Usage +### Local dev server + +Dev server would restart automatically when code changed. + +``` +npm run dev +``` + +### Build +``` +npm run build +``` + +### Generate API document + +Generate API document in swagger/openapi and markdown format. + +```shell +npm run doc +``` + +### Run unit Test +Execute `npm run dev` first, then execute: +``` +npm run test +``` + +--- \ No newline at end of file diff --git a/docs/openapi.json b/docs/openapi.json new file mode 100644 index 0000000..a597510 --- /dev/null +++ b/docs/openapi.json @@ -0,0 +1,164 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "TSRPC Open API", + "version": "1.0.0" + }, + "paths": { + "/Send": { + "post": { + "operationId": "Send", + "requestBody": { + "description": "Req", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PtlSend_ReqSend" + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "ApiReturn", + "properties": { + "isSucc": { + "type": "boolean", + "enum": [ + true + ], + "default": true + }, + "res": { + "$ref": "#/components/schemas/PtlSend_ResSend" + } + } + } + } + } + }, + "default": { + "description": "Error", + "$ref": "#/components/responses/error" + } + } + } + } + }, + "components": { + "schemas": { + "MsgChat_MsgChat": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "time": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "content", + "time" + ] + }, + "PtlSend_ReqSend": { + "type": "object", + "properties": { + "content": { + "type": "string" + } + }, + "required": [ + "content" + ] + }, + "PtlSend_ResSend": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "time" + ] + }, + "?bson_ObjectID": { + "type": "string" + }, + "?bson_ObjectId": { + "type": "string" + }, + "?mongodb_ObjectID": { + "type": "string" + }, + "?mongodb_ObjectId": { + "type": "string" + } + }, + "responses": { + "error": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "type": "object", + "title": "API 错误", + "description": "业务错误(ApiError)返回 HTTP 状态码 200,其它错误返回 HTTP 状态码 500", + "properties": { + "isSucc": { + "type": "boolean", + "enum": [ + false + ], + "default": false + }, + "err": { + "type": "object", + "description": "TsrpcError", + "properties": { + "message": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "ApiError", + "NetworkError", + "ServerError", + "ClientError" + ] + }, + "code": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ], + "nullable": true + } + }, + "required": [ + "message", + "type" + ] + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/docs/tsapi.md b/docs/tsapi.md new file mode 100644 index 0000000..96ee360 --- /dev/null +++ b/docs/tsapi.md @@ -0,0 +1,34 @@ + +# TSRPC API 接口文档 + +## 通用说明 + +- 所有请求方法均为 `POST` +- 所有请求均需加入以下 Header : + - `Content-Type: application/json` + +## 目录 + +- [Send](#/Send) + +--- + +## Send + +**路径** +- POST `/Send` + +**请求** +```ts +interface ReqSend { + content: string +} +``` + +**响应** +```ts +interface ResSend { + time: /*datetime*/ string +} +``` + diff --git a/package.json b/package.json index 6d48f59..7b2e2b4 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,29 @@ { - "name": "line-bot-ts", - "version": "1.0.0", - "description": "", - "main": "src/app.ts", + "name": "guesswhoiams-backend", + "version": "0.1.0", + "main": "index.js", + "private": true, "scripts": { - "start": "nodemon src/app.ts", - "test": "nodemon src/app.ts", - "dev": "nodemon --exec \"node --require ts-node/register --inspect=192.168.5.36:9229 src/app.ts\"", - "build": "tsc --project ./" + "dev": "tsrpc-cli dev", + "debug": "nodemon --exec \"node --require ts-node/register --inspect=192.168.5.36:9229 src/index.ts\"", + "build": "tsrpc-cli build", + "doc": "tsrpc-cli doc", + "test": "mocha test/**/*.test.ts", + "proto": "tsrpc-cli proto", + "sync": "tsrpc-cli sync", + "api": "tsrpc-cli api" }, - "author": "", - "license": "ISC", "devDependencies": { - "@types/dateformat": "^5.0.0", - "@types/express": "^4.17.15", - "@types/mysql": "^2.15.21", - "@types/node": "^18.11.18", - "typescript": "^4.9.4" + "@types/mocha": "^8.2.3", + "@types/node": "^15.14.9", + "mocha": "^9.2.2", + "onchange": "^7.1.0", + "ts-node": "^10.9.1", + "tsrpc-cli": "^2.4.5", + "typescript": "^4.9.5" }, "dependencies": { - "@line/bot-sdk": "^7.5.2", - "@types/ws": "^8.5.5", - "dateformat": "^4.5.1", - "dayjs": "^1.11.7", - "dotenv": "^16.0.3", - "express": "^4.18.2", - "fs": "^0.0.1-security", - "mysql": "^2.18.1", - "nodemon": "^2.0.20", - "ts-node": "^10.9.1", - "ws": "^8.13.0", - "xmlhttprequest": "^1.8.0" + "dayjs": "^1.11.9", + "tsrpc": "^3.4.12" } -} +} \ No newline at end of file diff --git a/src/Client/Client.ts b/src/Client/Client.ts deleted file mode 100644 index edb3abe..0000000 --- a/src/Client/Client.ts +++ /dev/null @@ -1,106 +0,0 @@ - -import _ws from "ws" -import { Encoding } from "../Engine/CatanEngine/CSharp/System/Text/Encoding" -import { INetResponse } from "../Engine/CatanEngine/NetManagerV2/Core/INetResponse" -import WebSocketServerClass from "../NetManager/WebSocketServerClass" - -/** - * Client - */ -export default class Client { - - //#region private - - private ws: _ws = undefined - private clientCount: number = undefined - - //#endregion - - //#region Lifecycle - - /** - * - */ - constructor(ws: _ws, clientCount: number) { - this.ws = ws - this.clientCount = clientCount - - // 當收到client消息時 - ws.on('message', this.onMessage.bind(this)) - // 當連線關閉 - ws.on('close', this.onClose.bind(this)) - } - - //#endregion - - //#region Custom - - private onMessage(buffer: _ws.RawData): void { - // 收回來是 Buffer 格式、需轉成字串 - const dataStr: string = "[" + buffer.toString().split("[").slice(1).join("[") - const json = JSON.parse(dataStr) - const method = json[0] - let status = 0 - const data = json[1] - const resp = { - Method: method, - Status: status, - Data: data, - IsValid: method && status === 0, - WS: this - } - - if (true) { - if (data) { - console.debug(`[RPC] 收到server呼叫:(${resp.WS.clientCount}): ${resp.Method}(${JSON.stringify(resp.Data)})`) - } else { - console.debug(`[RPC] 收到server呼叫:(${resp.WS.clientCount}): ${resp.Method}()`) - } - } - - WebSocketServerClass.Instance.OnDataReceived.DispatchCallback(resp) - - // /// 發送消息給client - // this.SendClient(data) - // WebSocketServerClass.Instance.SendAllClient(data) - } - - private onClose(): void { - console.log(`Client_${this.clientCount} Close connected`) - } - - /** 發送給client */ - public SendClient(req: INetResponse): void { - const status = 0 - const json: any[] = [req.Method] - //@ts-ignore - if (req.Data != null && req.Data != undefined && req.Data != NaN) { - json[1] = [status, req.Data] - } - - if (true) { - //@ts-ignore - if (req.Data != null && req.Data != undefined && req.Data != NaN) { - console.log(`[RPC] 傳送client資料:(${this.clientCount}): ${req.Method}(${JSON.stringify(req.Data)})`) - } else { - console.log(`[RPC] 傳送client資料:(${this.clientCount}): ${req.Method}()`) - } - } - - const str = JSON.stringify(json) - if (str.length > 65535) { - throw new Error('要傳的資料太大囉') - } - - const strary = Encoding.UTF8.GetBytes(str) - const buffer = new Uint8Array(4 + strary.byteLength) - const u16ary = new Uint16Array(buffer.buffer, 0, 3) - u16ary[0] = strary.byteLength - buffer[3] = 0x01 - buffer.set(strary, 4) - - this.ws.send(buffer) - } - - //#endregion -} diff --git a/src/DataReceived/MainControlData.ts b/src/DataReceived/MainControlData.ts deleted file mode 100644 index 7627f0d..0000000 --- a/src/DataReceived/MainControlData.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { INetResponse } from "../Engine/CatanEngine/NetManagerV2/Core/INetResponse"; -import Lobby from "../Lobby/Lobby"; -import WebSocketServerClass from "../NetManager/WebSocketServerClass"; - -export default class MainControlData { - constructor() { - WebSocketServerClass.Instance.OnDataReceived.AddCallback(this._serverData, this) - } - - /** SERVER主動通知 */ - private _serverData(req: INetResponse): void { - if (req.IsValid) { - switch (req.Method) { - case "lobby.list": - Lobby.List(req); - break - case "lobby.create": - Lobby.Create(req); - break - default: - // if (GameMain.Instance && GameMain.Instance.node && GameMain.Instance.node.parent) { - // GameMain.Instance.SettingBase.OnNetDataReceived(resp) - // } - break - } - } - } -} \ No newline at end of file diff --git a/src/Lobby/Lobby.ts b/src/Lobby/Lobby.ts deleted file mode 100644 index 96d636d..0000000 --- a/src/Lobby/Lobby.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { LobbyCreateRequest, LobbyListRequest } from "../define/Request/LobbyRequest"; -import { INetResponse } from "../Engine/CatanEngine/NetManagerV2/Core/INetResponse"; -import Room from "../Room/Room"; - -/** - * Lobby - */ -export default class Lobby { - - //#region private - - private static list: Room[] = [] - private static serialNumber: number = 0 - - //#endregion - - //#region Custom - - /** GetList */ - public static List(req: INetResponse): void { - const data = [] - for (let i = 0; i < this.list.length; i++) { - const room = this.list[i]; - data.push(room.SerialNumber) - } - const resp: LobbyListRequest = new LobbyListRequest(data, 0) - req.WS.SendClient(resp) - } - - /** Create */ - public static Create(req: INetResponse): void { - const room: Room = new Room(Lobby.serialNumber, req.WS) - Lobby.serialNumber++; - this.list.push(room) - const resp: LobbyCreateRequest = new LobbyCreateRequest() - req.WS.SendClient(resp) - } - - /** Join */ - public static Join(req: INetResponse): void { - // - } - - /** Exit */ - public static Exit(req: INetResponse): void { - // - } - - //#endregion -} diff --git a/src/MainControl/MainControl.ts b/src/MainControl/MainControl.ts deleted file mode 100644 index 2803f70..0000000 --- a/src/MainControl/MainControl.ts +++ /dev/null @@ -1,21 +0,0 @@ -// export class MainControl { -// //#region 網路相關 - -// /**連線(目前沒有重連機制) */ -// public * ConnectAsync() { -// if (NetManager.IsConnected) { -// return -// } -// this._conn = new NetConnector(BusinessTypeSetting.UseHost, BusinessTypeSetting.UsePort/*, this._realIp*/) -// this._conn.OnDataReceived.AddCallback(this._onNetDataReceived, this) -// this._conn.OnDisconnected.AddCallback(this._onNetDisconnected, this) -// this._conn.OnLoadUIMask.AddCallback(this._oOnLoadUIMask, this) -// NetManager.Initialize(this._conn) -// cc.log("[socket] connecting...") -// // 同個connector要再次連線, 可以不用叫CasinoNetManager.Initialize(), 但要先叫CasinoNetManager.Disconnect() -// yield NetManager.ConnectAsync() -// } - -// //#endregion - -// } \ No newline at end of file diff --git a/src/NetManager/WebSocketServerClass.ts b/src/NetManager/WebSocketServerClass.ts deleted file mode 100644 index d24c2e7..0000000 --- a/src/NetManager/WebSocketServerClass.ts +++ /dev/null @@ -1,79 +0,0 @@ -import express from "express" -import fs from "fs" -import _ws from "ws" -import Client from "../Client/Client" -import { Action } from "../Engine/CatanEngine/CSharp/System/Action" -import { INetResponse } from "../Engine/CatanEngine/NetManagerV2/Core/INetResponse" -import BaseSingleton from "../Engine/Utils/Singleton/BaseSingleton" -const SocketServer: typeof _ws.Server = _ws.Server - -/** - * WebSocketServer - */ -export default class WebSocketServerClass extends BaseSingleton() { - - readonly OnDataReceived: Action> = new Action>() - - //#region private - - private wss: _ws.Server = undefined - private clientCount: number = 0 - - //#endregion - - //#region Lifecycle - - /** - * - */ - constructor() { - super() - //讀取憑證及金鑰 - const prikey: string = fs.readFileSync("./certificate/RSA-privkey.pem", "utf8") - const cert: string = fs.readFileSync("./certificate/RSA-cert.pem", "utf8") - const cafile: string = fs.readFileSync("./certificate/RSA-chain.pem", "utf-8") - - //建立憑證及金鑰 - const credentials: Object = { - key: prikey, - cert: cert, - ca: cafile - } - - // 用於辨識Line Channel的資訊 - const config: any = { - channelSecret: process.env.channelSecret, - channelAccessToken: process.env.channelAccessToken || "" - } - - const port: number = +process.env.PORT || 3000 - const server = express().listen(port, () => { - console.log(`Listening on ${port}`) - }) - //將 express 交給 SocketServer 開啟 WebSocket 的服務 - this.wss = new SocketServer({ server }) - //當有 client 連線成功時 - this.wss.on('connection', this.onConnection.bind(this)) - } - - //#endregion - - //#region Custom - - private onConnection(ws: _ws): void { - const clientNum: number = this.clientCount - console.log(`Client_${clientNum} connected`) - new Client(ws, clientNum) - this.clientCount++ - } - - /** 發送給所有client */ - public SendAllClient(data: any): void { - let clients = this.wss.clients //取得所有連接中的 client - clients.forEach(client => { - client.send(data) // 發送至每個 client - }) - } - - //#endregion -} diff --git a/src/Utils/DBTools.ts b/src/Utils/DBTools.ts deleted file mode 100644 index d052e48..0000000 --- a/src/Utils/DBTools.ts +++ /dev/null @@ -1,44 +0,0 @@ -import mysql from "mysql" -import Tools from "./Tools" - -/** - * DBTools - */ -export default class DBTools { - - //#region Custom - - public static async Query(query: string): Promise { - const conn: mysql.Connection = this.connect() - - let resp: any = null - let run: boolean = true - conn.query(query, function (err: mysql.MysqlError, rows: any, fields: mysql.FieldInfo[]): void { - if (err) { - console.error(`${query} Error: \n${err.message}`) - run = false - } - resp = rows - run = false - }) - while (run) { - await Tools.Sleep(100) - } - conn.end() - return resp - } - - private static connect(): mysql.Connection { - const conn: mysql.Connection = mysql.createConnection({ - host: process.env.DB_HOST, - port: +process.env.DB_PORT, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE - }) - conn.connect() - return conn - } - - //#endregion -} diff --git a/src/Utils/Tools.ts b/src/Utils/Tools.ts deleted file mode 100644 index ab7e94e..0000000 --- a/src/Utils/Tools.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Tools - */ -export default class Tools { - - //#region Custom - - public static Sleep(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - //#endregion -} diff --git a/src/api/ApiAccountLogin.ts b/src/api/ApiAccountLogin.ts new file mode 100644 index 0000000..2286497 --- /dev/null +++ b/src/api/ApiAccountLogin.ts @@ -0,0 +1,24 @@ +import { ApiCall, BaseConnection } from "tsrpc"; +import Client from "../component/Client/Client"; +import User from "../component/Client/User"; +import Lobby from "../component/Lobby/Lobby"; +import { ReqAccountLogin, ResAccountLogin } from "../shared/protocols/PtlAccountLogin"; + +export default async function (call: ApiCall) { + // Error + if (!call.req.name) { + call.error('Name is empty') + return; + } + + // Success + const { sn, req } = call + const { name } = req + const conn: BaseConnection = call.conn + console.log(`name: ${name} is Login`) + const user = new User(name) + const client = new Client(conn, sn) + client.setUser(user) + Lobby.AddClient(client) + call.succ(0) +} \ No newline at end of file diff --git a/src/api/ApiLobbyList.ts b/src/api/ApiLobbyList.ts new file mode 100644 index 0000000..40c7fc5 --- /dev/null +++ b/src/api/ApiLobbyList.ts @@ -0,0 +1,12 @@ +import { ApiCall } from "tsrpc"; +import Lobby from "../component/Lobby/Lobby"; +import { ReqLobbyList, ResLobbyList } from "../shared/protocols/PtlLobbyList"; + +export default async function (call: ApiCall) { + const data: any[] = [] + for (let i = 0; i < Lobby.Room.length; i++) { + const room = Lobby.Room[i] + data.push(room.SerialNumber) + } + call.succ(data) +} \ No newline at end of file diff --git a/src/api/ApiSend.ts b/src/api/ApiSend.ts new file mode 100644 index 0000000..105a430 --- /dev/null +++ b/src/api/ApiSend.ts @@ -0,0 +1,26 @@ +import { ApiCall } from "tsrpc"; +import { server } from ".."; +import { ReqSend, ResSend } from "../shared/protocols/PtlSend"; + +// This is a demo code file +// Feel free to delete it + +export default async function (call: ApiCall) { + // Error + if (call.req.content.length === 0) { + call.error('Content is empty') + return; + } + + // Success + let time = new Date(); + call.succ({ + time: time + }); + + // Broadcast + server.broadcastMsg('Chat', { + content: call.req.content, + time: time + }) +} \ No newline at end of file diff --git a/src/app.ts b/src/app.ts deleted file mode 100644 index 9cf3398..0000000 --- a/src/app.ts +++ /dev/null @@ -1,18 +0,0 @@ -// 背景執行 forever start -c ts-node -a -l line-bot-ts.log src/app.ts -// 重新背景執行 forever restart -a -l line-bot-ts.log src/app.ts -// 監聽檔案變化 "npm start" -// 連線Debug "npm run dev" - -import dayjs from "dayjs" -import "dayjs/locale/zh-tw" -import dotenv from "dotenv" -import MainControlData from "./DataReceived/MainControlData" -import "./Engine/CatanEngine/CSharp/String" -import "./Engine/Utils/CCExtensions/ArrayExtension" -import "./Engine/Utils/CCExtensions/NumberExtension" -import WebSocketServerClass from "./NetManager/WebSocketServerClass" - -dayjs.locale("zh-tw") -dotenv.config() -new WebSocketServerClass() -new MainControlData() \ No newline at end of file diff --git a/src/component/Client/Client.ts b/src/component/Client/Client.ts new file mode 100644 index 0000000..c5911fd --- /dev/null +++ b/src/component/Client/Client.ts @@ -0,0 +1,128 @@ + +import { BaseConnection } from "tsrpc" +import User from "./User" + +/** + * Client + */ +export default class Client { + + //#region private + + private conn: BaseConnection = undefined + private ws: any = undefined + private sn: number = undefined + + //#endregion + + //#region get set + + public get User(): User { + return this.user + } + + private user: User = undefined + + + //#endregion + + //#region Lifecycle + + /** + * + */ + constructor(conn: BaseConnection, sn: number) { + this.conn = conn + this.ws = conn["ws"] + this.sn = sn + + // // 當收到client消息時 + // ws.on('message', this.onMessage.bind(this)) + // // 當連線關閉 + // ws.on('close', this.onClose.bind(this)) + } + + //#endregion + + //#region Custom + + /** + * setUser + */ + public setUser(user: User) { + this.user = user + } + + //#endregion + + //#region Server + + // private onMessage(buffer: _ws.RawData): void { + // // 收回來是 Buffer 格式、需轉成字串 + // const dataStr: string = "[" + buffer.toString().split("[").slice(1).join("[") + // const json = JSON.parse(dataStr) + // const method = json[0] + // let status = 0 + // const data = json[1] + // const resp = { + // Method: method, + // Status: status, + // Data: data, + // IsValid: method && status === 0, + // WS: this + // } + + // if (true) { + // if (data) { + // console.debug(`[RPC] 收到server呼叫:(${resp.WS.clientCount}): ${resp.Method}(${JSON.stringify(resp.Data)})`) + // } else { + // console.debug(`[RPC] 收到server呼叫:(${resp.WS.clientCount}): ${resp.Method}()`) + // } + // } + + // WebSocketServerClass.Instance.OnDataReceived.DispatchCallback(resp) + + // // /// 發送消息給client + // // this.SendClient(data) + // // WebSocketServerClass.Instance.SendAllClient(data) + // } + + // private onClose(): void { + // console.log(`Client_${this.clientCount} Close connected`) + // } + + // /** 發送給client */ + // public SendClient(req: INetResponse): void { + // const status = 0 + // const json: any[] = [req.Method] + // //@ts-ignore + // if (req.Data != null && req.Data != undefined && req.Data != NaN) { + // json[1] = [status, req.Data] + // } + + // if (true) { + // //@ts-ignore + // if (req.Data != null && req.Data != undefined && req.Data != NaN) { + // console.log(`[RPC] 傳送client資料:(${this.clientCount}): ${req.Method}(${JSON.stringify(req.Data)})`) + // } else { + // console.log(`[RPC] 傳送client資料:(${this.clientCount}): ${req.Method}()`) + // } + // } + + // const str = JSON.stringify(json) + // if (str.length > 65535) { + // throw new Error('要傳的資料太大囉') + // } + + // const strary = Encoding.UTF8.GetBytes(str) + // const buffer = new Uint8Array(4 + strary.byteLength) + // const u16ary = new Uint16Array(buffer.buffer, 0, 3) + // u16ary[0] = strary.byteLength + // buffer[3] = 0x01 + // buffer.set(strary, 4) + + // this.ws.send(buffer) + // } + + //#endregion +} diff --git a/src/component/Client/User.ts b/src/component/Client/User.ts new file mode 100644 index 0000000..58314e8 --- /dev/null +++ b/src/component/Client/User.ts @@ -0,0 +1,29 @@ + + +/** + * User + */ +export default class User { + + //#region get set + + public get Name(): string { + return this.name + } + + private name: string = undefined + + //#endregion + + //#region Lifecycle + + constructor(name: string) { + this.name = name + } + + //#endregion + + //#region Custom + + //#endregion +} diff --git a/src/component/Lobby/Lobby.ts b/src/component/Lobby/Lobby.ts new file mode 100644 index 0000000..4a294f6 --- /dev/null +++ b/src/component/Lobby/Lobby.ts @@ -0,0 +1,77 @@ +import Client from "../Client/Client"; +import Room from "../Room/Room"; + +/** + * Lobby + */ +export default class Lobby { + + //#region private + + private static clients: Client[] = [] + private static serialNumber: number = 0 + + //#endregion + + //#region get set + + public static get Room(): Room[] { return this.room } + private static room: Room[] = [] + + //#endregion + + //#region Custom + + /** AddClient */ + public static AddClient(client: Client): void { + this.clients.push(client) + } + + // /** List */ + // public static List(req: INetResponse): void { + // const data = [] + // for (let i = 0; i < this.list.length; i++) { + // const room = this.list[i] + // data.push(room.SerialNumber) + // } + // const resp: LobbyListRequest = new LobbyListRequest(data, 0) + // req.WS.SendClient(resp) + // } + + // /** Create */ + // public static Create(req: INetResponse): void { + // const room: Room = new Room(Lobby.serialNumber, req.WS) + // Lobby.serialNumber++ + // this.list.push(room) + // const resp: LobbyCreateRequest = new LobbyCreateRequest() + // req.WS.SendClient(resp) + // } + + // /** Join */ + // public static Join(req: INetResponse): void { + // const serialNumber: number = req.Data + // for (let i = 0; i < this.list.length; i++) { + // const room = this.list[i] + // if (room.SerialNumber === serialNumber) { + // room.Join(req.WS) + // break + // } + // } + // } + + // /** Exit */ + // public static Exit(req: INetResponse): void { + // const serialNumber: number = req.Data + // for (let i = 0; i < this.list.length; i++) { + // const room = this.list[i] + // if (room.SerialNumber === serialNumber) { + // this.list.splice(i, 1) + // // room.Exit() + // // room = null + // break + // } + // } + // } + + //#endregion +} diff --git a/src/Room/Room.ts b/src/component/Room/Room.ts similarity index 75% rename from src/Room/Room.ts rename to src/component/Room/Room.ts index d85bc69..54af4a9 100644 --- a/src/Room/Room.ts +++ b/src/component/Room/Room.ts @@ -31,5 +31,13 @@ export default class Room { //#region Custom + /** Join */ + public Join(ws: Client): void { + this.wsArr.forEach(otherWS => { + // otherWS.SendClient() + }) + this.wsArr.push(ws) + } + //#endregion } diff --git a/src/define/Request/.ExampleCodeRequest.ts b/src/define/Request/.ExampleCodeRequest.ts deleted file mode 100644 index 7939ce6..0000000 --- a/src/define/Request/.ExampleCodeRequest.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NetRequest } from "../../Engine/CatanEngine/NetManagerV2/NetRequest"; - -// #region Request - -export type RpcExampleCodeRequest = null -export type RpcExampleCodeResponse = ExampleCodeData[] - -export class ExampleCodeRequest extends NetRequest { - get Method(): string { - return "example.code"; - } - constructor() { - super(); - } -} - -// #endregion - -// #region Type - -export type ExampleCodeData = [ - id: number, - title: number, - content: number, - time: number, -]; - -// #endregion \ No newline at end of file diff --git a/src/define/Request/LobbyRequest.ts b/src/define/Request/LobbyRequest.ts deleted file mode 100644 index 9a974c8..0000000 --- a/src/define/Request/LobbyRequest.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NetResponse } from "../../Engine/CatanEngine/NetManagerV2/NetResponse" - -// #region Request - -export type RpcLobbyListRequest = any[] -export class LobbyListRequest extends NetResponse { - protected data: RpcLobbyListRequest - protected method: string = "lobby.list" - constructor(data: RpcLobbyListRequest = undefined, status: number = 0) { super(data, status) } -} - -export type RpcLobbyCreateRequest = undefined -export class LobbyCreateRequest extends NetResponse { - protected data: RpcLobbyListRequest - protected method: string = "lobby.create" - constructor(data: RpcLobbyCreateRequest = undefined, status: number = 0) { super(data, status) } -} - -// #endregion - -// #region Type - -// #endregion \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..0128aec --- /dev/null +++ b/src/index.ts @@ -0,0 +1,34 @@ +import dayjs from "dayjs"; +import "dayjs/locale/zh-tw"; +import * as path from "path"; +import { WsServer } from "tsrpc"; +import { BaseEnumerator } from "./Engine/CatanEngine/CoroutineV2/Core/BaseEnumerator"; +import "./Engine/CatanEngine/CSharp/String"; +import "./Engine/Utils/CCExtensions/ArrayExtension"; +import "./Engine/Utils/CCExtensions/NumberExtension"; +import { serviceProto } from './shared/protocols/serviceProto'; + +BaseEnumerator.Init(); +dayjs.locale("zh-tw") + +// Create the Server +export const server = new WsServer(serviceProto, { + port: 3003, + // Remove this to use binary mode (remove from the client too) + json: true +}); + +// Initialize before server start +async function init() { + await server.autoImplementApi(path.resolve(__dirname, 'api')); + + // TODO + // Prepare something... (e.g. connect the db) +}; + +// Entry function +async function main() { + await init(); + await server.start(); +} +main(); \ No newline at end of file diff --git a/src/shared/protocols b/src/shared/protocols new file mode 160000 index 0000000..3aab251 --- /dev/null +++ b/src/shared/protocols @@ -0,0 +1 @@ +Subproject commit 3aab251c77cbd76451676b0cab3283cf345b0043 diff --git a/test/api/ApiSend.test.ts b/test/api/ApiSend.test.ts new file mode 100644 index 0000000..9ea076d --- /dev/null +++ b/test/api/ApiSend.test.ts @@ -0,0 +1,53 @@ +import assert from 'assert'; +import { WsClient } from 'tsrpc'; +import { serviceProto } from '../../src/shared/protocols/serviceProto'; + +// 1. EXECUTE `npm run dev` TO START A LOCAL DEV SERVER +// 2. EXECUTE `npm test` TO START UNIT TEST + +describe('ApiSend', function () { + let client = new WsClient(serviceProto, { + server: 'ws://127.0.0.1:3003', + json: true, + logger: console + }); + + // 連線 + before(async function () { + let res = await client.connect(); + assert.strictEqual(res.isSucc, true, 'Failed to connect to server, have you executed `npm run dev` already?'); + }) + + it('AccountLogin', async function () { + let ret = await client.callApi('AccountLogin', { + name: 'Test' + }); + assert.ok(ret.isSucc) + }); + + it('LobbyList', async function () { + let ret = await client.callApi('LobbyList', null); + assert.ok(ret.isSucc) + }); + + // it('Success', async function () { + // let ret = await client.callApi('Send', { + // content: 'Test' + // }); + // assert.ok(ret.isSucc) + // }); + + // it('Check content is empty', async function () { + // let ret = await client.callApi('Send', { + // content: '' + // }); + // assert.deepStrictEqual(ret, { + // isSucc: false, + // err: new TsrpcError('Content is empty') + // }); + // }) + + after(async function () { + await client.disconnect(); + }) +}) \ No newline at end of file diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 0000000..a7112a3 --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "lib": [ + "es2018" + ], + "module": "commonjs", + "target": "es2018", + "outDir": "dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node" + }, + "include": [ + ".", + "../src" + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 4a4ae41..3014508 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,16 +1,23 @@ { "compilerOptions": { - "target": "es5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "module": "commonjs", /* Specify what module code is generated. */ "lib": [ - "es2015", - "es2017", - "dom" + "es2018" ], - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - "strict": false, /* Enable all strict type-checking options. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */, - "outDir": "dist" // 將編譯過後的js檔放到dist資料夾中 - } + "module": "commonjs", + "target": "es2018", + "outDir": "dist", + "strict": false, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + // "paths": { + // "@/*": [ + // "./src/*" + // ] + // } + }, + "include": [ + "src" + ] } \ No newline at end of file diff --git a/tsrpc.config.ts b/tsrpc.config.ts new file mode 100644 index 0000000..009a519 --- /dev/null +++ b/tsrpc.config.ts @@ -0,0 +1,38 @@ +import type { TsrpcConfig } from 'tsrpc-cli'; + +export default { + // Generate ServiceProto + proto: [ + { + ptlDir: 'src/shared/protocols', // Protocol dir + output: 'src/shared/protocols/serviceProto.ts', // Path for generated ServiceProto + apiDir: 'src/api', // API dir + docDir: 'docs', // API documents dir + ptlTemplate: { baseFile: 'src/shared/protocols/base.ts' }, + // msgTemplate: { baseFile: 'src/shared/protocols/base.ts' }, + } + ], + // Sync shared code + sync: [ + { + from: 'src/shared', + to: '../frontend/src/shared', + type: 'symlink' // Change this to 'copy' if your environment not support symlink + } + ], + // Dev server + dev: { + autoProto: true, // Auto regenerate proto + autoSync: true, // Auto sync when file changed + autoApi: true, // Auto create API when ServiceProto updated + watch: 'src', // Restart dev server when these files changed + entry: 'src/index.ts', // Dev server command: node -r ts-node/register {entry} + }, + // Build config + build: { + autoProto: true, // Auto generate proto before build + autoSync: true, // Auto sync before build + autoApi: true, // Auto generate API before build + outDir: 'dist', // Clean this dir before build + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..4d0ea7a --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1335 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@blakeembrey/deque@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@blakeembrey/deque/-/deque-1.0.5.tgz#f4fa17fc5ee18317ec01a763d355782c7b395eaf" + integrity sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg== + +"@blakeembrey/template@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@blakeembrey/template/-/template-1.1.0.tgz#fbea7a688ffedf0763085b2cda8efe6fdd54d4c4" + integrity sha512-iZf+UWfL+DogJVpd/xMQyP6X6McYd6ArdYoPMiv/zlOTzeXXfQbYxBNJJBF6tThvsjLMbA8tLjkCdm9RWMFCCw== + +"@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" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/mocha@^8.2.3": + version "8.2.3" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" + integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== + +"@types/node@*": + version "20.5.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" + integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== + +"@types/node@^15.14.9": + version "15.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" + integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== + +"@types/ws@^7.4.7": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +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== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0, arg@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.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" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + 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" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@3.5.3, chokidar@^3.3.1, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commandpost@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/commandpost/-/commandpost-1.4.0.tgz#89218012089dfc9b67a337ba162f15c88e0f1048" + integrity sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ== + +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== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +dayjs@^1.11.9: + version "1.11.9" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== + +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +editorconfig@^0.15.0: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-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== + +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== + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.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" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.2.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" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +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== + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +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.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== + +inquirer@^8.2.4: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + +invert-kv@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" + integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +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== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +k8w-crypto@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/k8w-crypto/-/k8w-crypto-0.2.0.tgz#00e6f3027832eeade06fd79c9c3a1ebfb76c964f" + integrity sha512-M6u4eQ6CQaU5xO3s4zaUUp9G79xNDhXtTU0X7N80tDcBhQC5ggowlyOzj95v7WiCuk7xkV0aFsTmCpuf0m0djw== + +k8w-extend-native@^1.4.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/k8w-extend-native/-/k8w-extend-native-1.4.6.tgz#d3008c60f3f85e5b2f2bd8617ff4a5bc9cf743a6" + integrity sha512-AHTCyFshldMme0s9FKD+QKG+QZdBkHXzl+8kYfNhsSDhcdQ5TYWQwphjecSJjxNdGd78TIbO0fHiOvM+Ei22YA== + dependencies: + k8w-linq-array "*" + k8w-super-date "*" + k8w-super-object "*" + +k8w-linq-array@*: + version "0.2.8" + resolved "https://registry.yarnpkg.com/k8w-linq-array/-/k8w-linq-array-0.2.8.tgz#1ef4d4a2943552cbd5f633a5d9b8e831dc8abd6e" + integrity sha512-4IAkQN8UJdk804tQi++wuwSZvFWk/Wcl1uG5PR/0c0YvB5hUd2f8tJm3OgOMOxjV9UVByNLvnPYGIwrFQPpjlA== + +k8w-super-date@*: + version "0.1.3" + resolved "https://registry.yarnpkg.com/k8w-super-date/-/k8w-super-date-0.1.3.tgz#4f53a39f2b74e21b11268926b710e5a7c27f8848" + integrity sha512-IBqKOAMAXR/bgzu+rYI30tEMP/Y6Q8HQuqJiTkE2mLJg11yok9guoi8uZTynTahviVBndcfBpOgi1H/zhihv7w== + +k8w-super-object@*: + version "0.3.0" + resolved "https://registry.yarnpkg.com/k8w-super-object/-/k8w-super-object-0.3.0.tgz#6430d14956aaf3a936fda7776b0897a04db331dd" + integrity sha512-u2jfh4goYXKZmSucaLaOTaNbLRatjv0CSRpzE0KU0732+9XtYZFd5vrdw/mzJfK5fPHb/zyikOSHDX5mJrav+g== + +lcid@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0" + integrity sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg== + dependencies: + invert-kv "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +mem@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" + integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^2.1.0" + p-is-promise "^2.1.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== + dependencies: + brace-expansion "^1.1.7" + +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" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mocha@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" + integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "4.2.1" + ms "2.1.3" + nanoid "3.3.1" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.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== + dependencies: + wrappy "1" + +onchange@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/onchange/-/onchange-7.1.0.tgz#a6f0f7733e4d47014b4cd70aa1ad36c2b4cf3804" + integrity sha512-ZJcqsPiWUAUpvmnJri5TPBooqJOPmC0ttN65juhN15Q8xA+Nbg3BaxBHXQ45EistKKlKElb0edmbPWnKSBkvMg== + dependencies: + "@blakeembrey/deque" "^1.0.5" + "@blakeembrey/template" "^1.0.0" + arg "^4.1.3" + chokidar "^3.3.1" + cross-spawn "^7.0.1" + ignore "^5.1.4" + tree-kill "^1.2.2" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-locale@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-5.0.0.tgz#6d26c1d95b6597c5d5317bf5fba37eccec3672e0" + integrity sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA== + dependencies: + execa "^4.0.0" + lcid "^3.0.0" + mem "^5.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + +p-is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.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" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +string-width@^4.1.0, string-width@^4.2.0: + 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== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +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== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.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" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-node@^10.8.2, ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsbuffer-proto-generator@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/tsbuffer-proto-generator/-/tsbuffer-proto-generator-1.7.2.tgz#fcc375ad7938683352568299d60511ed759700e2" + integrity sha512-Rjq/mNXb6Z3ORi5M0BH3O+L0hpr+RcLzJ1edXO4bOZkojdtxDmwoKGBKoh+/xba+bhOiSiwHfVZLiQ06A6vEmw== + dependencies: + k8w-crypto "^0.2.0" + k8w-extend-native "^1.4.6" + tsbuffer-schema "^2.2.0" + tslib "*" + typescript "^4" + +tsbuffer-schema@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tsbuffer-schema/-/tsbuffer-schema-2.2.0.tgz#0318c222d7c0e23f4e16ad67d04c36844a05e226" + integrity sha512-I4+5Xfk7G+D++kXdNnYTeY26WQTaf14C84XQwPKteNmrwxRY3CQCkMqASRiCUqtpOuDn43qmoxuXpT+Vo8Wltg== + +tsbuffer-validator@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tsbuffer-validator/-/tsbuffer-validator-2.1.1.tgz#dea7d6ec6cc768a75df39e23d91d5f84209ab6ab" + integrity sha512-12JVltPQjv2hZqfd9TZhTjCyQ0bvtRlTXyczOAaH+CnryWI9Twt0i9ZGaM5fb2QMxW5BOhToOIbwO8opDqpCEg== + dependencies: + k8w-extend-native "^1.4.6" + tsbuffer-schema "^2.2.0" + tslib "*" + +tsbuffer@^2.2.3, tsbuffer@^2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/tsbuffer/-/tsbuffer-2.2.7.tgz#76c30572bb0e385e091dfb80b86502c4041994c3" + integrity sha512-WkP6NU14W14Kxa+OtccJ4m9+nY8UZs/DlM3FQzxstBkNGzmNvggN3+2mfIzYO8YDKu6mqYUXgpNg1aqIYcUACw== + dependencies: + k8w-extend-native "^1.4.6" + tsbuffer-validator "^2.1.1" + tslib "*" + +tslib@*, tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tslib@=2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + +tsrpc-base-client@^2.1.11: + version "2.1.13" + resolved "https://registry.yarnpkg.com/tsrpc-base-client/-/tsrpc-base-client-2.1.13.tgz#c2f5a28f368634ea791da835fb682e72e037e69d" + integrity sha512-oNPOZEJfXkOwqi2wp/j0q55NzA7qJFRpL2IzTEU59PTPRZ5OpbV2wg3VVNK7NTJBOjwPSUH/TNBckWtIVKstKg== + dependencies: + k8w-extend-native "^1.4.6" + tsbuffer "^2.2.7" + tslib "=2.4.1" + tsrpc-proto "^1.4.3" + +tsrpc-cli@^2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/tsrpc-cli/-/tsrpc-cli-2.4.5.tgz#26d2e3c0e0f4ef3e3cb03eb98b911ce50b19993f" + integrity sha512-/3MMyGAAuSnZLQVfoRZXI5sfyGakRTk2AfrllvVSUSfGPTr06iU1YAgOATNYEHl+uAj1+QFz3dKT8g3J+wCIcw== + dependencies: + chalk "^4.1.2" + chokidar "^3.5.3" + fs-extra "^10.1.0" + glob "^7.2.3" + inquirer "^8.2.4" + k8w-extend-native "^1.4.6" + minimist "^1.2.6" + ora "^5.4.1" + os-locale "^5.0.0" + ts-node "^10.8.2" + tsbuffer "^2.2.3" + tsbuffer-proto-generator "^1.7.2" + tsbuffer-schema "^2.2.0" + tsrpc-proto "^1.4.2" + typescript "^4.7.4" + typescript-formatter "^7.2.2" + +tsrpc-proto@^1.4.2, tsrpc-proto@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/tsrpc-proto/-/tsrpc-proto-1.4.3.tgz#8db8fa43f0f6e97308bbc580be1c1de50acd8532" + integrity sha512-qtkk5i34m9/K1258EdyXAEikU/ADPELHCCXN/oFJ4XwH+kN3kXnKYmwCDblUuMA73V2+A/EwkgUGyAgPa335Hw== + dependencies: + tsbuffer-schema "^2.2.0" + tslib "*" + +tsrpc@^3.4.12: + version "3.4.12" + resolved "https://registry.yarnpkg.com/tsrpc/-/tsrpc-3.4.12.tgz#64697d03e51f0c0cbbba100f682ce785b26efdf3" + integrity sha512-FMa7FdzW7LdhsQ49DxcNegeW4oRJGxqP+3DXbZBvsUHSeL2h6UFCSKmw2TypI2ChDeRGgbo+wt6uJ0upF6fz9Q== + dependencies: + "@types/ws" "^7.4.7" + chalk "^4.1.2" + tsbuffer "^2.2.7" + tsrpc-base-client "^2.1.11" + tsrpc-proto "^1.4.3" + uuid "^8.3.2" + ws "^7.5.9" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript-formatter@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/typescript-formatter/-/typescript-formatter-7.2.2.tgz#a147181839b7bb09c2377b072f20f6336547c00a" + integrity sha512-V7vfI9XArVhriOTYHPzMU2WUnm5IMdu9X/CPxs8mIMGxmTBFpDABlbkBka64PZJ9/xgQeRpK8KzzAG4MPzxBDQ== + dependencies: + commandpost "^1.0.0" + editorconfig "^0.15.0" + +typescript@^4, typescript@^4.7.4, typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "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== + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^7.5.9: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==