├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .npmignore
├── LICENSE
├── README.md
├── package-lock.json
├── package.json
├── process.drawio
├── process.png
├── rollup.config.js
├── src
├── core.ts
├── generate
│ ├── declaration.ts
│ ├── diff.ts
│ ├── index.ts
│ └── interface.ts
├── index.ts
├── templates
│ ├── apiTemplate
│ │ ├── api.tpl
│ │ └── body.tpl
│ └── dtsTemplate
│ │ ├── body.tpl
│ │ └── dts.tpl
├── typing
│ ├── config.ts
│ └── yapi.ts
├── utils
│ ├── config.ts
│ ├── console.ts
│ ├── file.ts
│ ├── http.ts
│ ├── jsonSchema.ts
│ ├── name.ts
│ ├── nedb.ts
│ ├── prettify.ts
│ └── progress.ts
└── yapi
│ ├── api.ts
│ ├── diff.ts
│ ├── group.ts
│ ├── login.ts
│ ├── modular.ts
│ └── project.ts
└── tsconfig.json
/.eslintignore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huangkairan/api-generator/be424602a4bc138f5fb5d0dfad71d6acc90f476b/.eslintignore
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | es2021: true,
4 | node: true
5 | },
6 | extends: [
7 | 'standard',
8 | 'plugin:@typescript-eslint/recommended'
9 | ],
10 | parser: '@typescript-eslint/parser',
11 | parserOptions: {
12 | ecmaVersion: 12,
13 | sourceType: 'module'
14 | },
15 | plugins: [
16 | '@typescript-eslint'
17 | ],
18 | rules: {
19 | 'no-async-promise-executor': 'off',
20 | 'no-template-curly-in-string': 'off',
21 | 'no-use-before-define': 'off',
22 | 'prefer-promise-reject-errors': 'off',
23 | '@typescript-eslint/no-var-requires': 'off',
24 | 'no-prototype-builtins': 'off',
25 | 'no-unused-expressions': 'off',
26 | 'quote-props': ['never']
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | src/apis
3 | src/utils/data
4 | vscode-yapi-generate/out
5 | vscode-yapi-generate/.vscode
6 | /lib
7 | ./api.config.js
8 | .DS_Store
9 | api.config.js
10 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | src/apis
3 | src/utils/data
4 | ./api.config.js
5 | ./process.drawio
6 | ./process.png
7 | ./rollup.config.js
8 | .*.swp
9 | ._*
10 | .DS_Store
11 | .git
12 | .hg
13 | .lock-wscript
14 | .svn
15 | .api.config.js
16 | vscode-yapi-generate
17 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT LICENSE
2 |
3 | Copyright (c) 2022-present huangkairan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining
6 | a copy of this software and associated documentation files (the
7 | "Software"), to deal in the Software without restriction, including
8 | without limitation the rights to use, copy, modify, merge, publish,
9 | distribute, sublicense, and/or sell copies of the Software, and to
10 | permit persons to whom the Software is furnished to do so, subject to
11 | the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be
14 | included in all copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # api-generator
2 |
3 | 一键生成 TS 类型文件和基于 axios 封装的请求方法
4 |
5 | # how to use
6 |
7 | ```
8 | npm i -g @kairan.huang/api-generator
9 |
10 | api --help
11 |
12 | Options:
13 | -v, --version 获取当前版本
14 | -i, --init 初始化配置文件
15 | -g, --generate 生成接口文档
16 | -r, --remove 移除缓存
17 | -d, --diff 当前项目Diff
18 |
19 | ```
20 |
21 |
22 | # api.config.js
23 | ```
24 | module.exports = {
25 | // 账号
26 | account: 'xxx@xxx.cn',
27 | // 密码
28 | password: 'xxxxxx',
29 | // Yapi网址链接
30 | originUrl: 'https://yapi.xxxx.cn',
31 | // 请求声明模块
32 | fetchModule: 'import { AxiosPromise as RequestPromise , AxiosRequestConfig as RequestConfig } from "axios";',
33 | // 输出目录
34 | outDir: './src/apis',
35 | // 项目跟请求方法映射
36 | projectMapping: {
37 | // 项目跟请求方法映射(projectId为生成目录id)
38 | // 参考url https://yapi.xxxx.cn/project/12/interface/api
39 | // 12是projectId,当未配置时api也会有相应的projectId提示
40 | 12: {
41 | exportName: 'API',
42 | // 返回报文泛式
43 | // wrapper: '{ code: string, message: string, data: T }',
44 | },
45 | },
46 | // 请求体实例文件路径
47 | requestFilePath: 'src/apis/',
48 | // 忽略ts校验
49 | tsIgnore: true,
50 | // 忽略eslint
51 | esLintIgnore: true,
52 | };
53 | ```
54 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "api",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@apidevtools/json-schema-ref-parser": {
8 | "version": "9.0.9",
9 | "resolved": "https://registry.nlark.com/@apidevtools/json-schema-ref-parser/download/@apidevtools/json-schema-ref-parser-9.0.9.tgz",
10 | "integrity": "sha1-1yD5JW42CWISgFhPK0euFlNZJos=",
11 | "requires": {
12 | "@jsdevtools/ono": "^7.1.3",
13 | "@types/json-schema": "^7.0.6",
14 | "call-me-maybe": "^1.0.1",
15 | "js-yaml": "^4.1.0"
16 | },
17 | "dependencies": {
18 | "argparse": {
19 | "version": "2.0.1",
20 | "resolved": "https://registry.nlark.com/argparse/download/argparse-2.0.1.tgz",
21 | "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg="
22 | },
23 | "js-yaml": {
24 | "version": "4.1.0",
25 | "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-4.1.0.tgz?cache=0&sync_timestamp=1618435004368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-4.1.0.tgz",
26 | "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=",
27 | "requires": {
28 | "argparse": "^2.0.1"
29 | }
30 | }
31 | }
32 | },
33 | "@babel/code-frame": {
34 | "version": "7.12.11",
35 | "resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.12.11.tgz?cache=0&sync_timestamp=1623280394200&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.12.11.tgz",
36 | "integrity": "sha1-9K1DWqJj25NbjxDyxVLSP7cWpj8=",
37 | "dev": true,
38 | "requires": {
39 | "@babel/highlight": "^7.10.4"
40 | }
41 | },
42 | "@babel/helper-validator-identifier": {
43 | "version": "7.14.8",
44 | "resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.14.8.tgz?cache=0&sync_timestamp=1626804360687&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.14.8.tgz",
45 | "integrity": "sha1-Mr4zp1bynieKDWRPoIosng+Io0w=",
46 | "dev": true
47 | },
48 | "@babel/highlight": {
49 | "version": "7.14.5",
50 | "resolved": "https://registry.nlark.com/@babel/highlight/download/@babel/highlight-7.14.5.tgz?cache=0&sync_timestamp=1623280393681&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.14.5.tgz",
51 | "integrity": "sha1-aGGlLwOWZAUAH2qlNKAaJNmejNk=",
52 | "dev": true,
53 | "requires": {
54 | "@babel/helper-validator-identifier": "^7.14.5",
55 | "chalk": "^2.0.0",
56 | "js-tokens": "^4.0.0"
57 | },
58 | "dependencies": {
59 | "chalk": {
60 | "version": "2.4.2",
61 | "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995367379&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
62 | "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
63 | "dev": true,
64 | "requires": {
65 | "ansi-styles": "^3.2.1",
66 | "escape-string-regexp": "^1.0.5",
67 | "supports-color": "^5.3.0"
68 | }
69 | },
70 | "escape-string-regexp": {
71 | "version": "1.0.5",
72 | "resolved": "https://registry.nlark.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
73 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
74 | "dev": true
75 | }
76 | }
77 | },
78 | "@eslint/eslintrc": {
79 | "version": "0.4.3",
80 | "resolved": "https://registry.nlark.com/@eslint/eslintrc/download/@eslint/eslintrc-0.4.3.tgz?cache=0&sync_timestamp=1626557132800&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40eslint%2Feslintrc%2Fdownload%2F%40eslint%2Feslintrc-0.4.3.tgz",
81 | "integrity": "sha1-nkKYHvA1vrPdSa3ResuW6P9vOUw=",
82 | "dev": true,
83 | "requires": {
84 | "ajv": "^6.12.4",
85 | "debug": "^4.1.1",
86 | "espree": "^7.3.0",
87 | "globals": "^13.9.0",
88 | "ignore": "^4.0.6",
89 | "import-fresh": "^3.2.1",
90 | "js-yaml": "^3.13.1",
91 | "minimatch": "^3.0.4",
92 | "strip-json-comments": "^3.1.1"
93 | },
94 | "dependencies": {
95 | "ignore": {
96 | "version": "4.0.6",
97 | "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz",
98 | "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
99 | "dev": true
100 | }
101 | }
102 | },
103 | "@humanwhocodes/config-array": {
104 | "version": "0.5.0",
105 | "resolved": "https://registry.nlark.com/@humanwhocodes/config-array/download/@humanwhocodes/config-array-0.5.0.tgz?cache=0&sync_timestamp=1625264021699&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40humanwhocodes%2Fconfig-array%2Fdownload%2F%40humanwhocodes%2Fconfig-array-0.5.0.tgz",
106 | "integrity": "sha1-FAeWfUxu7Nc4j4Os8er00Mbljvk=",
107 | "dev": true,
108 | "requires": {
109 | "@humanwhocodes/object-schema": "^1.2.0",
110 | "debug": "^4.1.1",
111 | "minimatch": "^3.0.4"
112 | }
113 | },
114 | "@humanwhocodes/object-schema": {
115 | "version": "1.2.0",
116 | "resolved": "https://registry.nlark.com/@humanwhocodes/object-schema/download/@humanwhocodes/object-schema-1.2.0.tgz?cache=0&sync_timestamp=1625264051240&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40humanwhocodes%2Fobject-schema%2Fdownload%2F%40humanwhocodes%2Fobject-schema-1.2.0.tgz",
117 | "integrity": "sha1-h956+cIxgm/daKxyWPd8Qp4OX88=",
118 | "dev": true
119 | },
120 | "@jsdevtools/ono": {
121 | "version": "7.1.3",
122 | "resolved": "https://registry.npm.taobao.org/@jsdevtools/ono/download/@jsdevtools/ono-7.1.3.tgz",
123 | "integrity": "sha1-nfA7vXxpalxYiFw0qgbaQchUN5Y="
124 | },
125 | "@mstssk/cleandir": {
126 | "version": "1.2.0",
127 | "resolved": "https://registry.nlark.com/@mstssk/cleandir/download/@mstssk/cleandir-1.2.0.tgz",
128 | "integrity": "sha1-AJKEV4D8U5BB0WAlUpRe/i9Bbr8=",
129 | "dev": true
130 | },
131 | "@nodelib/fs.scandir": {
132 | "version": "2.1.5",
133 | "resolved": "https://registry.nlark.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz",
134 | "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=",
135 | "dev": true,
136 | "requires": {
137 | "@nodelib/fs.stat": "2.0.5",
138 | "run-parallel": "^1.1.9"
139 | }
140 | },
141 | "@nodelib/fs.stat": {
142 | "version": "2.0.5",
143 | "resolved": "https://registry.nlark.com/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz?cache=0&sync_timestamp=1622792655362&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-2.0.5.tgz",
144 | "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=",
145 | "dev": true
146 | },
147 | "@nodelib/fs.walk": {
148 | "version": "1.2.8",
149 | "resolved": "https://registry.nlark.com/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.8.tgz?cache=0&sync_timestamp=1625769815389&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.walk%2Fdownload%2F%40nodelib%2Ffs.walk-1.2.8.tgz",
150 | "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=",
151 | "dev": true,
152 | "requires": {
153 | "@nodelib/fs.scandir": "2.1.5",
154 | "fastq": "^1.6.0"
155 | }
156 | },
157 | "@rollup/plugin-alias": {
158 | "version": "3.1.4",
159 | "resolved": "https://registry.nlark.com/@rollup/plugin-alias/download/@rollup/plugin-alias-3.1.4.tgz",
160 | "integrity": "sha1-R3dPT/DqtZN/ess5LPK4mSHwO30=",
161 | "dev": true,
162 | "requires": {
163 | "slash": "^3.0.0"
164 | }
165 | },
166 | "@rollup/plugin-json": {
167 | "version": "4.1.0",
168 | "resolved": "https://registry.npm.taobao.org/@rollup/plugin-json/download/@rollup/plugin-json-4.1.0.tgz",
169 | "integrity": "sha1-VOCYZ65pY8WThE2L16nHGClElvM=",
170 | "dev": true,
171 | "requires": {
172 | "@rollup/pluginutils": "^3.0.8"
173 | }
174 | },
175 | "@rollup/plugin-node-resolve": {
176 | "version": "13.0.4",
177 | "resolved": "https://registry.nlark.com/@rollup/plugin-node-resolve/download/@rollup/plugin-node-resolve-13.0.4.tgz?cache=0&sync_timestamp=1627164924735&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40rollup%2Fplugin-node-resolve%2Fdownload%2F%40rollup%2Fplugin-node-resolve-13.0.4.tgz",
178 | "integrity": "sha1-sQIi9BRaAZdArLdzhAITDYSGYMA=",
179 | "dev": true,
180 | "requires": {
181 | "@rollup/pluginutils": "^3.1.0",
182 | "@types/resolve": "1.17.1",
183 | "builtin-modules": "^3.1.0",
184 | "deepmerge": "^4.2.2",
185 | "is-module": "^1.0.0",
186 | "resolve": "^1.19.0"
187 | }
188 | },
189 | "@rollup/pluginutils": {
190 | "version": "3.1.0",
191 | "resolved": "https://registry.nlark.com/@rollup/pluginutils/download/@rollup/pluginutils-3.1.0.tgz?cache=0&sync_timestamp=1626393703548&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40rollup%2Fpluginutils%2Fdownload%2F%40rollup%2Fpluginutils-3.1.0.tgz",
192 | "integrity": "sha1-cGtFJO5tyLEDs8mVUz5a1oDAK5s=",
193 | "dev": true,
194 | "requires": {
195 | "@types/estree": "0.0.39",
196 | "estree-walker": "^1.0.1",
197 | "picomatch": "^2.2.2"
198 | }
199 | },
200 | "@tsconfig/node10": {
201 | "version": "1.0.8",
202 | "resolved": "https://registry.nlark.com/@tsconfig/node10/download/@tsconfig/node10-1.0.8.tgz?cache=0&sync_timestamp=1623230092238&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40tsconfig%2Fnode10%2Fdownload%2F%40tsconfig%2Fnode10-1.0.8.tgz",
203 | "integrity": "sha1-weToDW+WT77LM1nEO9SLQPfK2tk=",
204 | "dev": true
205 | },
206 | "@tsconfig/node12": {
207 | "version": "1.0.9",
208 | "resolved": "https://registry.nlark.com/@tsconfig/node12/download/@tsconfig/node12-1.0.9.tgz?cache=0&sync_timestamp=1624076106869&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40tsconfig%2Fnode12%2Fdownload%2F%40tsconfig%2Fnode12-1.0.9.tgz",
209 | "integrity": "sha1-YsH23uLr2a6tgNw6+laBDljhoEw=",
210 | "dev": true
211 | },
212 | "@tsconfig/node14": {
213 | "version": "1.0.1",
214 | "resolved": "https://registry.nlark.com/@tsconfig/node14/download/@tsconfig/node14-1.0.1.tgz",
215 | "integrity": "sha1-lfLRZ/+5uNIGiwsjUwL6/U33EfI=",
216 | "dev": true
217 | },
218 | "@tsconfig/node16": {
219 | "version": "1.0.2",
220 | "resolved": "https://registry.nlark.com/@tsconfig/node16/download/@tsconfig/node16-1.0.2.tgz?cache=0&sync_timestamp=1626840702633&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40tsconfig%2Fnode16%2Fdownload%2F%40tsconfig%2Fnode16-1.0.2.tgz",
221 | "integrity": "sha1-Qjx3h30Fadsg4fyAiFrEEYMUAQ4=",
222 | "dev": true
223 | },
224 | "@types/estree": {
225 | "version": "0.0.39",
226 | "resolved": "https://registry.nlark.com/@types/estree/download/@types/estree-0.0.39.tgz",
227 | "integrity": "sha1-4Xfmme4bjCLSMXTKqnQiZEOJUJ8=",
228 | "dev": true
229 | },
230 | "@types/fs-extra": {
231 | "version": "8.1.2",
232 | "resolved": "https://registry.nlark.com/@types/fs-extra/download/@types/fs-extra-8.1.2.tgz?cache=0&sync_timestamp=1625605304928&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Ffs-extra%2Fdownload%2F%40types%2Ffs-extra-8.1.2.tgz",
233 | "integrity": "sha1-cSXMLkvdm9L8gwBf/bHQugDMph8=",
234 | "dev": true,
235 | "requires": {
236 | "@types/node": "*"
237 | }
238 | },
239 | "@types/glob": {
240 | "version": "7.1.4",
241 | "resolved": "https://registry.nlark.com/@types/glob/download/@types/glob-7.1.4.tgz",
242 | "integrity": "sha1-6lniHS7lxReRTLS8jkFTuZ5WZnI=",
243 | "requires": {
244 | "@types/minimatch": "*",
245 | "@types/node": "*"
246 | }
247 | },
248 | "@types/inquirer": {
249 | "version": "7.3.2",
250 | "resolved": "https://registry.nlark.com/@types/inquirer/download/@types/inquirer-7.3.2.tgz",
251 | "integrity": "sha1-NdLvTZjdQv7rThJWzeufE/RX1CA=",
252 | "dev": true,
253 | "requires": {
254 | "@types/through": "*",
255 | "rxjs": "^6.4.0"
256 | }
257 | },
258 | "@types/json-schema": {
259 | "version": "7.0.8",
260 | "resolved": "https://registry.nlark.com/@types/json-schema/download/@types/json-schema-7.0.8.tgz?cache=0&sync_timestamp=1625608069156&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.8.tgz",
261 | "integrity": "sha1-7fG/Hb9OBEE8qOWxezt9fVS1mBg="
262 | },
263 | "@types/json5": {
264 | "version": "0.0.29",
265 | "resolved": "https://registry.nlark.com/@types/json5/download/@types/json5-0.0.29.tgz",
266 | "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
267 | "dev": true
268 | },
269 | "@types/lodash": {
270 | "version": "4.14.171",
271 | "resolved": "https://registry.nlark.com/@types/lodash/download/@types/lodash-4.14.171.tgz?cache=0&sync_timestamp=1625609589008&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Flodash%2Fdownload%2F%40types%2Flodash-4.14.171.tgz",
272 | "integrity": "sha1-8Bs6X+NJnjS2IsNipGpgn9sjVzs="
273 | },
274 | "@types/minimatch": {
275 | "version": "3.0.5",
276 | "resolved": "https://registry.nlark.com/@types/minimatch/download/@types/minimatch-3.0.5.tgz?cache=0&sync_timestamp=1625616331953&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fminimatch%2Fdownload%2F%40types%2Fminimatch-3.0.5.tgz",
277 | "integrity": "sha1-EAHMXmo3BLg8I2An538vWOoBD0A="
278 | },
279 | "@types/multi-progress": {
280 | "version": "2.0.3",
281 | "resolved": "https://registry.nlark.com/@types/multi-progress/download/@types/multi-progress-2.0.3.tgz",
282 | "integrity": "sha1-JZ0FFo/581D3NGNGIYeEUm+Dh5k=",
283 | "dev": true,
284 | "requires": {
285 | "@types/node": "*",
286 | "@types/progress": "*"
287 | }
288 | },
289 | "@types/nedb": {
290 | "version": "1.8.12",
291 | "resolved": "https://registry.nlark.com/@types/nedb/download/@types/nedb-1.8.12.tgz",
292 | "integrity": "sha1-WXuxJN2vFgOcbUePSrwKjyAGsTQ=",
293 | "dev": true,
294 | "requires": {
295 | "@types/node": "*"
296 | }
297 | },
298 | "@types/node": {
299 | "version": "15.14.0",
300 | "resolved": "https://registry.nlark.com/@types/node/download/@types/node-15.14.0.tgz?cache=0&sync_timestamp=1627257813519&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-15.14.0.tgz",
301 | "integrity": "sha1-dNvyVPs3VVGp0qcfr2udvCF43FM="
302 | },
303 | "@types/prettier": {
304 | "version": "2.3.2",
305 | "resolved": "https://registry.nlark.com/@types/prettier/download/@types/prettier-2.3.2.tgz",
306 | "integrity": "sha1-/IwoJeTtIUJHO0qBBk5uCBRj0bM="
307 | },
308 | "@types/progress": {
309 | "version": "2.0.4",
310 | "resolved": "https://registry.nlark.com/@types/progress/download/@types/progress-2.0.4.tgz",
311 | "integrity": "sha1-AfjrBqX2vjlrgdGaIPJzzqEe+bY=",
312 | "dev": true,
313 | "requires": {
314 | "@types/node": "*"
315 | }
316 | },
317 | "@types/resolve": {
318 | "version": "1.17.1",
319 | "resolved": "https://registry.nlark.com/@types/resolve/download/@types/resolve-1.17.1.tgz",
320 | "integrity": "sha1-Ov1q2JZ8d+Q3bFmKgt3Vj0bsRdY=",
321 | "dev": true,
322 | "requires": {
323 | "@types/node": "*"
324 | }
325 | },
326 | "@types/single-line-log": {
327 | "version": "1.1.0",
328 | "resolved": "https://registry.nlark.com/@types/single-line-log/download/@types/single-line-log-1.1.0.tgz",
329 | "integrity": "sha1-fm/E6OeF9fWrERV0GN8mhKIe2XE=",
330 | "dev": true
331 | },
332 | "@types/through": {
333 | "version": "0.0.30",
334 | "resolved": "https://registry.nlark.com/@types/through/download/@types/through-0.0.30.tgz",
335 | "integrity": "sha1-4OQs536Je9aurW9upirrE1uKOJU=",
336 | "dev": true,
337 | "requires": {
338 | "@types/node": "*"
339 | }
340 | },
341 | "@typescript-eslint/eslint-plugin": {
342 | "version": "4.28.4",
343 | "resolved": "https://registry.nlark.com/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-4.28.4.tgz?cache=0&sync_timestamp=1626715757255&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40typescript-eslint%2Feslint-plugin%2Fdownload%2F%40typescript-eslint%2Feslint-plugin-4.28.4.tgz",
344 | "integrity": "sha1-5zyMq78/CN7g4b2mXtTmIq6PiSE=",
345 | "dev": true,
346 | "requires": {
347 | "@typescript-eslint/experimental-utils": "4.28.4",
348 | "@typescript-eslint/scope-manager": "4.28.4",
349 | "debug": "^4.3.1",
350 | "functional-red-black-tree": "^1.0.1",
351 | "regexpp": "^3.1.0",
352 | "semver": "^7.3.5",
353 | "tsutils": "^3.21.0"
354 | }
355 | },
356 | "@typescript-eslint/experimental-utils": {
357 | "version": "4.28.4",
358 | "resolved": "https://registry.nlark.com/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-4.28.4.tgz",
359 | "integrity": "sha1-nHDDXr7Qh6XHD7Ds2Ql5VHt/7JY=",
360 | "dev": true,
361 | "requires": {
362 | "@types/json-schema": "^7.0.7",
363 | "@typescript-eslint/scope-manager": "4.28.4",
364 | "@typescript-eslint/types": "4.28.4",
365 | "@typescript-eslint/typescript-estree": "4.28.4",
366 | "eslint-scope": "^5.1.1",
367 | "eslint-utils": "^3.0.0"
368 | },
369 | "dependencies": {
370 | "eslint-utils": {
371 | "version": "3.0.0",
372 | "resolved": "https://registry.nlark.com/eslint-utils/download/eslint-utils-3.0.0.tgz",
373 | "integrity": "sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI=",
374 | "dev": true,
375 | "requires": {
376 | "eslint-visitor-keys": "^2.0.0"
377 | }
378 | }
379 | }
380 | },
381 | "@typescript-eslint/parser": {
382 | "version": "4.28.4",
383 | "resolved": "https://registry.nlark.com/@typescript-eslint/parser/download/@typescript-eslint/parser-4.28.4.tgz?cache=0&sync_timestamp=1626715756323&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40typescript-eslint%2Fparser%2Fdownload%2F%40typescript-eslint%2Fparser-4.28.4.tgz",
384 | "integrity": "sha1-vEYtwnea/u/c9JCCUWr9w+e5b6s=",
385 | "dev": true,
386 | "requires": {
387 | "@typescript-eslint/scope-manager": "4.28.4",
388 | "@typescript-eslint/types": "4.28.4",
389 | "@typescript-eslint/typescript-estree": "4.28.4",
390 | "debug": "^4.3.1"
391 | }
392 | },
393 | "@typescript-eslint/scope-manager": {
394 | "version": "4.28.4",
395 | "resolved": "https://registry.nlark.com/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-4.28.4.tgz?cache=0&sync_timestamp=1626715953543&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40typescript-eslint%2Fscope-manager%2Fdownload%2F%40typescript-eslint%2Fscope-manager-4.28.4.tgz",
396 | "integrity": "sha1-vbzptqZE4092e9aLwXuxQ1O5/n8=",
397 | "dev": true,
398 | "requires": {
399 | "@typescript-eslint/types": "4.28.4",
400 | "@typescript-eslint/visitor-keys": "4.28.4"
401 | }
402 | },
403 | "@typescript-eslint/types": {
404 | "version": "4.28.4",
405 | "resolved": "https://registry.nlark.com/@typescript-eslint/types/download/@typescript-eslint/types-4.28.4.tgz?cache=0&sync_timestamp=1626715941479&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40typescript-eslint%2Ftypes%2Fdownload%2F%40typescript-eslint%2Ftypes-4.28.4.tgz",
406 | "integrity": "sha1-Qay9ebWBa3wN11MKQ9l9Ag0660I=",
407 | "dev": true
408 | },
409 | "@typescript-eslint/typescript-estree": {
410 | "version": "4.28.4",
411 | "resolved": "https://registry.nlark.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-4.28.4.tgz",
412 | "integrity": "sha1-JS5oYyeNwHJyRL6eNx6zUkHEbQA=",
413 | "dev": true,
414 | "requires": {
415 | "@typescript-eslint/types": "4.28.4",
416 | "@typescript-eslint/visitor-keys": "4.28.4",
417 | "debug": "^4.3.1",
418 | "globby": "^11.0.3",
419 | "is-glob": "^4.0.1",
420 | "semver": "^7.3.5",
421 | "tsutils": "^3.21.0"
422 | },
423 | "dependencies": {
424 | "globby": {
425 | "version": "11.0.4",
426 | "resolved": "https://registry.nlark.com/globby/download/globby-11.0.4.tgz",
427 | "integrity": "sha1-LLr/d8Lypi5x6bKBOme5ejowAaU=",
428 | "dev": true,
429 | "requires": {
430 | "array-union": "^2.1.0",
431 | "dir-glob": "^3.0.1",
432 | "fast-glob": "^3.1.1",
433 | "ignore": "^5.1.4",
434 | "merge2": "^1.3.0",
435 | "slash": "^3.0.0"
436 | }
437 | }
438 | }
439 | },
440 | "@typescript-eslint/visitor-keys": {
441 | "version": "4.28.4",
442 | "resolved": "https://registry.nlark.com/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-4.28.4.tgz?cache=0&sync_timestamp=1626715965165&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40typescript-eslint%2Fvisitor-keys%2Fdownload%2F%40typescript-eslint%2Fvisitor-keys-4.28.4.tgz",
443 | "integrity": "sha1-ktrP78zWdRy7CpZPBmg7/XLQxNM=",
444 | "dev": true,
445 | "requires": {
446 | "@typescript-eslint/types": "4.28.4",
447 | "eslint-visitor-keys": "^2.0.0"
448 | }
449 | },
450 | "acorn": {
451 | "version": "7.4.1",
452 | "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz",
453 | "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
454 | "dev": true
455 | },
456 | "acorn-jsx": {
457 | "version": "5.3.2",
458 | "resolved": "https://registry.nlark.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz",
459 | "integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=",
460 | "dev": true
461 | },
462 | "ajv": {
463 | "version": "6.12.6",
464 | "resolved": "https://registry.nlark.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1626380134544&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz",
465 | "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=",
466 | "dev": true,
467 | "requires": {
468 | "fast-deep-equal": "^3.1.1",
469 | "fast-json-stable-stringify": "^2.0.0",
470 | "json-schema-traverse": "^0.4.1",
471 | "uri-js": "^4.2.2"
472 | }
473 | },
474 | "ansi-colors": {
475 | "version": "4.1.1",
476 | "resolved": "https://registry.nlark.com/ansi-colors/download/ansi-colors-4.1.1.tgz",
477 | "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=",
478 | "dev": true
479 | },
480 | "ansi-escapes": {
481 | "version": "4.3.2",
482 | "resolved": "https://registry.nlark.com/ansi-escapes/download/ansi-escapes-4.3.2.tgz?cache=0&sync_timestamp=1618847144938&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-escapes%2Fdownload%2Fansi-escapes-4.3.2.tgz",
483 | "integrity": "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=",
484 | "requires": {
485 | "type-fest": "^0.21.3"
486 | },
487 | "dependencies": {
488 | "type-fest": {
489 | "version": "0.21.3",
490 | "resolved": "https://registry.nlark.com/type-fest/download/type-fest-0.21.3.tgz?cache=0&sync_timestamp=1625745315038&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.21.3.tgz",
491 | "integrity": "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc="
492 | }
493 | }
494 | },
495 | "ansi-regex": {
496 | "version": "2.1.1",
497 | "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz",
498 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
499 | },
500 | "ansi-styles": {
501 | "version": "3.2.1",
502 | "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-3.2.1.tgz",
503 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
504 | "dev": true,
505 | "requires": {
506 | "color-convert": "^1.9.0"
507 | }
508 | },
509 | "any-promise": {
510 | "version": "1.3.0",
511 | "resolved": "https://registry.nlark.com/any-promise/download/any-promise-1.3.0.tgz",
512 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
513 | },
514 | "arg": {
515 | "version": "4.1.3",
516 | "resolved": "https://registry.npm.taobao.org/arg/download/arg-4.1.3.tgz?cache=0&sync_timestamp=1605574972657&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farg%2Fdownload%2Farg-4.1.3.tgz",
517 | "integrity": "sha1-Jp/HrVuOQstjyJbVZmAXJhwUQIk=",
518 | "dev": true
519 | },
520 | "argparse": {
521 | "version": "1.0.10",
522 | "resolved": "https://registry.nlark.com/argparse/download/argparse-1.0.10.tgz",
523 | "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
524 | "dev": true,
525 | "requires": {
526 | "sprintf-js": "~1.0.2"
527 | }
528 | },
529 | "array-includes": {
530 | "version": "3.1.3",
531 | "resolved": "https://registry.npm.taobao.org/array-includes/download/array-includes-3.1.3.tgz?cache=0&sync_timestamp=1613857733971&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-includes%2Fdownload%2Farray-includes-3.1.3.tgz",
532 | "integrity": "sha1-x/YZs4KtKvr1Mmzd/cCvxhr3aQo=",
533 | "dev": true,
534 | "requires": {
535 | "call-bind": "^1.0.2",
536 | "define-properties": "^1.1.3",
537 | "es-abstract": "^1.18.0-next.2",
538 | "get-intrinsic": "^1.1.1",
539 | "is-string": "^1.0.5"
540 | }
541 | },
542 | "array-union": {
543 | "version": "2.1.0",
544 | "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-2.1.0.tgz",
545 | "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=",
546 | "dev": true
547 | },
548 | "array.prototype.flat": {
549 | "version": "1.2.4",
550 | "resolved": "https://registry.npm.taobao.org/array.prototype.flat/download/array.prototype.flat-1.2.4.tgz?cache=0&sync_timestamp=1605688512391&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray.prototype.flat%2Fdownload%2Farray.prototype.flat-1.2.4.tgz",
551 | "integrity": "sha1-bvY4tDMSvUAbTGGZ/ex+LcnpoSM=",
552 | "dev": true,
553 | "requires": {
554 | "call-bind": "^1.0.0",
555 | "define-properties": "^1.1.3",
556 | "es-abstract": "^1.18.0-next.1"
557 | }
558 | },
559 | "astral-regex": {
560 | "version": "2.0.0",
561 | "resolved": "https://registry.nlark.com/astral-regex/download/astral-regex-2.0.0.tgz",
562 | "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=",
563 | "dev": true
564 | },
565 | "async": {
566 | "version": "0.2.10",
567 | "resolved": "https://registry.nlark.com/async/download/async-0.2.10.tgz",
568 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
569 | },
570 | "axios": {
571 | "version": "0.21.1",
572 | "resolved": "https://registry.nlark.com/axios/download/axios-0.21.1.tgz",
573 | "integrity": "sha1-IlY0gZYvTWvemnbVFu8OXTwJsrg=",
574 | "requires": {
575 | "follow-redirects": "^1.10.0"
576 | }
577 | },
578 | "balanced-match": {
579 | "version": "1.0.2",
580 | "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz",
581 | "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4="
582 | },
583 | "base64-js": {
584 | "version": "1.5.1",
585 | "resolved": "https://registry.nlark.com/base64-js/download/base64-js-1.5.1.tgz",
586 | "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo="
587 | },
588 | "binary-search-tree": {
589 | "version": "0.2.5",
590 | "resolved": "https://registry.npm.taobao.org/binary-search-tree/download/binary-search-tree-0.2.5.tgz",
591 | "integrity": "sha1-fbs7IQ/coIJFDa0jNMMErzm9x4Q=",
592 | "requires": {
593 | "underscore": "~1.4.4"
594 | }
595 | },
596 | "bl": {
597 | "version": "4.1.0",
598 | "resolved": "https://registry.npm.taobao.org/bl/download/bl-4.1.0.tgz?cache=0&sync_timestamp=1617381897308&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbl%2Fdownload%2Fbl-4.1.0.tgz",
599 | "integrity": "sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo=",
600 | "requires": {
601 | "buffer": "^5.5.0",
602 | "inherits": "^2.0.4",
603 | "readable-stream": "^3.4.0"
604 | }
605 | },
606 | "brace-expansion": {
607 | "version": "1.1.11",
608 | "resolved": "https://registry.nlark.com/brace-expansion/download/brace-expansion-1.1.11.tgz",
609 | "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
610 | "requires": {
611 | "balanced-match": "^1.0.0",
612 | "concat-map": "0.0.1"
613 | }
614 | },
615 | "braces": {
616 | "version": "3.0.2",
617 | "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz",
618 | "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
619 | "dev": true,
620 | "requires": {
621 | "fill-range": "^7.0.1"
622 | }
623 | },
624 | "buffer": {
625 | "version": "5.7.1",
626 | "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-5.7.1.tgz",
627 | "integrity": "sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA=",
628 | "requires": {
629 | "base64-js": "^1.3.1",
630 | "ieee754": "^1.1.13"
631 | }
632 | },
633 | "buffer-from": {
634 | "version": "1.1.1",
635 | "resolved": "https://registry.nlark.com/buffer-from/download/buffer-from-1.1.1.tgz",
636 | "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=",
637 | "dev": true
638 | },
639 | "builtin-modules": {
640 | "version": "3.2.0",
641 | "resolved": "https://registry.npm.taobao.org/builtin-modules/download/builtin-modules-3.2.0.tgz",
642 | "integrity": "sha1-RdXbmefuXmvE82LgCL+RerUEmIc=",
643 | "dev": true
644 | },
645 | "call-bind": {
646 | "version": "1.0.2",
647 | "resolved": "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz",
648 | "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=",
649 | "dev": true,
650 | "requires": {
651 | "function-bind": "^1.1.1",
652 | "get-intrinsic": "^1.0.2"
653 | }
654 | },
655 | "call-me-maybe": {
656 | "version": "1.0.1",
657 | "resolved": "https://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz",
658 | "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
659 | },
660 | "callsites": {
661 | "version": "3.1.0",
662 | "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz",
663 | "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=",
664 | "dev": true
665 | },
666 | "chalk": {
667 | "version": "4.1.1",
668 | "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.1.tgz?cache=0&sync_timestamp=1618995367379&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.1.tgz",
669 | "integrity": "sha1-yAs/qyi/Y3HmhjMl7uZ+YYt35q0=",
670 | "requires": {
671 | "ansi-styles": "^4.1.0",
672 | "supports-color": "^7.1.0"
673 | },
674 | "dependencies": {
675 | "ansi-styles": {
676 | "version": "4.3.0",
677 | "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz",
678 | "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
679 | "requires": {
680 | "color-convert": "^2.0.1"
681 | }
682 | },
683 | "color-convert": {
684 | "version": "2.0.1",
685 | "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
686 | "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
687 | "requires": {
688 | "color-name": "~1.1.4"
689 | }
690 | },
691 | "color-name": {
692 | "version": "1.1.4",
693 | "resolved": "https://registry.nlark.com/color-name/download/color-name-1.1.4.tgz",
694 | "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI="
695 | },
696 | "has-flag": {
697 | "version": "4.0.0",
698 | "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz",
699 | "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s="
700 | },
701 | "supports-color": {
702 | "version": "7.2.0",
703 | "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
704 | "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
705 | "requires": {
706 | "has-flag": "^4.0.0"
707 | }
708 | }
709 | }
710 | },
711 | "chardet": {
712 | "version": "0.7.0",
713 | "resolved": "https://registry.nlark.com/chardet/download/chardet-0.7.0.tgz",
714 | "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4="
715 | },
716 | "cli-color": {
717 | "version": "2.0.0",
718 | "resolved": "https://registry.npm.taobao.org/cli-color/download/cli-color-2.0.0.tgz",
719 | "integrity": "sha1-Eez7WKeSeM9gNaYMVOM4+dg3iXw=",
720 | "requires": {
721 | "ansi-regex": "^2.1.1",
722 | "d": "^1.0.1",
723 | "es5-ext": "^0.10.51",
724 | "es6-iterator": "^2.0.3",
725 | "memoizee": "^0.4.14",
726 | "timers-ext": "^0.1.7"
727 | }
728 | },
729 | "cli-cursor": {
730 | "version": "3.1.0",
731 | "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-3.1.0.tgz",
732 | "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=",
733 | "requires": {
734 | "restore-cursor": "^3.1.0"
735 | }
736 | },
737 | "cli-spinners": {
738 | "version": "2.6.0",
739 | "resolved": "https://registry.nlark.com/cli-spinners/download/cli-spinners-2.6.0.tgz",
740 | "integrity": "sha1-NsfcmPtqmna9YjjsP3fiQlYn6Tk="
741 | },
742 | "cli-width": {
743 | "version": "3.0.0",
744 | "resolved": "https://registry.nlark.com/cli-width/download/cli-width-3.0.0.tgz",
745 | "integrity": "sha1-ovSEN6LKqaIkNueUvwceyeYc7fY="
746 | },
747 | "clone": {
748 | "version": "1.0.4",
749 | "resolved": "https://registry.nlark.com/clone/download/clone-1.0.4.tgz",
750 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
751 | },
752 | "color-convert": {
753 | "version": "1.9.3",
754 | "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz",
755 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
756 | "dev": true,
757 | "requires": {
758 | "color-name": "1.1.3"
759 | }
760 | },
761 | "color-name": {
762 | "version": "1.1.3",
763 | "resolved": "https://registry.nlark.com/color-name/download/color-name-1.1.3.tgz",
764 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
765 | "dev": true
766 | },
767 | "colorette": {
768 | "version": "1.2.2",
769 | "resolved": "https://registry.nlark.com/colorette/download/colorette-1.2.2.tgz",
770 | "integrity": "sha1-y8x51emcrqLb8Q6zom/Ys+as+pQ=",
771 | "dev": true
772 | },
773 | "commander": {
774 | "version": "7.2.0",
775 | "resolved": "https://registry.nlark.com/commander/download/commander-7.2.0.tgz?cache=0&sync_timestamp=1624609539421&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-7.2.0.tgz",
776 | "integrity": "sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc="
777 | },
778 | "commondir": {
779 | "version": "1.0.1",
780 | "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz",
781 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
782 | "dev": true
783 | },
784 | "concat-map": {
785 | "version": "0.0.1",
786 | "resolved": "https://registry.nlark.com/concat-map/download/concat-map-0.0.1.tgz",
787 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
788 | },
789 | "create-require": {
790 | "version": "1.1.1",
791 | "resolved": "https://registry.npm.taobao.org/create-require/download/create-require-1.1.1.tgz",
792 | "integrity": "sha1-wdfo8eX2z8n/ZfnNNS03NIdWwzM=",
793 | "dev": true
794 | },
795 | "cross-spawn": {
796 | "version": "7.0.3",
797 | "resolved": "https://registry.nlark.com/cross-spawn/download/cross-spawn-7.0.3.tgz",
798 | "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=",
799 | "dev": true,
800 | "requires": {
801 | "path-key": "^3.1.0",
802 | "shebang-command": "^2.0.0",
803 | "which": "^2.0.1"
804 | }
805 | },
806 | "d": {
807 | "version": "1.0.1",
808 | "resolved": "https://registry.nlark.com/d/download/d-1.0.1.tgz",
809 | "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=",
810 | "requires": {
811 | "es5-ext": "^0.10.50",
812 | "type": "^1.0.1"
813 | }
814 | },
815 | "debug": {
816 | "version": "4.3.2",
817 | "resolved": "https://registry.nlark.com/debug/download/debug-4.3.2.tgz",
818 | "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=",
819 | "dev": true,
820 | "requires": {
821 | "ms": "2.1.2"
822 | }
823 | },
824 | "deep-is": {
825 | "version": "0.1.3",
826 | "resolved": "https://registry.nlark.com/deep-is/download/deep-is-0.1.3.tgz",
827 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
828 | "dev": true
829 | },
830 | "deepmerge": {
831 | "version": "4.2.2",
832 | "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-4.2.2.tgz",
833 | "integrity": "sha1-RNLqNnm49NT/ujPwPYZfwee/SVU=",
834 | "dev": true
835 | },
836 | "defaults": {
837 | "version": "1.0.3",
838 | "resolved": "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz",
839 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
840 | "requires": {
841 | "clone": "^1.0.2"
842 | }
843 | },
844 | "define-properties": {
845 | "version": "1.1.3",
846 | "resolved": "https://registry.nlark.com/define-properties/download/define-properties-1.1.3.tgz?cache=0&sync_timestamp=1618847174317&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdefine-properties%2Fdownload%2Fdefine-properties-1.1.3.tgz",
847 | "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=",
848 | "dev": true,
849 | "requires": {
850 | "object-keys": "^1.0.12"
851 | }
852 | },
853 | "diff": {
854 | "version": "4.0.2",
855 | "resolved": "https://registry.nlark.com/diff/download/diff-4.0.2.tgz?cache=0&sync_timestamp=1622685824253&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdiff%2Fdownload%2Fdiff-4.0.2.tgz",
856 | "integrity": "sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0=",
857 | "dev": true
858 | },
859 | "dir-glob": {
860 | "version": "3.0.1",
861 | "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz",
862 | "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=",
863 | "dev": true,
864 | "requires": {
865 | "path-type": "^4.0.0"
866 | },
867 | "dependencies": {
868 | "path-type": {
869 | "version": "4.0.0",
870 | "resolved": "https://registry.nlark.com/path-type/download/path-type-4.0.0.tgz",
871 | "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=",
872 | "dev": true
873 | }
874 | }
875 | },
876 | "doctrine": {
877 | "version": "2.1.0",
878 | "resolved": "https://registry.nlark.com/doctrine/download/doctrine-2.1.0.tgz",
879 | "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=",
880 | "dev": true,
881 | "requires": {
882 | "esutils": "^2.0.2"
883 | }
884 | },
885 | "emoji-regex": {
886 | "version": "8.0.0",
887 | "resolved": "https://registry.nlark.com/emoji-regex/download/emoji-regex-8.0.0.tgz",
888 | "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc="
889 | },
890 | "enquirer": {
891 | "version": "2.3.6",
892 | "resolved": "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz",
893 | "integrity": "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00=",
894 | "dev": true,
895 | "requires": {
896 | "ansi-colors": "^4.1.1"
897 | }
898 | },
899 | "error-ex": {
900 | "version": "1.3.2",
901 | "resolved": "https://registry.nlark.com/error-ex/download/error-ex-1.3.2.tgz",
902 | "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
903 | "dev": true,
904 | "requires": {
905 | "is-arrayish": "^0.2.1"
906 | }
907 | },
908 | "es-abstract": {
909 | "version": "1.18.3",
910 | "resolved": "https://registry.nlark.com/es-abstract/download/es-abstract-1.18.3.tgz?cache=0&sync_timestamp=1622157901871&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fes-abstract%2Fdownload%2Fes-abstract-1.18.3.tgz",
911 | "integrity": "sha1-JcTDOAonqiA8RLK2hbupTaMbY+A=",
912 | "dev": true,
913 | "requires": {
914 | "call-bind": "^1.0.2",
915 | "es-to-primitive": "^1.2.1",
916 | "function-bind": "^1.1.1",
917 | "get-intrinsic": "^1.1.1",
918 | "has": "^1.0.3",
919 | "has-symbols": "^1.0.2",
920 | "is-callable": "^1.2.3",
921 | "is-negative-zero": "^2.0.1",
922 | "is-regex": "^1.1.3",
923 | "is-string": "^1.0.6",
924 | "object-inspect": "^1.10.3",
925 | "object-keys": "^1.1.1",
926 | "object.assign": "^4.1.2",
927 | "string.prototype.trimend": "^1.0.4",
928 | "string.prototype.trimstart": "^1.0.4",
929 | "unbox-primitive": "^1.0.1"
930 | }
931 | },
932 | "es-to-primitive": {
933 | "version": "1.2.1",
934 | "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz",
935 | "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=",
936 | "dev": true,
937 | "requires": {
938 | "is-callable": "^1.1.4",
939 | "is-date-object": "^1.0.1",
940 | "is-symbol": "^1.0.2"
941 | }
942 | },
943 | "es5-ext": {
944 | "version": "0.10.53",
945 | "resolved": "https://registry.nlark.com/es5-ext/download/es5-ext-0.10.53.tgz",
946 | "integrity": "sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE=",
947 | "requires": {
948 | "es6-iterator": "~2.0.3",
949 | "es6-symbol": "~3.1.3",
950 | "next-tick": "~1.0.0"
951 | }
952 | },
953 | "es6-iterator": {
954 | "version": "2.0.3",
955 | "resolved": "https://registry.nlark.com/es6-iterator/download/es6-iterator-2.0.3.tgz",
956 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
957 | "requires": {
958 | "d": "1",
959 | "es5-ext": "^0.10.35",
960 | "es6-symbol": "^3.1.1"
961 | }
962 | },
963 | "es6-symbol": {
964 | "version": "3.1.3",
965 | "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.3.tgz",
966 | "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=",
967 | "requires": {
968 | "d": "^1.0.1",
969 | "ext": "^1.1.2"
970 | }
971 | },
972 | "es6-weak-map": {
973 | "version": "2.0.3",
974 | "resolved": "https://registry.nlark.com/es6-weak-map/download/es6-weak-map-2.0.3.tgz",
975 | "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=",
976 | "requires": {
977 | "d": "1",
978 | "es5-ext": "^0.10.46",
979 | "es6-iterator": "^2.0.3",
980 | "es6-symbol": "^3.1.1"
981 | }
982 | },
983 | "escape-string-regexp": {
984 | "version": "4.0.0",
985 | "resolved": "https://registry.nlark.com/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz",
986 | "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=",
987 | "dev": true
988 | },
989 | "eslint": {
990 | "version": "7.31.0",
991 | "resolved": "https://registry.nlark.com/eslint/download/eslint-7.31.0.tgz",
992 | "integrity": "sha1-+XK1OUJL8mBJB6lwhgcyxdmdOso=",
993 | "dev": true,
994 | "requires": {
995 | "@babel/code-frame": "7.12.11",
996 | "@eslint/eslintrc": "^0.4.3",
997 | "@humanwhocodes/config-array": "^0.5.0",
998 | "ajv": "^6.10.0",
999 | "chalk": "^4.0.0",
1000 | "cross-spawn": "^7.0.2",
1001 | "debug": "^4.0.1",
1002 | "doctrine": "^3.0.0",
1003 | "enquirer": "^2.3.5",
1004 | "escape-string-regexp": "^4.0.0",
1005 | "eslint-scope": "^5.1.1",
1006 | "eslint-utils": "^2.1.0",
1007 | "eslint-visitor-keys": "^2.0.0",
1008 | "espree": "^7.3.1",
1009 | "esquery": "^1.4.0",
1010 | "esutils": "^2.0.2",
1011 | "fast-deep-equal": "^3.1.3",
1012 | "file-entry-cache": "^6.0.1",
1013 | "functional-red-black-tree": "^1.0.1",
1014 | "glob-parent": "^5.1.2",
1015 | "globals": "^13.6.0",
1016 | "ignore": "^4.0.6",
1017 | "import-fresh": "^3.0.0",
1018 | "imurmurhash": "^0.1.4",
1019 | "is-glob": "^4.0.0",
1020 | "js-yaml": "^3.13.1",
1021 | "json-stable-stringify-without-jsonify": "^1.0.1",
1022 | "levn": "^0.4.1",
1023 | "lodash.merge": "^4.6.2",
1024 | "minimatch": "^3.0.4",
1025 | "natural-compare": "^1.4.0",
1026 | "optionator": "^0.9.1",
1027 | "progress": "^2.0.0",
1028 | "regexpp": "^3.1.0",
1029 | "semver": "^7.2.1",
1030 | "strip-ansi": "^6.0.0",
1031 | "strip-json-comments": "^3.1.0",
1032 | "table": "^6.0.9",
1033 | "text-table": "^0.2.0",
1034 | "v8-compile-cache": "^2.0.3"
1035 | },
1036 | "dependencies": {
1037 | "doctrine": {
1038 | "version": "3.0.0",
1039 | "resolved": "https://registry.nlark.com/doctrine/download/doctrine-3.0.0.tgz",
1040 | "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=",
1041 | "dev": true,
1042 | "requires": {
1043 | "esutils": "^2.0.2"
1044 | }
1045 | },
1046 | "ignore": {
1047 | "version": "4.0.6",
1048 | "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz",
1049 | "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
1050 | "dev": true
1051 | }
1052 | }
1053 | },
1054 | "eslint-config-standard": {
1055 | "version": "16.0.3",
1056 | "resolved": "https://registry.nlark.com/eslint-config-standard/download/eslint-config-standard-16.0.3.tgz?cache=0&sync_timestamp=1621877616191&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-config-standard%2Fdownload%2Feslint-config-standard-16.0.3.tgz",
1057 | "integrity": "sha1-bIdh5UTpbFMf+SZC7rh4QrhIhRY=",
1058 | "dev": true
1059 | },
1060 | "eslint-import-resolver-node": {
1061 | "version": "0.3.4",
1062 | "resolved": "https://registry.npm.taobao.org/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.4.tgz",
1063 | "integrity": "sha1-hf+oGULCUBLYIxCW3fZ5wDBCxxc=",
1064 | "dev": true,
1065 | "requires": {
1066 | "debug": "^2.6.9",
1067 | "resolve": "^1.13.1"
1068 | },
1069 | "dependencies": {
1070 | "debug": {
1071 | "version": "2.6.9",
1072 | "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz",
1073 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
1074 | "dev": true,
1075 | "requires": {
1076 | "ms": "2.0.0"
1077 | }
1078 | },
1079 | "ms": {
1080 | "version": "2.0.0",
1081 | "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
1082 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1083 | "dev": true
1084 | }
1085 | }
1086 | },
1087 | "eslint-module-utils": {
1088 | "version": "2.6.1",
1089 | "resolved": "https://registry.nlark.com/eslint-module-utils/download/eslint-module-utils-2.6.1.tgz?cache=0&sync_timestamp=1620972183296&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-module-utils%2Fdownload%2Feslint-module-utils-2.6.1.tgz",
1090 | "integrity": "sha1-tRvh5HPdDeHF6mOOIkKcJJDqgjM=",
1091 | "dev": true,
1092 | "requires": {
1093 | "debug": "^3.2.7",
1094 | "pkg-dir": "^2.0.0"
1095 | },
1096 | "dependencies": {
1097 | "debug": {
1098 | "version": "3.2.7",
1099 | "resolved": "https://registry.nlark.com/debug/download/debug-3.2.7.tgz",
1100 | "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=",
1101 | "dev": true,
1102 | "requires": {
1103 | "ms": "^2.1.1"
1104 | }
1105 | }
1106 | }
1107 | },
1108 | "eslint-plugin-es": {
1109 | "version": "3.0.1",
1110 | "resolved": "https://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-3.0.1.tgz?cache=0&sync_timestamp=1605772184308&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-es%2Fdownload%2Feslint-plugin-es-3.0.1.tgz",
1111 | "integrity": "sha1-dafN/czdwFiZNK7rOEF18iHFeJM=",
1112 | "dev": true,
1113 | "requires": {
1114 | "eslint-utils": "^2.0.0",
1115 | "regexpp": "^3.0.0"
1116 | }
1117 | },
1118 | "eslint-plugin-import": {
1119 | "version": "2.23.4",
1120 | "resolved": "https://registry.nlark.com/eslint-plugin-import/download/eslint-plugin-import-2.23.4.tgz",
1121 | "integrity": "sha1-jc6x7Wtz5G5Q7JpbskEbZF59PZc=",
1122 | "dev": true,
1123 | "requires": {
1124 | "array-includes": "^3.1.3",
1125 | "array.prototype.flat": "^1.2.4",
1126 | "debug": "^2.6.9",
1127 | "doctrine": "^2.1.0",
1128 | "eslint-import-resolver-node": "^0.3.4",
1129 | "eslint-module-utils": "^2.6.1",
1130 | "find-up": "^2.0.0",
1131 | "has": "^1.0.3",
1132 | "is-core-module": "^2.4.0",
1133 | "minimatch": "^3.0.4",
1134 | "object.values": "^1.1.3",
1135 | "pkg-up": "^2.0.0",
1136 | "read-pkg-up": "^3.0.0",
1137 | "resolve": "^1.20.0",
1138 | "tsconfig-paths": "^3.9.0"
1139 | },
1140 | "dependencies": {
1141 | "debug": {
1142 | "version": "2.6.9",
1143 | "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz",
1144 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
1145 | "dev": true,
1146 | "requires": {
1147 | "ms": "2.0.0"
1148 | }
1149 | },
1150 | "ms": {
1151 | "version": "2.0.0",
1152 | "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
1153 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1154 | "dev": true
1155 | }
1156 | }
1157 | },
1158 | "eslint-plugin-node": {
1159 | "version": "11.1.0",
1160 | "resolved": "https://registry.nlark.com/eslint-plugin-node/download/eslint-plugin-node-11.1.0.tgz",
1161 | "integrity": "sha1-yVVEQW7kraJnQKMEdO78VALcZx0=",
1162 | "dev": true,
1163 | "requires": {
1164 | "eslint-plugin-es": "^3.0.0",
1165 | "eslint-utils": "^2.0.0",
1166 | "ignore": "^5.1.1",
1167 | "minimatch": "^3.0.4",
1168 | "resolve": "^1.10.1",
1169 | "semver": "^6.1.0"
1170 | },
1171 | "dependencies": {
1172 | "semver": {
1173 | "version": "6.3.0",
1174 | "resolved": "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618847119601&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
1175 | "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
1176 | "dev": true
1177 | }
1178 | }
1179 | },
1180 | "eslint-plugin-prettier": {
1181 | "version": "3.4.0",
1182 | "resolved": "https://registry.nlark.com/eslint-plugin-prettier/download/eslint-plugin-prettier-3.4.0.tgz?cache=0&sync_timestamp=1618846983617&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-plugin-prettier%2Fdownload%2Feslint-plugin-prettier-3.4.0.tgz",
1183 | "integrity": "sha1-zbrTvx29Kxd+mCVzf+Y7R2oI8Mc=",
1184 | "dev": true,
1185 | "requires": {
1186 | "prettier-linter-helpers": "^1.0.0"
1187 | }
1188 | },
1189 | "eslint-plugin-promise": {
1190 | "version": "5.1.0",
1191 | "resolved": "https://registry.npm.taobao.org/eslint-plugin-promise/download/eslint-plugin-promise-5.1.0.tgz",
1192 | "integrity": "sha1-+yGI+3NORVeZNzO0GqGmiPRsbyQ=",
1193 | "dev": true
1194 | },
1195 | "eslint-scope": {
1196 | "version": "5.1.1",
1197 | "resolved": "https://registry.nlark.com/eslint-scope/download/eslint-scope-5.1.1.tgz",
1198 | "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=",
1199 | "dev": true,
1200 | "requires": {
1201 | "esrecurse": "^4.3.0",
1202 | "estraverse": "^4.1.1"
1203 | },
1204 | "dependencies": {
1205 | "estraverse": {
1206 | "version": "4.3.0",
1207 | "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz",
1208 | "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=",
1209 | "dev": true
1210 | }
1211 | }
1212 | },
1213 | "eslint-utils": {
1214 | "version": "2.1.0",
1215 | "resolved": "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz",
1216 | "integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=",
1217 | "dev": true,
1218 | "requires": {
1219 | "eslint-visitor-keys": "^1.1.0"
1220 | },
1221 | "dependencies": {
1222 | "eslint-visitor-keys": {
1223 | "version": "1.3.0",
1224 | "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz",
1225 | "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=",
1226 | "dev": true
1227 | }
1228 | }
1229 | },
1230 | "eslint-visitor-keys": {
1231 | "version": "2.1.0",
1232 | "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-2.1.0.tgz",
1233 | "integrity": "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=",
1234 | "dev": true
1235 | },
1236 | "espree": {
1237 | "version": "7.3.1",
1238 | "resolved": "https://registry.nlark.com/espree/download/espree-7.3.1.tgz",
1239 | "integrity": "sha1-8t8zC3Usb1UBn4vYm3ZgA5wbu7Y=",
1240 | "dev": true,
1241 | "requires": {
1242 | "acorn": "^7.4.0",
1243 | "acorn-jsx": "^5.3.1",
1244 | "eslint-visitor-keys": "^1.3.0"
1245 | },
1246 | "dependencies": {
1247 | "eslint-visitor-keys": {
1248 | "version": "1.3.0",
1249 | "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz",
1250 | "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=",
1251 | "dev": true
1252 | }
1253 | }
1254 | },
1255 | "esprima": {
1256 | "version": "4.0.1",
1257 | "resolved": "https://registry.nlark.com/esprima/download/esprima-4.0.1.tgz",
1258 | "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=",
1259 | "dev": true
1260 | },
1261 | "esquery": {
1262 | "version": "1.4.0",
1263 | "resolved": "https://registry.nlark.com/esquery/download/esquery-1.4.0.tgz",
1264 | "integrity": "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=",
1265 | "dev": true,
1266 | "requires": {
1267 | "estraverse": "^5.1.0"
1268 | }
1269 | },
1270 | "esrecurse": {
1271 | "version": "4.3.0",
1272 | "resolved": "https://registry.nlark.com/esrecurse/download/esrecurse-4.3.0.tgz",
1273 | "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=",
1274 | "dev": true,
1275 | "requires": {
1276 | "estraverse": "^5.2.0"
1277 | }
1278 | },
1279 | "estraverse": {
1280 | "version": "5.2.0",
1281 | "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz",
1282 | "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=",
1283 | "dev": true
1284 | },
1285 | "estree-walker": {
1286 | "version": "1.0.1",
1287 | "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-1.0.1.tgz?cache=0&sync_timestamp=1611956983677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festree-walker%2Fdownload%2Festree-walker-1.0.1.tgz",
1288 | "integrity": "sha1-MbxdYSyWtwQQa0d+bdXYqhOMtwA=",
1289 | "dev": true
1290 | },
1291 | "esutils": {
1292 | "version": "2.0.3",
1293 | "resolved": "https://registry.nlark.com/esutils/download/esutils-2.0.3.tgz",
1294 | "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=",
1295 | "dev": true
1296 | },
1297 | "event-emitter": {
1298 | "version": "0.3.5",
1299 | "resolved": "https://registry.npm.taobao.org/event-emitter/download/event-emitter-0.3.5.tgz",
1300 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
1301 | "requires": {
1302 | "d": "1",
1303 | "es5-ext": "~0.10.14"
1304 | }
1305 | },
1306 | "ext": {
1307 | "version": "1.4.0",
1308 | "resolved": "https://registry.npm.taobao.org/ext/download/ext-1.4.0.tgz",
1309 | "integrity": "sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ=",
1310 | "requires": {
1311 | "type": "^2.0.0"
1312 | },
1313 | "dependencies": {
1314 | "type": {
1315 | "version": "2.5.0",
1316 | "resolved": "https://registry.npm.taobao.org/type/download/type-2.5.0.tgz?cache=0&sync_timestamp=1615215448661&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype%2Fdownload%2Ftype-2.5.0.tgz",
1317 | "integrity": "sha1-Ci54wud5B7JSq+XymMGwHGPw2z0="
1318 | }
1319 | }
1320 | },
1321 | "external-editor": {
1322 | "version": "3.1.0",
1323 | "resolved": "https://registry.nlark.com/external-editor/download/external-editor-3.1.0.tgz",
1324 | "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=",
1325 | "requires": {
1326 | "chardet": "^0.7.0",
1327 | "iconv-lite": "^0.4.24",
1328 | "tmp": "^0.0.33"
1329 | }
1330 | },
1331 | "fast-deep-equal": {
1332 | "version": "3.1.3",
1333 | "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz",
1334 | "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=",
1335 | "dev": true
1336 | },
1337 | "fast-diff": {
1338 | "version": "1.2.0",
1339 | "resolved": "https://registry.npm.taobao.org/fast-diff/download/fast-diff-1.2.0.tgz",
1340 | "integrity": "sha1-c+4RmC2Gyq95WYKNUZz+kn+sXwM=",
1341 | "dev": true
1342 | },
1343 | "fast-glob": {
1344 | "version": "3.2.7",
1345 | "resolved": "https://registry.nlark.com/fast-glob/download/fast-glob-3.2.7.tgz",
1346 | "integrity": "sha1-/Wy3otfpqnp4RhEehaGW1rL3ZqE=",
1347 | "dev": true,
1348 | "requires": {
1349 | "@nodelib/fs.stat": "^2.0.2",
1350 | "@nodelib/fs.walk": "^1.2.3",
1351 | "glob-parent": "^5.1.2",
1352 | "merge2": "^1.3.0",
1353 | "micromatch": "^4.0.4"
1354 | }
1355 | },
1356 | "fast-json-stable-stringify": {
1357 | "version": "2.1.0",
1358 | "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz",
1359 | "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=",
1360 | "dev": true
1361 | },
1362 | "fast-levenshtein": {
1363 | "version": "2.0.6",
1364 | "resolved": "https://registry.nlark.com/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz",
1365 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
1366 | "dev": true
1367 | },
1368 | "fastq": {
1369 | "version": "1.11.1",
1370 | "resolved": "https://registry.nlark.com/fastq/download/fastq-1.11.1.tgz?cache=0&sync_timestamp=1625393024973&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffastq%2Fdownload%2Ffastq-1.11.1.tgz",
1371 | "integrity": "sha1-XYF1quF9thlH+LFiz8f2MmTSKAc=",
1372 | "dev": true,
1373 | "requires": {
1374 | "reusify": "^1.0.4"
1375 | }
1376 | },
1377 | "figures": {
1378 | "version": "3.2.0",
1379 | "resolved": "https://registry.nlark.com/figures/download/figures-3.2.0.tgz?cache=0&sync_timestamp=1625254307578&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffigures%2Fdownload%2Ffigures-3.2.0.tgz",
1380 | "integrity": "sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8=",
1381 | "requires": {
1382 | "escape-string-regexp": "^1.0.5"
1383 | },
1384 | "dependencies": {
1385 | "escape-string-regexp": {
1386 | "version": "1.0.5",
1387 | "resolved": "https://registry.nlark.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
1388 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
1389 | }
1390 | }
1391 | },
1392 | "file-entry-cache": {
1393 | "version": "6.0.1",
1394 | "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-6.0.1.tgz?cache=0&sync_timestamp=1613794357372&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-entry-cache%2Fdownload%2Ffile-entry-cache-6.0.1.tgz",
1395 | "integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=",
1396 | "dev": true,
1397 | "requires": {
1398 | "flat-cache": "^3.0.4"
1399 | }
1400 | },
1401 | "fill-range": {
1402 | "version": "7.0.1",
1403 | "resolved": "https://registry.nlark.com/fill-range/download/fill-range-7.0.1.tgz",
1404 | "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
1405 | "dev": true,
1406 | "requires": {
1407 | "to-regex-range": "^5.0.1"
1408 | }
1409 | },
1410 | "find-cache-dir": {
1411 | "version": "3.3.1",
1412 | "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz",
1413 | "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=",
1414 | "dev": true,
1415 | "requires": {
1416 | "commondir": "^1.0.1",
1417 | "make-dir": "^3.0.2",
1418 | "pkg-dir": "^4.1.0"
1419 | },
1420 | "dependencies": {
1421 | "find-up": {
1422 | "version": "4.1.0",
1423 | "resolved": "https://registry.nlark.com/find-up/download/find-up-4.1.0.tgz",
1424 | "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=",
1425 | "dev": true,
1426 | "requires": {
1427 | "locate-path": "^5.0.0",
1428 | "path-exists": "^4.0.0"
1429 | }
1430 | },
1431 | "locate-path": {
1432 | "version": "5.0.0",
1433 | "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz",
1434 | "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=",
1435 | "dev": true,
1436 | "requires": {
1437 | "p-locate": "^4.1.0"
1438 | }
1439 | },
1440 | "p-limit": {
1441 | "version": "2.3.0",
1442 | "resolved": "https://registry.nlark.com/p-limit/download/p-limit-2.3.0.tgz",
1443 | "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=",
1444 | "dev": true,
1445 | "requires": {
1446 | "p-try": "^2.0.0"
1447 | }
1448 | },
1449 | "p-locate": {
1450 | "version": "4.1.0",
1451 | "resolved": "https://registry.nlark.com/p-locate/download/p-locate-4.1.0.tgz",
1452 | "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=",
1453 | "dev": true,
1454 | "requires": {
1455 | "p-limit": "^2.2.0"
1456 | }
1457 | },
1458 | "p-try": {
1459 | "version": "2.2.0",
1460 | "resolved": "https://registry.nlark.com/p-try/download/p-try-2.2.0.tgz",
1461 | "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=",
1462 | "dev": true
1463 | },
1464 | "path-exists": {
1465 | "version": "4.0.0",
1466 | "resolved": "https://registry.nlark.com/path-exists/download/path-exists-4.0.0.tgz",
1467 | "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=",
1468 | "dev": true
1469 | },
1470 | "pkg-dir": {
1471 | "version": "4.2.0",
1472 | "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz",
1473 | "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=",
1474 | "dev": true,
1475 | "requires": {
1476 | "find-up": "^4.0.0"
1477 | }
1478 | }
1479 | }
1480 | },
1481 | "find-up": {
1482 | "version": "2.1.0",
1483 | "resolved": "https://registry.nlark.com/find-up/download/find-up-2.1.0.tgz",
1484 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
1485 | "dev": true,
1486 | "requires": {
1487 | "locate-path": "^2.0.0"
1488 | }
1489 | },
1490 | "flat-cache": {
1491 | "version": "3.0.4",
1492 | "resolved": "https://registry.nlark.com/flat-cache/download/flat-cache-3.0.4.tgz",
1493 | "integrity": "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=",
1494 | "dev": true,
1495 | "requires": {
1496 | "flatted": "^3.1.0",
1497 | "rimraf": "^3.0.2"
1498 | }
1499 | },
1500 | "flatted": {
1501 | "version": "3.2.1",
1502 | "resolved": "https://registry.nlark.com/flatted/download/flatted-3.2.1.tgz",
1503 | "integrity": "sha1-u+8IDZX8pnCTYscwRKFjT3xufQU=",
1504 | "dev": true
1505 | },
1506 | "follow-redirects": {
1507 | "version": "1.14.1",
1508 | "resolved": "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.1.tgz?cache=0&sync_timestamp=1620555300559&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.1.tgz",
1509 | "integrity": "sha1-2RFN7Qoc/dM04WTmZirQK/2R/0M="
1510 | },
1511 | "fs-extra": {
1512 | "version": "8.1.0",
1513 | "resolved": "https://registry.nlark.com/fs-extra/download/fs-extra-8.1.0.tgz",
1514 | "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
1515 | "dev": true,
1516 | "requires": {
1517 | "graceful-fs": "^4.2.0",
1518 | "jsonfile": "^4.0.0",
1519 | "universalify": "^0.1.0"
1520 | }
1521 | },
1522 | "fs.realpath": {
1523 | "version": "1.0.0",
1524 | "resolved": "https://registry.nlark.com/fs.realpath/download/fs.realpath-1.0.0.tgz",
1525 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
1526 | },
1527 | "fsevents": {
1528 | "version": "2.3.2",
1529 | "resolved": "https://registry.nlark.com/fsevents/download/fsevents-2.3.2.tgz",
1530 | "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=",
1531 | "dev": true,
1532 | "optional": true
1533 | },
1534 | "function-bind": {
1535 | "version": "1.1.1",
1536 | "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz",
1537 | "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=",
1538 | "dev": true
1539 | },
1540 | "functional-red-black-tree": {
1541 | "version": "1.0.1",
1542 | "resolved": "https://registry.nlark.com/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz",
1543 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
1544 | "dev": true
1545 | },
1546 | "get-intrinsic": {
1547 | "version": "1.1.1",
1548 | "resolved": "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz",
1549 | "integrity": "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=",
1550 | "dev": true,
1551 | "requires": {
1552 | "function-bind": "^1.1.1",
1553 | "has": "^1.0.3",
1554 | "has-symbols": "^1.0.1"
1555 | }
1556 | },
1557 | "get-stdin": {
1558 | "version": "8.0.0",
1559 | "resolved": "https://registry.nlark.com/get-stdin/download/get-stdin-8.0.0.tgz",
1560 | "integrity": "sha1-y61qc/63X27rIrqeAfiaooqpelM="
1561 | },
1562 | "glob": {
1563 | "version": "7.1.7",
1564 | "resolved": "https://registry.nlark.com/glob/download/glob-7.1.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob%2Fdownload%2Fglob-7.1.7.tgz",
1565 | "integrity": "sha1-Oxk+kjPwHULQs/eClLvutBj5SpA=",
1566 | "requires": {
1567 | "fs.realpath": "^1.0.0",
1568 | "inflight": "^1.0.4",
1569 | "inherits": "2",
1570 | "minimatch": "^3.0.4",
1571 | "once": "^1.3.0",
1572 | "path-is-absolute": "^1.0.0"
1573 | }
1574 | },
1575 | "glob-parent": {
1576 | "version": "5.1.2",
1577 | "resolved": "https://registry.nlark.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1626760165717&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz",
1578 | "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=",
1579 | "dev": true,
1580 | "requires": {
1581 | "is-glob": "^4.0.1"
1582 | }
1583 | },
1584 | "glob-promise": {
1585 | "version": "3.4.0",
1586 | "resolved": "https://registry.nlark.com/glob-promise/download/glob-promise-3.4.0.tgz",
1587 | "integrity": "sha1-trjwhFBCFvcC3CzoybyayIZv2yA=",
1588 | "requires": {
1589 | "@types/glob": "*"
1590 | }
1591 | },
1592 | "globals": {
1593 | "version": "13.10.0",
1594 | "resolved": "https://registry.nlark.com/globals/download/globals-13.10.0.tgz?cache=0&sync_timestamp=1625655787416&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobals%2Fdownload%2Fglobals-13.10.0.tgz",
1595 | "integrity": "sha1-YLpWw6wsqEXPv0+uynJ62d0gRnY=",
1596 | "dev": true,
1597 | "requires": {
1598 | "type-fest": "^0.20.2"
1599 | }
1600 | },
1601 | "globby": {
1602 | "version": "10.0.1",
1603 | "resolved": "https://registry.nlark.com/globby/download/globby-10.0.1.tgz",
1604 | "integrity": "sha1-R4LDTLdd1oM1EzXFgpzDQg5gayI=",
1605 | "dev": true,
1606 | "requires": {
1607 | "@types/glob": "^7.1.1",
1608 | "array-union": "^2.1.0",
1609 | "dir-glob": "^3.0.1",
1610 | "fast-glob": "^3.0.3",
1611 | "glob": "^7.1.3",
1612 | "ignore": "^5.1.1",
1613 | "merge2": "^1.2.3",
1614 | "slash": "^3.0.0"
1615 | }
1616 | },
1617 | "graceful-fs": {
1618 | "version": "4.2.6",
1619 | "resolved": "https://registry.nlark.com/graceful-fs/download/graceful-fs-4.2.6.tgz",
1620 | "integrity": "sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4=",
1621 | "dev": true
1622 | },
1623 | "has": {
1624 | "version": "1.0.3",
1625 | "resolved": "https://registry.nlark.com/has/download/has-1.0.3.tgz",
1626 | "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
1627 | "dev": true,
1628 | "requires": {
1629 | "function-bind": "^1.1.1"
1630 | }
1631 | },
1632 | "has-bigints": {
1633 | "version": "1.0.1",
1634 | "resolved": "https://registry.npm.taobao.org/has-bigints/download/has-bigints-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-bigints%2Fdownload%2Fhas-bigints-1.0.1.tgz",
1635 | "integrity": "sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM=",
1636 | "dev": true
1637 | },
1638 | "has-flag": {
1639 | "version": "3.0.0",
1640 | "resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz",
1641 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1642 | "dev": true
1643 | },
1644 | "has-symbols": {
1645 | "version": "1.0.2",
1646 | "resolved": "https://registry.nlark.com/has-symbols/download/has-symbols-1.0.2.tgz",
1647 | "integrity": "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM=",
1648 | "dev": true
1649 | },
1650 | "hosted-git-info": {
1651 | "version": "2.8.9",
1652 | "resolved": "https://registry.nlark.com/hosted-git-info/download/hosted-git-info-2.8.9.tgz",
1653 | "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k=",
1654 | "dev": true
1655 | },
1656 | "iconv-lite": {
1657 | "version": "0.4.24",
1658 | "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz",
1659 | "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
1660 | "requires": {
1661 | "safer-buffer": ">= 2.1.2 < 3"
1662 | }
1663 | },
1664 | "ieee754": {
1665 | "version": "1.2.1",
1666 | "resolved": "https://registry.nlark.com/ieee754/download/ieee754-1.2.1.tgz",
1667 | "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I="
1668 | },
1669 | "ignore": {
1670 | "version": "5.1.8",
1671 | "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-5.1.8.tgz",
1672 | "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=",
1673 | "dev": true
1674 | },
1675 | "immediate": {
1676 | "version": "3.0.6",
1677 | "resolved": "https://registry.nlark.com/immediate/download/immediate-3.0.6.tgz",
1678 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
1679 | },
1680 | "import-fresh": {
1681 | "version": "3.3.0",
1682 | "resolved": "https://registry.nlark.com/import-fresh/download/import-fresh-3.3.0.tgz",
1683 | "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=",
1684 | "dev": true,
1685 | "requires": {
1686 | "parent-module": "^1.0.0",
1687 | "resolve-from": "^4.0.0"
1688 | }
1689 | },
1690 | "imurmurhash": {
1691 | "version": "0.1.4",
1692 | "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz",
1693 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1694 | "dev": true
1695 | },
1696 | "inflight": {
1697 | "version": "1.0.6",
1698 | "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
1699 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1700 | "requires": {
1701 | "once": "^1.3.0",
1702 | "wrappy": "1"
1703 | }
1704 | },
1705 | "inherits": {
1706 | "version": "2.0.4",
1707 | "resolved": "https://registry.nlark.com/inherits/download/inherits-2.0.4.tgz",
1708 | "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w="
1709 | },
1710 | "inquirer": {
1711 | "version": "8.1.1",
1712 | "resolved": "https://registry.nlark.com/inquirer/download/inquirer-8.1.1.tgz?cache=0&sync_timestamp=1626276258005&other_urls=https%3A%2F%2Fregistry.nlark.com%2Finquirer%2Fdownload%2Finquirer-8.1.1.tgz",
1713 | "integrity": "sha1-fFPZTG0DARx7sqlH8NyjuYJGwmo=",
1714 | "requires": {
1715 | "ansi-escapes": "^4.2.1",
1716 | "chalk": "^4.1.1",
1717 | "cli-cursor": "^3.1.0",
1718 | "cli-width": "^3.0.0",
1719 | "external-editor": "^3.0.3",
1720 | "figures": "^3.0.0",
1721 | "lodash": "^4.17.21",
1722 | "mute-stream": "0.0.8",
1723 | "ora": "^5.3.0",
1724 | "run-async": "^2.4.0",
1725 | "rxjs": "^6.6.6",
1726 | "string-width": "^4.1.0",
1727 | "strip-ansi": "^6.0.0",
1728 | "through": "^2.3.6"
1729 | }
1730 | },
1731 | "is-arrayish": {
1732 | "version": "0.2.1",
1733 | "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
1734 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1735 | "dev": true
1736 | },
1737 | "is-bigint": {
1738 | "version": "1.0.2",
1739 | "resolved": "https://registry.nlark.com/is-bigint/download/is-bigint-1.0.2.tgz",
1740 | "integrity": "sha1-/7OBRCUDI1rSReqJ5Fs9v/BA7lo=",
1741 | "dev": true
1742 | },
1743 | "is-boolean-object": {
1744 | "version": "1.1.1",
1745 | "resolved": "https://registry.nlark.com/is-boolean-object/download/is-boolean-object-1.1.1.tgz",
1746 | "integrity": "sha1-PAh48DXLghIo01DS4eNnGXFqPeg=",
1747 | "dev": true,
1748 | "requires": {
1749 | "call-bind": "^1.0.2"
1750 | }
1751 | },
1752 | "is-callable": {
1753 | "version": "1.2.3",
1754 | "resolved": "https://registry.nlark.com/is-callable/download/is-callable-1.2.3.tgz",
1755 | "integrity": "sha1-ix4FALc6HXbHBIdjbzaOUZ3o244=",
1756 | "dev": true
1757 | },
1758 | "is-core-module": {
1759 | "version": "2.5.0",
1760 | "resolved": "https://registry.nlark.com/is-core-module/download/is-core-module-2.5.0.tgz",
1761 | "integrity": "sha1-91SENhfHC/0pt72HMnQAzaXBhJE=",
1762 | "dev": true,
1763 | "requires": {
1764 | "has": "^1.0.3"
1765 | }
1766 | },
1767 | "is-date-object": {
1768 | "version": "1.0.4",
1769 | "resolved": "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.4.tgz",
1770 | "integrity": "sha1-VQz8wDr62gXuo90wmBx7CVUfc+U=",
1771 | "dev": true
1772 | },
1773 | "is-extglob": {
1774 | "version": "2.1.1",
1775 | "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz",
1776 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
1777 | },
1778 | "is-fullwidth-code-point": {
1779 | "version": "3.0.0",
1780 | "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz",
1781 | "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0="
1782 | },
1783 | "is-glob": {
1784 | "version": "4.0.1",
1785 | "resolved": "https://registry.nlark.com/is-glob/download/is-glob-4.0.1.tgz?cache=0&sync_timestamp=1624543039732&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-glob%2Fdownload%2Fis-glob-4.0.1.tgz",
1786 | "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
1787 | "requires": {
1788 | "is-extglob": "^2.1.1"
1789 | }
1790 | },
1791 | "is-interactive": {
1792 | "version": "1.0.0",
1793 | "resolved": "https://registry.nlark.com/is-interactive/download/is-interactive-1.0.0.tgz",
1794 | "integrity": "sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4="
1795 | },
1796 | "is-module": {
1797 | "version": "1.0.0",
1798 | "resolved": "https://registry.npm.taobao.org/is-module/download/is-module-1.0.0.tgz",
1799 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
1800 | "dev": true
1801 | },
1802 | "is-negative-zero": {
1803 | "version": "2.0.1",
1804 | "resolved": "https://registry.nlark.com/is-negative-zero/download/is-negative-zero-2.0.1.tgz",
1805 | "integrity": "sha1-PedGwY3aIxkkGlNnWQjY92bxHCQ=",
1806 | "dev": true
1807 | },
1808 | "is-number": {
1809 | "version": "7.0.0",
1810 | "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz",
1811 | "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=",
1812 | "dev": true
1813 | },
1814 | "is-number-object": {
1815 | "version": "1.0.5",
1816 | "resolved": "https://registry.nlark.com/is-number-object/download/is-number-object-1.0.5.tgz",
1817 | "integrity": "sha1-bt+u7XlQz/Ga/tzp+/yp7m3Sies=",
1818 | "dev": true
1819 | },
1820 | "is-plain-object": {
1821 | "version": "3.0.1",
1822 | "resolved": "https://registry.nlark.com/is-plain-object/download/is-plain-object-3.0.1.tgz",
1823 | "integrity": "sha1-Zi2S0kwKpDAkB7DUXSHyJRyF+Fs=",
1824 | "dev": true
1825 | },
1826 | "is-promise": {
1827 | "version": "2.2.2",
1828 | "resolved": "https://registry.nlark.com/is-promise/download/is-promise-2.2.2.tgz?cache=0&sync_timestamp=1618847016863&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-promise%2Fdownload%2Fis-promise-2.2.2.tgz",
1829 | "integrity": "sha1-OauVnMv5p3TPB597QMeib3YxNfE="
1830 | },
1831 | "is-regex": {
1832 | "version": "1.1.3",
1833 | "resolved": "https://registry.nlark.com/is-regex/download/is-regex-1.1.3.tgz",
1834 | "integrity": "sha1-0Cn5r/ZEi5Prvj8z2scVEf3L758=",
1835 | "dev": true,
1836 | "requires": {
1837 | "call-bind": "^1.0.2",
1838 | "has-symbols": "^1.0.2"
1839 | }
1840 | },
1841 | "is-string": {
1842 | "version": "1.0.6",
1843 | "resolved": "https://registry.nlark.com/is-string/download/is-string-1.0.6.tgz",
1844 | "integrity": "sha1-P+XVmS+w2TQE8yWE1LAXmnG1Sl8=",
1845 | "dev": true
1846 | },
1847 | "is-symbol": {
1848 | "version": "1.0.4",
1849 | "resolved": "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.4.tgz?cache=0&sync_timestamp=1620501174327&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.4.tgz",
1850 | "integrity": "sha1-ptrJO2NbBjymhyI23oiRClevE5w=",
1851 | "dev": true,
1852 | "requires": {
1853 | "has-symbols": "^1.0.2"
1854 | }
1855 | },
1856 | "is-unicode-supported": {
1857 | "version": "0.1.0",
1858 | "resolved": "https://registry.nlark.com/is-unicode-supported/download/is-unicode-supported-0.1.0.tgz?cache=0&sync_timestamp=1625294161966&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-unicode-supported%2Fdownload%2Fis-unicode-supported-0.1.0.tgz",
1859 | "integrity": "sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc="
1860 | },
1861 | "isexe": {
1862 | "version": "2.0.0",
1863 | "resolved": "https://registry.nlark.com/isexe/download/isexe-2.0.0.tgz",
1864 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1865 | "dev": true
1866 | },
1867 | "jest-worker": {
1868 | "version": "26.6.2",
1869 | "resolved": "https://registry.nlark.com/jest-worker/download/jest-worker-26.6.2.tgz",
1870 | "integrity": "sha1-f3LLxNZDw2Xie5/XdfnQ6qnHqO0=",
1871 | "dev": true,
1872 | "requires": {
1873 | "@types/node": "*",
1874 | "merge-stream": "^2.0.0",
1875 | "supports-color": "^7.0.0"
1876 | },
1877 | "dependencies": {
1878 | "has-flag": {
1879 | "version": "4.0.0",
1880 | "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz",
1881 | "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
1882 | "dev": true
1883 | },
1884 | "supports-color": {
1885 | "version": "7.2.0",
1886 | "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
1887 | "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
1888 | "dev": true,
1889 | "requires": {
1890 | "has-flag": "^4.0.0"
1891 | }
1892 | }
1893 | }
1894 | },
1895 | "js-tokens": {
1896 | "version": "4.0.0",
1897 | "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz",
1898 | "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=",
1899 | "dev": true
1900 | },
1901 | "js-yaml": {
1902 | "version": "3.14.1",
1903 | "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.1.tgz?cache=0&sync_timestamp=1618435004368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.1.tgz",
1904 | "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=",
1905 | "dev": true,
1906 | "requires": {
1907 | "argparse": "^1.0.7",
1908 | "esprima": "^4.0.0"
1909 | }
1910 | },
1911 | "json-parse-better-errors": {
1912 | "version": "1.0.2",
1913 | "resolved": "https://registry.nlark.com/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz",
1914 | "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=",
1915 | "dev": true
1916 | },
1917 | "json-schema-ref-parser": {
1918 | "version": "9.0.9",
1919 | "resolved": "https://registry.nlark.com/json-schema-ref-parser/download/json-schema-ref-parser-9.0.9.tgz",
1920 | "integrity": "sha1-ZupTjnRQsSrzQvo9W4RYvB4eAT8=",
1921 | "requires": {
1922 | "@apidevtools/json-schema-ref-parser": "9.0.9"
1923 | }
1924 | },
1925 | "json-schema-to-typescript": {
1926 | "version": "10.1.4",
1927 | "resolved": "http://192.168.97.12:4873/json-schema-to-typescript/-/json-schema-to-typescript-10.1.4.tgz",
1928 | "integrity": "sha512-HWm23Z6Fnj3rnm4FKZh3sMz70hNoA+AfqVuV+ZcwFIhq6v76YVUMZSLlonrw7GI5yIoiuuJjB5rqakIYRCLlsg==",
1929 | "requires": {
1930 | "@types/json-schema": "^7.0.6",
1931 | "@types/lodash": "^4.14.168",
1932 | "@types/prettier": "^2.1.5",
1933 | "cli-color": "^2.0.0",
1934 | "get-stdin": "^8.0.0",
1935 | "glob": "^7.1.6",
1936 | "glob-promise": "^3.4.0",
1937 | "is-glob": "^4.0.1",
1938 | "json-schema-ref-parser": "^9.0.6",
1939 | "json-stringify-safe": "^5.0.1",
1940 | "lodash": "^4.17.20",
1941 | "minimist": "^1.2.5",
1942 | "mkdirp": "^1.0.4",
1943 | "mz": "^2.7.0",
1944 | "prettier": "^2.2.0"
1945 | },
1946 | "dependencies": {
1947 | "prettier": {
1948 | "version": "2.3.2",
1949 | "resolved": "https://registry.nlark.com/prettier/download/prettier-2.3.2.tgz?cache=0&sync_timestamp=1624696193562&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprettier%2Fdownload%2Fprettier-2.3.2.tgz",
1950 | "integrity": "sha1-7ygKBewlNxLkhiM9tcbyNEHnNC0="
1951 | }
1952 | }
1953 | },
1954 | "json-schema-traverse": {
1955 | "version": "0.4.1",
1956 | "resolved": "https://registry.nlark.com/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz",
1957 | "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
1958 | "dev": true
1959 | },
1960 | "json-stable-stringify-without-jsonify": {
1961 | "version": "1.0.1",
1962 | "resolved": "https://registry.nlark.com/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz",
1963 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1964 | "dev": true
1965 | },
1966 | "json-stringify-safe": {
1967 | "version": "5.0.1",
1968 | "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz",
1969 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
1970 | },
1971 | "json5": {
1972 | "version": "1.0.1",
1973 | "resolved": "https://registry.nlark.com/json5/download/json5-1.0.1.tgz",
1974 | "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=",
1975 | "dev": true,
1976 | "requires": {
1977 | "minimist": "^1.2.0"
1978 | }
1979 | },
1980 | "jsonfile": {
1981 | "version": "4.0.0",
1982 | "resolved": "https://registry.nlark.com/jsonfile/download/jsonfile-4.0.0.tgz",
1983 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
1984 | "dev": true,
1985 | "requires": {
1986 | "graceful-fs": "^4.1.6"
1987 | }
1988 | },
1989 | "levn": {
1990 | "version": "0.4.1",
1991 | "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.4.1.tgz",
1992 | "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=",
1993 | "dev": true,
1994 | "requires": {
1995 | "prelude-ls": "^1.2.1",
1996 | "type-check": "~0.4.0"
1997 | }
1998 | },
1999 | "lie": {
2000 | "version": "3.1.1",
2001 | "resolved": "https://registry.npm.taobao.org/lie/download/lie-3.1.1.tgz",
2002 | "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
2003 | "requires": {
2004 | "immediate": "~3.0.5"
2005 | }
2006 | },
2007 | "load-json-file": {
2008 | "version": "4.0.0",
2009 | "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz",
2010 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
2011 | "dev": true,
2012 | "requires": {
2013 | "graceful-fs": "^4.1.2",
2014 | "parse-json": "^4.0.0",
2015 | "pify": "^3.0.0",
2016 | "strip-bom": "^3.0.0"
2017 | }
2018 | },
2019 | "localforage": {
2020 | "version": "1.9.0",
2021 | "resolved": "https://registry.nlark.com/localforage/download/localforage-1.9.0.tgz",
2022 | "integrity": "sha1-8+TTKoMAs2K0Y0zE4GbZ0A0vCdE=",
2023 | "requires": {
2024 | "lie": "3.1.1"
2025 | }
2026 | },
2027 | "locate-path": {
2028 | "version": "2.0.0",
2029 | "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz",
2030 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
2031 | "dev": true,
2032 | "requires": {
2033 | "p-locate": "^2.0.0",
2034 | "path-exists": "^3.0.0"
2035 | }
2036 | },
2037 | "lodash": {
2038 | "version": "4.17.21",
2039 | "resolved": "https://registry.nlark.com/lodash/download/lodash-4.17.21.tgz?cache=0&sync_timestamp=1624543041613&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flodash%2Fdownload%2Flodash-4.17.21.tgz",
2040 | "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw="
2041 | },
2042 | "lodash.clonedeep": {
2043 | "version": "4.5.0",
2044 | "resolved": "https://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz?cache=0&sync_timestamp=1599054271708&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.clonedeep%2Fdownload%2Flodash.clonedeep-4.5.0.tgz",
2045 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
2046 | "dev": true
2047 | },
2048 | "lodash.merge": {
2049 | "version": "4.6.2",
2050 | "resolved": "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz",
2051 | "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=",
2052 | "dev": true
2053 | },
2054 | "lodash.truncate": {
2055 | "version": "4.4.2",
2056 | "resolved": "https://registry.npm.taobao.org/lodash.truncate/download/lodash.truncate-4.4.2.tgz",
2057 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
2058 | "dev": true
2059 | },
2060 | "log-symbols": {
2061 | "version": "4.1.0",
2062 | "resolved": "https://registry.nlark.com/log-symbols/download/log-symbols-4.1.0.tgz?cache=0&sync_timestamp=1618847128438&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flog-symbols%2Fdownload%2Flog-symbols-4.1.0.tgz",
2063 | "integrity": "sha1-P727lbRoOsn8eFER55LlWNSr1QM=",
2064 | "requires": {
2065 | "chalk": "^4.1.0",
2066 | "is-unicode-supported": "^0.1.0"
2067 | }
2068 | },
2069 | "lru-cache": {
2070 | "version": "6.0.0",
2071 | "resolved": "https://registry.nlark.com/lru-cache/download/lru-cache-6.0.0.tgz",
2072 | "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
2073 | "dev": true,
2074 | "requires": {
2075 | "yallist": "^4.0.0"
2076 | }
2077 | },
2078 | "lru-queue": {
2079 | "version": "0.1.0",
2080 | "resolved": "https://registry.nlark.com/lru-queue/download/lru-queue-0.1.0.tgz",
2081 | "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
2082 | "requires": {
2083 | "es5-ext": "~0.10.2"
2084 | }
2085 | },
2086 | "magic-string": {
2087 | "version": "0.25.7",
2088 | "resolved": "https://registry.nlark.com/magic-string/download/magic-string-0.25.7.tgz?cache=0&sync_timestamp=1618847046304&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmagic-string%2Fdownload%2Fmagic-string-0.25.7.tgz",
2089 | "integrity": "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=",
2090 | "dev": true,
2091 | "requires": {
2092 | "sourcemap-codec": "^1.4.4"
2093 | }
2094 | },
2095 | "make-dir": {
2096 | "version": "3.1.0",
2097 | "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz",
2098 | "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=",
2099 | "dev": true,
2100 | "requires": {
2101 | "semver": "^6.0.0"
2102 | },
2103 | "dependencies": {
2104 | "semver": {
2105 | "version": "6.3.0",
2106 | "resolved": "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618847119601&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
2107 | "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
2108 | "dev": true
2109 | }
2110 | }
2111 | },
2112 | "make-error": {
2113 | "version": "1.3.6",
2114 | "resolved": "https://registry.npm.taobao.org/make-error/download/make-error-1.3.6.tgz",
2115 | "integrity": "sha1-LrLjfqm2fEiR9oShOUeZr0hM96I=",
2116 | "dev": true
2117 | },
2118 | "memoizee": {
2119 | "version": "0.4.15",
2120 | "resolved": "https://registry.nlark.com/memoizee/download/memoizee-0.4.15.tgz",
2121 | "integrity": "sha1-5vPS2oY/MY0CIlORgppsWVZVW3I=",
2122 | "requires": {
2123 | "d": "^1.0.1",
2124 | "es5-ext": "^0.10.53",
2125 | "es6-weak-map": "^2.0.3",
2126 | "event-emitter": "^0.3.5",
2127 | "is-promise": "^2.2.2",
2128 | "lru-queue": "^0.1.0",
2129 | "next-tick": "^1.1.0",
2130 | "timers-ext": "^0.1.7"
2131 | },
2132 | "dependencies": {
2133 | "next-tick": {
2134 | "version": "1.1.0",
2135 | "resolved": "https://registry.nlark.com/next-tick/download/next-tick-1.1.0.tgz",
2136 | "integrity": "sha1-GDbuMK1W1n7ygbIr0Zn3CUSbNes="
2137 | }
2138 | }
2139 | },
2140 | "merge-stream": {
2141 | "version": "2.0.0",
2142 | "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz",
2143 | "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=",
2144 | "dev": true
2145 | },
2146 | "merge2": {
2147 | "version": "1.4.1",
2148 | "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz",
2149 | "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=",
2150 | "dev": true
2151 | },
2152 | "micromatch": {
2153 | "version": "4.0.4",
2154 | "resolved": "https://registry.nlark.com/micromatch/download/micromatch-4.0.4.tgz",
2155 | "integrity": "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=",
2156 | "dev": true,
2157 | "requires": {
2158 | "braces": "^3.0.1",
2159 | "picomatch": "^2.2.3"
2160 | }
2161 | },
2162 | "mimic-fn": {
2163 | "version": "2.1.0",
2164 | "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz",
2165 | "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs="
2166 | },
2167 | "minimatch": {
2168 | "version": "3.0.4",
2169 | "resolved": "https://registry.nlark.com/minimatch/download/minimatch-3.0.4.tgz",
2170 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
2171 | "requires": {
2172 | "brace-expansion": "^1.1.7"
2173 | }
2174 | },
2175 | "minimist": {
2176 | "version": "1.2.6",
2177 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
2178 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
2179 | },
2180 | "mkdirp": {
2181 | "version": "1.0.4",
2182 | "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz",
2183 | "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34="
2184 | },
2185 | "ms": {
2186 | "version": "2.1.2",
2187 | "resolved": "https://registry.nlark.com/ms/download/ms-2.1.2.tgz",
2188 | "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
2189 | "dev": true
2190 | },
2191 | "mute-stream": {
2192 | "version": "0.0.8",
2193 | "resolved": "https://registry.nlark.com/mute-stream/download/mute-stream-0.0.8.tgz",
2194 | "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0="
2195 | },
2196 | "mz": {
2197 | "version": "2.7.0",
2198 | "resolved": "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz",
2199 | "integrity": "sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=",
2200 | "requires": {
2201 | "any-promise": "^1.0.0",
2202 | "object-assign": "^4.0.1",
2203 | "thenify-all": "^1.0.0"
2204 | }
2205 | },
2206 | "natural-compare": {
2207 | "version": "1.4.0",
2208 | "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz",
2209 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
2210 | "dev": true
2211 | },
2212 | "nedb": {
2213 | "version": "1.8.0",
2214 | "resolved": "https://registry.npm.taobao.org/nedb/download/nedb-1.8.0.tgz",
2215 | "integrity": "sha1-DjUCzYLABNU1WkPJ5VV3vXvZHYg=",
2216 | "requires": {
2217 | "async": "0.2.10",
2218 | "binary-search-tree": "0.2.5",
2219 | "localforage": "^1.3.0",
2220 | "mkdirp": "~0.5.1",
2221 | "underscore": "~1.4.4"
2222 | },
2223 | "dependencies": {
2224 | "mkdirp": {
2225 | "version": "0.5.5",
2226 | "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz",
2227 | "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=",
2228 | "requires": {
2229 | "minimist": "^1.2.5"
2230 | }
2231 | }
2232 | }
2233 | },
2234 | "next-tick": {
2235 | "version": "1.0.0",
2236 | "resolved": "https://registry.nlark.com/next-tick/download/next-tick-1.0.0.tgz",
2237 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
2238 | },
2239 | "normalize-package-data": {
2240 | "version": "2.5.0",
2241 | "resolved": "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz",
2242 | "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=",
2243 | "dev": true,
2244 | "requires": {
2245 | "hosted-git-info": "^2.1.4",
2246 | "resolve": "^1.10.0",
2247 | "semver": "2 || 3 || 4 || 5",
2248 | "validate-npm-package-license": "^3.0.1"
2249 | },
2250 | "dependencies": {
2251 | "semver": {
2252 | "version": "5.7.1",
2253 | "resolved": "https://registry.nlark.com/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1618847119601&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz",
2254 | "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=",
2255 | "dev": true
2256 | }
2257 | }
2258 | },
2259 | "object-assign": {
2260 | "version": "4.1.1",
2261 | "resolved": "https://registry.nlark.com/object-assign/download/object-assign-4.1.1.tgz?cache=0&sync_timestamp=1618847043548&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz",
2262 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
2263 | },
2264 | "object-inspect": {
2265 | "version": "1.11.0",
2266 | "resolved": "https://registry.nlark.com/object-inspect/download/object-inspect-1.11.0.tgz?cache=0&sync_timestamp=1626120241132&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject-inspect%2Fdownload%2Fobject-inspect-1.11.0.tgz",
2267 | "integrity": "sha1-nc6xRs7dQUig2eUauI00z1CZIrE=",
2268 | "dev": true
2269 | },
2270 | "object-keys": {
2271 | "version": "1.1.1",
2272 | "resolved": "https://registry.nlark.com/object-keys/download/object-keys-1.1.1.tgz",
2273 | "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=",
2274 | "dev": true
2275 | },
2276 | "object.assign": {
2277 | "version": "4.1.2",
2278 | "resolved": "https://registry.nlark.com/object.assign/download/object.assign-4.1.2.tgz",
2279 | "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=",
2280 | "dev": true,
2281 | "requires": {
2282 | "call-bind": "^1.0.0",
2283 | "define-properties": "^1.1.3",
2284 | "has-symbols": "^1.0.1",
2285 | "object-keys": "^1.1.1"
2286 | }
2287 | },
2288 | "object.values": {
2289 | "version": "1.1.4",
2290 | "resolved": "https://registry.nlark.com/object.values/download/object.values-1.1.4.tgz?cache=0&sync_timestamp=1622070620040&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject.values%2Fdownload%2Fobject.values-1.1.4.tgz",
2291 | "integrity": "sha1-DSc3YoM+gWtpOmN9MAc+cFFTWzA=",
2292 | "dev": true,
2293 | "requires": {
2294 | "call-bind": "^1.0.2",
2295 | "define-properties": "^1.1.3",
2296 | "es-abstract": "^1.18.2"
2297 | }
2298 | },
2299 | "once": {
2300 | "version": "1.4.0",
2301 | "resolved": "https://registry.nlark.com/once/download/once-1.4.0.tgz",
2302 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2303 | "requires": {
2304 | "wrappy": "1"
2305 | }
2306 | },
2307 | "onetime": {
2308 | "version": "5.1.2",
2309 | "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz",
2310 | "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=",
2311 | "requires": {
2312 | "mimic-fn": "^2.1.0"
2313 | }
2314 | },
2315 | "optionator": {
2316 | "version": "0.9.1",
2317 | "resolved": "https://registry.nlark.com/optionator/download/optionator-0.9.1.tgz",
2318 | "integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=",
2319 | "dev": true,
2320 | "requires": {
2321 | "deep-is": "^0.1.3",
2322 | "fast-levenshtein": "^2.0.6",
2323 | "levn": "^0.4.1",
2324 | "prelude-ls": "^1.2.1",
2325 | "type-check": "^0.4.0",
2326 | "word-wrap": "^1.2.3"
2327 | }
2328 | },
2329 | "ora": {
2330 | "version": "5.4.1",
2331 | "resolved": "https://registry.nlark.com/ora/download/ora-5.4.1.tgz",
2332 | "integrity": "sha1-GyZ4Qmr0rEpQkAjl5KyemVnbnhg=",
2333 | "requires": {
2334 | "bl": "^4.1.0",
2335 | "chalk": "^4.1.0",
2336 | "cli-cursor": "^3.1.0",
2337 | "cli-spinners": "^2.5.0",
2338 | "is-interactive": "^1.0.0",
2339 | "is-unicode-supported": "^0.1.0",
2340 | "log-symbols": "^4.1.0",
2341 | "strip-ansi": "^6.0.0",
2342 | "wcwidth": "^1.0.1"
2343 | }
2344 | },
2345 | "os-tmpdir": {
2346 | "version": "1.0.2",
2347 | "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz",
2348 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
2349 | },
2350 | "p-limit": {
2351 | "version": "1.3.0",
2352 | "resolved": "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz",
2353 | "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=",
2354 | "dev": true,
2355 | "requires": {
2356 | "p-try": "^1.0.0"
2357 | }
2358 | },
2359 | "p-locate": {
2360 | "version": "2.0.0",
2361 | "resolved": "https://registry.nlark.com/p-locate/download/p-locate-2.0.0.tgz",
2362 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
2363 | "dev": true,
2364 | "requires": {
2365 | "p-limit": "^1.1.0"
2366 | }
2367 | },
2368 | "p-try": {
2369 | "version": "1.0.0",
2370 | "resolved": "https://registry.nlark.com/p-try/download/p-try-1.0.0.tgz",
2371 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
2372 | "dev": true
2373 | },
2374 | "parent-module": {
2375 | "version": "1.0.1",
2376 | "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz",
2377 | "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=",
2378 | "dev": true,
2379 | "requires": {
2380 | "callsites": "^3.0.0"
2381 | }
2382 | },
2383 | "parse-json": {
2384 | "version": "4.0.0",
2385 | "resolved": "https://registry.nlark.com/parse-json/download/parse-json-4.0.0.tgz",
2386 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
2387 | "dev": true,
2388 | "requires": {
2389 | "error-ex": "^1.3.1",
2390 | "json-parse-better-errors": "^1.0.1"
2391 | }
2392 | },
2393 | "path-exists": {
2394 | "version": "3.0.0",
2395 | "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz",
2396 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2397 | "dev": true
2398 | },
2399 | "path-is-absolute": {
2400 | "version": "1.0.1",
2401 | "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
2402 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
2403 | },
2404 | "path-key": {
2405 | "version": "3.1.1",
2406 | "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz?cache=0&sync_timestamp=1617971695678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-3.1.1.tgz",
2407 | "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=",
2408 | "dev": true
2409 | },
2410 | "path-parse": {
2411 | "version": "1.0.7",
2412 | "resolved": "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz",
2413 | "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=",
2414 | "dev": true
2415 | },
2416 | "path-type": {
2417 | "version": "3.0.0",
2418 | "resolved": "https://registry.nlark.com/path-type/download/path-type-3.0.0.tgz",
2419 | "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=",
2420 | "dev": true,
2421 | "requires": {
2422 | "pify": "^3.0.0"
2423 | }
2424 | },
2425 | "picomatch": {
2426 | "version": "2.3.0",
2427 | "resolved": "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz",
2428 | "integrity": "sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI=",
2429 | "dev": true
2430 | },
2431 | "pify": {
2432 | "version": "3.0.0",
2433 | "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz",
2434 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
2435 | "dev": true
2436 | },
2437 | "pkg-dir": {
2438 | "version": "2.0.0",
2439 | "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz",
2440 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
2441 | "dev": true,
2442 | "requires": {
2443 | "find-up": "^2.1.0"
2444 | }
2445 | },
2446 | "pkg-up": {
2447 | "version": "2.0.0",
2448 | "resolved": "https://registry.npm.taobao.org/pkg-up/download/pkg-up-2.0.0.tgz",
2449 | "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
2450 | "dev": true,
2451 | "requires": {
2452 | "find-up": "^2.1.0"
2453 | }
2454 | },
2455 | "prelude-ls": {
2456 | "version": "1.2.1",
2457 | "resolved": "https://registry.nlark.com/prelude-ls/download/prelude-ls-1.2.1.tgz",
2458 | "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=",
2459 | "dev": true
2460 | },
2461 | "prettier": {
2462 | "version": "2.3.2",
2463 | "resolved": "https://registry.nlark.com/prettier/download/prettier-2.3.2.tgz?cache=0&sync_timestamp=1624696193562&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprettier%2Fdownload%2Fprettier-2.3.2.tgz",
2464 | "integrity": "sha1-7ygKBewlNxLkhiM9tcbyNEHnNC0=",
2465 | "dev": true
2466 | },
2467 | "prettier-linter-helpers": {
2468 | "version": "1.0.0",
2469 | "resolved": "https://registry.npm.taobao.org/prettier-linter-helpers/download/prettier-linter-helpers-1.0.0.tgz",
2470 | "integrity": "sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s=",
2471 | "dev": true,
2472 | "requires": {
2473 | "fast-diff": "^1.1.2"
2474 | }
2475 | },
2476 | "progress": {
2477 | "version": "2.0.3",
2478 | "resolved": "https://registry.nlark.com/progress/download/progress-2.0.3.tgz",
2479 | "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=",
2480 | "dev": true
2481 | },
2482 | "punycode": {
2483 | "version": "2.1.1",
2484 | "resolved": "https://registry.nlark.com/punycode/download/punycode-2.1.1.tgz?cache=0&sync_timestamp=1622604519710&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpunycode%2Fdownload%2Fpunycode-2.1.1.tgz",
2485 | "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=",
2486 | "dev": true
2487 | },
2488 | "queue-microtask": {
2489 | "version": "1.2.3",
2490 | "resolved": "https://registry.nlark.com/queue-microtask/download/queue-microtask-1.2.3.tgz",
2491 | "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=",
2492 | "dev": true
2493 | },
2494 | "randombytes": {
2495 | "version": "2.1.0",
2496 | "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz",
2497 | "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=",
2498 | "dev": true,
2499 | "requires": {
2500 | "safe-buffer": "^5.1.0"
2501 | }
2502 | },
2503 | "read-pkg": {
2504 | "version": "3.0.0",
2505 | "resolved": "https://registry.nlark.com/read-pkg/download/read-pkg-3.0.0.tgz",
2506 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
2507 | "dev": true,
2508 | "requires": {
2509 | "load-json-file": "^4.0.0",
2510 | "normalize-package-data": "^2.3.2",
2511 | "path-type": "^3.0.0"
2512 | }
2513 | },
2514 | "read-pkg-up": {
2515 | "version": "3.0.0",
2516 | "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-3.0.0.tgz?cache=0&sync_timestamp=1616916344510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg-up%2Fdownload%2Fread-pkg-up-3.0.0.tgz",
2517 | "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
2518 | "dev": true,
2519 | "requires": {
2520 | "find-up": "^2.0.0",
2521 | "read-pkg": "^3.0.0"
2522 | }
2523 | },
2524 | "readable-stream": {
2525 | "version": "3.6.0",
2526 | "resolved": "https://registry.nlark.com/readable-stream/download/readable-stream-3.6.0.tgz",
2527 | "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=",
2528 | "requires": {
2529 | "inherits": "^2.0.3",
2530 | "string_decoder": "^1.1.1",
2531 | "util-deprecate": "^1.0.1"
2532 | }
2533 | },
2534 | "regexpp": {
2535 | "version": "3.2.0",
2536 | "resolved": "https://registry.nlark.com/regexpp/download/regexpp-3.2.0.tgz",
2537 | "integrity": "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=",
2538 | "dev": true
2539 | },
2540 | "require-from-string": {
2541 | "version": "2.0.2",
2542 | "resolved": "https://registry.nlark.com/require-from-string/download/require-from-string-2.0.2.tgz",
2543 | "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=",
2544 | "dev": true
2545 | },
2546 | "resolve": {
2547 | "version": "1.20.0",
2548 | "resolved": "https://registry.nlark.com/resolve/download/resolve-1.20.0.tgz",
2549 | "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=",
2550 | "dev": true,
2551 | "requires": {
2552 | "is-core-module": "^2.2.0",
2553 | "path-parse": "^1.0.6"
2554 | }
2555 | },
2556 | "resolve-from": {
2557 | "version": "4.0.0",
2558 | "resolved": "https://registry.nlark.com/resolve-from/download/resolve-from-4.0.0.tgz",
2559 | "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
2560 | "dev": true
2561 | },
2562 | "restore-cursor": {
2563 | "version": "3.1.0",
2564 | "resolved": "https://registry.nlark.com/restore-cursor/download/restore-cursor-3.1.0.tgz",
2565 | "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=",
2566 | "requires": {
2567 | "onetime": "^5.1.0",
2568 | "signal-exit": "^3.0.2"
2569 | }
2570 | },
2571 | "reusify": {
2572 | "version": "1.0.4",
2573 | "resolved": "https://registry.nlark.com/reusify/download/reusify-1.0.4.tgz",
2574 | "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=",
2575 | "dev": true
2576 | },
2577 | "rimraf": {
2578 | "version": "3.0.2",
2579 | "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz",
2580 | "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=",
2581 | "dev": true,
2582 | "requires": {
2583 | "glob": "^7.1.3"
2584 | }
2585 | },
2586 | "rollup": {
2587 | "version": "2.54.0",
2588 | "resolved": "https://registry.nlark.com/rollup/download/rollup-2.54.0.tgz",
2589 | "integrity": "sha1-meqBbo6bHGrzq5V6TnqPeNvYd3M=",
2590 | "dev": true,
2591 | "requires": {
2592 | "fsevents": "~2.3.2"
2593 | }
2594 | },
2595 | "rollup-plugin-cleandir": {
2596 | "version": "1.0.0",
2597 | "resolved": "https://registry.nlark.com/rollup-plugin-cleandir/download/rollup-plugin-cleandir-1.0.0.tgz",
2598 | "integrity": "sha1-HYbmeoIDnkFuHiynbT8+3x0ubOM=",
2599 | "dev": true,
2600 | "requires": {
2601 | "@mstssk/cleandir": "^1.0.1"
2602 | }
2603 | },
2604 | "rollup-plugin-copy": {
2605 | "version": "3.4.0",
2606 | "resolved": "https://registry.npm.taobao.org/rollup-plugin-copy/download/rollup-plugin-copy-3.4.0.tgz",
2607 | "integrity": "sha1-8SKKP/tm/62GBuLz+3/yMUHtMoY=",
2608 | "dev": true,
2609 | "requires": {
2610 | "@types/fs-extra": "^8.0.1",
2611 | "colorette": "^1.1.0",
2612 | "fs-extra": "^8.1.0",
2613 | "globby": "10.0.1",
2614 | "is-plain-object": "^3.0.0"
2615 | }
2616 | },
2617 | "rollup-plugin-preserve-shebangs": {
2618 | "version": "0.2.0",
2619 | "resolved": "https://registry.nlark.com/rollup-plugin-preserve-shebangs/download/rollup-plugin-preserve-shebangs-0.2.0.tgz",
2620 | "integrity": "sha1-5IiUwfaMb9VLDeEL0mkGIk1dx80=",
2621 | "dev": true,
2622 | "requires": {
2623 | "magic-string": "^0.25.7"
2624 | }
2625 | },
2626 | "rollup-plugin-terser": {
2627 | "version": "7.0.2",
2628 | "resolved": "https://registry.npm.taobao.org/rollup-plugin-terser/download/rollup-plugin-terser-7.0.2.tgz?cache=0&sync_timestamp=1599266972539&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frollup-plugin-terser%2Fdownload%2Frollup-plugin-terser-7.0.2.tgz",
2629 | "integrity": "sha1-6Pu6SGmYGy3DWufopQLVxsBNMk0=",
2630 | "dev": true,
2631 | "requires": {
2632 | "@babel/code-frame": "^7.10.4",
2633 | "jest-worker": "^26.2.1",
2634 | "serialize-javascript": "^4.0.0",
2635 | "terser": "^5.0.0"
2636 | },
2637 | "dependencies": {
2638 | "@babel/code-frame": {
2639 | "version": "7.14.5",
2640 | "resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.14.5.tgz?cache=0&sync_timestamp=1623280394200&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.14.5.tgz",
2641 | "integrity": "sha1-I7CNdA6D9JxeWZRfvxtD6Au/Tts=",
2642 | "dev": true,
2643 | "requires": {
2644 | "@babel/highlight": "^7.14.5"
2645 | }
2646 | }
2647 | }
2648 | },
2649 | "rollup-plugin-typescript2": {
2650 | "version": "0.30.0",
2651 | "resolved": "https://registry.npm.taobao.org/rollup-plugin-typescript2/download/rollup-plugin-typescript2-0.30.0.tgz?cache=0&sync_timestamp=1613666385631&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frollup-plugin-typescript2%2Fdownload%2Frollup-plugin-typescript2-0.30.0.tgz",
2652 | "integrity": "sha1-HMmawjCb9LnQo+vbwgAq7NVgg9M=",
2653 | "dev": true,
2654 | "requires": {
2655 | "@rollup/pluginutils": "^4.1.0",
2656 | "find-cache-dir": "^3.3.1",
2657 | "fs-extra": "8.1.0",
2658 | "resolve": "1.20.0",
2659 | "tslib": "2.1.0"
2660 | },
2661 | "dependencies": {
2662 | "@rollup/pluginutils": {
2663 | "version": "4.1.1",
2664 | "resolved": "https://registry.nlark.com/@rollup/pluginutils/download/@rollup/pluginutils-4.1.1.tgz?cache=0&sync_timestamp=1626393703548&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40rollup%2Fpluginutils%2Fdownload%2F%40rollup%2Fpluginutils-4.1.1.tgz",
2665 | "integrity": "sha1-HU2obdTt7RVlalfZM/2iuaCNR+w=",
2666 | "dev": true,
2667 | "requires": {
2668 | "estree-walker": "^2.0.1",
2669 | "picomatch": "^2.2.2"
2670 | }
2671 | },
2672 | "estree-walker": {
2673 | "version": "2.0.2",
2674 | "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-2.0.2.tgz?cache=0&sync_timestamp=1611956983677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festree-walker%2Fdownload%2Festree-walker-2.0.2.tgz",
2675 | "integrity": "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=",
2676 | "dev": true
2677 | },
2678 | "tslib": {
2679 | "version": "2.1.0",
2680 | "resolved": "https://registry.nlark.com/tslib/download/tslib-2.1.0.tgz",
2681 | "integrity": "sha1-2mCGDxwuyqVwOrfTm8Bba/mIuXo=",
2682 | "dev": true
2683 | }
2684 | }
2685 | },
2686 | "run-async": {
2687 | "version": "2.4.1",
2688 | "resolved": "https://registry.nlark.com/run-async/download/run-async-2.4.1.tgz",
2689 | "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU="
2690 | },
2691 | "run-parallel": {
2692 | "version": "1.2.0",
2693 | "resolved": "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.2.0.tgz?cache=0&sync_timestamp=1612925943325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frun-parallel%2Fdownload%2Frun-parallel-1.2.0.tgz",
2694 | "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=",
2695 | "dev": true,
2696 | "requires": {
2697 | "queue-microtask": "^1.2.2"
2698 | }
2699 | },
2700 | "rxjs": {
2701 | "version": "6.6.7",
2702 | "resolved": "https://registry.nlark.com/rxjs/download/rxjs-6.6.7.tgz?cache=0&sync_timestamp=1625506834622&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frxjs%2Fdownload%2Frxjs-6.6.7.tgz",
2703 | "integrity": "sha1-kKwBisq/SRv2UEQjXVhjxNq4BMk=",
2704 | "requires": {
2705 | "tslib": "^1.9.0"
2706 | }
2707 | },
2708 | "safe-buffer": {
2709 | "version": "5.2.1",
2710 | "resolved": "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz",
2711 | "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY="
2712 | },
2713 | "safer-buffer": {
2714 | "version": "2.1.2",
2715 | "resolved": "https://registry.nlark.com/safer-buffer/download/safer-buffer-2.1.2.tgz",
2716 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
2717 | },
2718 | "semver": {
2719 | "version": "7.3.5",
2720 | "resolved": "https://registry.nlark.com/semver/download/semver-7.3.5.tgz?cache=0&sync_timestamp=1618847119601&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-7.3.5.tgz",
2721 | "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=",
2722 | "dev": true,
2723 | "requires": {
2724 | "lru-cache": "^6.0.0"
2725 | }
2726 | },
2727 | "serialize-javascript": {
2728 | "version": "4.0.0",
2729 | "resolved": "https://registry.nlark.com/serialize-javascript/download/serialize-javascript-4.0.0.tgz",
2730 | "integrity": "sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao=",
2731 | "dev": true,
2732 | "requires": {
2733 | "randombytes": "^2.1.0"
2734 | }
2735 | },
2736 | "shebang-command": {
2737 | "version": "2.0.0",
2738 | "resolved": "https://registry.nlark.com/shebang-command/download/shebang-command-2.0.0.tgz",
2739 | "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=",
2740 | "dev": true,
2741 | "requires": {
2742 | "shebang-regex": "^3.0.0"
2743 | }
2744 | },
2745 | "shebang-regex": {
2746 | "version": "3.0.0",
2747 | "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz",
2748 | "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=",
2749 | "dev": true
2750 | },
2751 | "signal-exit": {
2752 | "version": "3.0.3",
2753 | "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz?cache=0&sync_timestamp=1614858571178&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.3.tgz",
2754 | "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw="
2755 | },
2756 | "single-line-log": {
2757 | "version": "1.1.2",
2758 | "resolved": "https://registry.npm.taobao.org/single-line-log/download/single-line-log-1.1.2.tgz",
2759 | "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
2760 | "requires": {
2761 | "string-width": "^1.0.1"
2762 | },
2763 | "dependencies": {
2764 | "is-fullwidth-code-point": {
2765 | "version": "1.0.0",
2766 | "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz",
2767 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
2768 | "requires": {
2769 | "number-is-nan": "^1.0.0"
2770 | },
2771 | "dependencies": {
2772 | "number-is-nan": {
2773 | "version": "1.0.1",
2774 | "resolved": "https://registry.nlark.com/number-is-nan/download/number-is-nan-1.0.1.tgz",
2775 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
2776 | }
2777 | }
2778 | },
2779 | "string-width": {
2780 | "version": "1.0.2",
2781 | "resolved": "https://registry.nlark.com/string-width/download/string-width-1.0.2.tgz",
2782 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
2783 | "requires": {
2784 | "code-point-at": "^1.0.0",
2785 | "is-fullwidth-code-point": "^1.0.0",
2786 | "strip-ansi": "^3.0.0"
2787 | },
2788 | "dependencies": {
2789 | "code-point-at": {
2790 | "version": "1.1.0",
2791 | "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz",
2792 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
2793 | }
2794 | }
2795 | },
2796 | "strip-ansi": {
2797 | "version": "3.0.1",
2798 | "resolved": "https://registry.nlark.com/strip-ansi/download/strip-ansi-3.0.1.tgz",
2799 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
2800 | "requires": {
2801 | "ansi-regex": "^2.0.0"
2802 | }
2803 | }
2804 | }
2805 | },
2806 | "slash": {
2807 | "version": "3.0.0",
2808 | "resolved": "https://registry.nlark.com/slash/download/slash-3.0.0.tgz",
2809 | "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=",
2810 | "dev": true
2811 | },
2812 | "slice-ansi": {
2813 | "version": "4.0.0",
2814 | "resolved": "https://registry.nlark.com/slice-ansi/download/slice-ansi-4.0.0.tgz",
2815 | "integrity": "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=",
2816 | "dev": true,
2817 | "requires": {
2818 | "ansi-styles": "^4.0.0",
2819 | "astral-regex": "^2.0.0",
2820 | "is-fullwidth-code-point": "^3.0.0"
2821 | },
2822 | "dependencies": {
2823 | "ansi-styles": {
2824 | "version": "4.3.0",
2825 | "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz",
2826 | "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
2827 | "dev": true,
2828 | "requires": {
2829 | "color-convert": "^2.0.1"
2830 | }
2831 | },
2832 | "color-convert": {
2833 | "version": "2.0.1",
2834 | "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
2835 | "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
2836 | "dev": true,
2837 | "requires": {
2838 | "color-name": "~1.1.4"
2839 | }
2840 | },
2841 | "color-name": {
2842 | "version": "1.1.4",
2843 | "resolved": "https://registry.nlark.com/color-name/download/color-name-1.1.4.tgz",
2844 | "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
2845 | "dev": true
2846 | }
2847 | }
2848 | },
2849 | "source-map": {
2850 | "version": "0.7.3",
2851 | "resolved": "https://registry.nlark.com/source-map/download/source-map-0.7.3.tgz",
2852 | "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=",
2853 | "dev": true
2854 | },
2855 | "source-map-support": {
2856 | "version": "0.5.19",
2857 | "resolved": "https://registry.nlark.com/source-map-support/download/source-map-support-0.5.19.tgz",
2858 | "integrity": "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=",
2859 | "dev": true,
2860 | "requires": {
2861 | "buffer-from": "^1.0.0",
2862 | "source-map": "^0.6.0"
2863 | },
2864 | "dependencies": {
2865 | "source-map": {
2866 | "version": "0.6.1",
2867 | "resolved": "https://registry.nlark.com/source-map/download/source-map-0.6.1.tgz",
2868 | "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
2869 | "dev": true
2870 | }
2871 | }
2872 | },
2873 | "sourcemap-codec": {
2874 | "version": "1.4.8",
2875 | "resolved": "https://registry.nlark.com/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz",
2876 | "integrity": "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=",
2877 | "dev": true
2878 | },
2879 | "spdx-correct": {
2880 | "version": "3.1.1",
2881 | "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz",
2882 | "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=",
2883 | "dev": true,
2884 | "requires": {
2885 | "spdx-expression-parse": "^3.0.0",
2886 | "spdx-license-ids": "^3.0.0"
2887 | }
2888 | },
2889 | "spdx-exceptions": {
2890 | "version": "2.3.0",
2891 | "resolved": "https://registry.nlark.com/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz",
2892 | "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=",
2893 | "dev": true
2894 | },
2895 | "spdx-expression-parse": {
2896 | "version": "3.0.1",
2897 | "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz",
2898 | "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=",
2899 | "dev": true,
2900 | "requires": {
2901 | "spdx-exceptions": "^2.1.0",
2902 | "spdx-license-ids": "^3.0.0"
2903 | }
2904 | },
2905 | "spdx-license-ids": {
2906 | "version": "3.0.9",
2907 | "resolved": "https://registry.nlark.com/spdx-license-ids/download/spdx-license-ids-3.0.9.tgz?cache=0&sync_timestamp=1621652583280&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.9.tgz",
2908 | "integrity": "sha1-illRNd75WSvaaXCUdPHL7qfCRn8=",
2909 | "dev": true
2910 | },
2911 | "sprintf-js": {
2912 | "version": "1.0.3",
2913 | "resolved": "https://registry.nlark.com/sprintf-js/download/sprintf-js-1.0.3.tgz?cache=0&sync_timestamp=1618847174560&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsprintf-js%2Fdownload%2Fsprintf-js-1.0.3.tgz",
2914 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2915 | "dev": true
2916 | },
2917 | "string-width": {
2918 | "version": "4.2.2",
2919 | "resolved": "https://registry.nlark.com/string-width/download/string-width-4.2.2.tgz",
2920 | "integrity": "sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU=",
2921 | "requires": {
2922 | "emoji-regex": "^8.0.0",
2923 | "is-fullwidth-code-point": "^3.0.0",
2924 | "strip-ansi": "^6.0.0"
2925 | }
2926 | },
2927 | "string.prototype.trimend": {
2928 | "version": "1.0.4",
2929 | "resolved": "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz?cache=0&sync_timestamp=1614127461586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimend%2Fdownload%2Fstring.prototype.trimend-1.0.4.tgz",
2930 | "integrity": "sha1-51rpDClCxjUEaGwYsoe0oLGkX4A=",
2931 | "dev": true,
2932 | "requires": {
2933 | "call-bind": "^1.0.2",
2934 | "define-properties": "^1.1.3"
2935 | }
2936 | },
2937 | "string.prototype.trimstart": {
2938 | "version": "1.0.4",
2939 | "resolved": "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz?cache=0&sync_timestamp=1614127357785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.4.tgz",
2940 | "integrity": "sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0=",
2941 | "dev": true,
2942 | "requires": {
2943 | "call-bind": "^1.0.2",
2944 | "define-properties": "^1.1.3"
2945 | }
2946 | },
2947 | "string_decoder": {
2948 | "version": "1.3.0",
2949 | "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.3.0.tgz",
2950 | "integrity": "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=",
2951 | "requires": {
2952 | "safe-buffer": "~5.2.0"
2953 | }
2954 | },
2955 | "strip-ansi": {
2956 | "version": "6.0.0",
2957 | "resolved": "https://registry.nlark.com/strip-ansi/download/strip-ansi-6.0.0.tgz",
2958 | "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=",
2959 | "requires": {
2960 | "ansi-regex": "^5.0.0"
2961 | },
2962 | "dependencies": {
2963 | "ansi-regex": {
2964 | "version": "5.0.0",
2965 | "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.0.tgz",
2966 | "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U="
2967 | }
2968 | }
2969 | },
2970 | "strip-bom": {
2971 | "version": "3.0.0",
2972 | "resolved": "https://registry.nlark.com/strip-bom/download/strip-bom-3.0.0.tgz",
2973 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
2974 | "dev": true
2975 | },
2976 | "strip-json-comments": {
2977 | "version": "3.1.1",
2978 | "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.1.1.tgz",
2979 | "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=",
2980 | "dev": true
2981 | },
2982 | "supports-color": {
2983 | "version": "5.5.0",
2984 | "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz",
2985 | "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
2986 | "dev": true,
2987 | "requires": {
2988 | "has-flag": "^3.0.0"
2989 | }
2990 | },
2991 | "table": {
2992 | "version": "6.7.1",
2993 | "resolved": "https://registry.nlark.com/table/download/table-6.7.1.tgz",
2994 | "integrity": "sha1-7gVZK3FDgxqMlPPO5qrkwczvM+I=",
2995 | "dev": true,
2996 | "requires": {
2997 | "ajv": "^8.0.1",
2998 | "lodash.clonedeep": "^4.5.0",
2999 | "lodash.truncate": "^4.4.2",
3000 | "slice-ansi": "^4.0.0",
3001 | "string-width": "^4.2.0",
3002 | "strip-ansi": "^6.0.0"
3003 | },
3004 | "dependencies": {
3005 | "ajv": {
3006 | "version": "8.6.2",
3007 | "resolved": "https://registry.nlark.com/ajv/download/ajv-8.6.2.tgz?cache=0&sync_timestamp=1626380134544&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fajv%2Fdownload%2Fajv-8.6.2.tgz",
3008 | "integrity": "sha1-L7ReDl/LwIEzJsHD2lNdGIG7BXE=",
3009 | "dev": true,
3010 | "requires": {
3011 | "fast-deep-equal": "^3.1.1",
3012 | "json-schema-traverse": "^1.0.0",
3013 | "require-from-string": "^2.0.2",
3014 | "uri-js": "^4.2.2"
3015 | }
3016 | },
3017 | "json-schema-traverse": {
3018 | "version": "1.0.0",
3019 | "resolved": "https://registry.nlark.com/json-schema-traverse/download/json-schema-traverse-1.0.0.tgz",
3020 | "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=",
3021 | "dev": true
3022 | }
3023 | }
3024 | },
3025 | "terser": {
3026 | "version": "5.7.1",
3027 | "resolved": "https://registry.nlark.com/terser/download/terser-5.7.1.tgz?cache=0&sync_timestamp=1624884102109&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fterser%2Fdownload%2Fterser-5.7.1.tgz",
3028 | "integrity": "sha1-LcemEAm2a7Y4MFyyqCR2OxFr94Q=",
3029 | "dev": true,
3030 | "requires": {
3031 | "commander": "^2.20.0",
3032 | "source-map": "~0.7.2",
3033 | "source-map-support": "~0.5.19"
3034 | },
3035 | "dependencies": {
3036 | "commander": {
3037 | "version": "2.20.3",
3038 | "resolved": "https://registry.nlark.com/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1624609539421&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz",
3039 | "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=",
3040 | "dev": true
3041 | }
3042 | }
3043 | },
3044 | "text-table": {
3045 | "version": "0.2.0",
3046 | "resolved": "https://registry.nlark.com/text-table/download/text-table-0.2.0.tgz?cache=0&sync_timestamp=1618847142316&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftext-table%2Fdownload%2Ftext-table-0.2.0.tgz",
3047 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
3048 | "dev": true
3049 | },
3050 | "thenify": {
3051 | "version": "3.3.1",
3052 | "resolved": "https://registry.nlark.com/thenify/download/thenify-3.3.1.tgz",
3053 | "integrity": "sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8=",
3054 | "requires": {
3055 | "any-promise": "^1.0.0"
3056 | }
3057 | },
3058 | "thenify-all": {
3059 | "version": "1.6.0",
3060 | "resolved": "https://registry.nlark.com/thenify-all/download/thenify-all-1.6.0.tgz",
3061 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
3062 | "requires": {
3063 | "thenify": ">= 3.1.0 < 4"
3064 | }
3065 | },
3066 | "through": {
3067 | "version": "2.3.8",
3068 | "resolved": "https://registry.nlark.com/through/download/through-2.3.8.tgz",
3069 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
3070 | },
3071 | "timers-ext": {
3072 | "version": "0.1.7",
3073 | "resolved": "https://registry.npm.taobao.org/timers-ext/download/timers-ext-0.1.7.tgz",
3074 | "integrity": "sha1-b1ethXjgej+5+R2Th9ZWR1VeJcY=",
3075 | "requires": {
3076 | "es5-ext": "~0.10.46",
3077 | "next-tick": "1"
3078 | }
3079 | },
3080 | "tmp": {
3081 | "version": "0.0.33",
3082 | "resolved": "https://registry.nlark.com/tmp/download/tmp-0.0.33.tgz",
3083 | "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
3084 | "requires": {
3085 | "os-tmpdir": "~1.0.2"
3086 | }
3087 | },
3088 | "to-regex-range": {
3089 | "version": "5.0.1",
3090 | "resolved": "https://registry.nlark.com/to-regex-range/download/to-regex-range-5.0.1.tgz",
3091 | "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
3092 | "dev": true,
3093 | "requires": {
3094 | "is-number": "^7.0.0"
3095 | }
3096 | },
3097 | "ts-node": {
3098 | "version": "10.1.0",
3099 | "resolved": "https://registry.nlark.com/ts-node/download/ts-node-10.1.0.tgz?cache=0&sync_timestamp=1625866710908&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fts-node%2Fdownload%2Fts-node-10.1.0.tgz",
3100 | "integrity": "sha1-5lbYrTthEGk4qGf2nDmoum78lm4=",
3101 | "dev": true,
3102 | "requires": {
3103 | "@tsconfig/node10": "^1.0.7",
3104 | "@tsconfig/node12": "^1.0.7",
3105 | "@tsconfig/node14": "^1.0.0",
3106 | "@tsconfig/node16": "^1.0.1",
3107 | "arg": "^4.1.0",
3108 | "create-require": "^1.1.0",
3109 | "diff": "^4.0.1",
3110 | "make-error": "^1.1.1",
3111 | "source-map-support": "^0.5.17",
3112 | "yn": "3.1.1"
3113 | }
3114 | },
3115 | "tsconfig-paths": {
3116 | "version": "3.9.0",
3117 | "resolved": "https://registry.nlark.com/tsconfig-paths/download/tsconfig-paths-3.9.0.tgz?cache=0&sync_timestamp=1625590062133&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftsconfig-paths%2Fdownload%2Ftsconfig-paths-3.9.0.tgz",
3118 | "integrity": "sha1-CYVHpsREiAfo/Ljq4IEGTumjyQs=",
3119 | "dev": true,
3120 | "requires": {
3121 | "@types/json5": "^0.0.29",
3122 | "json5": "^1.0.1",
3123 | "minimist": "^1.2.0",
3124 | "strip-bom": "^3.0.0"
3125 | }
3126 | },
3127 | "tslib": {
3128 | "version": "1.14.1",
3129 | "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz",
3130 | "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA="
3131 | },
3132 | "tsutils": {
3133 | "version": "3.21.0",
3134 | "resolved": "https://registry.npm.taobao.org/tsutils/download/tsutils-3.21.0.tgz?cache=0&sync_timestamp=1615138184534&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftsutils%2Fdownload%2Ftsutils-3.21.0.tgz",
3135 | "integrity": "sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM=",
3136 | "dev": true,
3137 | "requires": {
3138 | "tslib": "^1.8.1"
3139 | }
3140 | },
3141 | "type": {
3142 | "version": "1.2.0",
3143 | "resolved": "https://registry.npm.taobao.org/type/download/type-1.2.0.tgz?cache=0&sync_timestamp=1615215448661&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype%2Fdownload%2Ftype-1.2.0.tgz",
3144 | "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A="
3145 | },
3146 | "type-check": {
3147 | "version": "0.4.0",
3148 | "resolved": "https://registry.nlark.com/type-check/download/type-check-0.4.0.tgz",
3149 | "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=",
3150 | "dev": true,
3151 | "requires": {
3152 | "prelude-ls": "^1.2.1"
3153 | }
3154 | },
3155 | "type-fest": {
3156 | "version": "0.20.2",
3157 | "resolved": "https://registry.nlark.com/type-fest/download/type-fest-0.20.2.tgz?cache=0&sync_timestamp=1625745315038&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.20.2.tgz",
3158 | "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=",
3159 | "dev": true
3160 | },
3161 | "typescript": {
3162 | "version": "4.3.5",
3163 | "resolved": "https://registry.nlark.com/typescript/download/typescript-4.3.5.tgz",
3164 | "integrity": "sha1-TRw3zBbok5c8RaBohrcRMjTxGfQ=",
3165 | "dev": true
3166 | },
3167 | "unbox-primitive": {
3168 | "version": "1.0.1",
3169 | "resolved": "https://registry.nlark.com/unbox-primitive/download/unbox-primitive-1.0.1.tgz",
3170 | "integrity": "sha1-CF4hViXsMWJXTciFmr7nilmxRHE=",
3171 | "dev": true,
3172 | "requires": {
3173 | "function-bind": "^1.1.1",
3174 | "has-bigints": "^1.0.1",
3175 | "has-symbols": "^1.0.2",
3176 | "which-boxed-primitive": "^1.0.2"
3177 | }
3178 | },
3179 | "underscore": {
3180 | "version": "1.4.4",
3181 | "resolved": "https://registry.nlark.com/underscore/download/underscore-1.4.4.tgz",
3182 | "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ="
3183 | },
3184 | "universalify": {
3185 | "version": "0.1.2",
3186 | "resolved": "https://registry.nlark.com/universalify/download/universalify-0.1.2.tgz",
3187 | "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=",
3188 | "dev": true
3189 | },
3190 | "uri-js": {
3191 | "version": "4.4.1",
3192 | "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237624359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz",
3193 | "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=",
3194 | "dev": true,
3195 | "requires": {
3196 | "punycode": "^2.1.0"
3197 | }
3198 | },
3199 | "util-deprecate": {
3200 | "version": "1.0.2",
3201 | "resolved": "https://registry.nlark.com/util-deprecate/download/util-deprecate-1.0.2.tgz",
3202 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
3203 | },
3204 | "v8-compile-cache": {
3205 | "version": "2.3.0",
3206 | "resolved": "https://registry.nlark.com/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz",
3207 | "integrity": "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=",
3208 | "dev": true
3209 | },
3210 | "validate-npm-package-license": {
3211 | "version": "3.0.4",
3212 | "resolved": "https://registry.nlark.com/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz",
3213 | "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
3214 | "dev": true,
3215 | "requires": {
3216 | "spdx-correct": "^3.0.0",
3217 | "spdx-expression-parse": "^3.0.0"
3218 | }
3219 | },
3220 | "wcwidth": {
3221 | "version": "1.0.1",
3222 | "resolved": "https://registry.nlark.com/wcwidth/download/wcwidth-1.0.1.tgz",
3223 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
3224 | "requires": {
3225 | "defaults": "^1.0.3"
3226 | }
3227 | },
3228 | "which": {
3229 | "version": "2.0.2",
3230 | "resolved": "https://registry.nlark.com/which/download/which-2.0.2.tgz",
3231 | "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=",
3232 | "dev": true,
3233 | "requires": {
3234 | "isexe": "^2.0.0"
3235 | }
3236 | },
3237 | "which-boxed-primitive": {
3238 | "version": "1.0.2",
3239 | "resolved": "https://registry.nlark.com/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz",
3240 | "integrity": "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=",
3241 | "dev": true,
3242 | "requires": {
3243 | "is-bigint": "^1.0.1",
3244 | "is-boolean-object": "^1.1.0",
3245 | "is-number-object": "^1.0.4",
3246 | "is-string": "^1.0.5",
3247 | "is-symbol": "^1.0.3"
3248 | }
3249 | },
3250 | "word-wrap": {
3251 | "version": "1.2.3",
3252 | "resolved": "https://registry.nlark.com/word-wrap/download/word-wrap-1.2.3.tgz",
3253 | "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=",
3254 | "dev": true
3255 | },
3256 | "wrappy": {
3257 | "version": "1.0.2",
3258 | "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz",
3259 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
3260 | },
3261 | "yallist": {
3262 | "version": "4.0.0",
3263 | "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz",
3264 | "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
3265 | "dev": true
3266 | },
3267 | "yn": {
3268 | "version": "3.1.1",
3269 | "resolved": "https://registry.npm.taobao.org/yn/download/yn-3.1.1.tgz",
3270 | "integrity": "sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A=",
3271 | "dev": true
3272 | }
3273 | }
3274 | }
3275 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@kairan.huang/api-generator",
3 | "version": "1.0.0",
4 | "description": "一键生成TS类型文件和请求方法",
5 | "main": "lib/core/core.js",
6 | "types": "lib/core/src/core.d.ts",
7 | "bin": {
8 | "api": "lib/core/index.js"
9 | },
10 | "scripts": {
11 | "dev": "ts-node --files -r tsconfig-paths/register ./src/index.ts -g",
12 | "diff": "ts-node --files -r tsconfig-paths/register ./src/index.ts -d",
13 | "build": "rollup -c"
14 | },
15 | "repository": {
16 | "type": "git",
17 | "url": "https://github.com/huangkairan/api-generator"
18 | },
19 | "author": "huangkairan",
20 | "license": "ISC",
21 | "dependencies": {
22 | "axios": "^0.21.1",
23 | "commander": "^7.2.0",
24 | "inquirer": "^8.1.1",
25 | "json-schema-to-typescript": "^10.1.4",
26 | "nedb": "^1.8.0",
27 | "single-line-log": "^1.1.2"
28 | },
29 | "devDependencies": {
30 | "@rollup/plugin-alias": "^3.1.2",
31 | "@rollup/plugin-json": "^4.1.0",
32 | "@rollup/plugin-node-resolve": "^13.0.0",
33 | "@types/inquirer": "^7.3.2",
34 | "@types/multi-progress": "^2.0.3",
35 | "@types/nedb": "^1.8.11",
36 | "@types/progress": "^2.0.4",
37 | "@types/single-line-log": "^1.1.0",
38 | "@typescript-eslint/eslint-plugin": "^4.28.1",
39 | "@typescript-eslint/parser": "^4.28.1",
40 | "eslint": "^7.29.0",
41 | "eslint-config-standard": "^16.0.3",
42 | "eslint-plugin-import": "^2.23.4",
43 | "eslint-plugin-node": "^11.1.0",
44 | "eslint-plugin-prettier": "^3.4.0",
45 | "eslint-plugin-promise": "^5.1.0",
46 | "prettier": "^2.3.2",
47 | "rollup": "^2.52.7",
48 | "rollup-plugin-cleandir": "^1.0.0",
49 | "rollup-plugin-copy": "^3.4.0",
50 | "rollup-plugin-preserve-shebangs": "^0.2.0",
51 | "rollup-plugin-terser": "^7.0.2",
52 | "rollup-plugin-typescript2": "^0.30.0",
53 | "ts-node": "^10.1.0",
54 | "tsconfig-paths": "^3.9.0",
55 | "typescript": "^4.3.5"
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/process.drawio:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
--------------------------------------------------------------------------------
/process.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huangkairan/api-generator/be424602a4bc138f5fb5d0dfad71d6acc90f476b/process.png
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-var-requires */
2 | import json from '@rollup/plugin-json'
3 | import { terser } from 'rollup-plugin-terser'
4 | import { cleandir } from 'rollup-plugin-cleandir'
5 | import typescript from 'rollup-plugin-typescript2'
6 | import { nodeResolve } from '@rollup/plugin-node-resolve'
7 | import { preserveShebangs } from 'rollup-plugin-preserve-shebangs'
8 | import alias from '@rollup/plugin-alias'
9 | import copy from 'rollup-plugin-copy'
10 |
11 | const extensions = ['.js', '.ts']
12 |
13 | export default {
14 | input: ['./src/index.ts', './src/core.ts'],
15 | output: {
16 | dir: './lib/core',
17 | format: 'cjs'
18 | },
19 | plugins: [
20 | cleandir('./lib'),
21 | // 处理#!/usr/bin/env node
22 | preserveShebangs(),
23 | alias({
24 | entries: [
25 | { find: '@', replacement: '../src' }
26 | ]
27 | }),
28 | // 解析typescript
29 | typescript({
30 | tsconfigOverride: {
31 | compilerOptions: {
32 | module: 'ESNEXT'
33 | }
34 | }
35 | }),
36 | // 解析node_modules
37 | nodeResolve({
38 | extensions,
39 | modulesOnly: true,
40 | preferredBuiltins: false
41 | }),
42 | // 将JSON转换为ES6版本
43 | json(),
44 | // 代码压缩
45 | terser(),
46 | // 拷贝静态文件
47 | copy({
48 | targets: [
49 | { src: 'src/templates/', dest: 'lib/' }
50 | ]
51 | })
52 | ]
53 | }
54 |
--------------------------------------------------------------------------------
/src/core.ts:
--------------------------------------------------------------------------------
1 | import { Login } from './yapi/login'
2 | import { initAxios } from './utils/http'
3 | import { getGroupList } from './yapi/group'
4 | import { getProjectList } from './yapi/project'
5 | import { getModularList } from './yapi/modular'
6 | import { getApiList } from './yapi/api'
7 | import { zhCN2EN } from './utils/name'
8 | import { generateInterface } from './generate/interface'
9 | import { generateDeclaration } from './generate/declaration'
10 | import { getUpdateList, generateUpdateInterface, getCacheList } from './generate/diff'
11 | import { setConfigRootPath, generateDefaultConfig, existConfig, getConfig } from './utils/config'
12 | export {
13 | // 设置配置文件根路径
14 | setConfigRootPath,
15 | // 初始化请求方法
16 | initAxios,
17 | // 判断是否有配置
18 | existConfig,
19 | // 获取配置
20 | getConfig,
21 | // 生成默认配置
22 | generateDefaultConfig,
23 | // 登录
24 | Login,
25 | // 获取分组列表
26 | getGroupList,
27 | // 获取项目分组
28 | getProjectList,
29 | // 获取项目分组
30 | getModularList,
31 | // 获取api详细数据
32 | getApiList,
33 | // 生成声明文件
34 | generateDeclaration,
35 | // 生成接口文件
36 | generateInterface,
37 | // 获取缓存数据
38 | getCacheList,
39 | // 获取需要更新的列表
40 | getUpdateList,
41 | // 生成更新的接口文件
42 | generateUpdateInterface,
43 |
44 | // 工具类
45 | zhCN2EN
46 | }
47 |
--------------------------------------------------------------------------------
/src/generate/declaration.ts:
--------------------------------------------------------------------------------
1 | import fs from 'fs'
2 | import path from 'path'
3 | import { getConfig } from '../utils/config'
4 | import { getQueryName, getRequestName, getResponseName, underlineToHump } from '../utils/name'
5 | import { generateDir } from '../utils/file'
6 | import { jsonSchemaToDts } from '../utils/jsonSchema'
7 | import { formatCode } from '../utils/prettify'
8 | import { IApiInfoResponse } from '../typing/yapi'
9 |
10 | /**
11 | * @description 生成声明文件
12 | * @param apis
13 | * @param projectName
14 | * @param modularId
15 | */
16 | export async function generateDeclaration (apis: IApiInfoResponse[], projectName: string, modularId: number, onProgress?: () => void): Promise {
17 | if (!apis || apis.length === 0) {
18 | throw new Error('生成的接口列表为空')
19 | }
20 | const config = getConfig()
21 | // 声明文件模板储存地址
22 | const dtsTemplate = fs.readFileSync(path.join(__dirname, '../templates/dtsTemplate/dts.tpl')).toString()
23 | // 声明文件Body模板存储路径
24 | const dtsBodyTemplate = fs.readFileSync(path.join(__dirname, '../templates/dtsTemplate/body.tpl')).toString()
25 |
26 | const responseContent = []
27 | const requestContent = []
28 |
29 | // 标记module的起始,方便后续更新
30 | requestContent.push(`//#region request:${modularId}`)
31 | responseContent.push(`//#region response:${modularId}`)
32 | // 遍历接口拼接声明文件内容
33 | for (let index = 0; index < apis.length; index++) {
34 | const api = apis[index]
35 | try {
36 | // 获取response声明文件
37 | const responseDts = api.detail.response ? await jsonSchemaToDts(api.detail.response, getResponseName(api)) : undefined
38 | // 获取body声明文件
39 | const bodyDts = api.detail.body ? await jsonSchemaToDts(api.detail.body, getRequestName(api)) : undefined
40 | // 获取query声明文件
41 | const queryDts = generateQueryDts(api)
42 | // 拼接response
43 | if (responseDts) {
44 | responseContent.push(responseDts)
45 | }
46 | // 拼接request
47 | if (bodyDts) {
48 | requestContent.push(bodyDts)
49 | }
50 | // 拼接query
51 | if (queryDts) {
52 | requestContent.push(queryDts)
53 | }
54 | } catch (err) {
55 | throw new Error(`接口声明:${api.path} 生成失败:${err.toString}`)
56 | }
57 | onProgress && onProgress()
58 | }
59 | // 标记module的结束,方便后续更新
60 | responseContent.push(`//#endregion response:${modularId}`)
61 | requestContent.push(`//#endregion request:${modularId}`)
62 |
63 | // 校验声明文件存放路径
64 | const dtsFilePath = path.resolve(`${config.outDir}/${underlineToHump(projectName)}`)
65 | // 声明文件的完整文件名
66 | const dtsFileName = path.resolve(`${dtsFilePath}/${underlineToHump(projectName, true)}.d.ts`)
67 | // 声明文件内容
68 | let dtsContent = ''
69 | // 是否已经存在声明文件
70 | if (fs.existsSync(dtsFileName)) {
71 | // 源文件
72 | const originContent = fs.readFileSync(dtsFileName).toString()
73 | const requestReg = new RegExp(`\\/\\/\\s*#region\\s*request:${modularId}[\\s\\S]*\\/\\/\\s*#endregion\\s*request:${modularId}`)
74 | const responseReg = new RegExp(`\\/\\/\\s*#region\\s*response:${modularId}[\\s\\S]*\\/\\/\\s*#endregion\\s*response:${modularId}`)
75 | const isExistModule = requestReg.test(originContent) || responseReg.test(originContent)
76 | // 已存在该module,根据#region request / #region response 标识去修改
77 | if (isExistModule) {
78 | // 替换模块位置
79 | dtsContent = originContent
80 | .replace(requestReg, requestContent.join('\r\n'))
81 | .replace(responseReg, responseContent.join('\r\n'))
82 | } else {
83 | // 不存在时,根据 #append 这个标识去新增
84 | dtsContent = originContent
85 | .replace(/(\s*\/\/\s*#append\s*request)/, `\r\n${requestContent.join('\r\n')} $1`)
86 | .replace(/(\s*\/\/\s*#append\s*response)/, `\r\n${responseContent.join('\r\n')} $1`)
87 | }
88 | // 判断tslint配置
89 | const tslintReg = /\/\/\s*@ts-ignore/
90 | const eslintReg = /\/\*\s*eslint-disable\s*\*\//
91 | const hasTslintIgnore = tslintReg.test(dtsContent)
92 | const hasEslintIgnore = eslintReg.test(dtsContent)
93 | if (config.tsIgnore && !hasTslintIgnore) {
94 | if (hasEslintIgnore) {
95 | dtsContent = dtsContent.replace(eslintReg, '/* eslint-disable */\n// @ts-ignore\n')
96 | } else {
97 | dtsContent = `// @ts-ignore\n${dtsContent}`
98 | }
99 | }
100 | if (!config.tsIgnore && hasTslintIgnore) {
101 | dtsContent = dtsContent.replace(tslintReg, '')
102 | }
103 | // 判断eslint配置
104 | if (config.esLintIgnore && !hasEslintIgnore) {
105 | dtsContent = `/* eslint-disable */\n${dtsContent}`
106 | }
107 | if (!config.esLintIgnore && hasEslintIgnore) {
108 | dtsContent = dtsContent.replace(eslintReg, '')
109 | }
110 | } else {
111 | // 如果不存在该文件,则从模板新增
112 | const bodyContent = dtsBodyTemplate
113 | .replace('{ResponseData}', responseContent.join('\r\n')) // 替换response
114 | .replace('{RequestData}', requestContent.join('\r\n')) // 替换request
115 | // 校验忽略文本
116 | const ignore = `${config.esLintIgnore ? '/* eslint-disable */\n' : ''}${config.tsIgnore ? '// @ts-ignore\n' : ''}`
117 | dtsContent = dtsTemplate
118 | .replace('{ProjectName}', underlineToHump(projectName, true)) // 替换命名空间名
119 | .replace('{BodyData}', bodyContent) // 替换Body
120 | .replace('{Ignore}', ignore) // 替换忽略校验
121 | }
122 | // 生成输出文件夹
123 | generateDir(dtsFilePath)
124 | // 写入声明文件
125 | fs.writeFileSync(dtsFileName, formatCode(dtsContent))
126 | }
127 |
128 | /**
129 | * @description 生成Get请求参数
130 | * @param apis
131 | * @param projectName
132 | * @param modularId
133 | */
134 | function generateQueryDts (api: IApiInfoResponse) {
135 | if (!api?.detail?.query || api.detail.query.length === 0) return undefined
136 | const queryBody = api.detail.query.map(e => {
137 | let template = e.desc
138 | ? `/**
139 | * ${e.desc}
140 | */
141 | `
142 | : ''
143 | template += `${e.name}${e.required ? '' : '?'}:${e.type};`
144 | return template
145 | })
146 | queryBody.push('[k: string]: any;')
147 | const content = `interface ${getQueryName(api)}{${queryBody.join('\r\n')}}`
148 | return content
149 | }
150 |
--------------------------------------------------------------------------------
/src/generate/diff.ts:
--------------------------------------------------------------------------------
1 | import path from 'path'
2 | import inquirer from 'inquirer'
3 | import { Login } from '../yapi/login'
4 | import { clg } from '../utils/console'
5 | import { initAxios } from '../utils/http'
6 | import { getConfig } from '../utils/config'
7 | import { generateDir } from '../utils/file'
8 | import { getDBCache, updateDB } from '../utils/nedb'
9 | import { getApiList } from '../yapi/api'
10 | import { generateInterface } from '../generate/interface'
11 | import { generateDeclaration } from '../generate/declaration'
12 | import { IApiCache, IApiInfoList, IDiffInterface, IDiffUpdateResponse } from '../typing/yapi'
13 | import { getDiffInterfaceList } from '../yapi/diff'
14 |
15 | /**
16 | * @description 获取缓存数据
17 | */
18 | export function getCacheList (data: IApiInfoList[], projectName: string, projectId: number): IApiCache[] {
19 | let apiList: IApiCache[] = []
20 | apiList = data.reduce((pre: IApiCache[], curr: IApiInfoList) => {
21 | pre.push({
22 | modularId: curr.modularId,
23 | modularName: curr.modularName,
24 | projectName: projectName,
25 | projectId: projectId,
26 | basePath: curr.basePath,
27 | cwd: process.cwd(),
28 | list: curr.list.map(e => ({
29 | id: e.id,
30 | updateTime: e.detail.updateTime
31 | }))
32 | })
33 | return pre
34 | }, apiList)
35 | return apiList
36 | }
37 |
38 | /**
39 | * @description 获取更变接口列表
40 | */
41 | export async function getUpdateList (localCaches: IApiCache[]): Promise {
42 | // 获取最新的接口数据
43 | let latestInterfaces = await getDiffInterfaceList(Array.from(new Set(localCaches.map(e => e.projectId))))
44 | // 筛选出本地存在的模块
45 | const modularIds = localCaches.map(e => e.modularId)
46 | latestInterfaces = new Map(Array.from(latestInterfaces).filter(e => modularIds.includes(e[0])))
47 | // 拼装本地数据,按模块ID划分
48 | let localInterfaces: IDiffInterface = new Map()
49 | localInterfaces = localCaches.reduce((pre, curr) => {
50 | pre.set(curr.modularId, curr.list.map(e => ({
51 | id: e.id,
52 | upTime: e.updateTime
53 | })))
54 | return pre
55 | }, localInterfaces)
56 | return new Promise(async (resolve) => {
57 | const updateList: IApiCache[] = []
58 | for (const item of latestInterfaces.entries()) {
59 | item[1].sort((a, b) => {
60 | return a.id > b.id ? 1 : -1
61 | })
62 | const local = localInterfaces.get(item[0])?.sort((a, b) => {
63 | return a.id > b.id ? 1 : -1
64 | }) || []
65 | const modal = localCaches.find(c => c.modularId === item[0])
66 | if (!modal) continue
67 | if (JSON.stringify(item[1]) !== JSON.stringify(local)) { updateList.push(modal) }
68 | }
69 | resolve(updateList)
70 | })
71 | }
72 |
73 | /**
74 | * @description 生成更新的接口文档
75 | */
76 | export async function generateUpdateInterface (list: IApiCache[]): Promise {
77 | // 获取参数
78 | const config = getConfig()
79 | const result: IDiffUpdateResponse[] = []
80 | let apiInfos: IApiInfoList[] = []
81 | for (const item of list) {
82 | // 获取接口列表
83 | const apiList = await getApiList(item.modularId)
84 | // 生成输出文档
85 | const outdir = path.resolve(config.outDir)
86 | generateDir(outdir)
87 | // 生成声明文件
88 | generateDeclaration(apiList, item.projectName, item.modularId)
89 | // 生成接口文件
90 | generateInterface(apiList, item.projectName, item.projectId, item.basePath, item.modularId)
91 | // 添加到记录
92 | apiInfos = [{
93 | list: apiList,
94 | modularId: item.modularId,
95 | modularName: item.modularName,
96 | basePath: item.basePath
97 | }]
98 | result.push({
99 | list: apiInfos,
100 | projectName: item.projectName,
101 | projectId: item.projectId
102 | })
103 | }
104 | return result
105 | }
106 |
107 | /**
108 | * @description 接口diff
109 | */
110 | export async function diffInterface (): Promise {
111 | // 初始化请求方法
112 | initAxios()
113 | // 登录
114 | await Login()
115 | // 获取当前项目缓存
116 | const caches = await getDBCache()
117 | if (!caches || caches.length === 0) {
118 | clg('yellow', '> 当前暂无接口缓存,请重新生成接口后恢复缓存')
119 | return
120 | }
121 | // 获取更新的接口列表
122 | const updateList = await getUpdateList(caches)
123 | if (updateList && updateList.length === 0) {
124 | clg('green', '接口已经是最新版')
125 | return
126 | }
127 | // 选择更新的模块
128 | const promptList = [{
129 | type: 'checkbox',
130 | message: '请选择要更新的模块:',
131 | name: 'modularNames',
132 | choices: updateList.map(e => e.modularName),
133 | pageSize: 100
134 | }]
135 | // 获取需要更新的模块
136 | const { modularNames } = await inquirer.prompt(promptList)
137 | // 选择的模块列表
138 | const selectModulars = updateList.filter(e => modularNames.includes(e.modularName))
139 | if (selectModulars.length === 0) {
140 | clg('green', '> 取消接口更新')
141 | return
142 | }
143 | // 生成更新的接口文档
144 | const diffResult = await generateUpdateInterface(selectModulars)
145 | for (const item of diffResult) {
146 | // 更新API缓存
147 | updateDB(item.list, item.projectName, item.projectId)
148 | }
149 | console.log('> 接口更新完成')
150 | }
151 |
--------------------------------------------------------------------------------
/src/generate/index.ts:
--------------------------------------------------------------------------------
1 | import inquirer from 'inquirer'
2 | import { Login } from '../yapi/login'
3 | import { clg } from '../utils/console'
4 | import { getApiList } from '../yapi/api'
5 | import { getGroupId } from '../yapi/group'
6 | import { generateDir } from '../utils/file'
7 | import { getModular } from '../yapi/modular'
8 | import { getProjectId } from '../yapi/project'
9 | import { generateInterface } from './interface'
10 | import { generateDeclaration } from '../generate/declaration'
11 | import { initConfig, existConfig, getConfig } from '../utils/config'
12 | import path from 'path'
13 | import { initAxios } from '../utils/http'
14 | import { updateDB } from '../utils/nedb'
15 | import { IApiInfoList } from '../typing/yapi'
16 | import { Progress } from '../utils/progress'
17 |
18 | /**
19 | * @description 生成ts文件
20 | */
21 | export async function generateTypescript (): Promise {
22 | // 判断是否有配置文件
23 | if (!existConfig()) {
24 | const res = await inquirer.prompt({
25 | type: 'confirm',
26 | message: '当前项目不存在config,是否生成默认配置',
27 | name: 'isGenerate',
28 | default: false
29 | })
30 | if (res.isGenerate) {
31 | initConfig()
32 | return
33 | } else {
34 | clg('red', '已取消生成默认配置,请完善配置后重试')
35 | return
36 | }
37 | }
38 | // 初始化请求方法
39 | initAxios()
40 | // 登录
41 | await Login()
42 | // 选择分组
43 | const groupId = await getGroupId()
44 | // 选择项目
45 | const { projectId, projectName } = await getProjectId(groupId)
46 | // 选择模块
47 | const modulars = await getModular(projectId)
48 | // 定义进度条
49 | const progress = new Progress('> yapi接口信息拉取', modulars.length, () => {
50 | progress.clear()
51 | clg('yellow', '> yapi接口信息拉取成功')
52 | })
53 | const apiInfos: IApiInfoList[] = []
54 | const errorList: string[] = []
55 | // 批量拉取接口信息
56 | for (let index = 0; index < modulars.length; index++) {
57 | const item = modulars[index]
58 | const interfaceList = await getApiList(item.modularId)
59 | errorList.push(...interfaceList.filter(e => !e.success).map(e => e.message))
60 | apiInfos.push({
61 | list: interfaceList,
62 | modularId: item.modularId,
63 | modularName: item.modularName,
64 | basePath: item.basePath
65 | })
66 | progress.push(index + 1)
67 | }
68 | const config = getConfig()
69 | // 创建输出文件夹
70 | const outdir = path.resolve(config.outDir)
71 | generateDir(outdir)
72 | // 获取接口总数
73 | const sum = apiInfos.reduce((pre, curr) => {
74 | pre += curr.list.length
75 | return pre
76 | }, 0)
77 | const dtsProgress = new Progress('> 正在生成声明文件', sum)
78 | let dtsProgressCurr = 0
79 | const apiProgress = new Progress('> 正在生成接口文件', sum)
80 | let apiProgressCurr = 0
81 | // 生成声明文件
82 | for (const item of apiInfos) {
83 | // 生成声明文件
84 | await generateDeclaration(item.list, projectName, item.modularId, () => {
85 | dtsProgressCurr++
86 | dtsProgress.push(dtsProgressCurr)
87 | })
88 | // 生成接口文件
89 | await generateInterface(item.list, projectName, projectId, item.basePath, item.modularId, () => {
90 | apiProgressCurr++
91 | apiProgress.push(apiProgressCurr)
92 | })
93 | }
94 | clg('yellow', '> 生成成功')
95 | if (errorList.length) {
96 | clg('yellow', '> 生成时有以下接口异常,已默认使用any代替:')
97 | clg('red', `${errorList.join('\n')}\n请检查Yapi是否规范`)
98 | }
99 | // 更新缓存
100 | updateDB(apiInfos, projectName, projectId)
101 | }
102 |
--------------------------------------------------------------------------------
/src/generate/interface.ts:
--------------------------------------------------------------------------------
1 | import fs from 'fs'
2 | import path from 'path'
3 | import { getConfig } from '../utils/config'
4 | import { generateDir } from '../utils/file'
5 | import { formatCode } from '../utils/prettify'
6 | import { getBodyPath, getInterfaceName, getNamespace, getQueryPath, getResponesPath, underlineToHump } from '../utils/name'
7 | import { IApiDetailParam, IApiInfoResponse } from '../typing/yapi'
8 |
9 | /**
10 | * @description 生成API请求方法
11 | * @param apis
12 | * @param projectName
13 | * @param projectId
14 | * @param basePath
15 | * @param modularId
16 | */
17 | export function generateInterface (apis: IApiInfoResponse[], projectName: string, projectId: number, basePath: string, modularId: number, onProgress?: () => void) {
18 | const config = getConfig()
19 | const apiTemplate = fs.readFileSync(path.join(__dirname, '../templates/apiTemplate/api.tpl')).toString()
20 | if (!(projectId in config.projectMapping)) {
21 | throw new Error(`生成失败,项目:${projectName},ID:${projectId} 未配置 projectMapping`)
22 | }
23 |
24 | const apiList = []
25 | // 标记module的起始,方便后续更新
26 | if (apis && apis.length > 0) {
27 | apiList.push(`//#region interface:${modularId}`)
28 | }
29 | for (let index = 0; index < apis.length; index++) {
30 | const api = apis[index]
31 | try {
32 | // 添加接口内容
33 | apiList.push(generateApiFunction(api, projectName, projectId))
34 | } catch (err) {
35 | throw new Error(`接口:${api.path} 生成失败:${err.toString()}`)
36 | }
37 | onProgress && onProgress()
38 | }
39 | // 标记module的结束,方便后续更新
40 | if (apis && apis.length > 0) {
41 | apiList.push(`//#endregion interface:${modularId}`)
42 | }
43 | // api文件存放路径
44 | const apiFilePath = path.resolve(`${config.outDir}/${underlineToHump(projectName)}`)
45 | // api文件的完整文件名
46 | const apiFileName = path.resolve(`${apiFilePath}/index.ts`)
47 | // api文件内容
48 | let apiContent = ''
49 | // 是否已经存在声明文件
50 | if (fs.existsSync(apiFileName)) {
51 | // 源文件
52 | let originContent = fs.readFileSync(apiFileName).toString()
53 | // 判断requestFilePath是否变更
54 | const requestFilePathReg = /import\s\*\sas\sdefs\sfrom\s["|'|`][\S]*["|'|`]/
55 | const requestScript = originContent.match(requestFilePathReg)?.[0] ?? ''
56 | const newRequestScript = `import * as defs from '${config.requestFilePath}';`
57 | if (requestScript && requestScript !== newRequestScript) {
58 | originContent = originContent.replace(
59 | requestFilePathReg,
60 | newRequestScript
61 | )
62 | }
63 | // 判断模块是否存在了
64 | const interfaceExp = new RegExp(`\\/\\/\\s*#region\\s*interface:${modularId}`)
65 | const isExistModule = interfaceExp.test(originContent)
66 | // 已存在该module,根据#region interface 标识去修改
67 | if (isExistModule) {
68 | const reg = new RegExp(`\\/\\/\\s*#region\\s*interface:${modularId}[\\s\\S]*\\/\\/\\s*#endregion\\s*interface:${modularId}`)
69 | apiContent = originContent.replace(reg, apiList.join('\r\n'))
70 | } else {
71 | // 不存在时,直接添加在最后
72 | apiContent = `${originContent}\r\n${apiList.join('\r\n')}`
73 | }
74 | } else {
75 | // 统一返回体wrapper
76 | const wrapper = config.projectMapping[projectId].wrapper
77 | // 请求方法文件路径
78 | const requestFilePath = config.requestFilePath
79 | // 校验忽略文本
80 | const ignore = `${config.esLintIgnore ? '/* eslint-disable */\n' : ''}${config.tsIgnore ? '// @ts-ignore\n' : ''}`
81 | // 如果不存在该文件,则从模板新增
82 | apiContent = apiTemplate
83 | .replace('{RequestFilePath}', requestFilePath) // 替换请求方法文件路径
84 | .replace('{Wrapper}', wrapper
85 | ? `interface IResponseWrapper ${wrapper} \r\n`
86 | : '') // 配置统一请求返回体
87 | .replace('{Mock}', `${config.originUrl}/mock/${projectId}${basePath || ''}`) // 替换mock路径
88 | .replace('{Ignore}', ignore) // 替换忽略校验
89 | .replace('{dtsModule}', config.fetchModule)
90 | apiContent += apiList.join('\r\n')
91 | }
92 | // 生成输出文件夹
93 | generateDir(apiFilePath)
94 | fs.writeFileSync(apiFileName, formatCode(apiContent))
95 | }
96 |
97 | // 生成Api请求方法
98 | function generateApiFunction (api: IApiInfoResponse, projectName: string, projectId: number) {
99 | const config = getConfig()
100 | const apiBodyTemplate = fs.readFileSync(path.join(__dirname, '../templates/apiTemplate/body.tpl')).toString()
101 | // 获取命名空间名
102 | const namespaceName = getNamespace(projectName)
103 | // 是否需要body
104 | const isNeedBody = ['post', 'put'].includes(api.method.toLocaleLowerCase())
105 | // 接口描述
106 | const description = api.title
107 | // 接口名字
108 | const interfaceName = getInterfaceName(api)
109 | // URL参数
110 | const urlParams = `${getUrlQuery(api.detail.urlParams)}\n`
111 | // 参数Query
112 | const query = api.detail.query && api.detail.query.length > 0 ? `query: ${getQueryPath(namespaceName, api)},\n` : ''
113 | // 参数Body
114 | const body = isNeedBody && api.detail.body ? `body: ${getBodyPath(namespaceName, api)},\n` : ''
115 | // 返回的类型
116 | const response = api.detail.response
117 | ? config.projectMapping[projectId].wrapper
118 | ? `IResponseWrapper<${getResponesPath(namespaceName, api)},>`
119 | : `${getResponesPath(namespaceName, api)},`
120 | : 'T'
121 | // 映射的方法名
122 | const mapping = config.projectMapping[projectId].exportName
123 | // 请求方法
124 | const method = api.method.toLocaleLowerCase()
125 | // 请求URL
126 | const url = api.path.replace(/{(.*?)}/g, '${$1}')
127 | // 请求Body
128 | const bodyParam = isNeedBody ? api.detail.body ? 'body,' : 'undefined,' : ''
129 | // 请求Query
130 | const queryParam = api.detail.query && api.detail.query.length > 0 ? 'params: query' : ''
131 | const bodyContent = apiBodyTemplate.replace('{Description}', description)
132 | .replace('{InterfaceName}', `${interfaceName}${response === 'T' ? '' : ''}`)
133 | .replace('{UrlParams}', urlParams)
134 | .replace('{Query}', query)
135 | .replace('{Body}', body)
136 | .replace('{Response}', response)
137 | .replace('{Mapping}', mapping)
138 | .replace('{Method}', method)
139 | .replace('{Url}', url)
140 | .replace('{BodyParam}', bodyParam)
141 | .replace('{QueryParam}', queryParam)
142 | return bodyContent
143 | }
144 |
145 | // 获取路径参数
146 | function getUrlQuery (params: IApiDetailParam[]) {
147 | return params && params.length > 0 ? params.map(e => `${e.name}: ${e.type}`).join(',') + ',' : ''
148 | }
149 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | import pkg from '../package.json'
3 | import { program } from 'commander'
4 | import { initConfig } from './utils/config'
5 | import { removeDBCache } from './utils/nedb'
6 | import { diffInterface } from './generate/diff'
7 | import { generateTypescript } from './generate/index'
8 |
9 | // 配置执行参数
10 | program
11 | .version(pkg.version, '-v, --version', '获取当前版本')
12 | .option('-i, --init', '初始化配置文件')
13 | .option('-g, --generate', '生成接口文档')
14 | .option('-r, --remove', '移除缓存')
15 | .option('-d, --diff', '当前项目Diff')
16 |
17 | program.on('option:generate', () => {
18 | generateTypescript()
19 | })
20 |
21 | program.on('option:init', () => {
22 | initConfig()
23 | })
24 |
25 | program.on('option:diff', () => {
26 | diffInterface()
27 | })
28 |
29 | program.on('option:remove', () => {
30 | removeDBCache()
31 | })
32 |
33 | program.parse(process.argv)
34 |
--------------------------------------------------------------------------------
/src/templates/apiTemplate/api.tpl:
--------------------------------------------------------------------------------
1 | {Ignore}{dtsModule}
2 | import * as defs from '{RequestFilePath}';
3 | {Wrapper}
4 | const MockUrl = '{Mock}';
5 |
--------------------------------------------------------------------------------
/src/templates/apiTemplate/body.tpl:
--------------------------------------------------------------------------------
1 | /**
2 | * {Description}
3 | */
4 | export function {InterfaceName}(
5 | {UrlParams}{Query}{Body}configs?: RequestConfig,
6 | isMock?:boolean ): RequestPromise<{Response}> {
7 | return defs.{Mapping}.{Method}(`${isMock && MockUrl ? MockUrl : ''}{Url}`, {BodyParam} {
8 | ...configs,
9 | {QueryParam}
10 | });
11 | }
--------------------------------------------------------------------------------
/src/templates/dtsTemplate/body.tpl:
--------------------------------------------------------------------------------
1 | namespace Request {
2 | {RequestData}
3 | //#append request
4 | }
5 | namespace Response {
6 | {ResponseData}
7 | //#append response
8 | }
--------------------------------------------------------------------------------
/src/templates/dtsTemplate/dts.tpl:
--------------------------------------------------------------------------------
1 | {Ignore}declare namespace {ProjectName} {
2 | {BodyData}
3 | }
--------------------------------------------------------------------------------
/src/typing/config.ts:
--------------------------------------------------------------------------------
1 | // 项目映射
2 | export interface IProjectMapping {
3 | // api方法
4 | exportName: string,
5 | // 通用封装
6 | wrapper: string
7 | }
8 |
9 | // 配置文件
10 | export interface IConfig {
11 | // 账号
12 | account: string,
13 | // 密码
14 | password: string,
15 | // 原地址
16 | originUrl: string,
17 | // 输出目录
18 | outDir: string,
19 | // 请求声明模块
20 | fetchModule: string,
21 | // 项目跟请求方法映射
22 | projectMapping: { [key: number]: IProjectMapping },
23 | // 请求文件路径
24 | requestFilePath: string,
25 | // 忽略ts校验
26 | tsIgnore: boolean,
27 | // 忽略eslint
28 | esLintIgnore: boolean
29 | }
30 |
--------------------------------------------------------------------------------
/src/typing/yapi.ts:
--------------------------------------------------------------------------------
1 | // 项目返回信息
2 | export interface IProjectResponse {
3 | projectId: number;
4 | projectName: string;
5 | }
6 |
7 | // 模块返回信息
8 | export interface IModularResponse {
9 | modularId: number;
10 | modularName: string;
11 | basePath: string;
12 | }
13 |
14 | // 模块返回信息
15 | export interface IModularLiatResponse {
16 | modularList: IListItem[];
17 | basePath: string;
18 | }
19 |
20 | // api信息信息
21 | export interface IApiInfoList {
22 | list: IApiInfoResponse[];
23 | modularId: number;
24 | modularName: string;
25 | basePath: string;
26 | }
27 |
28 | // api信息返回信息
29 | export interface IApiInfoResponse {
30 | id: number,
31 | title: string,
32 | path: string,
33 | method: string,
34 | detail: IApiDetail
35 | success: boolean,
36 | message: string
37 | }
38 |
39 | export interface IApiDetailParam {
40 | desc: string,
41 | name: string,
42 | type: string,
43 | required: boolean
44 | }
45 |
46 | export interface IApiDetailResult {
47 | success: boolean
48 | message: string
49 | detail: IApiDetail
50 | }
51 |
52 | // API详细信息
53 | export interface IApiDetail {
54 | // 路径参数
55 | urlParams: IApiDetailParam[],
56 | // 请求参数
57 | query: IApiDetailParam[],
58 | // 请求体
59 | body: any,
60 | // 返回数据
61 | response: any,
62 | // 更新时间
63 | updateTime: number,
64 | // 接口名
65 | title: string,
66 | // 接口路径
67 | url: string
68 | }
69 |
70 | // 列表信息
71 | export interface IListItem {
72 | name: string,
73 | id: number
74 | basepath: string,
75 | }
76 |
77 | // diff的数据
78 | export interface IDiffInfo {
79 | id: number,
80 | title: string,
81 | url: string
82 | }
83 |
84 | export type IApiCache = {
85 | // 模块ID
86 | modularId: number;
87 | // 模块名称
88 | modularName: string;
89 | // 项目名
90 | projectName: string;
91 | // 项目ID
92 | projectId: number;
93 | // basePath
94 | basePath: string;
95 | // 当前项目路径
96 | cwd?: string;
97 | // 接口信息
98 | list: IApiCacheItem[]
99 | }
100 |
101 | // 接口缓存数据
102 | export interface IApiCacheItem {
103 | // 接口ID
104 | id: number;
105 | // 更新时间
106 | updateTime: number;
107 | }
108 |
109 | // 接口更新返回参数
110 | export interface IDiffUpdateResponse {
111 | list: IApiInfoList[],
112 | projectName: string,
113 | projectId: number
114 | }
115 |
116 | // diff所需的接口数据
117 | export type IDiffInterface = Map
118 |
119 | export interface IDiffInterfaceItem {
120 | upTime: number,
121 | id: number,
122 | }
123 |
--------------------------------------------------------------------------------
/src/utils/config.ts:
--------------------------------------------------------------------------------
1 | import path from 'path'
2 | import fs from 'fs'
3 | import inquirer from 'inquirer'
4 | import { clg } from './console'
5 | import { IConfig } from '../typing/config'
6 | let configRootPath = process.cwd()
7 |
8 | /**
9 | * @description 获取配置文件路径
10 | */
11 | function configPath () {
12 | return path.resolve(configRootPath, './api.config.js')
13 | }
14 |
15 | /**
16 | * @description 设置配置文件根路径,主要为了适配vscode插件
17 | */
18 | export function setConfigRootPath (root: string): void {
19 | configRootPath = root
20 | }
21 |
22 | /**
23 | * @description 获取配置
24 | */
25 | export function getConfig (): IConfig {
26 | if (!existConfig()) {
27 | throw new Error('api.config.js 配置文件不存在')
28 | }
29 | if (require.cache[configPath()]) {
30 | delete require.cache[configPath()]
31 | }
32 | const config: IConfig = require(configPath())
33 | if (!config.account || !config.password) {
34 | throw new Error('请配置Yapi账号密码')
35 | }
36 | if (!config.originUrl) {
37 | throw new Error('请配置Yapi地址')
38 | }
39 | if (!config.outDir) {
40 | throw new Error('请配置Yapi文件生成输出目录')
41 | }
42 | if (!config.fetchModule) {
43 | throw new Error('请配置Yapi请求声明模块')
44 | }
45 | if (!config.projectMapping) {
46 | throw new Error('请配置Yapi项目映射')
47 | }
48 | if (!config.requestFilePath) {
49 | throw new Error('请配置axios请求方法文件路径')
50 | }
51 | config.outDir = path.resolve(configRootPath, config.outDir)
52 | return config
53 | }
54 |
55 | /**
56 | * @description 是否存在配置
57 | */
58 | export const existConfig = (): boolean => {
59 | return fs.existsSync(configPath())
60 | }
61 |
62 | /**
63 | * @description 初始化默认配置
64 | */
65 | export const initConfig = async (): Promise => {
66 | if (existConfig()) {
67 | const res = await inquirer.prompt({
68 | type: 'confirm',
69 | message: '已存在本地配置,是否覆盖?',
70 | name: 'isOverlap',
71 | default: false
72 | })
73 | if (!res.isOverlap) {
74 | clg('red', '已取消生成配置')
75 | return
76 | }
77 | }
78 | generateDefaultConfig()
79 | clg('green', '默认配置已生成,请根据文档进行配置')
80 | }
81 |
82 | /**
83 | * @description 生成默认配置
84 | */
85 | export const generateDefaultConfig = (): void => {
86 | const originPath = path.resolve(__dirname, '../templates/configTemplate/api.config.js')
87 | fs.copyFileSync(originPath, configPath())
88 | }
89 |
--------------------------------------------------------------------------------
/src/utils/console.ts:
--------------------------------------------------------------------------------
1 | type ColorType = 'bright' |
2 | 'grey' |
3 | 'italic' |
4 | 'underline' |
5 | 'reverse' |
6 | 'hidden' |
7 | 'black' |
8 | 'red' |
9 | 'green' |
10 | 'yellow' |
11 | 'blue' |
12 | 'magenta' |
13 | 'cyan' |
14 | 'white' |
15 | 'blackBG' |
16 | 'redBG' |
17 | 'greenBG' |
18 | 'yellowBG' |
19 | 'blueBG' |
20 | 'magentaBG' |
21 | 'cyanBG' |
22 | 'whiteBG'
23 | const colors: { [key: string]: string } = {
24 | bright: '\x1B[1m', // 亮色
25 | grey: '\x1B[2m', // 灰色
26 | italic: '\x1B[3m', // 斜体
27 | underline: '\x1B[4m', // 下划线
28 | reverse: '\x1B[7m', // 反向
29 | hidden: '\x1B[8m', // 隐藏
30 | black: '\x1B[30m', // 黑色
31 | red: '\x1B[31m', // 红色
32 | green: '\x1B[32m', // 绿色
33 | yellow: '\x1B[33m', // 黄色
34 | blue: '\x1B[34m', // 蓝色
35 | magenta: '\x1B[35m', // 品红
36 | cyan: '\x1B[36m', // 青色
37 | white: '\x1B[37m', // 白色
38 | blackBG: '\x1B[40m', // 背景色为黑色
39 | redBG: '\x1B[41m', // 背景色为红色
40 | greenBG: '\x1B[42m', // 背景色为绿色
41 | yellowBG: '\x1B[43m', // 背景色为黄色
42 | blueBG: '\x1B[44m', // 背景色为蓝色
43 | magentaBG: '\x1B[45m', // 背景色为品红
44 | cyanBG: '\x1B[46m', // 背景色为青色
45 | whiteBG: '\x1B[47m' // 背景色为白色
46 | }
47 |
48 | export const clg = (color: ColorType, ...texts: any[]): void => {
49 | const consoleContents = texts.map(text => {
50 | if (typeof text === 'string') { return `${colors[color]}${text}\x1B[0m` } else { return text }
51 | })
52 | console.log(...consoleContents)
53 | }
54 |
--------------------------------------------------------------------------------
/src/utils/file.ts:
--------------------------------------------------------------------------------
1 | import fs from 'fs'
2 |
3 | // 生成文件夹
4 | export function generateDir (path: string): void {
5 | if (!fs.existsSync(path)) {
6 | fs.mkdirSync(path, { recursive: true })
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/utils/http.ts:
--------------------------------------------------------------------------------
1 | import axios from 'axios'
2 | import { getConfig } from './config'
3 |
4 | /**
5 | * @description 初始化请求default
6 | */
7 | export function initAxios (): void {
8 | const config = getConfig()
9 | axios.defaults.baseURL = config.originUrl
10 | }
11 |
12 | /**
13 | * @description 设置cookie
14 | */
15 | export function setCookie (cookie: string): void {
16 | axios.interceptors.request.use((req) => {
17 | req.headers = {
18 | ...req.headers,
19 | cookie: cookie
20 | }
21 | return req
22 | })
23 | }
24 |
25 | export const http = axios
26 |
--------------------------------------------------------------------------------
/src/utils/jsonSchema.ts:
--------------------------------------------------------------------------------
1 | import { compile } from 'json-schema-to-typescript'
2 |
3 | // json schema生成声明文件
4 | export async function jsonSchemaToDts (jsonSchema: any, name: string): Promise {
5 | // 防止导出的对象重名,对子对象进行重命名
6 | recursionRename(jsonSchema.properties, name)
7 | return new Promise((resolve) => {
8 | jsonSchema.title = name
9 | compile(jsonSchema, name, {
10 | unknownAny: false,
11 | bannerComment: '',
12 | ignoreMinAndMaxItems: true,
13 | unreachableDefinitions: true
14 | }).then(dts => {
15 | resolve(dts)
16 | }).catch(err => {
17 | throw new Error(`json schema转声明文件失败:${err.toString()}`)
18 | })
19 | })
20 | }
21 |
22 | /**
23 | * @description 递归json schema修改名字
24 | */
25 | function recursionRename (schema: any, prefix: string) {
26 | for (const key in schema) {
27 | const item = schema[key]
28 | const keyName = key[0].toLocaleUpperCase() + key.substring(1, key.length)
29 | // 如果是对象则重命名
30 | if (item.properties && item.type === 'object') {
31 | item.title = `${prefix}${keyName}`
32 | item.$$ref = `#/definitions/${prefix}${keyName}`
33 | }
34 | if (item.properties) {
35 | recursionRename(item.properties, `${prefix}${keyName}`)
36 | }
37 | // 如果是对象数组则重命名并递归下去
38 | if (item.items && item.items.type === 'object') {
39 | item.items.title = `${prefix}${keyName}`
40 | item.items.$$ref = `#/definitions/${prefix}${keyName}`
41 | recursionRename(item.items, `${prefix}${keyName}`)
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/utils/name.ts:
--------------------------------------------------------------------------------
1 | import { IApiInfoResponse } from '../typing/yapi'
2 | import { http } from './http'
3 |
4 | /**
5 | * @description 下划线转驼峰
6 | */
7 | export function underlineToHump (name: string, isBigHump = false): string {
8 | let hump = name.replace(/[_|\-|\s](\w)/g, function (all, letter) {
9 | return letter.toUpperCase()
10 | })
11 | hump = (isBigHump ? hump.charAt(0).toLocaleUpperCase() : hump.charAt(0).toLocaleLowerCase()) + hump.substr(1)
12 | return hump
13 | }
14 |
15 | /**
16 | * @description 中文转英文
17 | */
18 | export function zhCN2EN (text: string): Promise {
19 | return new Promise((resolve) => {
20 | if (/[\u4e00-\u9fa5]/.test(text)) {
21 | const url = `http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=${encodeURIComponent(
22 | text
23 | )}`
24 | http
25 | .get(url)
26 | .then((res) => {
27 | const text = res.data.translateResult[0][0].tgt.replace(/\s+/g, '')
28 | resolve(underlineToHump(text, true))
29 | })
30 | .catch(() => {
31 | throw new Error('有道翻译接口请求失败')
32 | })
33 | } else {
34 | resolve(underlineToHump(text, true))
35 | }
36 | })
37 | }
38 |
39 | /**
40 | * @description 接口path路径变为驼峰
41 | */
42 | export function pathToHump (api: IApiInfoResponse, isBigHump = true): string {
43 | let name = api.path.replace(/[{|}]/g, '').replace(/\//g, '_')
44 | name = underlineToHump(name, isBigHump)
45 | return name
46 | }
47 |
48 | /**
49 | * @description 获取接口的Response名字
50 | */
51 | export function getResponseName (api: IApiInfoResponse): string {
52 | const name = pathToHump(api)
53 | const method = api.method.slice(0, 1).toUpperCase() + api.method.slice(1).toLocaleLowerCase()
54 | return `I${method}${name}Response`
55 | }
56 |
57 | /**
58 | * @description 获取接口的Params名字
59 | */
60 | export function getRequestName (api: IApiInfoResponse): string {
61 | const name = pathToHump(api)
62 | const method = api.method.slice(0, 1).toUpperCase() + api.method.slice(1).toLocaleLowerCase()
63 | return `I${method}${name}Request`
64 | }
65 |
66 | /**
67 | * @description 获取接口的Query名字
68 | */
69 | export function getQueryName (api: IApiInfoResponse): string {
70 | const name = pathToHump(api)
71 | const method = api.method.slice(0, 1).toUpperCase() + api.method.slice(1).toLocaleLowerCase()
72 | return `I${method}${name}Query`
73 | }
74 |
75 | /**
76 | * @description 获取namespace名字
77 | */
78 | export function getNamespace (projectName: string): string {
79 | return underlineToHump(projectName, true)
80 | }
81 |
82 | /**
83 | * @description 获取接口Query声明文件地址
84 | */
85 | export function getQueryPath (namespace: string, api: IApiInfoResponse): string {
86 | return `${namespace}.Request.${getQueryName(api)}`
87 | }
88 |
89 | /**
90 | * @description 获取Body声明文件路径
91 | */
92 | export function getBodyPath (namespace: string, api: IApiInfoResponse): string {
93 | return `${namespace}.Request.${getRequestName(api)}`
94 | }
95 |
96 | /**
97 | * @description 获取Respones声明文件路径
98 | */
99 | export function getResponesPath (namespace: string, api: IApiInfoResponse): string {
100 | return `${namespace}.Response.${getResponseName(api)}`
101 | }
102 |
103 | /**
104 | * @description 通过path生成接口名字
105 | */
106 | export function getInterfaceName (api: IApiInfoResponse): string {
107 | const name = pathToHump(api)
108 | return `${api.method.toLocaleLowerCase()}${name}`
109 | }
110 |
--------------------------------------------------------------------------------
/src/utils/nedb.ts:
--------------------------------------------------------------------------------
1 | import fs from 'fs'
2 | import Nedb from 'nedb'
3 | import path from 'path'
4 | import { getCacheList } from '../generate/diff'
5 | import { IApiCache, IApiInfoList } from '../typing/yapi'
6 | import { getConfig } from './config'
7 |
8 | /**
9 | * @description 获取数据库客户端
10 | */
11 | function getDBClient (): Promise {
12 | return new Promise((resolve, reject) => {
13 | const filePath = path.resolve(__dirname, './data')
14 | const fileName = path.join(filePath, '/save.db')
15 | // 判断路径是否存在,不存在则创建
16 | if (!fs.existsSync(filePath)) {
17 | fs.mkdirSync(filePath)
18 | }
19 | // 新建db客户端
20 | const db = new Nedb({
21 | filename: fileName
22 | })
23 | db.loadDatabase((err) => {
24 | if (err) reject(err)
25 | else resolve(db)
26 | })
27 | })
28 | }
29 |
30 | /**
31 | * @description 更新数据库
32 | */
33 | export async function updateDB (data: IApiInfoList[], projectName: string, projectId: number): Promise {
34 | // 拼装需要更新的缓存数据
35 | const apiList = getCacheList(data, projectName, projectId)
36 | const modularIds = apiList.map(e => e.modularId)
37 | return new Promise(async (resolve, reject) => {
38 | try {
39 | // 获取DB客户端
40 | const db = await getDBClient()
41 | const caches = await getDBCache({
42 | modularId: {
43 | $in: modularIds
44 | }
45 | })
46 | // 新增数据
47 | const insertList: IApiCache[] = apiList.filter(e => !caches.some(c => c.modularId === e.modularId))
48 | // 修改数据
49 | const updateList: IApiCache[] = apiList.filter(e => caches.some(c => c.modularId === e.modularId))
50 | // 如果有新增的数据
51 | if (insertList.length > 0) {
52 | db.insert(insertList, (err) => {
53 | if (err) reject(`nedb 添加失败: ${err}`)
54 | })
55 | }
56 | // 如果有新增的数据
57 | for (const item of updateList) {
58 | db.update({ modularId: item.modularId },
59 | { $set: { ...item } },
60 | {},
61 | (err) => {
62 | if (err) reject(`nedb 更新失败: ${err}`)
63 | })
64 | }
65 | resolve()
66 | } catch (err) {
67 | reject(err)
68 | }
69 | })
70 | }
71 |
72 | /**
73 | * @description 获取当前项目DB中的缓存数据
74 | */
75 | export async function getDBCache (where: { [key: string]: any } = {}): Promise {
76 | return new Promise(async (resolve, reject) => {
77 | const db = await getDBClient()
78 | try {
79 | db.find({
80 | cwd: process.cwd(),
81 | ...where
82 | }).exec((err, ret: IApiCache[]) => {
83 | if (err) {
84 | reject(err)
85 | }
86 | const config = getConfig()
87 | // 判断本地文件是否存在,不存在则删除该缓存
88 | const existFiles = ret.filter(e => fs.existsSync(path.resolve(`${config.outDir}/${e.projectName}`)))
89 | const deleteModularIds = ret.filter(e => !existFiles.some(c => c.modularId === e.modularId)).map(e => e.modularId)
90 | db.remove({
91 | modularId: {
92 | $in: deleteModularIds
93 | },
94 | cwd: process.cwd()
95 | })
96 | resolve(existFiles)
97 | })
98 | } catch (err) {
99 | reject(err)
100 | }
101 | })
102 | }
103 |
104 | /**
105 | * @description 移除缓存
106 | */
107 | export async function removeDBCache (): Promise {
108 | return new Promise(async (resolve, reject) => {
109 | const db = await getDBClient()
110 | db.remove({ cwd: process.cwd() }, {},
111 | (err, ret: number) => {
112 | if (err) {
113 | reject(err)
114 | }
115 | resolve(ret)
116 | })
117 | })
118 | }
119 |
--------------------------------------------------------------------------------
/src/utils/prettify.ts:
--------------------------------------------------------------------------------
1 | import { format as prettify } from 'prettier'
2 |
3 | // 格式化代码
4 | export function formatCode (code: string): string {
5 | return prettify(code, { parser: 'typescript' })
6 | }
7 |
--------------------------------------------------------------------------------
/src/utils/progress.ts:
--------------------------------------------------------------------------------
1 | // 这里用到一个很实用的 npm 模块,用在同一行打印文本
2 | import { stdout } from 'single-line-log'
3 | let taskList: IProgress[] = []
4 |
5 | interface IProgress {
6 | title: string;
7 | total: number;
8 | width: number;
9 | curr: number;
10 | }
11 |
12 | // 拼接输出文本
13 | function formatCmdText (data: IProgress) {
14 | const percent = parseFloat((data.curr / data.total).toFixed(4)) // 计算进度(子任务的 完成数 除以 总数)
15 | const cellNum = Math.floor(percent * data.width) // 计算需要多少个 █ 符号来拼凑图案
16 | // 拼接完成条
17 | let cell = ''
18 | for (let i = 0; i < cellNum; i++) {
19 | cell += '='
20 | }
21 | // 拼接未完成条
22 | let empty = ''
23 | for (let i = 0; i < data.width - cellNum; i++) {
24 | empty += '-'
25 | }
26 | // 拼接最终文本
27 | return `\x1B[33m${data.title}\x1B[0m: [${cell}${empty}] ${data.curr}/${data.total} ${(100 * percent).toFixed(2)}%\n`
28 | }
29 |
30 | export class Progress {
31 | private title: string;
32 | private total: number;
33 | private cb?: () => void;
34 | constructor (title: string, total: number, cb?: () => void) {
35 | taskList.push({
36 | title,
37 | total,
38 | curr: 0,
39 | width: 50
40 | })
41 | this.title = title
42 | this.total = total
43 | this.cb = cb
44 | this.push(0)
45 | }
46 |
47 | push (curr: number): void {
48 | const task = taskList.find(e => e.title === this.title)
49 | if (!task) return
50 | task.curr = curr
51 | const cmdText = taskList.map(e => formatCmdText(e)).join('')
52 | // 在单行输出文本
53 | stdout(cmdText)
54 | if (curr >= this.total) {
55 | this.cb && this.cb()
56 | }
57 | }
58 |
59 | clear (): void {
60 | taskList = taskList.filter(e => e.title !== this.title)
61 | // stdout('')
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/src/yapi/api.ts:
--------------------------------------------------------------------------------
1 | import { IApiDetailResult, IApiInfoResponse } from '../typing/yapi'
2 | import { http } from '../utils/http'
3 |
4 | // 获取api列表
5 | export async function getApiList (modularId: number): Promise {
6 | return new Promise((resolve) => {
7 | http.get('/api/interface/list_cat', {
8 | params: {
9 | page: 1,
10 | limit: 1000,
11 | catid: modularId
12 | }
13 | }).then(async apiReq => {
14 | const apiList: IApiInfoResponse[] = []
15 | for (const item of apiReq?.data?.data?.list ?? []) {
16 | const detail = await getApiDetail(item._id)
17 | apiList.push({
18 | id: item._id,
19 | title: item.title,
20 | path: item.path,
21 | method: item.method,
22 | detail: detail.detail,
23 | success: detail.success,
24 | message: detail.message
25 | })
26 | }
27 | resolve(apiList)
28 | }).catch(err => {
29 | throw new Error(`yapi拉取接口列表失败:${err.toString()}`)
30 | })
31 | })
32 | }
33 |
34 | // 获取api详情
35 | export async function getApiDetail (apiId: number): Promise {
36 | return new Promise((resolve) => {
37 | let success = true
38 | let message = ''
39 | http.get('/api/interface/get', {
40 | params: {
41 | id: apiId
42 | }
43 | }).then(async apiReq => {
44 | const apiDetail = apiReq.data.data
45 | let body
46 | let response
47 | // 解析Response
48 | try {
49 | response = apiDetail?.res_body ? JSON.parse(apiDetail.res_body) : undefined
50 | } catch (err) {
51 | response = undefined
52 | success = false
53 | message = `接口:${apiReq.data?.data?.path} Response解析失败`
54 | }
55 | // 解析Body
56 | try {
57 | body = apiDetail?.req_body_other ? JSON.parse(apiDetail.req_body_other) : undefined
58 | } catch (err) {
59 | response = undefined
60 | success = false
61 | message = `接口:${apiReq.data?.data?.path} Body解析失败`
62 | }
63 | const result: IApiDetailResult = {
64 | success: success,
65 | message: message,
66 | detail: {
67 | // 路径参数
68 | urlParams: apiDetail?.req_params?.map((e: any) => {
69 | return {
70 | desc: e.desc,
71 | name: e.name,
72 | type: 'string|number',
73 | required: true
74 | }
75 | }),
76 | // 请求参数
77 | query: apiDetail?.req_query?.map((e: any) => {
78 | return {
79 | name: e.name,
80 | type: 'string|number',
81 | desc: e.desc,
82 | required: e.required === '1'
83 | }
84 | }),
85 | // 请求体
86 | body: body,
87 | // 返回数据
88 | response: response,
89 | // 更新时间
90 | updateTime: apiDetail?.up_time ?? 0,
91 | // 接口名
92 | title: apiDetail?.title ?? '',
93 | // 接口路径
94 | url: apiDetail?.path ?? ''
95 | }
96 | }
97 | resolve(result)
98 | }).catch(err => {
99 | throw new Error(`yapi拉取接口详情失败:${err.toString()}`)
100 | })
101 | })
102 | }
103 |
--------------------------------------------------------------------------------
/src/yapi/diff.ts:
--------------------------------------------------------------------------------
1 | import { IDiffInterface, IDiffInterfaceItem } from '../typing/yapi'
2 | import { http } from '../utils/http'
3 |
4 | // 获取Diff需要的接口列表
5 | export async function getDiffInterfaceList (projectIds: number[]): Promise {
6 | return new Promise(async (resolve) => {
7 | let interfaces: IDiffInterface = new Map()
8 | for (const projectId of projectIds) {
9 | interfaces = new Map([...interfaces, ...await getDiffInterface(projectId)])
10 | }
11 | resolve(interfaces)
12 | })
13 | }
14 |
15 | // 获取diff的接口信息
16 | async function getDiffInterface (projectId: number): Promise {
17 | return new Promise((resolve) => {
18 | http.get('/api/interface/list_menu', {
19 | params: {
20 | project_id: projectId
21 | }
22 | }).then(res => {
23 | let result: IDiffInterface = new Map()
24 | result = res.data.data.reduce((pre: IDiffInterface, curr: any) => {
25 | if (!pre.has(curr._id)) {
26 | pre.set(curr._id, curr.list.map((e: any) => {
27 | const model: IDiffInterfaceItem = {
28 | id: e._id,
29 | upTime: e.up_time
30 | }
31 | return model
32 | }))
33 | }
34 | return pre
35 | }, result)
36 | resolve(result)
37 | }).catch(err => {
38 | throw new Error(`yapi拉取Diff接口列表失败:${err.toString()}`)
39 | })
40 | })
41 | }
42 |
--------------------------------------------------------------------------------
/src/yapi/group.ts:
--------------------------------------------------------------------------------
1 | import { IListItem } from '../typing/yapi'
2 | import { http } from '../utils/http'
3 | import inquirer, { QuestionCollection } from 'inquirer'
4 |
5 | // 获取分组列表
6 | export function getGroupList (): Promise {
7 | return new Promise((resolve) => {
8 | // 拉取分组列表
9 | http.get('/api/group/list').then(async (groupRes) => {
10 | // 抽取关键数据
11 | const groupList: IListItem[] = groupRes?.data?.data?.map((e: any) => {
12 | return {
13 | name: e.group_name,
14 | id: e._id
15 | }
16 | }) || []
17 | // 判断数据是否为空
18 | if (groupList.length === 0) {
19 | throw new Error('当前暂无分组列表')
20 | }
21 | resolve(groupList)
22 | }).catch(err => {
23 | throw new Error(`yapi拉取分组列表失败:${err.toString()}`)
24 | })
25 | })
26 | }
27 |
28 | // 获取分组ID
29 | export async function getGroupId (): Promise {
30 | return new Promise(async (resolve) => {
31 | const groupList = await getGroupList()
32 | // 选择分组
33 | const promptList: QuestionCollection = [{
34 | type: 'list',
35 | message: '请选择要生成的分组:',
36 | name: 'name',
37 | choices: groupList.map((e) => e.name),
38 | pageSize: 20
39 | }]
40 | const groupName = await inquirer.prompt(promptList)
41 | // 选择的分组ID
42 | const groupId = groupList.find((e) => e.name === groupName.name)?.id
43 | if (!groupId) {
44 | throw new Error('选择的分组不存在')
45 | }
46 | resolve(groupId)
47 | })
48 | }
49 |
--------------------------------------------------------------------------------
/src/yapi/login.ts:
--------------------------------------------------------------------------------
1 | import { clg } from '../utils/console'
2 | import { getConfig } from '../utils/config'
3 | import { http, setCookie } from '../utils/http'
4 |
5 | export async function Login (): Promise {
6 | const config = getConfig()
7 | return new Promise((resolve, reject) => {
8 | // 登录
9 | clg('yellow', '> yapi登录中...')
10 | // 请求yapi登录接口,获取cookie
11 | http.post('/api/user/login', {
12 | email: config.account,
13 | password: config.password
14 | }).then(res => {
15 | if (res.data.errcode === 0) {
16 | // 获取headers中的set-cookie
17 | let result = ''
18 | for (const item of res.headers['set-cookie']) {
19 | const cookieArr = item.split(';')
20 | result += `${cookieArr[0]};`
21 | }
22 | // 设置请求通用cookie
23 | setCookie(result)
24 | clg('yellow', '> yapi登录成功')
25 | resolve()
26 | } else {
27 | clg('yellow', '> yapi登录失败:', res.data.errmsg)
28 | reject('yapi登录失败: ' + res.data.errmsg)
29 | }
30 | }).catch(err => {
31 | reject(err)
32 | })
33 | })
34 | }
35 |
--------------------------------------------------------------------------------
/src/yapi/modular.ts:
--------------------------------------------------------------------------------
1 | import { IListItem, IModularLiatResponse, IModularResponse } from '../typing/yapi'
2 | import { http } from '../utils/http'
3 | import inquirer, { QuestionCollection } from 'inquirer'
4 |
5 | /**
6 | * @description 获取模块列表
7 | */
8 | export async function getModularList (projectId: number): Promise {
9 | return new Promise((resolve) => {
10 | // 拉取菜单列表
11 | http.get('/api/project/get', {
12 | params: {
13 | id: projectId
14 | }
15 | }).then(async modularReq => {
16 | // 抽取关键数据
17 | const modularList: IListItem[] = modularReq?.data?.data?.cat?.map((e: any) => {
18 | return {
19 | name: e.name,
20 | id: e._id
21 | }
22 | }) || []
23 | // 判断数据是否为空
24 | if (modularList.length === 0) {
25 | throw new Error('当前暂无模块列表')
26 | }
27 | resolve({
28 | modularList: modularList,
29 | basePath: modularReq?.data?.data?.basepath
30 | })
31 | }).catch(err => {
32 | throw new Error(`yapi拉取模块列表失败:${err.toString()}`)
33 | })
34 | })
35 | }
36 |
37 | // 获取菜单ID
38 | export async function getModular (projectId: number): Promise {
39 | return new Promise(async (resolve) => {
40 | const modularList = await getModularList(projectId)
41 | // 选择菜单
42 | const promptList: QuestionCollection = [{
43 | type: 'checkbox',
44 | message: '请选择要生成的模块:',
45 | name: 'modularNames',
46 | choices: modularList.modularList.map(e => e.name),
47 | pageSize: 20
48 | }]
49 | const { modularNames } = await inquirer.prompt(promptList)
50 | // 获取选择的模块
51 | const modulars = modularList.modularList.filter(e => modularNames.includes(e.name))
52 | if (modulars.length === 0) {
53 | throw new Error('选择的模块不存在')
54 | }
55 | const result: IModularResponse[] = []
56 | for (const item of modulars) {
57 | result.push({
58 | modularId: item.id,
59 | modularName: item.name,
60 | basePath: modularList.basePath
61 | })
62 | }
63 | resolve(result)
64 | })
65 | }
66 |
--------------------------------------------------------------------------------
/src/yapi/project.ts:
--------------------------------------------------------------------------------
1 | import { http } from '../utils/http'
2 | import inquirer, { QuestionCollection } from 'inquirer'
3 | import { zhCN2EN } from '../utils/name'
4 | import { IListItem, IProjectResponse } from '../typing/yapi'
5 | import { getConfig } from '../utils/config'
6 |
7 | /**
8 | * @description 获取项目列表
9 | */
10 | export async function getProjectList (groupId: number): Promise {
11 | return new Promise((resolve) => {
12 | // 拉取项目列表
13 | http.get('/api/project/list', {
14 | params: {
15 | group_id: groupId,
16 | page: 1,
17 | limit: 100
18 | }
19 | }).then(async projectReq => {
20 | // 抽取关键数据
21 | const projectList: IListItem[] = projectReq?.data?.data?.list?.map((e: any) => {
22 | return {
23 | name: e.name,
24 | id: e._id
25 | }
26 | }) || []
27 | // 判断数据是否为空
28 | if (projectList.length === 0) {
29 | throw new Error('当前暂无项目列表')
30 | }
31 | resolve(projectList)
32 | }).catch(err => {
33 | throw new Error(`yapi拉取项目列表失败:${err}`)
34 | })
35 | })
36 | }
37 |
38 | /**
39 | * @description 获取项目ID
40 | */
41 | export async function getProjectId (groupId: number): Promise {
42 | return new Promise(async (resolve) => {
43 | const projectList = await getProjectList(groupId)
44 | // 选择分组
45 | const promptList: QuestionCollection = [{
46 | type: 'list',
47 | message: '请选择要生成的项目:',
48 | name: 'name',
49 | choices: projectList.map(e => e.name),
50 | pageSize: 20
51 | }]
52 | const projectName = await inquirer.prompt(promptList)
53 | const project = projectList.find(e => e.name === projectName.name)
54 | // 选择的项目ID
55 | const projectId = project?.id
56 | if (!projectId) {
57 | throw new Error('选择的项目不存在')
58 | }
59 | if (Object.keys(getConfig().projectMapping).every(e => e.toString() !== projectId.toString())) {
60 | throw new Error(`项目ID: ${projectId} 未在projectMapping中配置映射关系`)
61 | }
62 | resolve({
63 | projectId: projectId,
64 | projectName: await zhCN2EN(projectName.name)
65 | })
66 | })
67 | }
68 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2018",
4 | "module": "CommonJS",
5 | "declaration": true,
6 | "outDir": "lib",
7 | "strict": true,
8 | "esModuleInterop": true,
9 | "pretty": true,
10 | "resolveJsonModule": true,
11 | "baseUrl": ".",
12 | "paths": {
13 | "@/*": ["src/*"]
14 | }
15 | },
16 | "include": ["src"],
17 | "awesomeTypescriptLoaderOptions": {
18 | // 加速编译
19 | "useBabel": true
20 | }
21 | }
22 |
--------------------------------------------------------------------------------