2020-03-11 01:01:05 +02:00
'use strict' ;
2023-02-16 12:55:24 +02:00
/* eslint-disable no-console */
2020-03-11 01:01:05 +02:00
// Do this as the first thing so that any code reading it knows the right env.
process . env . BABEL _ENV = 'development' ;
process . env . NODE _ENV = 'development' ;
// Makes the script crash on unhandled rejections instead of silently
// ignoring them. In the future, promise rejections that are not handled will
// terminate the Node.js process with a non-zero exit code.
// Ensure environment variables are read.
require ( '../config/env' ) ;
const fs = require ( 'fs' ) ;
const chalk = require ( 'react-dev-utils/chalk' ) ;
const webpack = require ( 'webpack' ) ;
const WebpackDevServer = require ( 'webpack-dev-server' ) ;
const clearConsole = require ( 'react-dev-utils/clearConsole' ) ;
const checkRequiredFiles = require ( 'react-dev-utils/checkRequiredFiles' ) ;
const {
choosePort ,
createCompiler ,
prepareProxy ,
prepareUrls ,
} = require ( 'react-dev-utils/WebpackDevServerUtils' ) ;
const openBrowser = require ( 'react-dev-utils/openBrowser' ) ;
const paths = require ( '../config/paths' ) ;
const configFactory = require ( '../config/webpack.config' ) ;
const createDevServerConfig = require ( '../config/webpackDevServer.config' ) ;
const useYarn = fs . existsSync ( paths . yarnLockFile ) ;
const isInteractive = process . stdout . isTTY ;
// Warn and crash if required files are missing
if ( ! checkRequiredFiles ( [ paths . appHtml , paths . appIndexJs ] ) ) {
process . exit ( 1 ) ;
}
// Tools like Cloud9 rely on this.
const DEFAULT _PORT = parseInt ( process . env . PORT , 10 ) || 3000 ;
const HOST = process . env . HOST || '0.0.0.0' ;
if ( process . env . HOST ) {
console . log (
chalk . cyan (
` Attempting to bind to HOST environment variable: ${ chalk . yellow (
2023-08-22 12:58:53 +02:00
chalk . bold ( process . env . HOST ) ,
) } ` ,
) ,
2020-03-11 01:01:05 +02:00
) ;
console . log (
2023-08-22 12:58:53 +02:00
'If this was unintentional, check that you haven\'t mistakenly set it in your shell.' ,
2020-03-11 01:01:05 +02:00
) ;
console . log (
2023-08-22 12:58:53 +02:00
` Learn more here: ${ chalk . yellow ( 'https://bit.ly/CRA-advanced-config' ) } ` ,
2020-03-11 01:01:05 +02:00
) ;
console . log ( ) ;
}
// We require that you explicitly set browsers and do not fall back to
// browserslist defaults.
const { checkBrowsers } = require ( 'react-dev-utils/browsersHelper' ) ;
checkBrowsers ( paths . appPath , isInteractive )
. then ( ( ) => {
// We attempt to use the default port but if it is busy, we offer the user to
// run on a different port. `choosePort()` Promise resolves to the next free port.
return choosePort ( HOST , DEFAULT _PORT ) ;
} )
2020-05-21 10:14:33 +02:00
. then ( port => {
2022-07-23 09:31:32 +02:00
if ( ! port ) {
2020-03-11 01:01:05 +02:00
// We have not found a port.
return ;
}
const config = configFactory ( 'development' ) ;
const protocol = process . env . HTTPS === 'true' ? 'https' : 'http' ;
const appName = require ( paths . appPackageJson ) . name ;
const useTypeScript = fs . existsSync ( paths . appTsConfig ) ;
const tscCompileOnError = process . env . TSC _COMPILE _ON _ERROR === 'true' ;
const urls = prepareUrls ( protocol , HOST , port ) ;
const devSocket = {
2020-05-21 10:14:33 +02:00
warnings : warnings =>
2020-03-11 01:01:05 +02:00
devServer . sockWrite ( devServer . sockets , 'warnings' , warnings ) ,
2020-05-21 10:14:33 +02:00
errors : errors =>
2020-03-11 01:01:05 +02:00
devServer . sockWrite ( devServer . sockets , 'errors' , errors ) ,
} ;
// Create a webpack compiler that is configured with custom messages.
const compiler = createCompiler ( {
appName ,
config ,
devSocket ,
urls ,
useYarn ,
useTypeScript ,
tscCompileOnError ,
webpack ,
} ) ;
// Load proxy config
const proxySetting = require ( paths . appPackageJson ) . proxy ;
const proxyConfig = prepareProxy ( proxySetting , paths . appPublic ) ;
// Serve webpack assets generated by the compiler over a web server.
const serverConfig = createDevServerConfig (
proxyConfig ,
2023-08-22 12:58:53 +02:00
urls . lanUrlForConfig ,
2020-03-11 01:01:05 +02:00
) ;
const devServer = new WebpackDevServer ( compiler , serverConfig ) ;
// Launch WebpackDevServer.
2023-02-16 12:55:24 +02:00
devServer . listen ( port , HOST , error => {
if ( error ) {
return console . log ( error ) ;
2020-03-11 01:01:05 +02:00
}
if ( isInteractive ) {
clearConsole ( ) ;
}
// We used to support resolving modules according to `NODE_PATH`.
// This now has been deprecated in favor of jsconfig/tsconfig.json
// This lets you use absolute paths in imports inside large monorepos:
if ( process . env . NODE _PATH ) {
console . log (
chalk . yellow (
2023-08-22 12:58:53 +02:00
'Setting NODE_PATH to resolve modules absolutely has been deprecated in favor of setting baseUrl in jsconfig.json (or tsconfig.json if you are using TypeScript) and will be removed in a future major release of create-react-app.' ,
) ,
2020-03-11 01:01:05 +02:00
) ;
console . log ( ) ;
}
console . log ( chalk . cyan ( 'Starting the development server...\n' ) ) ;
openBrowser ( urls . localUrlForBrowser ) ;
} ) ;
2023-06-30 10:39:21 +02:00
// eslint-disable-next-line github/array-foreach -- Old code before rule was applied
2023-02-20 17:02:29 +02:00
[ 'SIGINT' , 'SIGTERM' ] . forEach ( ( sig ) => {
process . on ( sig , ( ) => {
2020-03-11 01:01:05 +02:00
devServer . close ( ) ;
process . exit ( ) ;
} ) ;
} ) ;
} )
2023-02-16 12:55:24 +02:00
. catch ( error => {
if ( error && error . message ) {
console . log ( error . message ) ;
2020-03-11 01:01:05 +02:00
}
process . exit ( 1 ) ;
} ) ;