@schematics/angular
Version:
Schematics specific to Angular
122 lines (121 loc) • 4.98 kB
JavaScript
;
/**
* @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
*/
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@angular-devkit/core");
const schematics_1 = require("@angular-devkit/schematics");
const config_1 = require("../../utility/config");
const json_utils_1 = require("../../utility/json-utils");
/** Get a project target which builder and target names matches the provided. */
function getProjectTarget(project, targetName, builderName) {
const projectRoot = json_utils_1.findPropertyInAstObject(project, 'root');
if (!projectRoot || projectRoot.kind !== 'string') {
return undefined;
}
const architect = json_utils_1.findPropertyInAstObject(project, 'architect');
if (!architect || architect.kind !== 'object') {
return undefined;
}
const target = json_utils_1.findPropertyInAstObject(architect, targetName);
if (!target || target.kind !== 'object') {
return undefined;
}
const builder = json_utils_1.findPropertyInAstObject(target, 'builder');
// Projects who's build builder is @angular-devkit/build-ng-packagr
if (builder && builder.kind === 'string' && builder.value === builderName) {
return target;
}
return undefined;
}
exports.getProjectTarget = getProjectTarget;
function getTargets(workspace, targetName, builderName) {
const projects = json_utils_1.findPropertyInAstObject(workspace, 'projects');
if (!projects || projects.kind !== 'object' || !projects.properties) {
return [];
}
const targets = [];
for (const project of projects.properties) {
const projectConfig = project.value;
if (projectConfig.kind !== 'object') {
continue;
}
const target = getProjectTarget(projectConfig, targetName, builderName);
if (target) {
targets.push({ target, project: projectConfig });
}
}
return targets;
}
exports.getTargets = getTargets;
/** Helper to retreive all the options in various configurations. */
function getAllOptions(builderConfig, configurationsOnly = false) {
const options = [];
const configurations = json_utils_1.findPropertyInAstObject(builderConfig, 'configurations');
if (configurations && configurations.kind === 'object') {
options.push(...configurations.properties.map(x => x.value));
}
if (!configurationsOnly) {
options.push(json_utils_1.findPropertyInAstObject(builderConfig, 'options'));
}
return options.filter(o => o && o.kind === 'object');
}
exports.getAllOptions = getAllOptions;
function getWorkspace(host) {
const path = config_1.getWorkspacePath(host);
const content = readJsonFileAsAstObject(host, path);
if (!content) {
throw new schematics_1.SchematicsException(`Could not find (${path})`);
}
return content;
}
exports.getWorkspace = getWorkspace;
function readJsonFileAsAstObject(host, path) {
const configBuffer = host.read(path);
if (!configBuffer) {
return undefined;
}
const content = configBuffer.toString();
const astContent = core_1.parseJsonAst(content, core_1.JsonParseMode.Loose);
if (!astContent || astContent.kind !== 'object') {
throw new schematics_1.SchematicsException(`Invalid JSON AST Object (${path})`);
}
return astContent;
}
exports.readJsonFileAsAstObject = readJsonFileAsAstObject;
function isIvyEnabled(tree, tsConfigPath) {
// In version 9, Ivy is turned on by default
// Ivy is opted out only when 'enableIvy' is set to false.
const buffer = tree.read(tsConfigPath);
if (!buffer) {
return true;
}
const tsCfgAst = core_1.parseJsonAst(buffer.toString(), core_1.JsonParseMode.Loose);
if (tsCfgAst.kind !== 'object') {
return true;
}
const ngCompilerOptions = json_utils_1.findPropertyInAstObject(tsCfgAst, 'angularCompilerOptions');
if (ngCompilerOptions && ngCompilerOptions.kind === 'object') {
const enableIvy = json_utils_1.findPropertyInAstObject(ngCompilerOptions, 'enableIvy');
if (enableIvy) {
return !!enableIvy.value;
}
}
const configExtends = json_utils_1.findPropertyInAstObject(tsCfgAst, 'extends');
if (configExtends && configExtends.kind === 'string') {
const extendedTsConfigPath = core_1.resolve(core_1.dirname(core_1.normalize(tsConfigPath)), core_1.normalize(configExtends.value));
return isIvyEnabled(tree, extendedTsConfigPath);
}
return true;
}
exports.isIvyEnabled = isIvyEnabled;
// TS represents paths internally with '/' and expects paths to be in this format.
// angular.json expects paths with '/', but doesn't enforce them.
function forwardSlashPath(path) {
return path.replace(/\\/g, '/');
}
exports.forwardSlashPath = forwardSlashPath;