const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ForkCheckerPlugin = require('awesome-typescript-loader').ForkCheckerPlugin
+const AssetsPlugin = require('assets-webpack-plugin')
const WebpackNotifierPlugin = require('webpack-notifier')
/*
*
* See: http://webpack.github.io/docs/configuration.html#cli
*/
-module.exports = {
- /*
- * Static metadata for index.html
- *
- * See: (custom attribute)
- */
- metadata: METADATA,
-
- /*
- * Cache generated modules and chunks to improve performance for multiple incremental builds.
- * This is enabled by default in watch mode.
- * You can pass false to disable it.
- *
- * See: http://webpack.github.io/docs/configuration.html#cache
- */
- // cache: false,
-
- /*
- * The entry point for the bundle
- * Our Angular.js app
- *
- * See: http://webpack.github.io/docs/configuration.html#entry
- */
- entry: {
- 'polyfills': './src/polyfills.ts',
- 'vendor': './src/vendor.ts',
- 'main': './src/main.ts'
- },
-
- /*
- * Options affecting the resolving of modules.
- *
- * See: http://webpack.github.io/docs/configuration.html#resolve
- */
- resolve: {
+module.exports = function (options) {
+ var isProd = options.env === 'production'
+
+ return {
/*
- * An array of extensions that should be used to resolve modules.
+ * Static metadata for index.html
*
- * See: http://webpack.github.io/docs/configuration.html#resolve-extensions
+ * See: (custom attribute)
*/
- extensions: [ '', '.ts', '.js', '.scss' ],
-
- // Make sure root is src
- root: helpers.root('src'),
+ metadata: METADATA,
- // remove other default values
- modulesDirectories: [ 'node_modules' ]
- },
+ /*
+ * Cache generated modules and chunks to improve performance for multiple incremental builds.
+ * This is enabled by default in watch mode.
+ * You can pass false to disable it.
+ *
+ * See: http://webpack.github.io/docs/configuration.html#cache
+ */
+ // cache: false,
- output: {
- publicPath: '/client/'
- },
+ /*
+ * The entry point for the bundle
+ * Our Angular.js app
+ *
+ * See: http://webpack.github.io/docs/configuration.html#entry
+ */
+ entry: {
+ 'polyfills': './src/polyfills.ts',
+ 'vendor': './src/vendor.ts',
+ 'main': './src/main.ts'
+ },
- /*
- * Options affecting the normal modules.
- *
- * See: http://webpack.github.io/docs/configuration.html#module
- */
- module: {
/*
- * An array of applied pre and post loaders.
+ * Options affecting the resolving of modules.
*
- * See: http://webpack.github.io/docs/configuration.html#module-preloaders-module-postloaders
+ * See: http://webpack.github.io/docs/configuration.html#resolve
*/
- preLoaders: [
-
- {
- test: /\.ts$/,
- loader: 'string-replace-loader',
- query: {
- search: '(System|SystemJS)(.*[\\n\\r]\\s*\\.|\\.)import\\((.+)\\)',
- replace: '$1.import($3).then(mod => mod.__esModule ? mod.default : mod)',
- flags: 'g'
- },
- include: [helpers.root('src')]
- }
+ resolve: {
+ /*
+ * An array of extensions that should be used to resolve modules.
+ *
+ * See: http://webpack.github.io/docs/configuration.html#resolve-extensions
+ */
+ extensions: [ '', '.ts', '.js', '.scss' ],
- ],
+ // Make sure root is src
+ root: helpers.root('src'),
+
+ // remove other default values
+ modulesDirectories: [ 'node_modules' ]
+ },
+
+ output: {
+ publicPath: '/client/'
+ },
/*
- * An array of automatically applied loaders.
+ * Options affecting the normal modules.
*
- * IMPORTANT: The loaders here are resolved relative to the resource which they are applied to.
- * This means they are not resolved relative to the configuration file.
- *
- * See: http://webpack.github.io/docs/configuration.html#module-loaders
+ * See: http://webpack.github.io/docs/configuration.html#module
*/
- loaders: [
-
+ module: {
/*
- * Typescript loader support for .ts and Angular 2 async routes via .async.ts
+ * An array of applied pre and post loaders.
*
- * See: https://github.com/s-panferov/awesome-typescript-loader
+ * See: http://webpack.github.io/docs/configuration.html#module-preloaders-module-postloaders
*/
- {
- test: /\.ts$/,
- loaders: [
- 'awesome-typescript-loader',
- 'angular2-template-loader',
- '@angularclass/hmr-loader'
- ],
- exclude: [/\.(spec|e2e)\.ts$/]
- },
+ preLoaders: [
+ {
+ test: /\.ts$/,
+ loader: 'string-replace-loader',
+ query: {
+ search: '(System|SystemJS)(.*[\\n\\r]\\s*\\.|\\.)import\\((.+)\\)',
+ replace: '$1.import($3).then(mod => (mod.__esModule && mod.default) ? mod.default : mod)',
+ flags: 'g'
+ },
+ include: [helpers.root('src')]
+ }
+ ],
/*
- * Json loader support for *.json files.
+ * An array of automatically applied loaders.
*
- * See: https://github.com/webpack/json-loader
- */
- {
- test: /\.json$/,
- loader: 'json-loader'
- },
-
- {
- test: /\.scss$/,
- exclude: /node_modules/,
- loaders: [ 'raw-loader', 'sass-loader' ]
- },
-
- {
- test: /\.(woff2?|ttf|eot|svg)$/,
- loader: 'url?limit=10000&name=assets/fonts/[hash].[ext]'
- },
-
- /* Raw loader support for *.html
- * Returns file content as string
+ * IMPORTANT: The loaders here are resolved relative to the resource which they are applied to.
+ * This means they are not resolved relative to the configuration file.
*
- * See: https://github.com/webpack/raw-loader
+ * See: http://webpack.github.io/docs/configuration.html#module-loaders
*/
- {
- test: /\.html$/,
- loader: 'raw-loader',
- exclude: [ helpers.root('src/index.html') ]
- }
+ loaders: [
- ]
+ /*
+ * Typescript loader support for .ts and Angular 2 async routes via .async.ts
+ *
+ * See: https://github.com/s-panferov/awesome-typescript-loader
+ */
+ {
+ test: /\.ts$/,
+ loaders: [
+ '@angularclass/hmr-loader?pretty=' + !isProd + '&prod=' + isProd,
+ 'awesome-typescript-loader',
+ 'angular2-template-loader'
+ ],
+ exclude: [/\.(spec|e2e)\.ts$/]
+ },
- },
+ /*
+ * Json loader support for *.json files.
+ *
+ * See: https://github.com/webpack/json-loader
+ */
+ {
+ test: /\.json$/,
+ loader: 'json-loader'
+ },
- sassLoader: {
- precision: 10
- },
+ {
+ test: /\.scss$/,
+ exclude: /node_modules/,
+ loaders: [ 'raw-loader', 'sass-loader' ]
+ },
- /*
- * Add additional plugins to the compiler.
- *
- * See: http://webpack.github.io/docs/configuration.html#plugins
- */
- plugins: [
+ {
+ test: /\.(woff2?|ttf|eot|svg)$/,
+ loader: 'url?limit=10000&name=assets/fonts/[hash].[ext]'
+ },
- /*
- * Plugin: ForkCheckerPlugin
- * Description: Do type checking in a separate process, so webpack don't need to wait.
- *
- * See: https://github.com/s-panferov/awesome-typescript-loader#forkchecker-boolean-defaultfalse
- */
- new ForkCheckerPlugin(),
+ /* Raw loader support for *.html
+ * Returns file content as string
+ *
+ * See: https://github.com/webpack/raw-loader
+ */
+ {
+ test: /\.html$/,
+ loader: 'raw-loader',
+ exclude: [ helpers.root('src/index.html') ]
+ }
- /*
- * Plugin: CommonsChunkPlugin
- * Description: Shares common code between the pages.
- * It identifies common modules and put them into a commons chunk.
- *
- * See: https://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin
- * See: https://github.com/webpack/docs/wiki/optimization#multi-page-app
- */
- new webpack.optimize.CommonsChunkPlugin({
- name: [ 'polyfills', 'vendor' ].reverse()
- }),
+ ]
+
+ },
+
+ sassLoader: {
+ precision: 10
+ },
/*
- * Plugin: CopyWebpackPlugin
- * Description: Copy files and directories in webpack.
+ * Add additional plugins to the compiler.
*
- * Copies project static assets.
- *
- * See: https://www.npmjs.com/package/copy-webpack-plugin
+ * See: http://webpack.github.io/docs/configuration.html#plugins
*/
- new CopyWebpackPlugin([
- {
- from: 'src/assets',
- to: 'assets'
- },
- {
- from: 'node_modules/webtorrent/webtorrent.min.js',
- to: 'assets/webtorrent'
- }
- ]),
+ plugins: [
+ new AssetsPlugin({
+ path: helpers.root('dist'),
+ filename: 'webpack-assets.json',
+ prettyPrint: true
+ }),
+
+ /*
+ * Plugin: ForkCheckerPlugin
+ * Description: Do type checking in a separate process, so webpack don't need to wait.
+ *
+ * See: https://github.com/s-panferov/awesome-typescript-loader#forkchecker-boolean-defaultfalse
+ */
+ new ForkCheckerPlugin(),
+
+ /*
+ * Plugin: CommonsChunkPlugin
+ * Description: Shares common code between the pages.
+ * It identifies common modules and put them into a commons chunk.
+ *
+ * See: https://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin
+ * See: https://github.com/webpack/docs/wiki/optimization#multi-page-app
+ */
+ new webpack.optimize.CommonsChunkPlugin({
+ name: [ 'polyfills', 'vendor' ].reverse()
+ }),
+
+ /*
+ * Plugin: CopyWebpackPlugin
+ * Description: Copy files and directories in webpack.
+ *
+ * Copies project static assets.
+ *
+ * See: https://www.npmjs.com/package/copy-webpack-plugin
+ */
+ new CopyWebpackPlugin([
+ {
+ from: 'src/assets',
+ to: 'assets'
+ },
+ {
+ from: 'node_modules/webtorrent/webtorrent.min.js',
+ to: 'assets/webtorrent'
+ }
+ ]),
+
+ /*
+ * Plugin: HtmlWebpackPlugin
+ * Description: Simplifies creation of HTML files to serve your webpack bundles.
+ * This is especially useful for webpack bundles that include a hash in the filename
+ * which changes every compilation.
+ *
+ * See: https://github.com/ampedandwired/html-webpack-plugin
+ */
+ new HtmlWebpackPlugin({
+ template: 'src/index.html',
+ chunksSortMode: 'dependency'
+ }),
+
+ new WebpackNotifierPlugin({ alwaysNotify: true })
+ ],
/*
- * Plugin: HtmlWebpackPlugin
- * Description: Simplifies creation of HTML files to serve your webpack bundles.
- * This is especially useful for webpack bundles that include a hash in the filename
- * which changes every compilation.
+ * Include polyfills or mocks for various node stuff
+ * Description: Node configuration
*
- * See: https://github.com/ampedandwired/html-webpack-plugin
+ * See: https://webpack.github.io/docs/configuration.html#node
*/
- new HtmlWebpackPlugin({
- template: 'src/index.html',
- chunksSortMode: 'dependency'
- }),
-
- new WebpackNotifierPlugin({ alwaysNotify: true })
- ],
-
- /*
- * Include polyfills or mocks for various node stuff
- * Description: Node configuration
- *
- * See: https://webpack.github.io/docs/configuration.html#node
- */
- node: {
- global: 'window',
- crypto: 'empty',
- fs: 'empty',
- events: true,
- module: false,
- clearImmediate: false,
- setImmediate: false
+ node: {
+ global: 'window',
+ crypto: 'empty',
+ fs: 'empty',
+ events: true,
+ module: false,
+ clearImmediate: false,
+ setImmediate: false
+ }
}
-
}