├── .gitignore ├── README.md ├── index.js ├── package-lock.json ├── package.json └── src ├── config.js └── spinner_style.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | deploy.config.js 8 | index copy.js 9 | # Editor directories and files 10 | .idea 11 | .vscode 12 | *.suo 13 | *.ntvs* 14 | *.njsproj 15 | *.sln 16 | web 17 | *.zip 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 我们在常规的前端项目中,前端项目部署都需要经过本地 build 打包、压缩文件、将压缩包上传至服务器并解压文件等步骤,过程较为繁琐。所以本人编写了一个名为 `swd-deploy` 的 `nodejs` 脚本,可通过使用 `npm` 将包安装到你的项目中使用,用来告别手动上传的过程,配置使用简单,实现前端一键自动化部署。 3 | 4 | ::: warning 注意 5 | 前端自动化编译与部署脚本,当前只支持 `window` 上传至 `linux` 服务器以及 `linux` 上传至 `linux` 服务器。 6 | ::: 7 | 8 | ## 快速安装 9 | **1、局部使用** 10 | 11 | 项目内使用 12 | ```bash 13 | npm i swd-deploy --save 14 | ``` 15 | 16 | **2、全局使用** 17 | 18 | 可以用于上传指定文件或文件夹。 19 | ```bash 20 | npm i swd-deploy -g 21 | ``` 22 | 比如上传本地的`index.js`文件和`dir2`文件夹到远程服务器`/home/dir`文件夹下。 23 | ```bash 24 | deploy --host='127.0.0.1' --port=22 --username=root --password=xxxxxx --localPath=/dir1/index.js,/dir2 --wwwPath=/home/dir 25 | ``` 26 | 27 | ## 项目内使用 28 | 29 | ### 第一步 30 | 在你的项目 `package.json` 文件中的 `scripts` 字段中添加如下内容: 31 | ```json 32 | { 33 | "scripts": { 34 | "deploy": "npx deploy", 35 | } 36 | } 37 | ``` 38 | ```bash 39 | npm run deploy 40 | ``` 41 | 另外,还支持通过命令参数进行自动部署,例如: 42 | ```bash 43 | npx deploy --key=production 44 | ``` 45 | 其中 `production` 为 `deploy.config.js` 配置文件中的 `key` 值。 46 | 47 | 48 | ### 第二步 49 | 在你项目根目录添加 `deploy.config.js` 文件默认内容如下(可以配置很多...): 50 | ```js 51 | module.exports = Object.freeze({ 52 | development: {//测试 53 | title: "开发环境", //提示标题 54 | // x[已废弃] sshIp: '10.0.85.100', 55 | host: '127.0.0.1',// 新增字段与 sshIp 一致 56 | port: 22, 57 | isCompress: true, // [新增]是否压缩 58 | // x[已废弃] sshUserName: 'root', 59 | username: 'root', 60 | password: '', 61 | wwwPath: '', 62 | // x[已废弃] distFolder: 'src', // 打包后的文件夹 默认 /dist 63 | localPath: '', // 新增字段与distFolder一致 默认 /dist 64 | configPath: '', // deploy.config.js文件路径 默认项目根目录(./) 65 | ignoreFiles: '', // 忽略文件 多个文件用 , 隔开 例如 .git, .gitignore, .DS_Store 66 | loadingStyle: 'arrow4', // 打包后的文件夹 默认 /dist 67 | // x[已废弃] buildShell: '',// 'npm run build', // 自定义打包命令 若为空则会直接部署,不会打包 68 | build: '',// 'npm run build', // 自定义打包命令 若为空则会直接部署,不会打包 69 | readyTimeout: 60000 // 超时时间 70 | }, 71 | production: {//正式 72 | title: "", //提示标题 73 | sshIp: 'xx.xxx.xx.xx', 74 | sshPort: "", // ssh端口 默认:22 75 | sshUserName: 'xxxxx', 76 | password: 'xxxxxx', 77 | wwwPath: '', 78 | loadingStyle: 'arrow4', 79 | buildShell: 'npm run build', 80 | readyTimeout: 5000 81 | }, 82 | xxx: { 83 | ... 84 | } 85 | ... 86 | }) 87 | ``` 88 | 其中 `development`,`development`,`xxx` 均为 `key` 变量,可自行修改。 89 | 90 | **用秘钥登录服务器(推荐)** 91 | * 把本机 公钥` .ssh` 目录下` id_rsa.pub` 放服务器 `authorized_keys` 文件里, 多个电脑公钥换行分开 92 | * `private` 本机私钥文件地址(需要在服务器用户目录 一般是` ~/.ssh/authorized_keys` 配置公钥 并该文件权限为 `600`, (.ssh文件夹一般默认隐藏) 93 | * 一般 `.ssh`在用户目录下 `cd ~/.ssh/ ` 复制路径放下面 `pwd` 可查看当前路径 路径用` / `别 `\` 例如以下 `C:/Users/Administrator/.ssh/id_rsa` 94 | 95 | 然后执行: 96 | ```bash 97 | npx deploy 98 | # 或者 99 | npm run deploy 100 | ``` 101 | 就可以部署了! 102 | ## 示例 103 | ![在这里插入图片描述](http://zhenglinglu.cn/artical/cli_20240419191642.png) 104 | 105 | - GitHub 地址:[https://github.com/zlluGitHub/swd-deploy](https://github.com/zlluGitHub/swd-deploy) 106 | - Gitee 地址:[https://gitee.com/zlluGitHub/swd-deploy](https://gitee.com/zlluGitHub/swd-deploy) 107 | - npm 地址:[https://www.npmjs.com/package/swd-deploy](https://www.npmjs.com/package/swd-deploy) -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const chalk = require('chalk') //命令行颜色 4 | const fs = require('fs') 5 | const CliProgress = require('cli-progress'); 6 | const ora = require('ora') // 加载流程动画 7 | const spinner_style = require('./src/spinner_style') //加载动画样式 8 | const shell = require('shelljs') // 执行shell命令 9 | const Client = require('ssh2-sftp-client') // ssh连接服务器 10 | const inquirer = require('inquirer') //命令行交互 11 | const zipFile = require('compressing') // 压缩zip 12 | // const fs = require('fs') // nodejs内置文件模块 13 | const path = require('path') // nodejs内置路径模块 14 | const colors = require('ansi-colors'); 15 | 16 | // const { NodeSSH } = require('node-ssh') // ssh连接服务器 17 | // const nodeSSH = new NodeSSH() 18 | 19 | //logs 20 | const defaultLog = log => console.log(chalk.blue(`☀ ${log}`)) 21 | const errorLog = log => console.log(chalk.red(`✘ ${log}`)) 22 | // const warningLog = log => console.log(chalk.yellow(`◎ ${log}`)) 23 | const successLog = log => console.log(chalk.green(`✔ ${log}`)) 24 | 25 | const SSH = new Client() 26 | 27 | console.log(chalk.green(`☺ 欢迎使用自动部署工具!`)) 28 | 29 | let config = {} // 用于保存 inquirer 命令行交互后选择正式|测试版的配置 30 | 31 | const getOption = () => { 32 | const arr = process.argv.slice(2); // 获取命令行参数数组 33 | const r = arr.reduce((pre, item) => { // 使用reduce方法对参数数组进行处理 34 | if (item.indexOf("=") !== -1) { // 判断参数是否有等号 35 | return [...pre, item.split("=")]; // 将带有等号的参数进行分割并添加到结果数组中 36 | } 37 | return pre; // 否则返回原结果数组 38 | }, []); 39 | if (r.length == 0) { 40 | return false 41 | } 42 | const params = Object.fromEntries(r); // 将结果数组转化为参数对象 43 | return params; // 返回参数对象 44 | } 45 | 46 | let params = getOption() 47 | const pathHierarchy = params['--config'] || process.cwd() 48 | 49 | const getFilePath = () => { 50 | let wwwPath = params['--wwwPath'] || config.wwwPath || ""; 51 | let distDir = config.distFolder || config.localPath || ""; 52 | 53 | if ((!wwwPath) || (wwwPath == '/') || (wwwPath == '\\')) { 54 | throw new Error('请输入正确的 wwwPath 路径!') 55 | } 56 | 57 | const dirName = path.basename(distDir); 58 | // './' //脚本到项目的层级 项目/node_modules/ 59 | distDir = path.join(pathHierarchy, distDir) 60 | const distZipPath = path.join(distDir, "../", dirName + ".zip") 61 | 62 | const wwwZipPath = path.join(wwwPath, path.basename(distZipPath)) 63 | // const distZipPath = path.resolve(__dirname, `${pathHierarchy + distDir}.zip`) 64 | // distDir = path.resolve(__dirname, `${pathHierarchy + distDir}`) 65 | 66 | return { distDir, distZipPath, wwwPath, wwwZipPath, dirName } 67 | } 68 | 69 | // deploy - node / index.js 70 | 71 | let CONFIG = {}; 72 | 73 | // let isExitConfigFile = true; 74 | try { 75 | CONFIG = require(path.join(pathHierarchy, 'deploy.config.js')) // 项目配置 76 | // CONFIG = require(path.resolve(__dirname, `${pathHierarchy}deploy.config.js`)) // 项目配置 77 | } catch (error) { 78 | console.log(error); 79 | if (params['--host'] && params['--password'] && params['--wwwPath'] && params['--localPath']) { 80 | // 命令行参数优先级最高 81 | // isExitConfigFile = false 82 | } else { 83 | errorLog('请在项目根目录添加 deploy.config.js 配置文件。') 84 | console.log(colors.grey('参考说明文档中的配置:https://github.com/zlluGitHub/swd-deploy')); 85 | process.exit() //退出流程 86 | } 87 | } 88 | 89 | //项目打包代码 npm run build 90 | const buildDist = async () => { 91 | const loading = ora(defaultLog('开始打包项目')).start() 92 | loading.spinner = spinner_style[config.loadingStyle || 'arrow4'] 93 | shell.cd(pathHierarchy) 94 | // shell.cd(path.resolve(__dirname, pathHierarchy)) 95 | 96 | const exec = params['--build'] || config.build || config.buildShell || 'npm run build' 97 | const res = await shell.exec(exec) //执行shell 打包命令 98 | loading.stop() 99 | if (res.code === 0) { 100 | successLog('项目打包成功!') 101 | return true 102 | } else { 103 | errorLog('项目打包失败, 请重试!') 104 | process.exit() //退出流程 105 | // return false 106 | } 107 | } 108 | 109 | 110 | 111 | 112 | //线上执行命令 113 | /** 114 | * @param {String} command 命令操作 如 ls 115 | */ 116 | const runCommand = async (command) => { 117 | // const { wwwPath } = getFilePath() 118 | 119 | return new Promise((resolve, reject) => { 120 | SSH.client.exec(command, (error, stream) => { 121 | if (error) { 122 | // console.log(error); 123 | reject(error) 124 | resolve({ type: 'error', error }) 125 | } else { 126 | let output = ''; 127 | stream.on('data', (data) => { 128 | output += data; 129 | }).on('end', () => { 130 | // defaultLog(output) 131 | resolve(output) 132 | // console.log(output); 133 | }).on('close', (code, signal) => { 134 | // console.log('Stream close!') 135 | }) 136 | 137 | } 138 | }) 139 | }) 140 | 141 | // const result = await nodeSSH.exec(command, [], { 142 | // cwd: wwwPath 143 | // }).catch(err => { 144 | // errorLog(err) 145 | // process.exit() //退出流程 146 | // }) 147 | // defaultLog(result) 148 | } 149 | 150 | 151 | const getConnectSshOption = () => { 152 | //privateKey 秘钥登录(推荐) 方式一 153 | //password 密码登录 方式二 154 | const type = (params['--password'] || config.password) ? 'password' : 'privateKey' 155 | const data = (params['--password'] || config.password) || config.privateKey 156 | return { 157 | host: params['--host'] || config.sshIp || config.host, 158 | username: params['--username'] || config.username || config.sshUserName || 'root', 159 | port: params['--port'] || config.port || 22, 160 | [type]: data, 161 | tryKeyboard: true, 162 | readyTimeout: params['--readyTimeout'] || config.readyTimeout || 60000 163 | } 164 | // if (config.readyTimeout) { 165 | // opt. 166 | // } 167 | } 168 | 169 | 170 | //连接服务器 171 | const connectSSH = async () => { 172 | 173 | const loading = ora(defaultLog('正在连接服务器')).start() 174 | try { 175 | loading.spinner = spinner_style[config.loadingStyle || 'arrow4'] 176 | await SSH.connect(getConnectSshOption()) 177 | successLog('服务器连接成功!') 178 | } catch (error) { 179 | errorLog('SSH连接失败! (可能原因: 1:密码不对, 2:privateKey 本机私钥地址不对, 3:服务器未配置本机公钥, 4:服务器未安装 SSH 服务或端口), 5:使用命令参数时, 请检查是否配置了 --key 参数') 180 | process.exit() //退出流程 181 | } 182 | 183 | loading.stop() 184 | } 185 | 186 | 187 | const formatNodePath = (filePath) => { 188 | // 返回格式化后的路径 189 | return filePath.replace(/\\/g, '/') 190 | } 191 | 192 | const formatBytes = (bytes, decimals = 2) => { 193 | if (bytes === 0) return '0 B'; //Bytes 194 | const k = 1024; 195 | const dm = decimals < 0 ? 0 : decimals; 196 | const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; 197 | const i = Math.floor(Math.log(bytes) / Math.log(k)); 198 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + '' + sizes[i]; 199 | } 200 | 201 | const getIgnoreFileArr = (localPath) => { 202 | let ignoreFileArr = [] 203 | if (params['--localPath']) { 204 | ignoreFileArr = splitPath(params['--ignoreFiles']) 205 | } else if (config.ignoreFiles) { 206 | if (typeof config.ignoreFiles == 'object') { 207 | ignoreFileArr = config.ignoreFiles 208 | } else { 209 | ignoreFileArr = splitPath(config.ignoreFiles) 210 | } 211 | } 212 | const findItem = ignoreFileArr.find(item => localPath.indexOf(item) > -1) 213 | return !!findItem 214 | } 215 | 216 | 217 | 218 | const uploadFile = async (localPath, remotePath, stats) => { 219 | 220 | const isIgnore = getIgnoreFileArr(localPath) 221 | if (isIgnore) return 222 | 223 | defaultLog(`正在上传 ${localPath} 文件`) 224 | 225 | const b1 = new CliProgress.Bar({ 226 | format: '上传进度:[' + colors.cyan('{bar}') + '] {percentage}% ' + colors.magenta('{size} ') + colors.green('{speed}'), 227 | // barCompleteChar: '\u2588', 228 | // barIncompleteChar: '\u2591', 229 | barCompleteChar: '#', 230 | barIncompleteChar: '-', 231 | hideCursor: true 232 | }); 233 | 234 | let totalTransferredW1 = 0; 235 | let totalTransferredW2 = 0; 236 | let totalW = 1; 237 | 238 | b1.start(100, 0, { 239 | speed: "N/A", 240 | size: '0KB/0KB' 241 | }); 242 | 243 | const startTime = new Date().getTime(); 244 | const timer = setInterval(() => { 245 | b1.update((((totalTransferredW1 / totalW) * 100).toFixed(2)) * 1, { 246 | speed: formatBytes(totalTransferredW1 - totalTransferredW2) + '/s', 247 | size: formatBytes(totalTransferredW1) + '/' + formatBytes(totalW) 248 | }); 249 | totalTransferredW2 = totalTransferredW1; 250 | }, 1000) 251 | // console.log(localPath, remotePath); 252 | await SSH.fastPut(localPath, remotePath, { 253 | step: (totalTransferred, chunk, total) => { 254 | totalTransferredW1 = totalTransferred; 255 | totalW = total; 256 | } 257 | }) 258 | 259 | const endTime = new Date().getTime(); 260 | 261 | const time = (endTime - startTime) / 1000; 262 | b1.update(100, { 263 | speed: formatBytes(totalW / time) + '/s', 264 | size: formatBytes(totalW) + '/' + formatBytes(totalW) 265 | }); 266 | clearInterval(timer) 267 | 268 | b1.stop(); 269 | // loading.stop() 270 | successLog(`文件 ${localPath} 上传成功!`) 271 | } 272 | 273 | const uploadDirectory = async (localDir, remoteDir) => { 274 | 275 | 276 | const isIgnore = getIgnoreFileArr(localDir) 277 | if (isIgnore) return 278 | 279 | 280 | const files = fs.readdirSync(localDir) 281 | 282 | for (let i = 0; i < files.length; i++) { 283 | const fileName = files[i] 284 | 285 | const localFilePath = formatNodePath(path.join(localDir, fileName)) 286 | const remoteFilePath = formatNodePath(path.join(remoteDir, fileName)) 287 | 288 | const stats = fs.statSync(localFilePath) 289 | if (stats.isFile()) { 290 | await uploadFile(localFilePath, remoteFilePath, stats) 291 | } else if (stats.isDirectory()) { 292 | // console.log(localFilePath,'==> dir'); 293 | await SSH.mkdir(remoteFilePath, true) 294 | await uploadDirectory(localFilePath, remoteFilePath, stats) 295 | } 296 | } 297 | } 298 | 299 | 300 | const fuh = [',', '、', ';', ';'] 301 | 302 | const splitPath = (str) => { 303 | const fgf = fuh.find(item => str.indexOf(item) > -1) 304 | return str.split(fgf) 305 | } 306 | 307 | 308 | const updateDirFile = async () => { 309 | let pathArr = [] 310 | if (params['--localPath']) { 311 | pathArr = splitPath(params['--localPath']) 312 | } else { 313 | const localPaths = config.distFolder || config.localPath || false 314 | 315 | if (!localPaths) throw new Error(); 316 | 317 | if (typeof localPaths == 'object') { 318 | pathArr = localPaths 319 | } else { 320 | pathArr = splitPath(localPaths) 321 | } 322 | } 323 | 324 | for (let i = 0; i < pathArr.length; i++) { 325 | 326 | const localPath = pathArr[i] //path.resolve(__dirname, pathArr[i]) 327 | const stats = fs.statSync(localPath) 328 | let wwwPath = params['--wwwPath'] || config.wwwPath 329 | 330 | if (stats.isFile()) { 331 | if (wwwPath.indexOf('.' == -1)) { 332 | wwwPath = wwwPath + '/' + path.basename(localPath) 333 | } 334 | // console.log(localPath, 9999999, wwwPath); 335 | await uploadFile(localPath, wwwPath) 336 | } else if (stats.isDirectory()) { 337 | await SSH.mkdir(wwwPath, true) 338 | await uploadDirectory(localPath, wwwPath) 339 | successLog(`文件夹 ${localPath} 中的所有文件已上传成功!`) 340 | } 341 | } 342 | } 343 | 344 | //压缩代码 文件夹目录 345 | const zipDistDirFile = async () => { 346 | // defaultLog('') 347 | 348 | const loading = ora(defaultLog('正在压缩项目...')).start() 349 | try { 350 | 351 | const { distDir, distZipPath } = getFilePath() 352 | // if (!distDir) throw new Error(); 353 | 354 | loading.spinner = spinner_style[config.loadingStyle || 'arrow4'] 355 | 356 | await zipFile.zip.compressDir(distDir, distZipPath) 357 | // successLog('压缩成功!') 358 | loading.stop() 359 | } catch (error) { 360 | loading.stop() 361 | 362 | errorLog('压缩失败:' + error) 363 | // errorLog(', 退出程序!') 364 | process.exit() //退出流程 365 | } 366 | } 367 | 368 | 369 | //传送zip文件到服务器 370 | const uploadZipBySSH = async () => { 371 | try { 372 | // let wwwPath = params['--wwwPath'] || config.wwwPath 373 | // const { distDir, distZipPath } = getFilePath() 374 | // const localPath = config.distFolder || config.localPath || false 375 | 376 | // wwwPath = wwwPath + '/' + path.basename(localPath) 377 | 378 | const { distZipPath, wwwZipPath, dirName } = getFilePath() 379 | await uploadFile(formatNodePath(distZipPath), config.isCompress ? `/root/.swd_deploy/${dirName}.zip` : wwwZipPath) 380 | } catch (error) { 381 | errorLog(error) 382 | process.exit() //退出流程 383 | } 384 | } 385 | 386 | //传送文件到服务器 387 | const updateConnectZipFile = async () => { 388 | 389 | 390 | try { 391 | // 压缩文件 392 | await zipDistDirFile() 393 | 394 | //连接ssh 395 | await connectSSH() 396 | 397 | if (config.isCompress) { 398 | 399 | // 创建临时目录 400 | await runCommand(`rm -rf /root/.swd_deploy`) 401 | await runCommand(`mkdir /root/.swd_deploy`) 402 | 403 | // 上传压缩文件 404 | await uploadZipBySSH() 405 | 406 | if (config.isCompress) { 407 | const { wwwZipPath, dirName, wwwPath, distDir } = getFilePath() 408 | 409 | const loading = ora(defaultLog(`正在解压缩 ${dirName}.zip 文件...`)).start() 410 | 411 | loading.spinner = spinner_style[config.loadingStyle || 'arrow4'] 412 | 413 | // await nodeSSH.connect(getConnectSshOption()) 414 | // const remPathZip = formatNodePath(wwwZipPath) 415 | const wwwPathDist = formatNodePath(wwwPath) 416 | // console.log(remPathZip); 417 | 418 | await runCommand(`rm -rf ${wwwPathDist}`) 419 | await runCommand(`mkdir ${wwwPathDist}`) 420 | await runCommand(`unzip -o /root/.swd_deploy/${dirName}.zip -d /root/.swd_deploy`) //解压 421 | await runCommand(`mv -f /root/.swd_deploy/${dirName}/* ${wwwPathDist}`) //移动 422 | await runCommand(`rm -rf /root/.swd_deploy`) 423 | 424 | loading.stop() 425 | 426 | successLog(`文件 ${dirName}.zip 解压成功!`) 427 | // await runCommand(`rm -rf ${wwwPathDist}/${dirName}`) //解压完删除线上压缩包 428 | // await runCommand(`rm -rf /root/.swd_deploy`) //解压完删除线上压缩包 429 | 430 | } 431 | 432 | //将目标目录的dist里面文件移出到目标文件 433 | //举个例子 假如我们部署在 /test/html 这个目录下 只有一个网站, 那么上传解压后的文件在 /test/html/dist 里 434 | //需要将 dist 目录下的文件 移出到 /test/html 多网站情况, 如 /test/html/h5 或者 /test/html/admin 都和上面同样道理 435 | // await runCommand(`mv -f ${config.wwwPath}/${config.distFolder}/* ${config.wwwPath}`) 436 | // await runCommand(`rm -rf ${config.wwwPath}/${config.distFolder}`) //移出后删除 dist 文件夹 437 | // await runCommand(`rm -f ${config.wwwPath}/${config.distFolder}`) //移出后删除 dist 文件夹 438 | 439 | 440 | } else { 441 | // 上传文件 442 | await updateDirFile() 443 | } 444 | 445 | SSH.end() 446 | // nodeSSH.dispose() //断开连接 447 | 448 | } catch (error) { 449 | SSH.end() 450 | // nodeSSH.dispose() //断开连接 451 | errorLog(error) 452 | errorLog('上传失败,请检查文件或文件夹路径是否正确!') 453 | process.exit() //退出流程 454 | } 455 | 456 | 457 | // loading.stop() 458 | } 459 | 460 | //------------发布程序--------------- 461 | const runUploadTask = async () => { 462 | //打包 463 | if (params['--build'] || config.build || config.buildShell) { 464 | await buildDist() 465 | // if (!res) return 466 | } 467 | 468 | await updateConnectZipFile() 469 | successLog('大吉大利, 部署成功!ヾ(@^▽^@)ノ') 470 | process.exit() 471 | } 472 | 473 | // 开始前的配置检查 474 | /** 475 | * 476 | * @param {Object} conf 配置对象 477 | */ 478 | // const checkConfig = (conf) => { 479 | // const checkArr = Object.entries(conf) 480 | // checkArr.map(it => { 481 | // const key = it[0] 482 | // if (conf[key] === '/') { //上传zip前会清空目标目录内所有文件 483 | // errorLog('buildShell 不能是服务器根目录!') 484 | // process.exit() //退出流程 485 | // } 486 | // if (!conf[key]) { 487 | // errorLog(`配置项 ${key} 不能为空`) 488 | // process.exit() //退出流程 489 | // } 490 | // }) 491 | // } 492 | // console.log(params); 493 | 494 | let choices = []; 495 | 496 | for (const key in CONFIG) { 497 | choices.push({ 498 | name: CONFIG[key].title || `发布到 ${params['--host'] || config.sshIp || config.host} 服务器环境`, 499 | value: key 500 | }) 501 | }; 502 | 503 | if (choices.length === 0) { 504 | choices = [{ 505 | name: '测试环境', 506 | value: 'development' 507 | }, { 508 | name: '正式环境', 509 | value: 'production' 510 | }] 511 | } 512 | 513 | 514 | const initAnswers = async (key) => { 515 | 516 | config = key ? CONFIG[key] : {}; 517 | // config.distFolder = config.distFolder || config.distFolder.replace("/", ""); 518 | //文件夹目录 519 | // console.log(answers.env); 520 | const localPaths = params['--localPath'] || config.distFolder || config.localPath || false 521 | if (!localPaths) { 522 | errorLog('请配置本地打包目录,或检查 “deploy.config.js” 文件是否在根目录下!') 523 | process.exit() //退出流程 524 | // return 525 | }; 526 | 527 | // distDir = path.resolve(__dirname, `${pathHierarchy + config.distFolder}`) //待打包 528 | // distZipPath = path.resolve(__dirname, `${pathHierarchy + config.distFolder}.zip`) //打包后地址(dist.zip是文件名,不需要更改, 主要在config中配置 PATH 即可) 529 | // checkConfig(config) // 检查 530 | await runUploadTask() // 发布 531 | } 532 | 533 | // path.resolve(__dirname, 'D:/zx/zxczx') 534 | // 获取执行命令的路径 535 | // const execPath = process.argv[1]; 536 | 537 | // console.log('当前执行命令的路径:', execPath); 538 | // console.log(path.resolve(__dirname, './')); 539 | 540 | // return 541 | 542 | if (params) { 543 | 544 | // if (isExitConfigFile) { 545 | // if (!params['--key']) { 546 | // errorLog('请指定 --key 参数!') 547 | // process.exit() //退出流程 548 | // // return 549 | // } 550 | // } 551 | let key = params['--key'] 552 | if (key && (!CONFIG[key])) { 553 | errorLog('请检查 “deploy.config.js” 文件是否配置 --key 参数!') 554 | process.exit() //退出流程 555 | } 556 | 557 | initAnswers(key) 558 | } else { 559 | params = {} 560 | // 执行交互后 启动发布程序 561 | 562 | // for (const key in CONFIG) { 563 | // // const element = CONFIG[key]; 564 | // } 565 | inquirer 566 | .prompt([{ 567 | type: 'list', 568 | message: '请选择发布环境', 569 | name: 'env', 570 | choices 571 | }]) 572 | .then(answers => { 573 | initAnswers(answers.env) 574 | }) 575 | } 576 | 577 | 578 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "swd-deploy", 3 | "version": "2.2.2", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "swd-deploy", 9 | "version": "2.2.2", 10 | "license": "ISC", 11 | "dependencies": { 12 | "ansi-colors": "^4.1.3", 13 | "chalk": "^4.1.2", 14 | "cli-progress": "^3.12.0", 15 | "compressing": "^1.10.1", 16 | "inquirer": "^7.3.3", 17 | "ora": "^4.1.1", 18 | "shelljs": "^0.8.5", 19 | "ssh2-sftp-client": "^10.0.3" 20 | }, 21 | "bin": { 22 | "deploy": "index.js", 23 | "upload": "index.js" 24 | } 25 | }, 26 | "node_modules/@eggjs/yauzl": { 27 | "version": "2.11.0", 28 | "resolved": "https://registry.npmjs.org/@eggjs/yauzl/-/yauzl-2.11.0.tgz", 29 | "integrity": "sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==", 30 | "dependencies": { 31 | "buffer-crc32": "~0.2.3", 32 | "fd-slicer2": "^1.2.0" 33 | } 34 | }, 35 | "node_modules/ansi-colors": { 36 | "version": "4.1.3", 37 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 38 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 39 | "engines": { 40 | "node": ">=6" 41 | } 42 | }, 43 | "node_modules/ansi-escapes": { 44 | "version": "4.3.2", 45 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 46 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 47 | "dependencies": { 48 | "type-fest": "^0.21.3" 49 | }, 50 | "engines": { 51 | "node": ">=8" 52 | }, 53 | "funding": { 54 | "url": "https://github.com/sponsors/sindresorhus" 55 | } 56 | }, 57 | "node_modules/ansi-regex": { 58 | "version": "5.0.1", 59 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 60 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 61 | "engines": { 62 | "node": ">=8" 63 | } 64 | }, 65 | "node_modules/ansi-styles": { 66 | "version": "4.3.0", 67 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 68 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 69 | "dependencies": { 70 | "color-convert": "^2.0.1" 71 | }, 72 | "engines": { 73 | "node": ">=8" 74 | }, 75 | "funding": { 76 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 77 | } 78 | }, 79 | "node_modules/asn1": { 80 | "version": "0.2.6", 81 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 82 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 83 | "dependencies": { 84 | "safer-buffer": "~2.1.0" 85 | } 86 | }, 87 | "node_modules/balanced-match": { 88 | "version": "1.0.2", 89 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 90 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 91 | }, 92 | "node_modules/bcrypt-pbkdf": { 93 | "version": "1.0.2", 94 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 95 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", 96 | "dependencies": { 97 | "tweetnacl": "^0.14.3" 98 | } 99 | }, 100 | "node_modules/bl": { 101 | "version": "1.2.3", 102 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 103 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 104 | "dependencies": { 105 | "readable-stream": "^2.3.5", 106 | "safe-buffer": "^5.1.1" 107 | } 108 | }, 109 | "node_modules/bl/node_modules/readable-stream": { 110 | "version": "2.3.8", 111 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 112 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 113 | "dependencies": { 114 | "core-util-is": "~1.0.0", 115 | "inherits": "~2.0.3", 116 | "isarray": "~1.0.0", 117 | "process-nextick-args": "~2.0.0", 118 | "safe-buffer": "~5.1.1", 119 | "string_decoder": "~1.1.1", 120 | "util-deprecate": "~1.0.1" 121 | } 122 | }, 123 | "node_modules/bl/node_modules/safe-buffer": { 124 | "version": "5.1.2", 125 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 126 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 127 | }, 128 | "node_modules/bl/node_modules/string_decoder": { 129 | "version": "1.1.1", 130 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 131 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 132 | "dependencies": { 133 | "safe-buffer": "~5.1.0" 134 | } 135 | }, 136 | "node_modules/brace-expansion": { 137 | "version": "1.1.11", 138 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 139 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 140 | "dependencies": { 141 | "balanced-match": "^1.0.0", 142 | "concat-map": "0.0.1" 143 | } 144 | }, 145 | "node_modules/buffer-alloc": { 146 | "version": "1.2.0", 147 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 148 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 149 | "dependencies": { 150 | "buffer-alloc-unsafe": "^1.1.0", 151 | "buffer-fill": "^1.0.0" 152 | } 153 | }, 154 | "node_modules/buffer-alloc-unsafe": { 155 | "version": "1.1.0", 156 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 157 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 158 | }, 159 | "node_modules/buffer-crc32": { 160 | "version": "0.2.13", 161 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 162 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 163 | "engines": { 164 | "node": "*" 165 | } 166 | }, 167 | "node_modules/buffer-fill": { 168 | "version": "1.0.0", 169 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 170 | "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" 171 | }, 172 | "node_modules/buffer-from": { 173 | "version": "1.1.2", 174 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 175 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 176 | }, 177 | "node_modules/buildcheck": { 178 | "version": "0.0.6", 179 | "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", 180 | "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", 181 | "optional": true, 182 | "engines": { 183 | "node": ">=10.0.0" 184 | } 185 | }, 186 | "node_modules/chalk": { 187 | "version": "4.1.2", 188 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 189 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 190 | "dependencies": { 191 | "ansi-styles": "^4.1.0", 192 | "supports-color": "^7.1.0" 193 | }, 194 | "engines": { 195 | "node": ">=10" 196 | }, 197 | "funding": { 198 | "url": "https://github.com/chalk/chalk?sponsor=1" 199 | } 200 | }, 201 | "node_modules/chardet": { 202 | "version": "0.7.0", 203 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 204 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 205 | }, 206 | "node_modules/cli-cursor": { 207 | "version": "3.1.0", 208 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 209 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 210 | "dependencies": { 211 | "restore-cursor": "^3.1.0" 212 | }, 213 | "engines": { 214 | "node": ">=8" 215 | } 216 | }, 217 | "node_modules/cli-progress": { 218 | "version": "3.12.0", 219 | "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", 220 | "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", 221 | "dependencies": { 222 | "string-width": "^4.2.3" 223 | }, 224 | "engines": { 225 | "node": ">=4" 226 | } 227 | }, 228 | "node_modules/cli-spinners": { 229 | "version": "2.9.2", 230 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", 231 | "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", 232 | "engines": { 233 | "node": ">=6" 234 | }, 235 | "funding": { 236 | "url": "https://github.com/sponsors/sindresorhus" 237 | } 238 | }, 239 | "node_modules/cli-width": { 240 | "version": "3.0.0", 241 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 242 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", 243 | "engines": { 244 | "node": ">= 10" 245 | } 246 | }, 247 | "node_modules/clone": { 248 | "version": "1.0.4", 249 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 250 | "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", 251 | "engines": { 252 | "node": ">=0.8" 253 | } 254 | }, 255 | "node_modules/color-convert": { 256 | "version": "2.0.1", 257 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 258 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 259 | "dependencies": { 260 | "color-name": "~1.1.4" 261 | }, 262 | "engines": { 263 | "node": ">=7.0.0" 264 | } 265 | }, 266 | "node_modules/color-name": { 267 | "version": "1.1.4", 268 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 269 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 270 | }, 271 | "node_modules/compressing": { 272 | "version": "1.10.1", 273 | "resolved": "https://registry.npmjs.org/compressing/-/compressing-1.10.1.tgz", 274 | "integrity": "sha512-XXwUffcVjqv8NGSQu1ttp6eMmuZ3zZEAec28Rt30o/vkXE20jXhowRQ9LXLY4uOgFkxXrNzApLobpam53Dc1AA==", 275 | "dependencies": { 276 | "@eggjs/yauzl": "^2.11.0", 277 | "flushwritable": "^1.0.0", 278 | "get-ready": "^1.0.0", 279 | "iconv-lite": "^0.5.0", 280 | "mkdirp": "^0.5.1", 281 | "pump": "^3.0.0", 282 | "streamifier": "^0.1.1", 283 | "tar-stream": "^1.5.2", 284 | "yazl": "^2.4.2" 285 | }, 286 | "engines": { 287 | "node": ">= 4.0.0" 288 | } 289 | }, 290 | "node_modules/concat-map": { 291 | "version": "0.0.1", 292 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 293 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 294 | }, 295 | "node_modules/concat-stream": { 296 | "version": "2.0.0", 297 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 298 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 299 | "engines": [ 300 | "node >= 6.0" 301 | ], 302 | "dependencies": { 303 | "buffer-from": "^1.0.0", 304 | "inherits": "^2.0.3", 305 | "readable-stream": "^3.0.2", 306 | "typedarray": "^0.0.6" 307 | } 308 | }, 309 | "node_modules/core-util-is": { 310 | "version": "1.0.3", 311 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 312 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 313 | }, 314 | "node_modules/cpu-features": { 315 | "version": "0.0.10", 316 | "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", 317 | "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", 318 | "hasInstallScript": true, 319 | "optional": true, 320 | "dependencies": { 321 | "buildcheck": "~0.0.6", 322 | "nan": "^2.19.0" 323 | }, 324 | "engines": { 325 | "node": ">=10.0.0" 326 | } 327 | }, 328 | "node_modules/defaults": { 329 | "version": "1.0.4", 330 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", 331 | "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", 332 | "dependencies": { 333 | "clone": "^1.0.2" 334 | }, 335 | "funding": { 336 | "url": "https://github.com/sponsors/sindresorhus" 337 | } 338 | }, 339 | "node_modules/emoji-regex": { 340 | "version": "8.0.0", 341 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 342 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 343 | }, 344 | "node_modules/end-of-stream": { 345 | "version": "1.4.4", 346 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 347 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 348 | "dependencies": { 349 | "once": "^1.4.0" 350 | } 351 | }, 352 | "node_modules/err-code": { 353 | "version": "2.0.3", 354 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 355 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" 356 | }, 357 | "node_modules/escape-string-regexp": { 358 | "version": "1.0.5", 359 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 360 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 361 | "engines": { 362 | "node": ">=0.8.0" 363 | } 364 | }, 365 | "node_modules/external-editor": { 366 | "version": "3.1.0", 367 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 368 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 369 | "dependencies": { 370 | "chardet": "^0.7.0", 371 | "iconv-lite": "^0.4.24", 372 | "tmp": "^0.0.33" 373 | }, 374 | "engines": { 375 | "node": ">=4" 376 | } 377 | }, 378 | "node_modules/external-editor/node_modules/iconv-lite": { 379 | "version": "0.4.24", 380 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 381 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 382 | "dependencies": { 383 | "safer-buffer": ">= 2.1.2 < 3" 384 | }, 385 | "engines": { 386 | "node": ">=0.10.0" 387 | } 388 | }, 389 | "node_modules/fd-slicer2": { 390 | "version": "1.2.0", 391 | "resolved": "https://registry.npmjs.org/fd-slicer2/-/fd-slicer2-1.2.0.tgz", 392 | "integrity": "sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==", 393 | "dependencies": { 394 | "pend": "^1.2.0" 395 | } 396 | }, 397 | "node_modules/figures": { 398 | "version": "3.2.0", 399 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 400 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 401 | "dependencies": { 402 | "escape-string-regexp": "^1.0.5" 403 | }, 404 | "engines": { 405 | "node": ">=8" 406 | }, 407 | "funding": { 408 | "url": "https://github.com/sponsors/sindresorhus" 409 | } 410 | }, 411 | "node_modules/flushwritable": { 412 | "version": "1.0.0", 413 | "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", 414 | "integrity": "sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==" 415 | }, 416 | "node_modules/fs-constants": { 417 | "version": "1.0.0", 418 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 419 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 420 | }, 421 | "node_modules/fs.realpath": { 422 | "version": "1.0.0", 423 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 424 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 425 | }, 426 | "node_modules/function-bind": { 427 | "version": "1.1.2", 428 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 429 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 430 | "funding": { 431 | "url": "https://github.com/sponsors/ljharb" 432 | } 433 | }, 434 | "node_modules/get-ready": { 435 | "version": "1.0.0", 436 | "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz", 437 | "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==" 438 | }, 439 | "node_modules/glob": { 440 | "version": "7.2.3", 441 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 442 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 443 | "deprecated": "Glob versions prior to v9 are no longer supported", 444 | "dependencies": { 445 | "fs.realpath": "^1.0.0", 446 | "inflight": "^1.0.4", 447 | "inherits": "2", 448 | "minimatch": "^3.1.1", 449 | "once": "^1.3.0", 450 | "path-is-absolute": "^1.0.0" 451 | }, 452 | "engines": { 453 | "node": "*" 454 | }, 455 | "funding": { 456 | "url": "https://github.com/sponsors/isaacs" 457 | } 458 | }, 459 | "node_modules/has-flag": { 460 | "version": "4.0.0", 461 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 462 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 463 | "engines": { 464 | "node": ">=8" 465 | } 466 | }, 467 | "node_modules/hasown": { 468 | "version": "2.0.2", 469 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 470 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 471 | "dependencies": { 472 | "function-bind": "^1.1.2" 473 | }, 474 | "engines": { 475 | "node": ">= 0.4" 476 | } 477 | }, 478 | "node_modules/iconv-lite": { 479 | "version": "0.5.2", 480 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", 481 | "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", 482 | "dependencies": { 483 | "safer-buffer": ">= 2.1.2 < 3" 484 | }, 485 | "engines": { 486 | "node": ">=0.10.0" 487 | } 488 | }, 489 | "node_modules/inflight": { 490 | "version": "1.0.6", 491 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 492 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 493 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 494 | "dependencies": { 495 | "once": "^1.3.0", 496 | "wrappy": "1" 497 | } 498 | }, 499 | "node_modules/inherits": { 500 | "version": "2.0.4", 501 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 502 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 503 | }, 504 | "node_modules/inquirer": { 505 | "version": "7.3.3", 506 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", 507 | "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", 508 | "dependencies": { 509 | "ansi-escapes": "^4.2.1", 510 | "chalk": "^4.1.0", 511 | "cli-cursor": "^3.1.0", 512 | "cli-width": "^3.0.0", 513 | "external-editor": "^3.0.3", 514 | "figures": "^3.0.0", 515 | "lodash": "^4.17.19", 516 | "mute-stream": "0.0.8", 517 | "run-async": "^2.4.0", 518 | "rxjs": "^6.6.0", 519 | "string-width": "^4.1.0", 520 | "strip-ansi": "^6.0.0", 521 | "through": "^2.3.6" 522 | }, 523 | "engines": { 524 | "node": ">=8.0.0" 525 | } 526 | }, 527 | "node_modules/interpret": { 528 | "version": "1.4.0", 529 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 530 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 531 | "engines": { 532 | "node": ">= 0.10" 533 | } 534 | }, 535 | "node_modules/is-core-module": { 536 | "version": "2.13.1", 537 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 538 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 539 | "dependencies": { 540 | "hasown": "^2.0.0" 541 | }, 542 | "funding": { 543 | "url": "https://github.com/sponsors/ljharb" 544 | } 545 | }, 546 | "node_modules/is-fullwidth-code-point": { 547 | "version": "3.0.0", 548 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 549 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 550 | "engines": { 551 | "node": ">=8" 552 | } 553 | }, 554 | "node_modules/is-interactive": { 555 | "version": "1.0.0", 556 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 557 | "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", 558 | "engines": { 559 | "node": ">=8" 560 | } 561 | }, 562 | "node_modules/isarray": { 563 | "version": "1.0.0", 564 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 565 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 566 | }, 567 | "node_modules/lodash": { 568 | "version": "4.17.21", 569 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 570 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 571 | }, 572 | "node_modules/log-symbols": { 573 | "version": "3.0.0", 574 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 575 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 576 | "dependencies": { 577 | "chalk": "^2.4.2" 578 | }, 579 | "engines": { 580 | "node": ">=8" 581 | } 582 | }, 583 | "node_modules/log-symbols/node_modules/ansi-styles": { 584 | "version": "3.2.1", 585 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 586 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 587 | "dependencies": { 588 | "color-convert": "^1.9.0" 589 | }, 590 | "engines": { 591 | "node": ">=4" 592 | } 593 | }, 594 | "node_modules/log-symbols/node_modules/chalk": { 595 | "version": "2.4.2", 596 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 597 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 598 | "dependencies": { 599 | "ansi-styles": "^3.2.1", 600 | "escape-string-regexp": "^1.0.5", 601 | "supports-color": "^5.3.0" 602 | }, 603 | "engines": { 604 | "node": ">=4" 605 | } 606 | }, 607 | "node_modules/log-symbols/node_modules/color-convert": { 608 | "version": "1.9.3", 609 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 610 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 611 | "dependencies": { 612 | "color-name": "1.1.3" 613 | } 614 | }, 615 | "node_modules/log-symbols/node_modules/color-name": { 616 | "version": "1.1.3", 617 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 618 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 619 | }, 620 | "node_modules/log-symbols/node_modules/has-flag": { 621 | "version": "3.0.0", 622 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 623 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 624 | "engines": { 625 | "node": ">=4" 626 | } 627 | }, 628 | "node_modules/log-symbols/node_modules/supports-color": { 629 | "version": "5.5.0", 630 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 631 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 632 | "dependencies": { 633 | "has-flag": "^3.0.0" 634 | }, 635 | "engines": { 636 | "node": ">=4" 637 | } 638 | }, 639 | "node_modules/mimic-fn": { 640 | "version": "2.1.0", 641 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 642 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 643 | "engines": { 644 | "node": ">=6" 645 | } 646 | }, 647 | "node_modules/minimatch": { 648 | "version": "3.1.2", 649 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 650 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 651 | "dependencies": { 652 | "brace-expansion": "^1.1.7" 653 | }, 654 | "engines": { 655 | "node": "*" 656 | } 657 | }, 658 | "node_modules/minimist": { 659 | "version": "1.2.8", 660 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 661 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 662 | "funding": { 663 | "url": "https://github.com/sponsors/ljharb" 664 | } 665 | }, 666 | "node_modules/mkdirp": { 667 | "version": "0.5.6", 668 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 669 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 670 | "dependencies": { 671 | "minimist": "^1.2.6" 672 | }, 673 | "bin": { 674 | "mkdirp": "bin/cmd.js" 675 | } 676 | }, 677 | "node_modules/mute-stream": { 678 | "version": "0.0.8", 679 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 680 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 681 | }, 682 | "node_modules/nan": { 683 | "version": "2.20.0", 684 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", 685 | "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", 686 | "optional": true 687 | }, 688 | "node_modules/once": { 689 | "version": "1.4.0", 690 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 691 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 692 | "dependencies": { 693 | "wrappy": "1" 694 | } 695 | }, 696 | "node_modules/onetime": { 697 | "version": "5.1.2", 698 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 699 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 700 | "dependencies": { 701 | "mimic-fn": "^2.1.0" 702 | }, 703 | "engines": { 704 | "node": ">=6" 705 | }, 706 | "funding": { 707 | "url": "https://github.com/sponsors/sindresorhus" 708 | } 709 | }, 710 | "node_modules/ora": { 711 | "version": "4.1.1", 712 | "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", 713 | "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", 714 | "dependencies": { 715 | "chalk": "^3.0.0", 716 | "cli-cursor": "^3.1.0", 717 | "cli-spinners": "^2.2.0", 718 | "is-interactive": "^1.0.0", 719 | "log-symbols": "^3.0.0", 720 | "mute-stream": "0.0.8", 721 | "strip-ansi": "^6.0.0", 722 | "wcwidth": "^1.0.1" 723 | }, 724 | "engines": { 725 | "node": ">=8" 726 | }, 727 | "funding": { 728 | "url": "https://github.com/sponsors/sindresorhus" 729 | } 730 | }, 731 | "node_modules/ora/node_modules/chalk": { 732 | "version": "3.0.0", 733 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 734 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 735 | "dependencies": { 736 | "ansi-styles": "^4.1.0", 737 | "supports-color": "^7.1.0" 738 | }, 739 | "engines": { 740 | "node": ">=8" 741 | } 742 | }, 743 | "node_modules/os-tmpdir": { 744 | "version": "1.0.2", 745 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 746 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 747 | "engines": { 748 | "node": ">=0.10.0" 749 | } 750 | }, 751 | "node_modules/path-is-absolute": { 752 | "version": "1.0.1", 753 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 754 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 755 | "engines": { 756 | "node": ">=0.10.0" 757 | } 758 | }, 759 | "node_modules/path-parse": { 760 | "version": "1.0.7", 761 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 762 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 763 | }, 764 | "node_modules/pend": { 765 | "version": "1.2.0", 766 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 767 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" 768 | }, 769 | "node_modules/process-nextick-args": { 770 | "version": "2.0.1", 771 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 772 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 773 | }, 774 | "node_modules/promise-retry": { 775 | "version": "2.0.1", 776 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 777 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 778 | "dependencies": { 779 | "err-code": "^2.0.2", 780 | "retry": "^0.12.0" 781 | }, 782 | "engines": { 783 | "node": ">=10" 784 | } 785 | }, 786 | "node_modules/pump": { 787 | "version": "3.0.0", 788 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 789 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 790 | "dependencies": { 791 | "end-of-stream": "^1.1.0", 792 | "once": "^1.3.1" 793 | } 794 | }, 795 | "node_modules/readable-stream": { 796 | "version": "3.6.2", 797 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 798 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 799 | "dependencies": { 800 | "inherits": "^2.0.3", 801 | "string_decoder": "^1.1.1", 802 | "util-deprecate": "^1.0.1" 803 | }, 804 | "engines": { 805 | "node": ">= 6" 806 | } 807 | }, 808 | "node_modules/rechoir": { 809 | "version": "0.6.2", 810 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 811 | "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", 812 | "dependencies": { 813 | "resolve": "^1.1.6" 814 | }, 815 | "engines": { 816 | "node": ">= 0.10" 817 | } 818 | }, 819 | "node_modules/resolve": { 820 | "version": "1.22.8", 821 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 822 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 823 | "dependencies": { 824 | "is-core-module": "^2.13.0", 825 | "path-parse": "^1.0.7", 826 | "supports-preserve-symlinks-flag": "^1.0.0" 827 | }, 828 | "bin": { 829 | "resolve": "bin/resolve" 830 | }, 831 | "funding": { 832 | "url": "https://github.com/sponsors/ljharb" 833 | } 834 | }, 835 | "node_modules/restore-cursor": { 836 | "version": "3.1.0", 837 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 838 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 839 | "dependencies": { 840 | "onetime": "^5.1.0", 841 | "signal-exit": "^3.0.2" 842 | }, 843 | "engines": { 844 | "node": ">=8" 845 | } 846 | }, 847 | "node_modules/retry": { 848 | "version": "0.12.0", 849 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 850 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 851 | "engines": { 852 | "node": ">= 4" 853 | } 854 | }, 855 | "node_modules/run-async": { 856 | "version": "2.4.1", 857 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 858 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 859 | "engines": { 860 | "node": ">=0.12.0" 861 | } 862 | }, 863 | "node_modules/rxjs": { 864 | "version": "6.6.7", 865 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 866 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 867 | "dependencies": { 868 | "tslib": "^1.9.0" 869 | }, 870 | "engines": { 871 | "npm": ">=2.0.0" 872 | } 873 | }, 874 | "node_modules/safe-buffer": { 875 | "version": "5.2.1", 876 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 877 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 878 | "funding": [ 879 | { 880 | "type": "github", 881 | "url": "https://github.com/sponsors/feross" 882 | }, 883 | { 884 | "type": "patreon", 885 | "url": "https://www.patreon.com/feross" 886 | }, 887 | { 888 | "type": "consulting", 889 | "url": "https://feross.org/support" 890 | } 891 | ] 892 | }, 893 | "node_modules/safer-buffer": { 894 | "version": "2.1.2", 895 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 896 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 897 | }, 898 | "node_modules/shelljs": { 899 | "version": "0.8.5", 900 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", 901 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 902 | "dependencies": { 903 | "glob": "^7.0.0", 904 | "interpret": "^1.0.0", 905 | "rechoir": "^0.6.2" 906 | }, 907 | "bin": { 908 | "shjs": "bin/shjs" 909 | }, 910 | "engines": { 911 | "node": ">=4" 912 | } 913 | }, 914 | "node_modules/signal-exit": { 915 | "version": "3.0.7", 916 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 917 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 918 | }, 919 | "node_modules/ssh2": { 920 | "version": "1.15.0", 921 | "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.15.0.tgz", 922 | "integrity": "sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==", 923 | "hasInstallScript": true, 924 | "dependencies": { 925 | "asn1": "^0.2.6", 926 | "bcrypt-pbkdf": "^1.0.2" 927 | }, 928 | "engines": { 929 | "node": ">=10.16.0" 930 | }, 931 | "optionalDependencies": { 932 | "cpu-features": "~0.0.9", 933 | "nan": "^2.18.0" 934 | } 935 | }, 936 | "node_modules/ssh2-sftp-client": { 937 | "version": "10.0.3", 938 | "resolved": "https://registry.npmjs.org/ssh2-sftp-client/-/ssh2-sftp-client-10.0.3.tgz", 939 | "integrity": "sha512-Wlhasz/OCgrlqC8IlBZhF19Uw/X/dHI8ug4sFQybPE+0sDztvgvDf7Om6o7LbRLe68E7XkFZf3qMnqAvqn1vkQ==", 940 | "dependencies": { 941 | "concat-stream": "^2.0.0", 942 | "promise-retry": "^2.0.1", 943 | "ssh2": "^1.15.0" 944 | }, 945 | "engines": { 946 | "node": ">=16.20.2" 947 | }, 948 | "funding": { 949 | "type": "individual", 950 | "url": "https://square.link/u/4g7sPflL" 951 | } 952 | }, 953 | "node_modules/streamifier": { 954 | "version": "0.1.1", 955 | "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", 956 | "integrity": "sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==", 957 | "engines": { 958 | "node": ">=0.10" 959 | } 960 | }, 961 | "node_modules/string_decoder": { 962 | "version": "1.3.0", 963 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 964 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 965 | "dependencies": { 966 | "safe-buffer": "~5.2.0" 967 | } 968 | }, 969 | "node_modules/string-width": { 970 | "version": "4.2.3", 971 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 972 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 973 | "dependencies": { 974 | "emoji-regex": "^8.0.0", 975 | "is-fullwidth-code-point": "^3.0.0", 976 | "strip-ansi": "^6.0.1" 977 | }, 978 | "engines": { 979 | "node": ">=8" 980 | } 981 | }, 982 | "node_modules/strip-ansi": { 983 | "version": "6.0.1", 984 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 985 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 986 | "dependencies": { 987 | "ansi-regex": "^5.0.1" 988 | }, 989 | "engines": { 990 | "node": ">=8" 991 | } 992 | }, 993 | "node_modules/supports-color": { 994 | "version": "7.2.0", 995 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 996 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 997 | "dependencies": { 998 | "has-flag": "^4.0.0" 999 | }, 1000 | "engines": { 1001 | "node": ">=8" 1002 | } 1003 | }, 1004 | "node_modules/supports-preserve-symlinks-flag": { 1005 | "version": "1.0.0", 1006 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1007 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1008 | "engines": { 1009 | "node": ">= 0.4" 1010 | }, 1011 | "funding": { 1012 | "url": "https://github.com/sponsors/ljharb" 1013 | } 1014 | }, 1015 | "node_modules/tar-stream": { 1016 | "version": "1.6.2", 1017 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 1018 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 1019 | "dependencies": { 1020 | "bl": "^1.0.0", 1021 | "buffer-alloc": "^1.2.0", 1022 | "end-of-stream": "^1.0.0", 1023 | "fs-constants": "^1.0.0", 1024 | "readable-stream": "^2.3.0", 1025 | "to-buffer": "^1.1.1", 1026 | "xtend": "^4.0.0" 1027 | }, 1028 | "engines": { 1029 | "node": ">= 0.8.0" 1030 | } 1031 | }, 1032 | "node_modules/tar-stream/node_modules/readable-stream": { 1033 | "version": "2.3.8", 1034 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 1035 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 1036 | "dependencies": { 1037 | "core-util-is": "~1.0.0", 1038 | "inherits": "~2.0.3", 1039 | "isarray": "~1.0.0", 1040 | "process-nextick-args": "~2.0.0", 1041 | "safe-buffer": "~5.1.1", 1042 | "string_decoder": "~1.1.1", 1043 | "util-deprecate": "~1.0.1" 1044 | } 1045 | }, 1046 | "node_modules/tar-stream/node_modules/safe-buffer": { 1047 | "version": "5.1.2", 1048 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1049 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1050 | }, 1051 | "node_modules/tar-stream/node_modules/string_decoder": { 1052 | "version": "1.1.1", 1053 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1054 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1055 | "dependencies": { 1056 | "safe-buffer": "~5.1.0" 1057 | } 1058 | }, 1059 | "node_modules/through": { 1060 | "version": "2.3.8", 1061 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1062 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 1063 | }, 1064 | "node_modules/tmp": { 1065 | "version": "0.0.33", 1066 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1067 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1068 | "dependencies": { 1069 | "os-tmpdir": "~1.0.2" 1070 | }, 1071 | "engines": { 1072 | "node": ">=0.6.0" 1073 | } 1074 | }, 1075 | "node_modules/to-buffer": { 1076 | "version": "1.1.1", 1077 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 1078 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" 1079 | }, 1080 | "node_modules/tslib": { 1081 | "version": "1.14.1", 1082 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1083 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1084 | }, 1085 | "node_modules/tweetnacl": { 1086 | "version": "0.14.5", 1087 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1088 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" 1089 | }, 1090 | "node_modules/type-fest": { 1091 | "version": "0.21.3", 1092 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 1093 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 1094 | "engines": { 1095 | "node": ">=10" 1096 | }, 1097 | "funding": { 1098 | "url": "https://github.com/sponsors/sindresorhus" 1099 | } 1100 | }, 1101 | "node_modules/typedarray": { 1102 | "version": "0.0.6", 1103 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1104 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" 1105 | }, 1106 | "node_modules/util-deprecate": { 1107 | "version": "1.0.2", 1108 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1109 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1110 | }, 1111 | "node_modules/wcwidth": { 1112 | "version": "1.0.1", 1113 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 1114 | "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", 1115 | "dependencies": { 1116 | "defaults": "^1.0.3" 1117 | } 1118 | }, 1119 | "node_modules/wrappy": { 1120 | "version": "1.0.2", 1121 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1122 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1123 | }, 1124 | "node_modules/xtend": { 1125 | "version": "4.0.2", 1126 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1127 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1128 | "engines": { 1129 | "node": ">=0.4" 1130 | } 1131 | }, 1132 | "node_modules/yazl": { 1133 | "version": "2.5.1", 1134 | "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", 1135 | "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", 1136 | "dependencies": { 1137 | "buffer-crc32": "~0.2.3" 1138 | } 1139 | } 1140 | } 1141 | } 1142 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "swd-deploy", 3 | "version": "2.2.2", 4 | "description": "swd-deploy 一个简单方便的前端自动部署工具,可通过使用 npm 将包安装到你的项目中。", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "deploy", 11 | "swd-deploy", 12 | "前端自动化部署", 13 | "ssh" 14 | ], 15 | "author": "zll", 16 | "license": "ISC", 17 | "bin": { 18 | "deploy": "./index.js", 19 | "upload": "./index.js" 20 | }, 21 | "dependencies": { 22 | "ansi-colors": "^4.1.3", 23 | "chalk": "^4.1.2", 24 | "cli-progress": "^3.12.0", 25 | "compressing": "^1.10.1", 26 | "inquirer": "^7.3.3", 27 | "ora": "^4.1.1", 28 | "shelljs": "^0.8.5", 29 | "ssh2-sftp-client": "^10.0.3" 30 | }, 31 | "repository": { 32 | "type": "git", 33 | "url": "https://github.com/zlluGitHub/swd-deploy" 34 | }, 35 | "homepage": "https://github.com/zlluGitHub/swd-deploy" 36 | } 37 | -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 用秘钥登录服务器(推荐), 3 | * 把本机 公钥 .ssh目录下 id_rsa.pub 放服务器 authorized_keys 文件里, 多个电脑公钥换行分开 4 | * private 本机私钥文件地址(需要在服务器用户目录 一般是 ~/.ssh/authorized_keys 配置公钥 并该文件权限为 600, (.ssh文件夹一般默认隐藏) 5 | * 一般 .ssh在用户目录下 cd ~/.ssh/ 复制路径放下面 pwd 可查看当前路径 路径用 / 别 \ 例如以下 C:/Users/Administrator/.ssh/id_rsa 6 | **/ 7 | 8 | module.exports = Object.freeze({ 9 | development: {//测试 10 | title: "开发环境", //提示标题 11 | // x[已废弃] sshIp: '10.0.85.100', 12 | host: '127.0.0.1',// 新增字段与 sshIp 一致 13 | port: 22, 14 | // x[已废弃] sshUserName: 'root', 15 | username: 'root', 16 | password: '', 17 | wwwPath: '', 18 | isCompress: true, 19 | // x[已废弃] distFolder: 'src', // 打包后的文件夹 默认 /dist 20 | localPath: '', // 新增字段与distFolder一致 默认 /dist 21 | configPath: '', // deploy.config.js文件路径 默认项目根目录(./) 22 | loadingStyle: 'arrow4', // 打包后的文件夹 默认 /dist 23 | ignoreFiles: '', // 忽略文件 多个文件用 , 隔开 例如 .git, .gitignore, .DS_Store 24 | // x[已废弃] buildShell: '',// 'npm run build', // 自定义打包命令 若为空则会直接部署,不会打包 25 | build: '',// 'npm run build', // 自定义打包命令 若为空则会直接部署,不会打包 26 | readyTimeout: 60000 // 超时时间 27 | }, 28 | production: {//正式 29 | sshIp: '', 30 | sshUserName: '', 31 | password: '', 32 | wwwPath: '', 33 | loadingStyle: 'arrow4' 34 | } 35 | }) 36 | -------------------------------------------------------------------------------- /src/spinner_style.js: -------------------------------------------------------------------------------- 1 | const style = { 2 | "dots": { 3 | "interval": 80, 4 | "frames": [ 5 | "⠋", 6 | "⠙", 7 | "⠹", 8 | "⠸", 9 | "⠼", 10 | "⠴", 11 | "⠦", 12 | "⠧", 13 | "⠇", 14 | "⠏" 15 | ] 16 | }, 17 | "dots2": { 18 | "interval": 80, 19 | "frames": [ 20 | "⣾", 21 | "⣽", 22 | "⣻", 23 | "⢿", 24 | "⡿", 25 | "⣟", 26 | "⣯", 27 | "⣷" 28 | ] 29 | }, 30 | "dots3": { 31 | "interval": 80, 32 | "frames": [ 33 | "⠋", 34 | "⠙", 35 | "⠚", 36 | "⠞", 37 | "⠖", 38 | "⠦", 39 | "⠴", 40 | "⠲", 41 | "⠳", 42 | "⠓" 43 | ] 44 | }, 45 | "dots4": { 46 | "interval": 80, 47 | "frames": [ 48 | "⠄", 49 | "⠆", 50 | "⠇", 51 | "⠋", 52 | "⠙", 53 | "⠸", 54 | "⠰", 55 | "⠠", 56 | "⠰", 57 | "⠸", 58 | "⠙", 59 | "⠋", 60 | "⠇", 61 | "⠆" 62 | ] 63 | }, 64 | "dots5": { 65 | "interval": 80, 66 | "frames": [ 67 | "⠋", 68 | "⠙", 69 | "⠚", 70 | "⠒", 71 | "⠂", 72 | "⠂", 73 | "⠒", 74 | "⠲", 75 | "⠴", 76 | "⠦", 77 | "⠖", 78 | "⠒", 79 | "⠐", 80 | "⠐", 81 | "⠒", 82 | "⠓", 83 | "⠋" 84 | ] 85 | }, 86 | "dots6": { 87 | "interval": 80, 88 | "frames": [ 89 | "⠁", 90 | "⠉", 91 | "⠙", 92 | "⠚", 93 | "⠒", 94 | "⠂", 95 | "⠂", 96 | "⠒", 97 | "⠲", 98 | "⠴", 99 | "⠤", 100 | "⠄", 101 | "⠄", 102 | "⠤", 103 | "⠴", 104 | "⠲", 105 | "⠒", 106 | "⠂", 107 | "⠂", 108 | "⠒", 109 | "⠚", 110 | "⠙", 111 | "⠉", 112 | "⠁" 113 | ] 114 | }, 115 | "dots7": { 116 | "interval": 80, 117 | "frames": [ 118 | "⠈", 119 | "⠉", 120 | "⠋", 121 | "⠓", 122 | "⠒", 123 | "⠐", 124 | "⠐", 125 | "⠒", 126 | "⠖", 127 | "⠦", 128 | "⠤", 129 | "⠠", 130 | "⠠", 131 | "⠤", 132 | "⠦", 133 | "⠖", 134 | "⠒", 135 | "⠐", 136 | "⠐", 137 | "⠒", 138 | "⠓", 139 | "⠋", 140 | "⠉", 141 | "⠈" 142 | ] 143 | }, 144 | "dots8": { 145 | "interval": 80, 146 | "frames": [ 147 | "⠁", 148 | "⠁", 149 | "⠉", 150 | "⠙", 151 | "⠚", 152 | "⠒", 153 | "⠂", 154 | "⠂", 155 | "⠒", 156 | "⠲", 157 | "⠴", 158 | "⠤", 159 | "⠄", 160 | "⠄", 161 | "⠤", 162 | "⠠", 163 | "⠠", 164 | "⠤", 165 | "⠦", 166 | "⠖", 167 | "⠒", 168 | "⠐", 169 | "⠐", 170 | "⠒", 171 | "⠓", 172 | "⠋", 173 | "⠉", 174 | "⠈", 175 | "⠈" 176 | ] 177 | }, 178 | "dots9": { 179 | "interval": 80, 180 | "frames": [ 181 | "⢹", 182 | "⢺", 183 | "⢼", 184 | "⣸", 185 | "⣇", 186 | "⡧", 187 | "⡗", 188 | "⡏" 189 | ] 190 | }, 191 | "dots10": { 192 | "interval": 80, 193 | "frames": [ 194 | "⢄", 195 | "⢂", 196 | "⢁", 197 | "⡁", 198 | "⡈", 199 | "⡐", 200 | "⡠" 201 | ] 202 | }, 203 | "dots11": { 204 | "interval": 100, 205 | "frames": [ 206 | "⠁", 207 | "⠂", 208 | "⠄", 209 | "⡀", 210 | "⢀", 211 | "⠠", 212 | "⠐", 213 | "⠈" 214 | ] 215 | }, 216 | "dots12": { 217 | "interval": 80, 218 | "frames": [ 219 | "⢀⠀", 220 | "⡀⠀", 221 | "⠄⠀", 222 | "⢂⠀", 223 | "⡂⠀", 224 | "⠅⠀", 225 | "⢃⠀", 226 | "⡃⠀", 227 | "⠍⠀", 228 | "⢋⠀", 229 | "⡋⠀", 230 | "⠍⠁", 231 | "⢋⠁", 232 | "⡋⠁", 233 | "⠍⠉", 234 | "⠋⠉", 235 | "⠋⠉", 236 | "⠉⠙", 237 | "⠉⠙", 238 | "⠉⠩", 239 | "⠈⢙", 240 | "⠈⡙", 241 | "⢈⠩", 242 | "⡀⢙", 243 | "⠄⡙", 244 | "⢂⠩", 245 | "⡂⢘", 246 | "⠅⡘", 247 | "⢃⠨", 248 | "⡃⢐", 249 | "⠍⡐", 250 | "⢋⠠", 251 | "⡋⢀", 252 | "⠍⡁", 253 | "⢋⠁", 254 | "⡋⠁", 255 | "⠍⠉", 256 | "⠋⠉", 257 | "⠋⠉", 258 | "⠉⠙", 259 | "⠉⠙", 260 | "⠉⠩", 261 | "⠈⢙", 262 | "⠈⡙", 263 | "⠈⠩", 264 | "⠀⢙", 265 | "⠀⡙", 266 | "⠀⠩", 267 | "⠀⢘", 268 | "⠀⡘", 269 | "⠀⠨", 270 | "⠀⢐", 271 | "⠀⡐", 272 | "⠀⠠", 273 | "⠀⢀", 274 | "⠀⡀" 275 | ] 276 | }, 277 | "line": { 278 | "interval": 130, 279 | "frames": [ 280 | "-", 281 | "\\", 282 | "|", 283 | "/" 284 | ] 285 | }, 286 | "line2": { 287 | "interval": 100, 288 | "frames": [ 289 | "⠂", 290 | "-", 291 | "–", 292 | "—", 293 | "–", 294 | "-" 295 | ] 296 | }, 297 | "pipe": { 298 | "interval": 100, 299 | "frames": [ 300 | "┤", 301 | "┘", 302 | "┴", 303 | "└", 304 | "├", 305 | "┌", 306 | "┬", 307 | "┐" 308 | ] 309 | }, 310 | "simpleDots": { 311 | "interval": 400, 312 | "frames": [ 313 | ". ", 314 | ".. ", 315 | "...", 316 | " " 317 | ] 318 | }, 319 | "simpleDotsScrolling": { 320 | "interval": 200, 321 | "frames": [ 322 | ". ", 323 | ".. ", 324 | "...", 325 | " ..", 326 | " .", 327 | " " 328 | ] 329 | }, 330 | "star": { 331 | "interval": 70, 332 | "frames": [ 333 | "✶", 334 | "✸", 335 | "✹", 336 | "✺", 337 | "✹", 338 | "✷" 339 | ] 340 | }, 341 | "star2": { 342 | "interval": 80, 343 | "frames": [ 344 | "+", 345 | "x", 346 | "*" 347 | ] 348 | }, 349 | "flip": { 350 | "interval": 70, 351 | "frames": [ 352 | "_", 353 | "_", 354 | "_", 355 | "-", 356 | "`", 357 | "`", 358 | "'", 359 | "´", 360 | "-", 361 | "_", 362 | "_", 363 | "_" 364 | ] 365 | }, 366 | "hamburger": { 367 | "interval": 100, 368 | "frames": [ 369 | "☱", 370 | "☲", 371 | "☴" 372 | ] 373 | }, 374 | "growVertical": { 375 | "interval": 120, 376 | "frames": [ 377 | "▁", 378 | "▃", 379 | "▄", 380 | "▅", 381 | "▆", 382 | "▇", 383 | "▆", 384 | "▅", 385 | "▄", 386 | "▃" 387 | ] 388 | }, 389 | "growHorizontal": { 390 | "interval": 120, 391 | "frames": [ 392 | "▏", 393 | "▎", 394 | "▍", 395 | "▌", 396 | "▋", 397 | "▊", 398 | "▉", 399 | "▊", 400 | "▋", 401 | "▌", 402 | "▍", 403 | "▎" 404 | ] 405 | }, 406 | "balloon": { 407 | "interval": 140, 408 | "frames": [ 409 | " ", 410 | ".", 411 | "o", 412 | "O", 413 | "@", 414 | "*", 415 | " " 416 | ] 417 | }, 418 | "balloon2": { 419 | "interval": 120, 420 | "frames": [ 421 | ".", 422 | "o", 423 | "O", 424 | "°", 425 | "O", 426 | "o", 427 | "." 428 | ] 429 | }, 430 | "noise": { 431 | "interval": 100, 432 | "frames": [ 433 | "▓", 434 | "▒", 435 | "░" 436 | ] 437 | }, 438 | "bounce": { 439 | "interval": 120, 440 | "frames": [ 441 | "⠁", 442 | "⠂", 443 | "⠄", 444 | "⠂" 445 | ] 446 | }, 447 | "boxBounce": { 448 | "interval": 120, 449 | "frames": [ 450 | "▖", 451 | "▘", 452 | "▝", 453 | "▗" 454 | ] 455 | }, 456 | "boxBounce2": { 457 | "interval": 100, 458 | "frames": [ 459 | "▌", 460 | "▀", 461 | "▐", 462 | "▄" 463 | ] 464 | }, 465 | "triangle": { 466 | "interval": 50, 467 | "frames": [ 468 | "◢", 469 | "◣", 470 | "◤", 471 | "◥" 472 | ] 473 | }, 474 | "arc": { 475 | "interval": 100, 476 | "frames": [ 477 | "◜", 478 | "◠", 479 | "◝", 480 | "◞", 481 | "◡", 482 | "◟" 483 | ] 484 | }, 485 | "circle": { 486 | "interval": 120, 487 | "frames": [ 488 | "◡", 489 | "⊙", 490 | "◠" 491 | ] 492 | }, 493 | "squareCorners": { 494 | "interval": 180, 495 | "frames": [ 496 | "◰", 497 | "◳", 498 | "◲", 499 | "◱" 500 | ] 501 | }, 502 | "circleQuarters": { 503 | "interval": 120, 504 | "frames": [ 505 | "◴", 506 | "◷", 507 | "◶", 508 | "◵" 509 | ] 510 | }, 511 | "circleHalves": { 512 | "interval": 50, 513 | "frames": [ 514 | "◐", 515 | "◓", 516 | "◑", 517 | "◒" 518 | ] 519 | }, 520 | "squish": { 521 | "interval": 100, 522 | "frames": [ 523 | "╫", 524 | "╪" 525 | ] 526 | }, 527 | "toggle": { 528 | "interval": 250, 529 | "frames": [ 530 | "⊶", 531 | "⊷" 532 | ] 533 | }, 534 | "toggle2": { 535 | "interval": 80, 536 | "frames": [ 537 | "▫", 538 | "▪" 539 | ] 540 | }, 541 | "toggle3": { 542 | "interval": 120, 543 | "frames": [ 544 | "□", 545 | "■" 546 | ] 547 | }, 548 | "toggle4": { 549 | "interval": 100, 550 | "frames": [ 551 | "■", 552 | "□", 553 | "▪", 554 | "▫" 555 | ] 556 | }, 557 | "toggle5": { 558 | "interval": 100, 559 | "frames": [ 560 | "▮", 561 | "▯" 562 | ] 563 | }, 564 | "toggle6": { 565 | "interval": 300, 566 | "frames": [ 567 | "ဝ", 568 | "၀" 569 | ] 570 | }, 571 | "toggle7": { 572 | "interval": 80, 573 | "frames": [ 574 | "⦾", 575 | "⦿" 576 | ] 577 | }, 578 | "toggle8": { 579 | "interval": 100, 580 | "frames": [ 581 | "◍", 582 | "◌" 583 | ] 584 | }, 585 | "toggle9": { 586 | "interval": 100, 587 | "frames": [ 588 | "◉", 589 | "◎" 590 | ] 591 | }, 592 | "toggle10": { 593 | "interval": 100, 594 | "frames": [ 595 | "㊂", 596 | "㊀", 597 | "㊁" 598 | ] 599 | }, 600 | "toggle11": { 601 | "interval": 50, 602 | "frames": [ 603 | "⧇", 604 | "⧆" 605 | ] 606 | }, 607 | "toggle12": { 608 | "interval": 120, 609 | "frames": [ 610 | "☗", 611 | "☖" 612 | ] 613 | }, 614 | "toggle13": { 615 | "interval": 80, 616 | "frames": [ 617 | "=", 618 | "*", 619 | "-" 620 | ] 621 | }, 622 | "arrow": { 623 | "interval": 100, 624 | "frames": [ 625 | "←", 626 | "↖", 627 | "↑", 628 | "↗", 629 | "→", 630 | "↘", 631 | "↓", 632 | "↙" 633 | ] 634 | }, 635 | "arrow2": { 636 | "interval": 80, 637 | "frames": [ 638 | "⬆️ ", 639 | "↗️ ", 640 | "➡️ ", 641 | "↘️ ", 642 | "⬇️ ", 643 | "↙️ ", 644 | "⬅️ ", 645 | "↖️ " 646 | ] 647 | }, 648 | "arrow3": { 649 | "interval": 120, 650 | "frames": [ 651 | "▹▹▹▹▹", 652 | "▸▹▹▹▹", 653 | "▹▸▹▹▹", 654 | "▹▹▸▹▹", 655 | "▹▹▹▸▹", 656 | "▹▹▹▹▸" 657 | ] 658 | }, 659 | "arrow4": { 660 | "interval": 80, 661 | "frames": [ 662 | "[> ]", 663 | "[>>> ]", 664 | "[>>>>> ]", 665 | "[>>>>>>> ]", 666 | "[>>>>>>>>> ]", 667 | "[>>>>>>>>>>> ]", 668 | "[>>>>>>>>>>>>>]" 669 | ] 670 | }, 671 | "bouncingBar": { 672 | "interval": 80, 673 | "frames": [ 674 | "[ ]", 675 | "[= ]", 676 | "[== ]", 677 | "[=== ]", 678 | "[ ===]", 679 | "[ ==]", 680 | "[ =]", 681 | "[ ]", 682 | "[ =]", 683 | "[ ==]", 684 | "[ ===]", 685 | "[====]", 686 | "[=== ]", 687 | "[== ]", 688 | "[= ]" 689 | ] 690 | }, 691 | "bouncingBall": { 692 | "interval": 80, 693 | "frames": [ 694 | "( ● )", 695 | "( ● )", 696 | "( ● )", 697 | "( ● )", 698 | "( ●)", 699 | "( ● )", 700 | "( ● )", 701 | "( ● )", 702 | "( ● )", 703 | "(● )" 704 | ] 705 | }, 706 | "smiley": { 707 | "interval": 200, 708 | "frames": [ 709 | "😄 ", 710 | "😝 " 711 | ] 712 | }, 713 | "monkey": { 714 | "interval": 300, 715 | "frames": [ 716 | "🙈 ", 717 | "🙈 ", 718 | "🙉 ", 719 | "🙊 " 720 | ] 721 | }, 722 | "hearts": { 723 | "interval": 100, 724 | "frames": [ 725 | "💛 ", 726 | "💙 ", 727 | "💜 ", 728 | "💚 ", 729 | "❤️ " 730 | ] 731 | }, 732 | "clock": { 733 | "interval": 100, 734 | "frames": [ 735 | "🕛 ", 736 | "🕐 ", 737 | "🕑 ", 738 | "🕒 ", 739 | "🕓 ", 740 | "🕔 ", 741 | "🕕 ", 742 | "🕖 ", 743 | "🕗 ", 744 | "🕘 ", 745 | "🕙 ", 746 | "🕚 " 747 | ] 748 | }, 749 | "earth": { 750 | "interval": 180, 751 | "frames": [ 752 | "🌍 ", 753 | "🌎 ", 754 | "🌏 " 755 | ] 756 | }, 757 | "moon": { 758 | "interval": 80, 759 | "frames": [ 760 | "🌑 ", 761 | "🌒 ", 762 | "🌓 ", 763 | "🌔 ", 764 | "🌕 ", 765 | "🌖 ", 766 | "🌗 ", 767 | "🌘 " 768 | ] 769 | }, 770 | "runner": { 771 | "interval": 140, 772 | "frames": [ 773 | "🚶 ", 774 | "🏃 " 775 | ] 776 | }, 777 | "pong": { 778 | "interval": 80, 779 | "frames": [ 780 | "▐⠂ ▌", 781 | "▐⠈ ▌", 782 | "▐ ⠂ ▌", 783 | "▐ ⠠ ▌", 784 | "▐ ⡀ ▌", 785 | "▐ ⠠ ▌", 786 | "▐ ⠂ ▌", 787 | "▐ ⠈ ▌", 788 | "▐ ⠂ ▌", 789 | "▐ ⠠ ▌", 790 | "▐ ⡀ ▌", 791 | "▐ ⠠ ▌", 792 | "▐ ⠂ ▌", 793 | "▐ ⠈ ▌", 794 | "▐ ⠂▌", 795 | "▐ ⠠▌", 796 | "▐ ⡀▌", 797 | "▐ ⠠ ▌", 798 | "▐ ⠂ ▌", 799 | "▐ ⠈ ▌", 800 | "▐ ⠂ ▌", 801 | "▐ ⠠ ▌", 802 | "▐ ⡀ ▌", 803 | "▐ ⠠ ▌", 804 | "▐ ⠂ ▌", 805 | "▐ ⠈ ▌", 806 | "▐ ⠂ ▌", 807 | "▐ ⠠ ▌", 808 | "▐ ⡀ ▌", 809 | "▐⠠ ▌" 810 | ] 811 | }, 812 | "shark": { 813 | "interval": 120, 814 | "frames": [ 815 | "▐|\\____________▌", 816 | "▐_|\\___________▌", 817 | "▐__|\\__________▌", 818 | "▐___|\\_________▌", 819 | "▐____|\\________▌", 820 | "▐_____|\\_______▌", 821 | "▐______|\\______▌", 822 | "▐_______|\\_____▌", 823 | "▐________|\\____▌", 824 | "▐_________|\\___▌", 825 | "▐__________|\\__▌", 826 | "▐___________|\\_▌", 827 | "▐____________|\\▌", 828 | "▐____________/|▌", 829 | "▐___________/|_▌", 830 | "▐__________/|__▌", 831 | "▐_________/|___▌", 832 | "▐________/|____▌", 833 | "▐_______/|_____▌", 834 | "▐______/|______▌", 835 | "▐_____/|_______▌", 836 | "▐____/|________▌", 837 | "▐___/|_________▌", 838 | "▐__/|__________▌", 839 | "▐_/|___________▌", 840 | "▐/|____________▌" 841 | ] 842 | }, 843 | "dqpb": { 844 | "interval": 100, 845 | "frames": [ 846 | "d", 847 | "q", 848 | "p", 849 | "b" 850 | ] 851 | }, 852 | "weather": { 853 | "interval": 100, 854 | "frames": [ 855 | "☀️ ", 856 | "☀️ ", 857 | "☀️ ", 858 | "🌤 ", 859 | "⛅️ ", 860 | "🌥 ", 861 | "☁️ ", 862 | "🌧 ", 863 | "🌨 ", 864 | "🌧 ", 865 | "🌨 ", 866 | "🌧 ", 867 | "🌨 ", 868 | "⛈ ", 869 | "🌨 ", 870 | "🌧 ", 871 | "🌨 ", 872 | "☁️ ", 873 | "🌥 ", 874 | "⛅️ ", 875 | "🌤 ", 876 | "☀️ ", 877 | "☀️ " 878 | ] 879 | }, 880 | "christmas": { 881 | "interval": 400, 882 | "frames": [ 883 | "🌲", 884 | "🎄" 885 | ] 886 | }, 887 | "grenade": { 888 | "interval": 80, 889 | "frames": [ 890 | "، ", 891 | "′ ", 892 | " ´ ", 893 | " ‾ ", 894 | " ⸌", 895 | " ⸊", 896 | " |", 897 | " ⁎", 898 | " ⁕", 899 | " ෴ ", 900 | " ⁓", 901 | " ", 902 | " ", 903 | " " 904 | ] 905 | }, 906 | "point": { 907 | "interval": 125, 908 | "frames": [ 909 | "∙∙∙", 910 | "●∙∙", 911 | "∙●∙", 912 | "∙∙●", 913 | "∙∙∙" 914 | ] 915 | }, 916 | "layer": { 917 | "interval": 150, 918 | "frames": [ 919 | "-", 920 | "=", 921 | "≡" 922 | ] 923 | }, 924 | "betaWave": { 925 | "interval": 80, 926 | "frames": [ 927 | "ρββββββ", 928 | "βρβββββ", 929 | "ββρββββ", 930 | "βββρβββ", 931 | "ββββρββ", 932 | "βββββρβ", 933 | "ββββββρ" 934 | ] 935 | } 936 | } 937 | module.exports = style; --------------------------------------------------------------------------------