From e6b59e44efffd074bc9f5c7ba4c89c5133ccd562 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Fri, 15 Jun 2018 14:53:53 +0200 Subject: [PATCH] fix(@schematics/angular): add `baseUrl` in root tsconfig when migrating Closes: #11258 --- .../angular/migrations/update-6/index.ts | 40 +++++++++++++++++++ .../angular/migrations/update-6/index_spec.ts | 21 ++++++++++ 2 files changed, 61 insertions(+) diff --git a/packages/schematics/angular/migrations/update-6/index.ts b/packages/schematics/angular/migrations/update-6/index.ts index a6cf7c0c32..ab829d5f44 100644 --- a/packages/schematics/angular/migrations/update-6/index.ts +++ b/packages/schematics/angular/migrations/update-6/index.ts @@ -32,6 +32,7 @@ import { addPackageJsonDependency, } from '../../utility/dependencies'; import { + appendPropertyInAstObject, appendValueInAstArray, findPropertyInAstObject, } from '../../utility/json-utils'; @@ -724,6 +725,44 @@ function updateTsLintConfig(): Rule { }; } +function updateRootTsConfig(): Rule { + return (host: Tree, context: SchematicContext) => { + const tsConfigPath = '/tsconfig.json'; + const buffer = host.read(tsConfigPath); + if (!buffer) { + return; + } + + const tsCfgAst = parseJsonAst(buffer.toString(), JsonParseMode.Loose); + if (tsCfgAst.kind != 'object') { + throw new SchematicsException( + 'Invalid tsconfig. Was expecting an object' + ); + } + + const compilerOptionsAstNode = findPropertyInAstObject(tsCfgAst, 'compilerOptions'); + if (!compilerOptionsAstNode || compilerOptionsAstNode.kind != 'object') { + throw new SchematicsException('Invalid tsconfig "compilerOptions" property; expected an object.'); + } + + if (findPropertyInAstObject(compilerOptionsAstNode, 'baseUrl')) { + return host; + } + + const recorder = host.beginUpdate(tsConfigPath); + appendPropertyInAstObject( + recorder, + compilerOptionsAstNode, + 'baseUrl', + './', + 4, + ); + + host.commitUpdate(recorder); + return host; + }; +} + export default function (): Rule { return (host: Tree, context: SchematicContext) => { if (host.exists('/.angular.json') || host.exists('/angular.json')) { @@ -748,6 +787,7 @@ export default function (): Rule { migrateConfiguration(config, context.logger), updateSpecTsConfig(config), updatePackageJson(config), + updateRootTsConfig(), updateTsLintConfig(), (host: Tree, context: SchematicContext) => { context.logger.warn(tags.oneLine`Some configuration options have been changed, diff --git a/packages/schematics/angular/migrations/update-6/index_spec.ts b/packages/schematics/angular/migrations/update-6/index_spec.ts index 12b430cb5c..118670b215 100644 --- a/packages/schematics/angular/migrations/update-6/index_spec.ts +++ b/packages/schematics/angular/migrations/update-6/index_spec.ts @@ -775,6 +775,27 @@ describe('Migration to v6', () => { }); }); + describe('root ts config', () => { + const rootTsConfig = '/tsconfig.json'; + beforeEach(() => { + tree.create(rootTsConfig, ` + { + "compilerOptions": { + "module": "es2015" + } + } + `); + }); + + it('should add baseUrl', () => { + tree.create(oldConfigPath, JSON.stringify(baseConfig, null, 2)); + tree = schematicRunner.runSchematic('migration-01', defaultOptions, tree); + const content = tree.readContent(rootTsConfig); + const config = JSON.parse(content); + expect(config.compilerOptions.baseUrl).toEqual('./'); + }); + }); + describe('package.json', () => { it('should add a dev dependency to @angular-devkit/build-angular', () => { tree.create(oldConfigPath, JSON.stringify(baseConfig, null, 2));