Skip to content

Commit

Permalink
merge @ionic/ng-toolit and @ionic/schematics-angular
Browse files Browse the repository at this point in the history
  • Loading branch information
imhoffd committed Oct 5, 2018
1 parent f573334 commit 7bc2839
Show file tree
Hide file tree
Showing 22 changed files with 774 additions and 1 deletion.
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package-lock.json
node_modules
**/*.js
**/*.d.ts
!builders/**/schema.d.ts
!schematics/**/schema.d.ts
!schematics/*/files/**/*
4 changes: 4 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# having this file excludes .gitignore entries

tsconfig.json
tslint.js
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package-lock=false
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
# angular-toolkit
# @ionic/angular-toolkit

Angular Schematics and Builders for `@ionic/angular` apps.
14 changes: 14 additions & 0 deletions builders.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"builders": {
"cordova-build": {
"class": "./builders/cordova-build",
"schema": "./builders/cordova-build/schema.json",
"description": "Perform a browser build with Cordova assets."
},
"cordova-serve": {
"class": "./builders/cordova-serve",
"schema": "./builders/cordova-serve/schema.json",
"description": "Run the dev-server with Cordova assets."
}
}
}
76 changes: 76 additions & 0 deletions builders/cordova-build/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { BuildEvent, Builder, BuilderConfiguration, BuilderContext } from '@angular-devkit/architect';
import { BrowserBuilder } from '@angular-devkit/build-angular/src/browser';
import { BrowserBuilderSchema } from '@angular-devkit/build-angular/src/browser/schema';
import { getSystemPath, join, normalize } from '@angular-devkit/core';
import { Observable, of } from 'rxjs';
import { concatMap, tap } from 'rxjs/operators';

import { CordovaBuildBuilderSchema } from './schema';

export { CordovaBuildBuilderSchema };

export class CordovaBuildBuilder implements Builder<CordovaBuildBuilderSchema> {
constructor(public context: BuilderContext) {}

run(builderConfig: BuilderConfiguration<CordovaBuildBuilderSchema>): Observable<BuildEvent> {
const browserBuilder = new BrowserBuilder(this.context); // TODO: shouldn't this use `architect.getBuilder()`?

return this.buildBrowserConfig(builderConfig.options).pipe(
concatMap(browserConfig => browserBuilder.run(browserConfig))
);
}

buildBrowserConfig(options: CordovaBuildBuilderSchema): Observable<BuilderConfiguration<BrowserBuilderSchema>> {
let browserConfig: BuilderConfiguration<BrowserBuilderSchema>;

return of(null).pipe(// tslint:disable-line:no-null-keyword
concatMap(() => this._getBrowserConfig(options)),
tap(config => browserConfig = config),
tap(() => this.prepareBrowserConfig(options, browserConfig.options)),
concatMap(() => of(browserConfig))
);
}

// Mutates browserOptions
prepareBrowserConfig(options: CordovaBuildBuilderSchema, browserOptions: BrowserBuilderSchema) {
const cordovaBasePath = normalize(options.cordovaBasePath ? options.cordovaBasePath : '.');

// We always need to output the build to `www` because it is a hard
// requirement of Cordova.
browserOptions.outputPath = join(cordovaBasePath, normalize('www'));

if (options.cordovaAssets) {
const platformWWWPath = join(cordovaBasePath, normalize(`platforms/${options.platform}/platform_www`));

// Add Cordova www assets that were generated whenever platform(s) and
// plugin(s) are added. This includes `cordova.js`,
// `cordova_plugins.js`, and all plugin JS.
browserOptions.assets.push({
glob: '**/*',
input: getSystemPath(platformWWWPath),
output: './',
});

// Register `cordova.js` as a global script so it is included in
// `index.html`.
browserOptions.scripts.push({
input: getSystemPath(join(platformWWWPath, normalize('cordova.js'))),
bundleName: 'cordova',
lazy: false,
});
}
}

protected _getBrowserConfig(options: CordovaBuildBuilderSchema): Observable<BuilderConfiguration<BrowserBuilderSchema>> {
const { architect } = this.context;
const [ project, target, configuration ] = options.browserTarget.split(':');
const browserTargetSpec = { project, target, configuration, overrides: {} };
const builderConfig = architect.getBuilderConfiguration<BrowserBuilderSchema>(browserTargetSpec);

return architect.getBuilderDescription(builderConfig).pipe(
concatMap(browserDescription => architect.validateBuilderOptions(builderConfig, browserDescription))
);
}
}

