From 0d8ab323a77fb9a377944ea137f71f5a3214419e Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Tue, 4 Dec 2018 17:20:55 -0800 Subject: [PATCH] fix(ivy): add missing directoryExists() method to shim CompilerHost (#27470) The method `ts.CompilerHost.directoryExists` is optional, and was not previously handled by our ts.CompilerHost wrapper for factory and summary shims (GeneratedShimsHostWrapper). TypeScript checks for the existence of this method and silently ignores things like typeRoots if it's not found. This commit adds proper handling of directoryExists() to the shim. A test is also added which verifies typeRoots behavior works when shims are enabled. PR Close #27470 --- .../compiler-cli/src/ngtsc/shims/src/host.ts | 5 +++ packages/compiler-cli/test/ngtsc/env.ts | 1 - .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 32 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/src/ngtsc/shims/src/host.ts b/packages/compiler-cli/src/ngtsc/shims/src/host.ts index 58a9d551b3..578ff10424 100644 --- a/packages/compiler-cli/src/ngtsc/shims/src/host.ts +++ b/packages/compiler-cli/src/ngtsc/shims/src/host.ts @@ -39,11 +39,16 @@ export class GeneratedShimsHostWrapper implements ts.CompilerHost { (delegate.resolveTypeReferenceDirectives as ts3ResolveTypeReferenceDirectives) !( names, containingFile); } + if (delegate.directoryExists !== undefined) { + this.directoryExists = (directoryName: string) => delegate.directoryExists !(directoryName); + } } resolveTypeReferenceDirectives?: (names: string[], containingFile: string) => ts.ResolvedTypeReferenceDirective[]; + directoryExists?: (directoryName: string) => boolean; + getSourceFile( fileName: string, languageVersion: ts.ScriptTarget, onError?: ((message: string) => void)|undefined, diff --git a/packages/compiler-cli/test/ngtsc/env.ts b/packages/compiler-cli/test/ngtsc/env.ts index 54ecd951f8..6fbf828c73 100644 --- a/packages/compiler-cli/test/ngtsc/env.ts +++ b/packages/compiler-cli/test/ngtsc/env.ts @@ -57,7 +57,6 @@ export class NgtscTestEnvironment { "skipLibCheck": true, "noImplicitAny": true, "strictNullChecks": true, - "types": [], "outDir": "built", "rootDir": ".", "baseUrl": ".", diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 11a070e63c..79192f1d01 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -1046,4 +1046,36 @@ describe('ngtsc behavioral tests', () => { }); }); }); + + it('should compile programs with typeRoots', () => { + // Write out a custom tsconfig.json that includes 'typeRoots' and 'files'. 'files' is necessary + // because otherwise TS picks up the testTypeRoot/test/index.d.ts file into the program + // automatically. Shims are also turned on (via allowEmptyCodegenFiles) because the shim + // ts.CompilerHost wrapper can break typeRoot functionality (which this test is meant to + // detect). + env.write('tsconfig.json', `{ + "extends": "./tsconfig-base.json", + "angularCompilerOptions": { + "allowEmptyCodegenFiles": true + }, + "compilerOptions": { + "typeRoots": ["./testTypeRoot"], + }, + "files": ["./test.ts"] + }`); + env.write('test.ts', ` + import {Test} from 'ambient'; + console.log(Test); + `); + env.write('testTypeRoot/.exists', ''); + env.write('testTypeRoot/test/index.d.ts', ` + declare module 'ambient' { + export const Test = 'This is a test'; + } + `); + + env.driveMain(); + + // Success is enough to indicate that this passes. + }); });