UNPKG

roadhogx

Version:

Cli tool for serve and build react app, based on roadhog, support JSON pattern config, support more features

286 lines (242 loc) 10.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.node = exports.defaultDevtool = exports.spriteSvgLoader = exports.baseSvgLoader = undefined; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; exports.getBabelOptions = getBabelOptions; exports.getResolve = getResolve; exports.getFirstRules = getFirstRules; exports.getLastRules = getLastRules; exports.getCSSRules = getCSSRules; exports.getCommonPlugins = getCommonPlugins; var _webpack = require('webpack'); var _webpack2 = _interopRequireDefault(_webpack); var _autoprefixer = require('autoprefixer'); var _autoprefixer2 = _interopRequireDefault(_autoprefixer); var _fs = require('fs'); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _extractTextWebpackPlugin = require('extract-text-webpack-plugin'); var _extractTextWebpackPlugin2 = _interopRequireDefault(_extractTextWebpackPlugin); var _htmlWebpackPlugin = require('html-webpack-plugin'); var _htmlWebpackPlugin2 = _interopRequireDefault(_htmlWebpackPlugin); var _copyWebpackPlugin = require('copy-webpack-plugin'); var _copyWebpackPlugin2 = _interopRequireDefault(_copyWebpackPlugin); var _normalizeDefine = require('../utils/normalizeDefine'); var _normalizeDefine2 = _interopRequireDefault(_normalizeDefine); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /** * @Author: eason * @Date: 2017-06-28T10:28:21+08:00 * @Email: uniquecolesmith@gmail.com * @Last modified by: eason * @Last modified time: 2017-07-15T16:45:11+08:00 * @License: MIT * @Copyright: Eason(uniquecolesmith@gmail.com) */ function getBabelOptions(config) { return { babelrc: false, presets: [require.resolve('babel-preset-es2015'), require.resolve('babel-preset-react'), require.resolve('babel-preset-react-optimize'), require.resolve('babel-preset-stage-0')].concat(config.extraBabelPresets || []), plugins: [require.resolve('babel-plugin-add-module-exports'), require.resolve('babel-plugin-react-require'), require.resolve('babel-plugin-transform-decorators-legacy')].concat(config.extraBabelPlugins || []), cacheDirectory: true }; } var baseSvgLoader = exports.baseSvgLoader = { test: /\.svg$/, loader: 'file', options: { name: 'static/[name].[hash:8].[ext]' } }; var spriteSvgLoader = exports.spriteSvgLoader = { test: /\.(svg)$/i, loader: 'svg-sprite' }; var defaultDevtool = exports.defaultDevtool = '#cheap-module-eval-source-map'; function getResolve(config, paths) { return { resolve: { modules: [paths.ownNodeModules, paths.appNodeModules], extensions: [].concat(_toConsumableArray(config.extraResolveExtensions || []), ['.web.js', '.web.jsx', '.web.ts', '.web.tsx', '.js', '.json', '.jsx', '.ts', '.tsx']), alias: _extends({ '@': paths.appSrc, // eslint-disable-line components: _path2.default.join(paths.appSrc, 'components'), models: _path2.default.join(paths.appSrc, 'models'), routes: _path2.default.join(paths.appSrc, 'routes'), services: _path2.default.join(paths.appSrc, 'services'), assets: _path2.default.join(paths.appSrc, 'assets'), utils: _path2.default.join(paths.appSrc, 'utils') }, Object.entries(config.alias || {}).reduce(function (t, _ref) { var _ref2 = _slicedToArray(_ref, 2), name = _ref2[0], value = _ref2[1]; return Object.assign(t, _defineProperty({}, name, value)); }, {})) }, resolveLoader: { modules: [paths.ownNodeModules, paths.appNodeModules], moduleExtensions: ['-loader'] } }; } function getFirstRules(_ref3) { var paths = _ref3.paths, babelOptions = _ref3.babelOptions, config = _ref3.config; return [{ exclude: [/\.html$/, /\.(js|jsx)$/, /\.(css|less|scss|sass)$/, /\.json$/, /\.svg$/, /\.tsx?$/], loader: 'url', options: { limit: 10000, name: 'static/[name].[hash:8].[ext]' } }, { test: /\.(js|jsx)$/, include: config && config.include && Array.isArray(config.include) ? [paths.appSrc].concat(_toConsumableArray(config.include.map(function (t) { return paths.resolveApp(t); }))) : paths.appSrc, loader: 'babel', options: babelOptions }]; } function getLastRules(_ref4) { var paths = _ref4.paths, babelOptions = _ref4.babelOptions; return [ /* { test: /\.html$/, loader: 'file', options: { name: '[name].[ext]', }, }, */ { test: /\.tsx?$/, include: paths.appSrc, use: [{ loader: 'babel', options: babelOptions }, { loader: 'awesome-typescript', options: { transpileOnly: true } }] }]; } function getCSSRules(env, _ref5) { var paths = _ref5.paths, cssLoaders = _ref5.cssLoaders, theme = _ref5.theme, config = _ref5.config; var rules = [{ test: /\.css$/, include: config && config.include && Array.isArray(config.include) ? [paths.appSrc].concat(_toConsumableArray(config.include.map(function (t) { return paths.resolveApp(t); }))) : paths.appSrc, use: ['style'].concat(_toConsumableArray(cssLoaders.own)) }, { test: /\.less$/, include: paths.appSrc, use: ['style'].concat(_toConsumableArray(cssLoaders.own), [{ loader: 'less', options: { modifyVars: theme } }]) }, { test: /\.scss$/, include: paths.appSrc, use: ['style'].concat(_toConsumableArray(cssLoaders.own), [{ loader: 'sass' }]) }, { test: /\.css$/, include: paths.appNodeModules, use: ['style'].concat(_toConsumableArray(cssLoaders.nodeModules)) }, { test: /\.less$/, include: paths.appNodeModules, use: ['style'].concat(_toConsumableArray(cssLoaders.nodeModules), [{ loader: 'less', options: { modifyVars: theme } }]) }, { test: /\.scss$/, include: paths.appNodeModules, use: ['style'].concat(_toConsumableArray(cssLoaders.nodeModules), [{ loader: 'sass' }]) }]; if (env === 'production') { rules.forEach(function (rule) { rule.use = _extractTextWebpackPlugin2.default.extract({ fallback: 'style', use: rule.use.slice(1) }); }); } return rules; } var node = exports.node = { fs: 'empty', net: 'empty', tls: 'empty' }; function getCommonPlugins(_ref6) { var config = _ref6.config, paths = _ref6.paths, appBuild = _ref6.appBuild, NODE_ENV = _ref6.NODE_ENV; var ret = []; // ref: https://zhuanlan.zhihu.com/p/27980441 // ret.push(new webpack.optimize.ModuleConcatenationPlugin()); var defineObj = { 'process.env': { NODE_ENV: JSON.stringify(NODE_ENV) } }; if (config.define) { defineObj = _extends({}, defineObj, (0, _normalizeDefine2.default)(config.define)); } ret.push(new _webpack2.default.DefinePlugin(defineObj)); if ((0, _fs.existsSync)(paths.appPublic)) { ret.push(new _copyWebpackPlugin2.default([{ from: paths.appPublic, to: appBuild }])); } if (config.multipage) { ret.push(new _webpack2.default.optimize.CommonsChunkPlugin({ name: 'vendor' // filename: '[name].js', })); } ret.push(new _webpack2.default.LoaderOptionsPlugin({ options: { context: __dirname, postcss: [(0, _autoprefixer2.default)(config.autoprefixer || { browsers: ['>1%', 'last 4 versions', 'Firefox ESR', 'not ie < 9'] })].concat(_toConsumableArray(config.extraPostCSSPlugins ? config.extraPostCSSPlugins : [])) } })); if (config.provide) { ret.push(new _webpack2.default.ProvidePlugin(config.provide)); } var htmlPath = _path2.default.join(paths.appPublic, config.html || 'index.html'); if ((0, _fs.existsSync)(htmlPath)) { ret.push(new _htmlWebpackPlugin2.default({ template: htmlPath, inject: true })); } return ret; }