cuz
Version:
Front-end modular development kit.
127 lines (109 loc) • 3.54 kB
JavaScript
import nopt from 'nopt';
import fs from 'fs-extra';
import cheerio from 'cheerio';
import { DefinePlugin } from 'webpack';
const basedir = process.cwd();
const optlist = {
init: {
into: 'init a templete',
type: String,
},
dev: {
info: 'dev for debug.',
type: Boolean,
},
build: {
info: 'build for delopy.',
type: Boolean,
},
version: {
short: 'v',
info: 'display current version.',
type: Boolean,
},
help: {
short: 'h',
info: 'help info.',
type: Boolean,
},
};
const aliases = {};
const known = {};
Object.keys(optlist).forEach(function parse(key) {
const short = optlist[key].short;
if (short) {
aliases[short] = '--' + key;
}
known[key] = optlist[key].type;
});
export default function cli() {
const parsed = nopt(known, aliases, process.argv, 2);
let arg = parsed.argv.cooked;
if (arg.length === 0) {
arg = ['dev', '--dev'];
}
const option = arg[0] || 'dev';
let env = 'development';
if (option === 'build') {
env = 'production';
}
if (['-test', '--test', '-testing', '--testing'].indexOf(arg[1]) > -1) {
env = 'testing';
}
if (['-prd', '--prd', '-production', '--production'].indexOf(arg[1]) > -1) {
env = 'production';
}
if (option === '--version') {
const packageInfo = require('../../package.json');
const version = packageInfo.version;
console.log('cuz v' + version);
}
if (option === '--help') {
console.log('Not implemented.');
}
if (option === 'dev') {
require('./server')({env});
}
if (option === 'build') {
const config = require('./webpack.production.config.js');
config.plugins.push(new DefinePlugin({ 'process.env.NODE_ENV': `"${env}"` }));
const { name, version } = require(basedir + '/package.json');
let { publicPath } = require(basedir + '/src/config.js');
publicPath = publicPath || '';
publicPath = publicPath.replace('{name}', name).replace('{version}', version);
publicPath = publicPath[publicPath.length - 1] === '/' ? publicPath : publicPath + '/';
// 修改 index.html 以适配 cdn 环境
fs.readFile(basedir + '/src/index.html', 'utf8', function done(err, data) {
const $ = cheerio.load(data);
$(`\n <script src="${publicPath}cuz.js"></script>`).insertAfter('#root');
const html = $.html().replace(`<script src="index.js"></script>`, `<script src="${publicPath}index.js"></script>`);
fs.outputFile(basedir + '/build/index.html', html);
console.log(`copied 'index.html'.`);
});
// 临时处理静态资源文件 (这里应该使用 webpack 打包)
['img', 'imgs', 'image', 'images', 'vendor', 'vendors'].map((item) => {
fs.exists(`${basedir}/src/${item}`, (exists) => {
if (exists) {
fs.copy(`${basedir}/src/${item}/`, `${basedir}/build/${item}/`, function done() {
console.log(`copied static resources [${item}].`);
});
}
});
});
// 打包业务代码
console.log('bundle package.');
const webpack = require('webpack');
config.output.publicPath = publicPath;
console.log('public address:' + publicPath);
webpack(config).run((errMsg, info) => console.log(errMsg + info));
}
if (option === 'init') {
fs.copy(basedir + '/node_modules/cuz/templete/backend', basedir, function done(err) {
if (err) {
return console.log(err);
}
console.log('init backend templete complete.');
console.log('You can use `cuz` to start dev.');
});
}
}