diff --git a/packages/compiler-cli/src/metadata/bundler.ts b/packages/compiler-cli/src/metadata/bundler.ts index 6ce4ae19c39fc..857a8b8e92e0e 100644 --- a/packages/compiler-cli/src/metadata/bundler.ts +++ b/packages/compiler-cli/src/metadata/bundler.ts @@ -180,6 +180,7 @@ export class MetadataBundler { // Export all the re-exports from this module if (module && module.exports) { + let unnamedModuleExportsIdx = 0; for (const exportDeclaration of module.exports) { const exportFrom = resolveModule(exportDeclaration.from, moduleName); // Record all the exports from the module even if we don't use it directly. @@ -202,7 +203,12 @@ export class MetadataBundler { // Re-export all the symbols from the module const exportedSymbols = this.exportAll(exportFrom); for (const exportedSymbol of exportedSymbols) { - const name = exportedSymbol.name; + // In case the exported symbol does not have a name, we need to give it an unique + // name for the current module. This is necessary because there can be multiple + // unnamed re-exports in a given module. + const name = exportedSymbol.name === '*' ? + `unnamed_reexport_${unnamedModuleExportsIdx++}` : + exportedSymbol.name; exportSymbol(exportedSymbol, name); } } diff --git a/packages/compiler-cli/test/metadata/bundler_spec.ts b/packages/compiler-cli/test/metadata/bundler_spec.ts index 68f3ca6941bdb..640caf558babf 100644 --- a/packages/compiler-cli/test/metadata/bundler_spec.ts +++ b/packages/compiler-cli/test/metadata/bundler_spec.ts @@ -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': `