nwb
Version:
A toolkit for React, Preact & Inferno apps, React libraries and other npm modules for the web, with no configuration (until you need it)
174 lines (141 loc) • 4.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.build = build;
exports.createBuildConfig = createBuildConfig;
exports.createServeConfig = createServeConfig;
exports.getDefaultHTMLConfig = getDefaultHTMLConfig;
exports.serve = serve;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _runSeries = _interopRequireDefault(require("run-series"));
var _webpackMerge = _interopRequireDefault(require("webpack-merge"));
var _cleanApp = _interopRequireDefault(require("./commands/clean-app"));
var _constants = require("./constants");
var _utils = require("./utils");
var _webpackBuild = _interopRequireDefault(require("./webpackBuild"));
var _webpackServer = _interopRequireDefault(require("./webpackServer"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const DEFAULT_HTML_PATH = 'src/index.html';
/**
* Create a build, installing any required dependencies first if they're not
* resolvable.
*/
function build(args, appConfig, cb) {
let dist = args._[2] || 'dist';
let tasks = [cb => (0, _cleanApp.default)({
_: ['clean-app', dist]
}, cb), cb => (0, _webpackBuild.default)(`${appConfig.getName()} app`, args, () => createBuildConfig(args, appConfig.getBuildConfig()), cb)];
let buildDependencies = appConfig.getBuildDependencies();
if (buildDependencies.length > 0) {
tasks.unshift(cb => (0, _utils.install)(buildDependencies, {
check: true
}, cb));
}
(0, _runSeries.default)(tasks, cb);
}
/**
* Create default command config for building an app and merge any extra config
* provided into it.
*/
function createBuildConfig(args, extra = {}) {
let entry = _path.default.resolve(args._[1] || 'src/index.js');
let dist = _path.default.resolve(args._[2] || 'dist');
let production = process.env.NODE_ENV === 'production';
let filenamePattern = production ? '[name].[chunkhash:8].js' : '[name].js';
let config = {
babel: {
env: {
targets: _constants.DEFAULT_BROWSERS_PROD,
useBuiltIns: 'entry',
corejs: 3,
exclude: ['transform-typeof-symbol']
}
},
devtool: 'source-map',
entry: {
app: [entry]
},
output: {
filename: filenamePattern,
chunkFilename: filenamePattern,
path: dist,
publicPath: '/'
},
plugins: {
html: args.html !== false && getDefaultHTMLConfig(),
vendor: args.vendor !== false
}
};
if ((0, _utils.directoryExists)('public')) {
config.plugins.copy = [{
from: _path.default.resolve('public'),
to: dist,
globOptions: {
ignore: ['.gitkeep']
}
}];
}
return (0, _webpackMerge.default)(config, extra);
}
/**
* Create default command config for serving an app and merge any extra config
* objects provided into it.
*/
function createServeConfig(args, ...extra) {
let entry = _path.default.resolve(args._[1] || 'src/index.js');
let dist = _path.default.resolve(args._[2] || 'dist');
let config = {
babel: {
env: {
targets: _constants.DEFAULT_BROWSERS_DEV,
useBuiltIns: 'entry',
corejs: 3,
exclude: ['transform-typeof-symbol']
}
},
entry: [entry],
output: {
path: dist,
filename: 'app.js',
publicPath: '/'
},
plugins: {
html: getDefaultHTMLConfig()
}
};
if ((0, _utils.directoryExists)('public')) {
config.plugins.copy = [{
from: _path.default.resolve('public'),
to: dist,
globOptions: {
ignore: ['.gitkeep']
}
}];
}
return (0, _webpackMerge.default)(config, ...extra);
}
/**
* Create default config for html-webpack-plugin.
*/
function getDefaultHTMLConfig(cwd = process.cwd()) {
// Use the default HTML template path if it exists
if (_fs.default.existsSync(_path.default.join(cwd, DEFAULT_HTML_PATH))) {
return {
template: DEFAULT_HTML_PATH
};
} // Otherwise provide default variables for the internal template, in case we
// fall back to it.
return {
lang: 'en',
mountId: 'app',
title: require(_path.default.join(cwd, 'package.json')).name
};
}
/**
* Run a development server.
*/
function serve(args, appConfig, cb) {
(0, _webpackServer.default)(args, () => createServeConfig(args, appConfig.getServeConfig()), cb);
}