zoro-cli
Version:
https://github.com/vuejs/vue-cli
132 lines (104 loc) • 5.78 kB
JavaScript
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const {
getPkgsVersion
} = require('zoro-cli-util/pkg');
const dependenciesMap = require('./json/dependencies');
const devDependenciesMap = require('./json/devDependencies');
const scriptsMap = require('./json/scripts');
module.exports = async ({
api,
rootOptions,
Types,
pkg
}) => {
const {
type,
ui,
cssPreprocessor,
bundler
} = rootOptions;
const {
mobile,
pc,
weblib,
nodelib
} = Types;
const isWeb = type === mobile || type === pc; // TODO: https://github.com/yyx990803/yorkie
// browserslist
// pc 页面也有可能在 mobile 上打开, 所以 iOS/Android 是必选的
const browserslist = ['last 2 versions', 'Firefox ESR', '> 1%', 'iOS >= 8', 'Android >= 4'];
if (type === pc) {
browserslist.push('ie >= 8');
} // scripts
const scripts = _objectSpread({}, scriptsMap.common, {}, scriptsMap[type], {}, scriptsMap[type + '-' + ui], {}, scriptsMap[type + '-' + cssPreprocessor], {}, scriptsMap[type + '-' + bundler]); // dependencies
const dependencies = _objectSpread({}, dependenciesMap.base, {}, dependenciesMap[type], {}, dependenciesMap[cssPreprocessor]); // devDependencies
const devDependencies = _objectSpread({}, pkg.peerDependencies, {}, devDependenciesMap.base, {}, devDependenciesMap.prettier, {}, devDependenciesMap[type], {}, devDependenciesMap[cssPreprocessor]); // some common config
if (ui) {
// 如果是 weblib, ui 的依赖应该是 devDependencies
Object.assign(type === weblib ? devDependencies : dependencies, dependenciesMap[ui]);
Object.assign(devDependencies, devDependenciesMap[ui]);
}
if (isWeb) {
Object.assign(scripts, scriptsMap.web);
Object.assign(dependencies, dependenciesMap.web);
Object.assign(devDependencies, devDependenciesMap.web);
}
/**
* process dynamicDevDependenciesNames
*/
const dynamicDevDependenciesNames = ['eslint-config-zoro-node', 'stylelint-config-zoro', 'zoro-cli-util']; // ui maybe needed by different types of project, such as mobile or weblib
if (ui) {
dynamicDevDependenciesNames.push(`babel-preset-zoro-${ui}`, `eslint-config-zoro-${ui}`);
} else {
dynamicDevDependenciesNames.push('babel-preset-zoro-web');
dynamicDevDependenciesNames.push('eslint-config-zoro-web');
} // web need postcss & webpack
if (isWeb) {
Object.assign(devDependencies, devDependenciesMap.postcss, devDependenciesMap.webpack, devDependenciesMap['webpack-postcss'], devDependenciesMap['webpack-' + cssPreprocessor]);
}
if (type === weblib) {
Object.assign(devDependencies, devDependenciesMap[bundler]);
if (cssPreprocessor) {
Object.assign(devDependencies, devDependenciesMap.postcss, devDependenciesMap[bundler + '-' + cssPreprocessor]);
}
}
if (type === nodelib) {
dynamicDevDependenciesNames.push('babel-preset-zoro-node');
}
const dynamicDevDependencies = await getPkgsVersion(dynamicDevDependenciesNames);
Object.assign(devDependencies, dynamicDevDependencies); // remove devDependencies which are also dependencies
Object.keys(devDependencies).forEach(name => {
if (dependencies[name]) {
delete devDependencies[name];
}
});
api.removeDependencies(['zoro-kit', 'zoro-kit-vue', 'anyproxy']);
Object.keys(scripts).forEach(scriptName => {
scripts[scriptName] = scripts[scriptName].replace('entryName', pkg.name);
});
api.extendPackage({
husky: {
hooks: {
'pre-commit': 'lint-staged'
}
},
'lint-staged': {
'*.{js,jsx,ts,tsx,vue}': ['eslint --fix'],
'*.{css,vue}': ['stylelint --fix']
},
jest: {
collectCoverage: true,
setupFiles: ['<rootDir>/scripts/jest.setup.js'],
testMatch: ['**/__tests__/**/*.(spec|test).[jt]s?(x)'],
testPathIgnorePatterns: ['/node_modules/', '/lib/']
},
browserslist,
scripts,
dependencies,
devDependencies
});
api.setScriptsKeyOrder(['echo', 'clean', 'cleanCache', 'anyproxy', 'lintjs', 'formatjs', 'lintcss', 'formatcss', 'new', 'create', 'jest', 'vue', 'cp', 'css', 'postcss-each', 'postcss', 'less', 'sass', 'scss', 'stylus', 'babel', 'postbabel', 'type-check', 'types', 'rollup', 'webpack', 'bundle', 'dev', 'watch', 'start', 'see', 'test', 'prebuild', 'build', 'postinstall', 'prepublish', 'inspect', 'analyze', 'profile']);
api.setPkgKeyOrder(['name', 'description', 'libName', 'private', 'version', 'sideEffects', 'main', 'module', 'unpkg', 'jsdelivr', 'browser', 'files', 'types', 'config', 'installConfig', 'engines', 'browserslist', 'project', 'rollup', 'entry', 'author', 'keywords', 'license', 'repository', 'scripts', 'peerDependencies', 'dependencies', 'devDependencies']);
};