text: const helpers = require('./helpers');
  const path = require('path');
  const webpackMerge = require('webpack-merge'); // used to merge webpack configs
  const commonConfig = require('./webpack.common.js'); // the settings that are common to prod and dev
  
  /**
   * Webpack Plugins
   */
  const DefinePlugin = require('webpack/lib/DefinePlugin');
  const IgnorePlugin = require('webpack/lib/IgnorePlugin');
  const HashedModuleIdsPlugin = require('webpack/lib/HashedModuleIdsPlugin')
  const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin');
  const NormalModuleReplacementPlugin = require('webpack/lib/NormalModuleReplacementPlugin');
  const ProvidePlugin = require('webpack/lib/ProvidePlugin');
  const UglifyJsPlugin = require('webpack/lib/optimize/UglifyJsPlugin');
  const OptimizeJsPlugin = require('optimize-js-plugin');
  //const OfflinePlugin = require('offline-plugin');
  
  /**
   * Webpack Constants
   */
  const ENV = process.env.NODE_ENV = process.env.ENV = 'production';
  const HOST = process.env.HOST || 'localhost';
  const PORT = process.env.PORT || 7000;
  const WS_URL = process.env.WS_URL || 'localhost';
  const WS_PORT = process.env.WS_PORT || '8085';
  const API_URL = process.env.API_URL;
  const API_REST_URL = process.env.API_REST_URL;
  const APP_TITLE = process.env.APP_TITLE || 'Spectrum';
  const APP_NAME = process.env.APP_NAME || 'ADMIN';
  const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, {
    	host: HOST,
    	port: PORT,
    	ENV: ENV,
    	HMR: false,
    	WS_URL: WS_URL,
    	WS_PORT: WS_PORT,
    	API_URL: API_URL,
    	API_REST_URL: API_REST_URL,
    	APP_TITLE: APP_TITLE,
    	APP_NAME: APP_NAME,
  });
  
  module.exports = function(env) {
  	env = env || ENV;
    	return webpackMerge(commonConfig({env: env}), {
  
  
  		/**
  		 * Developer tool to enhance debugging
  		 *
  		 * See: http://webpack.github.io/docs/configuration.html#devtool
  		 * See: https://github.com/webpack/docs/wiki/build-performance#sourcemaps
  		 */
  		devtool: 'inline-source-map',
  
  		/**
  		 * Options affecting the output of the compilation.
  		 *
  		 * See: http://webpack.github.io/docs/configuration.html#output
  		 */
  		output: {
  
  		  	/**
  		   	* The output directory as absolute path (required).
  		   	*
  		   	* See: http://webpack.github.io/docs/configuration.html#output-path
  		   	*/
  		  	path: helpers.root('dist'),
  
  		  	/**
  		   	* Specifies the name of each output file on disk.
  		   	* IMPORTANT: You must not specify an absolute path here!
  		   	*
  		   	* See: http://webpack.github.io/docs/configuration.html#output-filename
  		   	*/
  		  	filename: '[name].[chunkhash].bundle.js',
  
  		  	/**
  		   	* The filename of the SourceMaps for the JavaScript files.
  		   	* They are inside the output.path directory.
  		   	*
  		   	* See: http://webpack.github.io/docs/configuration.html#output-sourcemapfilename
  		   	*/
  		  	sourceMapFilename: '[file].map',
  
  		  	/**
  		   	* The filename of non-entry chunks as relative path
  		   	* inside the output.path directory.
  		   	*
  		   	* See: http://webpack.github.io/docs/configuration.html#output-chunkfilename
  		   	*/
  		  	chunkFilename: '[name].[chunkhash].chunk.js'
  
  		},
  
  
  		/**
  		 * Add additional plugins to the compiler.
  		 *
  		 * See: http://webpack.github.io/docs/configuration.html#plugins
  		 */
  		plugins: [
  
    			/**
          	* Webpack plugin to optimize a JavaScript file for faster initial load
          	* by wrapping eagerly-invoked functions.
          	*
          	* See: https://github.com/vigneshshanmugam/optimize-js-plugin
          	*/
   
         		new OptimizeJsPlugin({
           		sourceMap: false
         		}),
  		  	/**
  		   	* Plugin: DefinePlugin
  		   	* Description: Define free variables.
  		   	* Useful for having development builds with debug logging or adding global constants.
  		   	*
  		   	* Environment helpers
  		   	*
  		   	* See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin
  		  	*/
  		  	// NOTE: when adding more properties make sure you include them in custom-typings.d.ts
  		  	new DefinePlugin({
  				'ENV': JSON.stringify(METADATA.ENV),
  				'HMR': METADATA.HMR,
  				'WS_URL': JSON.stringify(METADATA.WS_URL),
  				'WS_PORT': METADATA.WS_PORT,
  				'API_URL': JSON.stringify(METADATA.API_URL),
  				'API_REST_URL': JSON.stringify(METADATA.API_REST_URL),
  				'APP_TITLE': JSON.stringify(METADATA.APP_TITLE),
  				'APP_NAME': JSON.stringify(METADATA.APP_NAME),
  				'process.env': {
  			  		'ENV': JSON.stringify(METADATA.ENV),
  			  		'NODE_ENV': JSON.stringify(METADATA.ENV),
  			  		'HMR': METADATA.HMR,
  			  		'WS_URL': JSON.stringify(METADATA.WS_URL),
  			  		'WS_PORT': METADATA.WS_PORT,
  		  			'API_URL': JSON.stringify(METADATA.API_URL),
  		  			'API_REST_URL': JSON.stringify(METADATA.API_REST_URL),
  		  			'APP_TITLE': JSON.stringify(METADATA.APP_TITLE),
  		  			'APP_NAME': JSON.stringify(METADATA.APP_NAME),
  				}
  		  	}),
  
  		  	/**
  		   	* Plugin: UglifyJsPlugin
  		   	* Description: Minimize all JavaScript output of chunks.
  		   	* Loaders are switched into minimizing mode.
  		   	*
  		   	* See: https://webpack.github.io/docs/list-of-plugins.html#uglifyjsplugin
  		   	*/
  		  	// NOTE: To debug prod builds uncomment //debug lines and comment //prod lines
  		    new UglifyJsPlugin({
  		        // beautify: true, //debug
  		        // mangle: false, //debug
  		        // dead_code: false, //debug
  		        // unused: false, //debug
  		        // deadCode: false, //debug
  		        // compress: {
  		        //   screw_ie8: true,
  		        //   keep_fnames: true,
  		        //   drop_debugger: false,
  		        //   dead_code: false,
  		        //   unused: false
  		        // }, // debug
  		        // comments: true, //debug
  
  
  		        beautify: false, //prod
  				sourceMap: true,
  		        output: {
  		          	comments: false
  		        },
  		        mangle: {
  		          	screw_ie8: true
  		        }, //prod
  		        compress: {
  		          	screw_ie8: true,
  		          	warnings: false,
  		          	conditionals: true,
  		          	unused: true,
  		          	comparisons: true,
  		          	sequences: true,
  		          	dead_code: true,
  		          	evaluate: true,
  		          	if_return: true,
  		          	join_vars: true,
  		          	negate_iife: false // we need this for lazy v8
  		        },
  		    }),
  
  		  	/**
  		   	* Plugin: NormalModuleReplacementPlugin
  		   	* Description: Replace resources that matches resourceRegExp with newResource
  		   	*
  		   	* See: http://webpack.github.io/docs/list-of-plugins.html#normalmodulereplacementplugin
  		   	*/
  
  		  	new NormalModuleReplacementPlugin(
  				/angular2-hmr/,
          		helpers.root('config/empty.js')		  	
      		),
        		new NormalModuleReplacementPlugin(
          		/zone\.js(\\|\/)dist(\\|\/)long-stack-trace-zone/,
          		helpers.root('config/empty.js')
        		),
        		new HashedModuleIdsPlugin(),
  	      // AoT
  	      // new NormalModuleReplacementPlugin(
  	      //   /@angular(\\|\/)upgrade/,
  	      //   helpers.root('config/empty.js')
  	      // ),
  	      // new NormalModuleReplacementPlugin(
  	      //   /@angular(\\|\/)compiler/,
  	      //   helpers.root('config/empty.js')
  	      // ),
  	      // new NormalModuleReplacementPlugin(
  	      //   /@angular(\\|\/)platform-browser-dynamic/,
  	      //   helpers.root('config/empty.js')
  	      // ),
  	      // new NormalModuleReplacementPlugin(
  	      //   /dom(\\|\/)debug(\\|\/)ng_probe/,
  	      //   helpers.root('config/empty.js')
  	      // ),
  	      // new NormalModuleReplacementPlugin(
  	      //   /dom(\\|\/)debug(\\|\/)by/,
  	      //   helpers.root('config/empty.js')
  	      // ),
  	      // new NormalModuleReplacementPlugin(
  	      //   /src(\\|\/)debug(\\|\/)debug_node/,
  	      //   helpers.root('config/empty.js')
  	      // ),
  	      // new NormalModuleReplacementPlugin(
  	      //   /src(\\|\/)debug(\\|\/)debug_renderer/,
  	      //   helpers.root('config/empty.js')
  	      // ),
  		  	/**
  		   	* Plugin: IgnorePlugin
  		   	* Description: Don’t generate modules for requests matching the provided RegExp.
  		   	*
  		   	* See: http://webpack.github.io/docs/list-of-plugins.html#ignoreplugin
  		   	*/
  
  		  	// new IgnorePlugin(/angular2-hmr/),
  
  		  	/**
  		   	* Plugin: CompressionPlugin
  		   	* Description: Prepares compressed versions of assets to serve
  		   	* them with Content-Encoding
  		   	*
  		   	* See: https://github.com/webpack/compression-webpack-plugin
  		   	*/
  		  	//  install compression-webpack-plugin
  		  	// new CompressionPlugin({
  		  	//   regExp: /\.css$|\.html$|\.js$|\.map$/,
  		  	//   threshold: 2 * 1024
  		  	// })
  
        		/**
         		* Plugin LoaderOptionsPlugin (experimental)
         		*
         		* See: https://gist.github.com/sokra/27b24881210b56bbaff7
         		*/
        		new LoaderOptionsPlugin({
          		minimize: true,
          		debug: false,
          		options: {
  	          		context: __dirname,  
  	          		output: { path :  './' }, //This has to be './' and not your output folder.
  	          		sassLoader: {
  	            		includePaths: [path.resolve(__dirname, 'src', 'scss')]
  	          		},
   
  
            			/**
             			* Html loader advanced options
             			*
             			* See: https://github.com/webpack/html-loader#advanced-options
             			*/
            			// TODO: Need to workaround Angular 2's html syntax => #id [bind] (event) *ngFor
            			htmlLoader: {
              			minimize: true,
              			removeAttributeQuotes: false,
              			caseSensitive: true,
              			customAttrSurround: [
                				[/#/, /(?:)/],
                				[/\*/, /(?:)/],
                				[/\[?\(?/, /(?:)/]
              			],
              			customAttrAssign: [/\)?\]?=/]
            			},
  
          		}
        		}),
  
  
  
  			// it always better if OfflinePlugin is the last plugin added
  			// new OfflinePlugin({
  			// 	caches: 'all',
  			//   	updateStrategy: 'all',
  			// 	version: 'v2', 
  			// })
  
  		],
  
  		/**
  		* Disable performance hints
  		*
  		* See: https://github.com/a-tarasyuk/rr-boilerplate/blob/master/webpack/dev.config.babel.js#L41
  		*/
  		performance: {
  			hints: false
  		},
  
  
  		/*
  		 * Include polyfills or mocks for various node stuff
  		 * Description: Node configuration
  		 *
  		 * See: https://webpack.github.io/docs/configuration.html#node
  		 */
  		node: {
  		  	global: true,
  		  	crypto: 'empty',
  		  	process: false,
  		  	module: false,
  		  	clearImmediate: false,
  		  	setImmediate: false
  		}
  
    	});
  }
  