
Previously, when an entry-point was ignored via an ngcc config, ngcc would scan sub-directories for sub-entry-points, but would not use the correct `packagePath`. For example, if `@angular/common` was ignored, it would look at `@angular/common/http` but incorrectly use `.../@angular/common/http` as the `packagePath` (instead of `.../@angular/common`). As a result, it would not retrieve the correct ngcc config for the actual package. This commit fixes it by ensuring the correct `packagePath` is used, even if the primary entry-point corresponding to that path is ignored. In order to do this, a new return value for `getEntryPointInfo()` is added: `IGNORED_ENTRY_POINT`. This is used to differentiate between directories that correspond to no or an incompatible entry-point and those that correspond to an entry-point that could otherwise be valid but is explicitly ignored. Consumers of `getEntryPointInfo()` can then use this info to discard ignored entry-points, but still use the correct `packagePath` when scanning their sub-directories for secondary entry-points. PR Close #37040
87 lines
2.9 KiB
TypeScript
87 lines
2.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC 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
|
|
*/
|
|
|
|
/// <reference types="node" />
|
|
import {readdirSync, readFileSync, statSync} from 'fs';
|
|
import {resolve} from 'path';
|
|
|
|
import {getAngularPackagesFromRunfiles, resolveNpmTreeArtifact} from '..';
|
|
import {AbsoluteFsPath, FileSystem, getFileSystem} from '../../../src/ngtsc/file_system';
|
|
import {Folder, MockFileSystemPosix, TestFile} from '../../../src/ngtsc/file_system/testing';
|
|
|
|
export function loadTestFiles(files: TestFile[]) {
|
|
const fs = getFileSystem();
|
|
files.forEach(file => {
|
|
fs.ensureDir(fs.dirname(file.name));
|
|
fs.writeFile(file.name, file.contents);
|
|
});
|
|
}
|
|
|
|
export function loadStandardTestFiles(
|
|
{fakeCore = true, rxjs = false}: {fakeCore?: boolean, rxjs?: boolean} = {}): Folder {
|
|
const tmpFs = new MockFileSystemPosix(true);
|
|
const basePath = '/' as AbsoluteFsPath;
|
|
|
|
loadTestDirectory(
|
|
tmpFs, resolveNpmTreeArtifact('typescript'),
|
|
tmpFs.resolve(basePath, 'node_modules/typescript'));
|
|
|
|
loadTsLib(tmpFs, basePath);
|
|
|
|
if (fakeCore) {
|
|
loadFakeCore(tmpFs, basePath);
|
|
} else {
|
|
getAngularPackagesFromRunfiles().forEach(({name, pkgPath}) => {
|
|
loadTestDirectory(tmpFs, pkgPath, tmpFs.resolve(basePath, 'node_modules/@angular', name));
|
|
});
|
|
}
|
|
|
|
if (rxjs) {
|
|
loadTestDirectory(
|
|
tmpFs, resolveNpmTreeArtifact('rxjs'), tmpFs.resolve(basePath, 'node_modules/rxjs'));
|
|
}
|
|
|
|
return tmpFs.dump();
|
|
}
|
|
|
|
export function loadTsLib(fs: FileSystem, basePath: string = '/') {
|
|
loadTestDirectory(
|
|
fs, resolveNpmTreeArtifact('tslib'), fs.resolve(basePath, 'node_modules/tslib'));
|
|
}
|
|
|
|
export function loadFakeCore(fs: FileSystem, basePath: string = '/') {
|
|
loadTestDirectory(
|
|
fs, resolveNpmTreeArtifact('angular/packages/compiler-cli/test/ngtsc/fake_core/npm_package'),
|
|
fs.resolve(basePath, 'node_modules/@angular/core'));
|
|
}
|
|
|
|
/**
|
|
* Load real files from the real file-system into a mock file-system.
|
|
* @param fs the file-system where the directory is to be loaded.
|
|
* @param directoryPath the path to the directory we want to load.
|
|
* @param mockPath the path within the mock file-system where the directory is to be loaded.
|
|
*/
|
|
export function loadTestDirectory(
|
|
fs: FileSystem, directoryPath: string, mockPath: AbsoluteFsPath): void {
|
|
readdirSync(directoryPath).forEach(item => {
|
|
const srcPath = resolve(directoryPath, item);
|
|
const targetPath = fs.resolve(mockPath, item);
|
|
try {
|
|
if (statSync(srcPath).isDirectory()) {
|
|
fs.ensureDir(targetPath);
|
|
loadTestDirectory(fs, srcPath, targetPath);
|
|
} else {
|
|
fs.ensureDir(fs.dirname(targetPath));
|
|
fs.writeFile(targetPath, readFileSync(srcPath, 'utf-8'));
|
|
}
|
|
} catch (e) {
|
|
console.warn(`Failed to add ${srcPath} to the mock file-system: ${e.message}`);
|
|
}
|
|
});
|
|
}
|