wzt-plugin-shifting
Version:
A simple CLI for publish your projects.
95 lines (89 loc) • 3.19 kB
JavaScript
const is = require('is')
const fs = require('fs')
const path = require('path')
var async = require('async')
const inquirer = require('inquirer')
const logger = require('./index.js').logger
const mergeNoUndefined = require('./index.js').mergeNoUndefined
module.exports = function prompt(module, env, next) {
let isString = is.string,
isObject = is.object,
isArray = is.array,
isUndefined = is.undefined
let localLogger = (local, type) => (msg, end = false, cb = next) =>
logger[type](msg, local, end, cb)
let error = localLogger('prompt', 'error')
let warning = localLogger('prompt', 'warning')
let modules = this._metadata.modules
if (!this._metadata.usePrompt) return next(null, 'No use Prompt')
let p = this.promptPromise
? this.promptPromise
: (this.promptPromise = new Promise((resolve, reject) => {
async.series(
[promptParent.bind(this), promptModule.bind(this)],
resolve
)
}))
p
.then(err => {
next(err, 'prompt success')
})
.catch(next)
function promptParent(callback) {
let {
_prompts = [],
prompts: parentPrompt,
_promptSyncModule = [],
promptSyncModule = [],
promptIgnore
} = this._metadata
if (isString(promptIgnore)) promptIgnore = [promptIgnore]
if (isString(promptSyncModule)) promptSyncModule = [promptSyncModule]
let promptParentArr = _prompts.concat(parentPrompt || [])
let promptParentSyncModuleArr = _promptSyncModule.concat(promptSyncModule)
let promptParentFilterArr = isArray(promptIgnore)
? promptParentArr.filter(v => !promptIgnore.includes(v.name))
: promptParentArr
if (!promptParentFilterArr.length) return callback(null)
inquirer.prompt(promptParentFilterArr).then(answers => {
Object.assign(this._metadata, answers)
if (promptParentSyncModuleArr.length) {
promptParentSyncModuleArr.forEach(v => {
if (!isUndefined(answers[v])) {
for (i in modules) {
modules[i][v] = answers[v]
}
}
})
}
callback(null)
})
}
function promptModule(callback) {
async.eachSeries(
Object.keys(modules),
(env, done) => {
let sourcePrompt = modules[env].prompts
let sourcePromptIgnore = modules[env].promptIgnore
let promptModuleArr =
sourcePrompt && modules[env].hasOwnProperty('prompts')
? sourcePrompt
: []
let promptIgnore =
sourcePromptIgnore && modules[env].hasOwnProperty('promptIgnore')
? sourcePromptIgnore
: void 0
if (isString(promptIgnore)) promptIgnore = [promptIgnore]
let promptModuleFilterArr = isArray(promptIgnore)
? promptModuleArr.filter(v => !promptIgnore.includes(v.name))
: promptModuleArr
if (!promptModuleFilterArr.length) return done(null)
inquirer.prompt(promptModuleFilterArr).then(answers => {
Object.assign(modules[env], answers)
done()
})
},
callback
)
}
}