@pgsz/pg-cli
Version:
pg-cli脚手架的自我学习
154 lines (136 loc) • 4.82 kB
JavaScript
const { hasYarn } = require('./utils/env')
// 是否是手动配置
const isManualMode = answers => answers.preset === '__manual__'
const {
defaults,
// 返回之前保存的配置项,保存在 C:\Users\pengguang\.pgrc
loadOptions,
} = require('./utils/options')
class Creator {
constructor() {
this.injectedPrompts = []
const { presetPrompt, featurePrompt } = this.getDefaultPrompts()
// 获取保存在 pgrc 中的配置
this.presetPrompt = presetPrompt
// 手动配置的选项
this.featurePrompt = featurePrompt
}
// 获取手动配置之后的询问选择,如手动配置 eslint 之后的询问 是airbnb还是standard
getFinalPrompts() {
this.injectedPrompts.forEach(prompt => {
const originalWhen = prompt.when || (() => true)
prompt.when = (answers) => isManualMode(answers) && originalWhen(answers)
})
const prompts = [
this.presetPrompt,
this.featurePrompt,
...this.injectedPrompts,
// 是否保存本次手动配置项和选择哪个包管理
...this.getOtherPrompts(),
]
return prompts
}
// 读取现有配置项返回配置好的选项
getPresets() {
// 读取现有的配置,即手动保存的
const savedOptions = loadOptions()
return { ...savedOptions.presets, ...defaults.presets }
}
// 读取配置: 是否需要手动配置,手动配置的内容
getDefaultPrompts() {
const presets = this.getPresets()
// "pgTest": {
// "features": [
// "babel",
// "router",
// "vuex",
// "linter"
// ],
// "historyMode": true,
// "eslintConfig": "airbnb",
// "lintOn": [
// "save"
// ]
// }
const presetChoices = Object.entries(presets).map(([name, preset]) => {
let displayName = name
return {
// pgTest (babel,router,vuex,linter)
name: `${displayName} (${preset.features})`,
value: name,
}
})
const presetPrompt = {
name: 'preset',
type: 'list',
message: `Please pick a preset:`,
choices: [
// 默认配置
...presetChoices,
// 手动模式提示语
{
name: 'Manually select features',
value: '__manual__',
},
],
}
const featurePrompt = {
name: 'features',
// 是否是手动配置
when: isManualMode,
type: 'checkbox',
message: 'Check the features needed for your project:',
choices: [],
pageSize: 10,
}
return {
presetPrompt,
featurePrompt,
}
}
// 是否保存手动配置,存在 yarn 和 npm 时,询问使用哪个包管理
getOtherPrompts() {
const otherPrompts = [
{
name: 'save',
// 手动配置时,才会出现提示
when: isManualMode,
type: 'confirm',
message: 'Save this as a preset for future projects?',
default: false,
},
{
name: 'saveName',
when: answers => answers.save,
// 输入保存配置的名称
type: 'input',
message: 'Save preset as:',
},
]
const savedOptions = loadOptions()
// 没有 packageManager 且 有 yarn 环境,则询问选择哪个包管理,第一次保存之后则会保存packageManager
if (!savedOptions.packageManager && hasYarn) {
const packageManagerChoices = []
if (hasYarn()) {
packageManagerChoices.push({
name: 'Use Yarn',
value: 'yarn',
short: 'Yarn',
})
}
packageManagerChoices.push({
name: 'Use NPM',
value: 'npm',
short: 'NPM',
})
otherPrompts.push({
name: 'packageManager',
type: 'list',
message: 'Pick the package manager to use when installing dependencies:',
choices: packageManagerChoices,
})
}
return otherPrompts
}
}
module.exports = Creator