fix(ngcc): always add exports for ModuleWithProviders
references (#33875)
In #32902 a bug was supposedly fixed where internal classes as used within `ModuleWithProviders` are publicly exported, even when the typings file already contained the generic type on the `ModuleWithProviders`. This fix turns out to have been incomplete, as the `ModuleWithProviders` analysis is not done when not processing the typings files. The effect of this bug is that formats that are processed after the initial format had been processed would not have exports for internal symbols, resulting in "export '...' was not found in '...'" errors. This commit fixes the bug by always running the `ModuleWithProviders` analyzer. An integration test has been added that would fail prior to this change. Fixes #33701 PR Close #33875
This commit is contained in:
@ -175,6 +175,54 @@ runInEachFileSystem(() => {
|
||||
expect(jsContents).toMatch(/\bvar _c0 =/);
|
||||
});
|
||||
|
||||
it('should add generic type for ModuleWithProviders and generate exports for private modules',
|
||||
() => {
|
||||
compileIntoApf('test-package', {
|
||||
'/index.ts': `
|
||||
import {ModuleWithProviders} from '@angular/core';
|
||||
import {InternalFooModule} from './internal';
|
||||
|
||||
export class FooModule {
|
||||
static forRoot(): ModuleWithProviders {
|
||||
return {
|
||||
ngModule: InternalFooModule,
|
||||
};
|
||||
}
|
||||
}
|
||||
`,
|
||||
'/internal.ts': `
|
||||
import {NgModule} from '@angular/core';
|
||||
|
||||
@NgModule()
|
||||
export class InternalFooModule {}
|
||||
`,
|
||||
});
|
||||
|
||||
mainNgcc({
|
||||
basePath: '/node_modules',
|
||||
targetEntryPointPath: 'test-package',
|
||||
propertiesToConsider: ['esm2015', 'esm5', 'module'],
|
||||
});
|
||||
|
||||
// The .d.ts where FooModule is declared should have a generic type added
|
||||
const dtsContents = fs.readFile(_(`/node_modules/test-package/src/index.d.ts`));
|
||||
expect(dtsContents).toContain(`import * as ɵngcc0 from './internal';`);
|
||||
expect(dtsContents)
|
||||
.toContain(`static forRoot(): ModuleWithProviders<ɵngcc0.InternalFooModule>`);
|
||||
|
||||
// The public facing .d.ts should export the InternalFooModule
|
||||
const entryDtsContents = fs.readFile(_(`/node_modules/test-package/index.d.ts`));
|
||||
expect(entryDtsContents).toContain(`export {InternalFooModule} from './src/internal';`);
|
||||
|
||||
// The esm2015 index source should export the InternalFooModule
|
||||
const esm2015Contents = fs.readFile(_(`/node_modules/test-package/esm2015/index.js`));
|
||||
expect(esm2015Contents).toContain(`export {InternalFooModule} from './src/internal';`);
|
||||
|
||||
// The esm5 index source should also export the InternalFooModule
|
||||
const esm5Contents = fs.readFile(_(`/node_modules/test-package/esm5/index.js`));
|
||||
expect(esm5Contents).toContain(`export {InternalFooModule} from './src/internal';`);
|
||||
});
|
||||
|
||||
describe('in async mode', () => {
|
||||
it('should run ngcc without errors for fesm2015', async() => {
|
||||
const promise = mainNgcc({
|
||||
|
Reference in New Issue
Block a user