fix(compiler-cli): incorrect metadata bundle for multiple unnamed re-exports (#29360)
Currently if an Angular library has multiple unnamed module re-exports, NGC will generate incorrect metdata if the project is using the flat-module bundle option. e.g. _public-api.ts_ ```ts export * from '@mypkg/secondary1'; export * from '@mypkg/secondary2'; ``` There are clearly two unnamed re-exports in the `public-api.ts` file. NGC right now accidentally overwrites all previous re-exports with the last one. Resulting in the generated metadata only containing a reference to `@mypkg/secondary2`. This is problematic as it is common for primary library entry-points to have multiple re-exports (e.g. Material re-exporting all public symbols; or flex-layout exporting all public symbols from their secondary entry-points). Currently Angular Material works around this issue by manually creating a metadata file that declares the re-exports from all unnamed re-exports. (see: https://github.com/angular/material2/blob/master/tools/package-tools/build-release.ts#L78-L85) This workaround works fine currently, but is no longer easily integrated when building the package output with Bazel. In order to be able to build such libraries with Bazel (Material/flex-layout), we need to make sure that NGC generates the proper flat-module metadata bundle. PR Close #29360
This commit is contained in:

committed by
Matias Niemelä

parent
2ab194c999
commit
105cfaf5e4
@ -422,6 +422,21 @@ describe('metadata bundler', () => {
|
||||
expect(result.metadata.origins !['E']).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should be able to bundle a library with multiple unnamed re-exports', () => {
|
||||
const host = new MockStringBundlerHost('/', {
|
||||
'public-api.ts': `
|
||||
export * from '@mypkg/secondary1';
|
||||
export * from '@mypkg/secondary2';
|
||||
`,
|
||||
});
|
||||
|
||||
const bundler = new MetadataBundler('/public-api', undefined, host);
|
||||
const result = bundler.getMetadataBundle();
|
||||
expect(result.metadata.exports).toEqual([
|
||||
{from: '@mypkg/secondary1'}, {from: '@mypkg/secondary2'}
|
||||
]);
|
||||
});
|
||||
|
||||
it('should be able to de-duplicate symbols of re-exported modules', () => {
|
||||
const host = new MockStringBundlerHost('/', {
|
||||
'public-api.ts': `
|
||||
|
Reference in New Issue
Block a user