fix(core): avoid migration error when non-existent symbol is imported (#36367)
In rare cases a project with configured `rootDirs` that has imports to non-existent identifiers could fail in the migration. This happens because based on the application code, the migration could end up trying to resolve the `ts.Symbol` of such non-existent identifiers. This isn't a problem usually, but due to a upstream bug in the TypeScript compiler, a runtime error is thrown. This is because TypeScript is unable to compute a relative path from the originating source file to the imported source file which _should_ provide the non-existent identifier. An issue for this has been reported upstream: https://github.com/microsoft/TypeScript/issues/37731. The issue only surfaces since our migrations don't provide an absolute base path that is used for resolving the root directories. To fix this, we ensure that we never use relative paths when parsing tsconfig files. More details can be found in the TS issue. Fixes #36346. PR Close #36367
This commit is contained in:

committed by
Kara Erickson

parent
56af303dc3
commit
dff52ecb11
@ -6,15 +6,14 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import {Rule, SchematicContext, SchematicsException, Tree} from '@angular-devkit/schematics';
|
||||
import {dirname, relative} from 'path';
|
||||
import {Rule, SchematicsException, Tree} from '@angular-devkit/schematics';
|
||||
import {relative} from 'path';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {getProjectTsConfigPaths} from '../../utils/project_tsconfig_paths';
|
||||
import {createMigrationCompilerHost} from '../../utils/typescript/compiler_host';
|
||||
import {parseTsconfigFile} from '../../utils/typescript/parse_tsconfig';
|
||||
import {createMigrationProgram} from '../../utils/typescript/compiler_host';
|
||||
|
||||
import {HelperFunction, getHelper} from './helpers';
|
||||
import {getHelper, HelperFunction} from './helpers';
|
||||
import {migrateExpression, replaceImport} from './migration';
|
||||
import {findCoreImport, findRendererReferences} from './util';
|
||||
|
||||
@ -42,8 +41,7 @@ export default function(): Rule {
|
||||
}
|
||||
|
||||
function runRendererToRenderer2Migration(tree: Tree, tsconfigPath: string, basePath: string) {
|
||||
const parsed = parseTsconfigFile(tsconfigPath, dirname(tsconfigPath));
|
||||
const host = createMigrationCompilerHost(tree, parsed.options, basePath, fileName => {
|
||||
const {program} = createMigrationProgram(tree, tsconfigPath, basePath, fileName => {
|
||||
// In case the module augmentation file has been requested, we return a source file that
|
||||
// augments "@angular/core" to include a named export called "Renderer". This ensures that
|
||||
// we can rely on the type checker for this migration in v9 where "Renderer" has been removed.
|
||||
@ -56,10 +54,7 @@ function runRendererToRenderer2Migration(tree: Tree, tsconfigPath: string, baseP
|
||||
`;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
const program =
|
||||
ts.createProgram(parsed.fileNames.concat(MODULE_AUGMENTATION_FILENAME), parsed.options, host);
|
||||
}, [MODULE_AUGMENTATION_FILENAME]);
|
||||
const typeChecker = program.getTypeChecker();
|
||||
const printer = ts.createPrinter();
|
||||
const sourceFiles = program.getSourceFiles().filter(
|
||||
|
Reference in New Issue
Block a user