export default CordovaBuildBuilder;
7 changes: 7 additions & 0 deletions builders/cordova-build/schema.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export interface CordovaBuildBuilderSchema {
browserTarget: string;
platform: string;
cordovaBasePath?: string;
sourceMap?: boolean;
cordovaAssets?: boolean;
}
33 changes: 33 additions & 0 deletions builders/cordova-build/schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"title": "Cordova build for Ionic",
"description": "Options for Cordova build for Ionic.",
"type": "object",
"properties": {
"browserTarget": {
"type": "string",
"description": "Target to build."
},
"platform": {
"type": "string",
"description": "Cordova platform to use during build."
},
"cordovaBasePath": {
"type": "string",
"description": "Path to cordova directory"
},
"sourceMap": {
"type": "boolean",
"description": "Create source-map file"
},
"cordovaAssets": {
"type": "boolean",
"description": "Bundle Cordova assets with build",
"default": true
}
},
"additionalProperties": false,
"required": [
"browserTarget",
"platform"
]
}
56 changes: 56 additions & 0 deletions builders/cordova-serve/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { BuildEvent, Builder, BuilderConfiguration, BuilderContext, BuilderDescription } from '@angular-devkit/architect';
import { BrowserBuilderSchema } from '@angular-devkit/build-angular/src/browser/schema';
import { DevServerBuilder, DevServerBuilderOptions } from '@angular-devkit/build-angular/src/dev-server';
import { Path, virtualFs } from '@angular-devkit/core';
import * as ζfs from 'fs';
import { Observable, of } from 'rxjs';
import { concatMap, tap } from 'rxjs/operators';

import { CordovaBuildBuilder, CordovaBuildBuilderSchema } from '../cordova-build';

import { CordovaServeBuilderSchema } from './schema';

export class CordovaServeBuilder implements Builder<CordovaServeBuilderSchema> {
constructor(public context: BuilderContext) {}

run(builderConfig: BuilderConfiguration<CordovaServeBuilderSchema>): Observable<BuildEvent> {
const [ project, target, configuration ] = builderConfig.options.devServerTarget.split(':');
const { port, host, proxyConfig } = builderConfig.options;
const devServerTargetSpec = { project, target, configuration, overrides: { port, host, proxyConfig } };
const devServerBuilderConfig = this.context.architect.getBuilderConfiguration<DevServerBuilderOptions>(devServerTargetSpec);

let devServerDescription: BuilderDescription;

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(builder => builder.run(devServerBuilderConfig))
);
}
}

