mirror of https://github.com/status-im/metro.git
Renames fetchMetroConfig into loadMetroConfig
Reviewed By: davidaurelio Differential Revision: D6834104 fbshipit-source-id: fc8e9300dd43b2212c067595063fc2f98dbc8e3b
This commit is contained in:
parent
c020e40894
commit
4c4eaeac8a
|
@ -12,19 +12,7 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const Config = require('./Config');
|
|
||||||
|
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
import type {ConfigT} from './Config';
|
|
||||||
|
|
||||||
const METRO_CONFIG_FILENAME = 'metro.config.js';
|
|
||||||
|
|
||||||
type MetroConfigSearchOptions = {|
|
|
||||||
cwd?: string,
|
|
||||||
basename?: string,
|
|
||||||
|};
|
|
||||||
|
|
||||||
exports.watchFile = async function(
|
exports.watchFile = async function(
|
||||||
filename: string,
|
filename: string,
|
||||||
|
@ -37,49 +25,6 @@ exports.watchFile = async function(
|
||||||
await callback();
|
await callback();
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.findMetroConfig = async function(
|
|
||||||
filename: ?string,
|
|
||||||
{
|
|
||||||
cwd = process.cwd(),
|
|
||||||
basename = METRO_CONFIG_FILENAME,
|
|
||||||
}: MetroConfigSearchOptions = {},
|
|
||||||
): Promise<?string> {
|
|
||||||
if (filename) {
|
|
||||||
return path.resolve(cwd, filename);
|
|
||||||
} else {
|
|
||||||
let previous;
|
|
||||||
let current = cwd;
|
|
||||||
|
|
||||||
do {
|
|
||||||
const filename = path.join(current, basename);
|
|
||||||
|
|
||||||
if (fs.existsSync(filename)) {
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
previous = current;
|
|
||||||
current = path.dirname(current);
|
|
||||||
} while (previous !== current);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.fetchMetroConfig = async function(
|
|
||||||
filename: ?string,
|
|
||||||
// $FlowFixMe: This is a known Flow issue where it doesn't detect that an empty object is a valid value for a strict shape where all the members are optionals
|
|
||||||
searchOptions: MetroConfigSearchOptions = {},
|
|
||||||
): Promise<ConfigT> {
|
|
||||||
const location = await exports.findMetroConfig(filename, searchOptions);
|
|
||||||
|
|
||||||
// $FlowFixMe: We want this require to be dynamic
|
|
||||||
const config = location ? require(location) : null;
|
|
||||||
|
|
||||||
// $FlowFixMe: For some reason, Flow doesn't recognize the return value as a promise
|
|
||||||
return config ? Config.normalize(config) : Config.DEFAULT;
|
|
||||||
};
|
|
||||||
|
|
||||||
// eslint-disable-next-line no-unclear-flowtypes
|
|
||||||
exports.makeAsyncCommand = (command: (argv: any) => Promise<*>) => (
|
exports.makeAsyncCommand = (command: (argv: any) => Promise<*>) => (
|
||||||
// eslint-disable-next-line no-unclear-flowtypes
|
// eslint-disable-next-line no-unclear-flowtypes
|
||||||
argv: any,
|
argv: any,
|
||||||
|
|
|
@ -16,7 +16,7 @@ const MetroApi = require('..');
|
||||||
|
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
|
|
||||||
const {fetchMetroConfig, makeAsyncCommand} = require('../cli-utils');
|
const {makeAsyncCommand} = require('../cli-utils');
|
||||||
|
|
||||||
import typeof Yargs from 'yargs';
|
import typeof Yargs from 'yargs';
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ exports.builder = (yargs: Yargs) => {
|
||||||
// eslint-disable-next-line no-unclear-flowtypes
|
// eslint-disable-next-line no-unclear-flowtypes
|
||||||
exports.handler = makeAsyncCommand(async (argv: any) => {
|
exports.handler = makeAsyncCommand(async (argv: any) => {
|
||||||
// $FlowFixMe: Flow + Promises don't work consistently https://fb.facebook.com/groups/flow/permalink/1772334656148475/
|
// $FlowFixMe: Flow + Promises don't work consistently https://fb.facebook.com/groups/flow/permalink/1772334656148475/
|
||||||
const config = await fetchMetroConfig(argv.config);
|
const config = await MetroApi.loadMetroConfig(argv.config);
|
||||||
|
|
||||||
if (argv.projectRoots) {
|
if (argv.projectRoots) {
|
||||||
config.getProjectRoots = () => argv.projectRoots;
|
config.getProjectRoots = () => argv.projectRoots;
|
||||||
|
|
|
@ -16,12 +16,7 @@ const MetroApi = require('..');
|
||||||
|
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
|
|
||||||
const {
|
const {watchFile, makeAsyncCommand} = require('../cli-utils');
|
||||||
findMetroConfig,
|
|
||||||
fetchMetroConfig,
|
|
||||||
watchFile,
|
|
||||||
makeAsyncCommand,
|
|
||||||
} = require('../cli-utils');
|
|
||||||
const {promisify} = require('util');
|
const {promisify} = require('util');
|
||||||
|
|
||||||
import typeof Yargs from 'yargs';
|
import typeof Yargs from 'yargs';
|
||||||
|
@ -74,7 +69,7 @@ exports.handler = makeAsyncCommand(async (argv: any) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
// $FlowFixMe: Flow + Promises don't work consistently https://fb.facebook.com/groups/flow/permalink/1772334656148475/
|
// $FlowFixMe: Flow + Promises don't work consistently https://fb.facebook.com/groups/flow/permalink/1772334656148475/
|
||||||
const config = await fetchMetroConfig(argv.config);
|
const config = await MetroApi.loadMetroConfig(argv.config);
|
||||||
|
|
||||||
if (argv.projectRoots) {
|
if (argv.projectRoots) {
|
||||||
config.getProjectRoots = () => argv.projectRoots;
|
config.getProjectRoots = () => argv.projectRoots;
|
||||||
|
@ -88,7 +83,7 @@ exports.handler = makeAsyncCommand(async (argv: any) => {
|
||||||
restarting = false;
|
restarting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const metroConfigLocation = await findMetroConfig(argv.config);
|
const metroConfigLocation = await MetroApi.findMetroConfig(argv.config);
|
||||||
|
|
||||||
if (metroConfigLocation) {
|
if (metroConfigLocation) {
|
||||||
await watchFile(metroConfigLocation, restart);
|
await watchFile(metroConfigLocation, restart);
|
||||||
|
|
|
@ -13,8 +13,6 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const Config = require('./Config');
|
const Config = require('./Config');
|
||||||
const Http = require('http');
|
|
||||||
const Https = require('https');
|
|
||||||
const MetroBundler = require('./shared/output/bundle');
|
const MetroBundler = require('./shared/output/bundle');
|
||||||
const MetroHmrServer = require('./HmrServer');
|
const MetroHmrServer = require('./HmrServer');
|
||||||
const MetroServer = require('./Server');
|
const MetroServer = require('./Server');
|
||||||
|
@ -23,6 +21,10 @@ const TransformCaching = require('./lib/TransformCaching');
|
||||||
|
|
||||||
const attachWebsocketServer = require('./lib/attachWebsocketServer');
|
const attachWebsocketServer = require('./lib/attachWebsocketServer');
|
||||||
const defaults = require('./defaults');
|
const defaults = require('./defaults');
|
||||||
|
const fs = require('fs');
|
||||||
|
const http = require('http');
|
||||||
|
const https = require('https');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
const {realpath} = require('fs');
|
const {realpath} = require('fs');
|
||||||
const {readFile} = require('fs-extra');
|
const {readFile} = require('fs-extra');
|
||||||
|
@ -32,13 +34,11 @@ import type {ConfigT} from './Config';
|
||||||
import type {Reporter} from './lib/reporting';
|
import type {Reporter} from './lib/reporting';
|
||||||
import type {RequestOptions, OutputOptions} from './shared/types.flow.js';
|
import type {RequestOptions, OutputOptions} from './shared/types.flow.js';
|
||||||
import type {Options as ServerOptions} from './shared/types.flow';
|
import type {Options as ServerOptions} from './shared/types.flow';
|
||||||
import type {Server as HttpServer, IncomingMessage, ServerResponse} from 'http';
|
import type {Server as HttpServer} from 'http';
|
||||||
import type {Server as HttpsServer} from 'https';
|
import type {Server as HttpsServer} from 'https';
|
||||||
|
|
||||||
export type {ConfigT} from './Config';
|
export type {ConfigT} from './Config';
|
||||||
|
|
||||||
type Middleware = (IncomingMessage, ServerResponse, ?() => mixed) => mixed;
|
|
||||||
|
|
||||||
type PublicMetroOptions = {|
|
type PublicMetroOptions = {|
|
||||||
config?: ConfigT,
|
config?: ConfigT,
|
||||||
maxWorkers?: number,
|
maxWorkers?: number,
|
||||||
|
@ -53,6 +53,13 @@ type PrivateMetroOptions = {|
|
||||||
watch?: boolean,
|
watch?: boolean,
|
||||||
|};
|
|};
|
||||||
|
|
||||||
|
type MetroConfigSearchOptions = {|
|
||||||
|
cwd?: string,
|
||||||
|
basename?: string,
|
||||||
|
|};
|
||||||
|
|
||||||
|
const METRO_CONFIG_FILENAME = 'metro.config.js';
|
||||||
|
|
||||||
// We'll be able to remove this to use the one provided by modern versions of
|
// We'll be able to remove this to use the one provided by modern versions of
|
||||||
// fs-extra once https://github.com/jprichardson/node-fs-extra/pull/520 will
|
// fs-extra once https://github.com/jprichardson/node-fs-extra/pull/520 will
|
||||||
// have been merged (until then, they'll break on devservers/Sandcastle)
|
// have been merged (until then, they'll break on devservers/Sandcastle)
|
||||||
|
@ -223,7 +230,7 @@ exports.runServer = async (options: RunServerOptions) => {
|
||||||
let httpServer;
|
let httpServer;
|
||||||
|
|
||||||
if (options.secure) {
|
if (options.secure) {
|
||||||
httpServer = Https.createServer(
|
httpServer = https.createServer(
|
||||||
{
|
{
|
||||||
key: await readFile(options.secureKey),
|
key: await readFile(options.secureKey),
|
||||||
cert: await readFile(options.secureCert),
|
cert: await readFile(options.secureCert),
|
||||||
|
@ -231,7 +238,7 @@ exports.runServer = async (options: RunServerOptions) => {
|
||||||
serverApp,
|
serverApp,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
httpServer = Http.createServer(serverApp);
|
httpServer = http.createServer(serverApp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.hmrEnabled) {
|
if (options.hmrEnabled) {
|
||||||
|
@ -303,6 +310,47 @@ exports.runBuild = async (options: RunBuildOptions) => {
|
||||||
return {metroServer, metroBundle};
|
return {metroServer, metroBundle};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
exports.findMetroConfig = function(
|
||||||
|
filename: ?string,
|
||||||
|
{
|
||||||
|
cwd = process.cwd(),
|
||||||
|
basename = METRO_CONFIG_FILENAME,
|
||||||
|
}: MetroConfigSearchOptions = {},
|
||||||
|
): ?string {
|
||||||
|
if (filename) {
|
||||||
|
return path.resolve(cwd, filename);
|
||||||
|
} else {
|
||||||
|
let previous;
|
||||||
|
let current = cwd;
|
||||||
|
|
||||||
|
do {
|
||||||
|
const filename = path.join(current, basename);
|
||||||
|
|
||||||
|
if (fs.existsSync(filename)) {
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
previous = current;
|
||||||
|
current = path.dirname(current);
|
||||||
|
} while (previous !== current);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.loadMetroConfig = function(
|
||||||
|
filename: ?string,
|
||||||
|
// $FlowFixMe: This is a known Flow issue where it doesn't detect that an empty object is a valid value for a strict shape where all the members are optionals
|
||||||
|
searchOptions: MetroConfigSearchOptions = {},
|
||||||
|
): ConfigT {
|
||||||
|
const location = exports.findMetroConfig(filename, searchOptions);
|
||||||
|
|
||||||
|
// $FlowFixMe: We want this require to be dynamic
|
||||||
|
const config = location ? require(location) : null;
|
||||||
|
|
||||||
|
return config ? Config.normalize(config) : Config.DEFAULT;
|
||||||
|
};
|
||||||
|
|
||||||
exports.Config = Config;
|
exports.Config = Config;
|
||||||
exports.defaults = defaults;
|
exports.defaults = defaults;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue