fix(compiler-cli): resolve `rootDirs` to absolute (#41359)
Ensure that `rootDirs` are absolute by resolving them against the current working directory. Fixes #36290 PR Close #41359
This commit is contained in:
parent
6ba67c6fff
commit
3e0fda96b8
|
@ -10,7 +10,7 @@ const TS = /\.tsx?$/i;
|
||||||
const D_TS = /\.d\.ts$/i;
|
const D_TS = /\.d\.ts$/i;
|
||||||
|
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
import {AbsoluteFsPath, absoluteFrom} from '../../file_system';
|
import {AbsoluteFsPath, getFileSystem} from '../../file_system';
|
||||||
import {DeclarationNode} from '../../reflection';
|
import {DeclarationNode} from '../../reflection';
|
||||||
|
|
||||||
export function isDtsPath(filePath: string): boolean {
|
export function isDtsPath(filePath: string): boolean {
|
||||||
|
@ -96,19 +96,21 @@ export function getRootDirs(
|
||||||
host: Pick<ts.CompilerHost, 'getCurrentDirectory'|'getCanonicalFileName'>,
|
host: Pick<ts.CompilerHost, 'getCurrentDirectory'|'getCanonicalFileName'>,
|
||||||
options: ts.CompilerOptions): AbsoluteFsPath[] {
|
options: ts.CompilerOptions): AbsoluteFsPath[] {
|
||||||
const rootDirs: string[] = [];
|
const rootDirs: string[] = [];
|
||||||
|
const cwd = host.getCurrentDirectory();
|
||||||
|
const fs = getFileSystem();
|
||||||
if (options.rootDirs !== undefined) {
|
if (options.rootDirs !== undefined) {
|
||||||
rootDirs.push(...options.rootDirs);
|
rootDirs.push(...options.rootDirs);
|
||||||
} else if (options.rootDir !== undefined) {
|
} else if (options.rootDir !== undefined) {
|
||||||
rootDirs.push(options.rootDir);
|
rootDirs.push(options.rootDir);
|
||||||
} else {
|
} else {
|
||||||
rootDirs.push(host.getCurrentDirectory());
|
rootDirs.push(cwd);
|
||||||
}
|
}
|
||||||
|
|
||||||
// In Windows the above might not always return posix separated paths
|
// In Windows the above might not always return posix separated paths
|
||||||
// See:
|
// See:
|
||||||
// https://github.com/Microsoft/TypeScript/blob/3f7357d37f66c842d70d835bc925ec2a873ecfec/src/compiler/sys.ts#L650
|
// https://github.com/Microsoft/TypeScript/blob/3f7357d37f66c842d70d835bc925ec2a873ecfec/src/compiler/sys.ts#L650
|
||||||
// Also compiler options might be set via an API which doesn't normalize paths
|
// Also compiler options might be set via an API which doesn't normalize paths
|
||||||
return rootDirs.map(rootDir => absoluteFrom(host.getCanonicalFileName(rootDir)));
|
return rootDirs.map(rootDir => fs.resolve(cwd, host.getCanonicalFileName(rootDir)));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function nodeDebugInfo(node: ts.Node): string {
|
export function nodeDebugInfo(node: ts.Node): string {
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {FileSystem, getFileSystem} from '../../file_system';
|
||||||
|
import {runInEachFileSystem} from '../../file_system/testing';
|
||||||
|
import {getRootDirs} from '../src/typescript';
|
||||||
|
|
||||||
|
runInEachFileSystem(() => {
|
||||||
|
let fs: FileSystem;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fs = getFileSystem();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('typescript', () => {
|
||||||
|
it('should allow relative root directories', () => {
|
||||||
|
const mockCompilerHost = {
|
||||||
|
getCanonicalFileName: (val: string) => val,
|
||||||
|
getCurrentDirectory: () => '/fs-root/projects'
|
||||||
|
};
|
||||||
|
const result = getRootDirs(mockCompilerHost, {rootDir: './test-project-root'});
|
||||||
|
expect(result).toEqual([fs.resolve('/fs-root/projects/test-project-root')]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue