fix(ivy): unable to import shim factory files on case-insensitive platforms (#28831)
This change is kind of similar to #27466, but instead of ensuring that these shims can be generated, we also need to make sure that developers are able to also use the factory shims like with `ngc`. This issue is now surfacing because we have various old examples which are now also built with `ngtsc` (due to the bazel migration). On case insensitive platforms (e.g. windows) these examples cannot be built because ngtsc fails the app imports a generated shim file (such as the factory shim files). This is because the `GeneratedShimsHostWrapper` TypeScript host uses the `getCanonicalFileName` method in order to check whether a given file/module exists in the generator file maps. e.g. ``` // Generator Map: 'C:/users/paul/_bazel_paul/lm3s4mgv/execroot/angular/packages/core/index.ngfactory.ts' => 'C:/users/paul/_bazel_paul/lm3s4mgv/execroot/angular/packages/core/index.ts', // Path passed into `fileExists` C:/users/paul/_bazel_paul/lm3s4mgv/execroot/angular/packages/core/index.ngfactory.ts // After getCanonicalFileName (notice the **lower-case drive name**) c:/users/paul/_bazel_paul/lm3s4mgv/execroot/angular/packages/core/index.ngfactory.ts ``` As seen above, the generator map does not use the canonical file names, as well as TypeScript internally does not pass around canonical file names. We can fix this by removing the manual call to `getCanonicalFileName` and just following TypeScript internal-semantics. PR Close #28831
This commit is contained in:
parent
3336de0970
commit
58436fd81a
|
@ -95,11 +95,10 @@ export class GeneratedShimsHostWrapper implements ts.CompilerHost {
|
||||||
getNewLine(): string { return this.delegate.getNewLine(); }
|
getNewLine(): string { return this.delegate.getNewLine(); }
|
||||||
|
|
||||||
fileExists(fileName: string): boolean {
|
fileExists(fileName: string): boolean {
|
||||||
const canonical = this.getCanonicalFileName(fileName);
|
|
||||||
// Consider the file as existing whenever 1) it really does exist in the delegate host, or
|
// Consider the file as existing whenever 1) it really does exist in the delegate host, or
|
||||||
// 2) at least one of the shim generators recognizes it.
|
// 2) at least one of the shim generators recognizes it.
|
||||||
return this.delegate.fileExists(fileName) ||
|
return this.delegate.fileExists(fileName) ||
|
||||||
this.shimGenerators.some(gen => gen.recognize(canonical));
|
this.shimGenerators.some(gen => gen.recognize(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
readFile(fileName: string): string|undefined { return this.delegate.readFile(fileName); }
|
readFile(fileName: string): string|undefined { return this.delegate.readFile(fileName); }
|
||||||
|
|
|
@ -1550,6 +1550,23 @@ describe('ngtsc behavioral tests', () => {
|
||||||
expect(emptyFactory).toContain(`export var ɵNonEmptyModule = true;`);
|
expect(emptyFactory).toContain(`export var ɵNonEmptyModule = true;`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should be able to compile an app using the factory shim', () => {
|
||||||
|
env.tsconfig({'allowEmptyCodegenFiles': true});
|
||||||
|
|
||||||
|
env.write('test.ts', `
|
||||||
|
export {MyModuleNgFactory} from './my-module.ngfactory';
|
||||||
|
`);
|
||||||
|
|
||||||
|
env.write('my-module.ts', `
|
||||||
|
import {NgModule} from '@angular/core';
|
||||||
|
|
||||||
|
@NgModule({})
|
||||||
|
export class MyModule {}
|
||||||
|
`);
|
||||||
|
|
||||||
|
env.driveMain();
|
||||||
|
});
|
||||||
|
|
||||||
it('should generate correct imports in factory stubs when compiling @angular/core', () => {
|
it('should generate correct imports in factory stubs when compiling @angular/core', () => {
|
||||||
env.tsconfig({'allowEmptyCodegenFiles': true});
|
env.tsconfig({'allowEmptyCodegenFiles': true});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue