/// import * as path from 'path'; import * as webpack from 'webpack'; import * as minimist from 'minimist'; import * as HtmlWebpackPlugin from 'html-webpack-plugin'; import * as FaviconsWebpackPlugin from 'favicons-webpack-plugin'; import * as ExtractTextPlugin from 'extract-text-webpack-plugin'; // sanitize default args to an empty object if (typeof defaultArgs === 'undefined') { defaultArgs = {}; } // tslint:disable-next-line:no-var-requires const npmPackage = require('./package.json'); const defaults = Object.assign( {}, { 'env.buildPath': path.resolve(__dirname, 'build'), 'env.entryPath': path.resolve(__dirname, 'src', 'app.tsx'), 'env.templatePath': path.resolve(__dirname, 'src', 'index.ejs'), 'env.outputFilename': '[name]', 'env.templateOutputPath': 'index.html', 'env.port': 3000, 'env.templateInject': true, 'env.release': false, 'env.extractText': false, 'env.extractLocale': false, 'env.extractFont': false, 'env.extractImage': false, 'env.min': false, 'env.sourceMap': true, 'env.profile': false, }, defaultArgs, ); const options = { string: [ 'env.buildPath', 'env.entryPath', 'env.templatePath', 'env.outputFilename', 'env.outputTag', 'env.releasePath', 'env.templateOutputPath', ], number: [ 'env.port', ], boolean: [ 'env.templateInject', 'env.release', 'env.extractText', 'env.extractLocale', 'env.extractFont', 'env.extractImage', 'env.min', 'env.sourceMap', 'env.profile', ], default: defaults, }; export const args = minimist(process.argv, options); if (args.env.releasePath == null) { args.env.releasePath = args.env.release ? 'release' : 'debug'; } if (args.env.outputTag == null) { args.env.outputTag = args.env.min ? '.min' : ''; } // tslint:disable-next-line:no-console console.log(`webpack args: ${ JSON.stringify(args, null, 2) }`); export const commonConfig: Partial = { output: { path: path.resolve(args.env.buildPath, args.env.releasePath), filename: `${ args.env.outputFilename }${ args.env.outputTag }.js`, }, devtool: args.env.sourceMap ? 'source-map' : undefined, externals: { jquery: 'var null', }, plugins: [ new webpack.DefinePlugin({ DEBUG: !args.env.release, PRODUCTION: args.env.release, TEST: false, WEBPACK_DEV_SERVER: false, VERSION: JSON.stringify(npmPackage.version), }), new webpack.NamedModulesPlugin(), new FaviconsWebpackPlugin('./src/Assets/logo.png'), ], resolve: { extensions: [ '.ts', '.tsx', '.webpack.js', '.web.js', '.js' ], alias: { 'ix$': 'ix/Ix', 'moment$': 'moment/moment', 'rxjs$': 'rxjs/Rx', }, }, }; const rules: webpack.Rule[] = []; if (args.env.extractText) { const cssLoader = ExtractTextPlugin.extract( { fallback: 'style-loader', use: { loader: 'css-loader', options: { sourceMap: args.env.sourceMap, minimize: args.env.min, }, }, }, ); const lessLoader = ExtractTextPlugin.extract( { fallback: 'style-loader', use: [ { loader: 'css-loader', options: { sourceMap: args.env.sourceMap, minimize: args.env.min, }, }, { loader: 'less-loader', options: { sourceMap: args.env.sourceMap, }, }, ], }, ); rules.push( { test: /\.css$/, use: cssLoader }, { test: /\.less$/, use: lessLoader }, ); commonConfig.plugins.push( new ExtractTextPlugin(`${ args.env.outputFilename }${ args.env.outputTag }.css`), ); } else { rules.push( { test: /\.css$/, loaders: [ 'style-loader', 'css-loader' ] }, { test: /\.less$/, loaders: [ 'style-loader', 'css-loader', 'less-loader' ] }, ); } if (args.env.extractFont) { rules.push( { test: /\.(woff|woff2|ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'file-loader?name=fonts/[name].[ext]' }, ); } else { rules.push( { test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'url-loader?mimetype=application/font-woff' }, { test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'url-loader' }, ); } if (args.env.extractImage) { rules.push( { test: /\.(png|jpg|gif)$/, loader: 'file-loader?name=img/[name].[ext]' }, ); } else { rules.push( { test: /\.(png|jpg|gif)$/, loader: 'url-loader' }, ); } if (args.env.extractLocale) { rules.push( { test: /moment[\\/]locale/, loader: 'file-loader?name=locale/moment/[name].[ext]' }, ); } rules.push( { test: /\.tsx?$/, loader: 'awesome-typescript-loader' }, ); commonConfig.module = { rules, }; if (args.env.release) { const defines: any = commonConfig.plugins![0]; defines.definitions['process.env'] = { 'NODE_ENV': JSON.stringify('production'), }; } if (args.env.min) { commonConfig.plugins!.push( new webpack.optimize.UglifyJsPlugin({ comments: false, compress: { warnings: false, }, sourceMap: args.env.sourceMap, }), ); } if (args.env.templatePath) { commonConfig.plugins!.push( new HtmlWebpackPlugin({ title: 'webrx-react', chunksSortMode: 'dependency', template: args.env.templatePath, filename: args.env.templateOutputPath, hash: true, inject: args.env.templateInject, }), ); } if (args.env.profile) { // tslint:disable-next-line no-var-requires const { StatsWriterPlugin } = require('webpack-stats-plugin'); commonConfig.plugins!.push( new StatsWriterPlugin({ fields: null, stats: { chunkModules: true }, }), ); }