brain-vue-cli
Version:
A command line tool used to run projects
107 lines (98 loc) • 3.15 kB
text/typescript
import * as path from 'path';
import * as invariant from 'invariant';
const deepAssign = require('deep-assign');
import {PROJECT_USER_CONFIG_FILE, PROJECT_USER_CONFIG_IGNORE_FILE} from '../constants/constants';
import {requireBabelify} from '../utils/requireBabelify';
const defaultEConfig = require(path.resolve(__dirname, `../../${PROJECT_USER_CONFIG_FILE}`));
/**
* 可选配置列表, 优先级从低到高由左到右
*/
export const configFileList = [PROJECT_USER_CONFIG_FILE, PROJECT_USER_CONFIG_IGNORE_FILE];
interface ICommonsChunkPlugin{
name:string,
value:Array<string>
}
export default class EConfig{
public name:string;
public open:boolean;
public defaultPort:number;
public server: string;
public imageInLineSize: number;
public publicPath: string;
public projectType :string='js';
public chunkhash:boolean;//是否生成hash
public disableEslint:boolean=false
public devServer: {
noInfo: boolean,
proxy: Array<any>
};
public postcss: {
autoprefixer: {
browsers: string[]
}
};
public webpack: {
dllConfig: {
vendors: string[]
},
disableReactHotLoader: boolean,
commonsChunkPlugin:ICommonsChunkPlugin,
happypack:false
};
public babel: {
query: {
presets: string[],
cacheDirectory: boolean,
plugins: any[]
},
include:Array<string>
};
public htmlWebpackPlugin: {
title: string
};
public noParses: string[];
public apps: string[];
private static instance: EConfig;
public static getInstance(): EConfig {
if (!EConfig.instance) {
EConfig.instance = new EConfig();
}
return EConfig.instance;
}
private constructor() {
this.init();
}
private init() {
let finalConfig = this.getFinalConfig();
EConfig.validateConfig(finalConfig);
deepAssign(this, finalConfig);
}
private getFinalConfig(): EConfig {
const workingDir = process.cwd();
return configFileList.reduce((config, current) => {
const configPath = path.resolve(workingDir, current);
return this.getConfig(configPath, config);
}, defaultEConfig);
}
private getConfig(filePath: string, eConfig: EConfig): EConfig {
let config = eConfig;
try {
const tempConfig = requireBabelify(filePath);
config = typeof tempConfig === `function` ? tempConfig(eConfig) : tempConfig;
} catch (e) {
if (e.code === `MODULE_NOT_FOUND`) {
/**
* nullable, skip error
*/
}
else {
throw e;
}
}
return config as EConfig;
}
private static validateConfig(config: EConfig) {
invariant(config.name, `请在配置文件中输入项目名称, e.g. config.name = 'test'`);
invariant(config.apps.length, `请在至少配置一个app name作为项目入口点, e.g. config.apps = ['user']`);
}
}