Skip to content

Commit 166d547

Browse files
committed
feat(): support Angular 8 (#132)
BREAKING CHANGE: this updates dependencies for Angular 8. Users are required to update to 8.0.0 of Angular/Angular CLI in order to use this. In order to migrate, please see https://update.angular.io
1 parent a7e6bf4 commit 166d547

File tree

8 files changed

+204
-192
lines changed

8 files changed

+204
-192
lines changed

builders.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
{
22
"builders": {
33
"cordova-build": {
4-
"class": "./builders/cordova-build",
4+
"implementation": "./builders/cordova-build/index",
55
"schema": "./builders/cordova-build/schema.json",
66
"description": "Perform a browser build with Cordova assets."
77
},
8+
9+
810
"cordova-serve": {
9-
"class": "./builders/cordova-serve",
11+
"implementation": "./builders/cordova-serve/index",
1012
"schema": "./builders/cordova-serve/schema.json",
1113
"description": "Run the dev-server with Cordova assets."
1214
}

builders/cordova-build/index.ts

Lines changed: 20 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,25 @@
1-
import { BuildEvent, Builder, BuilderConfiguration, BuilderContext, BuilderDescription } from '@angular-devkit/architect';
2-
import { BrowserBuilderSchema } from '@angular-devkit/build-angular/src/browser/schema';
3-
import { getSystemPath, join, normalize } from '@angular-devkit/core';
4-
import { writeFileSync } from 'fs';
5-
import { Observable, of } from 'rxjs';
6-
import { concatMap, tap } from 'rxjs/operators';
1+
import { BuilderContext, createBuilder, targetFromTargetString } from '@angular-devkit/architect';
2+
import { json } from '@angular-devkit/core';
73

8-
import { CordovaBuildBuilderSchema } from './schema';
9-
10-
export { CordovaBuildBuilderSchema };
11-
12-
export class CordovaBuildBuilder implements Builder<CordovaBuildBuilderSchema> {
13-
constructor(public context: BuilderContext) {}
14-
15-
run(builderConfig: BuilderConfiguration<CordovaBuildBuilderSchema>): Observable<BuildEvent> {
16-
const [ project, target, configuration ] = builderConfig.options.browserTarget.split(':');
17-
const browserTargetSpec = { project, target, configuration, overrides: {} };
18-
19-
let browserConfig = this.context.architect.getBuilderConfiguration<BrowserBuilderSchema>(browserTargetSpec);
20-
let browserDescription: BuilderDescription;
21-
22-
return of(null).pipe(
23-
concatMap(() => this.context.architect.getBuilderDescription(browserConfig)),
24-
tap(description => browserDescription = description),
25-
concatMap(() => this.context.architect.validateBuilderOptions(browserConfig, browserDescription)),
26-
tap(config => browserConfig = config),
27-
tap(() => this.validateBuilderConfig(builderConfig.options)),
28-
tap(() => this.prepareBrowserConfig(builderConfig.options, browserConfig.options)),
29-
concatMap(() => of(this.context.architect.getBuilder(browserDescription, this.context))),
30-
concatMap(builder => builder.run(browserConfig))
31-
);
32-
}
33-
34-
// Mutates builderOptions
35-
validateBuilderConfig(builderOptions: CordovaBuildBuilderSchema) {
36-
// if we're mocking cordova.js, don't build cordova bundle
37-
if (builderOptions.cordovaMock) {
38-
builderOptions.cordovaAssets = false;
39-
}
40-
41-
if (builderOptions.cordovaAssets && !builderOptions.platform) {
42-
throw new Error('The `--platform` option is required with `--cordova-assets`');
43-
}
44-
}
45-
46-
// Mutates browserOptions
47-
prepareBrowserConfig(options: CordovaBuildBuilderSchema, browserOptions: BrowserBuilderSchema) {
48-
const cordovaBasePath = normalize(options.cordovaBasePath ? options.cordovaBasePath : '.');
4+
import { prepareBrowserConfig, validateBuilderConfig } from '../utils';
495

50-
if (typeof options.sourceMap !== 'undefined') {
51-
browserOptions.sourceMap = options.sourceMap;
52-
}
53-
54-
// We always need to output the build to `www` because it is a hard
55-
// requirement of Cordova.
56-
browserOptions.outputPath = join(cordovaBasePath, normalize('www'));
57-
58-
// Cordova CLI will error if `www` is missing. The Angular CLI deletes it
59-
// by default. Let's keep it around.
60-
browserOptions.deleteOutputPath = false;
61-
62-
if (options.consolelogs) {
63-
// Write the config to a file, and then include that in the bundle so it loads on window
64-
const configPath = getSystemPath(join(normalize(__dirname), '../../assets', normalize('consolelog-config.js')));
65-
writeFileSync(configPath, `window.Ionic = window.Ionic || {}; Ionic.ConsoleLogServerConfig = { wsPort: ${options.consolelogsPort} }`);
66-
67-
browserOptions.scripts.push({
68-
input: configPath,
69-
bundleName: 'consolelogs',
70-
lazy: false,
71-
});
72-
73-
browserOptions.scripts.push({
74-
input: getSystemPath(join(normalize(__dirname), '../../assets', normalize('consolelogs.js'))),
75-
bundleName: 'consolelogs',
76-
lazy: false,
77-
});
78-
}
79-
80-
if (options.cordovaMock) {
81-
browserOptions.scripts.push({
82-
input: getSystemPath(join(normalize(__dirname), '../../assets', normalize('cordova.js'))),
83-
bundleName: 'cordova',
84-
lazy: false,
85-
});
86-
} else if (options.cordovaAssets) {
87-
const platformWWWPath = join(cordovaBasePath, normalize(`platforms/${options.platform}/platform_www`));
88-
89-
// Add Cordova www assets that were generated whenever platform(s) and
90-
// plugin(s) are added. This includes `cordova.js`,
91-
// `cordova_plugins.js`, and all plugin JS.
92-
browserOptions.assets.push({
93-
glob: '**/*',
94-
input: getSystemPath(platformWWWPath),
95-
output: './',
96-
});
6+
import { CordovaBuildBuilderSchema } from './schema';
977

98-
// Register `cordova.js` as a global script so it is included in
99-
// `index.html`.
100-
browserOptions.scripts.push({
101-
input: getSystemPath(join(platformWWWPath, normalize('cordova.js'))),
102-
bundleName: 'cordova',
103-
lazy: false,
104-
});
105-
}
106-
}
8+
export async function buildCordova(
9+
options: CordovaBuildBuilderSchema,
10+
context: BuilderContext
11+
) {
12+
context.reportStatus(`running cordova build...`);
13+
// Get angular browser build target
14+
const browserTargetSpec = targetFromTargetString(options.browserTarget);
15+
// Get browser build options
16+
const browserBuildTargetOptions = await context.getTargetOptions(browserTargetSpec);
17+
18+
const formattedOptions = validateBuilderConfig(options);
19+
const newOptions = prepareBrowserConfig(formattedOptions, browserBuildTargetOptions);
20+
21+
const browserBuild = await context.scheduleTarget(browserTargetSpec, newOptions);
22+
return browserBuild.result;
10723
}
10824

109-
export default CordovaBuildBuilder;
25+
export default createBuilder<json.JsonObject & CordovaBuildBuilderSchema>(buildCordova);

builders/cordova-serve/index.ts

Lines changed: 28 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,42 @@
1-
import { BuildEvent, Builder, BuilderConfiguration, BuilderContext, BuilderDescription } from '@angular-devkit/architect';
2-
import { NormalizedBrowserBuilderSchema } from '@angular-devkit/build-angular/src/browser/schema';
3-
import { DevServerBuilder, DevServerBuilderOptions } from '@angular-devkit/build-angular/src/dev-server';
4-
import { Path, virtualFs } from '@angular-devkit/core';
5-
import * as fs from 'fs';
6-
import { Observable, from, of } from 'rxjs';
7-
import { concatMap, tap } from 'rxjs/operators';
1+
import { BuilderContext, BuilderOutput, createBuilder, targetFromTargetString } from '@angular-devkit/architect';
2+
import { json } from '@angular-devkit/core';
83

9-
import { CordovaBuildBuilder, CordovaBuildBuilderSchema } from '../cordova-build';
4+
import { prepareBrowserConfig } from '../utils';
105

116
import { createConsoleLogServer } from './log-server';
127
import { CordovaServeBuilderSchema } from './schema';
138

14-
export class CordovaServeBuilder implements Builder<CordovaServeBuilderSchema> {
15-
constructor(public context: BuilderContext) {}
9+
export type CordovaDevServerBuilderOptions = CordovaServeBuilderSchema & json.JsonObject;
1610

17-
run(builderConfig: BuilderConfiguration<CordovaServeBuilderSchema>): Observable<BuildEvent> {
18-
const { options: cordovaServeOptions } = builderConfig;
19-
const { devServerTarget, port, host, ssl } = cordovaServeOptions;
20-
const [ project, target, configuration ] = devServerTarget.split(':');
11+
export async function serveCordova(
12+
options: CordovaServeBuilderSchema,
13+
context: BuilderContext
14+
): Promise<BuilderOutput> {
15+
return new Promise(async () => {
16+
context.reportStatus(`running cordova serve...`);
17+
const { devServerTarget, cordovaBuildTarget, port, host, ssl } = options;
2118

22-
const devServerTargetSpec = { project, target, configuration, overrides: { port, host, ssl } };
23-
const devServerBuilderConfig = this.context.architect.getBuilderConfiguration<DevServerBuilderOptions>(devServerTargetSpec);
19+
// Getting the original browser build options
20+
const cordovaBuildTargetSpec = targetFromTargetString(cordovaBuildTarget);
21+
const cordovaBuildTargetOptions = await context.getTargetOptions(cordovaBuildTargetSpec) as { browserTarget: string };
22+
const browserBuildTargetSpec = targetFromTargetString(cordovaBuildTargetOptions.browserTarget);
2423

25-
let devServerDescription: BuilderDescription;
26-
let cordovaBuildConfig: BuilderConfiguration<CordovaBuildBuilderSchema>;
24+
// What we actually need....
25+
const browserBuildTargetOptions = await context.getTargetOptions(browserBuildTargetSpec);
2726

28-
return of(null).pipe(
29-
concatMap(() => this.context.architect.getBuilderDescription(devServerBuilderConfig)),
30-
tap(description => devServerDescription = description),
31-
concatMap(() => this.context.architect.validateBuilderOptions(devServerBuilderConfig, devServerDescription)),
32-
concatMap(() => this._getCordovaBuildConfig(cordovaServeOptions)),
33-
tap(config => cordovaBuildConfig = config),
34-
concatMap(() => of(new CordovaDevServerBuilder(this.context, cordovaBuildConfig.options))),
35-
concatMap(builder => builder.run(devServerBuilderConfig))
36-
);
37-
}
27+
// Modifying those options to pass in cordova-speicfic stuff
28+
prepareBrowserConfig(options, browserBuildTargetOptions);
3829

39-
protected _getCordovaBuildConfig(cordovaServeOptions: CordovaServeBuilderSchema): Observable<BuilderConfiguration<CordovaBuildBuilderSchema>> {
40-
const {
41-
platform,
42-
cordovaBasePath,
43-
cordovaAssets,
44-
cordovaMock,
45-
consolelogs,
46-
consolelogsPort,
47-
sourceMap,
48-
} = cordovaServeOptions;
49-
50-
const [ project, target, configuration ] = cordovaServeOptions.cordovaBuildTarget.split(':');
51-
const cordovaBuildTargetSpec = { project, target, configuration, overrides: { platform, cordovaBasePath, cordovaAssets, cordovaMock, consolelogs, consolelogsPort, sourceMap } };
52-
const cordovaBuildTargetConfig = this.context.architect.getBuilderConfiguration<CordovaBuildBuilderSchema>(cordovaBuildTargetSpec);
53-
54-
return this.context.architect.getBuilderDescription(cordovaBuildTargetConfig).pipe(
55-
concatMap(cordovaBuildDescription => this.context.architect.validateBuilderOptions(cordovaBuildTargetConfig, cordovaBuildDescription))
56-
);
57-
}
58-
}
59-
60-
class CordovaDevServerBuilder extends DevServerBuilder {
61-
constructor(context: BuilderContext, public cordovaBuildOptions: CordovaBuildBuilderSchema) {
62-
super(context);
63-
}
64-
65-
run(builderConfig: BuilderConfiguration<DevServerBuilderOptions>): Observable<BuildEvent> {
66-
if (this.cordovaBuildOptions.consolelogs && this.cordovaBuildOptions.consolelogsPort) {
67-
return from(createConsoleLogServer(builderConfig.options.host, this.cordovaBuildOptions.consolelogsPort))
68-
.pipe(_ => super.run(builderConfig));
30+
if (options.consolelogs && options.consolelogsPort) {
31+
await createConsoleLogServer(host, options.consolelogsPort);
6932
}
70-
return super.run(builderConfig);
71-
}
7233

73-
buildWebpackConfig(root: Path, projectRoot: Path, host: virtualFs.Host<fs.Stats>, browserOptions: NormalizedBrowserBuilderSchema) {
74-
const builder = new CordovaBuildBuilder(this.context);
75-
builder.validateBuilderConfig(this.cordovaBuildOptions);
76-
builder.prepareBrowserConfig(this.cordovaBuildOptions, browserOptions);
34+
const devServerTargetSpec = targetFromTargetString(devServerTarget);
35+
const devServerTargetOptions = await context.getTargetOptions(devServerTargetSpec);
7736

78-
return super.buildWebpackConfig(root, projectRoot, host, browserOptions);
79-
}
37+
return context
38+
.scheduleTarget(devServerTargetSpec, { host, port, ssl }, devServerTargetOptions)
39+
.then(buildEvent => ({ ...buildEvent }));
40+
});
8041
}
81-
82-
export default CordovaServeBuilder;
42+
export default createBuilder<CordovaDevServerBuilderOptions, any>(serveCordova);

builders/cordova-serve/log-server.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ export async function createConsoleLogServer(host: string, port: number): Promis
5454

5555
// pretty print objects and arrays (no newlines for arrays)
5656
msg.data = msg.data.map(d => JSON.stringify(d, undefined, d && d.length ? '' : ' '));
57-
5857
if (status) {
5958
process.stdout.write(`[${status('console.' + msg.type)}]: ${msg.data.join(' ')}\n`);
6059
} else {

builders/cordova-serve/schema.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ export interface CordovaServeBuilderSchema {
22
cordovaBuildTarget: string;
33
devServerTarget: string;
44
platform?: string;
5-
port?: number;
6-
host?: string;
7-
ssl?: boolean;
5+
port: number;
6+
host: string;
7+
ssl: boolean;
88
cordovaBasePath?: string;
99
sourceMap?: boolean;
1010
cordovaAssets?: boolean;

0 commit comments

Comments
 (0)