Skip to content

Commit

Permalink
fix(serve): validate cordova-build options to provide defaults
Browse files Browse the repository at this point in the history
Using `validateBuilderOptions()` is key--it fills in default values from
the `schema.json` file. In this case, the new `cordovaAssets` option in
the cordova-build Builder defaults to `true`, but if cordova-serve uses
it without validating the options, the default is lost, resulting in
"cordova not available" issues.

fixes ionic-team/ionic-cli#3720
  • Loading branch information
imhoffd committed Oct 31, 2018
1 parent 32a3241 commit 98d6a63
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions builders/cordova-serve/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,34 +20,38 @@ export class CordovaServeBuilder implements Builder<CordovaServeBuilderSchema> {
const devServerBuilderConfig = this.context.architect.getBuilderConfiguration<DevServerBuilderOptions>(devServerTargetSpec);

let devServerDescription: BuilderDescription;
let cordovaBuildConfig: BuilderConfiguration<CordovaBuildBuilderSchema>;

return this.context.architect.getBuilderDescription(devServerBuilderConfig).pipe(
tap(description => devServerDescription = description),
concatMap(() => this.context.architect.validateBuilderOptions(devServerBuilderConfig, devServerDescription)),
concatMap(() => of(new CordovaDevServerBuilder(this.context, builderConfig.options))),
// concatMap(() => of(this.context.architect.getBuilder(devServerDescription, this.context))),
concatMap(() => this._getCordovaBuildConfig(builderConfig.options)),
tap(config => cordovaBuildConfig = config),
concatMap(() => of(new CordovaDevServerBuilder(this.context, cordovaBuildConfig.options))),
concatMap(builder => builder.run(devServerBuilderConfig))
);
}

protected _getCordovaBuildConfig(cordovaServeOptions: CordovaServeBuilderSchema): Observable<BuilderConfiguration<CordovaBuildBuilderSchema>> {
const { platform } = cordovaServeOptions;
const [ project, target, configuration ] = cordovaServeOptions.cordovaBuildTarget.split(':');
const cordovaBuildTargetSpec = { project, target, configuration, overrides: { platform } };
const cordovaBuildTargetConfig = this.context.architect.getBuilderConfiguration<CordovaBuildBuilderSchema>(cordovaBuildTargetSpec);

return this.context.architect.getBuilderDescription(cordovaBuildTargetConfig).pipe(
concatMap(cordovaBuildDescription => this.context.architect.validateBuilderOptions(cordovaBuildTargetConfig, cordovaBuildDescription))
);
}
}

class CordovaDevServerBuilder extends DevServerBuilder {
constructor(context: BuilderContext, public cordovaServeOptions: CordovaServeBuilderSchema) {
constructor(context: BuilderContext, public cordovaBuildOptions: CordovaBuildBuilderSchema) {
super(context);
}

// run(builderConfig: BuilderConfiguration</* DevServerBuilderOptions */any>): Observable<BuildEvent> {
// return super.run(builderConfig);
// }

buildWebpackConfig(root: Path, projectRoot: Path, host: virtualFs.Host<ζfs.Stats>, browserOptions: BrowserBuilderSchema) {
const { platform } = this.cordovaServeOptions;
const [ project, target, configuration ] = this.cordovaServeOptions.cordovaBuildTarget.split(':');
const cordovaBuildTargetSpec = { project, target, configuration, overrides: { platform } };
const cordovaBuildTargetConfig = this.context.architect.getBuilderConfiguration<CordovaBuildBuilderSchema>(cordovaBuildTargetSpec);

const builder = new CordovaBuildBuilder(this.context);
builder.prepareBrowserConfig(cordovaBuildTargetConfig.options, browserOptions);
builder.prepareBrowserConfig(this.cordovaBuildOptions, browserOptions);

return super.buildWebpackConfig(root, projectRoot, host, browserOptions);
}
Expand Down

0 comments on commit 98d6a63

Please sign in to comment.