@yuanhua/cli
Version:
@yuanhua/cli
91 lines (84 loc) • 2.13 kB
JavaScript
const path = require('path');
const metadata = require('read-metadata');
const exists = require('fs').existsSync;
const getGitUser = require('./git-user');
const validateName = require('validate-npm-package-name');
/**
* Read prompts metadata.
*
* @param {String} dir
* @return {Object}
*/
module.exports = function options(name, dir) {
// 读取初始化文件数据
const opts = getMetadata(dir);
// 替换传入的值
setDefault(opts, 'name', name);
setValidateName(opts);
// 获取电脑全局git 信息
const author = getGitUser();
if (author) {
setDefault(opts, 'author', author);
}
return opts;
};
/**
* Gets the metadata from either a meta.json or meta.js file.
*
* @param {String} dir
* @return {Object}
*/
function getMetadata(dir) {
const json = path.join(dir, 'meta.json');
const js = path.join(dir, 'meta.js');
let opts = {};
if (exists(json)) {
opts = metadata.sync(json);
} else if (exists(js)) {
const req = require(path.resolve(js));
if (req !== Object(req)) {
throw new Error('meta.js needs to expose an object');
}
opts = req;
}
return opts;
}
/**
* Set the default value for a prompt question
*
* @param {Object} opts
* @param {String} key
* @param {String} val
*/
function setDefault(opts, key, val) {
if (opts.schema) {
opts.prompts = opts.schema;
delete opts.schema;
}
const prompts = opts.prompts || (opts.prompts = {});
if (!prompts[key] || typeof prompts[key] !== 'object') {
prompts[key] = {
type: 'string',
default: val,
};
} else {
prompts[key]['default'] = val;
}
}
/**
* 检验是否是合法npm包名
* @param {Object} opts
*/
function setValidateName(opts) {
const name = opts.prompts.name;
const customValidate = name.validate;
name.validate = name => {
const its = validateName(name);
if (!its.validForNewPackages) {
const errors = (its.errors || []).concat(its.warnings || []);
return 'Sorry, ' + errors.join(' and ') + '.';
}
if (typeof customValidate === 'function') return customValidate(name);
return true;
};
}