├── .gitignore ├── README.md ├── lerna.json ├── package-lock.json ├── package.json └── packages ├── core ├── README.md ├── __tests__ │ └── core.test.js ├── bin │ └── imooc-cli.js ├── libs │ ├── const.js │ └── index.js ├── package-lock.json └── package.json ├── init ├── README.md ├── __tests__ │ └── init.test.js ├── lib │ ├── getProjectTemplate.js │ └── index.js ├── package-lock.json └── package.json ├── publish ├── README.md ├── __tests__ │ └── publish.test.js ├── lib │ └── index.js ├── package-lock.json └── package.json ├── replace ├── README.md ├── __tests__ │ └── replace.test.js ├── lib │ └── index.js ├── package-lock.json └── package.json └── utils ├── README.md ├── __tests__ └── utils.test.js ├── lib ├── Build │ ├── CloudBuild.js │ ├── getOSSFile.js │ ├── getOSSProject.js │ └── parse.js ├── Git │ ├── ComponentRequest.js │ ├── Git.js │ ├── GitServer.js │ ├── Gitee.js │ ├── GiteeRequest.js │ ├── Github.js │ └── GithubRequest.js ├── Locale │ ├── en_us.js │ ├── getEnvLocale.js │ ├── loadLocale.js │ └── zh_cn.js ├── Package.js ├── ejs.js ├── file.js ├── formatPath.js ├── index.js ├── inquirer.js ├── log.js ├── npm.js ├── request.js ├── spinner.js └── terminalLink.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea/ 3 | node_modules/ 4 | packages/**/node_modules 5 | *.log 6 | demo 7 | imooc 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 慕课网前端统一研发脚手架 2 | 3 | ## About 4 | 5 | 慕课网前端架构师课程专属脚手架 6 | 7 | ## Getting Started 8 | 9 | ### 安装: 10 | 11 | ```bash 12 | npm install -g @imooc-cli/core 13 | ``` 14 | 15 | ### 创建项目 16 | 17 | 项目/组件初始化 18 | 19 | ```bash 20 | imooc-cli init 21 | ``` 22 | 23 | 强制清空当前文件夹 24 | 25 | ```bash 26 | imooc-cli init --force 27 | ``` 28 | 29 | ### 发布项目 30 | 31 | 发布项目/组件 32 | 33 | ```bash 34 | imooc-cli publish 35 | ``` 36 | 37 | 强制更新所有缓存 38 | 39 | ```bash 40 | imooc-cli publish --force 41 | ``` 42 | 43 | 正式发布 44 | 45 | ```bash 46 | imooc-cli publish --prod 47 | ``` 48 | 49 | 手动指定build命令 50 | 51 | ```bash 52 | imooc-cli publish --buildCmd "npm run build:test" 53 | ``` 54 | 55 | 56 | ## More 57 | 58 | 清空本地缓存: 59 | 60 | ```bash 61 | imooc-cli clean 62 | ``` 63 | 64 | DEBUG 模式: 65 | 66 | ```bash 67 | imooc-cli --debug 68 | ``` 69 | 70 | 调试本地包: 71 | 72 | ```bash 73 | imooc-cli init --packagePath /Users/sam/Desktop/imooc-cli/packages/init/ 74 | ``` 75 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": [ 3 | "packages/*" 4 | ], 5 | "version": "1.1.2" 6 | } 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "root", 3 | "private": true, 4 | "workspaces": [ 5 | "packages/" 6 | ], 7 | "devDependencies": { 8 | "lerna": "^3.20.2" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/core/README.md: -------------------------------------------------------------------------------- 1 | # 慕课网前端统一研发脚手架 2 | 3 | ## About 4 | 5 | 慕课网前端架构师课程专属脚手架 6 | 7 | ## Getting Started 8 | 9 | 安装: 10 | 11 | ```bash 12 | npm install -g @imooc-cli/core 13 | # OR 14 | yarn global add @imooc-cli/core 15 | ``` 16 | 17 | 创建项目 18 | 19 | ```bash 20 | imooc-cli init 21 | ``` 22 | 23 | 发布项目 24 | 25 | ```bash 26 | imooc-cli publish 27 | ``` 28 | 29 | ## More 30 | 31 | 清空缓存: 32 | 33 | ```bash 34 | imooc-cli clean 35 | ``` 36 | 37 | DEBUG 模式: 38 | 39 | ```bash 40 | imooc-cli --debug 41 | ``` 42 | 43 | 指定本地包: 44 | 45 | ```bash 46 | imooc-cli init --packagePath /Users/sam/Desktop/imooc-cli/packages/init/ 47 | ``` 48 | -------------------------------------------------------------------------------- /packages/core/__tests__/core.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const core = require('..'); 4 | 5 | describe('@imooc-cli/core', () => { 6 | it('needs tests'); 7 | }); 8 | -------------------------------------------------------------------------------- /packages/core/bin/imooc-cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require('../libs')(); 4 | -------------------------------------------------------------------------------- /packages/core/libs/const.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | LOWEST_NODE_VERSION: '11.0.0', 3 | DEFAULT_CLI_HOME: '.imooc-cli', 4 | NPM_NAME: '@imooc-cli/core', 5 | DEPENDENCIES_PATH: 'dependencies', 6 | }; 7 | -------------------------------------------------------------------------------- /packages/core/libs/index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const fse = require('fs-extra'); 4 | const program = require('commander'); 5 | const colors = require('colors/safe'); 6 | const userHome = require('user-home'); 7 | const semver = require('semver'); 8 | const { log, npm, Package, exec, locale } = require('@imooc-cli/utils'); 9 | const packageConfig = require('../package'); 10 | 11 | const { 12 | LOWEST_NODE_VERSION, 13 | DEFAULT_CLI_HOME, 14 | NPM_NAME, 15 | DEPENDENCIES_PATH, 16 | } = require('../libs/const'); 17 | 18 | module.exports = cli; 19 | 20 | let args; 21 | let config; 22 | 23 | async function cli() { 24 | try { 25 | await prepare(); 26 | registerCommand(); 27 | } catch (e) { 28 | log.error(e.message); 29 | } 30 | } 31 | 32 | function registerCommand() { 33 | program.version(packageConfig.version).usage(' [options]'); 34 | 35 | program 36 | .command('learn') 37 | .description('访问课程链接') 38 | .action(() => { 39 | log.success('欢迎学习', '慕课网前端架构师课程'); 40 | log.success('课程链接', 'https://coding.imooc.com/class/445.html'); 41 | log.success('课程介绍', '小宇宙燃烧吧'); 42 | log.success('作者介绍', 'Sam@2020'); 43 | }); 44 | 45 | program 46 | .command('init [type]') 47 | .description('项目初始化') 48 | .option('--packagePath ', '手动指定init包路径') 49 | .option('--force', '覆盖当前路径文件(谨慎使用)') 50 | .action(async (type, { packagePath, force }) => { 51 | const packageName = '@imooc-cli/init'; 52 | const packageVersion = '1.0.0'; 53 | await execCommand({ packagePath, packageName, packageVersion }, { type, force }); 54 | }); 55 | 56 | program 57 | .command('publish') 58 | .description('项目发布') 59 | .option('--packagePath ', '手动指定publish包路径') 60 | .option('--refreshToken', '强制更新git token信息') 61 | .option('--refreshOwner', '强制更新git owner信息') 62 | .option('--refreshServer', '强制更新git server信息') 63 | .option('--force', '强制更新所有缓存信息') 64 | .option('--prod', '正式发布') 65 | .option('--keepCache', '保留缓存') 66 | .option('--cnpm', '使用cnpm') 67 | .option('--buildCmd ', '手动指定build命令') 68 | .option('--sshUser ', '模板服务端用户名') 69 | .option('--sshIp ', '模板服务器IP或域名') 70 | .option('--sshPath ', '模板服务器上传路径') 71 | .action(async ({ 72 | packagePath, 73 | refreshToken, 74 | refreshOwner, 75 | refreshServer, 76 | force, 77 | prod, 78 | sshUser, 79 | sshIp, 80 | sshPath, 81 | keepCache, 82 | cnpm, 83 | buildCmd, 84 | }) => { 85 | const packageName = '@imooc-cli/publish'; 86 | const packageVersion = '1.0.0'; 87 | if (force) { 88 | refreshToken = true; 89 | refreshOwner = true; 90 | refreshServer = true; 91 | } 92 | await execCommand({ packagePath, packageName, packageVersion }, { 93 | refreshToken, 94 | refreshOwner, 95 | refreshServer, 96 | prod, 97 | sshUser, 98 | sshIp, 99 | sshPath, 100 | keepCache, 101 | cnpm, 102 | buildCmd, 103 | }); 104 | }); 105 | 106 | program 107 | .command('replace') 108 | .description('作业网站优化') 109 | .option('--packagePath ', '手动指定replace包路径') 110 | .option('--region ', 'oss region') 111 | .option('--bucket ', 'oss bucket') 112 | .option('--ossAccessKey ', 'oss accessKey') 113 | .option('--ossSecretKey ', 'oss secretKey') 114 | .action(async ({ packagePath, region, bucket, ossAccessKey, ossSecretKey }) => { 115 | const packageName = '@imooc-cli/replace'; 116 | const packageVersion = '1.0.0'; 117 | await execCommand({ packagePath, packageName, packageVersion }, { region, bucket, ossAccessKey, ossSecretKey }); 118 | }); 119 | 120 | program 121 | .command('clean') 122 | .description('清空缓存文件') 123 | .option('-a, --all', '清空全部') 124 | .option('-d, --dep', '清空依赖文件') 125 | .action((options) => { 126 | log.notice('开始清空缓存文件'); 127 | if (options.all) { 128 | cleanAll(); 129 | } else if (options.dep) { 130 | const depPath = path.resolve(config.cliHome, DEPENDENCIES_PATH); 131 | if (fs.existsSync(depPath)) { 132 | fse.emptyDirSync(depPath); 133 | log.success('清空依赖文件成功', depPath); 134 | } else { 135 | log.success('文件夹不存在', depPath); 136 | } 137 | } else { 138 | cleanAll(); 139 | } 140 | }); 141 | 142 | program 143 | .option('--debug', '打开调试模式') 144 | .parse(process.argv); 145 | 146 | if (args._.length < 1) { 147 | program.outputHelp(); 148 | console.log(); 149 | } 150 | } 151 | 152 | async function execCommand({ packagePath, packageName, packageVersion }, extraOptions) { 153 | let rootFile; 154 | try { 155 | if (packagePath) { 156 | const execPackage = new Package({ 157 | targetPath: packagePath, 158 | storePath: packagePath, 159 | name: packageName, 160 | version: packageVersion, 161 | }); 162 | rootFile = execPackage.getRootFilePath(true); 163 | } else { 164 | const { cliHome } = config; 165 | const packageDir = `${DEPENDENCIES_PATH}`; 166 | const targetPath = path.resolve(cliHome, packageDir); 167 | const storePath = path.resolve(targetPath, 'node_modules'); 168 | const initPackage = new Package({ 169 | targetPath, 170 | storePath, 171 | name: packageName, 172 | version: packageVersion, 173 | }); 174 | if (await initPackage.exists()) { 175 | await initPackage.update(); 176 | } else { 177 | await initPackage.install(); 178 | } 179 | rootFile = initPackage.getRootFilePath(); 180 | } 181 | const _config = Object.assign({}, config, extraOptions, { 182 | debug: args.debug, 183 | }); 184 | if (fs.existsSync(rootFile)) { 185 | const code = `require('${rootFile}')(${JSON.stringify(_config)})`; 186 | const p = exec('node', ['-e', code], { 'stdio': 'inherit' }); 187 | p.on('error', e => { 188 | log.verbose('命令执行失败:', e); 189 | handleError(e); 190 | process.exit(1); 191 | }); 192 | p.on('exit', c => { 193 | log.verbose('命令执行成功:', c); 194 | process.exit(c); 195 | }); 196 | } else { 197 | throw new Error('入口文件不存在,请重试!'); 198 | } 199 | } catch (e) { 200 | log.error(e.message); 201 | } 202 | } 203 | 204 | function handleError(e) { 205 | if (args.debug) { 206 | log.error('Error:', e.stack); 207 | } else { 208 | log.error('Error:', e.message); 209 | } 210 | process.exit(1); 211 | } 212 | 213 | function cleanAll() { 214 | if (fs.existsSync(config.cliHome)) { 215 | fse.emptyDirSync(config.cliHome); 216 | log.success('清空全部缓存文件成功', config.cliHome); 217 | } else { 218 | log.success('文件夹不存在', config.cliHome); 219 | } 220 | } 221 | 222 | async function prepare() { 223 | checkPkgVersion(); // 检查当前运行版本 224 | checkNodeVersion(); // 检查 node 版本 225 | checkRoot(); // 检查是否为 root 启动 226 | checkUserHome(); // 检查用户主目录 227 | checkInputArgs(); // 检查用户输入参数 228 | checkEnv(); // 检查环境变量 229 | await checkGlobalUpdate(); // 检查工具是否需要更新 230 | } 231 | 232 | async function checkGlobalUpdate() { 233 | log.verbose('检查 imooc-cli 最新版本'); 234 | const currentVersion = packageConfig.version; 235 | const lastVersion = await npm.getNpmLatestSemverVersion(NPM_NAME, currentVersion); 236 | if (lastVersion && semver.gt(lastVersion, currentVersion)) { 237 | log.warn(colors.yellow(`请手动更新 ${NPM_NAME},当前版本:${packageConfig.version},最新版本:${lastVersion} 238 | 更新命令: npm install -g ${NPM_NAME}`)); 239 | } 240 | } 241 | 242 | function checkEnv() { 243 | log.verbose('开始检查环境变量'); 244 | const dotenv = require('dotenv'); 245 | dotenv.config({ 246 | path: path.resolve(userHome, '.env'), 247 | }); 248 | config = createCliConfig(); // 准备基础配置 249 | log.verbose('环境变量', config); 250 | } 251 | 252 | function createCliConfig() { 253 | const cliConfig = { 254 | home: userHome, 255 | }; 256 | if (process.env.CLI_HOME) { 257 | cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME); 258 | } else { 259 | cliConfig['cliHome'] = path.join(userHome, DEFAULT_CLI_HOME); 260 | } 261 | return cliConfig; 262 | } 263 | 264 | function checkInputArgs() { 265 | log.verbose('开始校验输入参数'); 266 | const minimist = require('minimist'); 267 | args = minimist(process.argv.slice(2)); // 解析查询参数 268 | checkArgs(args); // 校验参数 269 | log.verbose('输入参数', args); 270 | } 271 | 272 | function checkArgs(args) { 273 | if (args.debug) { 274 | process.env.LOG_LEVEL = 'verbose'; 275 | } else { 276 | process.env.LOG_LEVEL = 'info'; 277 | } 278 | log.level = process.env.LOG_LEVEL; 279 | } 280 | 281 | function checkUserHome() { 282 | if (!userHome || !fs.existsSync(userHome)) { 283 | throw new Error(colors.red('当前登录用户主目录不存在!')); 284 | } 285 | } 286 | 287 | function checkRoot() { 288 | const rootCheck = require('root-check'); 289 | rootCheck(colors.red('请避免使用 root 账户启动本应用')); 290 | } 291 | 292 | function checkNodeVersion() { 293 | const semver = require('semver'); 294 | if (!semver.gte(process.version, LOWEST_NODE_VERSION)) { 295 | throw new Error(colors.red(`imooc-cli 需要安装 v${LOWEST_NODE_VERSION} 以上版本的 Node.js`)); 296 | } 297 | } 298 | 299 | function checkPkgVersion() { 300 | log.notice('cli', packageConfig.version); 301 | log.success(locale.welcome); 302 | } 303 | -------------------------------------------------------------------------------- /packages/core/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@imooc-cli/core", 3 | "version": "1.1.5", 4 | "description": "imooc-cli core", 5 | "author": "sam <247765564@qq.com>", 6 | "homepage": "https://github.com/sam9831/imooc-cli#readme", 7 | "license": "ISC", 8 | "main": "bin/imooc-cli.js", 9 | "bin": { 10 | "imooc-cli": "bin/imooc-cli.js" 11 | }, 12 | "directories": { 13 | "lib": "libs", 14 | "test": "__tests__" 15 | }, 16 | "files": [ 17 | "libs" 18 | ], 19 | "publishConfig": { 20 | "access": "public" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/sam9831/imooc-cli.git" 25 | }, 26 | "scripts": { 27 | "test": "mocha __tests__/core.test.js" 28 | }, 29 | "bugs": { 30 | "url": "https://github.com/sam9831/imooc-cli/issues" 31 | }, 32 | "devDependencies": { 33 | "mocha": "^8.1.3" 34 | }, 35 | "dependencies": { 36 | "@imooc-cli/utils": "^1.1.2", 37 | "colors": "^1.4.0", 38 | "commander": "^6.1.0", 39 | "dotenv": "^8.2.0", 40 | "minimist": "^1.2.5", 41 | "npminstall": "^4.9.1", 42 | "root-check": "^1.0.0", 43 | "semver": "^7.3.2", 44 | "user-home": "^2.0.0" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /packages/init/README.md: -------------------------------------------------------------------------------- 1 | # 慕课网前端统一研发脚手架 2 | 3 | ## About 4 | 5 | 慕课网前端架构师课程专属脚手架 6 | 7 | ## Getting Started 8 | 9 | 安装: 10 | 11 | ```bash 12 | npm install -g @imooc-cli/core 13 | # OR 14 | yarn global add @imooc-cli/core 15 | ``` 16 | 17 | 创建项目 18 | 19 | ```bash 20 | imooc-cli init 21 | ``` 22 | 23 | 发布项目 24 | 25 | ```bash 26 | imooc-cli publish 27 | ``` 28 | 29 | ## More 30 | 31 | DEBUG 模式: 32 | 33 | ```bash 34 | imooc-cli --debug 35 | ``` 36 | 37 | 指定本地包: 38 | 39 | ```bash 40 | imooc-cli init --packagePath /Users/sam/Desktop/imooc-cli/packages/init/ 41 | ``` 42 | -------------------------------------------------------------------------------- /packages/init/__tests__/init.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const init = require('..'); 4 | 5 | describe('@imooc-cli/init', () => { 6 | it('needs tests'); 7 | }); 8 | -------------------------------------------------------------------------------- /packages/init/lib/getProjectTemplate.js: -------------------------------------------------------------------------------- 1 | const { request } = require('@imooc-cli/utils'); 2 | 3 | module.exports = function() { 4 | return request({ 5 | url: '/project/template', 6 | }); 7 | }; 8 | -------------------------------------------------------------------------------- /packages/init/lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const fse = require('fs-extra'); 5 | const { log, inquirer, spinner, Package, sleep, exec, formatName, formatClassName, ejs } = require('@imooc-cli/utils'); 6 | const getProjectTemplate = require('./getProjectTemplate'); 7 | 8 | const COMPONENT_FILE = '.componentrc'; 9 | const TYPE_PROJECT = 'project'; 10 | const TYPE_COMPONENT = 'component'; 11 | const TEMPLATE_TYPE_NORMAL = 'normal'; 12 | const TEMPLATE_TYPE_CUSTOM = 'custom'; 13 | 14 | const DEFAULT_TYPE = TYPE_PROJECT; 15 | 16 | async function init(options) { 17 | try { 18 | // 设置 targetPath 19 | let targetPath = process.cwd(); 20 | if (!options.targetPath) { 21 | options.targetPath = targetPath; 22 | } 23 | log.verbose('init', options); 24 | // 完成项目初始化的准备和校验工作 25 | const result = await prepare(options); 26 | if (!result) { 27 | log.info('创建项目终止'); 28 | return; 29 | } 30 | // 获取项目模板列表 31 | const { templateList, project } = result; 32 | // 缓存项目模板文件 33 | const template = await downloadTemplate(templateList, options); 34 | log.verbose('template', template); 35 | if (template.type === TEMPLATE_TYPE_NORMAL) { 36 | // 安装项目模板 37 | await installTemplate(template, project, options); 38 | } else if (template.type === TEMPLATE_TYPE_CUSTOM) { 39 | await installCustomTemplate(template, project, options); 40 | } else { 41 | throw new Error('未知的模板类型!'); 42 | } 43 | } catch (e) { 44 | if (options.debug) { 45 | log.error('Error:', e.stack); 46 | } else { 47 | log.error('Error:', e.message); 48 | } 49 | } finally { 50 | process.exit(0); 51 | } 52 | } 53 | 54 | async function installCustomTemplate(template, ejsData, options) { 55 | const pkgPath = path.resolve(template.sourcePath, 'package.json'); 56 | const pkg = fse.readJsonSync(pkgPath); 57 | const rootFile = path.resolve(template.sourcePath, pkg.main); 58 | if (!fs.existsSync(rootFile)) { 59 | throw new Error('入口文件不存在!'); 60 | } 61 | log.notice('开始执行自定义模板'); 62 | const targetPath = options.targetPath; 63 | await execCustomTemplate(rootFile, { 64 | targetPath, 65 | data: ejsData, 66 | template, 67 | }); 68 | log.success('自定义模板执行成功'); 69 | } 70 | 71 | function execCustomTemplate(rootFile, options) { 72 | const code = `require('${rootFile}')(${JSON.stringify(options)})`; 73 | return new Promise((resolve, reject) => { 74 | const p = exec('node', ['-e', code], { 'stdio': 'inherit' }); 75 | p.on('error', e => { 76 | reject(e); 77 | }); 78 | p.on('exit', c => { 79 | resolve(c); 80 | }); 81 | }); 82 | } 83 | 84 | async function npminstall(targetPath) { 85 | return new Promise((resolve, reject) => { 86 | const p = exec('npm', ['install', '--registry=https://registry.npm.taobao.org'], { stdio: 'inherit', cwd: targetPath }); 87 | p.on('error', e => { 88 | reject(e); 89 | }); 90 | p.on('exit', c => { 91 | resolve(c); 92 | }); 93 | }); 94 | } 95 | 96 | async function execStartCommand(targetPath, startCommand) { 97 | return new Promise((resolve, reject) => { 98 | const p = exec(startCommand[0], startCommand.slice(1), { stdio: 'inherit', cwd: targetPath }); 99 | p.on('error', e => { 100 | reject(e); 101 | }); 102 | p.on('exit', c => { 103 | resolve(c); 104 | }); 105 | }); 106 | } 107 | 108 | // 如果是组件项目,则创建组件相关文件 109 | async function createComponentFile(template, data, dir) { 110 | if (template.tag.includes(TYPE_COMPONENT)) { 111 | const componentData = { 112 | ...data, 113 | buildPath: template.buildPath, 114 | examplePath: template.examplePath, 115 | npmName: template.npmName, 116 | npmVersion: template.version, 117 | } 118 | const componentFile = path.resolve(dir, COMPONENT_FILE); 119 | fs.writeFileSync(componentFile, JSON.stringify(componentData)); 120 | } 121 | } 122 | 123 | async function installTemplate(template, ejsData, options) { 124 | // 安装模板 125 | let spinnerStart = spinner(`正在安装模板...`); 126 | await sleep(1000); 127 | const sourceDir = template.path; 128 | const targetDir = options.targetPath; 129 | fse.ensureDirSync(sourceDir); 130 | fse.ensureDirSync(targetDir); 131 | fse.copySync(sourceDir, targetDir); 132 | spinnerStart.stop(true); 133 | log.success('模板安装成功'); 134 | // ejs 模板渲染 135 | const ejsIgnoreFiles = [ 136 | '**/node_modules/**', 137 | '**/.git/**', 138 | '**/.vscode/**', 139 | '**/.DS_Store', 140 | ]; 141 | if (template.ignore) { 142 | ejsIgnoreFiles.push(...template.ignore); 143 | } 144 | log.verbose('ejsData', ejsData); 145 | await ejs(targetDir, ejsData, { 146 | ignore: ejsIgnoreFiles, 147 | }); 148 | // 如果是组件,则进行特殊处理 149 | await createComponentFile(template, ejsData, targetDir); 150 | // 安装依赖文件 151 | log.notice('开始安装依赖'); 152 | await npminstall(targetDir); 153 | log.success('依赖安装成功'); 154 | // 启动代码 155 | if (template.startCommand) { 156 | log.notice('开始执行启动命令'); 157 | const startCommand = template.startCommand.split(' '); 158 | await execStartCommand(targetDir, startCommand); 159 | } 160 | } 161 | 162 | async function downloadTemplate(templateList, options) { 163 | // 用户交互选择 164 | const templateName = await inquirer({ 165 | choices: createTemplateChoice(templateList), 166 | message: '请选择项目模板', 167 | }); 168 | log.verbose('template', templateName); 169 | const selectedTemplate = templateList.find(item => item.npmName === templateName); 170 | log.verbose('selected template', selectedTemplate); 171 | const { cliHome } = options; 172 | const targetPath = path.resolve(cliHome, 'template'); 173 | // 基于模板生成 Package 对象 174 | const templatePkg = new Package({ 175 | targetPath, 176 | storePath: targetPath, 177 | name: selectedTemplate.npmName, 178 | version: selectedTemplate.version, 179 | }); 180 | // 如果模板不存在则进行下载 181 | if (!await templatePkg.exists()) { 182 | let spinnerStart = spinner(`正在下载模板...`); 183 | await sleep(1000); 184 | await templatePkg.install(); 185 | spinnerStart.stop(true); 186 | log.success('下载模板成功'); 187 | } else { 188 | log.notice('模板已存在', `${selectedTemplate.npmName}@${selectedTemplate.version}`); 189 | log.notice('模板路径', `${targetPath}`); 190 | let spinnerStart = spinner(`开始更新模板...`); 191 | await sleep(1000); 192 | await templatePkg.update(); 193 | spinnerStart.stop(true); 194 | log.success('更新模板成功'); 195 | } 196 | // 生成模板路径 197 | const templateSourcePath = templatePkg.npmFilePath; 198 | const templatePath = path.resolve(templateSourcePath, 'template'); 199 | log.verbose('template path', templatePath); 200 | if (!fs.existsSync(templatePath)) { 201 | throw new Error(`[${templateName}]项目模板不存在!`); 202 | } 203 | const template = { 204 | ...selectedTemplate, 205 | path: templatePath, 206 | sourcePath: templateSourcePath, 207 | }; 208 | return template; 209 | } 210 | 211 | async function prepare(options) { 212 | let fileList = fs.readdirSync(process.cwd()); 213 | fileList = fileList.filter(file => ['node_modules', '.git', '.DS_Store'].indexOf(file) < 0); 214 | log.verbose('fileList', fileList); 215 | let continueWhenDirNotEmpty = true; 216 | if (fileList && fileList.length > 0) { 217 | continueWhenDirNotEmpty = await inquirer({ 218 | type: 'confirm', 219 | message: '当前文件夹不为空,是否继续创建项目?', 220 | defaultValue: false, 221 | }); 222 | } 223 | if (!continueWhenDirNotEmpty) { 224 | return; 225 | } 226 | if (options.force) { 227 | const targetDir = options.targetPath; 228 | const confirmEmptyDir = await inquirer({ 229 | type: 'confirm', 230 | message: '是否确认清空当下目录下的文件', 231 | defaultValue: false, 232 | }); 233 | if (confirmEmptyDir) { 234 | fse.emptyDirSync(targetDir); 235 | } 236 | } 237 | let initType = await getInitType(); 238 | log.verbose('initType', initType); 239 | let templateList = await getProjectTemplate(); 240 | if (!templateList || templateList.length === 0) { 241 | throw new Error('项目模板列表获取失败'); 242 | } 243 | let projectName = ''; 244 | let className = ''; 245 | while (!projectName) { 246 | projectName = await getProjectName(initType); 247 | if (projectName) { 248 | projectName = formatName(projectName); 249 | className = formatClassName(projectName); 250 | } 251 | log.verbose('name', projectName); 252 | log.verbose('className', className); 253 | } 254 | let version = '1.0.0'; 255 | do { 256 | version = await getProjectVersion(version, initType); 257 | log.verbose('version', version); 258 | } while (!version); 259 | if (initType === TYPE_PROJECT) { 260 | templateList = templateList.filter(item => item.tag.includes('project')); 261 | return { 262 | templateList, 263 | project: { 264 | name: projectName, 265 | className, 266 | version, 267 | }, 268 | }; 269 | } else { 270 | templateList = templateList.filter(item => item.tag.includes('component')); 271 | let description = ''; 272 | while (!description) { 273 | description = await getComponentDescription(); 274 | log.verbose('description', description); 275 | } 276 | return { 277 | templateList, 278 | project: { 279 | name: projectName, 280 | className, 281 | version, 282 | description, 283 | }, 284 | }; 285 | } 286 | } 287 | 288 | function getComponentDescription() { 289 | return inquirer({ 290 | type: 'string', 291 | message: '请输入组件的描述信息', 292 | defaultValue: '', 293 | }); 294 | } 295 | 296 | function getProjectVersion(defaultVersion, initType) { 297 | return inquirer({ 298 | type: 'string', 299 | message: initType === TYPE_PROJECT ? '请输入项目版本号' : '请输入组件版本号', 300 | defaultValue: defaultVersion, 301 | }); 302 | } 303 | 304 | function getInitType() { 305 | return inquirer({ 306 | type: 'list', 307 | choices: [{ 308 | name: '项目', 309 | value: TYPE_PROJECT, 310 | }, { 311 | name: '组件', 312 | value: TYPE_COMPONENT, 313 | }], 314 | message: '请选择初始化类型', 315 | defaultValue: DEFAULT_TYPE, 316 | }); 317 | } 318 | 319 | function getProjectName(initType) { 320 | return inquirer({ 321 | type: 'string', 322 | message: initType === TYPE_PROJECT ? '请输入项目名称' : '请输入组件名称', 323 | defaultValue: '', 324 | }); 325 | } 326 | 327 | function createTemplateChoice(list) { 328 | return list.map(item => ({ 329 | value: item.npmName, 330 | name: item.name, 331 | })); 332 | } 333 | 334 | module.exports = init; 335 | -------------------------------------------------------------------------------- /packages/init/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@imooc-cli/init", 3 | "version": "1.1.2", 4 | "description": "imooc-cli init", 5 | "author": "sam <247765564@qq.com>", 6 | "homepage": "https://github.com/sam9831/imooc-cli#readme", 7 | "license": "ISC", 8 | "main": "lib/index.js", 9 | "directories": { 10 | "lib": "lib", 11 | "test": "__tests__" 12 | }, 13 | "files": [ 14 | "lib" 15 | ], 16 | "publishConfig": { 17 | "access": "public" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "git+https://github.com/sam9831/imooc-cli.git" 22 | }, 23 | "scripts": { 24 | "test": "mocha __tests__/init.test.js" 25 | }, 26 | "bugs": { 27 | "url": "https://github.com/sam9831/imooc-cli/issues" 28 | }, 29 | "dependencies": { 30 | "@imooc-cli/utils": "^1.1.1", 31 | "fs-extra": "^9.0.1" 32 | }, 33 | "devDependencies": { 34 | "mocha": "^8.1.3" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /packages/publish/README.md: -------------------------------------------------------------------------------- 1 | # 慕课网前端统一研发脚手架 2 | 3 | ## About 4 | 5 | 慕课网前端架构师课程专属脚手架 6 | 7 | ## Getting Started 8 | 9 | 安装: 10 | 11 | ```bash 12 | npm install -g @imooc-cli/core 13 | # OR 14 | yarn global add @imooc-cli/core 15 | ``` 16 | 17 | 创建项目 18 | 19 | ```bash 20 | imooc-cli init 21 | ``` 22 | 23 | 发布项目 24 | 25 | ```bash 26 | imooc-cli publish 27 | ``` 28 | 29 | ## More 30 | 31 | DEBUG 模式: 32 | 33 | ```bash 34 | imooc-cli --debug 35 | ``` 36 | 37 | 指定本地包: 38 | 39 | ```bash 40 | imooc-cli init --packagePath /Users/sam/Desktop/imooc-cli/packages/init/ 41 | ``` 42 | -------------------------------------------------------------------------------- /packages/publish/__tests__/publish.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const publish = require('..'); 4 | 5 | describe('@imooc-cli/publish', () => { 6 | it('needs tests'); 7 | }); 8 | -------------------------------------------------------------------------------- /packages/publish/lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const fse = require('fs-extra'); 6 | const colors = require('colors'); 7 | const { log, Git } = require('@imooc-cli/utils'); 8 | 9 | async function publish(options) { 10 | log.verbose('publish', options); 11 | try { 12 | const startTime = new Date().getTime(); 13 | // 初始化检查 14 | prepare(options); 15 | // 本地初始化 16 | // 检查项目的基本信息 17 | const projectInfo = checkProjectInfo(); 18 | const git = new Git(projectInfo, options); 19 | console.log(); 20 | log.info(colors.red('==='), colors.gray('git配置检查'), colors.red('===')); 21 | await git.prepare(); 22 | console.log(); 23 | log.info(colors.red('==='), colors.gray('git自动提交'), colors.red('===')); 24 | await git.commit(); 25 | console.log(); 26 | log.info(colors.red('==='), colors.gray('云构建+云发布'), colors.red('===')); 27 | await git.publish(); 28 | const endTime = new Date().getTime(); 29 | log.verbose('elapsed time', new Date(startTime), new Date(endTime)); 30 | log.info('本次发布耗时:', Math.floor((endTime - startTime) / 1000) + '秒'); 31 | } catch (e) { 32 | if (options.debug) { 33 | log.error('Error:', e.stack); 34 | } else { 35 | log.error('Error:', e.message); 36 | } 37 | } 38 | } 39 | 40 | function prepare(options) { 41 | if (options.buildCmd) { 42 | const { buildCmd } = options; 43 | if (!buildCmd.startsWith('npm run build')) { 44 | throw new Error('buildCmd参数不符合规范,正确格式:npm run build:xxx'); 45 | } 46 | } 47 | } 48 | 49 | function checkProjectInfo() { 50 | const projectPath = process.cwd(); 51 | const pkgPath = path.resolve(projectPath, 'package.json'); 52 | log.verbose('package.json', pkgPath); 53 | if (!fs.existsSync(pkgPath)) { 54 | throw new Error('package.json不存在'); 55 | } 56 | const pkg = fse.readJsonSync(pkgPath); 57 | const { name, version } = pkg; 58 | log.verbose('project', name, version); 59 | return { name, version, dir: projectPath }; 60 | } 61 | 62 | module.exports = publish; 63 | -------------------------------------------------------------------------------- /packages/publish/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@imooc-cli/publish", 3 | "version": "1.1.2", 4 | "description": "> TODO: description", 5 | "author": "sam <247765564@qq.com>", 6 | "homepage": "https://github.com/sam9831/imooc-cli#readme", 7 | "license": "ISC", 8 | "main": "lib/index.js", 9 | "directories": { 10 | "lib": "lib", 11 | "test": "__tests__" 12 | }, 13 | "files": [ 14 | "lib" 15 | ], 16 | "publishConfig": { 17 | "access": "public" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "git+https://github.com/sam9831/imooc-cli.git" 22 | }, 23 | "bugs": { 24 | "url": "https://github.com/sam9831/imooc-cli/issues" 25 | }, 26 | "dependencies": { 27 | "@imooc-cli/utils": "^1.1.2", 28 | "colors": "^1.4.0", 29 | "socket.io-client": "^2.3.1" 30 | }, 31 | "devDependencies": { 32 | "mocha": "^8.1.3" 33 | }, 34 | "scripts": { 35 | "test": "mocha __tests__/publish.test.js" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /packages/replace/README.md: -------------------------------------------------------------------------------- 1 | # `@imooc-cli/replace` 2 | 3 | > TODO: description 4 | 5 | ## Usage 6 | 7 | ``` 8 | const replace = require('@imooc-cli/replace'); 9 | 10 | // TODO: DEMONSTRATE API 11 | ``` 12 | -------------------------------------------------------------------------------- /packages/replace/__tests__/replace.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const replace = require('..'); 4 | 5 | describe('@imooc-cli/replace', () => { 6 | it('needs tests'); 7 | }); 8 | -------------------------------------------------------------------------------- /packages/replace/lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const assert = require('assert'); 6 | const fse = require('fs-extra'); 7 | const glob = require('glob'); 8 | const { log } = require('@imooc-cli/utils'); 9 | 10 | async function replace(params) { 11 | try { 12 | console.log(params); 13 | assert(params.ossAccessKey, 'oss accessKey不能为空!'); 14 | assert(params.ossSecretKey, 'oss secretKey不能为空!'); 15 | log.info('检查是否为打卡项目'); 16 | assert(checkProject() === true, '当前项目不是打卡项目!'); 17 | log.info('遍历images文件夹'); 18 | const imageDirs = await lookAtImages(); 19 | log.info('上传图片至OSS'); 20 | const imageObj = await uploadAllImagesToOSS(imageDirs, params); 21 | log.info('Markdown图片替换'); 22 | await replaceMarkdown(imageObj); 23 | log.info('开始删除图片'); 24 | await removeImage(imageObj); 25 | log.info('执行完毕'); 26 | } catch (e) { 27 | if (process.env.LOG_LEVEL === 'verbose') { 28 | console.error(e); 29 | } else { 30 | log.error(e.message); 31 | } 32 | } 33 | } 34 | 35 | function removeImage(imageObj) { 36 | Object.keys(imageObj).forEach(file => { 37 | const filePath = path.resolve(file); 38 | if (fs.existsSync(filePath)) { 39 | fse.removeSync(filePath); 40 | } 41 | }); 42 | } 43 | 44 | async function replaceMarkdown(imageObj) { 45 | const keys = Object.keys(imageObj); 46 | for (const file of keys) { 47 | const match = file.match(/^docs\/pages\/([^\/]+)\/images\/.+$/); 48 | if (match && match.length > 1) { 49 | const dir = match[1]; 50 | await replaceSingleMarkdown({ 51 | file, 52 | dir, 53 | url: imageObj[file], 54 | }); 55 | } 56 | } 57 | } 58 | 59 | async function replaceSingleMarkdown(params) { 60 | return new Promise((resolve, reject) => { 61 | glob(`docs/pages/${params.dir}/*.md`, { 62 | nodir: true, 63 | }, function(err, files) { 64 | if (err) { 65 | reject(err); 66 | } else { 67 | for (const file of files) { 68 | const dir = path.resolve(file); 69 | const image = path.basename(params.file); 70 | const url = params.url; 71 | let content = fs.readFileSync(dir).toString(); 72 | const reg = new RegExp('!\\[.*\\]\\([^)]*' + image + '\\)', 'g'); 73 | const result = reg.exec(content); 74 | if (result && result.length > 0) { 75 | content = content.replace(reg, '![](' + url + ')'); 76 | fs.writeFileSync(dir, content); 77 | } 78 | } 79 | resolve(files); 80 | } 81 | }); 82 | }); 83 | } 84 | 85 | function checkProject() { 86 | const pkgPath = path.resolve(process.cwd(), 'package.json'); 87 | const src = path.resolve(process.cwd(), 'docs'); 88 | if (fs.existsSync(pkgPath) && fs.existsSync(src)) { 89 | const pkg = require(pkgPath); 90 | if (pkg.name === 'students-learn-task') { 91 | return true; 92 | } 93 | } 94 | return false; 95 | } 96 | 97 | async function lookAtImages() { 98 | return new Promise((resolve, reject) => { 99 | glob('docs/**/images', { 100 | cwd: process.cwd(), 101 | }, function(err, files) { 102 | if (err) { 103 | reject(err); 104 | } else { 105 | resolve(files); 106 | } 107 | }); 108 | }); 109 | } 110 | 111 | async function uploadAllImagesToOSS(imageDirs, params) { 112 | const imageObj = {}; 113 | const results = []; 114 | const oss = require('ali-oss')({ 115 | accessKeyId: params.ossAccessKey, 116 | accessKeySecret: params.ossSecretKey, 117 | bucket: params.bucket || 'imooc-lego-homework', 118 | region: params.region || 'oss-cn-hangzhou', 119 | }); 120 | for (const dir of imageDirs) { 121 | const result = await uploadImageToOSS(dir, oss); 122 | results.push(...result); 123 | } 124 | results.map(item => imageObj[item.key] = item.url); 125 | return imageObj; 126 | } 127 | 128 | async function uploadImageToOSS(imageDir, oss) { 129 | return new Promise((resolve, reject) => { 130 | glob(`${imageDir}/**`, { 131 | nodir: true, 132 | }, async function(err, files) { 133 | if (err) { 134 | reject(err); 135 | } else { 136 | const o = {}; 137 | for (const file of files) { 138 | const localPath = path.resolve(file); 139 | log.info('开始上传[' + localPath + ']...'); 140 | const ossRes = await oss.put(file, localPath); 141 | if (ossRes && ossRes.res.status === 200) { 142 | o[file] = ossRes.url; 143 | } 144 | } 145 | resolve(files.map(file => ({ 146 | key: file, 147 | url: o[file], 148 | }))); 149 | } 150 | }); 151 | }); 152 | } 153 | 154 | module.exports = replace; 155 | -------------------------------------------------------------------------------- /packages/replace/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@imooc-cli/replace", 3 | "version": "1.1.2", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@imooc-cli/replace", 9 | "version": "1.1.2", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@imooc-cli/utils": "^1.1.1", 13 | "ali-oss": "^6.13.2", 14 | "fs-extra": "^9.1.0", 15 | "glob": "^7.1.6" 16 | } 17 | }, 18 | "node_modules/@imooc-cli/utils": { 19 | "version": "1.1.2", 20 | "resolved": "https://registry.npmmirror.com/@imooc-cli/utils/-/utils-1.1.2.tgz", 21 | "integrity": "sha512-VacB4xymeO9687/aShj/4teuApfBv9r5qohxX5YY8eApvL+7nAzlmbzxPzU0s5639YUv8XXpqBERVhp7JxOFug==", 22 | "dependencies": { 23 | "axios": "^0.20.0", 24 | "cli-spinner": "^0.2.10", 25 | "ejs": "^3.1.5", 26 | "fs-extra": "^9.0.1", 27 | "glob": "^7.1.6", 28 | "inquirer": "^7.3.3", 29 | "kebab-case": "^1.0.0", 30 | "lodash": "^4.17.20", 31 | "npminstall": "^4.9.1", 32 | "npmlog": "^4.1.2", 33 | "semver": "^7.3.2", 34 | "simple-git": "^2.20.1", 35 | "socket.io-client": "^2.3.1", 36 | "terminal-link": "^2.1.1", 37 | "url-join": "^4.0.1", 38 | "user-home": "^2.0.0" 39 | } 40 | }, 41 | "node_modules/@imooc-cli/utils/node_modules/semver": { 42 | "version": "7.6.0", 43 | "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz", 44 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 45 | "dependencies": { 46 | "lru-cache": "^6.0.0" 47 | }, 48 | "bin": { 49 | "semver": "bin/semver.js" 50 | }, 51 | "engines": { 52 | "node": ">=10" 53 | } 54 | }, 55 | "node_modules/@kwsites/file-exists": { 56 | "version": "1.1.1", 57 | "resolved": "https://registry.npmmirror.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz", 58 | "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", 59 | "dependencies": { 60 | "debug": "^4.1.1" 61 | } 62 | }, 63 | "node_modules/@kwsites/promise-deferred": { 64 | "version": "1.1.1", 65 | "resolved": "https://registry.npmmirror.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", 66 | "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" 67 | }, 68 | "node_modules/abbrev": { 69 | "version": "1.1.1", 70 | "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", 71 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 72 | }, 73 | "node_modules/address": { 74 | "version": "1.2.2", 75 | "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz", 76 | "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", 77 | "engines": { 78 | "node": ">= 10.0.0" 79 | } 80 | }, 81 | "node_modules/after": { 82 | "version": "0.8.2", 83 | "resolved": "https://registry.npmmirror.com/after/-/after-0.8.2.tgz", 84 | "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==" 85 | }, 86 | "node_modules/agentkeepalive": { 87 | "version": "3.5.2", 88 | "resolved": "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz", 89 | "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", 90 | "dependencies": { 91 | "humanize-ms": "^1.2.1" 92 | }, 93 | "engines": { 94 | "node": ">= 4.0.0" 95 | } 96 | }, 97 | "node_modules/ajv": { 98 | "version": "6.12.6", 99 | "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", 100 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 101 | "dependencies": { 102 | "fast-deep-equal": "^3.1.1", 103 | "fast-json-stable-stringify": "^2.0.0", 104 | "json-schema-traverse": "^0.4.1", 105 | "uri-js": "^4.2.2" 106 | } 107 | }, 108 | "node_modules/ali-oss": { 109 | "version": "6.20.0", 110 | "resolved": "https://registry.npmmirror.com/ali-oss/-/ali-oss-6.20.0.tgz", 111 | "integrity": "sha512-TzFXgGlw81sy2JvcCveSYsa2b2+6kv+HA6WTc+cXg6bu8nUAmVPfncRGbn3x2getSOniOFA+TyGy3V4l3Fks+Q==", 112 | "dependencies": { 113 | "address": "^1.2.2", 114 | "agentkeepalive": "^3.4.1", 115 | "bowser": "^1.6.0", 116 | "copy-to": "^2.0.1", 117 | "dateformat": "^2.0.0", 118 | "debug": "^4.3.4", 119 | "destroy": "^1.0.4", 120 | "end-or-error": "^1.0.1", 121 | "get-ready": "^1.0.0", 122 | "humanize-ms": "^1.2.0", 123 | "is-type-of": "^1.4.0", 124 | "js-base64": "^2.5.2", 125 | "jstoxml": "^2.0.0", 126 | "lodash": "^4.17.21", 127 | "merge-descriptors": "^1.0.1", 128 | "mime": "^2.4.5", 129 | "platform": "^1.3.1", 130 | "pump": "^3.0.0", 131 | "qs": "^6.4.0", 132 | "sdk-base": "^2.0.1", 133 | "stream-http": "2.8.2", 134 | "stream-wormhole": "^1.0.4", 135 | "urllib": "2.41.0", 136 | "utility": "^1.18.0", 137 | "xml2js": "^0.6.2" 138 | }, 139 | "engines": { 140 | "node": ">=8" 141 | } 142 | }, 143 | "node_modules/ansi-escapes": { 144 | "version": "4.3.2", 145 | "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 146 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 147 | "dependencies": { 148 | "type-fest": "^0.21.3" 149 | }, 150 | "engines": { 151 | "node": ">=8" 152 | } 153 | }, 154 | "node_modules/ansi-regex": { 155 | "version": "5.0.1", 156 | "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", 157 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 158 | "engines": { 159 | "node": ">=8" 160 | } 161 | }, 162 | "node_modules/ansi-styles": { 163 | "version": "4.3.0", 164 | "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", 165 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 166 | "dependencies": { 167 | "color-convert": "^2.0.1" 168 | }, 169 | "engines": { 170 | "node": ">=8" 171 | } 172 | }, 173 | "node_modules/any-promise": { 174 | "version": "1.3.0", 175 | "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", 176 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" 177 | }, 178 | "node_modules/aproba": { 179 | "version": "1.2.0", 180 | "resolved": "https://registry.npmmirror.com/aproba/-/aproba-1.2.0.tgz", 181 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 182 | }, 183 | "node_modules/are-we-there-yet": { 184 | "version": "1.1.7", 185 | "resolved": "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", 186 | "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", 187 | "dependencies": { 188 | "delegates": "^1.0.0", 189 | "readable-stream": "^2.0.6" 190 | } 191 | }, 192 | "node_modules/arraybuffer.slice": { 193 | "version": "0.0.7", 194 | "resolved": "https://registry.npmmirror.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 195 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" 196 | }, 197 | "node_modules/asn1": { 198 | "version": "0.2.6", 199 | "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz", 200 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 201 | "dependencies": { 202 | "safer-buffer": "~2.1.0" 203 | } 204 | }, 205 | "node_modules/assert-plus": { 206 | "version": "1.0.0", 207 | "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", 208 | "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", 209 | "engines": { 210 | "node": ">=0.8" 211 | } 212 | }, 213 | "node_modules/async": { 214 | "version": "3.2.5", 215 | "resolved": "https://registry.npmmirror.com/async/-/async-3.2.5.tgz", 216 | "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" 217 | }, 218 | "node_modules/asynckit": { 219 | "version": "0.4.0", 220 | "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", 221 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 222 | }, 223 | "node_modules/at-least-node": { 224 | "version": "1.0.0", 225 | "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", 226 | "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", 227 | "engines": { 228 | "node": ">= 4.0.0" 229 | } 230 | }, 231 | "node_modules/await-event": { 232 | "version": "2.1.0", 233 | "resolved": "https://registry.npmmirror.com/await-event/-/await-event-2.1.0.tgz", 234 | "integrity": "sha512-hADm2dFnyugZnfFoJ0Oug2T9xAT2gFdvxZXXnWUOFsHL+VTCvj4Q7oBOinUYzvAFeAD5HN1YSrP78iS3/SQ7iQ==" 235 | }, 236 | "node_modules/aws-sign2": { 237 | "version": "0.7.0", 238 | "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz", 239 | "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", 240 | "engines": { 241 | "node": "*" 242 | } 243 | }, 244 | "node_modules/aws4": { 245 | "version": "1.12.0", 246 | "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.12.0.tgz", 247 | "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" 248 | }, 249 | "node_modules/axios": { 250 | "version": "0.20.0", 251 | "resolved": "https://registry.npmmirror.com/axios/-/axios-0.20.0.tgz", 252 | "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", 253 | "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", 254 | "dependencies": { 255 | "follow-redirects": "^1.10.0" 256 | } 257 | }, 258 | "node_modules/backo2": { 259 | "version": "1.0.2", 260 | "resolved": "https://registry.npmmirror.com/backo2/-/backo2-1.0.2.tgz", 261 | "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" 262 | }, 263 | "node_modules/balanced-match": { 264 | "version": "1.0.2", 265 | "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", 266 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 267 | }, 268 | "node_modules/base64-arraybuffer": { 269 | "version": "0.1.4", 270 | "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", 271 | "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==", 272 | "engines": { 273 | "node": ">= 0.6.0" 274 | } 275 | }, 276 | "node_modules/bcrypt-pbkdf": { 277 | "version": "1.0.2", 278 | "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 279 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", 280 | "dependencies": { 281 | "tweetnacl": "^0.14.3" 282 | } 283 | }, 284 | "node_modules/binary-mirror-config": { 285 | "version": "1.41.0", 286 | "resolved": "https://registry.npmmirror.com/binary-mirror-config/-/binary-mirror-config-1.41.0.tgz", 287 | "integrity": "sha512-ZiIhR1s6Sv1Fv6qCQqfPjx0Cj86BgFlhqNxZgHkQOWcxJcMbO3mj1iqsuVjowYqJqeZL8e52+IEv7IRnSX6T6w==" 288 | }, 289 | "node_modules/blob": { 290 | "version": "0.0.5", 291 | "resolved": "https://registry.npmmirror.com/blob/-/blob-0.0.5.tgz", 292 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" 293 | }, 294 | "node_modules/bowser": { 295 | "version": "1.9.4", 296 | "resolved": "https://registry.npmmirror.com/bowser/-/bowser-1.9.4.tgz", 297 | "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" 298 | }, 299 | "node_modules/brace-expansion": { 300 | "version": "1.1.11", 301 | "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", 302 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 303 | "dependencies": { 304 | "balanced-match": "^1.0.0", 305 | "concat-map": "0.0.1" 306 | } 307 | }, 308 | "node_modules/builtin-status-codes": { 309 | "version": "3.0.0", 310 | "resolved": "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 311 | "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" 312 | }, 313 | "node_modules/bytes": { 314 | "version": "3.1.2", 315 | "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", 316 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 317 | "engines": { 318 | "node": ">= 0.8" 319 | } 320 | }, 321 | "node_modules/call-bind": { 322 | "version": "1.0.7", 323 | "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz", 324 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 325 | "dependencies": { 326 | "es-define-property": "^1.0.0", 327 | "es-errors": "^1.3.0", 328 | "function-bind": "^1.1.2", 329 | "get-intrinsic": "^1.2.4", 330 | "set-function-length": "^1.2.1" 331 | }, 332 | "engines": { 333 | "node": ">= 0.4" 334 | } 335 | }, 336 | "node_modules/caseless": { 337 | "version": "0.12.0", 338 | "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz", 339 | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" 340 | }, 341 | "node_modules/chalk": { 342 | "version": "4.1.2", 343 | "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", 344 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 345 | "dependencies": { 346 | "ansi-styles": "^4.1.0", 347 | "supports-color": "^7.1.0" 348 | }, 349 | "engines": { 350 | "node": ">=10" 351 | } 352 | }, 353 | "node_modules/chardet": { 354 | "version": "0.7.0", 355 | "resolved": "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz", 356 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 357 | }, 358 | "node_modules/chownr": { 359 | "version": "1.1.4", 360 | "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz", 361 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 362 | }, 363 | "node_modules/cli-cursor": { 364 | "version": "3.1.0", 365 | "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", 366 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 367 | "dependencies": { 368 | "restore-cursor": "^3.1.0" 369 | }, 370 | "engines": { 371 | "node": ">=8" 372 | } 373 | }, 374 | "node_modules/cli-spinner": { 375 | "version": "0.2.10", 376 | "resolved": "https://registry.npmmirror.com/cli-spinner/-/cli-spinner-0.2.10.tgz", 377 | "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", 378 | "engines": { 379 | "node": ">=0.10" 380 | } 381 | }, 382 | "node_modules/cli-spinners": { 383 | "version": "2.9.2", 384 | "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz", 385 | "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", 386 | "engines": { 387 | "node": ">=6" 388 | } 389 | }, 390 | "node_modules/cli-width": { 391 | "version": "3.0.0", 392 | "resolved": "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz", 393 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", 394 | "engines": { 395 | "node": ">= 10" 396 | } 397 | }, 398 | "node_modules/clone": { 399 | "version": "1.0.4", 400 | "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", 401 | "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", 402 | "engines": { 403 | "node": ">=0.8" 404 | } 405 | }, 406 | "node_modules/cmd-shim-hotfix": { 407 | "version": "3.0.3", 408 | "resolved": "https://registry.npmmirror.com/cmd-shim-hotfix/-/cmd-shim-hotfix-3.0.3.tgz", 409 | "integrity": "sha512-fn4AxpPZMCSVPvlfA+YJ2A1dR0elTQuwEXF73U91hQkuaDaYKNPz2XsC+driC4zv+avqXFfUty7Y/2KuSuHV2A==", 410 | "dependencies": { 411 | "graceful-fs": "^4.1.2", 412 | "mkdirp": "~0.5.0" 413 | } 414 | }, 415 | "node_modules/code-point-at": { 416 | "version": "1.1.0", 417 | "resolved": "https://registry.npmmirror.com/code-point-at/-/code-point-at-1.1.0.tgz", 418 | "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", 419 | "engines": { 420 | "node": ">=0.10.0" 421 | } 422 | }, 423 | "node_modules/color-convert": { 424 | "version": "2.0.1", 425 | "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", 426 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 427 | "dependencies": { 428 | "color-name": "~1.1.4" 429 | }, 430 | "engines": { 431 | "node": ">=7.0.0" 432 | } 433 | }, 434 | "node_modules/color-name": { 435 | "version": "1.1.4", 436 | "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", 437 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 438 | }, 439 | "node_modules/combined-stream": { 440 | "version": "1.0.8", 441 | "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", 442 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 443 | "dependencies": { 444 | "delayed-stream": "~1.0.0" 445 | }, 446 | "engines": { 447 | "node": ">= 0.8" 448 | } 449 | }, 450 | "node_modules/component-bind": { 451 | "version": "1.0.0", 452 | "resolved": "https://registry.npmmirror.com/component-bind/-/component-bind-1.0.0.tgz", 453 | "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" 454 | }, 455 | "node_modules/component-emitter": { 456 | "version": "1.3.1", 457 | "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz", 458 | "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==" 459 | }, 460 | "node_modules/component-inherit": { 461 | "version": "0.0.3", 462 | "resolved": "https://registry.npmmirror.com/component-inherit/-/component-inherit-0.0.3.tgz", 463 | "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" 464 | }, 465 | "node_modules/concat-map": { 466 | "version": "0.0.1", 467 | "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", 468 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 469 | }, 470 | "node_modules/console-control-strings": { 471 | "version": "1.1.0", 472 | "resolved": "https://registry.npmmirror.com/console-control-strings/-/console-control-strings-1.1.0.tgz", 473 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" 474 | }, 475 | "node_modules/content-type": { 476 | "version": "1.0.5", 477 | "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", 478 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 479 | "engines": { 480 | "node": ">= 0.6" 481 | } 482 | }, 483 | "node_modules/copy-to": { 484 | "version": "2.0.1", 485 | "resolved": "https://registry.npmmirror.com/copy-to/-/copy-to-2.0.1.tgz", 486 | "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==" 487 | }, 488 | "node_modules/core-util-is": { 489 | "version": "1.0.3", 490 | "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", 491 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 492 | }, 493 | "node_modules/dashdash": { 494 | "version": "1.14.1", 495 | "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", 496 | "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", 497 | "dependencies": { 498 | "assert-plus": "^1.0.0" 499 | }, 500 | "engines": { 501 | "node": ">=0.10" 502 | } 503 | }, 504 | "node_modules/dateformat": { 505 | "version": "2.2.0", 506 | "resolved": "https://registry.npmmirror.com/dateformat/-/dateformat-2.2.0.tgz", 507 | "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", 508 | "engines": { 509 | "node": "*" 510 | } 511 | }, 512 | "node_modules/debug": { 513 | "version": "4.3.4", 514 | "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", 515 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 516 | "dependencies": { 517 | "ms": "2.1.2" 518 | }, 519 | "engines": { 520 | "node": ">=6.0" 521 | }, 522 | "peerDependenciesMeta": { 523 | "supports-color": { 524 | "optional": true 525 | } 526 | } 527 | }, 528 | "node_modules/default-user-agent": { 529 | "version": "1.0.0", 530 | "resolved": "https://registry.npmmirror.com/default-user-agent/-/default-user-agent-1.0.0.tgz", 531 | "integrity": "sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==", 532 | "dependencies": { 533 | "os-name": "~1.0.3" 534 | }, 535 | "engines": { 536 | "node": ">= 0.10.0" 537 | } 538 | }, 539 | "node_modules/defaults": { 540 | "version": "1.0.4", 541 | "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", 542 | "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", 543 | "dependencies": { 544 | "clone": "^1.0.2" 545 | } 546 | }, 547 | "node_modules/define-data-property": { 548 | "version": "1.1.4", 549 | "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", 550 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 551 | "dependencies": { 552 | "es-define-property": "^1.0.0", 553 | "es-errors": "^1.3.0", 554 | "gopd": "^1.0.1" 555 | }, 556 | "engines": { 557 | "node": ">= 0.4" 558 | } 559 | }, 560 | "node_modules/delayed-stream": { 561 | "version": "1.0.0", 562 | "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", 563 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 564 | "engines": { 565 | "node": ">=0.4.0" 566 | } 567 | }, 568 | "node_modules/delegates": { 569 | "version": "1.0.0", 570 | "resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz", 571 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 572 | }, 573 | "node_modules/destroy": { 574 | "version": "1.2.0", 575 | "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", 576 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 577 | "engines": { 578 | "node": ">= 0.8", 579 | "npm": "1.2.8000 || >= 1.4.16" 580 | } 581 | }, 582 | "node_modules/digest-header": { 583 | "version": "1.1.0", 584 | "resolved": "https://registry.npmmirror.com/digest-header/-/digest-header-1.1.0.tgz", 585 | "integrity": "sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==", 586 | "engines": { 587 | "node": ">= 8.0.0" 588 | } 589 | }, 590 | "node_modules/ecc-jsbn": { 591 | "version": "0.1.2", 592 | "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 593 | "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", 594 | "dependencies": { 595 | "jsbn": "~0.1.0", 596 | "safer-buffer": "^2.1.0" 597 | } 598 | }, 599 | "node_modules/ee-first": { 600 | "version": "1.1.1", 601 | "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", 602 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 603 | }, 604 | "node_modules/ejs": { 605 | "version": "3.1.9", 606 | "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz", 607 | "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", 608 | "dependencies": { 609 | "jake": "^10.8.5" 610 | }, 611 | "bin": { 612 | "ejs": "bin/cli.js" 613 | }, 614 | "engines": { 615 | "node": ">=0.10.0" 616 | } 617 | }, 618 | "node_modules/emoji-regex": { 619 | "version": "8.0.0", 620 | "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", 621 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 622 | }, 623 | "node_modules/end-of-stream": { 624 | "version": "1.4.4", 625 | "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", 626 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 627 | "dependencies": { 628 | "once": "^1.4.0" 629 | } 630 | }, 631 | "node_modules/end-or-error": { 632 | "version": "1.0.1", 633 | "resolved": "https://registry.npmmirror.com/end-or-error/-/end-or-error-1.0.1.tgz", 634 | "integrity": "sha512-OclLMSug+k2A0JKuf494im25ANRBVW8qsjmwbgX7lQ8P82H21PQ1PWkoYwb9y5yMBS69BPlwtzdIFClo3+7kOQ==", 635 | "engines": { 636 | "node": ">= 0.11.14" 637 | } 638 | }, 639 | "node_modules/engine.io-client": { 640 | "version": "3.5.3", 641 | "resolved": "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-3.5.3.tgz", 642 | "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==", 643 | "dependencies": { 644 | "component-emitter": "~1.3.0", 645 | "component-inherit": "0.0.3", 646 | "debug": "~3.1.0", 647 | "engine.io-parser": "~2.2.0", 648 | "has-cors": "1.1.0", 649 | "indexof": "0.0.1", 650 | "parseqs": "0.0.6", 651 | "parseuri": "0.0.6", 652 | "ws": "~7.4.2", 653 | "xmlhttprequest-ssl": "~1.6.2", 654 | "yeast": "0.1.2" 655 | } 656 | }, 657 | "node_modules/engine.io-client/node_modules/debug": { 658 | "version": "3.1.0", 659 | "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", 660 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 661 | "dependencies": { 662 | "ms": "2.0.0" 663 | } 664 | }, 665 | "node_modules/engine.io-client/node_modules/ms": { 666 | "version": "2.0.0", 667 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", 668 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 669 | }, 670 | "node_modules/engine.io-parser": { 671 | "version": "2.2.1", 672 | "resolved": "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz", 673 | "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", 674 | "dependencies": { 675 | "after": "0.8.2", 676 | "arraybuffer.slice": "~0.0.7", 677 | "base64-arraybuffer": "0.1.4", 678 | "blob": "0.0.5", 679 | "has-binary2": "~1.0.2" 680 | } 681 | }, 682 | "node_modules/es-define-property": { 683 | "version": "1.0.0", 684 | "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz", 685 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 686 | "dependencies": { 687 | "get-intrinsic": "^1.2.4" 688 | }, 689 | "engines": { 690 | "node": ">= 0.4" 691 | } 692 | }, 693 | "node_modules/es-errors": { 694 | "version": "1.3.0", 695 | "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", 696 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 697 | "engines": { 698 | "node": ">= 0.4" 699 | } 700 | }, 701 | "node_modules/escape-html": { 702 | "version": "1.0.3", 703 | "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", 704 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 705 | }, 706 | "node_modules/escape-string-regexp": { 707 | "version": "1.0.5", 708 | "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 709 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 710 | "engines": { 711 | "node": ">=0.8.0" 712 | } 713 | }, 714 | "node_modules/extend": { 715 | "version": "3.0.2", 716 | "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", 717 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 718 | }, 719 | "node_modules/extend-shallow": { 720 | "version": "2.0.1", 721 | "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", 722 | "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", 723 | "dependencies": { 724 | "is-extendable": "^0.1.0" 725 | }, 726 | "engines": { 727 | "node": ">=0.10.0" 728 | } 729 | }, 730 | "node_modules/external-editor": { 731 | "version": "3.1.0", 732 | "resolved": "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz", 733 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 734 | "dependencies": { 735 | "chardet": "^0.7.0", 736 | "iconv-lite": "^0.4.24", 737 | "tmp": "^0.0.33" 738 | }, 739 | "engines": { 740 | "node": ">=4" 741 | } 742 | }, 743 | "node_modules/extsprintf": { 744 | "version": "1.3.0", 745 | "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz", 746 | "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", 747 | "engines": [ 748 | "node >=0.6.0" 749 | ] 750 | }, 751 | "node_modules/fast-deep-equal": { 752 | "version": "3.1.3", 753 | "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 754 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 755 | }, 756 | "node_modules/fast-json-stable-stringify": { 757 | "version": "2.1.0", 758 | "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 759 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 760 | }, 761 | "node_modules/figures": { 762 | "version": "3.2.0", 763 | "resolved": "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz", 764 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 765 | "dependencies": { 766 | "escape-string-regexp": "^1.0.5" 767 | }, 768 | "engines": { 769 | "node": ">=8" 770 | } 771 | }, 772 | "node_modules/filelist": { 773 | "version": "1.0.4", 774 | "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", 775 | "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", 776 | "dependencies": { 777 | "minimatch": "^5.0.1" 778 | } 779 | }, 780 | "node_modules/filelist/node_modules/brace-expansion": { 781 | "version": "2.0.1", 782 | "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", 783 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 784 | "dependencies": { 785 | "balanced-match": "^1.0.0" 786 | } 787 | }, 788 | "node_modules/filelist/node_modules/minimatch": { 789 | "version": "5.1.6", 790 | "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", 791 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 792 | "dependencies": { 793 | "brace-expansion": "^2.0.1" 794 | }, 795 | "engines": { 796 | "node": ">=10" 797 | } 798 | }, 799 | "node_modules/follow-redirects": { 800 | "version": "1.15.6", 801 | "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz", 802 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 803 | "engines": { 804 | "node": ">=4.0" 805 | }, 806 | "peerDependenciesMeta": { 807 | "debug": { 808 | "optional": true 809 | } 810 | } 811 | }, 812 | "node_modules/forever-agent": { 813 | "version": "0.6.1", 814 | "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz", 815 | "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", 816 | "engines": { 817 | "node": "*" 818 | } 819 | }, 820 | "node_modules/form-data": { 821 | "version": "2.3.3", 822 | "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz", 823 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 824 | "dependencies": { 825 | "asynckit": "^0.4.0", 826 | "combined-stream": "^1.0.6", 827 | "mime-types": "^2.1.12" 828 | }, 829 | "engines": { 830 | "node": ">= 0.12" 831 | } 832 | }, 833 | "node_modules/formstream": { 834 | "version": "1.3.1", 835 | "resolved": "https://registry.npmmirror.com/formstream/-/formstream-1.3.1.tgz", 836 | "integrity": "sha512-FkW++ub+VbE5dpwukJVDizNWhSgp8FhmhI65pF7BZSVStBqe6Wgxe2Z9/Vhsn7l7nXCPwP+G1cyYlX8VwWOf0g==", 837 | "dependencies": { 838 | "destroy": "^1.0.4", 839 | "mime": "^2.5.2", 840 | "pause-stream": "~0.0.11" 841 | } 842 | }, 843 | "node_modules/fs-extra": { 844 | "version": "9.1.0", 845 | "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", 846 | "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", 847 | "dependencies": { 848 | "at-least-node": "^1.0.0", 849 | "graceful-fs": "^4.2.0", 850 | "jsonfile": "^6.0.1", 851 | "universalify": "^2.0.0" 852 | }, 853 | "engines": { 854 | "node": ">=10" 855 | } 856 | }, 857 | "node_modules/fs-minipass": { 858 | "version": "1.2.7", 859 | "resolved": "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-1.2.7.tgz", 860 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 861 | "dependencies": { 862 | "minipass": "^2.6.0" 863 | } 864 | }, 865 | "node_modules/fs.realpath": { 866 | "version": "1.0.0", 867 | "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", 868 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 869 | }, 870 | "node_modules/function-bind": { 871 | "version": "1.1.2", 872 | "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", 873 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 874 | }, 875 | "node_modules/gauge": { 876 | "version": "2.7.4", 877 | "resolved": "https://registry.npmmirror.com/gauge/-/gauge-2.7.4.tgz", 878 | "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", 879 | "dependencies": { 880 | "aproba": "^1.0.3", 881 | "console-control-strings": "^1.0.0", 882 | "has-unicode": "^2.0.0", 883 | "object-assign": "^4.1.0", 884 | "signal-exit": "^3.0.0", 885 | "string-width": "^1.0.1", 886 | "strip-ansi": "^3.0.1", 887 | "wide-align": "^1.1.0" 888 | } 889 | }, 890 | "node_modules/gauge/node_modules/ansi-regex": { 891 | "version": "2.1.1", 892 | "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", 893 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 894 | "engines": { 895 | "node": ">=0.10.0" 896 | } 897 | }, 898 | "node_modules/gauge/node_modules/is-fullwidth-code-point": { 899 | "version": "1.0.0", 900 | "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 901 | "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", 902 | "dependencies": { 903 | "number-is-nan": "^1.0.0" 904 | }, 905 | "engines": { 906 | "node": ">=0.10.0" 907 | } 908 | }, 909 | "node_modules/gauge/node_modules/string-width": { 910 | "version": "1.0.2", 911 | "resolved": "https://registry.npmmirror.com/string-width/-/string-width-1.0.2.tgz", 912 | "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", 913 | "dependencies": { 914 | "code-point-at": "^1.0.0", 915 | "is-fullwidth-code-point": "^1.0.0", 916 | "strip-ansi": "^3.0.0" 917 | }, 918 | "engines": { 919 | "node": ">=0.10.0" 920 | } 921 | }, 922 | "node_modules/gauge/node_modules/strip-ansi": { 923 | "version": "3.0.1", 924 | "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", 925 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 926 | "dependencies": { 927 | "ansi-regex": "^2.0.0" 928 | }, 929 | "engines": { 930 | "node": ">=0.10.0" 931 | } 932 | }, 933 | "node_modules/get-intrinsic": { 934 | "version": "1.2.4", 935 | "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 936 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 937 | "dependencies": { 938 | "es-errors": "^1.3.0", 939 | "function-bind": "^1.1.2", 940 | "has-proto": "^1.0.1", 941 | "has-symbols": "^1.0.3", 942 | "hasown": "^2.0.0" 943 | }, 944 | "engines": { 945 | "node": ">= 0.4" 946 | } 947 | }, 948 | "node_modules/get-ready": { 949 | "version": "1.0.0", 950 | "resolved": "https://registry.npmmirror.com/get-ready/-/get-ready-1.0.0.tgz", 951 | "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==" 952 | }, 953 | "node_modules/getpass": { 954 | "version": "0.1.7", 955 | "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz", 956 | "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", 957 | "dependencies": { 958 | "assert-plus": "^1.0.0" 959 | } 960 | }, 961 | "node_modules/glob": { 962 | "version": "7.2.3", 963 | "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", 964 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 965 | "dependencies": { 966 | "fs.realpath": "^1.0.0", 967 | "inflight": "^1.0.4", 968 | "inherits": "2", 969 | "minimatch": "^3.1.1", 970 | "once": "^1.3.0", 971 | "path-is-absolute": "^1.0.0" 972 | }, 973 | "engines": { 974 | "node": "*" 975 | } 976 | }, 977 | "node_modules/gopd": { 978 | "version": "1.0.1", 979 | "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", 980 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 981 | "dependencies": { 982 | "get-intrinsic": "^1.1.3" 983 | } 984 | }, 985 | "node_modules/graceful-fs": { 986 | "version": "4.2.11", 987 | "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", 988 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 989 | }, 990 | "node_modules/har-schema": { 991 | "version": "2.0.0", 992 | "resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz", 993 | "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", 994 | "engines": { 995 | "node": ">=4" 996 | } 997 | }, 998 | "node_modules/har-validator": { 999 | "version": "5.1.5", 1000 | "resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz", 1001 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 1002 | "deprecated": "this library is no longer supported", 1003 | "dependencies": { 1004 | "ajv": "^6.12.3", 1005 | "har-schema": "^2.0.0" 1006 | }, 1007 | "engines": { 1008 | "node": ">=6" 1009 | } 1010 | }, 1011 | "node_modules/has-binary2": { 1012 | "version": "1.0.3", 1013 | "resolved": "https://registry.npmmirror.com/has-binary2/-/has-binary2-1.0.3.tgz", 1014 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 1015 | "dependencies": { 1016 | "isarray": "2.0.1" 1017 | } 1018 | }, 1019 | "node_modules/has-binary2/node_modules/isarray": { 1020 | "version": "2.0.1", 1021 | "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.1.tgz", 1022 | "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" 1023 | }, 1024 | "node_modules/has-cors": { 1025 | "version": "1.1.0", 1026 | "resolved": "https://registry.npmmirror.com/has-cors/-/has-cors-1.1.0.tgz", 1027 | "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" 1028 | }, 1029 | "node_modules/has-flag": { 1030 | "version": "4.0.0", 1031 | "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", 1032 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1033 | "engines": { 1034 | "node": ">=8" 1035 | } 1036 | }, 1037 | "node_modules/has-property-descriptors": { 1038 | "version": "1.0.2", 1039 | "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 1040 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 1041 | "dependencies": { 1042 | "es-define-property": "^1.0.0" 1043 | } 1044 | }, 1045 | "node_modules/has-proto": { 1046 | "version": "1.0.3", 1047 | "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz", 1048 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 1049 | "engines": { 1050 | "node": ">= 0.4" 1051 | } 1052 | }, 1053 | "node_modules/has-symbols": { 1054 | "version": "1.0.3", 1055 | "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", 1056 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1057 | "engines": { 1058 | "node": ">= 0.4" 1059 | } 1060 | }, 1061 | "node_modules/has-unicode": { 1062 | "version": "2.0.1", 1063 | "resolved": "https://registry.npmmirror.com/has-unicode/-/has-unicode-2.0.1.tgz", 1064 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" 1065 | }, 1066 | "node_modules/hasown": { 1067 | "version": "2.0.1", 1068 | "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.1.tgz", 1069 | "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", 1070 | "dependencies": { 1071 | "function-bind": "^1.1.2" 1072 | }, 1073 | "engines": { 1074 | "node": ">= 0.4" 1075 | } 1076 | }, 1077 | "node_modules/hosted-git-info": { 1078 | "version": "2.8.9", 1079 | "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 1080 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" 1081 | }, 1082 | "node_modules/http-signature": { 1083 | "version": "1.2.0", 1084 | "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz", 1085 | "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", 1086 | "dependencies": { 1087 | "assert-plus": "^1.0.0", 1088 | "jsprim": "^1.2.2", 1089 | "sshpk": "^1.7.0" 1090 | }, 1091 | "engines": { 1092 | "node": ">=0.8", 1093 | "npm": ">=1.3.7" 1094 | } 1095 | }, 1096 | "node_modules/humanize-ms": { 1097 | "version": "1.2.1", 1098 | "resolved": "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz", 1099 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 1100 | "dependencies": { 1101 | "ms": "^2.0.0" 1102 | } 1103 | }, 1104 | "node_modules/iconv-lite": { 1105 | "version": "0.4.24", 1106 | "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", 1107 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1108 | "dependencies": { 1109 | "safer-buffer": ">= 2.1.2 < 3" 1110 | }, 1111 | "engines": { 1112 | "node": ">=0.10.0" 1113 | } 1114 | }, 1115 | "node_modules/indexof": { 1116 | "version": "0.0.1", 1117 | "resolved": "https://registry.npmmirror.com/indexof/-/indexof-0.0.1.tgz", 1118 | "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" 1119 | }, 1120 | "node_modules/inflight": { 1121 | "version": "1.0.6", 1122 | "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", 1123 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1124 | "dependencies": { 1125 | "once": "^1.3.0", 1126 | "wrappy": "1" 1127 | } 1128 | }, 1129 | "node_modules/inherits": { 1130 | "version": "2.0.4", 1131 | "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", 1132 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1133 | }, 1134 | "node_modules/inquirer": { 1135 | "version": "7.3.3", 1136 | "resolved": "https://registry.npmmirror.com/inquirer/-/inquirer-7.3.3.tgz", 1137 | "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", 1138 | "dependencies": { 1139 | "ansi-escapes": "^4.2.1", 1140 | "chalk": "^4.1.0", 1141 | "cli-cursor": "^3.1.0", 1142 | "cli-width": "^3.0.0", 1143 | "external-editor": "^3.0.3", 1144 | "figures": "^3.0.0", 1145 | "lodash": "^4.17.19", 1146 | "mute-stream": "0.0.8", 1147 | "run-async": "^2.4.0", 1148 | "rxjs": "^6.6.0", 1149 | "string-width": "^4.1.0", 1150 | "strip-ansi": "^6.0.0", 1151 | "through": "^2.3.6" 1152 | }, 1153 | "engines": { 1154 | "node": ">=8.0.0" 1155 | } 1156 | }, 1157 | "node_modules/ip": { 1158 | "version": "1.1.9", 1159 | "resolved": "https://registry.npmmirror.com/ip/-/ip-1.1.9.tgz", 1160 | "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" 1161 | }, 1162 | "node_modules/is-class-hotfix": { 1163 | "version": "0.0.6", 1164 | "resolved": "https://registry.npmmirror.com/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", 1165 | "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==" 1166 | }, 1167 | "node_modules/is-core-module": { 1168 | "version": "2.13.1", 1169 | "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz", 1170 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 1171 | "dependencies": { 1172 | "hasown": "^2.0.0" 1173 | } 1174 | }, 1175 | "node_modules/is-extendable": { 1176 | "version": "0.1.1", 1177 | "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", 1178 | "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", 1179 | "engines": { 1180 | "node": ">=0.10.0" 1181 | } 1182 | }, 1183 | "node_modules/is-fullwidth-code-point": { 1184 | "version": "3.0.0", 1185 | "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1186 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1187 | "engines": { 1188 | "node": ">=8" 1189 | } 1190 | }, 1191 | "node_modules/is-type-of": { 1192 | "version": "1.4.0", 1193 | "resolved": "https://registry.npmmirror.com/is-type-of/-/is-type-of-1.4.0.tgz", 1194 | "integrity": "sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==", 1195 | "dependencies": { 1196 | "core-util-is": "^1.0.2", 1197 | "is-class-hotfix": "~0.0.6", 1198 | "isstream": "~0.1.2" 1199 | } 1200 | }, 1201 | "node_modules/is-typedarray": { 1202 | "version": "1.0.0", 1203 | "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", 1204 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" 1205 | }, 1206 | "node_modules/isarray": { 1207 | "version": "1.0.0", 1208 | "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", 1209 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 1210 | }, 1211 | "node_modules/isexe": { 1212 | "version": "2.0.0", 1213 | "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", 1214 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1215 | }, 1216 | "node_modules/isstream": { 1217 | "version": "0.1.2", 1218 | "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz", 1219 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" 1220 | }, 1221 | "node_modules/jake": { 1222 | "version": "10.8.7", 1223 | "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz", 1224 | "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", 1225 | "dependencies": { 1226 | "async": "^3.2.3", 1227 | "chalk": "^4.0.2", 1228 | "filelist": "^1.0.4", 1229 | "minimatch": "^3.1.2" 1230 | }, 1231 | "bin": { 1232 | "jake": "bin/cli.js" 1233 | }, 1234 | "engines": { 1235 | "node": ">=10" 1236 | } 1237 | }, 1238 | "node_modules/js-base64": { 1239 | "version": "2.6.4", 1240 | "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz", 1241 | "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" 1242 | }, 1243 | "node_modules/jsbn": { 1244 | "version": "0.1.1", 1245 | "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz", 1246 | "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" 1247 | }, 1248 | "node_modules/json-schema": { 1249 | "version": "0.4.0", 1250 | "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", 1251 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 1252 | }, 1253 | "node_modules/json-schema-traverse": { 1254 | "version": "0.4.1", 1255 | "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1256 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1257 | }, 1258 | "node_modules/json-stringify-safe": { 1259 | "version": "5.0.1", 1260 | "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1261 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" 1262 | }, 1263 | "node_modules/jsonfile": { 1264 | "version": "6.1.0", 1265 | "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", 1266 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 1267 | "dependencies": { 1268 | "universalify": "^2.0.0" 1269 | }, 1270 | "optionalDependencies": { 1271 | "graceful-fs": "^4.1.6" 1272 | } 1273 | }, 1274 | "node_modules/jsprim": { 1275 | "version": "1.4.2", 1276 | "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz", 1277 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 1278 | "dependencies": { 1279 | "assert-plus": "1.0.0", 1280 | "extsprintf": "1.3.0", 1281 | "json-schema": "0.4.0", 1282 | "verror": "1.10.0" 1283 | }, 1284 | "engines": { 1285 | "node": ">=0.6.0" 1286 | } 1287 | }, 1288 | "node_modules/jstoxml": { 1289 | "version": "2.2.9", 1290 | "resolved": "https://registry.npmmirror.com/jstoxml/-/jstoxml-2.2.9.tgz", 1291 | "integrity": "sha512-OYWlK0j+roh+eyaMROlNbS5cd5R25Y+IUpdl7cNdB8HNrkgwQzIS7L9MegxOiWNBj9dQhA/yAxiMwCC5mwNoBw==" 1292 | }, 1293 | "node_modules/kebab-case": { 1294 | "version": "1.0.2", 1295 | "resolved": "https://registry.npmmirror.com/kebab-case/-/kebab-case-1.0.2.tgz", 1296 | "integrity": "sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==" 1297 | }, 1298 | "node_modules/ko-sleep": { 1299 | "version": "1.1.4", 1300 | "resolved": "https://registry.npmmirror.com/ko-sleep/-/ko-sleep-1.1.4.tgz", 1301 | "integrity": "sha512-s05WGpvvzyTuRlRE8fM7ru2Z3O+InbJuBcckTWKg2W+2c1k6SnFa3IfiSSt0/peFrlYAXgNoxuJWWVNmWh+K/A==", 1302 | "dependencies": { 1303 | "ms": "*" 1304 | } 1305 | }, 1306 | "node_modules/lodash": { 1307 | "version": "4.17.21", 1308 | "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", 1309 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1310 | }, 1311 | "node_modules/log-symbols": { 1312 | "version": "2.2.0", 1313 | "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-2.2.0.tgz", 1314 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 1315 | "dependencies": { 1316 | "chalk": "^2.0.1" 1317 | }, 1318 | "engines": { 1319 | "node": ">=4" 1320 | } 1321 | }, 1322 | "node_modules/log-symbols/node_modules/ansi-styles": { 1323 | "version": "3.2.1", 1324 | "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", 1325 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1326 | "dependencies": { 1327 | "color-convert": "^1.9.0" 1328 | }, 1329 | "engines": { 1330 | "node": ">=4" 1331 | } 1332 | }, 1333 | "node_modules/log-symbols/node_modules/chalk": { 1334 | "version": "2.4.2", 1335 | "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", 1336 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1337 | "dependencies": { 1338 | "ansi-styles": "^3.2.1", 1339 | "escape-string-regexp": "^1.0.5", 1340 | "supports-color": "^5.3.0" 1341 | }, 1342 | "engines": { 1343 | "node": ">=4" 1344 | } 1345 | }, 1346 | "node_modules/log-symbols/node_modules/color-convert": { 1347 | "version": "1.9.3", 1348 | "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", 1349 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1350 | "dependencies": { 1351 | "color-name": "1.1.3" 1352 | } 1353 | }, 1354 | "node_modules/log-symbols/node_modules/color-name": { 1355 | "version": "1.1.3", 1356 | "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", 1357 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 1358 | }, 1359 | "node_modules/log-symbols/node_modules/has-flag": { 1360 | "version": "3.0.0", 1361 | "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", 1362 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1363 | "engines": { 1364 | "node": ">=4" 1365 | } 1366 | }, 1367 | "node_modules/log-symbols/node_modules/supports-color": { 1368 | "version": "5.5.0", 1369 | "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", 1370 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1371 | "dependencies": { 1372 | "has-flag": "^3.0.0" 1373 | }, 1374 | "engines": { 1375 | "node": ">=4" 1376 | } 1377 | }, 1378 | "node_modules/lru-cache": { 1379 | "version": "6.0.0", 1380 | "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", 1381 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1382 | "dependencies": { 1383 | "yallist": "^4.0.0" 1384 | }, 1385 | "engines": { 1386 | "node": ">=10" 1387 | } 1388 | }, 1389 | "node_modules/lru-cache/node_modules/yallist": { 1390 | "version": "4.0.0", 1391 | "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", 1392 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1393 | }, 1394 | "node_modules/merge-descriptors": { 1395 | "version": "1.0.3", 1396 | "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 1397 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" 1398 | }, 1399 | "node_modules/mime": { 1400 | "version": "2.6.0", 1401 | "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", 1402 | "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", 1403 | "bin": { 1404 | "mime": "cli.js" 1405 | }, 1406 | "engines": { 1407 | "node": ">=4.0.0" 1408 | } 1409 | }, 1410 | "node_modules/mime-db": { 1411 | "version": "1.52.0", 1412 | "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", 1413 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1414 | "engines": { 1415 | "node": ">= 0.6" 1416 | } 1417 | }, 1418 | "node_modules/mime-types": { 1419 | "version": "2.1.35", 1420 | "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", 1421 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1422 | "dependencies": { 1423 | "mime-db": "1.52.0" 1424 | }, 1425 | "engines": { 1426 | "node": ">= 0.6" 1427 | } 1428 | }, 1429 | "node_modules/mimic-fn": { 1430 | "version": "2.1.0", 1431 | "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", 1432 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1433 | "engines": { 1434 | "node": ">=6" 1435 | } 1436 | }, 1437 | "node_modules/minimatch": { 1438 | "version": "3.1.2", 1439 | "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", 1440 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1441 | "dependencies": { 1442 | "brace-expansion": "^1.1.7" 1443 | }, 1444 | "engines": { 1445 | "node": "*" 1446 | } 1447 | }, 1448 | "node_modules/minimist": { 1449 | "version": "1.2.8", 1450 | "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", 1451 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" 1452 | }, 1453 | "node_modules/minipass": { 1454 | "version": "2.9.0", 1455 | "resolved": "https://registry.npmmirror.com/minipass/-/minipass-2.9.0.tgz", 1456 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 1457 | "dependencies": { 1458 | "safe-buffer": "^5.1.2", 1459 | "yallist": "^3.0.0" 1460 | } 1461 | }, 1462 | "node_modules/minizlib": { 1463 | "version": "1.3.3", 1464 | "resolved": "https://registry.npmmirror.com/minizlib/-/minizlib-1.3.3.tgz", 1465 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 1466 | "dependencies": { 1467 | "minipass": "^2.9.0" 1468 | } 1469 | }, 1470 | "node_modules/mkdirp": { 1471 | "version": "0.5.6", 1472 | "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", 1473 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1474 | "dependencies": { 1475 | "minimist": "^1.2.6" 1476 | }, 1477 | "bin": { 1478 | "mkdirp": "bin/cmd.js" 1479 | } 1480 | }, 1481 | "node_modules/moment": { 1482 | "version": "2.30.1", 1483 | "resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz", 1484 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", 1485 | "engines": { 1486 | "node": "*" 1487 | } 1488 | }, 1489 | "node_modules/ms": { 1490 | "version": "2.1.2", 1491 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", 1492 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1493 | }, 1494 | "node_modules/mute-stream": { 1495 | "version": "0.0.8", 1496 | "resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz", 1497 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 1498 | }, 1499 | "node_modules/mz": { 1500 | "version": "2.7.0", 1501 | "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", 1502 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1503 | "dependencies": { 1504 | "any-promise": "^1.0.0", 1505 | "object-assign": "^4.0.1", 1506 | "thenify-all": "^1.0.0" 1507 | } 1508 | }, 1509 | "node_modules/mz-modules": { 1510 | "version": "2.1.0", 1511 | "resolved": "https://registry.npmmirror.com/mz-modules/-/mz-modules-2.1.0.tgz", 1512 | "integrity": "sha512-sjk8lcRW3vrVYnZ+W+67L/2rL+jbO5K/N6PFGIcLWTiYytNr22Ah9FDXFs+AQntTM1boZcoHi5qS+CV1seuPog==", 1513 | "dependencies": { 1514 | "glob": "^7.1.2", 1515 | "ko-sleep": "^1.0.3", 1516 | "mkdirp": "^0.5.1", 1517 | "pump": "^3.0.0", 1518 | "rimraf": "^2.6.1" 1519 | }, 1520 | "engines": { 1521 | "node": ">=6.0.0" 1522 | } 1523 | }, 1524 | "node_modules/node-gyp": { 1525 | "version": "4.0.0", 1526 | "resolved": "https://registry.npmmirror.com/node-gyp/-/node-gyp-4.0.0.tgz", 1527 | "integrity": "sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA==", 1528 | "dependencies": { 1529 | "glob": "^7.0.3", 1530 | "graceful-fs": "^4.1.2", 1531 | "mkdirp": "^0.5.0", 1532 | "nopt": "2 || 3", 1533 | "npmlog": "0 || 1 || 2 || 3 || 4", 1534 | "osenv": "0", 1535 | "request": "^2.87.0", 1536 | "rimraf": "2", 1537 | "semver": "~5.3.0", 1538 | "tar": "^4.4.8", 1539 | "which": "1" 1540 | }, 1541 | "bin": { 1542 | "node-gyp": "bin/node-gyp.js" 1543 | }, 1544 | "engines": { 1545 | "node": ">= 4.0.0" 1546 | } 1547 | }, 1548 | "node_modules/node-gyp/node_modules/semver": { 1549 | "version": "5.3.0", 1550 | "resolved": "https://registry.npmmirror.com/semver/-/semver-5.3.0.tgz", 1551 | "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==", 1552 | "bin": { 1553 | "semver": "bin/semver" 1554 | } 1555 | }, 1556 | "node_modules/node-homedir": { 1557 | "version": "1.1.1", 1558 | "resolved": "https://registry.npmmirror.com/node-homedir/-/node-homedir-1.1.1.tgz", 1559 | "integrity": "sha512-Xsmf94D/DdeDISAECUaxXVxhh+kHdbOQE4CnP4igo3HXL3BSmmUpD5M7orH434EZZwBTFF2xe5SgsQr/wOBuNw==", 1560 | "engines": { 1561 | "node": ">=4.0.0" 1562 | } 1563 | }, 1564 | "node_modules/nopt": { 1565 | "version": "3.0.6", 1566 | "resolved": "https://registry.npmmirror.com/nopt/-/nopt-3.0.6.tgz", 1567 | "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", 1568 | "dependencies": { 1569 | "abbrev": "1" 1570 | }, 1571 | "bin": { 1572 | "nopt": "bin/nopt.js" 1573 | } 1574 | }, 1575 | "node_modules/normalize-git-url": { 1576 | "version": "3.0.2", 1577 | "resolved": "https://registry.npmmirror.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz", 1578 | "integrity": "sha512-UEmKT33ssKLLoLCsFJ4Si4fmNQsedNwivXpuNTR4V1I97jU9WZlicTV1xn5QAG5itE5B3Z9zhl8OItP6wIGkRA==" 1579 | }, 1580 | "node_modules/normalize-package-data": { 1581 | "version": "2.5.0", 1582 | "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1583 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1584 | "dependencies": { 1585 | "hosted-git-info": "^2.1.4", 1586 | "resolve": "^1.10.0", 1587 | "semver": "2 || 3 || 4 || 5", 1588 | "validate-npm-package-license": "^3.0.1" 1589 | } 1590 | }, 1591 | "node_modules/npm-normalize-package-bin": { 1592 | "version": "1.0.1", 1593 | "resolved": "https://registry.npmmirror.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", 1594 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" 1595 | }, 1596 | "node_modules/npm-package-arg": { 1597 | "version": "4.2.1", 1598 | "resolved": "https://registry.npmmirror.com/npm-package-arg/-/npm-package-arg-4.2.1.tgz", 1599 | "integrity": "sha512-JhzqcxLL3ydxlmtqh2uDALGZp1KZLSXKM9rj/0ZQ9pPIjR+BX4vSUsx5amSZMrPvymS17qoHbkqQANMdSQHFFQ==", 1600 | "dependencies": { 1601 | "hosted-git-info": "^2.1.5", 1602 | "semver": "^5.1.0" 1603 | } 1604 | }, 1605 | "node_modules/npminstall": { 1606 | "version": "4.11.0", 1607 | "resolved": "https://registry.npmmirror.com/npminstall/-/npminstall-4.11.0.tgz", 1608 | "integrity": "sha512-ZjefdHv3+P5ThbPMm4ChnGqMQqXjOjTUE81E7cHDwhCU6pbQMvN01KfU71ZAACEdumW+3pSu2OLaUVgy29ui/Q==", 1609 | "dependencies": { 1610 | "agentkeepalive": "^4.0.2", 1611 | "await-event": "^2.1.0", 1612 | "binary-mirror-config": "^1.19.0", 1613 | "bytes": "^3.1.0", 1614 | "chalk": "^2.4.2", 1615 | "cmd-shim-hotfix": "^3.0.3", 1616 | "debug": "^4.1.1", 1617 | "destroy": "^1.0.4", 1618 | "fs-extra": "^7.0.1", 1619 | "minimatch": "^3.0.4", 1620 | "minimist": "^1.2.0", 1621 | "moment": "^2.24.0", 1622 | "ms": "^2.1.1", 1623 | "mz": "^2.7.0", 1624 | "mz-modules": "^2.1.0", 1625 | "node-gyp": "^4.0.0", 1626 | "node-homedir": "^1.1.1", 1627 | "normalize-git-url": "^3.0.2", 1628 | "normalize-package-data": "^2.5.0", 1629 | "npm-normalize-package-bin": "^1.0.1", 1630 | "npm-package-arg": "^4.2.1", 1631 | "ora": "^3.4.0", 1632 | "p-map": "^2.1.0", 1633 | "runscript": "^1.3.0", 1634 | "semver": "^6.0.0", 1635 | "tar": "^4.4.8", 1636 | "urllib": "^2.33.3", 1637 | "utility": "^1.16.1", 1638 | "uuid": "^3.3.2" 1639 | }, 1640 | "bin": { 1641 | "npminstall": "bin/install.js", 1642 | "npmlink": "bin/link.js", 1643 | "npmuninstall": "bin/uninstall.js", 1644 | "npmupdate": "bin/update.js" 1645 | }, 1646 | "engines": { 1647 | "node": ">=8.0.0" 1648 | } 1649 | }, 1650 | "node_modules/npminstall/node_modules/agentkeepalive": { 1651 | "version": "4.5.0", 1652 | "resolved": "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz", 1653 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", 1654 | "dependencies": { 1655 | "humanize-ms": "^1.2.1" 1656 | }, 1657 | "engines": { 1658 | "node": ">= 8.0.0" 1659 | } 1660 | }, 1661 | "node_modules/npminstall/node_modules/ansi-styles": { 1662 | "version": "3.2.1", 1663 | "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", 1664 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1665 | "dependencies": { 1666 | "color-convert": "^1.9.0" 1667 | }, 1668 | "engines": { 1669 | "node": ">=4" 1670 | } 1671 | }, 1672 | "node_modules/npminstall/node_modules/chalk": { 1673 | "version": "2.4.2", 1674 | "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", 1675 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1676 | "dependencies": { 1677 | "ansi-styles": "^3.2.1", 1678 | "escape-string-regexp": "^1.0.5", 1679 | "supports-color": "^5.3.0" 1680 | }, 1681 | "engines": { 1682 | "node": ">=4" 1683 | } 1684 | }, 1685 | "node_modules/npminstall/node_modules/color-convert": { 1686 | "version": "1.9.3", 1687 | "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", 1688 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1689 | "dependencies": { 1690 | "color-name": "1.1.3" 1691 | } 1692 | }, 1693 | "node_modules/npminstall/node_modules/color-name": { 1694 | "version": "1.1.3", 1695 | "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", 1696 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 1697 | }, 1698 | "node_modules/npminstall/node_modules/fs-extra": { 1699 | "version": "7.0.1", 1700 | "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", 1701 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 1702 | "dependencies": { 1703 | "graceful-fs": "^4.1.2", 1704 | "jsonfile": "^4.0.0", 1705 | "universalify": "^0.1.0" 1706 | }, 1707 | "engines": { 1708 | "node": ">=6 <7 || >=8" 1709 | } 1710 | }, 1711 | "node_modules/npminstall/node_modules/has-flag": { 1712 | "version": "3.0.0", 1713 | "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", 1714 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1715 | "engines": { 1716 | "node": ">=4" 1717 | } 1718 | }, 1719 | "node_modules/npminstall/node_modules/jsonfile": { 1720 | "version": "4.0.0", 1721 | "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", 1722 | "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", 1723 | "optionalDependencies": { 1724 | "graceful-fs": "^4.1.6" 1725 | } 1726 | }, 1727 | "node_modules/npminstall/node_modules/semver": { 1728 | "version": "6.3.1", 1729 | "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", 1730 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1731 | "bin": { 1732 | "semver": "bin/semver.js" 1733 | } 1734 | }, 1735 | "node_modules/npminstall/node_modules/supports-color": { 1736 | "version": "5.5.0", 1737 | "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", 1738 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1739 | "dependencies": { 1740 | "has-flag": "^3.0.0" 1741 | }, 1742 | "engines": { 1743 | "node": ">=4" 1744 | } 1745 | }, 1746 | "node_modules/npminstall/node_modules/universalify": { 1747 | "version": "0.1.2", 1748 | "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", 1749 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1750 | "engines": { 1751 | "node": ">= 4.0.0" 1752 | } 1753 | }, 1754 | "node_modules/npmlog": { 1755 | "version": "4.1.2", 1756 | "resolved": "https://registry.npmmirror.com/npmlog/-/npmlog-4.1.2.tgz", 1757 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 1758 | "dependencies": { 1759 | "are-we-there-yet": "~1.1.2", 1760 | "console-control-strings": "~1.1.0", 1761 | "gauge": "~2.7.3", 1762 | "set-blocking": "~2.0.0" 1763 | } 1764 | }, 1765 | "node_modules/number-is-nan": { 1766 | "version": "1.0.1", 1767 | "resolved": "https://registry.npmmirror.com/number-is-nan/-/number-is-nan-1.0.1.tgz", 1768 | "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", 1769 | "engines": { 1770 | "node": ">=0.10.0" 1771 | } 1772 | }, 1773 | "node_modules/oauth-sign": { 1774 | "version": "0.9.0", 1775 | "resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz", 1776 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1777 | "engines": { 1778 | "node": "*" 1779 | } 1780 | }, 1781 | "node_modules/object-assign": { 1782 | "version": "4.1.1", 1783 | "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", 1784 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1785 | "engines": { 1786 | "node": ">=0.10.0" 1787 | } 1788 | }, 1789 | "node_modules/object-inspect": { 1790 | "version": "1.13.1", 1791 | "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz", 1792 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" 1793 | }, 1794 | "node_modules/once": { 1795 | "version": "1.4.0", 1796 | "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", 1797 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1798 | "dependencies": { 1799 | "wrappy": "1" 1800 | } 1801 | }, 1802 | "node_modules/onetime": { 1803 | "version": "5.1.2", 1804 | "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", 1805 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1806 | "dependencies": { 1807 | "mimic-fn": "^2.1.0" 1808 | }, 1809 | "engines": { 1810 | "node": ">=6" 1811 | } 1812 | }, 1813 | "node_modules/ora": { 1814 | "version": "3.4.0", 1815 | "resolved": "https://registry.npmmirror.com/ora/-/ora-3.4.0.tgz", 1816 | "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", 1817 | "dependencies": { 1818 | "chalk": "^2.4.2", 1819 | "cli-cursor": "^2.1.0", 1820 | "cli-spinners": "^2.0.0", 1821 | "log-symbols": "^2.2.0", 1822 | "strip-ansi": "^5.2.0", 1823 | "wcwidth": "^1.0.1" 1824 | }, 1825 | "engines": { 1826 | "node": ">=6" 1827 | } 1828 | }, 1829 | "node_modules/ora/node_modules/ansi-regex": { 1830 | "version": "4.1.1", 1831 | "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", 1832 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 1833 | "engines": { 1834 | "node": ">=6" 1835 | } 1836 | }, 1837 | "node_modules/ora/node_modules/ansi-styles": { 1838 | "version": "3.2.1", 1839 | "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", 1840 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1841 | "dependencies": { 1842 | "color-convert": "^1.9.0" 1843 | }, 1844 | "engines": { 1845 | "node": ">=4" 1846 | } 1847 | }, 1848 | "node_modules/ora/node_modules/chalk": { 1849 | "version": "2.4.2", 1850 | "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", 1851 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1852 | "dependencies": { 1853 | "ansi-styles": "^3.2.1", 1854 | "escape-string-regexp": "^1.0.5", 1855 | "supports-color": "^5.3.0" 1856 | }, 1857 | "engines": { 1858 | "node": ">=4" 1859 | } 1860 | }, 1861 | "node_modules/ora/node_modules/cli-cursor": { 1862 | "version": "2.1.0", 1863 | "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz", 1864 | "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", 1865 | "dependencies": { 1866 | "restore-cursor": "^2.0.0" 1867 | }, 1868 | "engines": { 1869 | "node": ">=4" 1870 | } 1871 | }, 1872 | "node_modules/ora/node_modules/color-convert": { 1873 | "version": "1.9.3", 1874 | "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", 1875 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1876 | "dependencies": { 1877 | "color-name": "1.1.3" 1878 | } 1879 | }, 1880 | "node_modules/ora/node_modules/color-name": { 1881 | "version": "1.1.3", 1882 | "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", 1883 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 1884 | }, 1885 | "node_modules/ora/node_modules/has-flag": { 1886 | "version": "3.0.0", 1887 | "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", 1888 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1889 | "engines": { 1890 | "node": ">=4" 1891 | } 1892 | }, 1893 | "node_modules/ora/node_modules/mimic-fn": { 1894 | "version": "1.2.0", 1895 | "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz", 1896 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1897 | "engines": { 1898 | "node": ">=4" 1899 | } 1900 | }, 1901 | "node_modules/ora/node_modules/onetime": { 1902 | "version": "2.0.1", 1903 | "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz", 1904 | "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", 1905 | "dependencies": { 1906 | "mimic-fn": "^1.0.0" 1907 | }, 1908 | "engines": { 1909 | "node": ">=4" 1910 | } 1911 | }, 1912 | "node_modules/ora/node_modules/restore-cursor": { 1913 | "version": "2.0.0", 1914 | "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz", 1915 | "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", 1916 | "dependencies": { 1917 | "onetime": "^2.0.0", 1918 | "signal-exit": "^3.0.2" 1919 | }, 1920 | "engines": { 1921 | "node": ">=4" 1922 | } 1923 | }, 1924 | "node_modules/ora/node_modules/strip-ansi": { 1925 | "version": "5.2.0", 1926 | "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", 1927 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1928 | "dependencies": { 1929 | "ansi-regex": "^4.1.0" 1930 | }, 1931 | "engines": { 1932 | "node": ">=6" 1933 | } 1934 | }, 1935 | "node_modules/ora/node_modules/supports-color": { 1936 | "version": "5.5.0", 1937 | "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", 1938 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1939 | "dependencies": { 1940 | "has-flag": "^3.0.0" 1941 | }, 1942 | "engines": { 1943 | "node": ">=4" 1944 | } 1945 | }, 1946 | "node_modules/os-homedir": { 1947 | "version": "1.0.2", 1948 | "resolved": "https://registry.npmmirror.com/os-homedir/-/os-homedir-1.0.2.tgz", 1949 | "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", 1950 | "engines": { 1951 | "node": ">=0.10.0" 1952 | } 1953 | }, 1954 | "node_modules/os-name": { 1955 | "version": "1.0.3", 1956 | "resolved": "https://registry.npmmirror.com/os-name/-/os-name-1.0.3.tgz", 1957 | "integrity": "sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==", 1958 | "dependencies": { 1959 | "osx-release": "^1.0.0", 1960 | "win-release": "^1.0.0" 1961 | }, 1962 | "bin": { 1963 | "os-name": "cli.js" 1964 | }, 1965 | "engines": { 1966 | "node": ">=0.10.0" 1967 | } 1968 | }, 1969 | "node_modules/os-tmpdir": { 1970 | "version": "1.0.2", 1971 | "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1972 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 1973 | "engines": { 1974 | "node": ">=0.10.0" 1975 | } 1976 | }, 1977 | "node_modules/osenv": { 1978 | "version": "0.1.5", 1979 | "resolved": "https://registry.npmmirror.com/osenv/-/osenv-0.1.5.tgz", 1980 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 1981 | "dependencies": { 1982 | "os-homedir": "^1.0.0", 1983 | "os-tmpdir": "^1.0.0" 1984 | } 1985 | }, 1986 | "node_modules/osx-release": { 1987 | "version": "1.1.0", 1988 | "resolved": "https://registry.npmmirror.com/osx-release/-/osx-release-1.1.0.tgz", 1989 | "integrity": "sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==", 1990 | "dependencies": { 1991 | "minimist": "^1.1.0" 1992 | }, 1993 | "bin": { 1994 | "osx-release": "cli.js" 1995 | }, 1996 | "engines": { 1997 | "node": ">=0.10.0" 1998 | } 1999 | }, 2000 | "node_modules/p-map": { 2001 | "version": "2.1.0", 2002 | "resolved": "https://registry.npmmirror.com/p-map/-/p-map-2.1.0.tgz", 2003 | "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", 2004 | "engines": { 2005 | "node": ">=6" 2006 | } 2007 | }, 2008 | "node_modules/parseqs": { 2009 | "version": "0.0.6", 2010 | "resolved": "https://registry.npmmirror.com/parseqs/-/parseqs-0.0.6.tgz", 2011 | "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" 2012 | }, 2013 | "node_modules/parseuri": { 2014 | "version": "0.0.6", 2015 | "resolved": "https://registry.npmmirror.com/parseuri/-/parseuri-0.0.6.tgz", 2016 | "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" 2017 | }, 2018 | "node_modules/path-is-absolute": { 2019 | "version": "1.0.1", 2020 | "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2021 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2022 | "engines": { 2023 | "node": ">=0.10.0" 2024 | } 2025 | }, 2026 | "node_modules/path-parse": { 2027 | "version": "1.0.7", 2028 | "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", 2029 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 2030 | }, 2031 | "node_modules/pause-stream": { 2032 | "version": "0.0.11", 2033 | "resolved": "https://registry.npmmirror.com/pause-stream/-/pause-stream-0.0.11.tgz", 2034 | "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", 2035 | "dependencies": { 2036 | "through": "~2.3" 2037 | } 2038 | }, 2039 | "node_modules/performance-now": { 2040 | "version": "2.1.0", 2041 | "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz", 2042 | "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" 2043 | }, 2044 | "node_modules/platform": { 2045 | "version": "1.3.6", 2046 | "resolved": "https://registry.npmmirror.com/platform/-/platform-1.3.6.tgz", 2047 | "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" 2048 | }, 2049 | "node_modules/process-nextick-args": { 2050 | "version": "2.0.1", 2051 | "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2052 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2053 | }, 2054 | "node_modules/psl": { 2055 | "version": "1.9.0", 2056 | "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz", 2057 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" 2058 | }, 2059 | "node_modules/pump": { 2060 | "version": "3.0.0", 2061 | "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz", 2062 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2063 | "dependencies": { 2064 | "end-of-stream": "^1.1.0", 2065 | "once": "^1.3.1" 2066 | } 2067 | }, 2068 | "node_modules/punycode": { 2069 | "version": "2.3.1", 2070 | "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", 2071 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2072 | "engines": { 2073 | "node": ">=6" 2074 | } 2075 | }, 2076 | "node_modules/qs": { 2077 | "version": "6.11.2", 2078 | "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz", 2079 | "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", 2080 | "dependencies": { 2081 | "side-channel": "^1.0.4" 2082 | }, 2083 | "engines": { 2084 | "node": ">=0.6" 2085 | } 2086 | }, 2087 | "node_modules/readable-stream": { 2088 | "version": "2.3.8", 2089 | "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", 2090 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 2091 | "dependencies": { 2092 | "core-util-is": "~1.0.0", 2093 | "inherits": "~2.0.3", 2094 | "isarray": "~1.0.0", 2095 | "process-nextick-args": "~2.0.0", 2096 | "safe-buffer": "~5.1.1", 2097 | "string_decoder": "~1.1.1", 2098 | "util-deprecate": "~1.0.1" 2099 | } 2100 | }, 2101 | "node_modules/request": { 2102 | "version": "2.88.2", 2103 | "resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz", 2104 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 2105 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", 2106 | "dependencies": { 2107 | "aws-sign2": "~0.7.0", 2108 | "aws4": "^1.8.0", 2109 | "caseless": "~0.12.0", 2110 | "combined-stream": "~1.0.6", 2111 | "extend": "~3.0.2", 2112 | "forever-agent": "~0.6.1", 2113 | "form-data": "~2.3.2", 2114 | "har-validator": "~5.1.3", 2115 | "http-signature": "~1.2.0", 2116 | "is-typedarray": "~1.0.0", 2117 | "isstream": "~0.1.2", 2118 | "json-stringify-safe": "~5.0.1", 2119 | "mime-types": "~2.1.19", 2120 | "oauth-sign": "~0.9.0", 2121 | "performance-now": "^2.1.0", 2122 | "qs": "~6.5.2", 2123 | "safe-buffer": "^5.1.2", 2124 | "tough-cookie": "~2.5.0", 2125 | "tunnel-agent": "^0.6.0", 2126 | "uuid": "^3.3.2" 2127 | }, 2128 | "engines": { 2129 | "node": ">= 6" 2130 | } 2131 | }, 2132 | "node_modules/request/node_modules/qs": { 2133 | "version": "6.5.3", 2134 | "resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz", 2135 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", 2136 | "engines": { 2137 | "node": ">=0.6" 2138 | } 2139 | }, 2140 | "node_modules/resolve": { 2141 | "version": "1.22.8", 2142 | "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", 2143 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 2144 | "dependencies": { 2145 | "is-core-module": "^2.13.0", 2146 | "path-parse": "^1.0.7", 2147 | "supports-preserve-symlinks-flag": "^1.0.0" 2148 | }, 2149 | "bin": { 2150 | "resolve": "bin/resolve" 2151 | } 2152 | }, 2153 | "node_modules/restore-cursor": { 2154 | "version": "3.1.0", 2155 | "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", 2156 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 2157 | "dependencies": { 2158 | "onetime": "^5.1.0", 2159 | "signal-exit": "^3.0.2" 2160 | }, 2161 | "engines": { 2162 | "node": ">=8" 2163 | } 2164 | }, 2165 | "node_modules/rimraf": { 2166 | "version": "2.7.1", 2167 | "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz", 2168 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 2169 | "dependencies": { 2170 | "glob": "^7.1.3" 2171 | }, 2172 | "bin": { 2173 | "rimraf": "bin.js" 2174 | } 2175 | }, 2176 | "node_modules/run-async": { 2177 | "version": "2.4.1", 2178 | "resolved": "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz", 2179 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 2180 | "engines": { 2181 | "node": ">=0.12.0" 2182 | } 2183 | }, 2184 | "node_modules/runscript": { 2185 | "version": "1.6.0", 2186 | "resolved": "https://registry.npmmirror.com/runscript/-/runscript-1.6.0.tgz", 2187 | "integrity": "sha512-lI0ybcwtdC5Wz3aiVtMAK6U5jcTDeLseEBSXcz6ABtQeMmQGpj35dmzpmpy2C9Bn0k2wTjTRLZoya0NFt8Mxsg==", 2188 | "dependencies": { 2189 | "is-type-of": "^1.1.0" 2190 | }, 2191 | "engines": { 2192 | "node": ">=4.2.3" 2193 | } 2194 | }, 2195 | "node_modules/rxjs": { 2196 | "version": "6.6.7", 2197 | "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-6.6.7.tgz", 2198 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 2199 | "dependencies": { 2200 | "tslib": "^1.9.0" 2201 | }, 2202 | "engines": { 2203 | "npm": ">=2.0.0" 2204 | } 2205 | }, 2206 | "node_modules/safe-buffer": { 2207 | "version": "5.1.2", 2208 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", 2209 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2210 | }, 2211 | "node_modules/safer-buffer": { 2212 | "version": "2.1.2", 2213 | "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", 2214 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2215 | }, 2216 | "node_modules/sax": { 2217 | "version": "1.3.0", 2218 | "resolved": "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz", 2219 | "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" 2220 | }, 2221 | "node_modules/sdk-base": { 2222 | "version": "2.0.1", 2223 | "resolved": "https://registry.npmmirror.com/sdk-base/-/sdk-base-2.0.1.tgz", 2224 | "integrity": "sha512-eeG26wRwhtwYuKGCDM3LixCaxY27Pa/5lK4rLKhQa7HBjJ3U3Y+f81MMZQRsDw/8SC2Dao/83yJTXJ8aULuN8Q==", 2225 | "dependencies": { 2226 | "get-ready": "~1.0.0" 2227 | } 2228 | }, 2229 | "node_modules/semver": { 2230 | "version": "5.7.2", 2231 | "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", 2232 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 2233 | "bin": { 2234 | "semver": "bin/semver" 2235 | } 2236 | }, 2237 | "node_modules/set-blocking": { 2238 | "version": "2.0.0", 2239 | "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", 2240 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" 2241 | }, 2242 | "node_modules/set-function-length": { 2243 | "version": "1.2.1", 2244 | "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.1.tgz", 2245 | "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", 2246 | "dependencies": { 2247 | "define-data-property": "^1.1.2", 2248 | "es-errors": "^1.3.0", 2249 | "function-bind": "^1.1.2", 2250 | "get-intrinsic": "^1.2.3", 2251 | "gopd": "^1.0.1", 2252 | "has-property-descriptors": "^1.0.1" 2253 | }, 2254 | "engines": { 2255 | "node": ">= 0.4" 2256 | } 2257 | }, 2258 | "node_modules/side-channel": { 2259 | "version": "1.0.5", 2260 | "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.5.tgz", 2261 | "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", 2262 | "dependencies": { 2263 | "call-bind": "^1.0.6", 2264 | "es-errors": "^1.3.0", 2265 | "get-intrinsic": "^1.2.4", 2266 | "object-inspect": "^1.13.1" 2267 | }, 2268 | "engines": { 2269 | "node": ">= 0.4" 2270 | } 2271 | }, 2272 | "node_modules/signal-exit": { 2273 | "version": "3.0.7", 2274 | "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", 2275 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 2276 | }, 2277 | "node_modules/simple-git": { 2278 | "version": "2.48.0", 2279 | "resolved": "https://registry.npmmirror.com/simple-git/-/simple-git-2.48.0.tgz", 2280 | "integrity": "sha512-z4qtrRuaAFJS4PUd0g+xy7aN4y+RvEt/QTJpR184lhJguBA1S/LsVlvE/CM95RsYMOFJG3NGGDjqFCzKU19S/A==", 2281 | "dependencies": { 2282 | "@kwsites/file-exists": "^1.1.1", 2283 | "@kwsites/promise-deferred": "^1.1.1", 2284 | "debug": "^4.3.2" 2285 | } 2286 | }, 2287 | "node_modules/socket.io-client": { 2288 | "version": "2.5.0", 2289 | "resolved": "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-2.5.0.tgz", 2290 | "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==", 2291 | "dependencies": { 2292 | "backo2": "1.0.2", 2293 | "component-bind": "1.0.0", 2294 | "component-emitter": "~1.3.0", 2295 | "debug": "~3.1.0", 2296 | "engine.io-client": "~3.5.0", 2297 | "has-binary2": "~1.0.2", 2298 | "indexof": "0.0.1", 2299 | "parseqs": "0.0.6", 2300 | "parseuri": "0.0.6", 2301 | "socket.io-parser": "~3.3.0", 2302 | "to-array": "0.1.4" 2303 | } 2304 | }, 2305 | "node_modules/socket.io-client/node_modules/debug": { 2306 | "version": "3.1.0", 2307 | "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", 2308 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 2309 | "dependencies": { 2310 | "ms": "2.0.0" 2311 | } 2312 | }, 2313 | "node_modules/socket.io-client/node_modules/ms": { 2314 | "version": "2.0.0", 2315 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", 2316 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 2317 | }, 2318 | "node_modules/socket.io-parser": { 2319 | "version": "3.3.3", 2320 | "resolved": "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-3.3.3.tgz", 2321 | "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==", 2322 | "dependencies": { 2323 | "component-emitter": "~1.3.0", 2324 | "debug": "~3.1.0", 2325 | "isarray": "2.0.1" 2326 | } 2327 | }, 2328 | "node_modules/socket.io-parser/node_modules/debug": { 2329 | "version": "3.1.0", 2330 | "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", 2331 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 2332 | "dependencies": { 2333 | "ms": "2.0.0" 2334 | } 2335 | }, 2336 | "node_modules/socket.io-parser/node_modules/isarray": { 2337 | "version": "2.0.1", 2338 | "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.1.tgz", 2339 | "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" 2340 | }, 2341 | "node_modules/socket.io-parser/node_modules/ms": { 2342 | "version": "2.0.0", 2343 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", 2344 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 2345 | }, 2346 | "node_modules/spdx-correct": { 2347 | "version": "3.2.0", 2348 | "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", 2349 | "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", 2350 | "dependencies": { 2351 | "spdx-expression-parse": "^3.0.0", 2352 | "spdx-license-ids": "^3.0.0" 2353 | } 2354 | }, 2355 | "node_modules/spdx-exceptions": { 2356 | "version": "2.5.0", 2357 | "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", 2358 | "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" 2359 | }, 2360 | "node_modules/spdx-expression-parse": { 2361 | "version": "3.0.1", 2362 | "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 2363 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 2364 | "dependencies": { 2365 | "spdx-exceptions": "^2.1.0", 2366 | "spdx-license-ids": "^3.0.0" 2367 | } 2368 | }, 2369 | "node_modules/spdx-license-ids": { 2370 | "version": "3.0.17", 2371 | "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", 2372 | "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" 2373 | }, 2374 | "node_modules/sshpk": { 2375 | "version": "1.18.0", 2376 | "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz", 2377 | "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", 2378 | "dependencies": { 2379 | "asn1": "~0.2.3", 2380 | "assert-plus": "^1.0.0", 2381 | "bcrypt-pbkdf": "^1.0.0", 2382 | "dashdash": "^1.12.0", 2383 | "ecc-jsbn": "~0.1.1", 2384 | "getpass": "^0.1.1", 2385 | "jsbn": "~0.1.0", 2386 | "safer-buffer": "^2.0.2", 2387 | "tweetnacl": "~0.14.0" 2388 | }, 2389 | "bin": { 2390 | "sshpk-conv": "bin/sshpk-conv", 2391 | "sshpk-sign": "bin/sshpk-sign", 2392 | "sshpk-verify": "bin/sshpk-verify" 2393 | }, 2394 | "engines": { 2395 | "node": ">=0.10.0" 2396 | } 2397 | }, 2398 | "node_modules/statuses": { 2399 | "version": "1.5.0", 2400 | "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", 2401 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 2402 | "engines": { 2403 | "node": ">= 0.6" 2404 | } 2405 | }, 2406 | "node_modules/stream-http": { 2407 | "version": "2.8.2", 2408 | "resolved": "https://registry.npmmirror.com/stream-http/-/stream-http-2.8.2.tgz", 2409 | "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", 2410 | "dependencies": { 2411 | "builtin-status-codes": "^3.0.0", 2412 | "inherits": "^2.0.1", 2413 | "readable-stream": "^2.3.6", 2414 | "to-arraybuffer": "^1.0.0", 2415 | "xtend": "^4.0.0" 2416 | } 2417 | }, 2418 | "node_modules/stream-wormhole": { 2419 | "version": "1.1.0", 2420 | "resolved": "https://registry.npmmirror.com/stream-wormhole/-/stream-wormhole-1.1.0.tgz", 2421 | "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==", 2422 | "engines": { 2423 | "node": ">=4.0.0" 2424 | } 2425 | }, 2426 | "node_modules/string_decoder": { 2427 | "version": "1.1.1", 2428 | "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", 2429 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2430 | "dependencies": { 2431 | "safe-buffer": "~5.1.0" 2432 | } 2433 | }, 2434 | "node_modules/string-width": { 2435 | "version": "4.2.3", 2436 | "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", 2437 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2438 | "dependencies": { 2439 | "emoji-regex": "^8.0.0", 2440 | "is-fullwidth-code-point": "^3.0.0", 2441 | "strip-ansi": "^6.0.1" 2442 | }, 2443 | "engines": { 2444 | "node": ">=8" 2445 | } 2446 | }, 2447 | "node_modules/strip-ansi": { 2448 | "version": "6.0.1", 2449 | "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", 2450 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2451 | "dependencies": { 2452 | "ansi-regex": "^5.0.1" 2453 | }, 2454 | "engines": { 2455 | "node": ">=8" 2456 | } 2457 | }, 2458 | "node_modules/supports-color": { 2459 | "version": "7.2.0", 2460 | "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", 2461 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2462 | "dependencies": { 2463 | "has-flag": "^4.0.0" 2464 | }, 2465 | "engines": { 2466 | "node": ">=8" 2467 | } 2468 | }, 2469 | "node_modules/supports-hyperlinks": { 2470 | "version": "2.3.0", 2471 | "resolved": "https://registry.npmmirror.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", 2472 | "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", 2473 | "dependencies": { 2474 | "has-flag": "^4.0.0", 2475 | "supports-color": "^7.0.0" 2476 | }, 2477 | "engines": { 2478 | "node": ">=8" 2479 | } 2480 | }, 2481 | "node_modules/supports-preserve-symlinks-flag": { 2482 | "version": "1.0.0", 2483 | "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2484 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2485 | "engines": { 2486 | "node": ">= 0.4" 2487 | } 2488 | }, 2489 | "node_modules/tar": { 2490 | "version": "4.4.19", 2491 | "resolved": "https://registry.npmmirror.com/tar/-/tar-4.4.19.tgz", 2492 | "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", 2493 | "dependencies": { 2494 | "chownr": "^1.1.4", 2495 | "fs-minipass": "^1.2.7", 2496 | "minipass": "^2.9.0", 2497 | "minizlib": "^1.3.3", 2498 | "mkdirp": "^0.5.5", 2499 | "safe-buffer": "^5.2.1", 2500 | "yallist": "^3.1.1" 2501 | }, 2502 | "engines": { 2503 | "node": ">=4.5" 2504 | } 2505 | }, 2506 | "node_modules/tar/node_modules/safe-buffer": { 2507 | "version": "5.2.1", 2508 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", 2509 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2510 | }, 2511 | "node_modules/terminal-link": { 2512 | "version": "2.1.1", 2513 | "resolved": "https://registry.npmmirror.com/terminal-link/-/terminal-link-2.1.1.tgz", 2514 | "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", 2515 | "dependencies": { 2516 | "ansi-escapes": "^4.2.1", 2517 | "supports-hyperlinks": "^2.0.0" 2518 | }, 2519 | "engines": { 2520 | "node": ">=8" 2521 | } 2522 | }, 2523 | "node_modules/thenify": { 2524 | "version": "3.3.1", 2525 | "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", 2526 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 2527 | "dependencies": { 2528 | "any-promise": "^1.0.0" 2529 | } 2530 | }, 2531 | "node_modules/thenify-all": { 2532 | "version": "1.6.0", 2533 | "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", 2534 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 2535 | "dependencies": { 2536 | "thenify": ">= 3.1.0 < 4" 2537 | }, 2538 | "engines": { 2539 | "node": ">=0.8" 2540 | } 2541 | }, 2542 | "node_modules/through": { 2543 | "version": "2.3.8", 2544 | "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", 2545 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 2546 | }, 2547 | "node_modules/tmp": { 2548 | "version": "0.0.33", 2549 | "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz", 2550 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2551 | "dependencies": { 2552 | "os-tmpdir": "~1.0.2" 2553 | }, 2554 | "engines": { 2555 | "node": ">=0.6.0" 2556 | } 2557 | }, 2558 | "node_modules/to-array": { 2559 | "version": "0.1.4", 2560 | "resolved": "https://registry.npmmirror.com/to-array/-/to-array-0.1.4.tgz", 2561 | "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==" 2562 | }, 2563 | "node_modules/to-arraybuffer": { 2564 | "version": "1.0.1", 2565 | "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 2566 | "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" 2567 | }, 2568 | "node_modules/tough-cookie": { 2569 | "version": "2.5.0", 2570 | "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz", 2571 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 2572 | "dependencies": { 2573 | "psl": "^1.1.28", 2574 | "punycode": "^2.1.1" 2575 | }, 2576 | "engines": { 2577 | "node": ">=0.8" 2578 | } 2579 | }, 2580 | "node_modules/tslib": { 2581 | "version": "1.14.1", 2582 | "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", 2583 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 2584 | }, 2585 | "node_modules/tunnel-agent": { 2586 | "version": "0.6.0", 2587 | "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2588 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 2589 | "dependencies": { 2590 | "safe-buffer": "^5.0.1" 2591 | }, 2592 | "engines": { 2593 | "node": "*" 2594 | } 2595 | }, 2596 | "node_modules/tweetnacl": { 2597 | "version": "0.14.5", 2598 | "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz", 2599 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" 2600 | }, 2601 | "node_modules/type-fest": { 2602 | "version": "0.21.3", 2603 | "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", 2604 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 2605 | "engines": { 2606 | "node": ">=10" 2607 | } 2608 | }, 2609 | "node_modules/unescape": { 2610 | "version": "1.0.1", 2611 | "resolved": "https://registry.npmmirror.com/unescape/-/unescape-1.0.1.tgz", 2612 | "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", 2613 | "dependencies": { 2614 | "extend-shallow": "^2.0.1" 2615 | }, 2616 | "engines": { 2617 | "node": ">=0.10.0" 2618 | } 2619 | }, 2620 | "node_modules/universalify": { 2621 | "version": "2.0.1", 2622 | "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", 2623 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 2624 | "engines": { 2625 | "node": ">= 10.0.0" 2626 | } 2627 | }, 2628 | "node_modules/uri-js": { 2629 | "version": "4.4.1", 2630 | "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", 2631 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2632 | "dependencies": { 2633 | "punycode": "^2.1.0" 2634 | } 2635 | }, 2636 | "node_modules/url-join": { 2637 | "version": "4.0.1", 2638 | "resolved": "https://registry.npmmirror.com/url-join/-/url-join-4.0.1.tgz", 2639 | "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" 2640 | }, 2641 | "node_modules/urllib": { 2642 | "version": "2.41.0", 2643 | "resolved": "https://registry.npmmirror.com/urllib/-/urllib-2.41.0.tgz", 2644 | "integrity": "sha512-pNXdxEv52L67jahLT+/7QE+Fup1y2Gc6EdmrAhQ6OpQIC2rl14oWwv9hvk1GXOZqEnJNwRXHABuwgPOs1CtL7g==", 2645 | "dependencies": { 2646 | "any-promise": "^1.3.0", 2647 | "content-type": "^1.0.2", 2648 | "debug": "^2.6.9", 2649 | "default-user-agent": "^1.0.0", 2650 | "digest-header": "^1.0.0", 2651 | "ee-first": "~1.1.1", 2652 | "formstream": "^1.1.0", 2653 | "humanize-ms": "^1.2.0", 2654 | "iconv-lite": "^0.4.15", 2655 | "ip": "^1.1.5", 2656 | "pump": "^3.0.0", 2657 | "qs": "^6.4.0", 2658 | "statuses": "^1.3.1", 2659 | "utility": "^1.16.1" 2660 | }, 2661 | "engines": { 2662 | "node": ">= 0.10.0" 2663 | }, 2664 | "peerDependencies": { 2665 | "proxy-agent": "^5.0.0" 2666 | }, 2667 | "peerDependenciesMeta": { 2668 | "proxy-agent": { 2669 | "optional": true 2670 | } 2671 | } 2672 | }, 2673 | "node_modules/urllib/node_modules/debug": { 2674 | "version": "2.6.9", 2675 | "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", 2676 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2677 | "dependencies": { 2678 | "ms": "2.0.0" 2679 | } 2680 | }, 2681 | "node_modules/urllib/node_modules/ms": { 2682 | "version": "2.0.0", 2683 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", 2684 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 2685 | }, 2686 | "node_modules/user-home": { 2687 | "version": "2.0.0", 2688 | "resolved": "https://registry.npmmirror.com/user-home/-/user-home-2.0.0.tgz", 2689 | "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", 2690 | "dependencies": { 2691 | "os-homedir": "^1.0.0" 2692 | }, 2693 | "engines": { 2694 | "node": ">=0.10.0" 2695 | } 2696 | }, 2697 | "node_modules/util-deprecate": { 2698 | "version": "1.0.2", 2699 | "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", 2700 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 2701 | }, 2702 | "node_modules/utility": { 2703 | "version": "1.18.0", 2704 | "resolved": "https://registry.npmmirror.com/utility/-/utility-1.18.0.tgz", 2705 | "integrity": "sha512-PYxZDA+6QtvRvm//++aGdmKG/cI07jNwbROz0Ql+VzFV1+Z0Dy55NI4zZ7RHc9KKpBePNFwoErqIuqQv/cjiTA==", 2706 | "dependencies": { 2707 | "copy-to": "^2.0.1", 2708 | "escape-html": "^1.0.3", 2709 | "mkdirp": "^0.5.1", 2710 | "mz": "^2.7.0", 2711 | "unescape": "^1.0.1" 2712 | }, 2713 | "engines": { 2714 | "node": ">= 0.12.0" 2715 | } 2716 | }, 2717 | "node_modules/uuid": { 2718 | "version": "3.4.0", 2719 | "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", 2720 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 2721 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", 2722 | "bin": { 2723 | "uuid": "bin/uuid" 2724 | } 2725 | }, 2726 | "node_modules/validate-npm-package-license": { 2727 | "version": "3.0.4", 2728 | "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2729 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2730 | "dependencies": { 2731 | "spdx-correct": "^3.0.0", 2732 | "spdx-expression-parse": "^3.0.0" 2733 | } 2734 | }, 2735 | "node_modules/verror": { 2736 | "version": "1.10.0", 2737 | "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz", 2738 | "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", 2739 | "engines": [ 2740 | "node >=0.6.0" 2741 | ], 2742 | "dependencies": { 2743 | "assert-plus": "^1.0.0", 2744 | "core-util-is": "1.0.2", 2745 | "extsprintf": "^1.2.0" 2746 | } 2747 | }, 2748 | "node_modules/verror/node_modules/core-util-is": { 2749 | "version": "1.0.2", 2750 | "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", 2751 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" 2752 | }, 2753 | "node_modules/wcwidth": { 2754 | "version": "1.0.1", 2755 | "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", 2756 | "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", 2757 | "dependencies": { 2758 | "defaults": "^1.0.3" 2759 | } 2760 | }, 2761 | "node_modules/which": { 2762 | "version": "1.3.1", 2763 | "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", 2764 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2765 | "dependencies": { 2766 | "isexe": "^2.0.0" 2767 | }, 2768 | "bin": { 2769 | "which": "bin/which" 2770 | } 2771 | }, 2772 | "node_modules/wide-align": { 2773 | "version": "1.1.5", 2774 | "resolved": "https://registry.npmmirror.com/wide-align/-/wide-align-1.1.5.tgz", 2775 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 2776 | "dependencies": { 2777 | "string-width": "^1.0.2 || 2 || 3 || 4" 2778 | } 2779 | }, 2780 | "node_modules/win-release": { 2781 | "version": "1.1.1", 2782 | "resolved": "https://registry.npmmirror.com/win-release/-/win-release-1.1.1.tgz", 2783 | "integrity": "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==", 2784 | "dependencies": { 2785 | "semver": "^5.0.1" 2786 | }, 2787 | "engines": { 2788 | "node": ">=0.10.0" 2789 | } 2790 | }, 2791 | "node_modules/wrappy": { 2792 | "version": "1.0.2", 2793 | "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", 2794 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 2795 | }, 2796 | "node_modules/ws": { 2797 | "version": "7.4.6", 2798 | "resolved": "https://registry.npmmirror.com/ws/-/ws-7.4.6.tgz", 2799 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", 2800 | "engines": { 2801 | "node": ">=8.3.0" 2802 | }, 2803 | "peerDependencies": { 2804 | "bufferutil": "^4.0.1", 2805 | "utf-8-validate": "^5.0.2" 2806 | }, 2807 | "peerDependenciesMeta": { 2808 | "bufferutil": { 2809 | "optional": true 2810 | }, 2811 | "utf-8-validate": { 2812 | "optional": true 2813 | } 2814 | } 2815 | }, 2816 | "node_modules/xml2js": { 2817 | "version": "0.6.2", 2818 | "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.6.2.tgz", 2819 | "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", 2820 | "dependencies": { 2821 | "sax": ">=0.6.0", 2822 | "xmlbuilder": "~11.0.0" 2823 | }, 2824 | "engines": { 2825 | "node": ">=4.0.0" 2826 | } 2827 | }, 2828 | "node_modules/xmlbuilder": { 2829 | "version": "11.0.1", 2830 | "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 2831 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 2832 | "engines": { 2833 | "node": ">=4.0" 2834 | } 2835 | }, 2836 | "node_modules/xmlhttprequest-ssl": { 2837 | "version": "1.6.3", 2838 | "resolved": "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", 2839 | "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", 2840 | "engines": { 2841 | "node": ">=0.4.0" 2842 | } 2843 | }, 2844 | "node_modules/xtend": { 2845 | "version": "4.0.2", 2846 | "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", 2847 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2848 | "engines": { 2849 | "node": ">=0.4" 2850 | } 2851 | }, 2852 | "node_modules/yallist": { 2853 | "version": "3.1.1", 2854 | "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", 2855 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 2856 | }, 2857 | "node_modules/yeast": { 2858 | "version": "0.1.2", 2859 | "resolved": "https://registry.npmmirror.com/yeast/-/yeast-0.1.2.tgz", 2860 | "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" 2861 | } 2862 | } 2863 | } 2864 | -------------------------------------------------------------------------------- /packages/replace/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@imooc-cli/replace", 3 | "version": "1.1.2", 4 | "description": "> TODO: description", 5 | "author": "sam <247765564@qq.com>", 6 | "homepage": "https://github.com/sam9831/imooc-cli#readme", 7 | "license": "ISC", 8 | "main": "lib/index.js", 9 | "directories": { 10 | "lib": "lib", 11 | "test": "__tests__" 12 | }, 13 | "files": [ 14 | "lib" 15 | ], 16 | "publishConfig": { 17 | "access": "public" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "git+https://github.com/sam9831/imooc-cli.git" 22 | }, 23 | "scripts": { 24 | "test": "echo \"Error: run tests from root\" && exit 1" 25 | }, 26 | "bugs": { 27 | "url": "https://github.com/sam9831/imooc-cli/issues" 28 | }, 29 | "dependencies": { 30 | "@imooc-cli/utils": "^1.1.1", 31 | "ali-oss": "^6.13.2", 32 | "fs-extra": "^9.1.0", 33 | "glob": "^7.1.6" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /packages/utils/README.md: -------------------------------------------------------------------------------- 1 | # 慕课网前端统一研发脚手架 2 | 3 | ## About 4 | 5 | 慕课网前端架构师课程专属脚手架 6 | 7 | ## Getting Started 8 | 9 | 安装: 10 | 11 | ```bash 12 | npm install -g @imooc-cli/core 13 | # OR 14 | yarn global add @imooc-cli/core 15 | ``` 16 | 17 | 创建项目 18 | 19 | ```bash 20 | imooc-cli init 21 | ``` 22 | 23 | 发布项目 24 | 25 | ```bash 26 | imooc-cli publish 27 | ``` 28 | 29 | ## More 30 | 31 | DEBUG 模式: 32 | 33 | ```bash 34 | imooc-cli --debug 35 | ``` 36 | 37 | 指定本地包: 38 | 39 | ```bash 40 | imooc-cli init --packagePath /Users/sam/Desktop/imooc-cli/packages/init/ 41 | ``` 42 | -------------------------------------------------------------------------------- /packages/utils/__tests__/utils.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const utils = require('..'); 4 | 5 | describe('@imooc-cli/utils', () => { 6 | it('needs tests'); 7 | }); 8 | -------------------------------------------------------------------------------- /packages/utils/lib/Build/CloudBuild.js: -------------------------------------------------------------------------------- 1 | const io = require('socket.io-client'); 2 | const get = require('lodash/get'); 3 | const { parseMsg } = require('./parse'); 4 | const log = require('../log'); 5 | const getOSSProject = require('./getOSSProject'); 6 | const inquirer = require('../inquirer'); 7 | 8 | const WS_SERVER = 'ws://book.youbaobao.xyz:7002'; 9 | const FAILED_CODE = [ 'prepare failed', 'download failed', 'build failed', 'pre-publish failed', 'publish failed' ]; 10 | 11 | class CloudBuild { 12 | constructor(git, type, options = {}) { 13 | log.verbose('CloudBuild options', options); 14 | this._git = git; 15 | this._type = type; // 发布类型,目前仅支持oss 16 | this._timeout = get(options, 'timeout') || 1200 * 1000; // 默认超时时间20分钟 17 | this._prod = options.prod; 18 | this._keepCache = options.keepCache; 19 | this._cnpm = options.cnpm; 20 | this._buildCmd = options.buildCmd; 21 | } 22 | 23 | timeout = (fn, timeout) => { 24 | clearTimeout(this.timer); 25 | log.notice('设置任务超时时间:', `${+timeout / 1000}秒`); 26 | this.timer = setTimeout(fn, timeout); 27 | }; 28 | 29 | prepare = async () => { 30 | // 如果是上线发布,则检查OSS中是否存在项目 31 | const projectName = this._git.name; 32 | if (this._prod) { 33 | const ossProject = await getOSSProject({ 34 | name: projectName, 35 | type: this._prod ? 'prod' : 'dev', 36 | }); 37 | if (ossProject.code === 0 && ossProject.data.length > 0) { 38 | const cover = await inquirer({ 39 | type: 'list', 40 | choices: [ { name: '覆盖发布', value: true }, { name: '放弃发布', value: false } ], 41 | defaultValue: true, 42 | message: `OSS已存在 [${projectName}] 项目,是否强行覆盖发布?`, 43 | }); 44 | if (!cover) { 45 | throw new Error('发布终止'); 46 | } 47 | } 48 | } 49 | }; 50 | 51 | init = () => { 52 | log.notice('开始云构建任务初始化'); 53 | log.verbose(this._git.remote); 54 | return new Promise((resolve, reject) => { 55 | const socket = io(WS_SERVER, { 56 | query: { 57 | repo: this._git.remote, 58 | type: this._type, 59 | name: this._git.name, 60 | branch: this._git.branch, 61 | version: this._git.version, 62 | prod: this._prod, 63 | keepCache: this._keepCache, 64 | cnpm: this._cnpm, 65 | buildCmd: this._buildCmd, 66 | }, 67 | transports: [ 'websocket' ], 68 | }); 69 | this.timeout(() => { 70 | log.error('云构建服务创建超时,自动终止'); 71 | disconnect(); 72 | }, 5000); 73 | const disconnect = () => { 74 | clearTimeout(this.timer); 75 | socket.disconnect(); 76 | socket.close(); 77 | }; 78 | socket.on('connect', () => { 79 | const id = socket.id; 80 | log.success('云构建任务创建成功', `任务ID:${id}`); 81 | this.timeout(() => { 82 | log.error('云构建服务执行超时,自动终止'); 83 | disconnect(); 84 | }, this._timeout); 85 | socket.on(id, msg => { 86 | const parsedMsg = parseMsg(msg); 87 | log.success(parsedMsg.action, parsedMsg.message); 88 | }); 89 | resolve(); 90 | }); 91 | socket.on('disconnect', () => { 92 | log.success('disconnect', '云构建任务断开'); 93 | disconnect(); 94 | }); 95 | socket.on('error', (err) => { 96 | log.error('云构建出错', err); 97 | disconnect(); 98 | reject(err); 99 | }); 100 | this._socket = socket; 101 | }); 102 | }; 103 | 104 | build = () => { 105 | let ret = true; 106 | return new Promise((resolve, reject) => { 107 | this._socket.emit('build'); 108 | this._socket.on('build', (msg) => { 109 | const parsedMsg = parseMsg(msg); 110 | if (FAILED_CODE.indexOf(parsedMsg.action) >= 0) { 111 | log.error(parsedMsg.action, parsedMsg.message); 112 | clearTimeout(this.timer); 113 | this._socket.disconnect(); 114 | this._socket.close(); 115 | ret = false; 116 | } else { 117 | log.success(parsedMsg.action, parsedMsg.message); 118 | } 119 | }); 120 | this._socket.on('building', (msg) => { 121 | console.log(msg); 122 | }); 123 | this._socket.on('disconnect', () => { 124 | resolve(ret); 125 | }); 126 | this._socket.on('error', (err) => { 127 | reject(err); 128 | }); 129 | }) 130 | }; 131 | } 132 | 133 | module.exports = CloudBuild; 134 | -------------------------------------------------------------------------------- /packages/utils/lib/Build/getOSSFile.js: -------------------------------------------------------------------------------- 1 | const request = require('../request'); 2 | 3 | module.exports = function(params) { 4 | return request({ 5 | url: '/oss/get', 6 | params, 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/utils/lib/Build/getOSSProject.js: -------------------------------------------------------------------------------- 1 | const request = require('../request'); 2 | 3 | module.exports = function(params) { 4 | return request({ 5 | url: '/project/oss', 6 | params, 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/utils/lib/Build/parse.js: -------------------------------------------------------------------------------- 1 | const get = require('lodash/get'); 2 | 3 | function createMsg(action, payload = {}, metadata = {}) { 4 | const meta = Object.assign({}, { 5 | timestamp: Date.now(), 6 | }, metadata); 7 | 8 | return { 9 | meta, 10 | data: { 11 | action, 12 | payload, 13 | }, 14 | }; 15 | } 16 | 17 | function parseMsg(msg) { 18 | const action = get(msg, 'data.action'); 19 | const message = get(msg, 'data.payload.message'); 20 | return { 21 | action, 22 | message, 23 | }; 24 | } 25 | 26 | module.exports = { 27 | createMsg, 28 | parseMsg, 29 | }; 30 | -------------------------------------------------------------------------------- /packages/utils/lib/Git/ComponentRequest.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | 3 | module.exports = { 4 | createComponent: async function(component) { 5 | try { 6 | const response = await axios.post('http://book.youbaobao.xyz:7002/api/v1/components', component); 7 | const { data } = response; 8 | if (data.code === 0) { 9 | return data.data; 10 | } else { 11 | return null; 12 | } 13 | } catch (e) { 14 | throw e; 15 | } 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /packages/utils/lib/Git/Git.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const fse = require('fs-extra'); 4 | const SimpleGit = require('simple-git'); 5 | const userHome = require('user-home'); 6 | const semver = require('semver'); 7 | const log = require('../log'); 8 | const inquirer = require('../inquirer'); 9 | const terminalLink = require('../terminalLink'); 10 | const spinner = require('../spinner'); 11 | const Github = require('./Github'); 12 | const Gitee = require('./Gitee'); 13 | const CloudBuild = require('../Build/CloudBuild'); 14 | const { readFile, writeFile } = require('../file'); 15 | const ComponentRequest = require('./ComponentRequest'); 16 | const getOSSFile = require('../Build/getOSSFile'); 17 | const get = require('lodash/get'); 18 | const axios = require('axios'); 19 | 20 | const DEFAULT_CLI_HOME = '.imooc-cli'; 21 | const GIT_ROOT_DIR = '.git'; 22 | const GIT_SERVER_FILE = '.git_server'; 23 | const GIT_TOKEN_FILE = '.git_token'; 24 | const GIT_LOGIN_FILE = '.git_login'; 25 | const GIT_OWN_FILE = '.git_own'; 26 | const GIT_PUBLISH_FILE = '.git_publish'; 27 | const GIT_IGNORE_FILE = '.gitignore'; 28 | const REPO_OWNER_USER = 'user'; // 用户仓库 29 | const REPO_OWNER_ORG = 'org'; // 组织仓库 30 | 31 | const GITHUB = 'github'; 32 | const GITEE = 'gitee'; 33 | 34 | const VERSION_RELEASE = 'release'; 35 | const VERSION_DEVELOP = 'dev'; 36 | const COMPONENT_FILE = '.componentrc'; 37 | 38 | const TEMPLATE_TEMP_DIR = 'oss'; 39 | 40 | const GIT_SERVER_TYPE = [ { 41 | name: 'Github', 42 | value: GITHUB, 43 | }, { 44 | name: 'Gitee(码云)', 45 | value: GITEE, 46 | } ]; 47 | 48 | const GIT_OWNER_TYPE = [ { 49 | name: '个人', 50 | value: REPO_OWNER_USER, 51 | }, { 52 | name: '组织', 53 | value: REPO_OWNER_ORG, 54 | } ]; 55 | 56 | const GIT_OWNER_TYPE_ONLY = [ { 57 | name: '个人', 58 | value: REPO_OWNER_USER, 59 | } ]; 60 | 61 | const GIT_PUBLISH_TYPE = [ { 62 | name: 'OSS', 63 | value: 'oss', 64 | } ]; 65 | 66 | function createGitServer(gitServer) { 67 | if (gitServer === GITHUB) { 68 | return new Github(); 69 | } else if (gitServer === GITEE) { 70 | return new Gitee(); 71 | } 72 | return null; 73 | } 74 | 75 | /** 76 | * Git 操作基类 77 | */ 78 | class Git { 79 | /** 80 | * 构造函数 81 | * 82 | * @param dir git 仓库本地目录 83 | * @param name git 仓库名称 84 | * @param version git 分支号 85 | * @param cliHome 缓存根目录 86 | * @param refreshToken 是否强制刷新token数据 87 | * @param refreshOwner 是否强制刷新own数据 88 | * @param refreshServer 是否强制刷新git远程仓库类型 89 | * @param prod 是否为正式发布,正式发布后会建立tag删除开发分支 90 | * @param sshUser 远程服务器用户名 91 | * @param sshIp 远程服务器IP 92 | * @param sshPath 远程服务器路径 93 | */ 94 | constructor({ dir, name, version }, { 95 | cliHome, refreshToken, refreshOwner, refreshServer, 96 | sshUser, sshIp, sshPath, prod, keepCache, cnpm, buildCmd, 97 | }) { 98 | this.git = SimpleGit(dir); 99 | this.name = name; 100 | this.version = version; 101 | this.dir = dir; // 仓库本地路径 102 | this.owner = REPO_OWNER_USER; // owner 信息 103 | this.login = null; // 当前登录用户信息 104 | this.repo = null; // git 仓库 105 | this.homePath = cliHome; // 用户缓存主目录 106 | this.refreshToken = refreshToken; // 强制刷新 token 107 | this.refreshOwner = refreshOwner; // 强制刷新 owner 108 | this.refreshServer = refreshServer; // 强制刷新 git 远程仓库类型 109 | this.sshUser = sshUser; 110 | this.sshIp = sshIp; 111 | this.sshPath = sshPath; 112 | this.gitServer = null; // 默认远程 git 服务 113 | this.prod = prod; // 是否为正式发布 114 | this.keepCache = keepCache; // 是否保留服务端缓存(用于调试bug) 115 | this.cnpm = cnpm; // 是否使用cnpm 116 | this.buildCmd = buildCmd; // 手动指定build命令 117 | } 118 | 119 | // 核心业务逻辑,提交代码前的准备工作 120 | prepare = async () => { 121 | this.checkHomePath(); 122 | await this.checkGitServer(); 123 | await this.checkGitToken(); 124 | await this.checkUserAndOrgs(); 125 | await this.checkGitOwner(); 126 | await this.checkRepo(); 127 | await this.checkGitIgnore(); 128 | await this.checkComponent(); 129 | await this.init(); 130 | }; 131 | 132 | // 检查缓存主目录 133 | checkHomePath = () => { 134 | if (!this.homePath) { 135 | if (process.env.CLI_HOME) { 136 | this.homePath = path.resolve(userHome, process.env.CLI_HOME); 137 | } else { 138 | this.homePath = path.resolve(userHome, DEFAULT_CLI_HOME); 139 | } 140 | } 141 | log.verbose('home', this.homePath); 142 | fse.ensureDirSync(this.homePath); 143 | if (!fs.existsSync(this.homePath)) { 144 | throw new Error('用户主目录获取失败!'); 145 | } 146 | }; 147 | 148 | // 创建缓存目录 149 | createPath = (file) => { 150 | const rootDir = path.resolve(this.homePath, GIT_ROOT_DIR); 151 | const filePath = path.resolve(rootDir, file); 152 | fse.ensureDirSync(rootDir); 153 | return filePath; 154 | }; 155 | 156 | // 选择远程 git 平台 157 | checkGitServer = async () => { 158 | const gitServerPath = this.createPath(GIT_SERVER_FILE); 159 | let gitServer = readFile(gitServerPath); 160 | if (!gitServer || this.refreshServer) { 161 | gitServer = await inquirer({ 162 | type: 'list', 163 | choices: GIT_SERVER_TYPE, 164 | message: '请选择您想要托管的Git平台', 165 | }); 166 | writeFile(gitServerPath, gitServer); 167 | log.success('git server写入成功', `${gitServer} -> ${gitServerPath}`); 168 | } else { 169 | log.success('git server获取成功', gitServer); 170 | } 171 | this.gitServer = createGitServer(gitServer); 172 | }; 173 | 174 | // 检查 git API 必须的 token 175 | checkGitToken = async () => { 176 | const tokenPath = this.createPath(GIT_TOKEN_FILE); 177 | let token = readFile(tokenPath); 178 | if (!token || this.refreshToken) { 179 | log.notice(this.gitServer.type + ' token未生成', '请先生成 ' + this.gitServer.type + ' token,' + terminalLink('链接', this.gitServer.getTokenHelpUrl())); 180 | token = await inquirer({ 181 | type: 'password', 182 | message: '请将token复制到这里', 183 | defaultValue: '', 184 | }); 185 | writeFile(tokenPath, token); 186 | log.success('token 写入成功', `${token} -> ${tokenPath}`); 187 | } else { 188 | log.verbose('token', token); 189 | log.success('token 获取成功', tokenPath); 190 | } 191 | this.token = token; 192 | this.gitServer.setToken(token); 193 | }; 194 | 195 | // 获取用户和组织信息 196 | checkUserAndOrgs = async () => { 197 | this.user = await this.gitServer.getUser(); 198 | this.orgs = await this.gitServer.getOrgs(); 199 | if (!this.user) { 200 | throw new Error('用户或组织信息获取失败'); 201 | } 202 | log.success(this.gitServer.type + ' 用户和组织信息获取成功'); 203 | }; 204 | 205 | // 检查 git owner 是否选择 206 | checkGitOwner = async () => { 207 | const ownerPath = this.createPath(GIT_OWN_FILE); 208 | const loginPath = this.createPath(GIT_LOGIN_FILE); 209 | let owner = readFile(ownerPath); 210 | let login = readFile(loginPath); 211 | if (!owner || !login || this.refreshOwner) { 212 | log.notice(this.gitServer.type + ' owner 未生成,先选择 owner'); 213 | owner = await inquirer({ 214 | type: 'list', 215 | choices: this.orgs.length > 0 ? GIT_OWNER_TYPE : GIT_OWNER_TYPE_ONLY, 216 | message: '请选择远程仓库类型', 217 | }); 218 | if (owner === REPO_OWNER_USER) { 219 | login = this.user.login; 220 | } else { 221 | login = await inquirer({ 222 | type: 'list', 223 | choices: this.orgs.map(item => ({ 224 | name: item.login, 225 | value: item.login, 226 | })), 227 | message: '请选择', 228 | }); 229 | } 230 | writeFile(ownerPath, owner); 231 | writeFile(loginPath, login); 232 | log.success('git owner写入成功', `${owner} -> ${ownerPath}`); 233 | log.success('git login写入成功', `${login} -> ${loginPath}`); 234 | } else { 235 | log.success('git owner 获取成功', owner); 236 | log.success('git login 获取成功', login); 237 | } 238 | this.owner = owner; 239 | this.login = login; 240 | }; 241 | 242 | // 检查远程仓库 243 | checkRepo = async () => { 244 | let repo = await this.gitServer.getRepo(this.login, this.name); 245 | if (!repo) { 246 | let spinnerStart = spinner('开始创建远程仓库...'); 247 | try { 248 | if (this.owner === REPO_OWNER_USER) { 249 | repo = await this.gitServer.createRepo(this.name); 250 | } else { 251 | repo = await this.gitServer.createOrgRepo(this.name, this.login); 252 | } 253 | } finally { 254 | spinnerStart.stop(true); 255 | } 256 | if (repo) { 257 | log.success('远程仓库创建成功'); 258 | } else { 259 | throw new Error('远程仓库创建失败'); 260 | } 261 | } 262 | log.success('远程仓库信息获取成功'); 263 | this.repo = repo; 264 | }; 265 | 266 | // 检查 .gitignore 267 | checkGitIgnore = async () => { 268 | const gitIgnore = path.resolve(this.dir, GIT_IGNORE_FILE); 269 | if (!fs.existsSync(gitIgnore)) { 270 | if (this.isComponent()) { 271 | writeFile(gitIgnore, `.DS_Store 272 | node_modules 273 | 274 | 275 | # local env files 276 | .env.local 277 | .env.*.local 278 | 279 | # Log files 280 | npm-debug.log* 281 | yarn-debug.log* 282 | yarn-error.log* 283 | pnpm-debug.log* 284 | 285 | # Editor directories and files 286 | .idea 287 | .vscode 288 | *.suo 289 | *.ntvs* 290 | *.njsproj 291 | *.sln 292 | *.sw?`); 293 | log.success('自动写入 .gitignore 文件'); 294 | } else { 295 | writeFile(gitIgnore, `.DS_Store 296 | node_modules 297 | /dist 298 | 299 | 300 | # local env files 301 | .env.local 302 | .env.*.local 303 | 304 | # Log files 305 | npm-debug.log* 306 | yarn-debug.log* 307 | yarn-error.log* 308 | pnpm-debug.log* 309 | 310 | # Editor directories and files 311 | .idea 312 | .vscode 313 | *.suo 314 | *.ntvs* 315 | *.njsproj 316 | *.sln 317 | *.sw?`); 318 | log.success('自动写入 .gitignore 文件'); 319 | } 320 | } 321 | }; 322 | 323 | // 检查 component 324 | checkComponent = async () => { 325 | let componentFile = this.isComponent(); 326 | // 只有 component 才启动该逻辑 327 | if (componentFile) { 328 | log.notice('开始检查 build 结果'); 329 | require('child_process').execSync('npm run build', { 330 | cwd: this.dir, 331 | }); 332 | const buildPath = path.resolve(this.dir, componentFile.buildPath); 333 | if (!fs.existsSync(buildPath)) { 334 | throw new Error(`构建结果:${buildPath} 不存在!`); 335 | } 336 | const pkg = this.getPackageJson(); 337 | if (!pkg.files || !pkg.files.includes(componentFile.buildPath)) { 338 | throw new Error(`package.json 中 files 属性未添加构建结果目录:[${componentFile.buildPath}],请在 package.json 中手动添加!`); 339 | } 340 | log.notice('build 结果检查通过'); 341 | } 342 | }; 343 | 344 | // 初始化 345 | init = async () => { 346 | if (await this.getRemote()) { 347 | return true; 348 | } 349 | await this.initAndAddRemote(); 350 | await this.initCommit(); 351 | }; 352 | 353 | getRemote = async () => { 354 | const gitPath = path.resolve(this.dir, GIT_ROOT_DIR); 355 | this.remote = this.gitServer.getRemote(this.login, this.name); 356 | if (fs.existsSync(gitPath)) { 357 | log.success('git 已完成初始化'); 358 | return true; 359 | } 360 | }; 361 | 362 | initAndAddRemote = async () => { 363 | log.notice('执行 git 初始化'); 364 | await this.git.init(this.dir); 365 | log.notice('添加 git remote'); 366 | const remotes = await this.git.getRemotes(); 367 | log.verbose('git remotes', remotes); 368 | if (!remotes.find(item => item.name === 'origin')) { 369 | await this.git.addRemote('origin', this.remote); 370 | } 371 | }; 372 | 373 | initCommit = async () => { 374 | await this.checkConflicted(); 375 | await this.checkNotCommitted(); 376 | if (await this.checkRemoteMaster()) { 377 | log.notice('远程存在 master 分支,强制合并'); 378 | await this.pullRemoteRepo('master', { '--allow-unrelated-histories': null }); 379 | } else { 380 | await this.pushRemoteRepo('master'); 381 | } 382 | }; 383 | 384 | checkRemoteMaster = async () => { 385 | return (await this.git.listRemote([ '--refs' ])).indexOf('refs/heads/master') >= 0; 386 | }; 387 | 388 | checkConflicted = async () => { 389 | log.notice('代码冲突检查'); 390 | const status = await this.git.status(); 391 | if (status.conflicted.length > 0) { 392 | throw new Error('当前代码存在冲突,请手动处理合并后再试!'); 393 | } 394 | log.success('代码检查通过'); 395 | }; 396 | 397 | checkNotCommitted = async () => { 398 | const status = await this.git.status(); 399 | if (status.not_added.length > 0 || 400 | status.created.length > 0 || 401 | status.deleted.length > 0 || 402 | status.modified.length > 0 || 403 | status.renamed.length > 0) { 404 | log.verbose('status', status); 405 | await this.git.add(status.not_added); 406 | await this.git.add(status.created); 407 | await this.git.add(status.deleted); 408 | await this.git.add(status.modified); 409 | await this.git.add(status.renamed); 410 | let message; 411 | while (!message) { 412 | message = await inquirer({ 413 | type: 'text', 414 | message: '请输入 commit 信息:', 415 | defaultValue: '', 416 | }); 417 | } 418 | await this.git.commit(message); 419 | log.success('本地 commit 提交成功'); 420 | } 421 | }; 422 | 423 | pullRemoteRepo = async (branchName, options = {}) => { 424 | log.notice(`同步远程 ${branchName} 分支代码`); 425 | await this.git.pull('origin', branchName, options).catch(err => { 426 | if (err.message.indexOf('Permission denied (publickey)') >= 0) { 427 | throw new Error(`请获取本地 ssh publickey 并配置到:${this.gitServer.getSSHKeysUrl()},配置方法:${this.gitServer.getSSHKeysHelpUrl()}`); 428 | } else if (err.message.indexOf('Couldn\'t find remote ref ' + branchName) >= 0) { 429 | log.notice('获取远程 [' + branchName + '] 分支失败'); 430 | } else { 431 | log.error(err.message); 432 | } 433 | log.error('请重新执行 imooc-cli publish,如仍然报错请尝试删除 .git 目录后重试'); 434 | process.exit(0); 435 | }); 436 | }; 437 | 438 | pushRemoteRepo = async (branchName) => { 439 | log.notice(`推送代码至远程 ${branchName} 分支`); 440 | await this.git.push('origin', branchName); 441 | log.success('推送代码成功'); 442 | }; 443 | 444 | getCorrectVersion = async () => { 445 | log.notice('获取代码分支'); 446 | const remoteBranchList = await this.getRemoteBranchList(VERSION_RELEASE); 447 | let releaseVersion = null; 448 | if (remoteBranchList && remoteBranchList.length > 0) { 449 | // 获取最近的线上版本 450 | releaseVersion = remoteBranchList[0]; 451 | } 452 | const devVersion = this.version; 453 | if (!releaseVersion) { 454 | this.branch = `${VERSION_DEVELOP}/${devVersion}`; 455 | } else if (semver.gt(this.version, releaseVersion)) { 456 | log.info('当前版本大于线上最新版本', `${devVersion} >= ${releaseVersion}`); 457 | this.branch = `${VERSION_DEVELOP}/${devVersion}`; 458 | } else { 459 | log.notice('当前线上版本大于或等于本地版本', `${releaseVersion} >= ${devVersion}`); 460 | const incType = await inquirer({ 461 | type: 'list', 462 | choices: [ { 463 | name: `小版本(${releaseVersion} -> ${semver.inc(releaseVersion, 'patch')})`, 464 | value: 'patch', 465 | }, { 466 | name: `中版本(${releaseVersion} -> ${semver.inc(releaseVersion, 'minor')})`, 467 | value: 'minor', 468 | }, { 469 | name: `大版本(${releaseVersion} -> ${semver.inc(releaseVersion, 'major')})`, 470 | value: 'major', 471 | } ], 472 | defaultValue: 'patch', 473 | message: '自动升级版本,请选择升级版本类型', 474 | }); 475 | const incVersion = semver.inc(releaseVersion, incType); 476 | this.branch = `${VERSION_DEVELOP}/${incVersion}`; 477 | this.version = incVersion; 478 | this.syncVersionToPackageJson(); 479 | } 480 | log.success(`代码分支获取成功 ${this.branch}`); 481 | }; 482 | 483 | syncVersionToPackageJson = () => { 484 | const pkg = fse.readJsonSync(`${this.dir}/package.json`); 485 | if (pkg && pkg.version !== this.version) { 486 | pkg.version = this.version; 487 | fse.writeJsonSync(`${this.dir}/package.json`, pkg, { spaces: 2 }); 488 | } 489 | }; 490 | 491 | getRemoteBranchList = async (type) => { 492 | // git ls-remote --refs 493 | const remoteList = await this.git.listRemote([ '--refs' ]); 494 | let reg; 495 | if (type === VERSION_RELEASE) { 496 | reg = /.+?refs\/tags\/release\/(\d+\.\d+\.\d+)/g; 497 | } else { 498 | reg = /.+?refs\/heads\/dev\/(\d+\.\d+\.\d+)/g; 499 | } 500 | return remoteList.split('\n').map(remote => { 501 | const match = reg.exec(remote); 502 | reg.lastIndex = 0; 503 | if (match && semver.valid(match[1])) { 504 | return match[1]; 505 | } 506 | }).filter(_ => _).sort((a, b) => { 507 | if (semver.lte(b, a)) { 508 | if (a === b) return 0; 509 | return -1; 510 | } 511 | return 1; 512 | }); 513 | }; 514 | 515 | checkoutBranch = async (branch) => { 516 | const localBranchList = await this.git.branchLocal(); 517 | if (localBranchList.all.indexOf(branch) >= 0) { 518 | await this.git.checkout(branch); 519 | } else { 520 | await this.git.checkoutLocalBranch(branch); 521 | } 522 | log.success(`分支切换到${branch}`); 523 | }; 524 | 525 | checkStash = async () => { 526 | log.notice('检查 stash 记录'); 527 | const stashList = await this.git.stashList(); 528 | if (stashList.all.length > 0) { 529 | await this.git.stash([ 'pop' ]); 530 | log.success('stash pop 成功'); 531 | } 532 | }; 533 | 534 | pullRemoteMasterAndBranch = async () => { 535 | log.notice(`合并 [master] -> [${this.branch}]`); 536 | await this.pullRemoteRepo('master'); 537 | log.success('合并远程 [master] 分支内容成功'); 538 | await this.checkConflicted(); 539 | log.notice('检查远程分支'); 540 | const remoteBranchList = await this.getRemoteBranchList(); 541 | if (remoteBranchList.indexOf(this.version) >= 0) { 542 | log.notice(`合并 [${this.branch}] -> [${this.branch}]`); 543 | await this.pullRemoteRepo(this.branch); 544 | log.success(`合并远程 [${this.branch}] 分支内容成功`); 545 | await this.checkConflicted(); 546 | } else { 547 | log.success(`不存在远程分支 [${this.branch}]`); 548 | } 549 | }; 550 | 551 | // 提交代码 552 | commit = async () => { 553 | await this.getCorrectVersion(); 554 | await this.checkStash(); 555 | await this.checkConflicted(); 556 | await this.checkNotCommitted(); 557 | await this.checkoutBranch(this.branch); 558 | await this.pullRemoteMasterAndBranch(); 559 | await this.pushRemoteRepo(this.branch); 560 | }; 561 | 562 | // 发布前自动检查 563 | prePublish = async () => { 564 | log.notice('开始执行发布前自动检查任务'); 565 | // 代码检查 566 | this.checkProject(); 567 | // build 检查 568 | log.success('自动检查通过'); 569 | }; 570 | 571 | // 获取项目package.json文件 572 | getPackageJson = () => { 573 | const pkgPath = path.resolve(this.dir, 'package.json'); 574 | if (!fs.existsSync(pkgPath)) { 575 | throw new Error('package.json 不存在!'); 576 | } 577 | return fse.readJsonSync(pkgPath); 578 | }; 579 | 580 | // build结果检查 581 | checkProject = () => { 582 | log.notice('开始检查代码结构'); 583 | const pkg = this.getPackageJson(); 584 | if (!pkg.scripts || !Object.keys(pkg.scripts).includes('build')) { 585 | throw new Error('build命令不存在!'); 586 | } 587 | log.success('代码结构检查通过'); 588 | log.notice('开始检查 build 结果'); 589 | if (this.buildCmd) { 590 | require('child_process').execSync(this.buildCmd, { 591 | cwd: this.dir, 592 | }); 593 | } else { 594 | require('child_process').execSync('npm run build', { 595 | cwd: this.dir, 596 | }); 597 | } 598 | log.notice('build 结果检查通过'); 599 | }; 600 | 601 | // 判断是否为组件 602 | isComponent = () => { 603 | const componentFilePath = path.resolve(this.dir, COMPONENT_FILE); 604 | return fs.existsSync(componentFilePath) && fse.readJsonSync(componentFilePath); 605 | }; 606 | 607 | // 将组件信息保存至数据库 608 | saveComponentToDB = async () => { 609 | log.notice('上传组件信息至OSS+写入数据库'); 610 | const componentFile = this.isComponent(); 611 | const componentExamplePath = path.resolve(this.dir, componentFile.examplePath); 612 | let dirs = fs.readdirSync(componentExamplePath); 613 | dirs = dirs.filter(dir => dir.match(/^index(\d)*.html$/)); 614 | componentFile.exampleList = dirs; 615 | const data = await ComponentRequest.createComponent({ 616 | component: componentFile, 617 | git: { 618 | type: this.gitServer.type, 619 | remote: this.remote, 620 | version: this.version, 621 | branch: this.branch, 622 | login: this.login, 623 | owner: this.owner, 624 | repo: this.repo, 625 | }, 626 | }); 627 | if (!data) { 628 | throw new Error('上传组件失败'); 629 | } 630 | log.notice('保存组件信息成功'); 631 | log.notice('上传预览页面至OSS'); 632 | log.success('上传预览页面至OSS'); 633 | }; 634 | 635 | // 发布组件至NPM 636 | uploadComponentToNpm = async () => { 637 | if (this.isComponent()) { 638 | log.notice('开始发布 npm'); 639 | require('child_process').execSync('npm publish', { 640 | cwd: this.dir, 641 | }); 642 | log.notice('npm 发布成功'); 643 | } 644 | }; 645 | 646 | // 发布HTML模板代码 647 | uploadTemplate = async () => { 648 | if (this.sshUser && this.sshPath && this.sshIp) { 649 | log.notice('开始下载模板文件'); 650 | const ossTemplateFile = await getOSSFile({ 651 | type: this.prod ? 'prod' : 'dev', 652 | name: `${this.name}/index.html`, 653 | }); 654 | log.verbose('ossTemplateFile', ossTemplateFile); 655 | const templateFileUrl = get(ossTemplateFile, 'data[0].url'); 656 | log.verbose('templateFileUrl', templateFileUrl); 657 | const response = await axios.get(templateFileUrl); 658 | if (response.data) { 659 | const ossTempDir = path.resolve(this.homePath, TEMPLATE_TEMP_DIR, `${this.name}@${this.version}`); 660 | if (!fs.existsSync(ossTempDir)) { 661 | fse.mkdirpSync(ossTempDir); 662 | } else { 663 | fse.emptyDirSync(ossTempDir); 664 | } 665 | const templateFilePath = path.resolve(ossTempDir, 'index.html'); 666 | fse.createFileSync(templateFilePath); 667 | fs.writeFileSync(templateFilePath, response.data); 668 | log.success('模板文件下载成功', templateFilePath); 669 | log.notice('开始上传模板文件至服务器'); 670 | const uploadCmd = `scp -r ${templateFilePath} ${this.sshUser}@${this.sshIp}:${this.sshPath}`; 671 | log.verbose('uploadCmd', uploadCmd); 672 | const ret = require('child_process').execSync(uploadCmd); 673 | console.log(ret.toString()); 674 | log.success('模板文件上传成功'); 675 | fse.emptyDirSync(ossTempDir); 676 | } 677 | } 678 | }; 679 | 680 | // 测试/正式发布 681 | publish = async () => { 682 | let buildRet = false; 683 | if (this.isComponent()) { 684 | log.notice('开始发布组件'); 685 | await this.saveComponentToDB(); 686 | } else { 687 | await this.prePublish(); 688 | log.notice('开始发布'); 689 | const gitPublishTypePath = this.createPath(GIT_PUBLISH_FILE); 690 | let gitPublishType = readFile(gitPublishTypePath); 691 | if (!gitPublishType) { 692 | gitPublishType = await inquirer({ 693 | type: 'list', 694 | choices: GIT_PUBLISH_TYPE, 695 | message: '请选择您想要上传代码的平台', 696 | }); 697 | writeFile(gitPublishTypePath, gitPublishType); 698 | log.success('git publish类型写入成功', `${gitPublishType} -> ${gitPublishTypePath}`); 699 | } else { 700 | log.success('git publish类型获取成功', gitPublishType); 701 | } 702 | const cloudBuild = new CloudBuild(this, gitPublishType, { 703 | prod: !!this.prod, 704 | keepCache: !!this.keepCache, 705 | cnpm: !!this.cnpm, 706 | buildCmd: this.buildCmd, 707 | }); 708 | await cloudBuild.prepare(); 709 | await cloudBuild.init(); 710 | buildRet = await cloudBuild.build(); 711 | if (buildRet) { 712 | await this.uploadTemplate(); 713 | } 714 | } 715 | if (this.prod && buildRet) { 716 | await this.uploadComponentToNpm(); 717 | await this.checkTag(); // 打tag 718 | await this.checkoutBranch('master'); // 切换分支到master 719 | await this.mergeBranchToMaster(); // 将代码合并到master 720 | await this.pushRemoteRepo('master'); // 将代码推送到远程master 721 | await this.deleteLocalBranch(); // 删除本地分支 722 | await this.deleteRemoteBranch(); // 删除远程分支 723 | } 724 | if (buildRet) { 725 | log.success('发布成功'); 726 | } else { 727 | log.success('发布失败'); 728 | } 729 | return buildRet; 730 | }; 731 | 732 | checkTag = async () => { 733 | log.notice('获取远程 tag 列表'); 734 | const tag = `${VERSION_RELEASE}/${this.version}`; 735 | const tagList = await this.getRemoteBranchList(VERSION_RELEASE); 736 | if (tagList.includes(this.version)) { 737 | log.success('远程 tag 已存在', tag); 738 | await this.git.push([ 'origin', `:refs/tags/${tag}` ]); 739 | log.success('远程 tag 已删除', tag); 740 | } 741 | const localTagList = await this.git.tags(); 742 | if (localTagList.all.includes(tag)) { 743 | log.success('本地 tag 已存在', tag); 744 | await this.git.tag([ '-d', tag ]); 745 | log.success('本地 tag 已删除', tag); 746 | } 747 | await this.git.addTag(tag); 748 | log.success('本地 tag 创建成功', tag); 749 | await this.git.pushTags('origin'); 750 | log.success('远程 tag 推送成功', tag); 751 | }; 752 | 753 | mergeBranchToMaster = async () => { 754 | log.notice('开始合并代码', `[${this.branch}] -> [master]`); 755 | await this.git.mergeFromTo(this.branch, 'master'); 756 | log.success('代码合并成功', `[${this.branch}] -> [master]`); 757 | }; 758 | 759 | deleteLocalBranch = async () => { 760 | log.notice('开始删除本地分支', this.branch); 761 | await this.git.deleteLocalBranch(this.branch); 762 | log.success('删除本地分支成功', this.branch); 763 | }; 764 | 765 | deleteRemoteBranch = async () => { 766 | log.notice('开始删除远程分支', this.branch); 767 | await this.git.push([ 'origin', '--delete', this.branch ]); 768 | log.success('删除远程分支成功', this.branch); 769 | }; 770 | } 771 | 772 | module.exports = Git; 773 | -------------------------------------------------------------------------------- /packages/utils/lib/Git/GitServer.js: -------------------------------------------------------------------------------- 1 | function error(methodName) { 2 | throw new Error(`${methodName} must be implemented!`); 3 | } 4 | 5 | class GitServer { 6 | constructor(type, token) { 7 | this.type = type; 8 | this.token = token; 9 | } 10 | 11 | setToken = () => { 12 | error('setToken'); 13 | }; 14 | createRepo = () => { 15 | error('createRepo'); 16 | }; 17 | createOrgRepo = () => { 18 | error('createOrgRepo'); 19 | }; 20 | getRepo = () => { 21 | error('getRepo'); 22 | }; 23 | getUser = () => { 24 | error('getUser'); 25 | }; 26 | getOrgs = () => { 27 | error('getOrgs'); 28 | }; 29 | getTokenHelpUrl = () => { 30 | error('getTokenHelpUrl'); 31 | }; 32 | getSSHKeysUrl = () => { 33 | error('getSSHKeysUrl'); 34 | }; 35 | getSSHKeysHelpUrl = () => { 36 | error('getSSHKeysHelpUrl'); 37 | }; 38 | getRemote = () => { 39 | error('getRemote'); 40 | }; 41 | 42 | isHttpResponse = (response) => { 43 | return response && response.status && response.statusText && 44 | response.headers && response.data && response.config; 45 | }; 46 | 47 | handleResponse = (response) => { 48 | if (this.isHttpResponse(response) && response !== 200) { 49 | return null; 50 | } else { 51 | return response; 52 | } 53 | }; 54 | } 55 | 56 | module.exports = GitServer; 57 | -------------------------------------------------------------------------------- /packages/utils/lib/Git/Gitee.js: -------------------------------------------------------------------------------- 1 | const GitServer = require('./GitServer'); 2 | const GiteeRequest = require('./GiteeRequest'); 3 | 4 | class Gitee extends GitServer { 5 | constructor() { 6 | super('gitee'); 7 | } 8 | 9 | getTokenHelpUrl = () => { 10 | return 'https://gitee.com/profile/personal_access_tokens'; 11 | }; 12 | 13 | getUser = () => { 14 | return this.request.get('/user').then(response => { 15 | return this.handleResponse(response); 16 | }); 17 | }; 18 | 19 | getOrgs = () => { 20 | return this.request.get('/user/orgs', { 21 | page: 1, 22 | per_page: 100, 23 | admin: true, 24 | }).then(response => { 25 | return this.handleResponse(response); 26 | }); 27 | }; 28 | 29 | setToken = (token) => { 30 | this.request = new GiteeRequest(token); 31 | }; 32 | 33 | getRepo = (owner, repo) => { 34 | return this.request.get(`/repos/${owner}/${repo}`).then(response => { 35 | return this.handleResponse(response); 36 | }); 37 | }; 38 | 39 | createRepo = (repo) => { 40 | return this.request.post('/user/repos', { 41 | name: repo, 42 | }); 43 | }; 44 | 45 | createOrgRepo = (repo, login) => { 46 | return this.request.post(`/orgs/${login}/repos`, { 47 | name: repo, 48 | }); 49 | }; 50 | 51 | getRemote = (login, repo) => { 52 | return `git@gitee.com:${login}/${repo}.git`; 53 | }; 54 | 55 | getSSHKeysUrl = () => { 56 | return 'https://gitee.com/profile/sshkeys'; 57 | }; 58 | 59 | getSSHKeysHelpUrl = () => { 60 | return 'https://gitee.com/help/articles/4191'; 61 | }; 62 | } 63 | 64 | module.exports = Gitee; 65 | -------------------------------------------------------------------------------- /packages/utils/lib/Git/GiteeRequest.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const log = require('../log'); 3 | 4 | const BASE_URL = 'https://gitee.com/api/v5'; 5 | 6 | class GithubRequest { 7 | constructor(token) { 8 | this.token = token; 9 | this.service = axios.create({ 10 | baseURL: BASE_URL, 11 | timeout: 5000, 12 | }); 13 | this.service.interceptors.response.use( 14 | response => { 15 | return response.data; 16 | }, 17 | error => { 18 | if (error.response && error.response.data) { 19 | return error.response; 20 | } else { 21 | return Promise.reject(error); 22 | } 23 | }, 24 | ); 25 | } 26 | 27 | get(url, params, headers) { 28 | return this.service({ 29 | url, 30 | params: { 31 | ...params, 32 | access_token: this.token, 33 | }, 34 | method: 'get', 35 | headers, 36 | }); 37 | } 38 | 39 | post(url, data, headers) { 40 | return this.service({ 41 | url, 42 | params: { 43 | access_token: this.token, 44 | }, 45 | data, 46 | method: 'post', 47 | headers, 48 | }); 49 | } 50 | } 51 | 52 | module.exports = GithubRequest; 53 | -------------------------------------------------------------------------------- /packages/utils/lib/Git/Github.js: -------------------------------------------------------------------------------- 1 | const GitServer = require('./GitServer'); 2 | const GithubRequest = require('./GithubRequest'); 3 | 4 | class Github extends GitServer { 5 | constructor() { 6 | super('github'); 7 | } 8 | 9 | getTokenHelpUrl = () => { 10 | return 'https://github.com/settings/tokens'; 11 | }; 12 | 13 | getUser = () => { 14 | return this.request.get('/user').then(response => { 15 | return this.handleResponse(response); 16 | }); 17 | }; 18 | 19 | getOrgs = () => { 20 | return this.request.get('/user/orgs', { 21 | page: 1, 22 | per_page: 100, 23 | }).then(response => { 24 | return this.handleResponse(response); 25 | }); 26 | }; 27 | 28 | setToken = (token) => { 29 | this.request = new GithubRequest(token); 30 | }; 31 | 32 | getRepo = (owner, repo) => { 33 | return this.request.get(`/repos/${owner}/${repo}`).then(response => { 34 | return this.handleResponse(response); 35 | }); 36 | }; 37 | 38 | createRepo = (repo) => { 39 | return this.request.post('/user/repos', { 40 | name: repo, 41 | }, { 42 | Accept: 'application/vnd.github.v3+json', 43 | }); 44 | }; 45 | 46 | createOrgRepo = (repo, login) => { 47 | return this.request.post('/orgs/' + login + '/repos', { 48 | name: repo, 49 | }, { 50 | Accept: 'application/vnd.github.v3+json', 51 | }); 52 | }; 53 | 54 | getRemote = (login, repo) => { 55 | return `git@github.com:${login}/${repo}.git`; 56 | }; 57 | 58 | getSSHKeysUrl = () => { 59 | return 'https://github.com/settings/keys'; 60 | }; 61 | 62 | getSSHKeysHelpUrl = () => { 63 | return 'https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/connecting-to-github-with-ssh'; 64 | }; 65 | } 66 | 67 | module.exports = Github; 68 | -------------------------------------------------------------------------------- /packages/utils/lib/Git/GithubRequest.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const log = require('../log'); 3 | 4 | const BASE_URL = 'https://api.github.com'; 5 | 6 | class GithubRequest { 7 | constructor(token) { 8 | this.token = token; 9 | this.service = axios.create({ 10 | baseURL: BASE_URL, 11 | timeout: 5000, 12 | }); 13 | this.service.interceptors.request.use( 14 | config => { 15 | config.headers['Authorization'] = `token ${this.token}`; 16 | return config; 17 | }, 18 | error => { 19 | return Promise.reject(error); 20 | }, 21 | ); 22 | this.service.interceptors.response.use( 23 | response => { 24 | return response.data; 25 | }, 26 | error => { 27 | if (error.response && error.response.data) { 28 | return error.response; 29 | } else { 30 | return Promise.reject(error); 31 | } 32 | }, 33 | ); 34 | } 35 | 36 | get(url, params, headers) { 37 | return this.service({ 38 | url, 39 | data: params, 40 | method: 'get', 41 | headers, 42 | }); 43 | } 44 | 45 | post(url, data, headers) { 46 | return this.service({ 47 | url, 48 | data, 49 | method: 'post', 50 | headers, 51 | }); 52 | } 53 | } 54 | 55 | module.exports = GithubRequest; 56 | -------------------------------------------------------------------------------- /packages/utils/lib/Locale/en_us.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | welcome: 'Welcome using imooc cli', 3 | } 4 | -------------------------------------------------------------------------------- /packages/utils/lib/Locale/getEnvLocale.js: -------------------------------------------------------------------------------- 1 | function getEnvLocale(env) { 2 | env = env || process.env; 3 | return env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE; 4 | } 5 | 6 | module.exports = getEnvLocale(); 7 | -------------------------------------------------------------------------------- /packages/utils/lib/Locale/loadLocale.js: -------------------------------------------------------------------------------- 1 | function loadLocale() { 2 | const locale = require('./getEnvLocale'); 3 | if (locale) { 4 | const localeShortName = locale.split('.')[0].toLocaleLowerCase(); 5 | return require(`./${localeShortName}`); 6 | } else { 7 | return require('./zh_cn'); 8 | } 9 | } 10 | 11 | module.exports = loadLocale(); 12 | -------------------------------------------------------------------------------- /packages/utils/lib/Locale/zh_cn.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | welcome: '欢迎使用慕课网前端研发脚手架', 3 | } 4 | -------------------------------------------------------------------------------- /packages/utils/lib/Package.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const fse = require('fs-extra'); 4 | const npminstall = require('npminstall'); 5 | const log = require('./log'); 6 | const npm = require('./npm'); 7 | const formatPath = require('./formatPath'); 8 | 9 | const useOriginNpm = false; 10 | 11 | /** 12 | * Package 类,用于管理动态下载的库文件 13 | */ 14 | class Package { 15 | constructor(options) { 16 | log.verbose('options', options); 17 | this.targetPath = options.targetPath; 18 | this.storePath = options.storePath; 19 | this.packageName = options.name; 20 | this.packageVersion = options.version; 21 | this.npmFilePathPrefix = this.packageName.replace('/', '_'); 22 | } 23 | 24 | get npmFilePath() { 25 | return path.resolve(this.storePath, `_${this.npmFilePathPrefix}@${this.packageVersion}@${this.packageName}`); 26 | } 27 | 28 | async prepare() { 29 | if (!fs.existsSync(this.targetPath)) { 30 | fse.mkdirpSync(this.targetPath); 31 | } 32 | if (!fs.existsSync(this.storePath)) { 33 | fse.mkdirpSync(this.storePath); 34 | } 35 | log.verbose(this.targetPath); 36 | log.verbose(this.storePath); 37 | const latestVersion = await npm.getNpmLatestSemverVersion(this.packageName, this.packageVersion); 38 | log.verbose('latestVersion', this.packageName, latestVersion); 39 | if (latestVersion) { 40 | this.packageVersion = latestVersion; 41 | } 42 | } 43 | 44 | async install() { 45 | await this.prepare(); 46 | return npminstall({ 47 | root: this.targetPath, 48 | storeDir: this.storePath, 49 | registry: npm.getNpmRegistry(useOriginNpm), 50 | pkgs: [{ 51 | name: this.packageName, 52 | version: this.packageVersion, 53 | }], 54 | }); 55 | } 56 | 57 | async exists() { 58 | await this.prepare(); 59 | return fs.existsSync(this.npmFilePath); 60 | } 61 | 62 | getPackage(isOriginal = false) { 63 | if (!isOriginal) { 64 | return fse.readJsonSync(path.resolve(this.npmFilePath, 'package.json')); 65 | } 66 | return fse.readJsonSync(path.resolve(this.storePath, 'package.json')); 67 | } 68 | 69 | getRootFilePath(isOriginal = false) { 70 | const pkg = this.getPackage(isOriginal); 71 | if (pkg) { 72 | if (!isOriginal) { 73 | return formatPath(path.resolve(this.npmFilePath, pkg.main)); 74 | } 75 | return formatPath(path.resolve(this.storePath, pkg.main)); 76 | } 77 | return null; 78 | } 79 | 80 | async getVersion() { 81 | await this.prepare(); 82 | return await this.exists() ? this.getPackage().version : null; 83 | } 84 | 85 | async getLatestVersion() { 86 | const version = await this.getVersion(); 87 | if (version) { 88 | const latestVersion = await npm.getNpmLatestSemverVersion(this.packageName, version); 89 | return latestVersion; 90 | } 91 | return null; 92 | } 93 | 94 | async update() { 95 | const latestVersion = await this.getLatestVersion(); 96 | return npminstall({ 97 | root: this.targetPath, 98 | storeDir: this.storePath, 99 | registry: npm.getNpmRegistry(useOriginNpm), 100 | pkgs: [{ 101 | name: this.packageName, 102 | version: latestVersion, 103 | }], 104 | }); 105 | } 106 | } 107 | 108 | module.exports = Package; 109 | -------------------------------------------------------------------------------- /packages/utils/lib/ejs.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const glob = require('glob'); 3 | const ejs = require('ejs'); 4 | const fse = require('fs-extra'); 5 | const get = require('lodash/get'); 6 | 7 | const log = require('./log'); 8 | 9 | module.exports = async function(dir, options = {}, extraOptions = {}, diableFormatDotFile = false) { 10 | const ignore = get(extraOptions, 'ignore'); 11 | log.verbose('ignore', ignore); 12 | return new Promise((resolve, reject) => { 13 | glob('**', { 14 | cwd: dir, 15 | nodir: true, 16 | ignore: ignore || '**/node_modules/**', 17 | }, (err, files) => { 18 | if (err) { 19 | return reject(err); 20 | } 21 | 22 | log.verbose('render files:', files); 23 | 24 | Promise.all(files.map((file) => { 25 | const filepath = path.join(dir, file); 26 | return renderFile(filepath, options, diableFormatDotFile); 27 | })).then(() => { 28 | resolve(); 29 | }).catch((err) => { 30 | reject(err); 31 | }); 32 | }); 33 | }); 34 | }; 35 | 36 | function renderFile(filepath, options, diableFormatDotFile) { 37 | let filename = path.basename(filepath); 38 | 39 | if (filename.indexOf('.png') !== -1 || filename.indexOf('.jpg') !== -1) { 40 | // console.log('renderFile:', filename); 41 | return Promise.resolve(); 42 | } 43 | 44 | return new Promise((resolve, reject) => { 45 | ejs.renderFile(filepath, options, (err, result) => { 46 | if (err) { 47 | return reject(err); 48 | } 49 | 50 | if (/^_package.json/.test(filename)) { 51 | filename = filename.replace('_package.json', 'package.json'); 52 | fse.removeSync(filepath); 53 | } 54 | 55 | if (/\.ejs$/.test(filepath)) { 56 | filename = filename.replace(/\.ejs$/, ''); 57 | fse.removeSync(filepath); 58 | } 59 | 60 | if (!diableFormatDotFile && /^_/.test(filename)) { 61 | filename = filename.replace(/^_/, '.'); 62 | fse.removeSync(filepath); 63 | } 64 | 65 | const newFilepath = path.join(filepath, '../', filename); 66 | fse.writeFileSync(newFilepath, result); 67 | resolve(newFilepath); 68 | }); 69 | }); 70 | } 71 | -------------------------------------------------------------------------------- /packages/utils/lib/file.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | function writeFile(path, data, { rewrite = true } = {}) { 4 | if (fs.existsSync(path)) { 5 | if (rewrite) { 6 | fs.writeFileSync(path, data); 7 | return true; 8 | } else { 9 | return false; 10 | } 11 | } else { 12 | fs.writeFileSync(path, data); 13 | return true; 14 | } 15 | } 16 | 17 | function readFile(path, options = {}) { 18 | if (fs.existsSync(path)) { 19 | const buffer = fs.readFileSync(path); 20 | if (buffer) { 21 | if (options.toJson) { 22 | return buffer.toJSON(); 23 | } else { 24 | return buffer.toString(); 25 | } 26 | } 27 | } else { 28 | return null; 29 | } 30 | } 31 | 32 | module.exports = { 33 | readFile, 34 | writeFile, 35 | }; 36 | -------------------------------------------------------------------------------- /packages/utils/lib/formatPath.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = function formatPath(p) { 4 | const sep = path.sep; 5 | // 如果返回 / 则为 macOS 6 | if (sep === '/') { 7 | return p; 8 | } else { 9 | return p.replace(/\\/g, '/'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/utils/lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const log = require('./log'); 5 | const request = require('./request'); 6 | const npm = require('./npm'); 7 | const inquirer = require('./inquirer'); 8 | const spinner = require('./spinner'); 9 | const ejs = require('./ejs'); 10 | const terminalLink = require('./terminalLink'); 11 | 12 | const Package = require('./Package'); 13 | const Git = require('./Git/Git'); 14 | const file = require('./file'); 15 | const locale = require('./Locale/loadLocale'); 16 | const formatPath = require('./formatPath'); 17 | 18 | function sleep(timeout) { 19 | return new Promise((resolve => { 20 | setTimeout(resolve, timeout); 21 | })); 22 | } 23 | 24 | function exec(command, args, options) { 25 | const win32 = process.platform === 'win32'; 26 | 27 | const cmd = win32 ? 'cmd' : command; 28 | const cmdArgs = win32 ? ['/c'].concat(command, args) : args; 29 | 30 | return require('child_process').spawn(cmd, cmdArgs, options || {}); 31 | } 32 | 33 | function firstUpperCase(str) { 34 | return str.replace(/^\S/, s => s.toUpperCase()); 35 | } 36 | 37 | function camelTrans(str, isBig) { 38 | let i = isBig ? 0 : 1; 39 | str = str.split('-'); 40 | for (; i < str.length; i += 1) { 41 | str[i] = firstUpperCase(str[i]); 42 | } 43 | return str.join(''); 44 | } 45 | 46 | function formatName(name) { 47 | if (name) { 48 | name = `${name}`.trim(); 49 | if (name) { 50 | if (/^[.*_\/\\()&^!@#$%+=?<>~`\s]/.test(name)) { 51 | name = name.replace(/^[.*_\/\\()&^!@#$%+=?<>~`\s]+/g, ''); 52 | } 53 | if (/^[0-9]+/.test(name)) { 54 | name = name.replace(/^[0-9]+/, ''); 55 | } 56 | if (/[.*_\/\\()&^!@#$%+=?<>~`\s]/.test(name)) { 57 | name = name.replace(/[.*_\/\\()&^!@#$%+=?<>~`\s]/g, '-'); 58 | } 59 | return camelTrans(name, true); 60 | } else { 61 | return name; 62 | } 63 | } else { 64 | return name; 65 | } 66 | } 67 | 68 | function formatClassName(name) { 69 | return require('kebab-case')(name).replace(/^-/, ''); 70 | } 71 | 72 | module.exports = { 73 | log, 74 | request, 75 | npm, 76 | inquirer, 77 | spinner, 78 | ejs, 79 | Package, 80 | Git, 81 | sleep, 82 | exec, 83 | formatName, 84 | formatClassName, 85 | terminalLink, 86 | ...file, 87 | locale, 88 | formatPath, 89 | }; 90 | -------------------------------------------------------------------------------- /packages/utils/lib/inquirer.js: -------------------------------------------------------------------------------- 1 | const inquirer = require('inquirer') 2 | 3 | module.exports = function({ choices, defaultValue, message, type = 'list', require = true, mask = '*' }) { 4 | const options = { 5 | type, 6 | name: 'name', 7 | message, 8 | default: defaultValue, 9 | require, 10 | mask, 11 | } 12 | if (type === 'list') { 13 | options.choices = choices; 14 | } 15 | return inquirer.prompt(options).then((answer) => answer.name) 16 | } 17 | -------------------------------------------------------------------------------- /packages/utils/lib/log.js: -------------------------------------------------------------------------------- 1 | const log = require('npmlog') 2 | 3 | log.level = process.env.LOG_LEVEL ? process.env.LOG_LEVEL : 'info' 4 | 5 | log.heading = 'imooc' // 自定义头部 6 | log.addLevel('success', 2000, { fg: 'green', bold: true }) // 自定义success日志 7 | log.addLevel('notice', 2000, { fg: 'blue', bg: 'black' }) // 自定义notice日志 8 | 9 | module.exports = log 10 | -------------------------------------------------------------------------------- /packages/utils/lib/npm.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const urlJoin = require("url-join"); 3 | const semver = require("semver"); 4 | 5 | // 获取 registry 信息 6 | function getNpmRegistry(isOriginal = false) { 7 | return isOriginal ? 'https://registry.npmjs.org' : 8 | 'https://npmmirror.com'; 9 | } 10 | 11 | // 从 registry 获取 npm 的信息 12 | function getNpmInfo(npm, registry) { 13 | const register = registry || getNpmRegistry(); 14 | const url = urlJoin(register, npm); 15 | return axios.get(url).then(function(response) { 16 | try { 17 | if (response.status === 200) { 18 | return response.data; 19 | } 20 | } catch (error) { 21 | return Promise.reject(error); 22 | } 23 | }); 24 | } 25 | 26 | // 获取某个 npm 的最新版本号 27 | function getLatestVersion(npm, registry) { 28 | return getNpmInfo(npm, registry).then(function (data) { 29 | if (!data['dist-tags'] || !data['dist-tags'].latest) { 30 | console.error('没有 latest 版本号', data); 31 | return Promise.reject(new Error('Error: 没有 latest 版本号')); 32 | } 33 | const latestVersion = data['dist-tags'].latest; 34 | return latestVersion; 35 | }); 36 | } 37 | 38 | // 获取某个 npm 的所有版本号 39 | function getVersions(npm, registry) { 40 | return getNpmInfo(npm, registry).then(function (body) { 41 | const versions = Object.keys(body.versions); 42 | return versions; 43 | }); 44 | } 45 | 46 | // 根据指定 version 获取符合 semver 规范的最新版本号 47 | function getLatestSemverVersion(baseVersion, versions = []) { 48 | // versions = versions 49 | // .filter(function (version) { return semver.satisfies(version, "^" + baseVersion); }) 50 | // .sort(function (a, b) { 51 | // return semver.gt(b, a); 52 | // }); 53 | if (versions.length > 1) { 54 | return versions[versions.length - 1]; 55 | } else if (versions.length === 1) { 56 | return versions[0]; 57 | } 58 | return ''; 59 | } 60 | 61 | // 根据指定 version 和包名获取符合 semver 规范的最新版本号 62 | function getNpmLatestSemverVersion(npm, baseVersion, registry) { 63 | return getVersions(npm, registry).then(function (versions) { 64 | return getLatestSemverVersion(baseVersion, versions); 65 | }); 66 | } 67 | 68 | module.exports = { 69 | getNpmRegistry, 70 | getNpmInfo, 71 | getLatestVersion, 72 | getNpmLatestSemverVersion, 73 | }; 74 | -------------------------------------------------------------------------------- /packages/utils/lib/request.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | 3 | const BASE_URL = 'http://book.youbaobao.xyz:7002'; 4 | 5 | const service = axios.create({ 6 | baseURL: BASE_URL, 7 | timeout: 5000, 8 | }); 9 | 10 | service.interceptors.request.use( 11 | config => { 12 | return config; 13 | }, 14 | error => { 15 | return Promise.reject(error); 16 | }, 17 | ); 18 | 19 | service.interceptors.response.use( 20 | response => { 21 | return response.data; 22 | }, 23 | error => { 24 | return Promise.reject(error); 25 | }, 26 | ); 27 | 28 | module.exports = service; 29 | -------------------------------------------------------------------------------- /packages/utils/lib/spinner.js: -------------------------------------------------------------------------------- 1 | const Spinner = require('cli-spinner').Spinner 2 | 3 | module.exports = function(msg, spinnerString = '|/-\\') { 4 | const spinner = new Spinner(`${msg}.. %s`) 5 | spinner.setSpinnerString(spinnerString) 6 | spinner.start() 7 | return spinner 8 | } 9 | -------------------------------------------------------------------------------- /packages/utils/lib/terminalLink.js: -------------------------------------------------------------------------------- 1 | module.exports = function terminalLink(key, url) { 2 | if (!url) { 3 | return require('terminal-link')(key, key); 4 | } else { 5 | return require('terminal-link')(key, url); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /packages/utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@imooc-cli/utils", 3 | "version": "1.1.4", 4 | "description": "imooc-cli utils", 5 | "author": "sam <247765564@qq.com>", 6 | "homepage": "https://github.com/sam9831/imooc-cli#readme", 7 | "license": "ISC", 8 | "main": "lib/index.js", 9 | "directories": { 10 | "lib": "lib", 11 | "test": "__tests__" 12 | }, 13 | "files": [ 14 | "lib" 15 | ], 16 | "publishConfig": { 17 | "access": "public" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "git+https://github.com/sam9831/imooc-cli.git" 22 | }, 23 | "bugs": { 24 | "url": "https://github.com/sam9831/imooc-cli/issues" 25 | }, 26 | "devDependencies": { 27 | "mocha": "^8.1.3" 28 | }, 29 | "scripts": { 30 | "test": "mocha __tests__/utils.test.js" 31 | }, 32 | "dependencies": { 33 | "axios": "^0.20.0", 34 | "cli-spinner": "^0.2.10", 35 | "ejs": "^3.1.5", 36 | "fs-extra": "^9.0.1", 37 | "glob": "^7.1.6", 38 | "inquirer": "^7.3.3", 39 | "kebab-case": "^1.0.0", 40 | "lodash": "^4.17.20", 41 | "npminstall": "^4.9.1", 42 | "npmlog": "^4.1.2", 43 | "semver": "^7.3.2", 44 | "simple-git": "^2.20.1", 45 | "socket.io-client": "^2.3.1", 46 | "terminal-link": "^2.1.1", 47 | "url-join": "^4.0.1", 48 | "user-home": "^2.0.0" 49 | } 50 | } 51 | --------------------------------------------------------------------------------