218 lines
7.3 KiB
JavaScript
218 lines
7.3 KiB
JavaScript
'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.emptyDirSync(paths.appBuild);
|
|
// fs.ensureSymlink(paths.appPng,path.resolve(paths.appBuild,'png'));
|
|
// 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';
|
|
|
|
// // 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);
|
|
});
|
|
}
|