Hans 3886aab55b feat(@schematics/angular): add a --experimental-ivy flag to ng-new
This will create a new Ivy-enabled application. Also available in "ng g application".
2018-08-09 19:37:53 -04:00

94 lines
2.5 KiB
TypeScript

/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {
Rule,
SchematicContext,
SchematicsException,
Tree,
apply,
chain,
empty,
mergeWith,
move,
schematic,
} from '@angular-devkit/schematics';
import {
NodePackageInstallTask,
NodePackageLinkTask,
RepositoryInitializerTask,
} from '@angular-devkit/schematics/tasks';
import { Schema as ApplicationOptions } from '../application/schema';
import { Schema as WorkspaceOptions } from '../workspace/schema';
import { Schema as NgNewOptions } from './schema';
export default function (options: NgNewOptions): Rule {
if (!options.name) {
throw new SchematicsException(`Invalid options, "name" is required.`);
}
if (!options.directory) {
options.directory = options.name;
}
const workspaceOptions: WorkspaceOptions = {
name: options.name,
version: options.version,
experimentalAngularNext: options.experimentalIvy,
newProjectRoot: options.newProjectRoot || 'projects',
};
const applicationOptions: ApplicationOptions = {
projectRoot: '',
name: options.name,
experimentalIvy: options.experimentalIvy,
inlineStyle: options.inlineStyle,
inlineTemplate: options.inlineTemplate,
prefix: options.prefix,
viewEncapsulation: options.viewEncapsulation,
routing: options.routing,
style: options.style,
skipTests: options.skipTests,
skipPackageJson: false,
};
return chain([
mergeWith(
apply(empty(), [
schematic('workspace', workspaceOptions),
schematic('application', applicationOptions),
move(options.directory || options.name),
]),
),
(_host: Tree, context: SchematicContext) => {
let packageTask;
if (!options.skipInstall) {
packageTask = context.addTask(new NodePackageInstallTask(options.directory));
if (options.linkCli) {
packageTask = context.addTask(
new NodePackageLinkTask('@angular/cli', options.directory),
[packageTask],
);
}
}
if (!options.skipGit) {
const commit = typeof options.commit == 'object'
? options.commit
: (!!options.commit ? {} : false);
context.addTask(
new RepositoryInitializerTask(
options.directory,
commit,
),
packageTask ? [packageTask] : [],
);
}
},
]);
}