├── .gitignore ├── .npmignore ├── README.md ├── bin └── main.js ├── package-lock.json ├── package.json └── utils ├── format.js ├── formatV3.js ├── md.js ├── msg.js ├── request.js ├── version.js └── writeFs.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /node_modules/ 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | 7 | # Editor directories and files 8 | .idea 9 | .vscode 10 | *.suo 11 | *.ntvs* 12 | *.njsproj 13 | *.sln 14 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # swagger-ts-api 2 | 当前端web项目中应用了ts,我们不可能对成千上百的接口进行 `interface`的类型定义,那样效率是极低的,但是我们又需要ts智能友好的提示信息,该怎么办?这是我们必须要面对的问题。 3 | ## 介绍 4 | 根据`swagger.json`地址迅速生成ts接口,以及相关请求响应参的`interface`模块命令行工具。且支持swagger的V1、V2、V3版本。该插件的宗旨是利用swagger接口文档让前端的效率变得更高,接口的请求参、响应参以及接口命名将不在需要手动引入,让前端更聚焦在业务功能的开发,接口将全面与swagger进行同步。 5 | ## 使用方式 6 | 1.我们该插件推荐大家结合`git`和`npm`对生成的每个版本的ts请求文件进行版本管控,这样可以防止swagger变更带来的问题以便回退到旧的版本,因此你需要额外建立一个git用于存储本次生成的所有的api,一个npm发布管控npm包,项目组按照npm的版本进行拉去引入使用。 7 | 8 | ```mermaid 9 | graph LR 10 | A[api服务] -- 发布生成 --> B(swagger) 11 | B -- 调用该插件 --> C{命令} 12 | C -- -a命令添加-->D(生成ts请求文件与声明文件) 13 | C -- -u命令更新 -->E(更新ts请求文件与声明文件) 14 | D-->F(git) 15 | E-->F 16 | F-- 更新版本发布 -->G(npm) 17 | G--拉取npm包-->前端业务代码 18 | ``` 19 | 20 | 2.可以直接在项目中进行使用,这种方法稍微简单一点,缺点是一旦操作,代码将全部覆盖,不能回退,所以你要确保后端对接口文档没有进行调整,如命名、DTO命名、字段、类型等。所以不是特别推荐,但是简单,同样的你可以通过git历史来进行查找。 21 | 22 | ```mermaid 23 | graph LR 24 | A[api服务] -- 发布生成 --> B(swagger) 25 | B -- 调用该插件 --> C{命令} 26 | C -- -a命令添加-->D(生成ts请求文件与声明文件) 27 | C -- -u命令更新 -->E(更新ts请求文件与声明文件) 28 | D-->F(前端业务代码) 29 | E-->F 30 | ``` 31 | 32 | ## OSCS 33 | [![OSCS Status](https://www.oscs1024.com/platform/badge/ldc2726/swagger-ts.svg?size=large)](https://www.oscs1024.com/project/ldc2726/swagger-ts?ref=badge_large) 34 | 35 | ## 快速入门 36 | 37 | ### 1. 安装 38 | 39 | ``` 40 | # 全局安装 41 | npm install swagger-ts-api -g 42 | # 开发依赖安装 43 | npm install swagger-ts-api -D 44 | # 生产依赖安装 45 | npm install swagger-ts-api -S 46 | ``` 47 | 48 | ### 2. 跟随引导操作 49 | 50 | ##### 在自己目录中执行添加命令(发布npm和不发布npm的区别就在于 `nopublish` ): 51 | ``` 52 | swagger-ts -a #添加新的swagger api 并发布到npm,请确保自己的npm已经登陆 53 | 54 | swagger-ts -a nopublish #添加新的swagger api,通常用于仅添加本地不采用npm管理版本,这句命令你也直接可以放到项目中的`package.json`,然后直接执行对应的命令 55 | 56 | ``` 57 | 58 | ```javascript 59 | { 60 | "scripts": { 61 | "swagger:add": "swagger-ts -a nopublish", 62 | "swagger:update": "swagger-ts -u nopublish" 63 | } 64 | } 65 | ``` 66 | 67 | 68 | ``` 69 | # 效果: 70 | ? 请输入swagger.json的地址 :http://xxx/diap-bc/v1/swagger.json 71 | ? 请输入swagger apidoc的地址方便记录 :http://xxx/dv1/swagger.html 72 | ? 请输入生成api的名称 :test-api 73 | ⠼ 接口生成中,请稍后⋯⋯string 74 | ✔ swagger api同步完成! 75 | ``` 76 | 77 | 78 | 79 | ##### 在自己目录中执行更新命令: 80 | ``` 81 | swagger-ts -u #更新的swagger api并发布到npm,请确保自己的npm已经登陆 82 | swagger-ts -u nopublish #仅更新的swagger api,通常用于本地不采用npm管理版本 83 | swagger-ts -h #查看帮助 84 | ``` 85 | 86 | ``` 87 | # 效果: 88 | swagger-ts -u 89 | ? 请选择更新的api: test-api 90 | ✔ swagger api同步完成! 91 | ``` 92 | 93 | ##### 新增机器人通知服务(企业微信、飞书): 94 | ``` 95 | swagger-ts -s 96 | ``` 97 | ### 3. 如何使用生成的接口 98 | 生成的api会变成以下目录: 99 | ``` 100 | ├── test-api // 生成的api目录 101 | │ ├── swagger-api // 请求文件 102 | │ │ ├── index.ts 103 | │ ├── swagger-utils // 请求参数、响应参数的类型声明和接口定义 104 | │ │ ├── index.ts 105 | │ ├── main.ts // 入口文件,如果未发布npm可以直接导入该路径 106 | │ ├── package.json // 备用,控制 api 版本 107 | │ ├── .npmignore // npm包发布过滤项 108 | │ ├── README.md // api使用介绍 (这里是以发布npm为例的使用介绍) 109 | ``` 110 | 111 | 我们每个接口都有对应的注释说明,这样也就方便大家直接检索,严格按照swagger文档进行解析而来,需要注意的是`int64`和`int32`在前端js里面无法进行严格的区分,只有`number`类型,为避免`number`js长度限制所以我们这里会直接定义`number|string`类型.文件内容展示: 112 | 113 | ``` javascript 114 | // test-api/swagger-api/index.ts 115 | 116 | import * as types from './../swagger-utils/index' 117 | import { HttpRequest } from './../main' 118 | /** 119 | * 获取:地址编码[地址信息入参] 120 | */ 121 | export const mapGetGeo = (data: types.GetGeoDto) => { 122 | return HttpRequest().$post({ 123 | url: '/infra/v1/Map/GetGeo', 124 | data: data 125 | }) 126 | } 127 | ``` 128 | ``` javascript 129 | // test-api/swagger-utils/index.ts 130 | 131 | /** 132 | * 获取:地址编码[地址信息入参] 133 | */ 134 | export interface GetGeoDto { 135 | address?: string;// 地址:结构化地址信息 136 | province?: string;// 省份 137 | city?: string;// 城市名称 138 | } 139 | 140 | /** 141 | * 获取:地址编码[地址信息入参]Res 142 | */ 143 | export interface GeoAddressVo { 144 | name: string; 145 | streetNumber: string; 146 | level: string; 147 | precise: boolean; 148 | confidence: integer; 149 | tenantId?: number|string;// 租户id 150 | } 151 | 152 | ``` 153 | ### 4. 如何使用生成的接口 154 | 生成后项目中,以xxx-api为例,项目内部有一个`README.md `文件,可以按步骤操作或者点击[使用说明](https://github.com/ldc2726/swagger-api-template) 155 | 156 | ### 注意: 157 | 1. 这里不建议大家添加swagger接口直接生成到开发项目中去,更建议大家结合`npm私服`的版本管理方式,否则每次更新将全部替换代码,让我们的前端代码变得不可控。 158 | 2. 要求swagger文档字段定义清晰,不规范的文档将会有很多不可控的因素。 159 | 3. 项目中接口方法命名,请求参原则上是以`operationId`和 `DTO`进行命名,如果没有,插件将会以`path路径`后两位进行命名,如: 160 | `/api/v1/abccodereport/getgoodnames` => `abccodereportGetgoodnames` 161 | 162 | 163 | 如果您在使用中遇到什么问题,请及时提出`issues`,我们将在第一时间进行查找修正。 164 | 165 | ⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️开源不易,麻烦大家点个star,谢谢⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️ 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /bin/main.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const { default: axios } = require('axios'); 4 | const program = require("commander"); 5 | const inquirer = require("inquirer"); 6 | const download = require("download-git-repo"); 7 | const ora = require("ora"); 8 | var exec = require('child_process').exec; 9 | const chalk = require("chalk"); 10 | const { FormatJsonDom, filterAttribute, formatRequestData, formatRefName, formatInt64, rename, formatGlobalName } = require('../utils/format') 11 | const { typeData, requestType } = require('../utils/request') 12 | const { initDom, InitHttpDom, WriteFile, mkdirs, apiInitDom, defineInitDom } = require('../utils/writeFs') 13 | const { formatV3, findValue } = require('../utils/formatV3') 14 | const { versionUpdate, compareVersions } = require('../utils/version') 15 | const { readFile } = require("./../utils/writeFs") 16 | const { qywxMsg, fsMsg } = require("./../utils/msg") 17 | const packageJson = require('./../package.json') 18 | var fs = require('fs'); 19 | const loading = ora("接口生成中,请稍后⋯⋯"); 20 | let newVsion = '1.0.0' 21 | // let gitUrl = "github:ldc2726/swagger-api-template" 22 | let gitUrl = "https://gitcode.net:qq_40513881/swagger-api-template" 23 | const activeName = [] 24 | let isV3 = false 25 | program.version(packageJson.version) 26 | program.option("-i, --init [name]", "init a project", "myapp"); 27 | program.option('-a, --add', 'add swagger api').on("option:add", function () { 28 | const questions = [ 29 | { 30 | type: "input", 31 | name: "url", 32 | message: "请输入swagger.json的地址", 33 | default: '', 34 | filter: value => value.trim(), 35 | validate: value => { 36 | const validate = value.trim().split(" ").length === 1 && value.trim().indexOf('http') != -1; 37 | return validate || "不合法,请输入正确的http/https swagger.json 地址"; 38 | }, 39 | transformer: value => `:${value}` 40 | }, 41 | { 42 | type: "input", 43 | name: "version", 44 | message: "请输入swagger的版本", 45 | default: '3.0.0', 46 | filter: value => value.trim(), 47 | validate: value => { 48 | const validate = value.trim().indexOf('.') != -1; 49 | return validate || "不合法,请输入正确的版本"; 50 | }, 51 | transformer: value => `:${value}` 52 | }, 53 | { 54 | type: "input", 55 | name: "swagger", 56 | message: "请输入swagger apidoc的地址方便记录", 57 | default: '', 58 | filter: value => value.trim(), 59 | validate: value => { 60 | const validate = value.trim().split(" ").length === 1 && value.trim().indexOf('http') != -1; 61 | return validate || "不合法,请输入正确的http/https地址"; 62 | }, 63 | transformer: value => `:${value}` 64 | }, 65 | { 66 | type: "input", 67 | name: "apiName", 68 | message: "请输入生成api的名称", 69 | default: '', 70 | filter: value => value.trim(), 71 | validate: value => { 72 | const validate = value.trim().split(" ").length === 1 73 | return validate || "不合法,请输入正确的api的名称"; 74 | }, 75 | transformer: value => `:${value}` 76 | }, 77 | { 78 | type: "input", 79 | name: "urlPrefix", 80 | message: "请输入swaggere额外api的统一前缀(可选)", 81 | default: '', 82 | transformer: value => `:${value}` 83 | } 84 | ]; 85 | inquirer.prompt(questions).then(({ url, version, swagger, apiName, urlPrefix }) => { 86 | loading.start(); 87 | loading.info("模板下载中") 88 | download(gitUrl, `./${apiName}`, { clone: true }, function (err) { 89 | if (err) { 90 | loading.fail("下载失败!"); 91 | console.log(chalk.red(err)); 92 | process.exit(); 93 | } else { 94 | loading.info("模板下载完成,请求swagger.json") 95 | fs.readFile(`./${apiName}/package.json`, "utf8", (err, data) => { 96 | if (err) { 97 | console.log(chalk.red(err)); 98 | process.exit(); 99 | } 100 | loading.info("swagger.json请求完毕,开始生成代码") 101 | const packageJson = JSON.parse(data); 102 | packageJson.name = apiName; 103 | packageJson.swaggerpath = url 104 | packageJson.swaggerversion = version 105 | packageJson.urlPrefix = urlPrefix 106 | packageString = JSON.stringify(packageJson, null, 2); 107 | fs.writeFile(`./${apiName}/package.json`, packageString, "utf8", err => { 108 | if (err) { 109 | console.log(chalk.red(err)); 110 | process.exit(); 111 | } 112 | getSwaggerJson({ url, apiName, version, urlPrefix }) 113 | }) 114 | 115 | }) 116 | 117 | const contentReadme = 118 | ` 119 | # ${apiName} 120 | api地址:[swagger-doc](${swagger})\n 121 | ` 122 | fs.readFile(`./${apiName}/README.md`, "utf8", (err, data) => { 123 | if (err) { 124 | console.log(chalk.red(err)); 125 | process.exit(); 126 | } 127 | data = data.replace(/xxx/g, apiName) 128 | WriteFile(`./${apiName}/README.md`, contentReadme + data) 129 | }) 130 | } 131 | }) 132 | }) 133 | }) 134 | program.option('-u, --update', 'update api and publish npm').on("option:update", function () { 135 | fs.readdir('./', 'utf-8', async function (err, res) { 136 | if (err) { 137 | console.log(err) 138 | return; 139 | } 140 | const list = res.filter((val) => val.indexOf('.') == -1 && val != 'bin' && val != 'utils' && val != 'node_modules') 141 | const promptList = [{ 142 | type: 'list', 143 | message: '请选择更新的api:', 144 | name: 'apiname', 145 | choices: list, 146 | filter: function (val) { 147 | return val 148 | } 149 | }]; 150 | inquirer.prompt(promptList).then(({ apiname }) => { 151 | if (apiname.includes('@')) { 152 | fs.readdir(`./${apiname}`, 'utf-8', async function (err, res) { 153 | if (err) { 154 | console.log(err) 155 | return; 156 | } 157 | const promptLists = [{ 158 | type: 'list', 159 | message: '请选择更新的api:', 160 | name: 'apinames', 161 | choices: res, 162 | filter: function (val) { 163 | return val 164 | } 165 | }]; 166 | inquirer.prompt(promptLists).then(({ apinames }) => { 167 | versionUpdate(`./${apiname}/${apinames}`, getSwaggerJson) 168 | }) 169 | }) 170 | return; 171 | } 172 | versionUpdate(apiname, getSwaggerJson) 173 | }) 174 | 175 | }) 176 | }) 177 | program.option('-s, --set', 'set global config').on("option:set", function () { 178 | const list = [ 179 | "qywx", 180 | "feishu" 181 | ] 182 | const promptList = [{ 183 | type: 'list', 184 | message: '请选择通知服务:', 185 | name: 'msgName', 186 | choices: list, 187 | filter: function (val) { 188 | return val 189 | } 190 | }, { 191 | type: "input", 192 | name: "hook", 193 | message: "请输入hook的地址", 194 | default: '', 195 | filter: value => value.trim(), 196 | validate: value => { 197 | const validate = value.trim().split(" ").length === 1 && value.trim().indexOf('http') != -1; 198 | return validate || "不合法,请输入正确的hook的地址"; 199 | }, 200 | transformer: value => `:${value}` 201 | }, 202 | { 203 | type: "input", 204 | name: "npmOrg", 205 | message: "请输入npm镜像源仓库地址(默认npm)", 206 | default: 'https://www.npmjs.com/package/', 207 | filter: value => value.trim(), 208 | transformer: value => `:${value}` 209 | }, 210 | ] 211 | const feishuList = [ 212 | { 213 | type: "input", 214 | name: "token", 215 | message: "请输入token", 216 | default: '', 217 | filter: value => value.trim(), 218 | transformer: value => `:${value}` 219 | }, { 220 | type: "input", 221 | name: "email", 222 | message: "请输入飞书email地址", 223 | default: '', 224 | filter: value => value.trim(), 225 | transformer: value => `:${value}` 226 | } 227 | ] 228 | inquirer.prompt(promptList).then(({ msgName, npmOrg, hook }) => { 229 | if (msgName == "feishu") { 230 | inquirer.prompt(feishuList).then(({ token, email }) => { 231 | const packageJson = { 232 | "type": msgName, 233 | "hook": hook, 234 | "token": token, 235 | "npmOrg": npmOrg, 236 | "email": email 237 | } 238 | packageString = JSON.stringify(packageJson, null, 2); 239 | fs.writeFile(`./config.json`, packageString, "utf8", err => { 240 | if (err) { 241 | console.log(chalk.red(err)); 242 | process.exit(); 243 | } 244 | }) 245 | }) 246 | } 247 | if (msgName == "qywx") { 248 | const packageJson = { 249 | "type": msgName, 250 | "npmOrg": npmOrg, 251 | "hook": hook, 252 | } 253 | const packageString = JSON.stringify(packageJson, null, 2); 254 | fs.writeFile(`./config.json`, packageString, "utf8", err => { 255 | if (err) { 256 | console.log(chalk.red(err)); 257 | process.exit(); 258 | } 259 | }) 260 | } 261 | }) 262 | }) 263 | program.parse(process.argv); 264 | 265 | program.on("--help", function () { 266 | console.log(" Examples:"); 267 | console.log("-a :添加一个新的swagger接口地址并发布"); 268 | console.log("-a nopublish :添加一个新的swagger接口地址但不发布npm"); 269 | console.log("-u :更新swagger地址并发布至npm"); 270 | console.log("-u nopublish :仅更新swagger地址不发布"); 271 | console.log("-s :配置通知服务"); 272 | console.log(""); 273 | }); 274 | 275 | // 执行请求 276 | async function getSwaggerJson({ url, apiName, version, npmNewVersion, urlPrefix }) { 277 | axios.defaults.headers.common['Accept'] = 'application/json,*/*' 278 | axios.defaults.headers.common['Accept-Encoding'] = 'gzip, deflate' 279 | axios.defaults.headers.common['Accept-Language'] = 'zh-CN,zh;q=0.9,en;q=0.8' 280 | let res; 281 | try { 282 | res = await axios.get(url) 283 | } catch (error) { 284 | console.log(error) 285 | loading.fail("网络异常,接口请求失败!"); 286 | } 287 | 288 | const config = { 289 | name: apiName + '/swagger-utils/', 290 | apiName: apiName + '/swagger-api/', 291 | typeDom: "", 292 | apiDom: "" 293 | } 294 | await mkdirs(apiName + '/swagger-utils') 295 | await mkdirs(apiName + '/swagger-api') 296 | if (compareVersions(version) >= 0) { 297 | res = formatV3(res) 298 | isV3 = true 299 | } 300 | 301 | const resData = res.data 302 | const pathList = res.data.paths; 303 | 304 | for (const key in pathList) { 305 | if (Object.hasOwnProperty.call(pathList, key)) { 306 | const element = typeData(pathList[key]) 307 | QueryOneTree(resData, element, config, key) 308 | const data2 = { 309 | resData: resData, 310 | element: element, 311 | key: urlPrefix + key, 312 | requestTypes: requestType(pathList[key]), 313 | swaggerItem: config 314 | } 315 | ResOneTree(data2) 316 | } 317 | } 318 | // 写入文件 319 | WriteFile(`./${config.name}index.ts`, `type integer = number\ntype array = any[]\n` + config.typeDom) 320 | WriteFile(`./${config.apiName}index.ts`, apiInitDom('index') + config.apiDom) 321 | loading.succeed("swagger api同步完成!"); 322 | if (!process.argv.includes('nopublish')) { 323 | loading.info(`cd ${apiName} && npm publish`); 324 | exec(`cd ${apiName} && npm publish`, function (error, stdout, stderr) { 325 | if (error) { 326 | loading.fail("发布失败!"); 327 | console.error(error); 328 | } 329 | else { 330 | if (npmNewVersion) { 331 | newVsion = npmNewVersion 332 | } 333 | readFile('./config.json').then(res => { 334 | const config = JSON.parse(res) 335 | if (config.type == "qywx") { 336 | qywxMsg(apiName.replace('./', ''), newVsion, config.npmOrg) 337 | } 338 | if (config.type == "feishu") { 339 | fsMsg(apiName.replace('./', ''), newVsion, config.npmOrg, config.token, config.email) 340 | } 341 | 342 | }) 343 | // qywxMsg(`${apiname}/${fsname}`, ) 344 | loading.succeed(apiName + ",发布成功!版本:" + newVsion); 345 | } 346 | }); 347 | } 348 | } 349 | 350 | 351 | /** 352 | * ResOneTree 响应参数 353 | * @param {*} resData 354 | * @param {*} element 355 | * @param {*} key 356 | * @param {*} requestTypes 请求类型 357 | * @param {*} swaggerItem swaggerItem 358 | */ 359 | function ResOneTree(datas) { 360 | const { resData, element, key, requestTypes, swaggerItem } = datas 361 | if (isV3) { 362 | ResV3Tree(datas) 363 | return 364 | } 365 | if (!findValue(element['responses'], 'properties')) { 366 | ResTree('', resData, element, key, requestTypes, swaggerItem) 367 | return; 368 | } 369 | const pathQueryData = findValue(element['responses'], '$ref') 370 | if (pathQueryData) { 371 | const itemData = FormatJsonDom(resData, pathQueryData) // 根据ref快速定位到JSON 372 | try { 373 | ResTree(itemData, resData, element, key, requestTypes, swaggerItem) 374 | } catch (error) { 375 | console.log(error, '该路径解析错误path:', key) 376 | } 377 | } 378 | } 379 | 380 | /** 381 | * ResLoopTree 返回参数处理 382 | * @param {*} itemData ref对应的json 383 | * @param {*} resData swagger全部的数据 384 | * @param {*} element 当前这一条path数据 385 | * @param {*} key 当前这一条接口URL 386 | */ 387 | function ResTree(itemData, resData, element, key, requestTypes, swaggerItem) { 388 | let result, properties; 389 | if (!itemData) { 390 | result = 'any' 391 | } else { 392 | properties = itemData['properties'] 393 | result = properties.result || properties.data || 'any' 394 | } 395 | let name = rename(element, key) 396 | const RequestData = formatRequestData(element, name) 397 | if (result && result.$ref) { 398 | const resOneData = FormatJsonDom(resData, result.$ref) 399 | ResLoopTree(resData, resOneData, element, swaggerItem) 400 | let httpreauestDom = InitHttpDom(name, RequestData ? RequestData : '', 'types.' + formatGlobalName(resOneData['title']), key, element.summary, requestTypes) 401 | swaggerItem.apiDom = swaggerItem.apiDom + httpreauestDom + '\n' 402 | } else { 403 | if (result.type == "array" && result.items.$ref) { 404 | const resOneData = FormatJsonDom(resData, result.items.$ref) 405 | ResLoopTree(resData, resOneData, element, swaggerItem) 406 | } 407 | let httpreauestDom = InitHttpDom(name, 408 | RequestData ? RequestData : '', 409 | result == 'any' ? 'any' : 410 | (result.type == 'array' ? 411 | result.items.type || 412 | 'types.' + formatRefName(result) + '[]' : result.type || 'any'), 413 | key, 414 | element.summary, 415 | requestTypes) 416 | swaggerItem.apiDom = swaggerItem.apiDom + httpreauestDom + '\n' 417 | } 418 | } 419 | function ResLoopTree(resData, properties, element, swaggerItem) { 420 | try { 421 | if (!properties['properties']) { 422 | // 如果递归到最后一层,没有子属性且本身就是一个类型的话,并且没有定义过该名称 423 | const titleDto = formatGlobalName(properties.title) 424 | if (properties.type && !activeName.includes(titleDto)) { 425 | swaggerItem.typeDom = swaggerItem.typeDom + `export type ${titleDto} = ${properties.type} \n` 426 | activeName.push(titleDto) 427 | } 428 | return; 429 | } 430 | const propertiesLength = Object.keys(properties['properties']).length; 431 | let nums = 0; 432 | let InitDom = initDom(properties.title, element ? element.summary + 'Res' : properties.title + 'Res') 433 | for (const i in properties['properties']) { 434 | nums++ 435 | if (Object.hasOwnProperty.call(properties['properties'], i)) { 436 | const item = properties['properties'][i]; 437 | if ((item.items && item.items.$ref) || item.$ref) { 438 | let nameRef = item.$ref ? item.$ref : item.items.$ref, name; 439 | name = nameRef.split('/'); 440 | name = name[name.length - 1] 441 | InitDom = InitDom.replace('##', `\n ${i}: ${formatInt64(item, true)};// ${item.description}##`) 442 | if (propertiesLength == nums) { 443 | InitDom = InitDom.replace('##', '') 444 | } 445 | if (properties.title != name) { 446 | const propertiesItem = FormatJsonDom(resData, nameRef) 447 | ResLoopTree(resData, propertiesItem, '', swaggerItem) 448 | } 449 | } else { 450 | InitDom = InitDom.replace('##', `\n ${i}: ${formatInt64(item, true)};// ${item.description}##`) 451 | if (propertiesLength == nums) { 452 | InitDom = InitDom.replace('##', '') 453 | } 454 | } 455 | } 456 | } 457 | if (activeName.includes(properties.title)) { 458 | return; 459 | } 460 | activeName.push(properties.title) 461 | swaggerItem.typeDom = swaggerItem.typeDom + InitDom + '\n' 462 | } catch (error) { 463 | console.log('错误的文件结构,请检查swagger该项:', element) 464 | } 465 | 466 | } 467 | function ResV3Tree(datas) {//初始化接口和类型定义 468 | const { resData, element, key, requestTypes, swaggerItem } = datas 469 | let name = rename(element, key) 470 | const docs = findValue(element, 'summary') || findValue(element, 'operationId') 471 | const properties = findValue(element['responses'], 'properties') 472 | 473 | if (properties) { 474 | ResLoopV3Tree(name + 'Res', docs, properties['data'], resData, swaggerItem) 475 | } 476 | const RequestData = formatRequestData(element, name) 477 | let typeName = ''; 478 | try { 479 | const proDatas = properties['data'] 480 | if (proDatas) { 481 | if(proDatas.type=='array'){ 482 | if(proDatas.items){ 483 | typeName = `types.${name}Res[]` 484 | } else { 485 | typeName = `any[]` 486 | } 487 | }else { 488 | if (proDatas['$ref']) { 489 | typeName = `types.${name}Res` 490 | } else { 491 | typeName = 'any' 492 | } 493 | } 494 | } else { 495 | typeName = 'any' 496 | } 497 | } catch (error) { 498 | typeName = 'any' 499 | } 500 | let httpreauestDom = InitHttpDom( 501 | name, 502 | RequestData ? RequestData : '', 503 | typeName, 504 | key, 505 | element.summary, 506 | requestTypes 507 | ) 508 | swaggerItem.apiDom = swaggerItem.apiDom + httpreauestDom + '\n' 509 | } 510 | function ResLoopV3Tree(name, docs, items, resData, swaggerItem) {// 循环写入属性类型 511 | if (activeName.includes(name)) { 512 | return; 513 | } 514 | if (items == 'undefined' || items == undefined) { 515 | return; 516 | } 517 | if (findValue(items, '$ref')) { 518 | const data = FormatJsonDom(resData, findValue(items, '$ref')) 519 | try { 520 | activeName.push(name) 521 | let nums = 0; 522 | let InitDom = initDom(name, docs) 523 | Object.keys(data['properties']).map(item => { 524 | nums++ 525 | const types = formatInt64(data['properties'][item], true) 526 | if (findValue(data['properties'][item], '$ref')) { 527 | InitDom = InitDom.replace('##', `\n ${item}: ${types};// ${item.description?.replace(/\n/g, '')}##`) 528 | ResLoopV3Tree(types, types, data['properties'][item], resData, swaggerItem) 529 | } else { 530 | InitDom = InitDom.replace('##', `\n ${item}: ${types};// ${item.description?.replace(/\n/g, '')}##`) 531 | } 532 | if (Object.keys(data['properties']).length == nums) { 533 | InitDom = InitDom.replace('##', '') 534 | swaggerItem.typeDom = swaggerItem.typeDom + InitDom + '\n' 535 | } 536 | }) 537 | } catch (error) { 538 | if (data && name && data.type) { 539 | swaggerItem.typeDom = swaggerItem.typeDom + defineInitDom(name, data.type) + '\n' 540 | } 541 | } 542 | } 543 | } 544 | 545 | /** 546 | * QueryOneTree 547 | * @param {*} resData 548 | * @param {*} element 549 | */ 550 | function QueryOneTree(resData, element, swaggerItem, key) { 551 | const pathQueryData = element['parameters']; 552 | if (pathQueryData) { 553 | const newArr2 = pathQueryData.filter((value) => { 554 | return value.in == "body" 555 | }) 556 | const newArr = pathQueryData.filter((value) => { 557 | return value.in == "query" 558 | }) 559 | // body 类型一定存在的 无参数除外 560 | if (newArr2.length != 0) { 561 | newArr2.map((item, i) => { 562 | LoopTree(item, resData, element, swaggerItem) 563 | }) 564 | } 565 | // 如果是其他版本含有query参数的 566 | if (newArr.length != 0) { 567 | let initDomArr2; 568 | let name = rename(element, key) 569 | initDomArr2 = initDom(name, name) 570 | newArr.map((item, i) => { 571 | const type = item.type || item.schema.type 572 | const format = item.format || item.schema?.format 573 | const $ref = item.$ref || item.schema?.$ref 574 | initDomArr2 = initDomArr2.replace('##', `\n ${item.name}?: ${type ? (format == "int64" ? "number|string" : type) : formatGlobalName(item.name)};// ${item.description?.replace(/\n/g, '')}##`) 575 | if (newArr.length == i + 1) { 576 | initDomArr2 = initDomArr2.replace('##', '') 577 | } 578 | if ($ref) { 579 | LoopTree(item, resData, element, swaggerItem) 580 | } 581 | }) 582 | if (activeName.includes(name)) { 583 | return; 584 | } 585 | activeName.push(name) 586 | swaggerItem.typeDom = swaggerItem.typeDom + initDomArr2 + '\n' 587 | } 588 | } else { 589 | // console.log('格式解析可能缺失') 590 | } 591 | 592 | } 593 | 594 | /**ss 595 | * 递归tree 596 | * @param {*} itemData 携带body的单条数据 597 | * @param {*} resData 全部的json数据,用来匹配 598 | * @param {*} element 当前这条数据,含path等 599 | */ 600 | function LoopTree(itemData, resData, element, swaggerItem, type = false) { 601 | try { 602 | let initDomArr2; 603 | let names = itemData.schema || itemData.items || itemData 604 | let name2 = names?.$ref || names?.items?.$ref || null 605 | if (!name2) { 606 | return; 607 | } 608 | let name = name2?.split('/') 609 | name = name[name.length - 1] 610 | const childAllData = FormatJsonDom(resData, name2); 611 | const propertiesData = childAllData['properties']; 612 | if (!propertiesData) { 613 | const titleDto = formatGlobalName(childAllData.title) 614 | if (childAllData.type && !activeName.includes(titleDto)) { 615 | swaggerItem.typeDom = swaggerItem.typeDom + `export type ${titleDto} = ${childAllData.type} \n` 616 | activeName.push(titleDto) 617 | } 618 | return; 619 | } 620 | name = formatGlobalName(name) 621 | if (childAllData.type == "integer" || childAllData.type == "string") { 622 | initDomArr2 = defineInitDom(name, childAllData.format == "int64" ? "number|string" : childAllData.type) 623 | } else { 624 | if (!type) { 625 | initDomArr2 = initDom(name, element?.summary || itemData.summary || itemData.description || name) 626 | } 627 | const numsetup = Object.keys(propertiesData).length 628 | let nums = 0 629 | for (const i in propertiesData) { 630 | if (Object.hasOwnProperty.call(propertiesData, i)) { 631 | const items = propertiesData[i]; 632 | nums++ 633 | // 如果还有继续递归 ts类型为 DTO[] 634 | if (items.$ref || (items.items && items.items.$ref)) { 635 | let urlname = items.$ref || items.items.$ref 636 | urlname = urlname.split('/') 637 | initDomArr2 = initDomArr2.replace('##', `\n ${i}?: ${formatGlobalName(urlname[urlname.length - 1])}${items.type == 'array' ? '[]' : ''};// ${(items.description || filterAttribute(i, element['parameters'])?.description)?.replace(/\n/g, '')}##`) 638 | if (numsetup == nums) { 639 | initDomArr2 = initDomArr2.replace('##', '') 640 | } 641 | LoopTree(items, resData, element, swaggerItem, type) 642 | } else { 643 | // 持续写入 644 | initDomArr2 = initDomArr2.replace('##', `\n ${i}?: ${formatInt64(items)};// ${(items.description || filterAttribute(i, element['parameters'])?.description)?.replace(/\n/g, '')}## `) 645 | if (numsetup == nums) { 646 | initDomArr2 = initDomArr2.replace('##', '') 647 | } 648 | } 649 | } 650 | } 651 | } 652 | if (activeName.includes(name)) { 653 | return; 654 | } 655 | activeName.push(name) 656 | swaggerItem.typeDom = swaggerItem.typeDom + initDomArr2 + '\n' 657 | } catch (error) { 658 | console.log('该项结构混乱', error) 659 | } 660 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "swagger-ts-api", 3 | "version": "1.2.7", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sindresorhus/is": { 8 | "version": "0.7.0", 9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", 10 | "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" 11 | }, 12 | "accepts": { 13 | "version": "1.3.8", 14 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 15 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 16 | "requires": { 17 | "mime-types": "~2.1.34", 18 | "negotiator": "0.6.3" 19 | } 20 | }, 21 | "ansi-escapes": { 22 | "version": "4.3.2", 23 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 24 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 25 | "requires": { 26 | "type-fest": "^0.21.3" 27 | } 28 | }, 29 | "ansi-regex": { 30 | "version": "5.0.1", 31 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 32 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 33 | }, 34 | "ansi-styles": { 35 | "version": "4.3.0", 36 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 37 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 38 | "requires": { 39 | "color-convert": "^2.0.1" 40 | } 41 | }, 42 | "archive-type": { 43 | "version": "4.0.0", 44 | "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", 45 | "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", 46 | "requires": { 47 | "file-type": "^4.2.0" 48 | }, 49 | "dependencies": { 50 | "file-type": { 51 | "version": "4.4.0", 52 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", 53 | "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==" 54 | } 55 | } 56 | }, 57 | "array-flatten": { 58 | "version": "1.1.1", 59 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 60 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 61 | }, 62 | "axios": { 63 | "version": "0.26.1", 64 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 65 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 66 | "requires": { 67 | "follow-redirects": "^1.14.8" 68 | } 69 | }, 70 | "balanced-match": { 71 | "version": "1.0.2", 72 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 73 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 74 | }, 75 | "base64-js": { 76 | "version": "1.5.1", 77 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 78 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 79 | }, 80 | "bl": { 81 | "version": "1.2.3", 82 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 83 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 84 | "requires": { 85 | "readable-stream": "^2.3.5", 86 | "safe-buffer": "^5.1.1" 87 | } 88 | }, 89 | "body-parser": { 90 | "version": "1.20.0", 91 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 92 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 93 | "requires": { 94 | "bytes": "3.1.2", 95 | "content-type": "~1.0.4", 96 | "debug": "2.6.9", 97 | "depd": "2.0.0", 98 | "destroy": "1.2.0", 99 | "http-errors": "2.0.0", 100 | "iconv-lite": "0.4.24", 101 | "on-finished": "2.4.1", 102 | "qs": "6.10.3", 103 | "raw-body": "2.5.1", 104 | "type-is": "~1.6.18", 105 | "unpipe": "1.0.0" 106 | } 107 | }, 108 | "brace-expansion": { 109 | "version": "1.1.11", 110 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 111 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 112 | "requires": { 113 | "balanced-match": "^1.0.0", 114 | "concat-map": "0.0.1" 115 | } 116 | }, 117 | "buffer": { 118 | "version": "5.7.1", 119 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 120 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 121 | "requires": { 122 | "base64-js": "^1.3.1", 123 | "ieee754": "^1.1.13" 124 | } 125 | }, 126 | "buffer-alloc": { 127 | "version": "1.2.0", 128 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 129 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 130 | "requires": { 131 | "buffer-alloc-unsafe": "^1.1.0", 132 | "buffer-fill": "^1.0.0" 133 | } 134 | }, 135 | "buffer-alloc-unsafe": { 136 | "version": "1.1.0", 137 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 138 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 139 | }, 140 | "buffer-crc32": { 141 | "version": "0.2.13", 142 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 143 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" 144 | }, 145 | "buffer-fill": { 146 | "version": "1.0.0", 147 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 148 | "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" 149 | }, 150 | "bytes": { 151 | "version": "3.1.2", 152 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 153 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 154 | }, 155 | "cacheable-request": { 156 | "version": "2.1.4", 157 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", 158 | "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", 159 | "requires": { 160 | "clone-response": "1.0.2", 161 | "get-stream": "3.0.0", 162 | "http-cache-semantics": "3.8.1", 163 | "keyv": "3.0.0", 164 | "lowercase-keys": "1.0.0", 165 | "normalize-url": "2.0.1", 166 | "responselike": "1.0.2" 167 | }, 168 | "dependencies": { 169 | "lowercase-keys": { 170 | "version": "1.0.0", 171 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", 172 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" 173 | } 174 | } 175 | }, 176 | "call-bind": { 177 | "version": "1.0.2", 178 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 179 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 180 | "requires": { 181 | "function-bind": "^1.1.1", 182 | "get-intrinsic": "^1.0.2" 183 | } 184 | }, 185 | "caw": { 186 | "version": "2.0.1", 187 | "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", 188 | "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", 189 | "requires": { 190 | "get-proxy": "^2.0.0", 191 | "isurl": "^1.0.0-alpha5", 192 | "tunnel-agent": "^0.6.0", 193 | "url-to-options": "^1.0.1" 194 | } 195 | }, 196 | "chalk": { 197 | "version": "4.1.2", 198 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 199 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 200 | "requires": { 201 | "ansi-styles": "^4.1.0", 202 | "supports-color": "^7.1.0" 203 | } 204 | }, 205 | "chardet": { 206 | "version": "0.7.0", 207 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 208 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 209 | }, 210 | "child_process": { 211 | "version": "1.0.2", 212 | "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", 213 | "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" 214 | }, 215 | "cli-cursor": { 216 | "version": "3.1.0", 217 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 218 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 219 | "requires": { 220 | "restore-cursor": "^3.1.0" 221 | } 222 | }, 223 | "cli-spinners": { 224 | "version": "2.6.1", 225 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", 226 | "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" 227 | }, 228 | "cli-width": { 229 | "version": "3.0.0", 230 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 231 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" 232 | }, 233 | "clone": { 234 | "version": "1.0.4", 235 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 236 | "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" 237 | }, 238 | "clone-response": { 239 | "version": "1.0.2", 240 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 241 | "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", 242 | "requires": { 243 | "mimic-response": "^1.0.0" 244 | } 245 | }, 246 | "color-convert": { 247 | "version": "2.0.1", 248 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 249 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 250 | "requires": { 251 | "color-name": "~1.1.4" 252 | } 253 | }, 254 | "color-name": { 255 | "version": "1.1.4", 256 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 257 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 258 | }, 259 | "commander": { 260 | "version": "9.3.0", 261 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", 262 | "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==" 263 | }, 264 | "concat-map": { 265 | "version": "0.0.1", 266 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 267 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 268 | }, 269 | "config-chain": { 270 | "version": "1.1.13", 271 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", 272 | "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", 273 | "requires": { 274 | "ini": "^1.3.4", 275 | "proto-list": "~1.2.1" 276 | } 277 | }, 278 | "content-disposition": { 279 | "version": "0.5.4", 280 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 281 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 282 | "requires": { 283 | "safe-buffer": "5.2.1" 284 | } 285 | }, 286 | "content-type": { 287 | "version": "1.0.4", 288 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 289 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 290 | }, 291 | "cookie": { 292 | "version": "0.5.0", 293 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 294 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 295 | }, 296 | "cookie-signature": { 297 | "version": "1.0.6", 298 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 299 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 300 | }, 301 | "core-util-is": { 302 | "version": "1.0.3", 303 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 304 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 305 | }, 306 | "debug": { 307 | "version": "2.6.9", 308 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 309 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 310 | "requires": { 311 | "ms": "2.0.0" 312 | } 313 | }, 314 | "decode-uri-component": { 315 | "version": "0.2.0", 316 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 317 | "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" 318 | }, 319 | "decompress": { 320 | "version": "4.2.1", 321 | "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", 322 | "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", 323 | "requires": { 324 | "decompress-tar": "^4.0.0", 325 | "decompress-tarbz2": "^4.0.0", 326 | "decompress-targz": "^4.0.0", 327 | "decompress-unzip": "^4.0.1", 328 | "graceful-fs": "^4.1.10", 329 | "make-dir": "^1.0.0", 330 | "pify": "^2.3.0", 331 | "strip-dirs": "^2.0.0" 332 | }, 333 | "dependencies": { 334 | "pify": { 335 | "version": "2.3.0", 336 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 337 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 338 | } 339 | } 340 | }, 341 | "decompress-response": { 342 | "version": "3.3.0", 343 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 344 | "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", 345 | "requires": { 346 | "mimic-response": "^1.0.0" 347 | } 348 | }, 349 | "decompress-tar": { 350 | "version": "4.1.1", 351 | "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", 352 | "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", 353 | "requires": { 354 | "file-type": "^5.2.0", 355 | "is-stream": "^1.1.0", 356 | "tar-stream": "^1.5.2" 357 | }, 358 | "dependencies": { 359 | "file-type": { 360 | "version": "5.2.0", 361 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 362 | "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==" 363 | } 364 | } 365 | }, 366 | "decompress-tarbz2": { 367 | "version": "4.1.1", 368 | "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", 369 | "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", 370 | "requires": { 371 | "decompress-tar": "^4.1.0", 372 | "file-type": "^6.1.0", 373 | "is-stream": "^1.1.0", 374 | "seek-bzip": "^1.0.5", 375 | "unbzip2-stream": "^1.0.9" 376 | }, 377 | "dependencies": { 378 | "file-type": { 379 | "version": "6.2.0", 380 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", 381 | "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" 382 | } 383 | } 384 | }, 385 | "decompress-targz": { 386 | "version": "4.1.1", 387 | "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", 388 | "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", 389 | "requires": { 390 | "decompress-tar": "^4.1.1", 391 | "file-type": "^5.2.0", 392 | "is-stream": "^1.1.0" 393 | }, 394 | "dependencies": { 395 | "file-type": { 396 | "version": "5.2.0", 397 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 398 | "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==" 399 | } 400 | } 401 | }, 402 | "decompress-unzip": { 403 | "version": "4.0.1", 404 | "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", 405 | "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", 406 | "requires": { 407 | "file-type": "^3.8.0", 408 | "get-stream": "^2.2.0", 409 | "pify": "^2.3.0", 410 | "yauzl": "^2.4.2" 411 | }, 412 | "dependencies": { 413 | "file-type": { 414 | "version": "3.9.0", 415 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", 416 | "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==" 417 | }, 418 | "get-stream": { 419 | "version": "2.3.1", 420 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", 421 | "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", 422 | "requires": { 423 | "object-assign": "^4.0.1", 424 | "pinkie-promise": "^2.0.0" 425 | } 426 | }, 427 | "pify": { 428 | "version": "2.3.0", 429 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 430 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 431 | } 432 | } 433 | }, 434 | "defaults": { 435 | "version": "1.0.3", 436 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 437 | "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", 438 | "requires": { 439 | "clone": "^1.0.2" 440 | } 441 | }, 442 | "depd": { 443 | "version": "2.0.0", 444 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 445 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 446 | }, 447 | "destroy": { 448 | "version": "1.2.0", 449 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 450 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 451 | }, 452 | "download": { 453 | "version": "7.1.0", 454 | "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", 455 | "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", 456 | "requires": { 457 | "archive-type": "^4.0.0", 458 | "caw": "^2.0.1", 459 | "content-disposition": "^0.5.2", 460 | "decompress": "^4.2.0", 461 | "ext-name": "^5.0.0", 462 | "file-type": "^8.1.0", 463 | "filenamify": "^2.0.0", 464 | "get-stream": "^3.0.0", 465 | "got": "^8.3.1", 466 | "make-dir": "^1.2.0", 467 | "p-event": "^2.1.0", 468 | "pify": "^3.0.0" 469 | } 470 | }, 471 | "download-git-repo": { 472 | "version": "3.0.2", 473 | "resolved": "https://registry.npmjs.org/download-git-repo/-/download-git-repo-3.0.2.tgz", 474 | "integrity": "sha512-N8hWXD4hXqmEcNoR8TBYFntaOcYvEQ7Bz90mgm3bZRTuteGQqwT32VDMnTyD0KTEvb8BWrMc1tVmzuV9u/WrAg==", 475 | "requires": { 476 | "download": "^7.1.0", 477 | "git-clone": "^0.1.0", 478 | "rimraf": "^3.0.0" 479 | } 480 | }, 481 | "duplexer3": { 482 | "version": "0.1.4", 483 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 484 | "integrity": "sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==" 485 | }, 486 | "ee-first": { 487 | "version": "1.1.1", 488 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 489 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 490 | }, 491 | "emoji-regex": { 492 | "version": "8.0.0", 493 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 494 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 495 | }, 496 | "encodeurl": { 497 | "version": "1.0.2", 498 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 499 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 500 | }, 501 | "end-of-stream": { 502 | "version": "1.4.4", 503 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 504 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 505 | "requires": { 506 | "once": "^1.4.0" 507 | } 508 | }, 509 | "escape-html": { 510 | "version": "1.0.3", 511 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 512 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 513 | }, 514 | "escape-string-regexp": { 515 | "version": "1.0.5", 516 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 517 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" 518 | }, 519 | "etag": { 520 | "version": "1.8.1", 521 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 522 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 523 | }, 524 | "express": { 525 | "version": "4.18.1", 526 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 527 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 528 | "requires": { 529 | "accepts": "~1.3.8", 530 | "array-flatten": "1.1.1", 531 | "body-parser": "1.20.0", 532 | "content-disposition": "0.5.4", 533 | "content-type": "~1.0.4", 534 | "cookie": "0.5.0", 535 | "cookie-signature": "1.0.6", 536 | "debug": "2.6.9", 537 | "depd": "2.0.0", 538 | "encodeurl": "~1.0.2", 539 | "escape-html": "~1.0.3", 540 | "etag": "~1.8.1", 541 | "finalhandler": "1.2.0", 542 | "fresh": "0.5.2", 543 | "http-errors": "2.0.0", 544 | "merge-descriptors": "1.0.1", 545 | "methods": "~1.1.2", 546 | "on-finished": "2.4.1", 547 | "parseurl": "~1.3.3", 548 | "path-to-regexp": "0.1.7", 549 | "proxy-addr": "~2.0.7", 550 | "qs": "6.10.3", 551 | "range-parser": "~1.2.1", 552 | "safe-buffer": "5.2.1", 553 | "send": "0.18.0", 554 | "serve-static": "1.15.0", 555 | "setprototypeof": "1.2.0", 556 | "statuses": "2.0.1", 557 | "type-is": "~1.6.18", 558 | "utils-merge": "1.0.1", 559 | "vary": "~1.1.2" 560 | } 561 | }, 562 | "ext-list": { 563 | "version": "2.2.2", 564 | "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", 565 | "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", 566 | "requires": { 567 | "mime-db": "^1.28.0" 568 | } 569 | }, 570 | "ext-name": { 571 | "version": "5.0.0", 572 | "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", 573 | "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", 574 | "requires": { 575 | "ext-list": "^2.0.0", 576 | "sort-keys-length": "^1.0.0" 577 | } 578 | }, 579 | "external-editor": { 580 | "version": "3.1.0", 581 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 582 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 583 | "requires": { 584 | "chardet": "^0.7.0", 585 | "iconv-lite": "^0.4.24", 586 | "tmp": "^0.0.33" 587 | } 588 | }, 589 | "fd-slicer": { 590 | "version": "1.1.0", 591 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 592 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 593 | "requires": { 594 | "pend": "~1.2.0" 595 | } 596 | }, 597 | "figures": { 598 | "version": "3.2.0", 599 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 600 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 601 | "requires": { 602 | "escape-string-regexp": "^1.0.5" 603 | } 604 | }, 605 | "file-type": { 606 | "version": "8.1.0", 607 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", 608 | "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==" 609 | }, 610 | "filename-reserved-regex": { 611 | "version": "2.0.0", 612 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", 613 | "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==" 614 | }, 615 | "filenamify": { 616 | "version": "2.1.0", 617 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", 618 | "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", 619 | "requires": { 620 | "filename-reserved-regex": "^2.0.0", 621 | "strip-outer": "^1.0.0", 622 | "trim-repeated": "^1.0.0" 623 | } 624 | }, 625 | "finalhandler": { 626 | "version": "1.2.0", 627 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 628 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 629 | "requires": { 630 | "debug": "2.6.9", 631 | "encodeurl": "~1.0.2", 632 | "escape-html": "~1.0.3", 633 | "on-finished": "2.4.1", 634 | "parseurl": "~1.3.3", 635 | "statuses": "2.0.1", 636 | "unpipe": "~1.0.0" 637 | } 638 | }, 639 | "follow-redirects": { 640 | "version": "1.15.1", 641 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", 642 | "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" 643 | }, 644 | "forwarded": { 645 | "version": "0.2.0", 646 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 647 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 648 | }, 649 | "fresh": { 650 | "version": "0.5.2", 651 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 652 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 653 | }, 654 | "from2": { 655 | "version": "2.3.0", 656 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 657 | "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", 658 | "requires": { 659 | "inherits": "^2.0.1", 660 | "readable-stream": "^2.0.0" 661 | } 662 | }, 663 | "fs-constants": { 664 | "version": "1.0.0", 665 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 666 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 667 | }, 668 | "fs.realpath": { 669 | "version": "1.0.0", 670 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 671 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 672 | }, 673 | "function-bind": { 674 | "version": "1.1.1", 675 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 676 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 677 | }, 678 | "get-intrinsic": { 679 | "version": "1.1.1", 680 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 681 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 682 | "requires": { 683 | "function-bind": "^1.1.1", 684 | "has": "^1.0.3", 685 | "has-symbols": "^1.0.1" 686 | } 687 | }, 688 | "get-proxy": { 689 | "version": "2.1.0", 690 | "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", 691 | "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", 692 | "requires": { 693 | "npm-conf": "^1.1.0" 694 | } 695 | }, 696 | "get-stream": { 697 | "version": "3.0.0", 698 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 699 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 700 | }, 701 | "git-clone": { 702 | "version": "0.1.0", 703 | "resolved": "https://registry.npmjs.org/git-clone/-/git-clone-0.1.0.tgz", 704 | "integrity": "sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk=" 705 | }, 706 | "glob": { 707 | "version": "7.2.3", 708 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 709 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 710 | "requires": { 711 | "fs.realpath": "^1.0.0", 712 | "inflight": "^1.0.4", 713 | "inherits": "2", 714 | "minimatch": "^3.1.1", 715 | "once": "^1.3.0", 716 | "path-is-absolute": "^1.0.0" 717 | } 718 | }, 719 | "got": { 720 | "version": "8.3.2", 721 | "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", 722 | "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", 723 | "requires": { 724 | "@sindresorhus/is": "^0.7.0", 725 | "cacheable-request": "^2.1.1", 726 | "decompress-response": "^3.3.0", 727 | "duplexer3": "^0.1.4", 728 | "get-stream": "^3.0.0", 729 | "into-stream": "^3.1.0", 730 | "is-retry-allowed": "^1.1.0", 731 | "isurl": "^1.0.0-alpha5", 732 | "lowercase-keys": "^1.0.0", 733 | "mimic-response": "^1.0.0", 734 | "p-cancelable": "^0.4.0", 735 | "p-timeout": "^2.0.1", 736 | "pify": "^3.0.0", 737 | "safe-buffer": "^5.1.1", 738 | "timed-out": "^4.0.1", 739 | "url-parse-lax": "^3.0.0", 740 | "url-to-options": "^1.0.1" 741 | } 742 | }, 743 | "graceful-fs": { 744 | "version": "4.2.10", 745 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 746 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" 747 | }, 748 | "has": { 749 | "version": "1.0.3", 750 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 751 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 752 | "requires": { 753 | "function-bind": "^1.1.1" 754 | } 755 | }, 756 | "has-flag": { 757 | "version": "4.0.0", 758 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 759 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 760 | }, 761 | "has-symbol-support-x": { 762 | "version": "1.4.2", 763 | "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", 764 | "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" 765 | }, 766 | "has-symbols": { 767 | "version": "1.0.3", 768 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 769 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 770 | }, 771 | "has-to-string-tag-x": { 772 | "version": "1.4.1", 773 | "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", 774 | "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", 775 | "requires": { 776 | "has-symbol-support-x": "^1.4.1" 777 | } 778 | }, 779 | "http-cache-semantics": { 780 | "version": "3.8.1", 781 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", 782 | "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" 783 | }, 784 | "http-errors": { 785 | "version": "2.0.0", 786 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 787 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 788 | "requires": { 789 | "depd": "2.0.0", 790 | "inherits": "2.0.4", 791 | "setprototypeof": "1.2.0", 792 | "statuses": "2.0.1", 793 | "toidentifier": "1.0.1" 794 | } 795 | }, 796 | "iconv-lite": { 797 | "version": "0.4.24", 798 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 799 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 800 | "requires": { 801 | "safer-buffer": ">= 2.1.2 < 3" 802 | } 803 | }, 804 | "ieee754": { 805 | "version": "1.2.1", 806 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 807 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 808 | }, 809 | "inflight": { 810 | "version": "1.0.6", 811 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 812 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 813 | "requires": { 814 | "once": "^1.3.0", 815 | "wrappy": "1" 816 | } 817 | }, 818 | "inherits": { 819 | "version": "2.0.4", 820 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 821 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 822 | }, 823 | "ini": { 824 | "version": "1.3.8", 825 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 826 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 827 | }, 828 | "inquirer": { 829 | "version": "8.2.4", 830 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", 831 | "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", 832 | "requires": { 833 | "ansi-escapes": "^4.2.1", 834 | "chalk": "^4.1.1", 835 | "cli-cursor": "^3.1.0", 836 | "cli-width": "^3.0.0", 837 | "external-editor": "^3.0.3", 838 | "figures": "^3.0.0", 839 | "lodash": "^4.17.21", 840 | "mute-stream": "0.0.8", 841 | "ora": "^5.4.1", 842 | "run-async": "^2.4.0", 843 | "rxjs": "^7.5.5", 844 | "string-width": "^4.1.0", 845 | "strip-ansi": "^6.0.0", 846 | "through": "^2.3.6", 847 | "wrap-ansi": "^7.0.0" 848 | }, 849 | "dependencies": { 850 | "bl": { 851 | "version": "4.1.0", 852 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 853 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 854 | "requires": { 855 | "buffer": "^5.5.0", 856 | "inherits": "^2.0.4", 857 | "readable-stream": "^3.4.0" 858 | } 859 | }, 860 | "ora": { 861 | "version": "5.4.1", 862 | "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", 863 | "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", 864 | "requires": { 865 | "bl": "^4.1.0", 866 | "chalk": "^4.1.0", 867 | "cli-cursor": "^3.1.0", 868 | "cli-spinners": "^2.5.0", 869 | "is-interactive": "^1.0.0", 870 | "is-unicode-supported": "^0.1.0", 871 | "log-symbols": "^4.1.0", 872 | "strip-ansi": "^6.0.0", 873 | "wcwidth": "^1.0.1" 874 | } 875 | }, 876 | "readable-stream": { 877 | "version": "3.6.0", 878 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 879 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 880 | "requires": { 881 | "inherits": "^2.0.3", 882 | "string_decoder": "^1.1.1", 883 | "util-deprecate": "^1.0.1" 884 | } 885 | } 886 | } 887 | }, 888 | "into-stream": { 889 | "version": "3.1.0", 890 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", 891 | "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", 892 | "requires": { 893 | "from2": "^2.1.1", 894 | "p-is-promise": "^1.1.0" 895 | } 896 | }, 897 | "ipaddr.js": { 898 | "version": "1.9.1", 899 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 900 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 901 | }, 902 | "is-fullwidth-code-point": { 903 | "version": "3.0.0", 904 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 905 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 906 | }, 907 | "is-interactive": { 908 | "version": "1.0.0", 909 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 910 | "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" 911 | }, 912 | "is-natural-number": { 913 | "version": "4.0.1", 914 | "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", 915 | "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" 916 | }, 917 | "is-object": { 918 | "version": "1.0.2", 919 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", 920 | "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" 921 | }, 922 | "is-plain-obj": { 923 | "version": "1.1.0", 924 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 925 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" 926 | }, 927 | "is-retry-allowed": { 928 | "version": "1.2.0", 929 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 930 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" 931 | }, 932 | "is-stream": { 933 | "version": "1.1.0", 934 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 935 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 936 | }, 937 | "is-unicode-supported": { 938 | "version": "0.1.0", 939 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 940 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" 941 | }, 942 | "isarray": { 943 | "version": "1.0.0", 944 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 945 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 946 | }, 947 | "isurl": { 948 | "version": "1.0.0", 949 | "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", 950 | "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", 951 | "requires": { 952 | "has-to-string-tag-x": "^1.2.0", 953 | "is-object": "^1.0.1" 954 | } 955 | }, 956 | "json-buffer": { 957 | "version": "3.0.0", 958 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 959 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" 960 | }, 961 | "keyv": { 962 | "version": "3.0.0", 963 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", 964 | "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", 965 | "requires": { 966 | "json-buffer": "3.0.0" 967 | } 968 | }, 969 | "lodash": { 970 | "version": "4.17.21", 971 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 972 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 973 | }, 974 | "log-symbols": { 975 | "version": "4.1.0", 976 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 977 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 978 | "requires": { 979 | "chalk": "^4.1.0", 980 | "is-unicode-supported": "^0.1.0" 981 | } 982 | }, 983 | "lowercase-keys": { 984 | "version": "1.0.1", 985 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 986 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 987 | }, 988 | "make-dir": { 989 | "version": "1.3.0", 990 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 991 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 992 | "requires": { 993 | "pify": "^3.0.0" 994 | } 995 | }, 996 | "media-typer": { 997 | "version": "0.3.0", 998 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 999 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1000 | }, 1001 | "merge-descriptors": { 1002 | "version": "1.0.1", 1003 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1004 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1005 | }, 1006 | "methods": { 1007 | "version": "1.1.2", 1008 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1009 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1010 | }, 1011 | "mime": { 1012 | "version": "1.6.0", 1013 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1014 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1015 | }, 1016 | "mime-db": { 1017 | "version": "1.52.0", 1018 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1019 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1020 | }, 1021 | "mime-types": { 1022 | "version": "2.1.35", 1023 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1024 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1025 | "requires": { 1026 | "mime-db": "1.52.0" 1027 | } 1028 | }, 1029 | "mimic-fn": { 1030 | "version": "2.1.0", 1031 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1032 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 1033 | }, 1034 | "mimic-response": { 1035 | "version": "1.0.1", 1036 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 1037 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 1038 | }, 1039 | "minimatch": { 1040 | "version": "3.1.2", 1041 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1042 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1043 | "requires": { 1044 | "brace-expansion": "^1.1.7" 1045 | } 1046 | }, 1047 | "ms": { 1048 | "version": "2.0.0", 1049 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1050 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1051 | }, 1052 | "mute-stream": { 1053 | "version": "0.0.8", 1054 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1055 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 1056 | }, 1057 | "negotiator": { 1058 | "version": "0.6.3", 1059 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1060 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1061 | }, 1062 | "normalize-url": { 1063 | "version": "2.0.1", 1064 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", 1065 | "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", 1066 | "requires": { 1067 | "prepend-http": "^2.0.0", 1068 | "query-string": "^5.0.1", 1069 | "sort-keys": "^2.0.0" 1070 | }, 1071 | "dependencies": { 1072 | "sort-keys": { 1073 | "version": "2.0.0", 1074 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", 1075 | "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", 1076 | "requires": { 1077 | "is-plain-obj": "^1.0.0" 1078 | } 1079 | } 1080 | } 1081 | }, 1082 | "npm-conf": { 1083 | "version": "1.1.3", 1084 | "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", 1085 | "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", 1086 | "requires": { 1087 | "config-chain": "^1.1.11", 1088 | "pify": "^3.0.0" 1089 | } 1090 | }, 1091 | "object-assign": { 1092 | "version": "4.1.1", 1093 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1094 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1095 | }, 1096 | "object-inspect": { 1097 | "version": "1.12.2", 1098 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 1099 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 1100 | }, 1101 | "on-finished": { 1102 | "version": "2.4.1", 1103 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1104 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1105 | "requires": { 1106 | "ee-first": "1.1.1" 1107 | } 1108 | }, 1109 | "once": { 1110 | "version": "1.4.0", 1111 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1112 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1113 | "requires": { 1114 | "wrappy": "1" 1115 | } 1116 | }, 1117 | "onetime": { 1118 | "version": "5.1.2", 1119 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1120 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1121 | "requires": { 1122 | "mimic-fn": "^2.1.0" 1123 | } 1124 | }, 1125 | "ora": { 1126 | "version": "4.1.1", 1127 | "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", 1128 | "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", 1129 | "requires": { 1130 | "chalk": "^3.0.0", 1131 | "cli-cursor": "^3.1.0", 1132 | "cli-spinners": "^2.2.0", 1133 | "is-interactive": "^1.0.0", 1134 | "log-symbols": "^3.0.0", 1135 | "mute-stream": "0.0.8", 1136 | "strip-ansi": "^6.0.0", 1137 | "wcwidth": "^1.0.1" 1138 | }, 1139 | "dependencies": { 1140 | "chalk": { 1141 | "version": "3.0.0", 1142 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 1143 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 1144 | "requires": { 1145 | "ansi-styles": "^4.1.0", 1146 | "supports-color": "^7.1.0" 1147 | } 1148 | }, 1149 | "color-convert": { 1150 | "version": "1.9.3", 1151 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1152 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1153 | "requires": { 1154 | "color-name": "1.1.3" 1155 | } 1156 | }, 1157 | "color-name": { 1158 | "version": "1.1.3", 1159 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1160 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 1161 | }, 1162 | "has-flag": { 1163 | "version": "3.0.0", 1164 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1165 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1166 | }, 1167 | "log-symbols": { 1168 | "version": "3.0.0", 1169 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 1170 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 1171 | "requires": { 1172 | "chalk": "^2.4.2" 1173 | }, 1174 | "dependencies": { 1175 | "ansi-styles": { 1176 | "version": "3.2.1", 1177 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1178 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1179 | "requires": { 1180 | "color-convert": "^1.9.0" 1181 | } 1182 | }, 1183 | "chalk": { 1184 | "version": "2.4.2", 1185 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1186 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1187 | "requires": { 1188 | "ansi-styles": "^3.2.1", 1189 | "escape-string-regexp": "^1.0.5", 1190 | "supports-color": "^5.3.0" 1191 | } 1192 | }, 1193 | "supports-color": { 1194 | "version": "5.5.0", 1195 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1196 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1197 | "requires": { 1198 | "has-flag": "^3.0.0" 1199 | } 1200 | } 1201 | } 1202 | } 1203 | } 1204 | }, 1205 | "os-tmpdir": { 1206 | "version": "1.0.2", 1207 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1208 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1209 | }, 1210 | "p-cancelable": { 1211 | "version": "0.4.1", 1212 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", 1213 | "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" 1214 | }, 1215 | "p-event": { 1216 | "version": "2.3.1", 1217 | "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", 1218 | "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", 1219 | "requires": { 1220 | "p-timeout": "^2.0.1" 1221 | } 1222 | }, 1223 | "p-finally": { 1224 | "version": "1.0.0", 1225 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1226 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 1227 | }, 1228 | "p-is-promise": { 1229 | "version": "1.1.0", 1230 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", 1231 | "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" 1232 | }, 1233 | "p-timeout": { 1234 | "version": "2.0.1", 1235 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", 1236 | "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", 1237 | "requires": { 1238 | "p-finally": "^1.0.0" 1239 | } 1240 | }, 1241 | "parseurl": { 1242 | "version": "1.3.3", 1243 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1244 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1245 | }, 1246 | "path-is-absolute": { 1247 | "version": "1.0.1", 1248 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1249 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1250 | }, 1251 | "path-to-regexp": { 1252 | "version": "0.1.7", 1253 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1254 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1255 | }, 1256 | "pend": { 1257 | "version": "1.2.0", 1258 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1259 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 1260 | }, 1261 | "pify": { 1262 | "version": "3.0.0", 1263 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1264 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 1265 | }, 1266 | "pinkie": { 1267 | "version": "2.0.4", 1268 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1269 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 1270 | }, 1271 | "pinkie-promise": { 1272 | "version": "2.0.1", 1273 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1274 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1275 | "requires": { 1276 | "pinkie": "^2.0.0" 1277 | } 1278 | }, 1279 | "prepend-http": { 1280 | "version": "2.0.0", 1281 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 1282 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" 1283 | }, 1284 | "process-nextick-args": { 1285 | "version": "2.0.1", 1286 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1287 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1288 | }, 1289 | "proto-list": { 1290 | "version": "1.2.4", 1291 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 1292 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" 1293 | }, 1294 | "proxy-addr": { 1295 | "version": "2.0.7", 1296 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1297 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1298 | "requires": { 1299 | "forwarded": "0.2.0", 1300 | "ipaddr.js": "1.9.1" 1301 | } 1302 | }, 1303 | "qs": { 1304 | "version": "6.10.3", 1305 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 1306 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 1307 | "requires": { 1308 | "side-channel": "^1.0.4" 1309 | } 1310 | }, 1311 | "query-string": { 1312 | "version": "5.1.1", 1313 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", 1314 | "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", 1315 | "requires": { 1316 | "decode-uri-component": "^0.2.0", 1317 | "object-assign": "^4.1.0", 1318 | "strict-uri-encode": "^1.0.0" 1319 | } 1320 | }, 1321 | "range-parser": { 1322 | "version": "1.2.1", 1323 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1324 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1325 | }, 1326 | "raw-body": { 1327 | "version": "2.5.1", 1328 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1329 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1330 | "requires": { 1331 | "bytes": "3.1.2", 1332 | "http-errors": "2.0.0", 1333 | "iconv-lite": "0.4.24", 1334 | "unpipe": "1.0.0" 1335 | } 1336 | }, 1337 | "readable-stream": { 1338 | "version": "2.3.7", 1339 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1340 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1341 | "requires": { 1342 | "core-util-is": "~1.0.0", 1343 | "inherits": "~2.0.3", 1344 | "isarray": "~1.0.0", 1345 | "process-nextick-args": "~2.0.0", 1346 | "safe-buffer": "~5.1.1", 1347 | "string_decoder": "~1.1.1", 1348 | "util-deprecate": "~1.0.1" 1349 | }, 1350 | "dependencies": { 1351 | "safe-buffer": { 1352 | "version": "5.1.2", 1353 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1354 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1355 | } 1356 | } 1357 | }, 1358 | "responselike": { 1359 | "version": "1.0.2", 1360 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 1361 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 1362 | "requires": { 1363 | "lowercase-keys": "^1.0.0" 1364 | } 1365 | }, 1366 | "restore-cursor": { 1367 | "version": "3.1.0", 1368 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1369 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1370 | "requires": { 1371 | "onetime": "^5.1.0", 1372 | "signal-exit": "^3.0.2" 1373 | } 1374 | }, 1375 | "rimraf": { 1376 | "version": "3.0.2", 1377 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1378 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1379 | "requires": { 1380 | "glob": "^7.1.3" 1381 | } 1382 | }, 1383 | "run-async": { 1384 | "version": "2.4.1", 1385 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1386 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" 1387 | }, 1388 | "rxjs": { 1389 | "version": "7.5.5", 1390 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", 1391 | "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", 1392 | "requires": { 1393 | "tslib": "^2.1.0" 1394 | } 1395 | }, 1396 | "safe-buffer": { 1397 | "version": "5.2.1", 1398 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1399 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1400 | }, 1401 | "safer-buffer": { 1402 | "version": "2.1.2", 1403 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1404 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1405 | }, 1406 | "seek-bzip": { 1407 | "version": "1.0.6", 1408 | "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", 1409 | "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", 1410 | "requires": { 1411 | "commander": "^2.8.1" 1412 | }, 1413 | "dependencies": { 1414 | "commander": { 1415 | "version": "2.20.3", 1416 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1417 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 1418 | } 1419 | } 1420 | }, 1421 | "send": { 1422 | "version": "0.18.0", 1423 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1424 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1425 | "requires": { 1426 | "debug": "2.6.9", 1427 | "depd": "2.0.0", 1428 | "destroy": "1.2.0", 1429 | "encodeurl": "~1.0.2", 1430 | "escape-html": "~1.0.3", 1431 | "etag": "~1.8.1", 1432 | "fresh": "0.5.2", 1433 | "http-errors": "2.0.0", 1434 | "mime": "1.6.0", 1435 | "ms": "2.1.3", 1436 | "on-finished": "2.4.1", 1437 | "range-parser": "~1.2.1", 1438 | "statuses": "2.0.1" 1439 | }, 1440 | "dependencies": { 1441 | "ms": { 1442 | "version": "2.1.3", 1443 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1444 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1445 | } 1446 | } 1447 | }, 1448 | "serve-static": { 1449 | "version": "1.15.0", 1450 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1451 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1452 | "requires": { 1453 | "encodeurl": "~1.0.2", 1454 | "escape-html": "~1.0.3", 1455 | "parseurl": "~1.3.3", 1456 | "send": "0.18.0" 1457 | } 1458 | }, 1459 | "setprototypeof": { 1460 | "version": "1.2.0", 1461 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1462 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1463 | }, 1464 | "side-channel": { 1465 | "version": "1.0.4", 1466 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1467 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1468 | "requires": { 1469 | "call-bind": "^1.0.0", 1470 | "get-intrinsic": "^1.0.2", 1471 | "object-inspect": "^1.9.0" 1472 | } 1473 | }, 1474 | "signal-exit": { 1475 | "version": "3.0.7", 1476 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1477 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 1478 | }, 1479 | "sort-keys": { 1480 | "version": "1.1.2", 1481 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", 1482 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", 1483 | "requires": { 1484 | "is-plain-obj": "^1.0.0" 1485 | } 1486 | }, 1487 | "sort-keys-length": { 1488 | "version": "1.0.1", 1489 | "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", 1490 | "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", 1491 | "requires": { 1492 | "sort-keys": "^1.0.0" 1493 | } 1494 | }, 1495 | "statuses": { 1496 | "version": "2.0.1", 1497 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1498 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1499 | }, 1500 | "strict-uri-encode": { 1501 | "version": "1.1.0", 1502 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", 1503 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" 1504 | }, 1505 | "string-width": { 1506 | "version": "4.2.3", 1507 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1508 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1509 | "requires": { 1510 | "emoji-regex": "^8.0.0", 1511 | "is-fullwidth-code-point": "^3.0.0", 1512 | "strip-ansi": "^6.0.1" 1513 | } 1514 | }, 1515 | "string_decoder": { 1516 | "version": "1.1.1", 1517 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1518 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1519 | "requires": { 1520 | "safe-buffer": "~5.1.0" 1521 | }, 1522 | "dependencies": { 1523 | "safe-buffer": { 1524 | "version": "5.1.2", 1525 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1526 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1527 | } 1528 | } 1529 | }, 1530 | "strip-ansi": { 1531 | "version": "6.0.1", 1532 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1533 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1534 | "requires": { 1535 | "ansi-regex": "^5.0.1" 1536 | } 1537 | }, 1538 | "strip-dirs": { 1539 | "version": "2.1.0", 1540 | "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", 1541 | "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", 1542 | "requires": { 1543 | "is-natural-number": "^4.0.1" 1544 | } 1545 | }, 1546 | "strip-outer": { 1547 | "version": "1.0.1", 1548 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", 1549 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", 1550 | "requires": { 1551 | "escape-string-regexp": "^1.0.2" 1552 | } 1553 | }, 1554 | "supports-color": { 1555 | "version": "7.2.0", 1556 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1557 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1558 | "requires": { 1559 | "has-flag": "^4.0.0" 1560 | } 1561 | }, 1562 | "tar-stream": { 1563 | "version": "1.6.2", 1564 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 1565 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 1566 | "requires": { 1567 | "bl": "^1.0.0", 1568 | "buffer-alloc": "^1.2.0", 1569 | "end-of-stream": "^1.0.0", 1570 | "fs-constants": "^1.0.0", 1571 | "readable-stream": "^2.3.0", 1572 | "to-buffer": "^1.1.1", 1573 | "xtend": "^4.0.0" 1574 | } 1575 | }, 1576 | "through": { 1577 | "version": "2.3.8", 1578 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1579 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1580 | }, 1581 | "timed-out": { 1582 | "version": "4.0.1", 1583 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 1584 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" 1585 | }, 1586 | "tmp": { 1587 | "version": "0.0.33", 1588 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1589 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1590 | "requires": { 1591 | "os-tmpdir": "~1.0.2" 1592 | } 1593 | }, 1594 | "to-buffer": { 1595 | "version": "1.1.1", 1596 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 1597 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" 1598 | }, 1599 | "toidentifier": { 1600 | "version": "1.0.1", 1601 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1602 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1603 | }, 1604 | "trim-repeated": { 1605 | "version": "1.0.0", 1606 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", 1607 | "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", 1608 | "requires": { 1609 | "escape-string-regexp": "^1.0.2" 1610 | } 1611 | }, 1612 | "tslib": { 1613 | "version": "2.4.0", 1614 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 1615 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" 1616 | }, 1617 | "tunnel-agent": { 1618 | "version": "0.6.0", 1619 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1620 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1621 | "requires": { 1622 | "safe-buffer": "^5.0.1" 1623 | } 1624 | }, 1625 | "type-fest": { 1626 | "version": "0.21.3", 1627 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 1628 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" 1629 | }, 1630 | "type-is": { 1631 | "version": "1.6.18", 1632 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1633 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1634 | "requires": { 1635 | "media-typer": "0.3.0", 1636 | "mime-types": "~2.1.24" 1637 | } 1638 | }, 1639 | "unbzip2-stream": { 1640 | "version": "1.4.3", 1641 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 1642 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 1643 | "requires": { 1644 | "buffer": "^5.2.1", 1645 | "through": "^2.3.8" 1646 | } 1647 | }, 1648 | "unpipe": { 1649 | "version": "1.0.0", 1650 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1651 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1652 | }, 1653 | "url-parse-lax": { 1654 | "version": "3.0.0", 1655 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 1656 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 1657 | "requires": { 1658 | "prepend-http": "^2.0.0" 1659 | } 1660 | }, 1661 | "url-to-options": { 1662 | "version": "1.0.1", 1663 | "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", 1664 | "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" 1665 | }, 1666 | "util-deprecate": { 1667 | "version": "1.0.2", 1668 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1669 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1670 | }, 1671 | "utils-merge": { 1672 | "version": "1.0.1", 1673 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1674 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1675 | }, 1676 | "vary": { 1677 | "version": "1.1.2", 1678 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1679 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1680 | }, 1681 | "wcwidth": { 1682 | "version": "1.0.1", 1683 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 1684 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 1685 | "requires": { 1686 | "defaults": "^1.0.3" 1687 | } 1688 | }, 1689 | "wrap-ansi": { 1690 | "version": "7.0.0", 1691 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1692 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1693 | "requires": { 1694 | "ansi-styles": "^4.0.0", 1695 | "string-width": "^4.1.0", 1696 | "strip-ansi": "^6.0.0" 1697 | } 1698 | }, 1699 | "wrappy": { 1700 | "version": "1.0.2", 1701 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1702 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1703 | }, 1704 | "xtend": { 1705 | "version": "4.0.2", 1706 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1707 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1708 | }, 1709 | "yauzl": { 1710 | "version": "2.10.0", 1711 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1712 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1713 | "requires": { 1714 | "buffer-crc32": "~0.2.3", 1715 | "fd-slicer": "~1.1.0" 1716 | } 1717 | } 1718 | } 1719 | } 1720 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "swagger-ts-api", 3 | "version": "1.3.8", 4 | "description": "This is a swagger to TS request file plugin that can help us improve development efficiency even more.", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "node bin/main.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "bin": { 11 | "swagger-ts": "bin/main.js" 12 | }, 13 | "author": "decong.li", 14 | "license": "ISC", 15 | "private": false, 16 | "keywords": [ 17 | "swagger", 18 | "ts", 19 | "vue3", 20 | "react" 21 | ], 22 | "dependencies": { 23 | "axios": "^0.26.0", 24 | "chalk": "^4.1.2", 25 | "child_process": "^1.0.2", 26 | "commander": "^9.0.0", 27 | "download-git-repo": "^3.0.2", 28 | "express": "^4.17.3", 29 | "inquirer": "^8.2.0", 30 | "ora": "^4.0.3" 31 | }, 32 | "devDependencies": {}, 33 | "repository": { 34 | "type": "git", 35 | "url": "https://github.com/ldc2726/swagger-ts" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /utils/format.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: decong.li 3 | * @Date: 2022/03/05 18:19:23 Saturday 4 | * @LastEditors: decong.li 5 | * @LastEditTime: 2023/04/18 18:18:36 Tuesday 6 | * @FilePath: /swagger-ts/utils/format.js 7 | */ 8 | 9 | // 没有命名规则的接口将自动以url的后两位为命名 10 | 11 | exports.rename = function (element,key) { 12 | let name; 13 | if(element.operationId){ 14 | name = formatGlobalName(element.operationId) 15 | } else { 16 | const keylist = key.split('/') 17 | name = keylist[keylist.length-2]+keylist[keylist.length-1] 18 | name = formatGlobalName(name) 19 | } 20 | return name; 21 | } 22 | 23 | 24 | 25 | // 格式化寻找json对应的节点 inBodyArr[0]['schema']['$ref'] 26 | exports.FormatJsonDom = function (resData, url) { 27 | const JsonIndex = url.replace('#/', '').split('/'); 28 | let newdata = resData 29 | JsonIndex.map(item => { 30 | newdata = newdata[item] 31 | }) 32 | return newdata; 33 | } 34 | 35 | 36 | // 匹配同一属性的object 37 | exports.filterAttribute = function (name, element) { 38 | let arr = element.filter((value) => { 39 | return value.name == name 40 | }) 41 | if (arr.length >= 1) { 42 | return arr[0] 43 | } 44 | return {} 45 | } 46 | 47 | // 48 | exports.formatRequestData = function(element,name){ 49 | if (element.parameters) { 50 | let arr = element.parameters.filter((value) => { 51 | return value.in == "body" 52 | }) 53 | // 兼容v3版本 54 | let arr2 = element.parameters.filter((value) => { 55 | return value.in == "query" 56 | }) 57 | try { 58 | if(arr.length>0){ 59 | arr = arr[0]['schema']?.items || arr[0]['schema'] 60 | arr = arr['$ref'].split('/') 61 | let requestData = arr[arr.length-1] 62 | return requestData 63 | } 64 | } catch (error) { 65 | return 'any' 66 | } 67 | 68 | if(arr2.length>0){ 69 | return name 70 | } 71 | } 72 | return '' 73 | } 74 | 75 | exports.formatRefName = function(name){ 76 | name = name.items.$ref.split('/'); 77 | name = name[name.length - 1] 78 | return formatGlobalName(name) 79 | } 80 | 81 | function formatGlobalName(name){ 82 | let newName = '' 83 | name = name.replace(/[^a-zA-Z0-9_\u4e00-\u9fa5]/g,'-') 84 | name = name.split('-') 85 | name.map(item=>{ 86 | newName += (item.substring(0,1).toUpperCase() + item.substring(1)) 87 | }) 88 | return newName 89 | } 90 | exports.formatGlobalName = formatGlobalName 91 | 92 | /** 93 | * int64 和 int32 的兼容 94 | * @param {*} items 当前数据 95 | * @param {*} isRes 是否为请求结果 96 | */ 97 | exports.formatInt64 = function(items,isRes=false){ 98 | const format = items.format || items.items?.format || '' 99 | let typeName = '' 100 | if(format == 'int64'){ 101 | if(items.type == "array"){ 102 | if(isRes){ 103 | return 'number[]' 104 | } 105 | return "number[]|string[]" 106 | } 107 | if(isRes){ 108 | return 'number' 109 | } 110 | return "number|string" 111 | } 112 | if(items.type == "array"){ 113 | if(items.items.type){ 114 | return items.items.type + "[]" 115 | } 116 | typeName = items.items.$ref.split('/').pop() 117 | typeName = formatGlobalName(typeName) 118 | return typeName+'Res[]' 119 | } 120 | if(items.$ref){ 121 | typeName = items.$ref.split('/').pop() 122 | typeName = formatGlobalName(typeName) 123 | return typeName 124 | } 125 | return items.type 126 | } 127 | 128 | 129 | -------------------------------------------------------------------------------- /utils/formatV3.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: decong.li 3 | * @Date: 2022/03/25 15:30:41 Friday 4 | * @LastEditors: decong.li 5 | * @LastEditTime: 2023/04/24 16:18:45 Monday 6 | * @FilePath: /swagger-ts/utils/formatV3.js 7 | */ 8 | function GetType(data){ 9 | return data['application/json'] || data['text/json'] || data['multipart/form-data'] 10 | } 11 | exports.formatV3 = function (res) { 12 | for (const key in res.data.paths) { 13 | if (Object.hasOwnProperty.call(res.data.paths, key)) { 14 | const element = res.data['paths'][key]; 15 | // 处理请求参数 16 | // if(element.get&&element.get.parameters){ 17 | // // element.get.parameters = [{ 18 | // // "in": "body", 19 | // // "name": element.get.operationId, 20 | // // "description": element.get.operationId, 21 | // // "required": true, 22 | // // "schema": 23 | // // }] 24 | // } 25 | // 处理响应结果 26 | let elementData = element.post || element.delete|| element.put|| element.get || element.patch 27 | if(elementData&&elementData.requestBody){ 28 | try { 29 | elementData.parameters = [{ 30 | "in": "body", 31 | "name":elementData.operationId, 32 | "description": elementData.operationId, 33 | "required": true, 34 | "schema": findValue(elementData.requestBody,'schema') 35 | // GetType(elementData.requestBody['content'])['schema'] 36 | }] 37 | } catch (error) { 38 | console.log('请检查接口(格式是否正确,如非常规格式记得反馈):'+ key) 39 | } 40 | 41 | } 42 | 43 | if(elementData.responses['200']['content']){ 44 | try { 45 | elementData.responses['200']={ 46 | schema: findValue(elementData.responses,'schema') 47 | // GetType(elementData.responses['200']['content'])['schema'] 48 | } 49 | } catch { 50 | console.log('请检查接口(格式是否正确,如非常规格式记得反馈):'+ key) 51 | } 52 | } 53 | } 54 | //处理DTO 55 | for (const i in res.data['components']['schemas']) { 56 | if (Object.hasOwnProperty.call(res.data['components']['schemas'], i)) { 57 | let element2 = res.data['components']['schemas'][i]; 58 | element2['title'] = i 59 | for (const j in element2['properties']) { 60 | if (Object.hasOwnProperty.call(element2['properties'], j)) { 61 | const element3 = element2['properties'][j]; 62 | if(element3&&element3.allOf){ 63 | element2['properties'][j]=element3.allOf[0] 64 | } 65 | if(element3&&element3.$ref){ 66 | element2['properties'][j]['items'] = element3 67 | } 68 | } 69 | } 70 | } 71 | } 72 | } 73 | return res 74 | } 75 | 76 | function findValue(obj, key) { 77 | if (obj.hasOwnProperty(key)) { 78 | return obj[key]; 79 | } 80 | 81 | for (let prop in obj) { 82 | if (typeof obj[prop] === 'object' && obj[prop] !== null) { 83 | const result = findValue(obj[prop], key); 84 | if (result !== undefined) { 85 | return result; 86 | } 87 | } 88 | } 89 | 90 | return undefined; 91 | } 92 | exports.findValue = findValue -------------------------------------------------------------------------------- /utils/md.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: decong.li 3 | * @Date: 2022/05/05 10:35:30 Thursday 4 | * @LastEditors: decong.li 5 | * @LastEditTime: 2022/05/05 10:35:31 Thursday 6 | * @FilePath: /vue-swagger-cmd/utils/md.js 7 | */ 8 | -------------------------------------------------------------------------------- /utils/msg.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: decong.li 3 | * @Date: 2022/06/02 13:01:01 Thursday 4 | * @LastEditors: decong.li 5 | * @LastEditTime: 2022/06/02 13:57:51 Thursday 6 | * @FilePath: /swagger-ts/utils/msg.js 7 | */ 8 | const { default: axios } = require('axios'); 9 | const { readFile } = require("./writeFs") 10 | exports.qywxMsg = function( apiName, newVsion, apiUrl){ 11 | let datas ={ 12 | "msgtype": "markdown", 13 | "markdown": { 14 | "content": `接口服务:${apiName} \n更新版本:${newVsion}\n文档地址:[点击查看](${apiUrl}/${apiName}) ` 15 | } 16 | } 17 | readFile('./config.json').then(res=>{ 18 | const config = JSON.parse(res); 19 | axios.post(`${config.hook}`,datas).then((response) => { 20 | }).catch((e) => { 21 | console.log(e) 22 | }) 23 | }) 24 | } 25 | 26 | exports.fsMsg = function(apiName, newVsion, apiUrl, email){ 27 | let datas = { 28 | "email": email, 29 | "msg_type": "post", 30 | "content": { 31 | "post": { 32 | "zh_cn": { 33 | "title": "DIAP swagger版本通知", 34 | "content": [ 35 | [ 36 | { 37 | "tag": "text", 38 | "un_escape": true, 39 | "text": "接口服务 :" 40 | }, 41 | { 42 | "tag": "text", 43 | "un_escape": true, 44 | "text": `${apiName}` 45 | }, 46 | ], 47 | [ 48 | { 49 | "tag": "text", 50 | "text": "更新版本 :" 51 | }, 52 | { 53 | "tag": "text", 54 | "text": newVsion 55 | } 56 | ], 57 | [ 58 | { 59 | "tag": "text", 60 | "text": "文档地址 :" 61 | }, 62 | { 63 | "tag": "a", 64 | "text": "点击查看", 65 | "href": `${apiUrl}/${apiName}` 66 | }, 67 | ] 68 | ] 69 | } 70 | } 71 | } 72 | } 73 | readFile('./config.json').then(res=>{ 74 | const config = JSON.parse(res); 75 | axios({ 76 | url: config.hook, 77 | data: datas, 78 | type: 'post', 79 | headers: { 80 | Authorization: config.token, 81 | "Content-Type": "application/json; charset=utf-8" 82 | } 83 | }) 84 | }) 85 | } -------------------------------------------------------------------------------- /utils/request.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: decong.li 3 | * @Date: 2022/03/05 18:16:11 Saturday 4 | * @LastEditors: decong.li 5 | * @LastEditTime: 2022/05/30 00:30:07 Monday 6 | * @FilePath: /swagger-ts/utils/request.js 7 | */ 8 | 9 | /** 10 | * 判断生成的请求方式 11 | * @param {*} data 12 | * @returns 13 | */ 14 | exports.requestType = function (data) { 15 | if (data['get']) { 16 | return '$get' 17 | } 18 | if (data['delete']) { 19 | return '$delete' 20 | } 21 | if (data['put']) { 22 | return '$put' 23 | } 24 | return '$post' 25 | } 26 | 27 | 28 | /** 29 | * 读取不同类型下的数据 30 | * @param {*} data 31 | * @returns 32 | */ 33 | exports.typeData = function (data) { 34 | return data['post'] || data['delete'] || data['get'] || data['put']; 35 | } -------------------------------------------------------------------------------- /utils/version.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: decong.li 3 | * @Date: 2022/06/02 13:22:19 Thursday 4 | * @LastEditors: decong.li 5 | * @LastEditTime: 2023/04/19 16:48:44 Wednesday 6 | * @FilePath: /swagger-ts/utils/version.js 7 | */ 8 | var fs = require('fs'); 9 | exports.versionUpdate = function(apiname,getSwaggerJson){ 10 | fs.readFile(`./${apiname}/package.json`, "utf8", (err, data) => { 11 | if (err) { 12 | console.log(chalk.red(err)); 13 | process.exit(); 14 | } 15 | const packageJson = JSON.parse(data); 16 | const list = packageJson.version.split('.'); 17 | list[2]++ 18 | list.map((item, i) => { 19 | if (item == 100) { 20 | list[i - 1]++ 21 | list[i] = 0 22 | } 23 | }) 24 | let newVsion = list[0] + '.' + list[1] + '.' + list[2] 25 | packageJson.version = newVsion 26 | packageString = JSON.stringify(packageJson, null, 2); 27 | fs.writeFile(`./${apiname}/package.json`, packageString, "utf8", err => { 28 | if (err) { 29 | console.log(chalk.red(err)); 30 | process.exit(); 31 | } 32 | const objs = { 33 | url: packageJson.swaggerpath, 34 | apiName: apiname, 35 | version: packageJson.swaggerversion, 36 | npmNewVersion: newVsion, 37 | urlPrefix: packageJson.urlPrefix 38 | } 39 | getSwaggerJson(objs) 40 | }) 41 | }) 42 | } 43 | 44 | exports.compareVersions = function(version1, version2='3.0.0') { 45 | const arr1 = version1.split('.'); 46 | const arr2 = version2.split('.'); 47 | const len = Math.max(arr1.length, arr2.length); 48 | 49 | for (let i = 0; i < len; i++) { 50 | const n1 = parseInt(arr1[i] || 0); 51 | const n2 = parseInt(arr2[i] || 0); 52 | 53 | if (n1 > n2) { 54 | return 1; 55 | } else if (n1 < n2) { 56 | return -1; 57 | } 58 | } 59 | 60 | return 0; 61 | } -------------------------------------------------------------------------------- /utils/writeFs.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: decong.li 3 | * @Date: 2022/03/05 18:17:51 Saturday 4 | * @LastEditors: decong.li 5 | * @LastEditTime: 2022/08/12 16:13:04 Friday 6 | * @FilePath: /swagger-ts/utils/writeFs.js 7 | */ 8 | 9 | var fs = require('fs'); 10 | const { promise } = require('ora'); 11 | var path = require('path'); 12 | const chalk = require("chalk"); 13 | const { formatGlobalName } = require('./format') 14 | /** 15 | * 模板初始状态 16 | * @param {*} name 名称 17 | * @param {*} dos interface的注释 18 | * @returns 19 | */ 20 | 21 | exports.initDom = function (name, dos) { 22 | name = formatGlobalName(name) 23 | return ` 24 | /** 25 | * ${dos} 26 | */ 27 | export interface ${name} {## 28 | } 29 | ` 30 | } 31 | 32 | exports.defineInitDom = function(name,type){ 33 | return ` 34 | /** 35 | * ${name} --自定义类型 36 | */ 37 | type ${name} = ${type} 38 | ` 39 | } 40 | 41 | 42 | /** 43 | * 请求api的封装 44 | * @param {*} reqData 45 | * @param {*} resData 46 | * @param {*} url 47 | * @returns 48 | */ 49 | exports.InitHttpDom = function (name, reqData, resData, url, dos, method) { 50 | name = formatGlobalName(name) 51 | reqData = formatGlobalName(reqData)||'' 52 | let isPath = false, newUrl = url 53 | if (url.indexOf('}') != -1) { 54 | isPath = true 55 | newUrl = url.replace(/\{[^\)]*\}/g, "") 56 | } 57 | if(reqData){ 58 | if(reqData=='Any'){ 59 | reqData = 'data: any' 60 | }else{ 61 | reqData = 'data: types.' + reqData 62 | } 63 | } 64 | return ` 65 | /** 66 | * ${dos} 67 | */ 68 | export const ${name} = (${isPath ? 'id: string | number, data: any' : reqData}) => { 69 | return HttpRequest().${method}<${resData}>({ 70 | url: '${newUrl}'${isPath ? '+ id' : ''}${reqData?',\n data: data':''} 71 | }) 72 | } 73 | ` 74 | } 75 | //创建文件夹 76 | exports.mkdirs = function(dir){ 77 | return new Promise((resolve)=>{ 78 | // var fliename = path.join(__dirname,`./${dir}`); 79 | // console.log(fliename) 80 | fs.mkdir(`./${dir}`,{recursive:true},(err)=>{ 81 | if(err){ 82 | throw err; 83 | }else{ 84 | resolve('ok') 85 | } 86 | }); 87 | }) 88 | } 89 | 90 | // 写入文件 91 | exports.WriteFile = function (FilePath, obj) { 92 | fs.writeFile(FilePath, obj, { 'flag': 'w+' }, function (err) { 93 | if (err) { 94 | throw err; 95 | } 96 | }) 97 | } 98 | 99 | // 初始模板 100 | 101 | exports.apiInitDom = function(path){ 102 | return ` 103 | import * as types from './../swagger-utils/${path}' 104 | import { HttpRequest } from './../main' \n 105 | type integer = number \n 106 | ` 107 | } 108 | 109 | //读取文件 110 | exports.readFile = function(url){ 111 | return new Promise((resolve,reject)=>{ 112 | fs.readFile(`${url}`, "utf8", (err, data) => { 113 | if (err) { 114 | reject(err) 115 | console.log(chalk.red(err)); 116 | } 117 | resolve(data) 118 | }) 119 | }) 120 | } --------------------------------------------------------------------------------