UNPKG

cogear

Version:

Cogear.JS – modern static websites generator (Node.JS/Webpack)

129 lines 4.45 kB
const chalk = require('chalk'); const merge = require('webpack-merge'); const fs = require('fs'); const prettyMs = require('pretty-ms'); const path = require('path'); const shell = require('shelljs'); module.exports = { apply(){ cogear.on('deploy.done',()=>{ performance.mark('deployEnd'); performance.measure('Deploy','deployStart','deployEnd'); const {duration} = performance.getEntriesByName('Deploy').shift(); cogear.loader.succeed(`Deployed in ${prettyMs(duration)}.`); }); cogear.on('deploy',async ()=>{ try { this.config = cogear.config.deploy || require(path.join(process.cwd(),'deploy')); } catch (e) { cogear.loader.fail(`No deploy config found.\nLearn more:\n${chalk.bold.whiteBright('https://cogearjs.org/docs/deploy')}`); process.exit(); } if(!fs.existsSync(path.join(cogear.options.output,'index.html'))){ cogear.loader.warn('Build is not found. Building…'); cogear.on('build.done',()=>{ this.deploy(); }); cogear.options.open = false; await cogear.emit('webpack',{mode:'production'}); cogear.options.open = false; cogear.on('webpack.afterEmit',async()=>{ await cogear.emit('build'); }); } else { this.deploy(); } }); }, deploy(){ performance.mark('deployStart'); cogear.loader.start('Searching for presets…'); let presets = Object.keys(this.config); cogear.loader.succeed(`Presets found: ${presets.map(preset => chalk.bold(preset)).join(', ')}`); let preset = presets.shift(); if(!cogear.options._[1]){ cogear.loader.info('No preset is chosen.'); cogear.loader.info(`Starting ${chalk.bold(preset)} preset by default…`); } else if(presets.includes(cogear.options._[1])){ preset = cogear.options._[1]; cogear.loader.info(`Preset ${chalk.bold(preset)} is chosen.`); // cogear.loader.start(`Starting deploying…\n`) } let defaults = { type: 'ftp', port: 21, user: 'deploy', password: null, commands: '-avz --delete --progress --quiet', // for rsync }; let options = merge(defaults,this.config[preset]); cogear.loader.start('Deploying…'); if(options.type == 'ftp'){ const _cliProgress = require('cli-progress'); const bar = new _cliProgress.Bar({ format: '[{bar}] {percentage}% | ETA: {eta}s | {value}/{total} | Uploading: {file}', stopOnComplete: true }, _cliProgress.Presets.shades_classic); cogear.loader.info('Start uploading files via FTP…'); let barStarted = false; const FtpDeploy = require('ftp-deploy'); const ftpDeploy = new FtpDeploy(); ftpDeploy.on('uploading', function(data) { if(!barStarted){ bar.start(data.totalFilesCount,data.transferredFileCount,{ file: data.filename }); barStarted = true; } }); ftpDeploy.on('uploaded', function(data) { bar.update(data.transferredFileCount,{ file: data.filename }); }); ftpDeploy.deploy({ user: options.user, password: options.password, host: options.host, port: options.port, localRoot: cogear.options.output, remoteRoot: options.path, deleteRemote: true, include: ['*','**/*'], exclude: [] }) .then(()=>{ cogear.emit('deploy.done'); }) .catch(err => { cogear.loader.fail('Deploy failed.'); console.error(err); }); } else if(options.type == 'sftp'){ const sftp = require('node-sftp-deploy'); sftp({ 'host': options.host, 'port': 22, 'user': options.user, 'pass': options.password, 'remotePath': options.path, 'sourcePath': cogear.options.output }, ()=>{ cogear.emit('deploy.done'); }); } else if(options.type == 'rsync') { if(!shell.which('rsync')){ cogear.loader.fail(`${chalk.bold('rsync')} is not installed.`); } shell.exec(`rsync ${options.commands} ${cogear.options.output}/ ${options.user}@${options.host}:/${options.path}`,(code,out,err)=>{ if(!err){ cogear.emit('deploy.done'); } else { cogear.loader.fail('Deploy failed.'); console.error(err); } }); } } };