| 
									
										
										
										
											2017-01-27 14:23:12 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2017-01-27 14:23:12 -08: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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {SourceMapGenerator, toBase64String} from '@angular/compiler/src/output/source_map'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-16 14:42:55 -08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-27 14:23:12 -08:00
										 |  |  |   describe('source map generation', () => { | 
					
						
							|  |  |  |     describe('generation', () => { | 
					
						
							|  |  |  |       it('should generate a valid source map', () => { | 
					
						
							|  |  |  |         const map = new SourceMapGenerator('out.js') | 
					
						
							|  |  |  |                         .addSource('a.js', null) | 
					
						
							|  |  |  |                         .addLine() | 
					
						
							|  |  |  |                         .addMapping(0, 'a.js', 0, 0) | 
					
						
							|  |  |  |                         .addMapping(4, 'a.js', 0, 6) | 
					
						
							|  |  |  |                         .addMapping(5, 'a.js', 0, 7) | 
					
						
							|  |  |  |                         .addMapping(8, 'a.js', 0, 22) | 
					
						
							|  |  |  |                         .addMapping(9, 'a.js', 0, 23) | 
					
						
							|  |  |  |                         .addMapping(10, 'a.js', 0, 24) | 
					
						
							|  |  |  |                         .addLine() | 
					
						
							|  |  |  |                         .addMapping(0, 'a.js', 1, 0) | 
					
						
							|  |  |  |                         .addMapping(4, 'a.js', 1, 6) | 
					
						
							|  |  |  |                         .addMapping(5, 'a.js', 1, 7) | 
					
						
							|  |  |  |                         .addMapping(8, 'a.js', 1, 10) | 
					
						
							|  |  |  |                         .addMapping(9, 'a.js', 1, 11) | 
					
						
							|  |  |  |                         .addMapping(10, 'a.js', 1, 12) | 
					
						
							|  |  |  |                         .addLine() | 
					
						
							|  |  |  |                         .addMapping(0, 'a.js', 3, 0) | 
					
						
							|  |  |  |                         .addMapping(2, 'a.js', 3, 2) | 
					
						
							|  |  |  |                         .addMapping(3, 'a.js', 3, 3) | 
					
						
							|  |  |  |                         .addMapping(10, 'a.js', 3, 10) | 
					
						
							|  |  |  |                         .addMapping(11, 'a.js', 3, 11) | 
					
						
							|  |  |  |                         .addMapping(21, 'a.js', 3, 11) | 
					
						
							|  |  |  |                         .addMapping(22, 'a.js', 3, 12) | 
					
						
							|  |  |  |                         .addLine() | 
					
						
							|  |  |  |                         .addMapping(4, 'a.js', 4, 4) | 
					
						
							|  |  |  |                         .addMapping(11, 'a.js', 4, 11) | 
					
						
							|  |  |  |                         .addMapping(12, 'a.js', 4, 12) | 
					
						
							|  |  |  |                         .addMapping(15, 'a.js', 4, 15) | 
					
						
							|  |  |  |                         .addMapping(16, 'a.js', 4, 16) | 
					
						
							|  |  |  |                         .addMapping(21, 'a.js', 4, 21) | 
					
						
							|  |  |  |                         .addMapping(22, 'a.js', 4, 22) | 
					
						
							|  |  |  |                         .addMapping(23, 'a.js', 4, 23) | 
					
						
							|  |  |  |                         .addLine() | 
					
						
							|  |  |  |                         .addMapping(0, 'a.js', 5, 0) | 
					
						
							|  |  |  |                         .addMapping(1, 'a.js', 5, 1) | 
					
						
							|  |  |  |                         .addMapping(2, 'a.js', 5, 2) | 
					
						
							|  |  |  |                         .addMapping(3, 'a.js', 5, 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Generated with https://sokra.github.io/source-map-visualization using a TS source map
 | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         expect(map.toJSON()!.mappings) | 
					
						
							| 
									
										
										
										
											2017-01-27 14:23:12 -08:00
										 |  |  |             .toEqual( | 
					
						
							|  |  |  |                 'AAAA,IAAM,CAAC,GAAe,CAAC,CAAC;AACxB,IAAM,CAAC,GAAG,CAAC,CAAC;AAEZ,EAAE,CAAC,OAAO,CAAC,UAAA,CAAC;IACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC,CAAC,CAAA'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should include the files and their contents', () => { | 
					
						
							|  |  |  |         const map = new SourceMapGenerator('out.js') | 
					
						
							|  |  |  |                         .addSource('inline.ts', 'inline') | 
					
						
							|  |  |  |                         .addSource('inline.ts', 'inline')  // make sur the sources are dedup
 | 
					
						
							|  |  |  |                         .addSource('url.ts', null) | 
					
						
							|  |  |  |                         .addLine() | 
					
						
							|  |  |  |                         .addMapping(0, 'inline.ts', 0, 0) | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |                         .toJSON()!; | 
					
						
							| 
									
										
										
										
											2017-01-27 14:23:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(map.file).toEqual('out.js'); | 
					
						
							|  |  |  |         expect(map.sources).toEqual(['inline.ts', 'url.ts']); | 
					
						
							|  |  |  |         expect(map.sourcesContent).toEqual(['inline', null]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not generate source maps when there is no mapping', () => { | 
					
						
							|  |  |  |         const smg = new SourceMapGenerator('out.js').addSource('inline.ts', 'inline').addLine(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(smg.toJSON()).toEqual(null); | 
					
						
							|  |  |  |         expect(smg.toJsComment()).toEqual(''); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('encodeB64String', () => { | 
					
						
							|  |  |  |       it('should return the b64 encoded value', () => { | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |         [['', ''], | 
					
						
							|  |  |  |          ['a', 'YQ=='], | 
					
						
							|  |  |  |          ['Foo', 'Rm9v'], | 
					
						
							|  |  |  |          ['Foo1', 'Rm9vMQ=='], | 
					
						
							|  |  |  |          ['Foo12', 'Rm9vMTI='], | 
					
						
							| 
									
										
										
										
											2017-01-27 14:23:12 -08:00
										 |  |  |          ['Foo123', 'Rm9vMTIz'], | 
					
						
							|  |  |  |         ].forEach(([src, b64]) => expect(toBase64String(src)).toEqual(b64)); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('errors', () => { | 
					
						
							|  |  |  |       it('should throw when mappings are added out of order', () => { | 
					
						
							|  |  |  |         expect(() => { | 
					
						
							|  |  |  |           new SourceMapGenerator('out.js') | 
					
						
							|  |  |  |               .addSource('in.js') | 
					
						
							|  |  |  |               .addLine() | 
					
						
							|  |  |  |               .addMapping(10, 'in.js', 0, 0) | 
					
						
							|  |  |  |               .addMapping(0, 'in.js', 0, 0); | 
					
						
							|  |  |  |         }).toThrowError('Mapping should be added in output order'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should throw when adding segments before any line is created', () => { | 
					
						
							|  |  |  |         expect(() => { | 
					
						
							|  |  |  |           new SourceMapGenerator('out.js').addSource('in.js').addMapping(0, 'in.js', 0, 0); | 
					
						
							|  |  |  |         }).toThrowError('A line must be added before mappings can be added'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should throw when adding segments referencing unknown sources', () => { | 
					
						
							|  |  |  |         expect(() => { | 
					
						
							|  |  |  |           new SourceMapGenerator('out.js').addSource('in.js').addLine().addMapping( | 
					
						
							|  |  |  |               0, 'in_.js', 0, 0); | 
					
						
							|  |  |  |         }).toThrowError('Unknown source file "in_.js"'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should throw when adding segments without column', () => { | 
					
						
							|  |  |  |         expect(() => { | 
					
						
							| 
									
										
										
										
											2020-04-08 10:14:18 -07:00
										 |  |  |           new SourceMapGenerator('out.js').addSource('in.js').addLine().addMapping(null!); | 
					
						
							| 
									
										
										
										
											2017-01-27 14:23:12 -08:00
										 |  |  |         }).toThrowError('The column in the generated code must be provided'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should throw when adding segments with a source url but no position', () => { | 
					
						
							|  |  |  |         expect(() => { | 
					
						
							|  |  |  |           new SourceMapGenerator('out.js').addSource('in.js').addLine().addMapping(0, 'in.js'); | 
					
						
							|  |  |  |         }).toThrowError('The source location must be provided when a source url is provided'); | 
					
						
							|  |  |  |         expect(() => { | 
					
						
							|  |  |  |           new SourceMapGenerator('out.js').addSource('in.js').addLine().addMapping(0, 'in.js', 0); | 
					
						
							|  |  |  |         }).toThrowError('The source location must be provided when a source url is provided'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |