Introduces a new Bazel test that allows us to inspect what source-files contribute to a given bundled file and how much bytes they contribute to the bundle size. Additionally the size-tracking rule groups the size data by directories. This allows us to compare size changes in the scope of directories. e.g. a lot of files in a directory could increase slightly in size, but in the directory scope the size change could be significant and needs to be reported by the test target. Resolves FW-1278 PR Close #30070
		
			
				
	
	
		
			112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/**
 | 
						|
 * @license
 | 
						|
 * Copyright Google Inc. All Rights Reserved.
 | 
						|
 *
 | 
						|
 * 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 {writeFileSync} from 'fs';
 | 
						|
import {join} from 'path';
 | 
						|
import {SourceMapGenerator} from 'source-map';
 | 
						|
 | 
						|
import {SizeTracker} from './size_tracker';
 | 
						|
 | 
						|
const testTempDir = process.env['TEST_TMPDIR'] !;
 | 
						|
 | 
						|
describe('size tracking', () => {
 | 
						|
  let generator: SourceMapGenerator;
 | 
						|
 | 
						|
  beforeEach(() => { generator = new SourceMapGenerator(); });
 | 
						|
 | 
						|
  function writeFile(filePath: string, content: string): string {
 | 
						|
    const tmpFilePath = join(testTempDir, filePath);
 | 
						|
    writeFileSync(tmpFilePath, content);
 | 
						|
    return tmpFilePath;
 | 
						|
  }
 | 
						|
 | 
						|
  it('should keep track of unmapped bytes in the file', () => {
 | 
						|
    generator.addMapping({
 | 
						|
      generated: {line: 1, column: 1},
 | 
						|
      original: {line: 1, column: 1},
 | 
						|
      source: './origin-a.ts',
 | 
						|
    });
 | 
						|
 | 
						|
    // A => origin-a (2 bytes), U => unmapped (1 byte)
 | 
						|
    const mapPath = writeFile('/test.map', generator.toString());
 | 
						|
    const inputPath = writeFile('/test.js', `UAA`);
 | 
						|
 | 
						|
    const {sizeResult} = new SizeTracker(inputPath, mapPath);
 | 
						|
 | 
						|
    expect(sizeResult.unmapped).toBe(1);
 | 
						|
    expect(sizeResult.files).toEqual({
 | 
						|
      size: 3,
 | 
						|
      'origin-a.ts': 2,
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  it('should properly combine mapped characters from same source', () => {
 | 
						|
    generator.addMapping(
 | 
						|
        {generated: {line: 1, column: 0}, original: {line: 1, column: 0}, source: './origin-a.ts'});
 | 
						|
 | 
						|
    generator.addMapping(
 | 
						|
        {generated: {line: 1, column: 1}, original: {line: 1, column: 0}, source: './origin-b.ts'});
 | 
						|
 | 
						|
    generator.addMapping({
 | 
						|
      generated: {line: 1, column: 2},
 | 
						|
      original: {line: 10, column: 0},
 | 
						|
      source: './origin-a.ts'
 | 
						|
    });
 | 
						|
 | 
						|
    // A => origin-a (1 byte), B => origin-b (two bytes)
 | 
						|
    const mapPath = writeFile('/test.map', generator.toString());
 | 
						|
    const inputPath = writeFile('/test.js', `ABB`);
 | 
						|
 | 
						|
    const {sizeResult} = new SizeTracker(inputPath, mapPath);
 | 
						|
 | 
						|
    expect(sizeResult.unmapped).toBe(0);
 | 
						|
    expect(sizeResult.files).toEqual({
 | 
						|
      size: 3,
 | 
						|
      'origin-a.ts': 2,
 | 
						|
      'origin-b.ts': 1,
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  it('should keep track of summed-up byte sizes for directories', () => {
 | 
						|
    generator.addMapping({
 | 
						|
      generated: {line: 1, column: 0},
 | 
						|
      original: {line: 1, column: 0},
 | 
						|
      source: '@angular/core/render3/a.ts'
 | 
						|
    });
 | 
						|
 | 
						|
    generator.addMapping({
 | 
						|
      generated: {line: 1, column: 2},
 | 
						|
      original: {line: 1, column: 0},
 | 
						|
      source: '@angular/core/render3/b.ts'
 | 
						|
    });
 | 
						|
 | 
						|
    generator.addMapping({
 | 
						|
      generated: {line: 1, column: 3},
 | 
						|
      original: {line: 1, column: 0},
 | 
						|
      source: '@angular/core/c.ts'
 | 
						|
    });
 | 
						|
 | 
						|
    // A => render3/a.ts (2 bytes), B => render3/b.ts (1 byte), C => c.ts (1 byte)
 | 
						|
    const mapPath = writeFile('/test.map', generator.toString());
 | 
						|
    const inputPath = writeFile('/test.js', `AABC`);
 | 
						|
 | 
						|
    const {sizeResult} = new SizeTracker(inputPath, mapPath);
 | 
						|
 | 
						|
    expect(sizeResult.unmapped).toBe(0);
 | 
						|
    expect(sizeResult.files).toEqual({
 | 
						|
      size: 4,
 | 
						|
      'render3/': {
 | 
						|
        size: 3,
 | 
						|
        'a.ts': 2,
 | 
						|
        'b.ts': 1,
 | 
						|
      },
 | 
						|
      'c.ts': 1,
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |