| #!/usr/bin/env node | 
|   | 
| 'use strict'; | 
|   | 
| /* eslint-disable no-shadow, no-console */ | 
|   | 
| const fs = require('fs'); | 
| const net = require('net'); | 
| const debug = require('debug')('webpack-dev-server'); | 
| const importLocal = require('import-local'); | 
| const yargs = require('yargs'); | 
| const webpack = require('webpack'); | 
| const Server = require('../lib/Server'); | 
| const setupExitSignals = require('../lib/utils/setupExitSignals'); | 
| const colors = require('../lib/utils/colors'); | 
| const processOptions = require('../lib/utils/processOptions'); | 
| const createLogger = require('../lib/utils/createLogger'); | 
| const getVersions = require('../lib/utils/getVersions'); | 
| const options = require('./options'); | 
|   | 
| let server; | 
| const serverData = { | 
|   server: null, | 
| }; | 
| // we must pass an object that contains the server object as a property so that | 
| // we can update this server property later, and setupExitSignals will be able to | 
| // recognize that the server has been instantiated, because we will set | 
| // serverData.server to the new server object. | 
| setupExitSignals(serverData); | 
|   | 
| // Prefer the local installation of webpack-dev-server | 
| if (importLocal(__filename)) { | 
|   debug('Using local install of webpack-dev-server'); | 
|   | 
|   return; | 
| } | 
|   | 
| try { | 
|   require.resolve('webpack-cli'); | 
| } catch (err) { | 
|   console.error('The CLI moved into a separate package: webpack-cli'); | 
|   console.error( | 
|     "Please install 'webpack-cli' in addition to webpack itself to use the CLI" | 
|   ); | 
|   console.error('-> When using npm: npm i -D webpack-cli'); | 
|   console.error('-> When using yarn: yarn add -D webpack-cli'); | 
|   | 
|   process.exitCode = 1; | 
| } | 
|   | 
| yargs.usage( | 
|   `${getVersions()}\nUsage:  https://webpack.js.org/configuration/dev-server/` | 
| ); | 
|   | 
| // webpack-cli@3.3 path : 'webpack-cli/bin/config/config-yargs' | 
| let configYargsPath; | 
| try { | 
|   require.resolve('webpack-cli/bin/config/config-yargs'); | 
|   configYargsPath = 'webpack-cli/bin/config/config-yargs'; | 
| } catch (e) { | 
|   configYargsPath = 'webpack-cli/bin/config-yargs'; | 
| } | 
| // eslint-disable-next-line import/no-extraneous-dependencies | 
| // eslint-disable-next-line import/no-dynamic-require | 
| require(configYargsPath)(yargs); | 
|   | 
| // It is important that this is done after the webpack yargs config, | 
| // so it overrides webpack's version info. | 
| yargs.version(getVersions()); | 
| yargs.options(options); | 
|   | 
| const argv = yargs.argv; | 
|   | 
| // webpack-cli@3.3 path : 'webpack-cli/bin/utils/convert-argv' | 
| let convertArgvPath; | 
| try { | 
|   require.resolve('webpack-cli/bin/utils/convert-argv'); | 
|   convertArgvPath = 'webpack-cli/bin/utils/convert-argv'; | 
| } catch (e) { | 
|   convertArgvPath = 'webpack-cli/bin/convert-argv'; | 
| } | 
| // eslint-disable-next-line import/no-extraneous-dependencies | 
| // eslint-disable-next-line import/no-dynamic-require | 
| const config = require(convertArgvPath)(yargs, argv, { | 
|   outputFilename: '/bundle.js', | 
| }); | 
|   | 
| function startDevServer(config, options) { | 
|   const log = createLogger(options); | 
|   | 
|   let compiler; | 
|   | 
|   try { | 
|     compiler = webpack(config); | 
|   } catch (err) { | 
|     if (err instanceof webpack.WebpackOptionsValidationError) { | 
|       log.error(colors.error(options.stats.colors, err.message)); | 
|       // eslint-disable-next-line no-process-exit | 
|       process.exit(1); | 
|     } | 
|   | 
|     throw err; | 
|   } | 
|   | 
|   try { | 
|     server = new Server(compiler, options, log); | 
|     serverData.server = server; | 
|   } catch (err) { | 
|     if (err.name === 'ValidationError') { | 
|       log.error(colors.error(options.stats.colors, err.message)); | 
|       // eslint-disable-next-line no-process-exit | 
|       process.exit(1); | 
|     } | 
|   | 
|     throw err; | 
|   } | 
|   | 
|   if (options.socket) { | 
|     server.listeningApp.on('error', (e) => { | 
|       if (e.code === 'EADDRINUSE') { | 
|         const clientSocket = new net.Socket(); | 
|   | 
|         clientSocket.on('error', (err) => { | 
|           if (err.code === 'ECONNREFUSED') { | 
|             // No other server listening on this socket so it can be safely removed | 
|             fs.unlinkSync(options.socket); | 
|   | 
|             server.listen(options.socket, options.host, (error) => { | 
|               if (error) { | 
|                 throw error; | 
|               } | 
|             }); | 
|           } | 
|         }); | 
|   | 
|         clientSocket.connect({ path: options.socket }, () => { | 
|           throw new Error('This socket is already used'); | 
|         }); | 
|       } | 
|     }); | 
|   | 
|     server.listen(options.socket, options.host, (err) => { | 
|       if (err) { | 
|         throw err; | 
|       } | 
|   | 
|       // chmod 666 (rw rw rw) | 
|       const READ_WRITE = 438; | 
|   | 
|       fs.chmod(options.socket, READ_WRITE, (err) => { | 
|         if (err) { | 
|           throw err; | 
|         } | 
|       }); | 
|     }); | 
|   } else { | 
|     server.listen(options.port, options.host, (err) => { | 
|       if (err) { | 
|         throw err; | 
|       } | 
|     }); | 
|   } | 
| } | 
|   | 
| processOptions(config, argv, (config, options) => { | 
|   startDevServer(config, options); | 
| }); |