fix(tsc-wrapped): deduplicate metadata only when the module is the same (#19249)
Fixes #19219 PR Close #19249
This commit is contained in:
parent
2373186239
commit
b6b18c1d7f
@ -265,24 +265,25 @@ export class MetadataBundler {
|
|||||||
Array.from(this.symbolMap.values()).forEach(symbol => {
|
Array.from(this.symbolMap.values()).forEach(symbol => {
|
||||||
if (symbol.referenced && !symbol.reexport) {
|
if (symbol.referenced && !symbol.reexport) {
|
||||||
let name = symbol.name;
|
let name = symbol.name;
|
||||||
const declaredName = symbol.declaration !.name;
|
const identifier = `${symbol.declaration!.module}:${symbol.declaration !.name}`;
|
||||||
if (symbol.isPrivate && !symbol.privateName) {
|
if (symbol.isPrivate && !symbol.privateName) {
|
||||||
name = newPrivateName();
|
name = newPrivateName();
|
||||||
symbol.privateName = name;
|
symbol.privateName = name;
|
||||||
}
|
}
|
||||||
if (symbolsMap.has(declaredName)) {
|
if (symbolsMap.has(identifier)) {
|
||||||
const names = symbolsMap.get(declaredName);
|
const names = symbolsMap.get(identifier);
|
||||||
names !.push(name);
|
names !.push(name);
|
||||||
} else {
|
} else {
|
||||||
symbolsMap.set(declaredName, [name]);
|
symbolsMap.set(identifier, [name]);
|
||||||
}
|
}
|
||||||
result[name] = symbol.value !;
|
result[name] = symbol.value !;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// check for duplicated entries
|
// check for duplicated entries
|
||||||
symbolsMap.forEach((names: string[], declaredName: string) => {
|
symbolsMap.forEach((names: string[], identifier: string) => {
|
||||||
if (names.length > 1) {
|
if (names.length > 1) {
|
||||||
|
const [module, declaredName] = identifier.split(':');
|
||||||
// prefer the export that uses the declared name (if any)
|
// prefer the export that uses the declared name (if any)
|
||||||
let reference = names.indexOf(declaredName);
|
let reference = names.indexOf(declaredName);
|
||||||
if (reference === -1) {
|
if (reference === -1) {
|
||||||
|
@ -197,26 +197,32 @@ describe('metadata bundler', () => {
|
|||||||
const host = new MockStringBundlerHost('/', {
|
const host = new MockStringBundlerHost('/', {
|
||||||
'public-api.ts': `
|
'public-api.ts': `
|
||||||
export {A as A2, A, B as B1, B as B2} from './src/core';
|
export {A as A2, A, B as B1, B as B2} from './src/core';
|
||||||
|
export {A as A3} from './src/alternate';
|
||||||
`,
|
`,
|
||||||
'src': {
|
'src': {
|
||||||
'core.ts': `
|
'core.ts': `
|
||||||
export class A {}
|
export class A {}
|
||||||
export class B {}
|
export class B {}
|
||||||
`,
|
`,
|
||||||
|
'alternate.ts': `
|
||||||
|
export class A {}
|
||||||
|
`,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const bundler = new MetadataBundler('/public-api', undefined, host);
|
const bundler = new MetadataBundler('/public-api', undefined, host);
|
||||||
const result = bundler.getMetadataBundle();
|
const result = bundler.getMetadataBundle();
|
||||||
const {A, A2, B1, B2} = result.metadata.metadata as{
|
const {A, A2, A3, B1, B2} = result.metadata.metadata as{
|
||||||
A: ClassMetadata,
|
A: ClassMetadata,
|
||||||
A2: MetadataGlobalReferenceExpression,
|
A2: MetadataGlobalReferenceExpression,
|
||||||
|
A3: ClassMetadata,
|
||||||
B1: ClassMetadata,
|
B1: ClassMetadata,
|
||||||
B2: MetadataGlobalReferenceExpression
|
B2: MetadataGlobalReferenceExpression
|
||||||
};
|
};
|
||||||
expect(A.__symbolic).toEqual('class');
|
expect(A.__symbolic).toEqual('class');
|
||||||
expect(A2.__symbolic).toEqual('reference');
|
expect(A2.__symbolic).toEqual('reference');
|
||||||
expect(A2.name).toEqual('A');
|
expect(A2.name).toEqual('A');
|
||||||
|
expect(A3.__symbolic).toEqual('class');
|
||||||
expect(B1.__symbolic).toEqual('class');
|
expect(B1.__symbolic).toEqual('class');
|
||||||
expect(B2.__symbolic).toEqual('reference');
|
expect(B2.__symbolic).toEqual('reference');
|
||||||
expect(B2.name).toEqual('B1');
|
expect(B2.name).toEqual('B1');
|
||||||
|
@ -265,24 +265,25 @@ export class MetadataBundler {
|
|||||||
Array.from(this.symbolMap.values()).forEach(symbol => {
|
Array.from(this.symbolMap.values()).forEach(symbol => {
|
||||||
if (symbol.referenced && !symbol.reexport) {
|
if (symbol.referenced && !symbol.reexport) {
|
||||||
let name = symbol.name;
|
let name = symbol.name;
|
||||||
const declaredName = symbol.declaration !.name;
|
const identifier = `${symbol.declaration!.module}:${symbol.declaration !.name}`;
|
||||||
if (symbol.isPrivate && !symbol.privateName) {
|
if (symbol.isPrivate && !symbol.privateName) {
|
||||||
name = newPrivateName();
|
name = newPrivateName();
|
||||||
symbol.privateName = name;
|
symbol.privateName = name;
|
||||||
}
|
}
|
||||||
if (symbolsMap.has(declaredName)) {
|
if (symbolsMap.has(identifier)) {
|
||||||
const names = symbolsMap.get(declaredName);
|
const names = symbolsMap.get(identifier);
|
||||||
names !.push(name);
|
names !.push(name);
|
||||||
} else {
|
} else {
|
||||||
symbolsMap.set(declaredName, [name]);
|
symbolsMap.set(identifier, [name]);
|
||||||
}
|
}
|
||||||
result[name] = symbol.value !;
|
result[name] = symbol.value !;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// check for duplicated entries
|
// check for duplicated entries
|
||||||
symbolsMap.forEach((names: string[], declaredName: string) => {
|
symbolsMap.forEach((names: string[], identifier: string) => {
|
||||||
if (names.length > 1) {
|
if (names.length > 1) {
|
||||||
|
const [module, declaredName] = identifier.split(':');
|
||||||
// prefer the export that uses the declared name (if any)
|
// prefer the export that uses the declared name (if any)
|
||||||
let reference = names.indexOf(declaredName);
|
let reference = names.indexOf(declaredName);
|
||||||
if (reference === -1) {
|
if (reference === -1) {
|
||||||
|
@ -197,26 +197,32 @@ describe('metadata bundler', () => {
|
|||||||
const host = new MockStringBundlerHost('/', {
|
const host = new MockStringBundlerHost('/', {
|
||||||
'public-api.ts': `
|
'public-api.ts': `
|
||||||
export {A as A2, A, B as B1, B as B2} from './src/core';
|
export {A as A2, A, B as B1, B as B2} from './src/core';
|
||||||
|
export {A as A3} from './src/alternate';
|
||||||
`,
|
`,
|
||||||
'src': {
|
'src': {
|
||||||
'core.ts': `
|
'core.ts': `
|
||||||
export class A {}
|
export class A {}
|
||||||
export class B {}
|
export class B {}
|
||||||
`,
|
`,
|
||||||
|
'alternate.ts': `
|
||||||
|
export class A {}
|
||||||
|
`,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const bundler = new MetadataBundler('/public-api', undefined, host);
|
const bundler = new MetadataBundler('/public-api', undefined, host);
|
||||||
const result = bundler.getMetadataBundle();
|
const result = bundler.getMetadataBundle();
|
||||||
const {A, A2, B1, B2} = result.metadata.metadata as{
|
const {A, A2, A3, B1, B2} = result.metadata.metadata as{
|
||||||
A: ClassMetadata,
|
A: ClassMetadata,
|
||||||
A2: MetadataGlobalReferenceExpression,
|
A2: MetadataGlobalReferenceExpression,
|
||||||
|
A3: ClassMetadata,
|
||||||
B1: ClassMetadata,
|
B1: ClassMetadata,
|
||||||
B2: MetadataGlobalReferenceExpression
|
B2: MetadataGlobalReferenceExpression
|
||||||
};
|
};
|
||||||
expect(A.__symbolic).toEqual('class');
|
expect(A.__symbolic).toEqual('class');
|
||||||
expect(A2.__symbolic).toEqual('reference');
|
expect(A2.__symbolic).toEqual('reference');
|
||||||
expect(A2.name).toEqual('A');
|
expect(A2.name).toEqual('A');
|
||||||
|
expect(A3.__symbolic).toEqual('class');
|
||||||
expect(B1.__symbolic).toEqual('class');
|
expect(B1.__symbolic).toEqual('class');
|
||||||
expect(B2.__symbolic).toEqual('reference');
|
expect(B2.__symbolic).toEqual('reference');
|
||||||
expect(B2.name).toEqual('B1');
|
expect(B2.name).toEqual('B1');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user