diff --git a/deploy/index.js b/deploy/index.js new file mode 100644 index 0000000..2d563e1 --- /dev/null +++ b/deploy/index.js @@ -0,0 +1,81 @@ +const { fileForEach } = require('@jiaminghi/fs') +const Client = require('ftp') +const print = require('./plugin/print') +const { emptyDir, put } = require('./plugin/ftp') +const getNodeParams = require('./plugin/nodeParams') + +let config = null + +try { + config = require('./config') +} catch (err) { + void 0 +} + +const DIST_PATH = './dist/' +const FTP_PATH = './datav/' + +const ftp = new Client() + +ftp.on('ready', async foo => { + print.tip('FTP connected!') + + const isEmpty = await emptyDir(ftp, FTP_PATH) + + if (!isEmpty) { + print.error('Exception in emptyDir!') + + return false + } + + let status = true + + await fileForEach(DIST_PATH, async src => { + const destPath = FTP_PATH + src.split('/').slice(-1)[0] + + print.tip('Upload: ' + destPath) + + if (!await put(ftp, src, destPath)) { + status = false + + print.error('Exception in upload ' + destPath) + } + }) + + if (status) { + print.yellow('-------------------------------------') + print.success(' Automatic Deployment Success! ') + print.yellow('-------------------------------------') + } + + ftp.destroy() +}) + +ftp.on('greeting', foo => { + print.tip('FTP greeting') +}) +ftp.on('close', foo => { + print.tip('FTP close') +}) +ftp.on('end', foo => { + print.tip('FTP end') +}) +ftp.on('error', foo => { + print.tip('FTP error') +}) + +const { host, user, pass } = config || getNodeParams() + +if (!host || !user || !pass) { + print.error('Upload Dist to FTP Missing Parameters!') + + return false +} + +print.tip('Start Upload!') + +ftp.connect({ + host, + user, + password: pass +}) diff --git a/deploy/plugin/ftp.js b/deploy/plugin/ftp.js new file mode 100644 index 0000000..97a63f0 --- /dev/null +++ b/deploy/plugin/ftp.js @@ -0,0 +1,99 @@ +async function getList (ftp, src) { + return new Promise(resolve => { + ftp.list(src, (err, list) => { + if (err) { + console.error(err) + + resolve(false) + } else { + resolve(list) + } + }) + }) +} + +async function rmDir (ftp, src, recusive = true) { + return new Promise(resolve => { + ftp.rmdir(src, recusive, err => { + if (err) { + console.error(err) + + resolve(false) + } else { + resolve(true) + } + }) + }) +} + +async function deleteFile (ftp, src) { + return new Promise(resolve => { + ftp.delete(src, err => { + if (err) { + console.error(err) + + resolve(false) + } else { + resolve(true) + } + }) + }) +} + +async function emptyDir (ftp, src, except = []) { + const list = await getList(ftp, src) + + for (let i = 0, listNum = list.length; i < listNum; i++) { + const { type, name } = list[i] + + if (type === 'd' && (name === '.' || name === '..')) continue + if (except.find(n => n === name)) continue + + const fullSrc = `${src}${name}` + + if (type === 'd') { + if (!await rmDir(ftp, fullSrc, true)) return false + } else { + if (!await deleteFile(ftp, fullSrc)) return false + } + } + + return true +} + +async function put (ftp, src, dest) { + return new Promise(resolve => { + ftp.put(src, dest, err => { + if (err) { + console.error(err) + + resolve(false) + } else { + resolve(true) + } + }) + }) +} + +async function mkDir (ftp, src, recusive = true) { + return new Promise(resolve => { + ftp.mkdir(src, recusive, err => { + if (err) { + console.error(err) + + resolve(false) + } else { + resolve(true) + } + }) + }) +} + +module.exports = { + put, + rmDir, + mkDir, + getList, + emptyDir, + deleteFile +} \ No newline at end of file diff --git a/deploy/plugin/nodeParams.js b/deploy/plugin/nodeParams.js new file mode 100644 index 0000000..15212a4 --- /dev/null +++ b/deploy/plugin/nodeParams.js @@ -0,0 +1,13 @@ +function getNodeParams () { + const params = {} + + process.argv.slice(2).forEach(param => { + param = param.split('=') + + params[param[0]] = param[1] + }) + + return params +} + +module.exports = getNodeParams \ No newline at end of file diff --git a/deploy/plugin/print.js b/deploy/plugin/print.js new file mode 100644 index 0000000..cdb9909 --- /dev/null +++ b/deploy/plugin/print.js @@ -0,0 +1,22 @@ +const print = { + log (info) { + console.log(info) + }, + warn (info) { + console.log('\033[31;33m' + info + '\033[0m') + }, + error (info) { + console.log('\033[31;40m' + info + '\033[0m') + }, + tip (info) { + console.log('\033[40;32m' + info + '\033[0m') + }, + success (info) { + console.log('\033[42;30m' + info + '\033[0m') + }, + yellow (info) { + console.log('\033[31;33m' + info + '\033[0m') + } +} + +module.exports = print