meipian-qiniu
Version:
meipian qiniu upload files
109 lines (104 loc) • 3.31 kB
JavaScript
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])
}])
}
}