roadhog
Version:
Cli tool for serve and build react app, based on create-react-app, support JSON pattern config.
198 lines (156 loc) • 6.75 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function (config, cwd) {
var publicPath = '/';
var _config$library = config.library,
library = _config$library === undefined ? null : _config$library,
_config$libraryTarget = config.libraryTarget,
libraryTarget = _config$libraryTarget === undefined ? 'var' : _config$libraryTarget,
_config$devtool = config.devtool,
devtool = _config$devtool === undefined ? '#cheap-module-eval-source-map' : _config$devtool;
var cssLoaders = (0, _getCSSLoaders2.default)(config);
var theme = JSON.stringify((0, _getTheme2.default)(process.cwd(), config));
var paths = (0, _paths2.default)(cwd);
var output = {
path: paths.appBuild,
filename: '[name].js',
publicPath: publicPath,
libraryTarget: libraryTarget,
chunkFilename: '[id].async.js'
};
if (library) output.library = library;
var dllPlugins = config.dllPlugin ? [new _webpack2.default.DllReferencePlugin({
context: paths.appSrc,
manifest: require(paths.dllManifest) // eslint-disable-line
}), new _copyWebpackPlugin2.default([{
from: (0, _path.join)(paths.dllNodeModule, 'roadhog.dll.js'),
to: (0, _path.join)(paths.appBuild, 'roadhog.dll.js')
}])] : [];
var finalWebpackConfig = {
devtool: devtool,
entry: (0, _getEntry2.default)(config, paths.appDirectory),
output: output,
resolve: {
extensions: ['.web.js', '.web.jsx', '.web.ts', '.web.tsx', '.js', '.json', '.jsx', '.ts', '.tsx', '']
},
resolveLoader: {
root: [paths.ownNodeModules, paths.appNodeModules],
moduleTemplates: ['*-loader']
},
module: {
loaders: [{
exclude: [/\.html$/, /\.(js|jsx)$/, /\.(css|less)$/, /\.json$/, /\.svg$/, /\.tsx?$/],
loader: 'url',
query: {
limit: 10000,
name: 'static/[name].[hash:8].[ext]'
}
}, {
test: /\.(js|jsx)$/,
include: paths.appSrc,
loader: 'babel'
}, {
test: /\.css$/,
include: paths.appSrc,
loader: 'style!' + cssLoaders.own.join('!')
}, {
test: /\.less$/,
include: paths.appSrc,
loader: 'style!' + cssLoaders.own.join('!') + '!less?{"modifyVars":' + theme + '}'
}, {
test: /\.css$/,
include: paths.appNodeModules,
loader: 'style!' + cssLoaders.nodeModules.join('!')
}, {
test: /\.less$/,
include: paths.appNodeModules,
loader: 'style!' + cssLoaders.nodeModules.join('!') + '!less?{"modifyVars":' + theme + '}'
}, {
test: /\.html$/,
loader: 'file?name=[name].[ext]'
}, {
test: /\.json$/,
loader: 'json'
}, {
test: /\.tsx?$/,
include: paths.appSrc,
loader: 'babel!awesome-typescript'
}]
},
babel: {
babelrc: false,
presets: [require.resolve('babel-preset-es2015'), require.resolve('babel-preset-react'), require.resolve('babel-preset-stage-0')],
plugins: [require.resolve('babel-plugin-add-module-exports'), require.resolve('babel-plugin-react-require')].concat(config.extraBabelPlugins || []),
cacheDirectory: true
},
postcss: function postcss() {
return [(0, _autoprefixer2.default)(config.autoprefixer || {
browsers: ['>1%', 'last 4 versions', 'Firefox ESR', 'not ie < 9']
})].concat(config.extraPostCSSPlugins ? config.extraPostCSSPlugins : []);
},
plugins: [new _webpack2.default.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify(process.env.NODE_ENV)
}
}), new _webpack2.default.HotModuleReplacementPlugin(), new _caseSensitivePathsWebpackPlugin2.default(), new _WatchMissingNodeModulesPlugin2.default(paths.appNodeModules), new _systemBellWebpackPlugin2.default()].concat(dllPlugins).concat(!_fs2.default.existsSync(paths.appPublic) ? [] : new _copyWebpackPlugin2.default([{
from: paths.appPublic,
to: paths.appBuild
}])).concat(!config.multipage ? [] : new _webpack2.default.optimize.CommonsChunkPlugin('common', 'common.js')).concat(!config.define ? [] : new _webpack2.default.DefinePlugin((0, _normalizeDefine2.default)(config.define))),
externals: config.externals,
node: {
fs: 'empty',
net: 'empty',
tls: 'empty'
}
};
if (config.svgSpriteLoaderDirs) {
baseSvgLoader.exclude = config.svgSpriteLoaderDirs;
spriteSvgLoader.include = config.svgSpriteLoaderDirs;
finalWebpackConfig.module.loaders = finalWebpackConfig.module.loaders.concat([baseSvgLoader, spriteSvgLoader]);
} else {
finalWebpackConfig.module.loaders.push(baseSvgLoader);
}
return (0, _addExtraBabelIncludes2.default)(finalWebpackConfig, paths, config.extraBabelIncludes);
};
var _autoprefixer = require('autoprefixer');
var _autoprefixer2 = _interopRequireDefault(_autoprefixer);
var _caseSensitivePathsWebpackPlugin = require('case-sensitive-paths-webpack-plugin');
var _caseSensitivePathsWebpackPlugin2 = _interopRequireDefault(_caseSensitivePathsWebpackPlugin);
var _copyWebpackPlugin = require('copy-webpack-plugin');
var _copyWebpackPlugin2 = _interopRequireDefault(_copyWebpackPlugin);
var _webpack = require('webpack');
var _webpack2 = _interopRequireDefault(_webpack);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
var _WatchMissingNodeModulesPlugin2 = _interopRequireDefault(_WatchMissingNodeModulesPlugin);
var _systemBellWebpackPlugin = require('system-bell-webpack-plugin');
var _systemBellWebpackPlugin2 = _interopRequireDefault(_systemBellWebpackPlugin);
var _path = require('path');
var _paths = require('./paths');
var _paths2 = _interopRequireDefault(_paths);
var _getEntry = require('../utils/getEntry');
var _getEntry2 = _interopRequireDefault(_getEntry);
var _getTheme = require('../utils/getTheme');
var _getTheme2 = _interopRequireDefault(_getTheme);
var _getCSSLoaders = require('../utils/getCSSLoaders');
var _getCSSLoaders2 = _interopRequireDefault(_getCSSLoaders);
var _normalizeDefine = require('../utils/normalizeDefine');
var _normalizeDefine2 = _interopRequireDefault(_normalizeDefine);
var _addExtraBabelIncludes = require('../utils/addExtraBabelIncludes');
var _addExtraBabelIncludes2 = _interopRequireDefault(_addExtraBabelIncludes);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var baseSvgLoader = {
test: /\.svg$/,
loader: 'file',
query: {
name: 'static/[name].[hash:8].[ext]'
}
};
var spriteSvgLoader = {
test: /\.(svg)$/i,
loader: 'svg-sprite'
};
module.exports = exports['default'];