diff --git a/packages/schematics/angular/migrations/update-9/ivy-libraries.ts b/packages/schematics/angular/migrations/update-9/ivy-libraries.ts index a6edb7b5ef4a..7a13886e26f8 100644 --- a/packages/schematics/angular/migrations/update-9/ivy-libraries.ts +++ b/packages/schematics/angular/migrations/update-9/ivy-libraries.ts @@ -23,7 +23,8 @@ import { getTargets, getWorkspace, readJsonFileAsAstObject } from './utils'; * - Create a prod tsconfig for which disables Ivy and enables VE compilations. */ export function updateLibraries(): Rule { - return (tree: Tree) => { + return (tree, context) => { + const logger = context.logger; const workspacePath = getWorkspacePath(tree); const workspace = getWorkspace(tree); @@ -61,8 +62,14 @@ export function updateLibraries(): Rule { } // tsConfig for production already exists. - const tsConfigAst = readJsonFileAsAstObject(tree, tsConfigOption.value); - const tsConfigRecorder = tree.beginUpdate(tsConfigOption.value); + const tsConfigPath = tsConfigOption.value; + const tsConfigAst = readJsonFileAsAstObject(tree, tsConfigPath); + if (!tsConfigAst) { + logger.warn(`Cannot find file: ${tsConfigPath}`); + continue; + } + + const tsConfigRecorder = tree.beginUpdate(tsConfigPath); const ngCompilerOptions = findPropertyInAstObject(tsConfigAst, 'angularCompilerOptions'); if (!ngCompilerOptions) { // Add angularCompilerOptions to the production tsConfig diff --git a/packages/schematics/angular/migrations/update-9/ngsw-config.ts b/packages/schematics/angular/migrations/update-9/ngsw-config.ts index e6283203dfec..dd8a2baefa50 100644 --- a/packages/schematics/angular/migrations/update-9/ngsw-config.ts +++ b/packages/schematics/angular/migrations/update-9/ngsw-config.ts @@ -5,7 +5,7 @@ * 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, Tree } from '@angular-devkit/schematics'; +import { Rule } from '@angular-devkit/schematics'; import { appendValueInAstArray, findPropertyInAstObject } from '../../utility/json-utils'; import { Builders } from '../../utility/workspace-models'; import { getAllOptions, getTargets, getWorkspace, readJsonFileAsAstObject } from './utils'; @@ -15,13 +15,15 @@ import { getAllOptions, getTargets, getWorkspace, readJsonFileAsAstObject } from * Update ngsw-config.json to fix issue https://github.com/angular/angular-cli/pull/15277 */ export function updateNGSWConfig(): Rule { - return (tree: Tree) => { + return (tree, context) => { const workspace = getWorkspace(tree); + const logger = context.logger; for (const { target } of getTargets(workspace, 'build', Builders.Browser)) { for (const options of getAllOptions(target)) { const ngswConfigPath = findPropertyInAstObject(options, 'ngswConfigPath'); if (!ngswConfigPath || ngswConfigPath.kind !== 'string') { + logger.warn(`Cannot find file: ${ngswConfigPath}`); continue; } diff --git a/packages/schematics/angular/migrations/update-9/remove-tsickle.ts b/packages/schematics/angular/migrations/update-9/remove-tsickle.ts index 283cb9c3162e..7d975976e95a 100644 --- a/packages/schematics/angular/migrations/update-9/remove-tsickle.ts +++ b/packages/schematics/angular/migrations/update-9/remove-tsickle.ts @@ -5,20 +5,19 @@ * 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 { JsonParseMode, parseJsonAst } from '@angular-devkit/core'; -import { Rule, Tree } from '@angular-devkit/schematics'; +import { Rule } from '@angular-devkit/schematics'; import { removePackageJsonDependency } from '../../utility/dependencies'; import { findPropertyInAstObject, removePropertyInAstObject } from '../../utility/json-utils'; import { Builders } from '../../utility/workspace-models'; -import { getAllOptions, getTargets, getWorkspace } from './utils'; +import { getAllOptions, getTargets, getWorkspace, readJsonFileAsAstObject } from './utils'; /** * Remove tsickle from libraries */ export function removeTsickle(): Rule { - return (tree: Tree) => { + return (tree, context) => { removePackageJsonDependency(tree, 'tsickle'); - + const logger = context.logger; const workspace = getWorkspace(tree); for (const { target } of getTargets(workspace, 'build', Builders.NgPackagr)) { @@ -28,20 +27,18 @@ export function removeTsickle(): Rule { continue; } - const tsConfigContent = tree.read(tsConfigOption.value); - if (!tsConfigContent) { - continue; - } + const tsConfigPath = tsConfigOption.value; + const tsConfigAst = readJsonFileAsAstObject(tree, tsConfigPath); + if (!tsConfigAst) { + logger.warn(`Cannot find file: ${tsConfigPath}`); - const tsConfigAst = parseJsonAst(tsConfigContent.toString(), JsonParseMode.Loose); - if (!tsConfigAst || tsConfigAst.kind !== 'object') { continue; } const ngCompilerOptions = findPropertyInAstObject(tsConfigAst, 'angularCompilerOptions'); if (ngCompilerOptions && ngCompilerOptions.kind === 'object') { // remove annotateForClosureCompiler option - const recorder = tree.beginUpdate(tsConfigOption.value); + const recorder = tree.beginUpdate(tsConfigPath); removePropertyInAstObject(recorder, ngCompilerOptions, 'annotateForClosureCompiler'); tree.commitUpdate(recorder); } diff --git a/packages/schematics/angular/migrations/update-9/update-app-tsconfigs.ts b/packages/schematics/angular/migrations/update-9/update-app-tsconfigs.ts index a3bf37cb7739..bac0071376c0 100644 --- a/packages/schematics/angular/migrations/update-9/update-app-tsconfigs.ts +++ b/packages/schematics/angular/migrations/update-9/update-app-tsconfigs.ts @@ -5,7 +5,7 @@ * 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 { JsonAstObject } from '@angular-devkit/core'; +import { JsonAstObject, logging } from '@angular-devkit/core'; import { Rule, Tree, UpdateRecorder } from '@angular-devkit/schematics'; import { posix } from 'path'; import { @@ -16,33 +16,32 @@ import { import { Builders } from '../../utility/workspace-models'; import { getAllOptions, getTargets, getWorkspace, readJsonFileAsAstObject } from './utils'; - /** * Update the tsconfig files for applications * - Removes enableIvy: true * - Sets stricter file inclusions */ export function updateApplicationTsConfigs(): Rule { - return (tree: Tree) => { + return (tree, context) => { const workspace = getWorkspace(tree); for (const { target } of getTargets(workspace, 'build', Builders.Browser)) { - updateTsConfig(tree, target, Builders.Browser); + updateTsConfig(tree, target, Builders.Browser, context.logger); } for (const { target } of getTargets(workspace, 'server', Builders.Server)) { - updateTsConfig(tree, target, Builders.Server); + updateTsConfig(tree, target, Builders.Server, context.logger); } for (const { target } of getTargets(workspace, 'test', Builders.Karma)) { - updateTsConfig(tree, target, Builders.Karma); + updateTsConfig(tree, target, Builders.Karma, context.logger); } return tree; }; } -function updateTsConfig(tree: Tree, builderConfig: JsonAstObject, builderName: Builders) { +function updateTsConfig(tree: Tree, builderConfig: JsonAstObject, builderName: Builders, logger: logging.LoggerApi) { const options = getAllOptions(builderConfig); for (const option of options) { let recorder: UpdateRecorder; @@ -55,6 +54,7 @@ function updateTsConfig(tree: Tree, builderConfig: JsonAstObject, builderName: B const tsConfigPath = tsConfigOption.value; let tsConfigAst = readJsonFileAsAstObject(tree, tsConfigPath); if (!tsConfigAst) { + logger.warn(`Cannot find file: ${tsConfigPath}`); continue; } @@ -78,7 +78,10 @@ function updateTsConfig(tree: Tree, builderConfig: JsonAstObject, builderName: B if (builderName !== Builders.Karma) { // Note: we need to re-read the tsconfig after very commit because // otherwise the updates will be out of sync since we are ammending the same node. - tsConfigAst = readJsonFileAsAstObject(tree, tsConfigPath); + + // we are already checking that tsconfig exists above! + // tslint:disable-next-line: no-non-null-assertion + tsConfigAst = readJsonFileAsAstObject(tree, tsConfigPath) !; const include = findPropertyInAstObject(tsConfigAst, 'include'); if (include && include.kind === 'array') { @@ -109,13 +112,15 @@ function updateTsConfig(tree: Tree, builderConfig: JsonAstObject, builderName: B if (newFiles.length) { recorder = tree.beginUpdate(tsConfigPath); - tsConfigAst = readJsonFileAsAstObject(tree, tsConfigPath); + // tslint:disable-next-line: no-non-null-assertion + tsConfigAst = readJsonFileAsAstObject(tree, tsConfigPath) !; insertPropertyInAstObjectInOrder(recorder, tsConfigAst, 'files', newFiles, 2); tree.commitUpdate(recorder); } recorder = tree.beginUpdate(tsConfigPath); - tsConfigAst = readJsonFileAsAstObject(tree, tsConfigPath); + // tslint:disable-next-line: no-non-null-assertion + tsConfigAst = readJsonFileAsAstObject(tree, tsConfigPath) !; removePropertyInAstObject(recorder, tsConfigAst, 'exclude'); tree.commitUpdate(recorder); } diff --git a/packages/schematics/angular/migrations/update-9/utils.ts b/packages/schematics/angular/migrations/update-9/utils.ts index 074cbf4e67b4..4e51c32cf579 100644 --- a/packages/schematics/angular/migrations/update-9/utils.ts +++ b/packages/schematics/angular/migrations/update-9/utils.ts @@ -85,11 +85,15 @@ export function getAllOptions(builderConfig: JsonAstObject, configurationsOnly = export function getWorkspace(host: Tree): JsonAstObject { const path = getWorkspacePath(host); + const content = readJsonFileAsAstObject(host, path); + if (!content) { + throw new SchematicsException(`Could not find (${path})`); + } - return readJsonFileAsAstObject(host, path); + return content; } -export function readJsonFileAsAstObject(host: Tree, path: string): JsonAstObject { +export function readJsonFileAsAstObject(host: Tree, path: string): JsonAstObject | undefined { const configBuffer = host.read(path); if (!configBuffer) { throw new SchematicsException(`Could not find (${path})`);