'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.copySync // fs.emptyDirSync(paths.appBuild); // fs.ensureSymlink(paths.appPng,path.resolve(paths.appBuild,'png')); // // 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(); // startWebPackDevServer(()=>{ // 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); // } // ); startWebPackDevServer(()=>{ child_process.spawn('python',['walle_server.py'],{ stdio:'inherit' }); }); // 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 && file !== paths.appPng, }); } // Tools like Cloud9 rely on this. function startWebPackDevServer(pyServer){ const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000; const HOST = process.env.HOST || '0.0.0.0'; // fs.emptyDirSync(paths.appBuild); // fs.ensureSymlink(paths.appPng,path.resolve(paths.appBuild,'png')); // // Merge with the public folder // copyPublicFolder(); // 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(); const pyurls = prepareUrls(protocol, HOST, '5000'); pyServer(); // openBrowser(pyurls.localUrlForBrowser); openBrowser(urls.localUrlForBrowser); } }); }) .catch(err => { if (err && err.message) { console.log(err.message); } process.exit(1); }); }