'use strict'; // 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. process.on('unhandledRejection', err => { throw err; }); process.env.NODE_ENV = 'development'; // Ensure environment variables are read. require('../config/env'); const path = require('path'); const fs = require('fs-extra'); const chalk = require('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 config = require('../config/webpack.config.flask'); const createDevServerConfig = require('../config/webpackDevServer.config'); const child_process = require('child_process'); 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); } const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); const printHostingInstructions = require('react-dev-utils/printHostingInstructions'); const FileSizeReporter = require('react-dev-utils/FileSizeReporter'); const measureFileSizesBeforeBuild = FileSizeReporter.measureFileSizesBeforeBuild; const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild; // Warn and crash if required files are missing if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { process.exit(1); } // First, read the current file sizes in build directory. // This lets us display how much they changed later. measureFileSizesBeforeBuild(paths.appBuild) .then(previousFileSizes => { // Remove all content but keep the directory so that // if you're in it, you don't end up in Trash fs.emptyDirSync(paths.appBuild); // Merge with the public folder copyPublicFolder(); // Start the webpack build return build(previousFileSizes); }) .then( ({ stats, previousFileSizes, warnings }) => { if (warnings.length) { console.log(chalk.yellow('Compiled with warnings.\n')); console.log(warnings.join('\n\n')); console.log( '\nSearch for the ' + chalk.underline(chalk.yellow('keywords')) + ' to learn more about each warning.' ); console.log( 'To ignore, add ' + chalk.cyan('// eslint-disable-next-line') + ' to the line before.\n' ); } else { console.log(chalk.green('Compiled successfully.\n')); } console.log('File sizes after gzip:\n'); printFileSizesAfterBuild(stats, previousFileSizes); console.log(); child_process.spawn('python',['walle-server.py'],{ stdio:'inherit' }); const appPackage = require(paths.appPackageJson); const publicUrl = paths.publicUrl; const publicPath = config.output.publicPath; const buildFolder = path.relative(process.cwd(), paths.appBuild); printHostingInstructions( appPackage, publicUrl, publicPath, buildFolder, useYarn ); }, err => { console.log(chalk.red('Failed to compile.\n')); console.log((err.message || err) + '\n'); process.exit(1); } ); // Create the production build and print the deployment instructions. function build(previousFileSizes) { console.log('Creating an optimized production build...'); let compiler = webpack(config); return new Promise((resolve, reject) => { // compiler.run((err, stats) => { compiler.watch({ // watch options: aggregateTimeout: 300, // wait so long for more changes poll: true // use polling instead of native watchers // pass a number to set the polling interval },(err, stats) => { if (err) { return reject(err); } const messages = formatWebpackMessages(stats.toJson({}, true)); if (messages.errors.length) { return reject(new Error(messages.errors.join('\n\n'))); } if (process.env.CI && messages.warnings.length) { console.log( chalk.yellow( '\nTreating warnings as errors because process.env.CI = true.\n' + 'Most CI servers set it automatically.\n' ) ); return reject(new Error(messages.warnings.join('\n\n'))); } return resolve({ stats, previousFileSizes, warnings: messages.warnings, }); }); }); } function copyPublicFolder() { fs.copySync(paths.appPublic, paths.appBuild, { dereference: true, filter: file => file !== paths.appHtml, }); } // Tools like Cloud9 rely on this. // function startWebPackDevServer(){ // const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000; // const HOST = process.env.HOST || '0.0.0.0'; // // // We attempt to use the default port but if it is busy, we offer the user to // // run on a different port. `detect()` Promise resolves to the next free port. // choosePort(HOST, DEFAULT_PORT) // .then(port => { // if (port == null) { // // We have not found a port. // return; // } // const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; // const appName = require(paths.appPackageJson).name; // const urls = prepareUrls(protocol, HOST, port); // // Create a webpack compiler that is configured with custom messages. // const compiler = createCompiler(webpack, config, appName, urls, useYarn); // // 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 sever. // const serverConfig = createDevServerConfig( // proxyConfig, // urls.lanUrlForConfig // ); // const devServer = new WebpackDevServer(compiler, serverConfig); // devServer.listen(port, HOST, err => { // if (err) { // return console.log(err); // } // if (isInteractive) { // clearConsole(); // } // child_process.exec('python',['walle-server.py'],{ // stdio:'inherit' // }); // }); // // openBrowser(urls.localUrlForBrowser); // }) // .catch(err => { // if (err && err.message) { // console.log(err.message); // } // process.exit(1); // }); // }