fusion-cli/commands/dev.js (95 lines of code) (raw):
/** Copyright (c) 2018 Uber Technologies, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
/* eslint-env node */
const winston = require('winston');
const {Compiler} = require('../build/compiler');
const {DevelopmentRuntime} = require('../build/dev-runtime');
const {TestAppRuntime} = require('../build/test-runtime');
const {execSync: exec} = require('child_process');
exports.run = async function(
{
dir = '.',
test,
debug,
forceLegacyBuild = false,
port,
hmr,
open,
logLevel,
exitOnError,
} /*: any */
) {
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
),
});
logger.add(new winston.transports.Console({level: logLevel}));
const compiler = new Compiler({
env: 'development',
dir,
hmr,
forceLegacyBuild,
watch: true,
logger,
});
const devRuntime = new DevelopmentRuntime(
// $FlowFixMe
Object.assign(
{
dir,
port,
debug,
noOpen: !open,
},
hmr ? {middleware: compiler.getMiddleware()} : {}
)
);
const testRuntime = test
? new TestAppRuntime({dir, overrideNodeEnv: true})
: null;
// $FlowFixMe
await Promise.all([devRuntime.start(), compiler.clean(dir)]);
const runAll = async () => {
try {
await Promise.all([
devRuntime.run(),
// $FlowFixMe
testRuntime ? testRuntime.run() : Promise.resolve(),
]);
if (!open) {
logger.info(`Application is running on http://localhost:${port}`);
}
} catch (e) {} // eslint-disable-line
};
const watcher = await new Promise((resolve, reject) => {
const watcher = compiler.start((err, stats) => {
if (err || stats.hasErrors()) {
if (exitOnError) {
return reject(
new Error('Compilation error exiting due to exitOnError parameter.')
);
} else {
return resolve(watcher);
}
}
return runAll().then(() => resolve(watcher));
});
});
// Rerun for each recompile
compiler.on('done', () => {
if (debug) {
// make the default node debug port available for attaching by killing the
// old attached process
try {
exec("kill -9 $(lsof -n -i:9229 | grep node | awk '{print $2}')");
} catch (e) {} // eslint-disable-line
}
runAll();
});
compiler.on('invalid', () => devRuntime.invalidate());
function stop() {
watcher.close();
devRuntime.stop();
// $FlowFixMe
if (testRuntime) testRuntime.stop();
}
process.on('SIGTERM', () => {
stop();
});
return {
compiler,
stop,
};
};