Skip to content

Commit ad57e36

Browse files
committed
feat(cordova): add --livereload-url option for custom dev server
resolves #3652
1 parent a1fe36b commit ad57e36

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

packages/ionic/src/commands/cordova/build.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { COMMON_CORDOVA_BUILD_COMMAND_OPTIONS, CORDOVA_BUILD_EXAMPLE_COMMANDS, C
1010

1111
export class BuildCommand extends CordovaCommand implements CommandPreRun {
1212
async getMetadata(): Promise<CommandMetadata> {
13+
const exampleCommands = CORDOVA_BUILD_EXAMPLE_COMMANDS.sort();
1314
const options: CommandMetadataOption[] = [
1415
// Build Options
1516
{
@@ -42,7 +43,7 @@ The Cordova CLI requires a separator for platform-specific arguments for Android
4243
${chalk.cyan('[1]')}: ${chalk.bold('https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html#using-flags')}
4344
${chalk.cyan('[2]')}: ${chalk.bold('https://cordova.apache.org/docs/en/latest/guide/platforms/ios/index.html#using-flags')}
4445
`,
45-
exampleCommands: CORDOVA_BUILD_EXAMPLE_COMMANDS,
46+
exampleCommands,
4647
inputs: [
4748
{
4849
name: 'platform',

packages/ionic/src/commands/cordova/run.ts

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,12 @@ const CORDOVA_RUN_OPTIONS: ReadonlyArray<CommandMetadataOption> = [
5959
export class RunCommand extends CordovaCommand implements CommandPreRun {
6060
async getMetadata(): Promise<CommandMetadata> {
6161
let groups: string[] = [];
62-
const exampleCommands = CORDOVA_BUILD_EXAMPLE_COMMANDS;
62+
const exampleCommands = [
63+
...CORDOVA_BUILD_EXAMPLE_COMMANDS,
64+
'android -l',
65+
'ios --livereload',
66+
'ios --livereload-url=http://localhost:8100',
67+
].sort();
6368
const options: CommandMetadataOption[] = [
6469
{
6570
name: 'list',
@@ -83,6 +88,10 @@ export class RunCommand extends CordovaCommand implements CommandPreRun {
8388
type: Boolean,
8489
aliases: ['l'],
8590
},
91+
{
92+
name: 'livereload-url',
93+
summary: 'Provide a custom URL to the dev server',
94+
},
8695
];
8796

8897
const serveRunner = this.project && await this.project.getServeRunner();
@@ -113,7 +122,7 @@ Like running ${chalk.green('cordova run')} or ${chalk.green('cordova emulate')}
113122
114123
For Android and iOS, you can setup Remote Debugging on your device with browser development tools using these docs${chalk.cyan('[1]')}.
115124
116-
Just like with ${chalk.green('ionic cordova build')}, you can pass additional options to the Cordova CLI using the ${chalk.green('--')} separator.
125+
Just like with ${chalk.green('ionic cordova build')}, you can pass additional options to the Cordova CLI using the ${chalk.green('--')} separator. To pass additional options to the dev server, consider using ${chalk.green('ionic serve')} and the ${chalk.green('--livereload-url')} option.
117126
118127
${chalk.cyan('[1]')}: ${chalk.bold('https://ionicframework.com/docs/developer-resources/developer-tips/')}
119128
`,
@@ -143,6 +152,10 @@ ${chalk.cyan('[1]')}: ${chalk.bold('https://ionicframework.com/docs/developer-re
143152
options['proxy'] = false;
144153
}
145154

155+
if (options['livereload-url']) {
156+
options['livereload'] = true;
157+
}
158+
146159
if (!options['build'] && options['livereload']) {
147160
this.env.log.warn(`No livereload with ${chalk.green('--no-build')}.`);
148161
options['livereload'] = false;
@@ -181,28 +194,34 @@ ${chalk.cyan('[1]')}: ${chalk.bold('https://ionicframework.com/docs/developer-re
181194
const metadata = await this.getMetadata();
182195

183196
if (options['livereload']) {
197+
let livereloadUrl = options['livereload-url'] ? String(options['livereload-url']) : undefined;
198+
199+
if (!livereloadUrl) {
200+
// TODO: use runner directly
201+
const details = await serve({ flags: this.env.flags, config: this.env.config, log: this.env.log, prompt: this.env.prompt, shell: this.env.shell, project: this.project }, inputs, generateOptionsForCordovaBuild(metadata, inputs, options));
202+
203+
if (details.externallyAccessible === false) {
204+
const extra = LOCAL_ADDRESSES.includes(details.externalAddress) ? '\nEnsure you have proper port forwarding setup from your device to your computer.' : '';
205+
this.env.log.warn(`Your device or emulator may not be able to access ${chalk.bold(details.externalAddress)}.${extra}\n\n`);
206+
}
207+
208+
livereloadUrl = `${details.protocol || 'http'}://${details.externalAddress}:${details.port}`;
209+
}
210+
184211
const conf = await loadConfigXml(this.integration);
185212

186213
onBeforeExit(async () => {
187214
conf.resetContentSrc();
188215
await conf.save();
189216
});
190217

218+
conf.writeContentSrc(livereloadUrl);
219+
await conf.save();
220+
191221
const cordovalog = this.env.log.clone();
192222
cordovalog.handlers = createDefaultLoggerHandlers(createPrefixedFormatter(`${chalk.dim(`[cordova]`)} `));
193223
const cordovalogws = cordovalog.createWriteStream(LOGGER_LEVELS.INFO);
194224

195-
// TODO: use runner directly
196-
const details = await serve({ flags: this.env.flags, config: this.env.config, log: this.env.log, prompt: this.env.prompt, shell: this.env.shell, project: this.project }, inputs, generateOptionsForCordovaBuild(metadata, inputs, options));
197-
198-
if (details.externallyAccessible === false) {
199-
const extra = LOCAL_ADDRESSES.includes(details.externalAddress) ? '\nEnsure you have proper port forwarding setup from your device to your computer.' : '';
200-
this.env.log.warn(`Your device or emulator may not be able to access ${chalk.bold(details.externalAddress)}.${extra}\n\n`);
201-
}
202-
203-
conf.writeContentSrc(`${details.protocol || 'http'}://${details.externalAddress}:${details.port}`);
204-
await conf.save();
205-
206225
await this.runCordova(filterArgumentsForCordova(metadata, options), { stream: cordovalogws });
207226
await sleepForever();
208227
} else {

0 commit comments

Comments
 (0)