/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
*/
'use strict';
const MetroApi = require('../index');
const {watchFile, makeAsyncCommand} = require('../cli-utils');
const {loadConfig, resolveConfig} = require('metro-config');
const {promisify} = require('util');
import typeof Yargs from 'yargs';
module.exports = () => ({
command: 'serve',
description:
'Starts a Metro server on the given port, building bundles on the fly',
builder: (yargs: Yargs) => {
yargs.option('project-roots', {
alias: 'P',
type: 'string',
array: true,
});
yargs.option('host', {alias: 'h', type: 'string', default: 'localhost'});
yargs.option('port', {alias: 'p', type: 'number', default: 8080});
yargs.option('max-workers', {alias: 'j', type: 'number'});
yargs.option('secure', {type: 'boolean'});
yargs.option('secure-key', {type: 'string'});
yargs.option('secure-cert', {type: 'string'});
yargs.option('hmr-enabled', {alias: 'hmr', type: 'boolean'});
yargs.option('config', {alias: 'c', type: 'string'});
// Deprecated
// $FlowFixMe Errors found when flow-typing `yargs`
yargs.option('reset-cache', {type: 'boolean', describe: null});
},
// eslint-disable-next-line lint/no-unclear-flowtypes
handler: makeAsyncCommand(async (argv: any) => {
let server = null;
let restarting = false;
async function restart() {
if (restarting) {
return;
} else {
restarting = true;
}
if (server) {
// eslint-disable-next-line no-console
console.log('Configuration changed. Restarting the server...');
await promisify(server.close).call(server);
}
const config = await loadConfig(argv);
server = await MetroApi.runServer(config, argv);
restarting = false;
}
const foundConfig = await resolveConfig(argv.config, argv.cwd);
if (foundConfig) {
await watchFile(foundConfig.filepath, restart);
} else {
await restart();
}
}),
});