ae-biu
Version:
Born For AE, Born To Do
311 lines (250 loc) • 9.07 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _webpack = require('webpack');
var _webpack2 = _interopRequireDefault(_webpack);
var _htmlWebpackPlugin = require('html-webpack-plugin');
var _htmlWebpackPlugin2 = _interopRequireDefault(_htmlWebpackPlugin);
var _copyWebpackPlugin = require('copy-webpack-plugin');
var _copyWebpackPlugin2 = _interopRequireDefault(_copyWebpackPlugin);
var _extractTextWebpackPlugin = require('extract-text-webpack-plugin');
var _extractTextWebpackPlugin2 = _interopRequireDefault(_extractTextWebpackPlugin);
var _optimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
var _optimizeCssAssetsWebpackPlugin2 = _interopRequireDefault(_optimizeCssAssetsWebpackPlugin);
var _faviconsWebpackPlugin = require('favicons-webpack-plugin');
var _faviconsWebpackPlugin2 = _interopRequireDefault(_faviconsWebpackPlugin);
var _flat = require('flat');
var _flat2 = _interopRequireDefault(_flat);
var _crypto = require('crypto');
var _crypto2 = _interopRequireDefault(_crypto);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _logger = require('../utils/logger');
var _logger2 = _interopRequireDefault(_logger);
var _postcss = require('./postcss.config');
var _postcss2 = _interopRequireDefault(_postcss);
var _less = require('./less.config');
var _less2 = _interopRequireDefault(_less);
var _paths = require('../utils/paths');
var _package = require('../utils/package');
var _package2 = _interopRequireDefault(_package);
var _getPolyfills = require('../utils/get-polyfills');
var _getPolyfills2 = _interopRequireDefault(_getPolyfills);
var _readDirRecursive = require('../utils/read-dir-recursive');
var _webpack3 = require('./webpack.common');
var _webpack4 = _interopRequireDefault(_webpack3);
var _constants = require('../utils/constants');
var _useCdn = require('../utils/use-cdn');
var _useCdn2 = _interopRequireDefault(_useCdn);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _pkg$ae = _package2.default.ae,
ae = _pkg$ae === undefined ? {} : _pkg$ae;
var _ae$languages = ae.languages,
LANGS = _ae$languages === undefined ? _constants.DEFAULT_LANG_MAP : _ae$languages,
_ae$output = ae.output,
dist = _ae$output === undefined ? 'dist' : _ae$output,
ORG_NAME = ae.org,
_ae$addHashForI18N = ae.addHashForI18N,
addHashForI18N = _ae$addHashForI18N === undefined ? false : _ae$addHashForI18N;
var distDir = _path2.default.resolve(_paths.workDir, dist);
var staticDir = _path2.default.resolve(_paths.srcDir, 'static');
var modulesDir = _path2.default.resolve(_paths.srcDir, 'modules');
var modulesI18NTransformer = function modulesI18NTransformer(content) {
return (0, _stringify2.default)((0, _flat2.default)(JSON.parse(content)));
};
var copyPluginPatterns = [{
from: staticDir,
ignore: 'locale/**/*.json' }, {
context: staticDir,
from: 'locale/**/*.json',
to: addHashForI18N ? '[path][name].[hash].[ext]' : ''
}, {
context: modulesDir,
from: '**/*.json',
to: addHashForI18N ? 'locale/[path][name].[hash].[ext]' : 'locale',
transform: modulesI18NTransformer
}];
console.log();
var i18nHashMap = {};
if (addHashForI18N) {
_logger2.default.info('Create hash for i18n files\n');
var staticI18nFiles = (0, _readDirRecursive.readDirRecursiveSync)(staticDir, '*.json');
var moduleI18nFiles = (0, _readDirRecursive.readDirRecursiveSync)(modulesDir, '*.json');
var files = [].concat((0, _toConsumableArray3.default)(staticI18nFiles), (0, _toConsumableArray3.default)(moduleI18nFiles));
files.map(function (file) {
var content = _fs2.default.readFileSync(file, { encoding: 'utf8' });
if (~moduleI18nFiles.indexOf(file)) {
content = modulesI18NTransformer(content);
}
var hash = _crypto2.default.createHash('md5');
var hashSum = hash.update(content).digest('hex');
var lang = _path2.default.basename(file, '.json');
var scope = _path2.default.dirname(file).replace('' + modulesDir, '').replace(staticDir + '/locale', '').replace('/', '');
var key = scope + '/' + lang;
i18nHashMap[key] = lang + '.' + hashSum;
});
}
_logger2.default.info('Create configuration for NODE_ENV: production\n');
var SDP_ENV = (process.env.SDP_ENV || 'test').trim();
_logger2.default.info('Project build for SDP_ENV: ' + SDP_ENV + '\n');
var polyfills = (0, _getPolyfills2.default)();
function getCSSLoader(lang, i18nLangs) {
var loaders = [{
loader: 'style-loader'
}, {
loader: 'css-loader',
options: {
importLoaders: 1
}
}, {
loader: 'postcss-loader',
options: (0, _postcss2.default)(i18nLangs)
}];
if (lang === 'less') {
loaders.push({
loader: 'less-loader',
options: _less2.default
});
}
return _extractTextWebpackPlugin2.default.extract({
fallback: loaders.shift().loader,
use: loaders
});
}
var webpackConfig = {
target: 'web',
entry: {
app: [].concat((0, _toConsumableArray3.default)(polyfills), [_path2.default.resolve(_paths.srcDir, 'index.js')])
},
output: {
path: distDir,
publicPath: '',
filename: '[name].[chunkhash].js',
chunkFilename: '[id].[chunkhash].js'
},
resolve: {
modules: [_paths.srcDir, 'node_modules'],
extensions: ['.js', '.jsx', '.ts', '.tsx', '.css', 'less'],
alias: (0, _extends3.default)({
'~': _paths.srcDir
}, _webpack4.default.alias)
},
node: {
fs: 'empty',
net: 'empty'
},
devtool: 'source-map',
performance: {
hints: 'warning'
},
module: {
rules: [{
test: /\.jsx?$/,
include: _paths.srcDir,
use: [{
loader: 'eslint-loader',
options: {
emitWarning: false,
formatter: require('eslint-friendly-formatter')
}
}],
enforce: 'pre'
}, {
test: /\.jsx?$/,
include: [_paths.srcDir, /\.sdp\.nd[/\\](?!node_modules)/, /[/\\]node_modules.*[/\\]((lodash-)?es)[/\\](?!node_modules)/],
use: 'babel-loader'
}, {
test: /\.tsx?$/,
include: [_paths.srcDir, /\.sdp\.nd[/\\](?!node_modules)/],
use: [{
loader: 'babel-loader'
}, {
loader: 'ts-loader',
options: {
transpileOnly: true
}
}]
}, {
test: /\.css$/,
use: getCSSLoader('css', LANGS)
}, {
test: /\.less$/,
use: getCSSLoader('less', LANGS)
}, {
test: /\.(png|jpg|gif|svg|woff2?|eot|ttf)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
limit: 8192,
name: '[name].[ext]?[hash:7]'
}
}]
}]
},
plugins: [].concat((0, _toConsumableArray3.default)(_webpack4.default.plugins), [new _webpack2.default.DefinePlugin({
'process.env.NODE_ENV': (0, _stringify2.default)('production'),
'process.env.SDP_ENV': (0, _stringify2.default)(SDP_ENV),
'process.env.LANGS': (0, _stringify2.default)(LANGS),
'process.env.I18N': (0, _stringify2.default)(i18nHashMap)
}), new _htmlWebpackPlugin2.default({
SDP_ENV: process.env.SDP_ENV,
ORG_NAME: ORG_NAME,
CDN: ae.cdn || {},
filename: 'index.html',
template: _paths.tplPath,
title: _package2.default.name + ' - ' + _package2.default.description,
hash: false,
inject: !(0, _useCdn2.default)(_package2.default.cdn, process.env.SDP_ENV),
minify: {
collapseWhitespace: false,
minifyJS: false
}
}), new _copyWebpackPlugin2.default(copyPluginPatterns, {
ignore: ['README.md']
}), new _faviconsWebpackPlugin2.default({
logo: _path2.default.resolve(_paths.srcDir, 'assets/favicon.svg'),
prefix: 'icons-[hash:7]/',
icons: {
android: false,
appleIcon: false,
appleStartup: false,
coast: false,
favicons: true,
firefox: false,
opengraph: false,
twitter: false,
yandex: false,
windows: true
}
}), new _webpack2.default.ContextReplacementPlugin(/moment[\\/]locale$/, /^\.\/(zh-cn|en-us)$/), new _webpack2.default.LoaderOptionsPlugin({
minimize: true,
options: {
context: _paths.workDir
}
}), new _webpack2.default.optimize.UglifyJsPlugin({
compress: {
unused: true,
dead_code: true,
warnings: false
},
sourceMap: true
}), new _optimizeCssAssetsWebpackPlugin2.default({
cssProcessorOptions: {
safe: true
}
}), new _extractTextWebpackPlugin2.default({
filename: '[name].[contenthash].css',
allChunks: true
})])
};
exports.default = webpackConfig;
module.exports = exports['default'];