2021-03-30 20:05:17 +00:00
"use strict" ;
2020-03-29 10:04:49 +00:00
// Do this as the first thing so that any code reading it knows the right env.
2021-03-30 20:05:17 +00:00
process . env . BABEL _ENV = "development" ;
process . env . NODE _ENV = "development" ;
2020-03-29 10:04:49 +00:00
2021-06-13 18:04:48 +00:00
// If we want BAPS, specify it as the first command line argument.
var args = process . argv . slice ( 2 ) ; // Remove node start.js
if ( args . length > 0 && args [ 0 ] === "baps" ) {
process . env . NODE _ENV = "baps" ;
}
2020-03-29 10:04:49 +00:00
// 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.
2021-03-30 20:05:17 +00:00
process . on ( "unhandledRejection" , ( err ) => {
2020-03-29 10:04:49 +00:00
throw err ;
} ) ;
// Ensure environment variables are read.
2021-03-30 20:05:17 +00:00
require ( "../config/env" ) ;
2020-03-29 10:04:49 +00:00
2021-03-30 20:05:17 +00:00
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" ) ;
2020-03-29 10:04:49 +00:00
const {
choosePort ,
createCompiler ,
prepareProxy ,
prepareUrls ,
2021-03-30 20:05:17 +00:00
} = 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" ) ;
2020-03-29 10:04:49 +00:00
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.
2021-05-27 23:04:08 +00:00
const DEFAULT _PORT = parseInt ( process . env . PORT , 10 ) || 3000 ;
2021-03-30 20:05:17 +00:00
const HOST = process . env . HOST || "0.0.0.0" ;
2020-03-29 10:04:49 +00:00
if ( process . env . HOST ) {
console . log (
chalk . cyan (
` Attempting to bind to HOST environment variable: ${ chalk . yellow (
chalk . bold ( process . env . HOST )
) } `
)
) ;
console . log (
` If this was unintentional, check that you haven't mistakenly set it in your shell. `
) ;
console . log (
2021-03-30 20:05:17 +00:00
` Learn more here: ${ chalk . yellow ( "https://bit.ly/CRA-advanced-config" ) } `
2020-03-29 10:04:49 +00:00
) ;
console . log ( ) ;
}
// We require that you explicitly set browsers and do not fall back to
// browserslist defaults.
2021-03-30 20:05:17 +00:00
const { checkBrowsers } = require ( "react-dev-utils/browsersHelper" ) ;
2020-03-29 10:04:49 +00:00
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 ) ;
} )
2021-03-30 20:05:17 +00:00
. then ( ( port ) => {
2020-03-29 10:04:49 +00:00
if ( port == null ) {
// We have not found a port.
return ;
}
2021-03-30 20:05:17 +00:00
const config = configFactory ( "development" ) ;
const protocol = process . env . HTTPS === "true" ? "https" : "http" ;
2020-03-29 10:04:49 +00:00
const appName = require ( paths . appPackageJson ) . name ;
const useTypeScript = fs . existsSync ( paths . appTsConfig ) ;
2021-03-30 20:05:17 +00:00
const tscCompileOnError = process . env . TSC _COMPILE _ON _ERROR === "true" ;
2020-03-29 10:04:49 +00:00
const urls = prepareUrls ( protocol , HOST , port ) ;
const devSocket = {
2021-03-30 20:05:17 +00:00
warnings : ( warnings ) =>
devServer . sockWrite ( devServer . sockets , "warnings" , warnings ) ,
errors : ( errors ) =>
devServer . sockWrite ( devServer . sockets , "errors" , errors ) ,
2020-03-29 10:04:49 +00:00
} ;
// 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 ,
urls . lanUrlForConfig
) ;
const devServer = new WebpackDevServer ( compiler , serverConfig ) ;
// Launch WebpackDevServer.
2021-03-30 20:05:17 +00:00
devServer . listen ( port , HOST , ( err ) => {
2020-03-29 10:04:49 +00:00
if ( err ) {
return console . log ( err ) ;
}
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 (
2021-03-30 20:05:17 +00: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-29 10:04:49 +00:00
)
) ;
console . log ( ) ;
}
2021-03-30 20:05:17 +00:00
console . log ( chalk . cyan ( "Starting the development server...\n" ) ) ;
2020-03-29 10:04:49 +00:00
openBrowser ( urls . localUrlForBrowser ) ;
} ) ;
2021-03-30 20:05:17 +00:00
[ "SIGINT" , "SIGTERM" ] . forEach ( function ( sig ) {
2020-03-29 10:04:49 +00:00
process . on ( sig , function ( ) {
devServer . close ( ) ;
process . exit ( ) ;
} ) ;
} ) ;
} )
2021-03-30 20:05:17 +00:00
. catch ( ( err ) => {
2020-03-29 10:04:49 +00:00
if ( err && err . message ) {
console . log ( err . message ) ;
}
process . exit ( 1 ) ;
} ) ;