class CordovaDevServerBuilder extends DevServerBuilder {
constructor(context: BuilderContext, public cordovaServeOptions: CordovaServeBuilderSchema) {
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);

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

export default CordovaServeBuilder;
10 changes: 10 additions & 0 deletions builders/cordova-serve/schema.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export interface CordovaServeBuilderSchema {
cordovaBuildTarget: string;
devServerTarget: string;
platform: string;
port?: number;
host?: string;
proxyConfig?: string;
cordovaBasePath?: string;
sourceMap?: boolean;
}
47 changes: 47 additions & 0 deletions builders/cordova-serve/schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
"title": "Cordova serve for Ionic",
"description": "Options for Cordova serve for Ionic.",
"type": "object",
"properties": {
"cordovaBuildTarget": {
"type": "string",
"description": "Target to use for build."
},
"devServerTarget": {
"type": "string",
"description": "Target to use for serve."
},
"platform": {
"type": "string",
"description": "Cordova platform to use during serve."
},
"proxyConfig": {
"type": "string",
"description": "Proxy configuration file."
},
"port": {
"type": "number",
"description": "Port to listen on.",
"default": 4200
},
"host": {
"type": "string",
"description": "Host to listen on.",
"default": "localhost"
},
"cordovaBasePath": {
"type": "string",
"description": "Path to cordova directory"
},
"sourceMap": {
"type": "boolean",
"description": "Create source-map file"
}
},
"additionalProperties": false,
"required": [
"cordovaBuildTarget",
"devServerTarget",
"platform"
]
}
54 changes: 54 additions & 0 deletions collection.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"schematics": {
"page": {
"aliases": ["pg"],
"factory": "./schematics/page",
"description": "Create an Ionic page.",
"schema": "./schematics/page/schema.json"
},
"class": {
"aliases": ["cl"],
"extends": "@schematics/angular:class"
},
"component": {
"aliases": ["c"],
"extends": "@schematics/angular:component"
},
"directive": {
"aliases": ["d"],
"extends": "@schematics/angular:directive"
},
"enum": {
"aliases": ["e"],
"extends": "@schematics/angular:enum"
},
"guard": {
"aliases": ["g"],
"extends": "@schematics/angular:guard"
},
"interface": {
"aliases": ["i"],
"extends": "@schematics/angular:interface"
},
"module": {
"aliases": ["m"],
"extends": "@schematics/angular:module"
},
"pipe": {
"aliases": ["p"],
"extends": "@schematics/angular:pipe"
},
"service": {
"aliases": ["s"],
"extends": "@schematics/angular:service"
},
"application": {
"aliases": ["app"],
"extends": "@schematics/angular:application"
},
"library": {
"aliases": ["lib"],
"extends": "@schematics/angular:library"
}
}
}
59 changes: 59 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
"name": "@ionic/angular-toolkit",
"version": "1.0.0",
"description": "Schematics and builders for @ionic/angular apps.",
"homepage": "https://ionicframework.com/",
"author": "Ionic Team <hi@ionicframework.com> (https://ionicframework.com)",
"scripts": {
"lint": "tslint --config tslint.js --project tsconfig.json",
"build": "tsc",
"watch": "tsc -w",
"prepublishOnly": "npm run build"
},
"repository": {
"type": "git",
"url": "https://github.com/ionic-team/angular-toolkit.git"
},
"bugs": {
"url": "https://github.com/ionic-team/angular-toolkit/issues"
},
"keywords": [
"angular",
"Angular CLI",
"blueprints",
"code generation",
"devkit",
"schematics",
"ionic",
"ionic framework",
"ionicframework"
],
"dependencies": {
"@angular-devkit/architect": "0.9.0-beta.3",
"@angular-devkit/build-angular": "0.9.0-beta.3",
"@angular-devkit/core": "0.9.0-beta.3",
"@angular-devkit/schematics": "0.9.0-beta.3",
"@schematics/angular": "0.9.0-beta.3",
"tslib": "^1.9.0",
"typescript": "3.0.1"
},
"devDependencies": {
"@types/node": "^8.10.34",
"@types/webpack": "^4.4.14",
"@types/webpack-dev-server": "^3.1.1",
"lint-staged": "^7.2.0",
"rimraf": "^2.6.2",
"tslint": "^5.9.1",
"tslint-ionic-rules": "0.0.19"
},
"builders": "./builders.json",
"schematics": "./collection.json",
"lint-staged": {
"linters": {
"*.{ts,tsx}": "npm run lint"
},
"ignore": [
"**/__tests__/*.{ts,tsx}"
]
}
}
Loading

0 comments on commit 7bc2839

Please sign in to comment.