The compiler should process all an entry-points dependencies before processing that entry-point. PR Close #25862
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.3 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 {existsSync, readFileSync, readdirSync, statSync} from 'fs';
 | 
						|
import * as mockFs from 'mock-fs';
 | 
						|
import {join} from 'path';
 | 
						|
const Module = require('module');
 | 
						|
 | 
						|
import {mainNgcc} from '../../src/ngcc/src/main';
 | 
						|
 | 
						|
describe('ngcc main()', () => {
 | 
						|
  if (!isInBazel()) {
 | 
						|
    // These tests should be excluded from the non-Bazel build.
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  beforeEach(createMockFileSystem);
 | 
						|
  afterEach(restoreRealFileSystem);
 | 
						|
 | 
						|
  it('should run ngcc without errors for fesm2015', () => {
 | 
						|
    const format = 'fesm2015';
 | 
						|
    expect(mainNgcc(['-f', format, '-s', '/node_modules'])).toBe(0);
 | 
						|
  });
 | 
						|
 | 
						|
  it('should run ngcc without errors for fesm5', () => {
 | 
						|
    const format = 'fesm5';
 | 
						|
    expect(mainNgcc(['-f', format, '-s', '/node_modules'])).toBe(0);
 | 
						|
  });
 | 
						|
 | 
						|
  it('should run ngcc without errors for esm2015', () => {
 | 
						|
    const format = 'esm2015';
 | 
						|
    expect(mainNgcc(['-f', format, '-s', '/node_modules'])).toBe(0);
 | 
						|
  });
 | 
						|
 | 
						|
  it('should run ngcc without errors for esm5', () => {
 | 
						|
    const format = 'esm5';
 | 
						|
    expect(mainNgcc(['-f', format, '-s', '/node_modules'])).toBe(0);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
 | 
						|
function createMockFileSystem() {
 | 
						|
  const packagesPath = join(process.env.TEST_SRCDIR !, 'angular/packages');
 | 
						|
  mockFs({'/node_modules/@angular': loadPackages(packagesPath)});
 | 
						|
  spyOn(Module, '_resolveFilename').and.callFake(mockResolve);
 | 
						|
}
 | 
						|
 | 
						|
function restoreRealFileSystem() {
 | 
						|
  mockFs.restore();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Load the built Angular packages into an in-memory structure.
 | 
						|
 * @param packagesPath the path to the folder containing the built packages.
 | 
						|
 */
 | 
						|
function loadPackages(packagesPath: string): Directory {
 | 
						|
  const packagesDirectory: Directory = {};
 | 
						|
  readdirSync(packagesPath).forEach(name => {
 | 
						|
    const packagePath = join(packagesPath, name);
 | 
						|
    if (!statSync(packagePath).isDirectory()) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    const npmPackagePath = join(packagePath, 'npm_package');
 | 
						|
    if (!existsSync(npmPackagePath)) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    packagesDirectory[name] = loadDirectory(npmPackagePath);
 | 
						|
  });
 | 
						|
  return packagesDirectory;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Load real files from the filesystem into an "in-memory" structure,
 | 
						|
 * which can be used with `mock-fs`.
 | 
						|
 * @param directoryPath the path to the directory we want to load.
 | 
						|
 */
 | 
						|
function loadDirectory(directoryPath: string): Directory {
 | 
						|
  const directory: Directory = {};
 | 
						|
 | 
						|
  readdirSync(directoryPath).forEach(item => {
 | 
						|
    const itemPath = join(directoryPath, item);
 | 
						|
    if (statSync(itemPath).isDirectory()) {
 | 
						|
      directory[item] = loadDirectory(itemPath);
 | 
						|
    } else {
 | 
						|
      directory[item] = readFileSync(itemPath, 'utf-8');
 | 
						|
    }
 | 
						|
  });
 | 
						|
 | 
						|
  return directory;
 | 
						|
}
 | 
						|
 | 
						|
interface Directory {
 | 
						|
  [pathSegment: string]: string|Directory;
 | 
						|
}
 | 
						|
 | 
						|
function isInBazel() {
 | 
						|
  return process.env.TEST_SRCDIR != null;
 | 
						|
}
 | 
						|
 | 
						|
function mockResolve(p: string): string|null {
 | 
						|
  if (existsSync(p)) {
 | 
						|
    const stat = statSync(p);
 | 
						|
    if (stat.isFile()) {
 | 
						|
      return p;
 | 
						|
    } else if (stat.isDirectory()) {
 | 
						|
      const pIndex = mockResolve(p + '/index');
 | 
						|
      if (pIndex && existsSync(pIndex)) {
 | 
						|
        return pIndex;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  for (const ext of ['.js', '.d.ts']) {
 | 
						|
    if (existsSync(p + ext)) {
 | 
						|
      return p + ext;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return null;
 | 
						|
} |