| 'use strict' | 
| const utils = require('./utils') | 
| const webpack = require('webpack') | 
| const config = require('../config') | 
| const merge = require('webpack-merge') | 
| const path = require('path') | 
| const baseWebpackConfig = require('./webpack.base.conf') | 
| const CopyWebpackPlugin = require('copy-webpack-plugin') | 
| const HtmlWebpackPlugin = require('html-webpack-plugin') | 
| const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') | 
| const portfinder = require('portfinder') | 
|   | 
| const HOST = process.env.HOST | 
| const PORT = process.env.PORT && Number(process.env.PORT) | 
|   | 
| const devWebpackConfig = merge(baseWebpackConfig, { | 
|   module: { | 
|     rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) | 
|   }, | 
|   // cheap-module-eval-source-map is faster for development | 
|   devtool: config.dev.devtool, | 
|   | 
|   // these devServer options should be customized in /config/index.js | 
|   devServer: { | 
|     clientLogLevel: 'warning', | 
|     historyApiFallback: { | 
|       rewrites: [ | 
|         { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, | 
|       ], | 
|     }, | 
|     hot: true, | 
|     contentBase: false, // since we use CopyWebpackPlugin. | 
|     compress: true, | 
|     host: HOST || config.dev.host, | 
|     port: PORT || config.dev.port, | 
|     open: config.dev.autoOpenBrowser, | 
|     overlay: config.dev.errorOverlay | 
|       ? { warnings: false, errors: true } | 
|       : false, | 
|     publicPath: config.dev.assetsPublicPath, | 
|     proxy: config.dev.proxyTable, | 
|     quiet: true, // necessary for FriendlyErrorsPlugin | 
|     watchOptions: { | 
|       poll: config.dev.poll, | 
|     } | 
|   }, | 
|   plugins: [ | 
|     new webpack.DefinePlugin({ | 
|       'process.env': require('../config/dev.env') | 
|     }), | 
|     new webpack.HotModuleReplacementPlugin(), | 
|     new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. | 
|     new webpack.NoEmitOnErrorsPlugin(), | 
|     // https://github.com/ampedandwired/html-webpack-plugin | 
|     new HtmlWebpackPlugin({ | 
|       filename: 'index.html', | 
|       template: 'index.html', | 
|       inject: true | 
|     }), | 
|     // copy custom static assets | 
|     new CopyWebpackPlugin([ | 
|       { | 
|         from: path.resolve(__dirname, '../static'), | 
|         to: config.dev.assetsSubDirectory, | 
|         ignore: ['.*'] | 
|       } | 
|     ]) | 
|   ] | 
| }) | 
|   | 
| module.exports = new Promise((resolve, reject) => { | 
|   portfinder.basePort = process.env.PORT || config.dev.port | 
|   portfinder.getPort((err, port) => { | 
|     if (err) { | 
|       reject(err) | 
|     } else { | 
|       // publish the new Port, necessary for e2e tests | 
|       process.env.PORT = port | 
|       // add port to devServer config | 
|       devWebpackConfig.devServer.port = port | 
|   | 
|       // Add FriendlyErrorsPlugin | 
|       devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ | 
|         compilationSuccessInfo: { | 
|           messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], | 
|         }, | 
|         onErrors: config.dev.notifyOnErrors | 
|         ? utils.createNotifierCallback() | 
|         : undefined | 
|       })) | 
|   | 
|       resolve(devWebpackConfig) | 
|     } | 
|   }) | 
| }) |