UNPKG

meipian-qiniu

Version:

meipian qiniu upload files

109 lines (104 loc) 3.31 kB
const path = require('path') const fs = require('fs') const chalk = require('chalk') const inquiry = require('./lib/inquiry') const strike = require('./lib/strike') const upload = require('./lib/upload') const refresh = require('./lib/refresh') const home = require('user-home') const keyDir = path.resolve(home, './.qiniu') const keyFile = path.resolve(home, './.qiniu/key.json') function readFiles(srcDir, rootDir, igore) { let files = [] let names = [] let loop = (function loop(src) { let dirs = fs.readdirSync(src) for (let temp in dirs) { let dir = path.join(src, dirs[temp]) let stat = fs.statSync(dir) if (stat.isFile() && (!(new RegExp((igore || '\\.\\*') + '$').test(dirs[temp])))) { files.push(dir = dir.replace(/\\/g, '\/')) names.push(dir.replace(new RegExp('^.*/' + rootDir + '/'), '/')) } else if (stat.isDirectory()) { loop(dir) } } }) loop(srcDir) return { files: files, names: names } } module.exports = function(options) { let args = arguments let lastParam = args[args.length - 1] let callback = lastParam && (typeof lastParam === 'function') ? lastParam : '' let clone = { bucket: options.bucket, src: options.src, fix: options.fix, igore: ( typeof options.igore === 'object' && Array === options.igore.constructor ) ? options.igore.join('|') : options.igore, urls: options.urls || [], rootDir: (options.rootDir.match(/([^\/\\]*)$/) || [])[1] || '/', cdnURL: options.cdnURL || '' } let bucket = clone.bucket let src = clone.src let fix = clone.fix let igore = clone.igore let answer = null let saveFile = (function() { if ((!fs.existsSync(keyFile)) && answer.save) { fs.existsSync(keyDir) ? '' : fs.mkdirSync(path.join(home, '.qiniu')) fs.createWriteStream(keyFile).write(JSON.stringify(answer)) } }) let uploadUrls = [] if (fs.existsSync(keyFile) && (answer = require(keyFile)) && answer.accessKey && answer.secretKey) { update.apply(answer = require(keyFile), [callback]) } else { inquiry(function(respAnswer) { update.apply(answer = respAnswer, [callback]) }) } function update(fn) { let infos = readFiles(src, clone.rootDir, igore) let tempFiles = infos.files.slice(0) let tempNames = infos.names.slice(0) if (!infos.files.length) { console.log(' ' + chalk.red(`${src} is no files to upload`)) return } strike.apply(answer, [bucket, fix, function() { (function inner() { upload.apply(answer, [clone.cdnURL, bucket, path.resolve(tempFiles[0]), fix + tempNames[0], function(url) { tempFiles.splice(0, 1) tempNames.splice(0, 1) uploadUrls.push(url) if ((!tempFiles.length)) { saveFile.call() if (clone.urls.length) { referUrl(fn) } else { fn && fn.apply(null, [answer, uploadUrls]) } } else { inner() } }]) })() }]) console.log(' ' + chalk.bgRed(` Upload number: ${infos.files.length} files `)) } function referUrl(fn) { refresh.apply(answer, [clone.urls, function() { fn && fn.apply(null, [answer, uploadUrls]) }]) } }