66 * found in the LICENSE file at https://angular.io/license
77 */
88import { virtualFs } from '@angular-devkit/core' ;
9+ import { readFileSync , readdirSync } from 'fs' ;
10+ import { dirname , join } from 'path' ;
911import * as ts from 'typescript' ;
1012import { WebpackCompilerHost } from '../compiler_host' ;
1113
@@ -48,14 +50,20 @@ export function getLastNode(sourceFile: ts.SourceFile): ts.Node | null {
4850// Test transform helpers.
4951const basePath = '/project/src/' ;
5052const fileName = basePath + 'test-file.ts' ;
53+ const tsLibFiles = loadTsLibFiles ( ) ;
5154
52- export function createTypescriptContext ( content : string , additionalFiles ?: Record < string , string > ) {
55+ export function createTypescriptContext (
56+ content : string ,
57+ additionalFiles ?: Record < string , string > ,
58+ useLibs = false ,
59+ ) {
5360 // Set compiler options.
5461 const compilerOptions : ts . CompilerOptions = {
55- noEmitOnError : false ,
62+ noEmitOnError : useLibs ,
5663 allowJs : true ,
5764 newLine : ts . NewLineKind . LineFeed ,
5865 moduleResolution : ts . ModuleResolutionKind . NodeJs ,
66+ module : ts . ModuleKind . ESNext ,
5967 target : ts . ScriptTarget . ESNext ,
6068 skipLibCheck : true ,
6169 sourceMap : false ,
@@ -73,6 +81,15 @@ export function createTypescriptContext(content: string, additionalFiles?: Recor
7381 // Add a dummy file to host content.
7482 compilerHost . writeFile ( fileName , content , false ) ;
7583
84+ if ( useLibs ) {
85+ // Write the default libs.
86+ // These are needed for tests that use import(), because it relies on a Promise being there.
87+ const compilerLibFolder = dirname ( compilerHost . getDefaultLibFileName ( compilerOptions ) ) ;
88+ for ( const [ k , v ] of Object . entries ( tsLibFiles ) ) {
89+ compilerHost . writeFile ( join ( compilerLibFolder , k ) , v , false ) ;
90+ }
91+ }
92+
7693 if ( additionalFiles ) {
7794 for ( const key in additionalFiles ) {
7895 compilerHost . writeFile ( basePath + key , additionalFiles [ key ] , false ) ;
@@ -106,13 +123,27 @@ export function transformTypescript(
106123 undefined , undefined , undefined , undefined , { before : transformers } ,
107124 ) ;
108125
109- // Log diagnostics if emit wasn't successfull.
126+ // Throw error with diagnostics if emit wasn't successfull.
110127 if ( emitSkipped ) {
111- console . error ( diagnostics ) ;
112-
113- return null ;
128+ throw new Error ( ts . formatDiagnostics ( diagnostics , compilerHost ) ) ;
114129 }
115130
116131 // Return the transpiled js.
117132 return compilerHost . readFile ( fileName . replace ( / \. t s x ? $ / , '.js' ) ) ;
118133}
134+
135+ function loadTsLibFiles ( ) {
136+ const libFolderPath = dirname ( require . resolve ( 'typescript/lib/lib.d.ts' ) ) ;
137+ const libFolderFiles = readdirSync ( libFolderPath ) ;
138+ const libFileNames = libFolderFiles . filter ( f => f . startsWith ( 'lib.' ) && f . endsWith ( '.d.ts' ) ) ;
139+
140+ // Return a map of the lib names to their content.
141+ return libFileNames . reduce (
142+ ( map , f ) => {
143+ map [ f ] = readFileSync ( join ( libFolderPath , f ) , 'utf-8' ) ;
144+
145+ return map ;
146+ } ,
147+ { } as { [ k : string ] : string } ,
148+ ) ;
149+ }
0 commit comments