Skip to content

Commit

Permalink
fix: move logic to run-ios/android commands
Browse files Browse the repository at this point in the history
  • Loading branch information
szymonrybczak committed Aug 2, 2023
1 parent d7ab6ab commit 691c96a
Show file tree
Hide file tree
Showing 14 changed files with 155 additions and 143 deletions.
61 changes: 50 additions & 11 deletions packages/cli-platform-android/src/commands/runAndroid/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ import {
CLIError,
link,
getDefaultUserTerminal,
isPackagerRunning,
getNextPort,
logAlreadyRunningBundler,
askForPortChange,
logChangePortInstructions,
startServerInNewWindow,
} from '@react-native-community/cli-tools';
import {getAndroidProject} from '../../config/getAndroidProject';
import listAndroidDevices from './listAndroidDevices';
Expand All @@ -28,7 +34,6 @@ import {build, BuildFlags, options} from '../buildAndroid';
import {promptForTaskSelection} from './listAndroidTasks';
import {getTaskNames} from './getTaskNames';
import {checkUsers, promptForUser} from './listAndroidUsers';
import execa from 'execa';

export interface Flags extends BuildFlags {
appId: string;
Expand All @@ -51,6 +56,50 @@ export type AndroidProject = NonNullable<Config['project']['android']>;
async function runAndroid(_argv: Array<string>, config: Config, args: Flags) {
link.setPlatform('android');

let {packager, port} = args;

const packagerStatus = await isPackagerRunning(port);

const handleSomethingRunningOnPort = async () => {
const {nextPort, start} = await getNextPort(port, config.root);
if (!start) {
packager = false;
logAlreadyRunningBundler(nextPort);
} else {
const {change} = await askForPortChange(port, nextPort);

if (change) {
port = nextPort;
} else {
packager = false;
logChangePortInstructions(port);
}
}
};

if (
typeof packagerStatus === 'object' &&
packagerStatus.status === 'running'
) {
if (packagerStatus.root === config.root) {
packager = false;
logAlreadyRunningBundler(port);
} else {
await handleSomethingRunningOnPort();
}
} else if (packagerStatus === 'unrecognized') {
await handleSomethingRunningOnPort();
}

if (packager) {
await startServerInNewWindow(
port,
config.root,
config.reactNativePath,
args.terminal,
);
}

if (config.reactNativeVersion !== 'unknown') {
link.setVersion(config.reactNativeVersion);
}
Expand All @@ -74,16 +123,6 @@ async function runAndroid(_argv: Array<string>, config: Config, args: Flags) {
}

const androidProject = getAndroidProject(config);
if (args.packager && args.terminal) {
await execa('node', [
path.join(config.reactNativePath, 'cli.js'),
'start',
'--port',
args.port.toString(),
'--terminal',
args.terminal,
]);
}

return buildAndRun(args, androidProject);
}
Expand Down
62 changes: 50 additions & 12 deletions packages/cli-platform-ios/src/commands/runIOS/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ import {
CLIError,
link,
getDefaultUserTerminal,
startServerInNewWindow,
isPackagerRunning,
getNextPort,
askForPortChange,
logAlreadyRunningBundler,
logChangePortInstructions,
} from '@react-native-community/cli-tools';
import {BuildFlags, buildProject} from '../buildIOS/buildProject';
import {iosBuildOptions} from '../buildIOS';
Expand All @@ -28,7 +34,6 @@ import {getConfigurationScheme} from '../../tools/getConfigurationScheme';
import {selectFromInteractiveMode} from '../../tools/selectFromInteractiveMode';
import {promptForDeviceSelection} from '../../tools/prompts';
import getSimulators from '../../tools/getSimulators';
import execa from 'execa';

export interface FlagsT extends BuildFlags {
simulator?: string;
Expand All @@ -47,6 +52,50 @@ export interface FlagsT extends BuildFlags {
async function runIOS(_: Array<string>, ctx: Config, args: FlagsT) {
link.setPlatform('ios');

let {packager, port} = args;

const packagerStatus = await isPackagerRunning(port);

const handleSomethingRunningOnPort = async () => {
const {nextPort, start} = await getNextPort(port, ctx.root);
if (!start) {
packager = false;
logAlreadyRunningBundler(nextPort);
} else {
const {change} = await askForPortChange(port, nextPort);

if (change) {
port = nextPort;
} else {
packager = false;
logChangePortInstructions(port);
}
}
};

if (
typeof packagerStatus === 'object' &&
packagerStatus.status === 'running'
) {
if (packagerStatus.root === ctx.root) {
packager = false;
logAlreadyRunningBundler(port);
} else {
await handleSomethingRunningOnPort();
}
} else if (packagerStatus === 'unrecognized') {
await handleSomethingRunningOnPort();
}

if (packager) {
await startServerInNewWindow(
port,
ctx.root,
ctx.reactNativePath,
args.terminal,
);
}

if (ctx.reactNativeVersion !== 'unknown') {
link.setVersion(ctx.reactNativeVersion);
}
Expand Down Expand Up @@ -126,17 +175,6 @@ async function runIOS(_: Array<string>, ctx: Config, args: FlagsT) {
} "${chalk.bold(xcodeProject.name)}"`,
);

if (args.packager && args.terminal) {
await execa('node', [
path.join(ctx.reactNativePath, 'cli.js'),
'start',
'--port',
args.port.toString(),
'--terminal',
args.terminal,
]);
}

const availableDevices = await listIOSDevices();
if (modifiedArgs.listDevices || modifiedArgs.interactive) {
if (modifiedArgs.device || modifiedArgs.udid) {
Expand Down
1 change: 0 additions & 1 deletion packages/cli-plugin-metro/src/commands/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,3 @@ import startCommand from './start';
export default [bundleCommand, ramBundleCommand, startCommand];
export {buildBundleWithConfig} from './bundle';
export type {CommandLineArgs} from './bundle';
export {startServerInNewWindow} from './start';
6 changes: 0 additions & 6 deletions packages/cli-plugin-metro/src/commands/start/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,5 @@ export default {
name: '--no-interactive',
description: 'Disables interactive mode',
},
{
name: '--terminal',
description: 'Specify terminal app to use for running Metro',
},
],
};

export {startServerInNewWindow} from './startServerInNewWindow';
56 changes: 14 additions & 42 deletions packages/cli-plugin-metro/src/commands/start/runServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,12 @@ import {
isPackagerRunning,
logger,
version,
getNextPort,
askForPortChange,
logAlreadyRunningBundler,
logChangePortInstructions,
} from '@react-native-community/cli-tools';
import enableWatchMode from './watchMode';
import {startServerInNewWindow} from './startServerInNewWindow';
import getNextPort from '../../tools/getNextPort';
import askForPortChange from '../../tools/askForPortChange';
import askForProcessKill from '../../tools/askForProcessKill';
import getProcessIdFromPort from '../../tools/getProcessIdFromPort';
import execa from 'execa';
import chalk from 'chalk';

export type Args = {
Expand All @@ -46,52 +44,26 @@ export type Args = {
transformer?: string;
watchFolders?: string[];
config?: string;
terminal?: string;
projectRoot?: string;
interactive: boolean;
};

function logAlreadyRunningBundler(port: number) {
logger.info(`Metro Bundler is already for this project on port ${port}.`);
}

function logChangePortInstructions(port: number) {
logger.info(
`Please close the other packager running on port ${port}, or select another port with "--port".`,
);
}

async function runServer(_argv: Array<string>, ctx: Config, args: Args) {
let port = args.port ?? 8081;

if (args.terminal) {
startServerInNewWindow(port, ctx.root, ctx.reactNativePath, args.terminal);
return;
}

const packagerStatus = await isPackagerRunning(port);

const handleSomethingRunningOnPort = async () => {
const {change: kill} = await askForProcessKill(port);
if (kill) {
const pid = await getProcessIdFromPort(port);

if (pid) {
execa.sync('kill', [pid]);
}
const {nextPort, start} = await getNextPort(port, ctx.root);
if (!start) {
logAlreadyRunningBundler(nextPort);
process.exit();
} else {
const {nextPort, start} = await getNextPort(port, ctx.root);
if (!start) {
logAlreadyRunningBundler(nextPort);
const {change} = await askForPortChange(port, nextPort);
if (change) {
port = nextPort;
} else {
const {change} = await askForPortChange(nextPort);

if (change) {
port = nextPort;
} else {
logChangePortInstructions(port);
return;
}
logChangePortInstructions(port);
process.exit();
}
}
};
Expand All @@ -102,7 +74,7 @@ async function runServer(_argv: Array<string>, ctx: Config, args: Args) {
) {
if (packagerStatus.root === ctx.root) {
logAlreadyRunningBundler(port);
return;
process.exit();
} else {
await handleSomethingRunningOnPort();
}
Expand Down
15 changes: 0 additions & 15 deletions packages/cli-plugin-metro/src/tools/askForPortChange.ts

This file was deleted.

20 changes: 0 additions & 20 deletions packages/cli-plugin-metro/src/tools/askForProcessKill.ts

This file was deleted.

27 changes: 0 additions & 27 deletions packages/cli-plugin-metro/src/tools/getProcessIdFromPort.ts

This file was deleted.

File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {isPackagerRunning} from '@react-native-community/cli-tools';
import isPackagerRunning from './isPackagerRunning';

type Result = {
start: boolean;
Expand Down
3 changes: 3 additions & 0 deletions packages/cli-tools/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@ export {default as printRunDoctorTip} from './printRunDoctorTip';
export {default as getPidFromPort} from './getPidFromPort';
export * from './prompt';
export * as link from './doclink';
export {default as startServerInNewWindow} from './startServerInNewWindow';
export {default as getNextPort} from './getNextPort';
export * from './port';

export * from './errors';
28 changes: 28 additions & 0 deletions packages/cli-tools/src/port.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import {prompt} from './prompt';
import logger from './logger';
import chalk from 'chalk';

export const askForPortChange = async (port: number, nextPort: number) => {
logger.info(
`Metro is already running on port ${chalk.bold(port)} in another project.`,
);
return await prompt({
name: 'change',
type: 'select',
message: `Use port ${nextPort} instead?`,
choices: [
{title: 'Yes', value: true},
{title: 'No', value: false},
],
});
};

export const logAlreadyRunningBundler = (port: number) => {
logger.info(`Metro Bundler is already for this project on port ${port}.`);
};

export const logChangePortInstructions = (port: number) => {
logger.info(
`Please close the other packager running on port ${port}, or select another port with "--port".`,
);
};
Loading

0 comments on commit 691c96a

Please sign in to comment.