| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | import {encode} from 'sourcemap-codec'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-09 16:28:08 +00:00
										 |  |  | import {absoluteFrom} from '../../../src/ngtsc/file_system'; | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  | import {runInEachFileSystem} from '../../../src/ngtsc/file_system/testing'; | 
					
						
							|  |  |  | import {RawSourceMap} from '../../src/sourcemaps/raw_source_map'; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | import {SegmentMarker} from '../../src/sourcemaps/segment_marker'; | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  | import {computeStartOfLinePositions, ensureOriginalSegmentLinks, extractOriginalSegments, findLastMappingIndexBefore, Mapping, parseMappings, SourceFile} from '../../src/sourcemaps/source_file'; | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | runInEachFileSystem(() => { | 
					
						
							|  |  |  |   describe('SourceFile and utilities', () => { | 
					
						
							|  |  |  |     let _: typeof absoluteFrom; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |     beforeEach(() => { | 
					
						
							|  |  |  |       _ = absoluteFrom; | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('parseMappings()', () => { | 
					
						
							|  |  |  |       it('should be an empty array for source files with no source map', () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |         const mappings = parseMappings(null, [], []); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         expect(mappings).toEqual([]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should be empty array for source files with no source map mappings', () => { | 
					
						
							|  |  |  |         const rawSourceMap: RawSourceMap = {mappings: '', names: [], sources: [], version: 3}; | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |         const mappings = parseMappings(rawSourceMap, [], []); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         expect(mappings).toEqual([]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should parse the mappings from the raw source map', () => { | 
					
						
							|  |  |  |         const rawSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |           mappings: encode([[[0, 0, 0, 0], [6, 0, 0, 3]]]), | 
					
						
							|  |  |  |           names: [], | 
					
						
							|  |  |  |           sources: ['a.js'], | 
					
						
							|  |  |  |           version: 3 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         const originalSource = new SourceFile(_('/foo/src/a.js'), 'abcdefg', null, false, []); | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |         const mappings = parseMappings(rawSourceMap, [originalSource], [0, 8]); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         expect(mappings).toEqual([ | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |             generatedSegment: {line: 0, column: 0, position: 0, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |             originalSource, | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |             originalSegment: {line: 0, column: 0, position: 0, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |             name: undefined | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |             generatedSegment: {line: 0, column: 6, position: 6, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |             originalSource, | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |             originalSegment: {line: 0, column: 3, position: 3, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |             name: undefined | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('extractOriginalSegments()', () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |       it('should return an empty Map for source files with no source map', () => { | 
					
						
							|  |  |  |         expect(extractOriginalSegments(parseMappings(null, [], []))).toEqual(new Map()); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |       it('should be empty Map for source files with no source map mappings', () => { | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |         const rawSourceMap: RawSourceMap = {mappings: '', names: [], sources: [], version: 3}; | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |         expect(extractOriginalSegments(parseMappings(rawSourceMap, [], []))).toEqual(new Map()); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should parse the segments in ascending order of original position from the raw source map', | 
					
						
							|  |  |  |          () => { | 
					
						
							|  |  |  |            const originalSource = new SourceFile(_('/foo/src/a.js'), 'abcdefg', null, false, []); | 
					
						
							|  |  |  |            const rawSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |              mappings: encode([[[0, 0, 0, 0], [2, 0, 0, 3], [4, 0, 0, 2]]]), | 
					
						
							|  |  |  |              names: [], | 
					
						
							|  |  |  |              sources: ['a.js'], | 
					
						
							|  |  |  |              version: 3 | 
					
						
							|  |  |  |            }; | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |            const originalSegments = | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |                extractOriginalSegments(parseMappings(rawSourceMap, [originalSource], [0, 8])); | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |            expect(originalSegments.get(originalSource)).toEqual([ | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              {line: 0, column: 0, position: 0, next: undefined}, | 
					
						
							|  |  |  |              {line: 0, column: 2, position: 2, next: undefined}, | 
					
						
							|  |  |  |              {line: 0, column: 3, position: 3, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |            ]); | 
					
						
							|  |  |  |          }); | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should create separate arrays for each original source file', () => { | 
					
						
							|  |  |  |         const sourceA = new SourceFile(_('/foo/src/a.js'), 'abcdefg', null, false, []); | 
					
						
							|  |  |  |         const sourceB = new SourceFile(_('/foo/src/b.js'), '1234567', null, false, []); | 
					
						
							|  |  |  |         const rawSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |           mappings: | 
					
						
							|  |  |  |               encode([[[0, 0, 0, 0], [2, 1, 0, 3], [4, 0, 0, 2], [5, 1, 0, 5], [6, 1, 0, 2]]]), | 
					
						
							|  |  |  |           names: [], | 
					
						
							|  |  |  |           sources: ['a.js', 'b.js'], | 
					
						
							|  |  |  |           version: 3 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         const originalSegments = | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |             extractOriginalSegments(parseMappings(rawSourceMap, [sourceA, sourceB], [0, 8])); | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |         expect(originalSegments.get(sourceA)).toEqual([ | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |           {line: 0, column: 0, position: 0, next: undefined}, | 
					
						
							|  |  |  |           {line: 0, column: 2, position: 2, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |         ]); | 
					
						
							|  |  |  |         expect(originalSegments.get(sourceB)).toEqual([ | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |           {line: 0, column: 2, position: 2, next: undefined}, | 
					
						
							|  |  |  |           {line: 0, column: 3, position: 3, next: undefined}, | 
					
						
							|  |  |  |           {line: 0, column: 5, position: 5, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |     describe('findLastMappingIndexBefore', () => { | 
					
						
							|  |  |  |       it('should find the highest mapping index that has a segment marker below the given one if there is not an exact match', | 
					
						
							|  |  |  |          () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |            const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |            const marker4: SegmentMarker = {line: 0, column: 40, position: 40, next: marker5}; | 
					
						
							|  |  |  |            const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |            const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |            const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |            const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |                marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |            const marker: SegmentMarker = {line: 0, column: 35, position: 35, next: undefined}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |            const index = findLastMappingIndexBefore(mappings, marker, /* exclusive */ false, 0); | 
					
						
							|  |  |  |            expect(index).toEqual(2); | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should find the highest mapping index that has a segment marker (when there are duplicates) below the given one if there is not an exact match', | 
					
						
							|  |  |  |          () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |            const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |            const marker4: SegmentMarker = {line: 0, column: 30, position: 30, next: marker5}; | 
					
						
							|  |  |  |            const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |            const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |            const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |            const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |                marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |            const marker: SegmentMarker = {line: 0, column: 35, position: 35, next: undefined}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |            const index = findLastMappingIndexBefore(mappings, marker, /* exclusive */ false, 0); | 
					
						
							|  |  |  |            expect(index).toEqual(3); | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should find the last mapping if the segment marker is higher than all of them', () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |         const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |         const marker4: SegmentMarker = {line: 0, column: 40, position: 40, next: marker5}; | 
					
						
							|  |  |  |         const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |         const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |         const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |         const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |             marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |         const marker: SegmentMarker = {line: 0, column: 60, position: 60, next: undefined}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const index = findLastMappingIndexBefore(mappings, marker, /* exclusive */ false, 0); | 
					
						
							|  |  |  |         expect(index).toEqual(4); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should return -1 if the segment marker is lower than all of them', () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |         const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |         const marker4: SegmentMarker = {line: 0, column: 40, position: 40, next: marker5}; | 
					
						
							|  |  |  |         const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |         const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |         const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |         const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |             marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |         const marker: SegmentMarker = {line: 0, column: 5, position: 5, next: undefined}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const index = findLastMappingIndexBefore(mappings, marker, /* exclusive */ false, 0); | 
					
						
							|  |  |  |         expect(index).toEqual(-1); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('[exact match inclusive]', () => { | 
					
						
							|  |  |  |         it('should find the matching segment marker mapping index if there is only one of them', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |              const marker4: SegmentMarker = {line: 0, column: 40, position: 40, next: marker5}; | 
					
						
							|  |  |  |              const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |              const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |              const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |              const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |                  marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const index = findLastMappingIndexBefore(mappings, marker3, /* exclusive */ false, 0); | 
					
						
							|  |  |  |              expect(index).toEqual(2); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should find the highest matching segment marker mapping index if there is more than one of them', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |              const marker4: SegmentMarker = {line: 0, column: 30, position: 30, next: marker5}; | 
					
						
							|  |  |  |              const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |              const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |              const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |              const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |                  marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const index = findLastMappingIndexBefore(mappings, marker3, /* exclusive */ false, 0); | 
					
						
							|  |  |  |              expect(index).toEqual(3); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('[exact match exclusive]', () => { | 
					
						
							|  |  |  |         it('should find the preceding mapping index if there is a matching segment marker', () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |           const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |           const marker4: SegmentMarker = {line: 0, column: 40, position: 40, next: marker5}; | 
					
						
							|  |  |  |           const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |           const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |           const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |           const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |               marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |           const index = findLastMappingIndexBefore(mappings, marker3, /* exclusive */ true, 0); | 
					
						
							|  |  |  |           expect(index).toEqual(1); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should find the highest preceding mapping index if there is more than one matching segment marker', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |              const marker4: SegmentMarker = {line: 0, column: 30, position: 30, next: marker5}; | 
					
						
							|  |  |  |              const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |              const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |              const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |              const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |                  marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const index = findLastMappingIndexBefore(mappings, marker3, /* exclusive */ false, 0); | 
					
						
							|  |  |  |              expect(index).toEqual(3); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('[with lowerIndex hint', () => { | 
					
						
							|  |  |  |         it('should find the highest mapping index above the lowerIndex hint that has a segment marker below the given one if there is not an exact match', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |              const marker4: SegmentMarker = {line: 0, column: 40, position: 40, next: marker5}; | 
					
						
							|  |  |  |              const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |              const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |              const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |                  marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker: SegmentMarker = {line: 0, column: 35, position: 35, next: undefined}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const index = findLastMappingIndexBefore(mappings, marker, /* exclusive */ false, 1); | 
					
						
							|  |  |  |              expect(index).toEqual(2); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should return the lowerIndex mapping index if there is a single exact match and we are not exclusive', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |              const marker4: SegmentMarker = {line: 0, column: 40, position: 40, next: marker5}; | 
					
						
							|  |  |  |              const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |              const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |              const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |                  marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker: SegmentMarker = {line: 0, column: 30, position: 30, next: undefined}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const index = findLastMappingIndexBefore(mappings, marker, /* exclusive */ false, 2); | 
					
						
							|  |  |  |              expect(index).toEqual(2); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should return the lowerIndex mapping index if there are multiple exact matches and we are not exclusive', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |              const marker4: SegmentMarker = {line: 0, column: 30, position: 30, next: marker5}; | 
					
						
							|  |  |  |              const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |              const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |              const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |                  marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker: SegmentMarker = {line: 0, column: 30, position: 30, next: undefined}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const index = findLastMappingIndexBefore(mappings, marker, /* exclusive */ false, 3); | 
					
						
							|  |  |  |              expect(index).toEqual(3); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should return -1 if the segment marker is lower than the lowerIndex hint', () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |           const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |           const marker4: SegmentMarker = {line: 0, column: 40, position: 40, next: marker5}; | 
					
						
							|  |  |  |           const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |           const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |           const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |           const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |               marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |           const marker: SegmentMarker = {line: 0, column: 25, position: 25, next: undefined}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |           const index = findLastMappingIndexBefore(mappings, marker, /* exclusive */ false, 2); | 
					
						
							|  |  |  |           expect(index).toEqual(-1); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should return -1 if the segment marker is equal to the lowerIndex hint and we are exclusive', | 
					
						
							|  |  |  |            () => { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker5: SegmentMarker = {line: 0, column: 50, position: 50, next: undefined}; | 
					
						
							|  |  |  |              const marker4: SegmentMarker = {line: 0, column: 40, position: 40, next: marker5}; | 
					
						
							|  |  |  |              const marker3: SegmentMarker = {line: 0, column: 30, position: 30, next: marker4}; | 
					
						
							|  |  |  |              const marker2: SegmentMarker = {line: 0, column: 20, position: 20, next: marker3}; | 
					
						
							|  |  |  |              const marker1: SegmentMarker = {line: 0, column: 10, position: 10, next: marker2}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  |              const mappings: Mapping[] = [marker1, marker2, marker3, marker4, marker5].map( | 
					
						
							| 
									
										
										
										
											2020-04-06 08:30:08 +01:00
										 |  |  |                  marker => ({generatedSegment: marker} as Mapping)); | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |              const marker: SegmentMarker = {line: 0, column: 30, position: 30, next: undefined}; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:03:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |              const index = findLastMappingIndexBefore(mappings, marker, /* exclusive */ true, 2); | 
					
						
							|  |  |  |              expect(index).toEqual(-1); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 16:57:03 +00:00
										 |  |  |     describe('ensureOriginalSegmentLinks', () => { | 
					
						
							|  |  |  |       it('should add `next` properties to each segment that point to the next segment in the same source file', | 
					
						
							|  |  |  |          () => { | 
					
						
							|  |  |  |            const sourceA = new SourceFile(_('/foo/src/a.js'), 'abcdefg', null, false, []); | 
					
						
							|  |  |  |            const sourceB = new SourceFile(_('/foo/src/b.js'), '1234567', null, false, []); | 
					
						
							|  |  |  |            const rawSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |              mappings: | 
					
						
							|  |  |  |                  encode([[[0, 0, 0, 0], [2, 1, 0, 3], [4, 0, 0, 2], [5, 1, 0, 5], [6, 1, 0, 2]]]), | 
					
						
							|  |  |  |              names: [], | 
					
						
							|  |  |  |              sources: ['a.js', 'b.js'], | 
					
						
							|  |  |  |              version: 3 | 
					
						
							|  |  |  |            }; | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |            const mappings = parseMappings(rawSourceMap, [sourceA, sourceB], [0, 8]); | 
					
						
							| 
									
										
										
										
											2020-03-11 16:57:03 +00:00
										 |  |  |            ensureOriginalSegmentLinks(mappings); | 
					
						
							|  |  |  |            expect(mappings[0].originalSegment.next).toBe(mappings[2].originalSegment); | 
					
						
							|  |  |  |            expect(mappings[1].originalSegment.next).toBe(mappings[3].originalSegment); | 
					
						
							|  |  |  |            expect(mappings[2].originalSegment.next).toBeUndefined(); | 
					
						
							|  |  |  |            expect(mappings[3].originalSegment.next).toBeUndefined(); | 
					
						
							|  |  |  |            expect(mappings[4].originalSegment.next).toBe(mappings[1].originalSegment); | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |     describe('SourceFile', () => { | 
					
						
							|  |  |  |       describe('flattenedMappings', () => { | 
					
						
							|  |  |  |         it('should be an empty array for source files with no source map', () => { | 
					
						
							|  |  |  |           const sourceFile = | 
					
						
							|  |  |  |               new SourceFile(_('/foo/src/index.js'), 'index contents', null, false, []); | 
					
						
							|  |  |  |           expect(sourceFile.flattenedMappings).toEqual([]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should be empty array for source files with no source map mappings', () => { | 
					
						
							|  |  |  |           const rawSourceMap: RawSourceMap = {mappings: '', names: [], sources: [], version: 3}; | 
					
						
							|  |  |  |           const sourceFile = | 
					
						
							|  |  |  |               new SourceFile(_('/foo/src/index.js'), 'index contents', rawSourceMap, false, []); | 
					
						
							|  |  |  |           expect(sourceFile.flattenedMappings).toEqual([]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should be the same as non-flat mappings if there is only one level of source map', | 
					
						
							|  |  |  |            () => { | 
					
						
							|  |  |  |              const rawSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |                mappings: encode([[[0, 0, 0, 0], [6, 0, 0, 3]]]), | 
					
						
							|  |  |  |                names: [], | 
					
						
							|  |  |  |                sources: ['a.js'], | 
					
						
							|  |  |  |                version: 3 | 
					
						
							|  |  |  |              }; | 
					
						
							|  |  |  |              const originalSource = new SourceFile(_('/foo/src/a.js'), 'abcdefg', null, false, []); | 
					
						
							|  |  |  |              const sourceFile = new SourceFile( | 
					
						
							|  |  |  |                  _('/foo/src/index.js'), 'abc123defg', rawSourceMap, false, [originalSource]); | 
					
						
							| 
									
										
										
										
											2020-03-11 16:57:03 +00:00
										 |  |  |              expect(removeOriginalSegmentLinks(sourceFile.flattenedMappings)) | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |                  .toEqual(parseMappings(rawSourceMap, [originalSource], [0, 11])); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |            }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should merge mappings from flattened original source files', () => { | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |           const cSource = new SourceFile(_('/foo/src/c.js'), 'bcd123', null, false, []); | 
					
						
							|  |  |  |           const dSource = new SourceFile(_('/foo/src/d.js'), 'aef', null, false, []); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |           const bSourceMap: RawSourceMap = { | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |             mappings: encode([[[0, 1, 0, 0], [1, 0, 0, 0], [4, 1, 0, 1]]]), | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |             names: [], | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |             sources: ['c.js', 'd.js'], | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |             version: 3 | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |           const bSource = | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |               new SourceFile(_('/foo/src/b.js'), 'abcdef', bSourceMap, false, [cSource, dSource]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |           const aSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |             mappings: encode([[[0, 0, 0, 0], [2, 0, 0, 3], [4, 0, 0, 2], [5, 0, 0, 5]]]), | 
					
						
							|  |  |  |             names: [], | 
					
						
							|  |  |  |             sources: ['b.js'], | 
					
						
							|  |  |  |             version: 3 | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |           const aSource = | 
					
						
							|  |  |  |               new SourceFile(_('/foo/src/a.js'), 'abdecf', aSourceMap, false, [bSource]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 16:57:03 +00:00
										 |  |  |           expect(removeOriginalSegmentLinks(aSource.flattenedMappings)).toEqual([ | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               generatedSegment: {line: 0, column: 0, position: 0, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |               originalSource: dSource, | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               originalSegment: {line: 0, column: 0, position: 0, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |               name: undefined | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               generatedSegment: {line: 0, column: 1, position: 1, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |               originalSource: cSource, | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               originalSegment: {line: 0, column: 0, position: 0, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |               name: undefined | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               generatedSegment: {line: 0, column: 2, position: 2, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |               originalSource: cSource, | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               originalSegment: {line: 0, column: 2, position: 2, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |               name: undefined | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               generatedSegment: {line: 0, column: 3, position: 3, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |               originalSource: dSource, | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               originalSegment: {line: 0, column: 1, position: 1, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |               name: undefined | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               generatedSegment: {line: 0, column: 4, position: 4, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |               originalSource: cSource, | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               originalSegment: {line: 0, column: 1, position: 1, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |               name: undefined | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               generatedSegment: {line: 0, column: 5, position: 5, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-03-09 21:35:07 +00:00
										 |  |  |               originalSource: dSource, | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               originalSegment: {line: 0, column: 2, position: 2, next: undefined}, | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |               name: undefined | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           ]); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-02-27 19:50:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('should ignore mappings to missing source files', () => { | 
					
						
							|  |  |  |           const bSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |             mappings: encode([[[1, 0, 0, 0], [4, 0, 0, 3], [4, 0, 0, 6], [5, 0, 0, 7]]]), | 
					
						
							|  |  |  |             names: [], | 
					
						
							|  |  |  |             sources: ['c.js'], | 
					
						
							|  |  |  |             version: 3 | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |           const bSource = new SourceFile(_('/foo/src/b.js'), 'abcdef', bSourceMap, false, [null]); | 
					
						
							|  |  |  |           const aSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |             mappings: encode([[[0, 0, 0, 0], [2, 0, 0, 3], [4, 0, 0, 2], [5, 0, 0, 5]]]), | 
					
						
							|  |  |  |             names: [], | 
					
						
							|  |  |  |             sources: ['b.js'], | 
					
						
							|  |  |  |             version: 3 | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |           const aSource = | 
					
						
							|  |  |  |               new SourceFile(_('/foo/src/a.js'), 'abdecf', aSourceMap, false, [bSource]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           // These flattened mappings are just the mappings from a to b.
 | 
					
						
							|  |  |  |           // (The mappings to c are dropped since there is no source file to map to.)
 | 
					
						
							| 
									
										
										
										
											2020-03-11 16:57:03 +00:00
										 |  |  |           expect(removeOriginalSegmentLinks(aSource.flattenedMappings)) | 
					
						
							| 
									
										
										
										
											2020-03-11 19:57:38 +00:00
										 |  |  |               .toEqual(parseMappings(aSourceMap, [bSource], [0, 7])); | 
					
						
							| 
									
										
										
										
											2020-02-27 19:50:14 +00:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-03-11 16:57:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * Clean out the links between original segments of each of the given `mappings`. | 
					
						
							|  |  |  |          * | 
					
						
							|  |  |  |          * @param mappings the mappings whose segments are to be cleaned. | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         function removeOriginalSegmentLinks(mappings: Mapping[]) { | 
					
						
							|  |  |  |           for (const mapping of mappings) { | 
					
						
							|  |  |  |             mapping.originalSegment.next = undefined; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           return mappings; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('renderFlattenedSourceMap()', () => { | 
					
						
							|  |  |  |         it('should convert the flattenedMappings into a raw source-map object', () => { | 
					
						
							|  |  |  |           const cSource = new SourceFile(_('/foo/src/c.js'), 'bcd123e', null, false, []); | 
					
						
							|  |  |  |           const bToCSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |             mappings: encode([[[1, 0, 0, 0], [4, 0, 0, 3], [4, 0, 0, 6], [5, 0, 0, 7]]]), | 
					
						
							|  |  |  |             names: [], | 
					
						
							|  |  |  |             sources: ['c.js'], | 
					
						
							|  |  |  |             version: 3 | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |           const bSource = | 
					
						
							|  |  |  |               new SourceFile(_('/foo/src/b.js'), 'abcdef', bToCSourceMap, false, [cSource]); | 
					
						
							|  |  |  |           const aToBSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |             mappings: encode([[[0, 0, 0, 0], [2, 0, 0, 3], [4, 0, 0, 2], [5, 0, 0, 5]]]), | 
					
						
							|  |  |  |             names: [], | 
					
						
							|  |  |  |             sources: ['b.js'], | 
					
						
							|  |  |  |             version: 3 | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |           const aSource = | 
					
						
							|  |  |  |               new SourceFile(_('/foo/src/a.js'), 'abdecf', aToBSourceMap, false, [bSource]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const aTocSourceMap = aSource.renderFlattenedSourceMap(); | 
					
						
							|  |  |  |           expect(aTocSourceMap.version).toEqual(3); | 
					
						
							|  |  |  |           expect(aTocSourceMap.file).toEqual('a.js'); | 
					
						
							|  |  |  |           expect(aTocSourceMap.names).toEqual([]); | 
					
						
							|  |  |  |           expect(aTocSourceMap.sourceRoot).toBeUndefined(); | 
					
						
							|  |  |  |           expect(aTocSourceMap.sources).toEqual(['c.js']); | 
					
						
							|  |  |  |           expect(aTocSourceMap.sourcesContent).toEqual(['bcd123e']); | 
					
						
							|  |  |  |           expect(aTocSourceMap.mappings).toEqual(encode([ | 
					
						
							|  |  |  |             [[1, 0, 0, 0], [2, 0, 0, 2], [3, 0, 0, 3], [3, 0, 0, 6], [4, 0, 0, 1], [5, 0, 0, 7]] | 
					
						
							|  |  |  |           ])); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-02-27 19:50:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('should handle mappings that map from lines outside of the actual content lines', () => { | 
					
						
							|  |  |  |           const bSource = new SourceFile(_('/foo/src/b.js'), 'abcdef', null, false, []); | 
					
						
							|  |  |  |           const aToBSourceMap: RawSourceMap = { | 
					
						
							|  |  |  |             mappings: encode([ | 
					
						
							|  |  |  |               [[0, 0, 0, 0], [2, 0, 0, 3], [4, 0, 0, 2], [5, 0, 0, 5]], | 
					
						
							|  |  |  |               [ | 
					
						
							|  |  |  |                 [0, 0, 0, 0],  // Extra mapping from a non-existent line
 | 
					
						
							|  |  |  |               ] | 
					
						
							|  |  |  |             ]), | 
					
						
							|  |  |  |             names: [], | 
					
						
							|  |  |  |             sources: ['b.js'], | 
					
						
							|  |  |  |             version: 3 | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |           const aSource = | 
					
						
							|  |  |  |               new SourceFile(_('/foo/src/a.js'), 'abdecf', aToBSourceMap, false, [bSource]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const aTocSourceMap = aSource.renderFlattenedSourceMap(); | 
					
						
							|  |  |  |           expect(aTocSourceMap.version).toEqual(3); | 
					
						
							|  |  |  |           expect(aTocSourceMap.file).toEqual('a.js'); | 
					
						
							|  |  |  |           expect(aTocSourceMap.names).toEqual([]); | 
					
						
							|  |  |  |           expect(aTocSourceMap.sourceRoot).toBeUndefined(); | 
					
						
							|  |  |  |           expect(aTocSourceMap.sources).toEqual(['b.js']); | 
					
						
							|  |  |  |           expect(aTocSourceMap.sourcesContent).toEqual(['abcdef']); | 
					
						
							|  |  |  |           expect(aTocSourceMap.mappings).toEqual(aToBSourceMap.mappings); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 12:17:36 +00:00
										 |  |  |     describe('computeStartOfLinePositions()', () => { | 
					
						
							|  |  |  |       it('should compute the cumulative length of each line in the given string', () => { | 
					
						
							|  |  |  |         expect(computeStartOfLinePositions('')).toEqual([0]); | 
					
						
							|  |  |  |         expect(computeStartOfLinePositions('abc')).toEqual([0]); | 
					
						
							|  |  |  |         expect(computeStartOfLinePositions('\n')).toEqual([0, 1]); | 
					
						
							|  |  |  |         expect(computeStartOfLinePositions('\n\n')).toEqual([0, 1, 2]); | 
					
						
							|  |  |  |         expect(computeStartOfLinePositions('abc\n')).toEqual([0, 4]); | 
					
						
							|  |  |  |         expect(computeStartOfLinePositions('\nabc')).toEqual([0, 1]); | 
					
						
							|  |  |  |         expect(computeStartOfLinePositions('abc\ndefg')).toEqual([0, 4]); | 
					
						
							|  |  |  |         expect(computeStartOfLinePositions('abc\r\n')).toEqual([0, 4]); | 
					
						
							|  |  |  |         expect(computeStartOfLinePositions('abc\r\ndefg')).toEqual([0, 4]); | 
					
						
							| 
									
										
										
										
											2020-02-16 21:07:30 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |