Skip to content

Commit 7bc2839

Browse files
committed
merge @ionic/ng-toolit and @ionic/schematics-angular
1 parent f573334 commit 7bc2839

22 files changed

+774
-1
lines changed

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package-lock.json
2+
node_modules
3+
**/*.js
4+
**/*.d.ts
5+
!builders/**/schema.d.ts
6+
!schematics/**/schema.d.ts
7+
!schematics/*/files/**/*

.npmignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# having this file excludes .gitignore entries
2+
3+
tsconfig.json
4+
tslint.js

.npmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package-lock=false

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
# angular-toolkit
1+
# @ionic/angular-toolkit
2+
3+
Angular Schematics and Builders for `@ionic/angular` apps.

builders.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"builders": {
3+
"cordova-build": {
4+
"class": "./builders/cordova-build",
5+
"schema": "./builders/cordova-build/schema.json",
6+
"description": "Perform a browser build with Cordova assets."
7+
},
8+
"cordova-serve": {
9+
"class": "./builders/cordova-serve",
10+
"schema": "./builders/cordova-serve/schema.json",
11+
"description": "Run the dev-server with Cordova assets."
12+
}
13+
}
14+
}

builders/cordova-build/index.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { BuildEvent, Builder, BuilderConfiguration, BuilderContext } from '@angular-devkit/architect';
2+
import { BrowserBuilder } from '@angular-devkit/build-angular/src/browser';
3+
import { BrowserBuilderSchema } from '@angular-devkit/build-angular/src/browser/schema';
4+
import { getSystemPath, join, normalize } from '@angular-devkit/core';
5+
import { Observable, of } from 'rxjs';
6+
import { concatMap, tap } from 'rxjs/operators';
7+
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 browserBuilder = new BrowserBuilder(this.context); // TODO: shouldn't this use `architect.getBuilder()`?
17+
18+
return this.buildBrowserConfig(builderConfig.options).pipe(
19+
concatMap(browserConfig => browserBuilder.run(browserConfig))
20+
);
21+
}
22+
23+
buildBrowserConfig(options: CordovaBuildBuilderSchema): Observable<BuilderConfiguration<BrowserBuilderSchema>> {
24+
let browserConfig: BuilderConfiguration<BrowserBuilderSchema>;
25+
26+
return of(null).pipe(// tslint:disable-line:no-null-keyword
27+
concatMap(() => this._getBrowserConfig(options)),
28+
tap(config => browserConfig = config),
29+
tap(() => this.prepareBrowserConfig(options, browserConfig.options)),
30+
concatMap(() => of(browserConfig))
31+
);
32+
}
33+
34+
// Mutates browserOptions
35+
prepareBrowserConfig(options: CordovaBuildBuilderSchema, browserOptions: BrowserBuilderSchema) {
36+
const cordovaBasePath = normalize(options.cordovaBasePath ? options.cordovaBasePath : '.');
37+
38+
// We always need to output the build to `www` because it is a hard
39+
// requirement of Cordova.
40+
browserOptions.outputPath = join(cordovaBasePath, normalize('www'));
41+
42+
if (options.cordovaAssets) {
43+
const platformWWWPath = join(cordovaBasePath, normalize(`platforms/${options.platform}/platform_www`));
44+
45+
// Add Cordova www assets that were generated whenever platform(s) and
46+
// plugin(s) are added. This includes `cordova.js`,
47+
// `cordova_plugins.js`, and all plugin JS.
48+
browserOptions.assets.push({
49+
glob: '**/*',
50+
input: getSystemPath(platformWWWPath),
51+
output: './',
52+
});
53+
54+
// Register `cordova.js` as a global script so it is included in
55+
// `index.html`.
56+
browserOptions.scripts.push({
57+
input: getSystemPath(join(platformWWWPath, normalize('cordova.js'))),
58+
bundleName: 'cordova',
59+
lazy: false,
60+
});
61+
}
62+
}
63+
64+
protected _getBrowserConfig(options: CordovaBuildBuilderSchema): Observable<BuilderConfiguration<BrowserBuilderSchema>> {
65+
const { architect } = this.context;
66+
const [ project, target, configuration ] = options.browserTarget.split(':');
67+
const browserTargetSpec = { project, target, configuration, overrides: {} };
68+
const builderConfig = architect.getBuilderConfiguration<BrowserBuilderSchema>(browserTargetSpec);
69+
70+
return architect.getBuilderDescription(builderConfig).pipe(
71+
concatMap(browserDescription => architect.validateBuilderOptions(builderConfig, browserDescription))
72+
);
73+
}
74+
}
75+
76+
export default CordovaBuildBuilder;

builders/cordova-build/schema.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface CordovaBuildBuilderSchema {
2+
browserTarget: string;
3+
platform: string;
4+
cordovaBasePath?: string;
5+
sourceMap?: boolean;
6+
cordovaAssets?: boolean;
7+
}

builders/cordova-build/schema.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"title": "Cordova build for Ionic",
3+
"description": "Options for Cordova build for Ionic.",
4+
"type": "object",
5+
"properties": {
6+
"browserTarget": {
7+
"type": "string",
8+
"description": "Target to build."
9+
},
10+
"platform": {
11+
"type": "string",
12+
"description": "Cordova platform to use during build."
13+
},
14+
"cordovaBasePath": {
15+
"type": "string",
16+
"description": "Path to cordova directory"
17+
},
18+
"sourceMap": {
19+
"type": "boolean",
20+
"description": "Create source-map file"
21+
},
22+
"cordovaAssets": {
23+
"type": "boolean",
24+
"description": "Bundle Cordova assets with build",
25+
"default": true
26+
}
27+
},
28+
"additionalProperties": false,
29+
"required": [
30+
"browserTarget",
31+
"platform"
32+
]
33+
}

builders/cordova-serve/index.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { BuildEvent, Builder, BuilderConfiguration, BuilderContext, BuilderDescription } from '@angular-devkit/architect';
2+
import { BrowserBuilderSchema } 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, of } from 'rxjs';
7+
import { concatMap, tap } from 'rxjs/operators';
8+
9+
import { CordovaBuildBuilder, CordovaBuildBuilderSchema } from '../cordova-build';
10+
11+
import { CordovaServeBuilderSchema } from './schema';
12+
13+
export class CordovaServeBuilder implements Builder<CordovaServeBuilderSchema> {
14+
constructor(public context: BuilderContext) {}
15+
16+
run(builderConfig: BuilderConfiguration<CordovaServeBuilderSchema>): Observable<BuildEvent> {
17+
const [ project, target, configuration ] = builderConfig.options.devServerTarget.split(':');
18+
const { port, host, proxyConfig } = builderConfig.options;
19+
const devServerTargetSpec = { project, target, configuration, overrides: { port, host, proxyConfig } };
20+
const devServerBuilderConfig = this.context.architect.getBuilderConfiguration<DevServerBuilderOptions>(devServerTargetSpec);
21+
22+
let devServerDescription: BuilderDescription;
23+
24+
return this.context.architect.getBuilderDescription(devServerBuilderConfig).pipe(
25+
tap(description => devServerDescription = description),
26+
concatMap(() => this.context.architect.validateBuilderOptions(devServerBuilderConfig, devServerDescription)),
27+
concatMap(() => of(new CordovaDevServerBuilder(this.context, builderConfig.options))),
28+
// concatMap(() => of(this.context.architect.getBuilder(devServerDescription, this.context))),
29+
concatMap(builder => builder.run(devServerBuilderConfig))
30+
);
31+
}
32+
}
33+
34+
class CordovaDevServerBuilder extends DevServerBuilder {
35+
constructor(context: BuilderContext, public cordovaServeOptions: CordovaServeBuilderSchema) {
36+
super(context);
37+
}
38+
39+
// run(builderConfig: BuilderConfiguration</* DevServerBuilderOptions */any>): Observable<BuildEvent> {
40+
// return super.run(builderConfig);
41+
// }
42+
43+
buildWebpackConfig(root: Path, projectRoot: Path, host: virtualFs.Host<ζfs.Stats>, browserOptions: BrowserBuilderSchema) {
44+
const { platform } = this.cordovaServeOptions;
45+
const [ project, target, configuration ] = this.cordovaServeOptions.cordovaBuildTarget.split(':');
46+
const cordovaBuildTargetSpec = { project, target, configuration, overrides: { platform } };
47+
const cordovaBuildTargetConfig = this.context.architect.getBuilderConfiguration<CordovaBuildBuilderSchema>(cordovaBuildTargetSpec);
48+
49+
const builder = new CordovaBuildBuilder(this.context);
50+
builder.prepareBrowserConfig(cordovaBuildTargetConfig.options, browserOptions);
51+
52+
return super.buildWebpackConfig(root, projectRoot, host, browserOptions);
53+
}
54+
}
55+
56+
export default CordovaServeBuilder;

builders/cordova-serve/schema.d.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export interface CordovaServeBuilderSchema {
2+
cordovaBuildTarget: string;
3+
devServerTarget: string;
4+
platform: string;
5+
port?: number;
6+
host?: string;
7+
proxyConfig?: string;
8+
cordovaBasePath?: string;
9+
sourceMap?: boolean;
10+
}

0 commit comments

Comments
 (0)