| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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
 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  | import {Statement} from '@angular/compiler'; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  | import {fromObject, generateMapFileComment, SourceMapConverter} from 'convert-source-map'; | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  | import MagicString from 'magic-string'; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  | import {encode, SourceMapMappings} from 'sourcemap-codec'; | 
					
						
							| 
									
										
										
										
											2018-11-25 21:40:25 +00:00
										 |  |  | import * as ts from 'typescript'; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  | import {absoluteFrom, getFileSystem} from '../../../src/ngtsc/file_system'; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  | import {runInEachFileSystem, TestFile} from '../../../src/ngtsc/file_system/testing'; | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  | import {NOOP_DEFAULT_IMPORT_RECORDER, Reexport} from '../../../src/ngtsc/imports'; | 
					
						
							| 
									
										
										
										
											2020-05-14 20:06:12 +01:00
										 |  |  | import {MockLogger} from '../../../src/ngtsc/logging/testing'; | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  | import {Import, ImportManager, translateStatement} from '../../../src/ngtsc/translator'; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  | import {loadTestFiles} from '../../../test/helpers'; | 
					
						
							| 
									
										
										
										
											2019-07-18 21:05:32 +01:00
										 |  |  | import {DecorationAnalyzer} from '../../src/analysis/decoration_analyzer'; | 
					
						
							| 
									
										
										
										
											2019-04-28 20:48:35 +01:00
										 |  |  | import {ModuleWithProvidersInfo} from '../../src/analysis/module_with_providers_analyzer'; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  | import {NgccReferencesRegistry} from '../../src/analysis/ngcc_references_registry'; | 
					
						
							|  |  |  | import {ExportInfo, PrivateDeclarationsAnalyzer} from '../../src/analysis/private_declarations_analyzer'; | 
					
						
							| 
									
										
										
										
											2018-10-04 12:19:11 +01:00
										 |  |  | import {SwitchMarkerAnalyzer} from '../../src/analysis/switch_marker_analyzer'; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  | import {CompiledClass} from '../../src/analysis/types'; | 
					
						
							| 
									
										
										
										
											2018-10-10 14:17:32 +01:00
										 |  |  | import {Esm2015ReflectionHost} from '../../src/host/esm2015_host'; | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  | import {Esm5ReflectionHost} from '../../src/host/esm5_host'; | 
					
						
							| 
									
										
										
										
											2019-04-28 20:48:35 +01:00
										 |  |  | import {Renderer} from '../../src/rendering/renderer'; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  | import {RedundantDecoratorMap, RenderingFormatter} from '../../src/rendering/rendering_formatter'; | 
					
						
							|  |  |  | import {getRootFiles, makeTestEntryPointBundle} from '../helpers/utils'; | 
					
						
							| 
									
										
										
										
											2019-04-28 20:47:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-28 20:48:35 +01:00
										 |  |  | class TestRenderingFormatter implements RenderingFormatter { | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  |   private printer = ts.createPrinter({newLine: ts.NewLineKind.LineFeed}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-28 20:48:33 +01:00
										 |  |  |   addImports(output: MagicString, imports: Import[], sf: ts.SourceFile) { | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  |     output.prepend('\n// ADD IMPORTS\n'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-28 20:48:35 +01:00
										 |  |  |   addExports(output: MagicString, baseEntryPointPath: string, exports: ExportInfo[]) { | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |     output.prepend('\n// ADD EXPORTS\r\n'); | 
					
						
							| 
									
										
										
										
											2018-11-25 22:07:51 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-10-14 13:04:42 -07:00
										 |  |  |   addDirectExports(output: MagicString, exports: Reexport[]): void { | 
					
						
							|  |  |  |     output.prepend('\n// ADD DIRECT EXPORTS\n'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-06-27 08:41:11 -07:00
										 |  |  |   addConstants(output: MagicString, constants: string, file: ts.SourceFile): void { | 
					
						
							|  |  |  |     output.prepend('\n// ADD CONSTANTS\n'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-10-16 08:56:54 +01:00
										 |  |  |   addDefinitions(output: MagicString, compiledClass: CompiledClass, definitions: string) { | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  |     output.prepend('\n// ADD DEFINITIONS\n'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |   addAdjacentStatements(output: MagicString, compiledClass: CompiledClass, statements: string) { | 
					
						
							|  |  |  |     output.prepend('\n// ADD ADJACENT STATEMENTS\n'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-11-18 21:37:30 +01:00
										 |  |  |   removeDecorators(output: MagicString, decoratorsToRemove: RedundantDecoratorMap) { | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  |     output.prepend('\n// REMOVE DECORATORS\n'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-08-17 07:50:45 +01:00
										 |  |  |   rewriteSwitchableDeclarations(output: MagicString, sourceFile: ts.SourceFile): void { | 
					
						
							|  |  |  |     output.prepend('\n// REWRITTEN DECLARATIONS\n'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-28 20:48:35 +01:00
										 |  |  |   addModuleWithProvidersParams( | 
					
						
							|  |  |  |       output: MagicString, moduleWithProviders: ModuleWithProvidersInfo[], | 
					
						
							|  |  |  |       importManager: ImportManager): void { | 
					
						
							|  |  |  |     output.prepend('\n// ADD MODUlE WITH PROVIDERS PARAMS\n'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  |   printStatement(stmt: Statement, sourceFile: ts.SourceFile, importManager: ImportManager): string { | 
					
						
							|  |  |  |     const node = translateStatement( | 
					
						
							|  |  |  |         stmt, importManager, NOOP_DEFAULT_IMPORT_RECORDER, ts.ScriptTarget.ES2015); | 
					
						
							|  |  |  |     const code = this.printer.printNode(ts.EmitHint.Unspecified, node, sourceFile); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return `// TRANSPILED\n${code}`; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-11 19:16:04 +01:00
										 |  |  | function createTestRenderer( | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |     packageName: string, files: TestFile[], dtsFiles?: TestFile[], mappingFiles?: TestFile[], | 
					
						
							|  |  |  |     isEs5 = false) { | 
					
						
							| 
									
										
										
										
											2019-03-29 10:13:14 +00:00
										 |  |  |   const logger = new MockLogger(); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |   loadTestFiles(files); | 
					
						
							|  |  |  |   if (dtsFiles) { | 
					
						
							|  |  |  |     loadTestFiles(dtsFiles); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (mappingFiles) { | 
					
						
							|  |  |  |     loadTestFiles(mappingFiles); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   const fs = getFileSystem(); | 
					
						
							| 
									
										
										
										
											2018-11-25 21:40:25 +00:00
										 |  |  |   const isCore = packageName === '@angular/core'; | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |   const bundle = makeTestEntryPointBundle( | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |       'test-package', 'esm5', isCore, getRootFiles(files), dtsFiles && getRootFiles(dtsFiles)); | 
					
						
							| 
									
										
										
										
											2019-12-18 14:03:04 +00:00
										 |  |  |   const host = isEs5 ? new Esm5ReflectionHost(logger, isCore, bundle.src, bundle.dts) : | 
					
						
							|  |  |  |                        new Esm2015ReflectionHost(logger, isCore, bundle.src, bundle.dts); | 
					
						
							| 
									
										
										
										
											2018-11-13 14:40:54 +00:00
										 |  |  |   const referencesRegistry = new NgccReferencesRegistry(host); | 
					
						
							| 
									
										
										
										
											2019-05-25 20:53:52 +01:00
										 |  |  |   const decorationAnalyses = | 
					
						
							|  |  |  |       new DecorationAnalyzer(fs, bundle, host, referencesRegistry).analyzeProgram(); | 
					
						
							| 
									
										
										
										
											2020-06-08 22:04:28 +03:00
										 |  |  |   const switchMarkerAnalyses = new SwitchMarkerAnalyzer(host, bundle.entryPoint.packagePath) | 
					
						
							|  |  |  |                                    .analyzeProgram(bundle.src.program); | 
					
						
							| 
									
										
										
										
											2018-11-25 22:07:51 +00:00
										 |  |  |   const privateDeclarationsAnalyses = | 
					
						
							|  |  |  |       new PrivateDeclarationsAnalyzer(host, referencesRegistry).analyzeProgram(bundle.src.program); | 
					
						
							| 
									
										
										
										
											2019-04-28 20:48:35 +01:00
										 |  |  |   const testFormatter = new TestRenderingFormatter(); | 
					
						
							|  |  |  |   spyOn(testFormatter, 'addExports').and.callThrough(); | 
					
						
							|  |  |  |   spyOn(testFormatter, 'addImports').and.callThrough(); | 
					
						
							|  |  |  |   spyOn(testFormatter, 'addDefinitions').and.callThrough(); | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |   spyOn(testFormatter, 'addAdjacentStatements').and.callThrough(); | 
					
						
							| 
									
										
										
										
											2019-04-28 20:48:35 +01:00
										 |  |  |   spyOn(testFormatter, 'addConstants').and.callThrough(); | 
					
						
							|  |  |  |   spyOn(testFormatter, 'removeDecorators').and.callThrough(); | 
					
						
							|  |  |  |   spyOn(testFormatter, 'rewriteSwitchableDeclarations').and.callThrough(); | 
					
						
							|  |  |  |   spyOn(testFormatter, 'addModuleWithProvidersParams').and.callThrough(); | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  |   spyOn(testFormatter, 'printStatement').and.callThrough(); | 
					
						
							| 
									
										
										
										
											2019-04-28 20:48:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |   const renderer = new Renderer(host, testFormatter, fs, logger, bundle); | 
					
						
							| 
									
										
										
										
											2018-09-28 14:57:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |   return { | 
					
						
							|  |  |  |     renderer, | 
					
						
							|  |  |  |     testFormatter, | 
					
						
							|  |  |  |     decorationAnalyses, | 
					
						
							|  |  |  |     switchMarkerAnalyses, | 
					
						
							|  |  |  |     privateDeclarationsAnalyses, | 
					
						
							|  |  |  |     bundle | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  | runInEachFileSystem(() => { | 
					
						
							|  |  |  |   describe('Renderer', () => { | 
					
						
							|  |  |  |     let _: typeof absoluteFrom; | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |     let TS_CONTENT: TestFile; | 
					
						
							|  |  |  |     let JS_CONTENT: TestFile; | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |     let COMPONENT_PROGRAM: TestFile; | 
					
						
							| 
									
										
										
										
											2019-07-30 15:57:46 -07:00
										 |  |  |     let NGMODULE_PROGRAM: TestFile; | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |     let JS_CONTENT_MAP: SourceMapConverter; | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |     let RENDERED_CONTENTS: string; | 
					
						
							|  |  |  |     let OUTPUT_PROGRAM_MAP: SourceMapConverter; | 
					
						
							|  |  |  |     let MERGED_OUTPUT_PROGRAM_MAP: SourceMapConverter; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => { | 
					
						
							|  |  |  |       _ = absoluteFrom; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |       TS_CONTENT = { | 
					
						
							|  |  |  |         name: _('/node_modules/test-package/src/file.ts'), | 
					
						
							|  |  |  |         contents: | 
					
						
							|  |  |  |             `import {Directive} from '@angular/core';\n@Directive({selector: '[a]'})\nexport class A {\n  foo(x: number): number { return x; }\n}` | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       JS_CONTENT = { | 
					
						
							| 
									
										
										
										
											2019-05-25 21:34:40 +01:00
										 |  |  |         name: _('/node_modules/test-package/src/file.js'), | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |         contents: | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |             `import { Directive } from '@angular/core';\nexport class A {\n    foo(x) {\r\n        return x;\n    }\r\n}\nA.decorators = [\n    { type: Directive, args: [{ selector: '[a]' }] }\r\n];\n` | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       COMPONENT_PROGRAM = { | 
					
						
							| 
									
										
										
										
											2019-05-25 21:34:40 +01:00
										 |  |  |         name: _('/node_modules/test-package/src/component.js'), | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |         contents: | 
					
						
							|  |  |  |             `import { Component } from '@angular/core';\nexport class A {}\nA.decorators = [\n    { type: Component, args: [{ selector: 'a', template: '{{ person!.name }}' }] }\n];\n` | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-30 15:57:46 -07:00
										 |  |  |       NGMODULE_PROGRAM = { | 
					
						
							|  |  |  |         name: _('/node_modules/test-package/src/ngmodule.js'), | 
					
						
							|  |  |  |         contents: | 
					
						
							|  |  |  |             `import { NgModule } from '@angular/core';\nexport class A {}\nA.decorators = [\n    { type: NgModule, args: [{}] }\n];\n` | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |       const JS_CONTENT_MAPPINGS: SourceMapMappings = [ | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |           [0, 0, 0, 0], [7, 0, 0, 7], [9, 0, 0, 8], [18, 0, 0, 17], [20, 0, 0, 18], [26, 0, 0, 24], | 
					
						
							|  |  |  |           [41, 0, 0, 39], [42, 0, 0, 40] | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         [[0, 0, 2, 0], [4, 0, 2, 13], [5, 0, 2, 14], [8, 0, 2, 0], [14, 0, 2, 13], [15, 0, 2, 14]], | 
					
						
							|  |  |  |         [[4, 0, 3, 2], [7, 0, 3, 5], [8, 0, 3, 6], [9, 0, 3, 15]], | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |           [0, 0, 3, 27], [7, 0, 3, 34], [8, 0, 3, 35], [9, 0, 3, 36], [10, 0, 3, 37], | 
					
						
							|  |  |  |           [11, 0, 3, 38], [1, 0, 4, 1], [2, 0, 4, 1] | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         [[0, 0, 2, 13], [1, 0, 2, 14]], | 
					
						
							|  |  |  |         [], | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |           [2, 0, 1, 1], [11, 0, 1, 10], [12, 0, 1, 11], [14, 0, 1, 12], [3, 0, 2, 13], | 
					
						
							|  |  |  |           [4, 0, 2, 14], [5, 0, 4, 1] | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |           [5, 0, 1, 20], [7, 0, 1, 22], [12, 0, 1, 27], [14, 0, 1, 28], [15, 0, 1, 29], | 
					
						
							|  |  |  |           [9, 0, 2, 13], [10, 0, 2, 14] | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       JS_CONTENT_MAP = fromObject({ | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |         'version': 3, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         'file': 'file.js', | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |         'sourceRoot': '', | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         'sources': ['file.ts'], | 
					
						
							|  |  |  |         'sourcesContent': [TS_CONTENT.contents], | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |         'names': [], | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         'mappings': encode(JS_CONTENT_MAPPINGS), | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-09-28 14:57:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |       RENDERED_CONTENTS = | 
					
						
							|  |  |  |           `\n// ADD IMPORTS\n\n// ADD EXPORTS\r\n\n// ADD CONSTANTS\n\n// ADD ADJACENT STATEMENTS\n\n// ADD DEFINITIONS\n\n// REMOVE DECORATORS\n` + | 
					
						
							|  |  |  |           JS_CONTENT.contents; | 
					
						
							| 
									
										
										
										
											2018-10-04 12:19:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       OUTPUT_PROGRAM_MAP = fromObject({ | 
					
						
							|  |  |  |         'version': 3, | 
					
						
							|  |  |  |         'file': 'file.js', | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         'sources': ['file.js'], | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |         'names': [], | 
					
						
							| 
									
										
										
										
											2020-02-27 19:50:14 +00:00
										 |  |  |         'mappings': encode([[], [], [], [], [], [], [], [], [], [], [], [], [[0, 0, 0, 0]]]), | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         'sourcesContent': [JS_CONTENT.contents], | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |       const MERGED_OUTPUT_PROGRAM_MAPPINGS: SourceMapMappings = | 
					
						
							| 
									
										
										
										
											2020-02-27 19:50:14 +00:00
										 |  |  |           [[], [], [], [], [], [], [], [], [], [], [], [], ...JS_CONTENT_MAPPINGS]; | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       MERGED_OUTPUT_PROGRAM_MAP = fromObject({ | 
					
						
							|  |  |  |         'version': 3, | 
					
						
							|  |  |  |         'file': 'file.js', | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         'sources': ['file.ts'], | 
					
						
							|  |  |  |         'names': [], | 
					
						
							|  |  |  |         'mappings': encode(MERGED_OUTPUT_PROGRAM_MAPPINGS), | 
					
						
							|  |  |  |         'sourcesContent': [TS_CONTENT.contents], | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('renderProgram()', () => { | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |       it('should render the modified contents; with an inline map file, if the original provided no map file.', | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |          () => { | 
					
						
							|  |  |  |            const {renderer, decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses} = | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |                createTestRenderer('test-package', [JS_CONTENT]); | 
					
						
							|  |  |  |            const [sourceFile, mapFile] = renderer.renderProgram( | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |                decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |            expect(sourceFile.path).toEqual(_('/node_modules/test-package/src/file.js')); | 
					
						
							|  |  |  |            expect(sourceFile.contents) | 
					
						
							|  |  |  |                .toEqual(RENDERED_CONTENTS + '\n' + OUTPUT_PROGRAM_MAP.toComment()); | 
					
						
							|  |  |  |            expect(mapFile).toBeUndefined(); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |          }); | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should render as JavaScript', () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |         const { | 
					
						
							|  |  |  |           renderer, | 
					
						
							|  |  |  |           decorationAnalyses, | 
					
						
							|  |  |  |           switchMarkerAnalyses, | 
					
						
							|  |  |  |           privateDeclarationsAnalyses, | 
					
						
							|  |  |  |           testFormatter | 
					
						
							|  |  |  |         } = createTestRenderer('test-package', [COMPONENT_PROGRAM]); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |         renderer.renderProgram( | 
					
						
							|  |  |  |             decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  |         const addDefinitionsSpy = testFormatter.addDefinitions as jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  |         expect(addDefinitionsSpy.calls.first().args[2]).toEqual(`// TRANSPILED
 | 
					
						
							|  |  |  | A.ɵfac = function A_Factory(t) { return new (t || A)(); }; | 
					
						
							|  |  |  | // TRANSPILED
 | 
					
						
							| 
									
										
										
										
											2019-10-10 14:57:15 -07:00
										 |  |  | A.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: A, selectors: [["a"]], decls: 1, vars: 1, template: function A_Template(rf, ctx) { if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         ɵngcc0.ɵɵtext(0); | 
					
						
							| 
									
										
										
										
											2018-12-10 17:34:56 +01:00
										 |  |  |     } if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-04-23 20:40:05 -07:00
										 |  |  |         ɵngcc0.ɵɵtextInterpolate(ctx.person.name); | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |     } }, encapsulation: 2 });`);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  |         expect(addAdjacentStatementsSpy.calls.first().args[2]).toEqual(`// TRANSPILED
 | 
					
						
							| 
									
										
										
										
											2019-07-31 15:20:56 -07:00
										 |  |  | /*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(A, [{ | 
					
						
							| 
									
										
										
										
											2019-03-29 21:31:22 +01:00
										 |  |  |         type: Component, | 
					
						
							|  |  |  |         args: [{ selector: 'a', template: '{{ person!.name }}' }] | 
					
						
							| 
									
										
										
										
											2019-07-31 15:20:56 -07:00
										 |  |  |     }], null, null); })();`);
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-12-10 17:34:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       describe('calling RenderingFormatter methods', () => { | 
					
						
							|  |  |  |         it('should call addImports with the source code and info about the core Angular library.', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |              const { | 
					
						
							|  |  |  |                renderer, | 
					
						
							|  |  |  |                decorationAnalyses, | 
					
						
							|  |  |  |                switchMarkerAnalyses, | 
					
						
							|  |  |  |                privateDeclarationsAnalyses, | 
					
						
							|  |  |  |                testFormatter | 
					
						
							|  |  |  |              } = createTestRenderer('test-package', [JS_CONTENT]); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |              const result = renderer.renderProgram( | 
					
						
							|  |  |  |                  decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  |              const addImportsSpy = testFormatter.addImports as jasmine.Spy; | 
					
						
							|  |  |  |              expect(addImportsSpy.calls.first().args[0].toString()).toEqual(RENDERED_CONTENTS); | 
					
						
							|  |  |  |              expect(addImportsSpy.calls.first().args[1]).toEqual([ | 
					
						
							|  |  |  |                {specifier: '@angular/core', qualifier: 'ɵngcc0'} | 
					
						
							|  |  |  |              ]); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should call addDefinitions with the source code, the analyzed class and the rendered definitions.', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |              const { | 
					
						
							|  |  |  |                renderer, | 
					
						
							|  |  |  |                decorationAnalyses, | 
					
						
							|  |  |  |                switchMarkerAnalyses, | 
					
						
							|  |  |  |                privateDeclarationsAnalyses, | 
					
						
							|  |  |  |                testFormatter | 
					
						
							|  |  |  |              } = createTestRenderer('test-package', [JS_CONTENT]); | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |              renderer.renderProgram( | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |                  decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  |              const addDefinitionsSpy = testFormatter.addDefinitions as jasmine.Spy; | 
					
						
							|  |  |  |              expect(addDefinitionsSpy.calls.first().args[0].toString()).toEqual(RENDERED_CONTENTS); | 
					
						
							|  |  |  |              expect(addDefinitionsSpy.calls.first().args[1]).toEqual(jasmine.objectContaining({ | 
					
						
							|  |  |  |                name: 'A', | 
					
						
							|  |  |  |                decorators: [jasmine.objectContaining({name: 'Directive'})] | 
					
						
							|  |  |  |              })); | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  |              expect(addDefinitionsSpy.calls.first().args[2]).toEqual(`// TRANSPILED
 | 
					
						
							|  |  |  | A.ɵfac = function A_Factory(t) { return new (t || A)(); }; | 
					
						
							|  |  |  | // TRANSPILED
 | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  | A.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: A, selectors: [["", "a", ""]] });`);
 | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should call addAdjacentStatements with the source code, the analyzed class and the rendered statements', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |              const { | 
					
						
							|  |  |  |                renderer, | 
					
						
							|  |  |  |                decorationAnalyses, | 
					
						
							|  |  |  |                switchMarkerAnalyses, | 
					
						
							|  |  |  |                privateDeclarationsAnalyses, | 
					
						
							|  |  |  |                testFormatter | 
					
						
							|  |  |  |              } = createTestRenderer('test-package', [JS_CONTENT]); | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |              renderer.renderProgram( | 
					
						
							|  |  |  |                  decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  |              const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							|  |  |  |              expect(addAdjacentStatementsSpy.calls.first().args[0].toString()) | 
					
						
							|  |  |  |                  .toEqual(RENDERED_CONTENTS); | 
					
						
							|  |  |  |              expect(addAdjacentStatementsSpy.calls.first().args[1]) | 
					
						
							|  |  |  |                  .toEqual(jasmine.objectContaining( | 
					
						
							|  |  |  |                      {name: 'A', decorators: [jasmine.objectContaining({name: 'Directive'})]})); | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  |              expect(addAdjacentStatementsSpy.calls.first().args[2]).toEqual(`// TRANSPILED
 | 
					
						
							| 
									
										
										
										
											2019-07-31 15:20:56 -07:00
										 |  |  | /*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(A, [{ | 
					
						
							| 
									
										
										
										
											2018-10-30 11:19:10 -07:00
										 |  |  |         type: Directive, | 
					
						
							|  |  |  |         args: [{ selector: '[a]' }] | 
					
						
							| 
									
										
										
										
											2019-07-31 15:20:56 -07:00
										 |  |  |     }], null, null); })();`);
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should call removeDecorators with the source code, a map of class decorators that have been analyzed', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |              const { | 
					
						
							|  |  |  |                renderer, | 
					
						
							|  |  |  |                decorationAnalyses, | 
					
						
							|  |  |  |                switchMarkerAnalyses, | 
					
						
							|  |  |  |                privateDeclarationsAnalyses, | 
					
						
							|  |  |  |                testFormatter | 
					
						
							|  |  |  |              } = createTestRenderer('test-package', [JS_CONTENT]); | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  |              renderer.renderProgram( | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |                  decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  |              const removeDecoratorsSpy = testFormatter.removeDecorators as jasmine.Spy; | 
					
						
							|  |  |  |              expect(removeDecoratorsSpy.calls.first().args[0].toString()) | 
					
						
							|  |  |  |                  .toEqual(RENDERED_CONTENTS); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              // Each map key is the TS node of the decorator container
 | 
					
						
							|  |  |  |              // Each map value is an array of TS nodes that are the decorators to remove
 | 
					
						
							|  |  |  |              const map = removeDecoratorsSpy.calls.first().args[1] as Map<ts.Node, ts.Node[]>; | 
					
						
							|  |  |  |              const keys = Array.from(map.keys()); | 
					
						
							|  |  |  |              expect(keys.length).toEqual(1); | 
					
						
							|  |  |  |              expect(keys[0].getText()) | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |                  .toEqual(`[\n    { type: Directive, args: [{ selector: '[a]' }] }\r\n]`); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |              const values = Array.from(map.values()); | 
					
						
							|  |  |  |              expect(values.length).toEqual(1); | 
					
						
							|  |  |  |              expect(values[0].length).toEqual(1); | 
					
						
							|  |  |  |              expect(values[0][0].getText()) | 
					
						
							|  |  |  |                  .toEqual(`{ type: Directive, args: [{ selector: '[a]' }] }`); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |         it('should render definitions as static fields', () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = createTestRenderer('test-package', [NGMODULE_PROGRAM]); | 
					
						
							| 
									
										
										
										
											2019-07-30 15:57:46 -07:00
										 |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  |           const addDefinitionsSpy = testFormatter.addDefinitions as jasmine.Spy; | 
					
						
							|  |  |  |           const definitions: string = addDefinitionsSpy.calls.first().args[2]; | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           expect(definitions).toContain('A.ɵmod = ɵngcc0.ɵɵdefineNgModule('); | 
					
						
							|  |  |  |           expect(definitions).toContain('A.ɵinj = ɵngcc0.ɵɵdefineInjector('); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should render adjacent statements', () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = createTestRenderer('test-package', [NGMODULE_PROGRAM]); | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  |           const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							|  |  |  |           const statements: string = addAdjacentStatementsSpy.calls.first().args[2]; | 
					
						
							|  |  |  |           expect(statements).toContain('ɵsetClassMetadata(A'); | 
					
						
							| 
									
										
										
										
											2019-07-30 15:57:46 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |         it('should render directives using the inner class name if different from outer', () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |               createTestRenderer( | 
					
						
							|  |  |  |                   'test-package', [{ | 
					
						
							|  |  |  |                     name: _('/node_modules/test-package/src/file.js'), | 
					
						
							|  |  |  |                     contents: `
 | 
					
						
							|  |  |  |                       import { Directive } from '@angular/core'; | 
					
						
							|  |  |  |                       var OuterClass = /** @class */ (function () { | 
					
						
							|  |  |  |                         function InnerClass() {} | 
					
						
							|  |  |  |                         return InnerClass; | 
					
						
							|  |  |  |                       }()); | 
					
						
							|  |  |  |                       OuterClass.decorators = [{ type: Directive, args: [{ selector: '[test]' }] | 
					
						
							|  |  |  |                       export OuterClass;`
 | 
					
						
							|  |  |  |                   }], | 
					
						
							|  |  |  |                   undefined, undefined, /* isEs5 */ true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const addDefinitionsSpy = testFormatter.addDefinitions as jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           const definitions = addDefinitionsSpy.calls.first().args[2]; | 
					
						
							|  |  |  |           expect(definitions).toContain('InnerClass.ɵfac'); | 
					
						
							|  |  |  |           expect(definitions).toContain('new (t || InnerClass)'); | 
					
						
							|  |  |  |           expect(definitions).toContain('InnerClass.ɵdir'); | 
					
						
							|  |  |  |           expect(definitions).toContain('type: InnerClass'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							|  |  |  |           const statements = addAdjacentStatementsSpy.calls.first().args[2]; | 
					
						
							|  |  |  |           expect(statements).toContain('ɵsetClassMetadata(InnerClass'); | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should render injectables using the inner class name if different from outer', () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |               createTestRenderer( | 
					
						
							|  |  |  |                   'test-package', [{ | 
					
						
							|  |  |  |                     name: _('/node_modules/test-package/src/file.js'), | 
					
						
							|  |  |  |                     contents: `
 | 
					
						
							|  |  |  |                       import { Injectable } from '@angular/core'; | 
					
						
							|  |  |  |                       var OuterClass = /** @class */ (function () { | 
					
						
							|  |  |  |                         function InnerClass() {} | 
					
						
							|  |  |  |                         return InnerClass; | 
					
						
							|  |  |  |                       }()); | 
					
						
							|  |  |  |                       OuterClass.decorators = [{ type: Injectable }] | 
					
						
							|  |  |  |                       export OuterClass;`
 | 
					
						
							|  |  |  |                   }], | 
					
						
							|  |  |  |                   undefined, undefined, /* isEs5 */ true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const addDefinitionsSpy = testFormatter.addDefinitions as jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           const definitions = addDefinitionsSpy.calls.first().args[2]; | 
					
						
							|  |  |  |           expect(definitions).toContain('InnerClass.ɵfac'); | 
					
						
							|  |  |  |           expect(definitions).toContain('new (t || InnerClass)()'); | 
					
						
							|  |  |  |           expect(definitions).toContain('InnerClass.ɵprov'); | 
					
						
							|  |  |  |           expect(definitions).toContain('token: InnerClass'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							|  |  |  |           const statements = addAdjacentStatementsSpy.calls.first().args[2]; | 
					
						
							|  |  |  |           expect(statements).toContain('ɵsetClassMetadata(InnerClass'); | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should render ng-modules using the inner class name if different from outer', () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |               createTestRenderer( | 
					
						
							|  |  |  |                   'test-package', [{ | 
					
						
							|  |  |  |                     name: _('/node_modules/test-package/src/file.js'), | 
					
						
							|  |  |  |                     contents: `
 | 
					
						
							|  |  |  |                       import { NgModule, Directive } from '@angular/core'; | 
					
						
							|  |  |  |                       var DirectiveClass = /** @class */ (function () { | 
					
						
							|  |  |  |                         function DirectiveClass() {} | 
					
						
							|  |  |  |                         return DirectiveClass; | 
					
						
							|  |  |  |                       }()); | 
					
						
							|  |  |  |                       DirectiveClass.decorators = [{ type: Directive, args: [{selector: 'x'}] }]; | 
					
						
							|  |  |  |                       var OuterClass = /** @class */ (function () { | 
					
						
							|  |  |  |                         function InnerClass() {} | 
					
						
							|  |  |  |                         return InnerClass; | 
					
						
							|  |  |  |                       }()); | 
					
						
							|  |  |  |                       OuterClass.decorators = [{ type: NgModule, args: [{declarations: [DirectiveClass], exports: [DirectiveClass]}] | 
					
						
							|  |  |  |                       export OuterClass;`
 | 
					
						
							|  |  |  |                   }], | 
					
						
							|  |  |  |                   undefined, undefined, /* isEs5 */ true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const addDefinitionsSpy = testFormatter.addDefinitions as jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           const definitions = addDefinitionsSpy.calls.all()[1].args[2]; | 
					
						
							|  |  |  |           expect(definitions).toContain('InnerClass.ɵmod'); | 
					
						
							|  |  |  |           expect(definitions).toContain('type: InnerClass'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							|  |  |  |           const statements = addAdjacentStatementsSpy.calls.all()[1].args[2]; | 
					
						
							|  |  |  |           expect(statements).toContain('ɵɵsetNgModuleScope(InnerClass'); | 
					
						
							|  |  |  |           expect(statements).toContain('ɵsetClassMetadata(InnerClass'); | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should render pipes using the inner class name if different from outer', () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |               createTestRenderer( | 
					
						
							|  |  |  |                   'test-package', [{ | 
					
						
							|  |  |  |                     name: _('/node_modules/test-package/src/file.js'), | 
					
						
							|  |  |  |                     contents: `
 | 
					
						
							|  |  |  |                       import { Pipe } from '@angular/core'; | 
					
						
							|  |  |  |                       var OuterClass = /** @class */ (function () { | 
					
						
							|  |  |  |                         function InnerClass() {} | 
					
						
							|  |  |  |                         return InnerClass; | 
					
						
							|  |  |  |                       }()); | 
					
						
							|  |  |  |                       OuterClass.decorators = [{ type: Pipe, args: [{name: 'pipe'}] | 
					
						
							|  |  |  |                       export OuterClass;`
 | 
					
						
							|  |  |  |                   }], | 
					
						
							|  |  |  |                   undefined, undefined, /* isEs5 */ true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const addDefinitionsSpy = testFormatter.addDefinitions as jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           const definitions = addDefinitionsSpy.calls.first().args[2]; | 
					
						
							|  |  |  |           expect(definitions).toContain('InnerClass.ɵfac'); | 
					
						
							|  |  |  |           expect(definitions).toContain('new (t || InnerClass)()'); | 
					
						
							|  |  |  |           expect(definitions).toContain('InnerClass.ɵpipe'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							|  |  |  |           const statements = addAdjacentStatementsSpy.calls.first().args[2]; | 
					
						
							|  |  |  |           expect(statements).toContain('ɵsetClassMetadata(InnerClass'); | 
					
						
							| 
									
										
										
										
											2019-11-01 16:55:10 +00:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 19:45:08 +02:00
										 |  |  |         it('should render classes without decorators if class fields are decorated', () => { | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = createTestRenderer('test-package', [{ | 
					
						
							| 
									
										
										
										
											2019-05-25 21:34:40 +01:00
										 |  |  |                                    name: _('/node_modules/test-package/src/file.js'), | 
					
						
							|  |  |  |                                    contents: `
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |                   import { Directive, ViewChild } from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   export class UndecoratedBase { test = null; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   UndecoratedBase.propDecorators = { | 
					
						
							|  |  |  |                     test: [{ | 
					
						
							|  |  |  |                       type: ViewChild, | 
					
						
							|  |  |  |                       args: ["test", {static: true}] | 
					
						
							|  |  |  |                     }], | 
					
						
							|  |  |  |                   }; | 
					
						
							|  |  |  |                 `
 | 
					
						
							| 
									
										
										
										
											2019-05-25 21:34:40 +01:00
										 |  |  |                                  }]); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const addDefinitionsSpy = testFormatter.addDefinitions as jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2019-11-04 19:29:01 +02:00
										 |  |  |           expect(addDefinitionsSpy.calls.first().args[2]).toEqual(`// TRANSPILED
 | 
					
						
							|  |  |  | UndecoratedBase.ɵfac = function UndecoratedBase_Factory(t) { return new (t || UndecoratedBase)(); }; | 
					
						
							|  |  |  | // TRANSPILED
 | 
					
						
							| 
									
										
										
										
											2019-10-27 10:59:23 +01:00
										 |  |  | UndecoratedBase.ɵdir = ɵngcc0.ɵɵdefineDirective({ type: UndecoratedBase, viewQuery: function UndecoratedBase_Query(rf, ctx) { if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |         ɵngcc0.ɵɵstaticViewQuery(_c0, true); | 
					
						
							| 
									
										
										
										
											2019-06-03 18:41:47 +02:00
										 |  |  |     } if (rf & 2) { | 
					
						
							|  |  |  |         var _t; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |         ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.test = _t.first); | 
					
						
							| 
									
										
										
										
											2019-06-03 18:41:47 +02:00
										 |  |  |     } } });`);
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should call renderImports after other abstract methods', () => { | 
					
						
							|  |  |  |           // This allows the other methods to add additional imports if necessary
 | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = createTestRenderer('test-package', [JS_CONTENT]); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |           const addExportsSpy = testFormatter.addExports as jasmine.Spy; | 
					
						
							|  |  |  |           const addDefinitionsSpy = testFormatter.addDefinitions as jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |           const addConstantsSpy = testFormatter.addConstants as jasmine.Spy; | 
					
						
							|  |  |  |           const addImportsSpy = testFormatter.addImports as jasmine.Spy; | 
					
						
							|  |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  |           expect(addExportsSpy).toHaveBeenCalledBefore(addImportsSpy); | 
					
						
							|  |  |  |           expect(addDefinitionsSpy).toHaveBeenCalledBefore(addImportsSpy); | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           expect(addAdjacentStatementsSpy).toHaveBeenCalledBefore(addImportsSpy); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |           expect(addConstantsSpy).toHaveBeenCalledBefore(addImportsSpy); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2019-06-03 18:41:47 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       describe('source map merging', () => { | 
					
						
							|  |  |  |         it('should merge any inline source map from the original file and write the output as an inline source map', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |              const sourceFiles: TestFile[] = [{ | 
					
						
							|  |  |  |                name: JS_CONTENT.name, | 
					
						
							|  |  |  |                contents: JS_CONTENT.contents + '\n' + JS_CONTENT_MAP.toComment() | 
					
						
							|  |  |  |              }]; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |              const { | 
					
						
							|  |  |  |                decorationAnalyses, | 
					
						
							|  |  |  |                renderer, | 
					
						
							|  |  |  |                switchMarkerAnalyses, | 
					
						
							|  |  |  |                privateDeclarationsAnalyses | 
					
						
							|  |  |  |              } = createTestRenderer('test-package', sourceFiles); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |              const [sourceFile, mapFile] = renderer.renderProgram( | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |                  decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |              expect(sourceFile.path).toEqual(_('/node_modules/test-package/src/file.js')); | 
					
						
							|  |  |  |              expect(sourceFile.contents) | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |                  .toEqual(RENDERED_CONTENTS + '\n' + MERGED_OUTPUT_PROGRAM_MAP.toComment()); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |              expect(mapFile).toBeUndefined(); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should merge any external source map from the original file and write the output to an external source map', | 
					
						
							|  |  |  |            () => { | 
					
						
							|  |  |  |              const sourceFiles: TestFile[] = [{ | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |                name: JS_CONTENT.name, | 
					
						
							|  |  |  |                contents: JS_CONTENT.contents + '\n//# sourceMappingURL=file.js.map' | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |              }]; | 
					
						
							|  |  |  |              const mappingFiles: TestFile[] = | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |                  [{name: _(JS_CONTENT.name + '.map'), contents: JS_CONTENT_MAP.toJSON()}]; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |              const { | 
					
						
							|  |  |  |                decorationAnalyses, | 
					
						
							|  |  |  |                renderer, | 
					
						
							|  |  |  |                switchMarkerAnalyses, | 
					
						
							|  |  |  |                privateDeclarationsAnalyses | 
					
						
							|  |  |  |              } = createTestRenderer('test-package', sourceFiles, undefined, mappingFiles); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |              const [sourceFile, mapFile] = renderer.renderProgram( | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |                  decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |              expect(sourceFile.path).toEqual(_('/node_modules/test-package/src/file.js')); | 
					
						
							|  |  |  |              expect(sourceFile.contents) | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |                  .toEqual(RENDERED_CONTENTS + '\n' + generateMapFileComment('file.js.map')); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |              expect(mapFile.path).toEqual(_('/node_modules/test-package/src/file.js.map')); | 
					
						
							|  |  |  |              expect(JSON.parse(mapFile.contents)).toEqual(MERGED_OUTPUT_PROGRAM_MAP.toObject()); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |            }); | 
					
						
							| 
									
										
										
										
											2020-05-30 20:49:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should render an internal source map for files whose original file does not have a source map', | 
					
						
							|  |  |  |            () => { | 
					
						
							|  |  |  |              const sourceFiles: TestFile[] = [JS_CONTENT]; | 
					
						
							|  |  |  |              const { | 
					
						
							|  |  |  |                decorationAnalyses, | 
					
						
							|  |  |  |                renderer, | 
					
						
							|  |  |  |                switchMarkerAnalyses, | 
					
						
							|  |  |  |                privateDeclarationsAnalyses | 
					
						
							|  |  |  |              } = createTestRenderer('test-package', sourceFiles, undefined); | 
					
						
							|  |  |  |              const [sourceFile, mapFile] = renderer.renderProgram( | 
					
						
							|  |  |  |                  decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							|  |  |  |              expect(sourceFile.path).toEqual(_('/node_modules/test-package/src/file.js')); | 
					
						
							|  |  |  |              expect(sourceFile.contents) | 
					
						
							|  |  |  |                  .toEqual(RENDERED_CONTENTS + '\n' + OUTPUT_PROGRAM_MAP.toComment()); | 
					
						
							|  |  |  |              expect(mapFile).toBeUndefined(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2018-11-11 19:16:04 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |       describe('@angular/core support', () => { | 
					
						
							|  |  |  |         it('should render relative imports in ESM bundles', () => { | 
					
						
							|  |  |  |           const CORE_FILE: TestFile = { | 
					
						
							| 
									
										
										
										
											2019-05-25 21:34:40 +01:00
										 |  |  |             name: _('/node_modules/test-package/src/core.js'), | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |             contents: | 
					
						
							|  |  |  |                 `import { NgModule } from './ng_module';\nexport class MyModule {}\nMyModule.decorators = [\n    { type: NgModule, args: [] }\n];\n` | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |           const R3_SYMBOLS_FILE: TestFile = { | 
					
						
							|  |  |  |             // r3_symbols in the file name indicates that this is the path to rewrite core imports
 | 
					
						
							|  |  |  |             // to
 | 
					
						
							| 
									
										
										
										
											2019-05-25 21:34:40 +01:00
										 |  |  |             name: _('/node_modules/test-package/src/r3_symbols.js'), | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |             contents: `export const NgModule = () => null;` | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |           // The package name of `@angular/core` indicates that we are compiling the core library.
 | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = createTestRenderer('@angular/core', [CORE_FILE, R3_SYMBOLS_FILE]); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							|  |  |  |           expect(addAdjacentStatementsSpy.calls.first().args[2]) | 
					
						
							| 
									
										
										
										
											2019-07-31 15:20:56 -07:00
										 |  |  |               .toContain(`/*@__PURE__*/ (function () { ɵngcc0.setClassMetadata(`); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |           const addImportsSpy = testFormatter.addImports as jasmine.Spy; | 
					
						
							|  |  |  |           expect(addImportsSpy.calls.first().args[1]).toEqual([ | 
					
						
							|  |  |  |             {specifier: './r3_symbols', qualifier: 'ɵngcc0'} | 
					
						
							|  |  |  |           ]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should render no imports in FESM bundles', () => { | 
					
						
							|  |  |  |           const CORE_FILE: TestFile = { | 
					
						
							| 
									
										
										
										
											2019-05-25 21:34:40 +01:00
										 |  |  |             name: _('/node_modules/test-package/src/core.js'), | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |             contents: `export const NgModule = () => null;
 | 
					
						
							| 
									
										
										
										
											2018-11-11 19:16:04 +01:00
										 |  |  |             export class MyModule {}\nMyModule.decorators = [\n    { type: NgModule, args: [] }\n];\n`
 | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |           }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |           const { | 
					
						
							|  |  |  |             decorationAnalyses, | 
					
						
							|  |  |  |             renderer, | 
					
						
							|  |  |  |             switchMarkerAnalyses, | 
					
						
							|  |  |  |             privateDeclarationsAnalyses, | 
					
						
							|  |  |  |             testFormatter | 
					
						
							|  |  |  |           } = createTestRenderer('@angular/core', [CORE_FILE]); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |           renderer.renderProgram( | 
					
						
							|  |  |  |               decorationAnalyses, switchMarkerAnalyses, privateDeclarationsAnalyses); | 
					
						
							| 
									
										
										
										
											2019-11-06 17:03:56 +00:00
										 |  |  |           const addAdjacentStatementsSpy = testFormatter.addAdjacentStatements as jasmine.Spy; | 
					
						
							|  |  |  |           expect(addAdjacentStatementsSpy.calls.first().args[2]) | 
					
						
							| 
									
										
										
										
											2019-07-31 15:20:56 -07:00
										 |  |  |               .toContain(`/*@__PURE__*/ (function () { setClassMetadata(`); | 
					
						
							| 
									
										
										
										
											2019-06-06 20:22:32 +01:00
										 |  |  |           const addImportsSpy = testFormatter.addImports as jasmine.Spy; | 
					
						
							|  |  |  |           expect(addImportsSpy.calls.first().args[1]).toEqual([]); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2018-11-11 19:16:04 +01:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-11-25 21:40:25 +00:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-07-16 10:23:37 +01:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-07-27 22:36:54 +03:00
										 |  |  | }); |