cheminfo-tools
Version:
CLI tools to help cheminfo developers
162 lines (147 loc) • 4.26 kB
JavaScript
const path = require('path');
const fs = require('fs');
const program = require('commander');
const webpack = require('webpack');
const banner = require('../src/banner');
program
.option('-c, --cwd [dirname]', 'Working directory', process.cwd())
.option('-o, --out [dirname]', 'Output directory', 'dist')
.option('-n, --out-name [name]', 'Name of the output file')
.option('-r, --root [rootname]', 'Root name of the library')
.option('-e, --entry [file]', 'Library entry point')
.option('-u, --no-uglify', 'Disable generation of min file with source map')
.option('--no-source-map', 'Disable generation of source map only')
.option('-v, --verbose', 'Output warnings if any')
.option('-w, --watch', 'Watch changes');
program.parse(process.argv);
var cwd = path.resolve(program.cwd);
var pkg = tryPackage(cwd);
var entryPoint = program.entry || pkg.main || 'index.js';
var name = program.root || pkg.name;
if (!name) {
throw new Error('No name found');
} else if (name.indexOf('-') > 0) {
name = name.replace(/[.-](\w)?/g, function (_, x) {
return x ? x.toUpperCase() : '';
});
}
var filename = program.outName || pkg.name || 'bundle';
var webpackConfig = [
{
mode: 'production',
context: cwd,
entry: path.resolve(cwd, entryPoint),
module: {
rules: [
{
test: /\.js$/,
loader: require.resolve('babel-loader'),
options: {
presets: [
[
require.resolve('@babel/preset-env'),
{
targets: {
browsers: [
'last 10 chrome versions',
'last 2 edge versions',
'last 2 safari versions',
'last 2 firefox version'
]
}
}
]
]
}
}
]
},
output: {
path: path.resolve(cwd, program.out),
filename: `${filename}.js`,
library: name,
libraryTarget: 'umd',
globalObject: "typeof self !== 'undefined' ? self : this"
},
plugins: [
new webpack.BannerPlugin({
banner: banner.getMainBanner(pkg),
raw: true
})
],
optimization: {
minimize: false
},
devtool: program.sourceMap ? 'source-map' : false,
watch: program.watch
}
];
for (let i = 0; i < webpackConfig.length; i++) {
webpack(webpackConfig[i], function (err, stats) {
var jsonStats = stats.toJson();
if (err) {
throw err;
} else if (jsonStats.errors.length > 0) {
printErrors(jsonStats.errors);
if (!program.watch) {
// eslint-disable-next-line no-process-exit
process.exit(1);
}
} else {
console.log(`Build of ${webpackConfig[i].output.filename} successful`);
if (program.uglify) {
doMinify(webpackConfig[i]);
}
}
if (jsonStats.warnings.length > 0 && program.verbose) {
printErrors(jsonStats.warnings);
}
});
}
function doMinify(webpackConfig) {
webpackConfig.output.filename = webpackConfig.output.filename.replace(
/\.js$/,
'.min.js'
);
webpackConfig.plugins[0] = new webpack.BannerPlugin({
banner: banner.getMinBanner(pkg),
raw: true
});
const Terser = require('terser-webpack-plugin');
webpackConfig.optimization.minimize = true;
webpackConfig.optimization.minimizer = [
new Terser({
sourceMap: true
})
];
webpack(webpackConfig, function (err, stats) {
var jsonStats = stats.toJson();
if (err) {
throw err;
} else if (jsonStats.errors.length > 0) {
printErrors(jsonStats.errors);
// eslint-disable-next-line no-process-exit
process.exit(1);
} else {
console.log(`Build of ${webpackConfig.output.filename} successful`);
}
if (jsonStats.warnings.length > 0 && program.verbose) {
printErrors(jsonStats.warnings);
}
});
}
function tryPackage(cwd) {
var pkg = path.join(cwd, 'package.json');
try {
return JSON.parse(fs.readFileSync(pkg, 'utf8'));
} catch (e) {
return {};
}
}
function printErrors(errors) {
errors.forEach(function (error) {
console.error(error);
});
}
;