fix(ivy): ngtsc - NgtscCompilerHost should cope with directories that look like files (#31289)
The TS compiler is likely to test paths with extensions and try to load them as files. Therefore `fileExists()` and methods that rely on it need to be able to distinguish between real files and directories that have paths that look like files. This came up as a bug in ngcc when trying to process `ngx-virtual-scroller`, which relies upon a library called `@tweenjs/tween.js`. PR Close #31289
This commit is contained in:
parent
19e8570ac0
commit
d171006083
|
@ -58,7 +58,7 @@ export class NgtscCompilerHost implements ts.CompilerHost {
|
|||
|
||||
fileExists(fileName: string): boolean {
|
||||
const absPath = this.fs.resolve(fileName);
|
||||
return this.fs.exists(absPath);
|
||||
return this.fs.exists(absPath) && this.fs.stat(absPath).isFile();
|
||||
}
|
||||
|
||||
readFile(fileName: string): string|undefined {
|
||||
|
|
|
@ -12,6 +12,7 @@ ts_library(
|
|||
"//packages:types",
|
||||
"//packages/compiler-cli/src/ngtsc/file_system",
|
||||
"//packages/compiler-cli/src/ngtsc/file_system/testing",
|
||||
"@npm//typescript",
|
||||
],
|
||||
)
|
||||
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
/**
|
||||
* @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 * as ts from 'typescript';
|
||||
import {NgtscCompilerHost} from '../src/compiler_host';
|
||||
import {absoluteFrom, getFileSystem} from '../src/helpers';
|
||||
import {runInEachFileSystem} from '../testing';
|
||||
|
||||
runInEachFileSystem(() => {
|
||||
describe('NgtscCompilerHost', () => {
|
||||
describe('fileExists()', () => {
|
||||
it('should return `false` for an existing directory', () => {
|
||||
const directory = absoluteFrom('/a/b/c');
|
||||
const fs = getFileSystem();
|
||||
fs.ensureDir(directory);
|
||||
const host = new NgtscCompilerHost(fs);
|
||||
expect(host.fileExists(directory)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('readFile()', () => {
|
||||
it('should return `undefined` for an existing directory', () => {
|
||||
const directory = absoluteFrom('/a/b/c');
|
||||
const fs = getFileSystem();
|
||||
fs.ensureDir(directory);
|
||||
const host = new NgtscCompilerHost(fs);
|
||||
expect(host.readFile(directory)).toBe(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getSourceFile()', () => {
|
||||
it('should return `undefined` for an existing directory', () => {
|
||||
const directory = absoluteFrom('/a/b/c');
|
||||
const fs = getFileSystem();
|
||||
fs.ensureDir(directory);
|
||||
const host = new NgtscCompilerHost(fs);
|
||||
expect(host.getSourceFile(directory, ts.ScriptTarget.ES2015)).toBe(undefined);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue