feat(tsc-wrapped): record original location of flattened symbols (#15367)
Added an "origins" section to the flat module `.metadata.json` files that records where the original symbols was declared. This allows correctly calculating relative path references recorded in metadata.
This commit is contained in:
parent
5efc86069f
commit
7354949763
|
@ -92,7 +92,7 @@ export class MetadataBundler {
|
||||||
const exportedSymbols = this.exportAll(this.rootModule);
|
const exportedSymbols = this.exportAll(this.rootModule);
|
||||||
this.canonicalizeSymbols(exportedSymbols);
|
this.canonicalizeSymbols(exportedSymbols);
|
||||||
// TODO: exports? e.g. a module re-exports a symbol from another bundle
|
// TODO: exports? e.g. a module re-exports a symbol from another bundle
|
||||||
const entries = this.getEntries(exportedSymbols);
|
const metadata = this.getEntries(exportedSymbols);
|
||||||
const privates = Array.from(this.symbolMap.values())
|
const privates = Array.from(this.symbolMap.values())
|
||||||
.filter(s => s.referenced && s.isPrivate)
|
.filter(s => s.referenced && s.isPrivate)
|
||||||
.map(s => ({
|
.map(s => ({
|
||||||
|
@ -100,9 +100,15 @@ export class MetadataBundler {
|
||||||
name: s.declaration.name,
|
name: s.declaration.name,
|
||||||
module: s.declaration.module
|
module: s.declaration.module
|
||||||
}));
|
}));
|
||||||
|
const origins = Array.from(this.symbolMap.values())
|
||||||
|
.filter(s => s.referenced)
|
||||||
|
.reduce<{[name: string]: string}>((p, s) => {
|
||||||
|
p[s.isPrivate ? s.privateName : s.name] = s.declaration.module;
|
||||||
|
return p;
|
||||||
|
}, {});
|
||||||
return {
|
return {
|
||||||
metadata:
|
metadata:
|
||||||
{__symbolic: 'module', version: VERSION, metadata: entries, importAs: this.importAs},
|
{__symbolic: 'module', version: VERSION, metadata, origins, importAs: this.importAs},
|
||||||
privates
|
privates
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -235,7 +241,6 @@ export class MetadataBundler {
|
||||||
let name = symbol.name;
|
let name = symbol.name;
|
||||||
if (symbol.isPrivate && !symbol.privateName) {
|
if (symbol.isPrivate && !symbol.privateName) {
|
||||||
name = newPrivateName();
|
name = newPrivateName();
|
||||||
;
|
|
||||||
symbol.privateName = name;
|
symbol.privateName = name;
|
||||||
}
|
}
|
||||||
result[name] = symbol.value;
|
result[name] = symbol.value;
|
||||||
|
|
|
@ -25,6 +25,7 @@ export interface ModuleMetadata {
|
||||||
exports?: ModuleExportMetadata[];
|
exports?: ModuleExportMetadata[];
|
||||||
importAs?: string;
|
importAs?: string;
|
||||||
metadata: {[name: string]: MetadataEntry};
|
metadata: {[name: string]: MetadataEntry};
|
||||||
|
origins?: {[name: string]: string};
|
||||||
}
|
}
|
||||||
export function isModuleMetadata(value: any): value is ModuleMetadata {
|
export function isModuleMetadata(value: any): value is ModuleMetadata {
|
||||||
return value && value.__symbolic === 'module';
|
return value && value.__symbolic === 'module';
|
||||||
|
|
|
@ -25,9 +25,21 @@ describe('metadata bundler', () => {
|
||||||
expect(Object.keys(result.metadata.metadata).sort()).toEqual([
|
expect(Object.keys(result.metadata.metadata).sort()).toEqual([
|
||||||
'ONE_CLASSES', 'One', 'OneMore', 'TWO_CLASSES', 'Two', 'TwoMore', 'ɵa', 'ɵb'
|
'ONE_CLASSES', 'One', 'OneMore', 'TWO_CLASSES', 'Two', 'TwoMore', 'ɵa', 'ɵb'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
const originalOne = './src/one';
|
||||||
|
const originalTwo = './src/two/index';
|
||||||
|
expect(Object.keys(result.metadata.origins)
|
||||||
|
.sort()
|
||||||
|
.map(name => ({name, value: result.metadata.origins[name]})))
|
||||||
|
.toEqual([
|
||||||
|
{name: 'ONE_CLASSES', value: originalOne}, {name: 'One', value: originalOne},
|
||||||
|
{name: 'OneMore', value: originalOne}, {name: 'TWO_CLASSES', value: originalTwo},
|
||||||
|
{name: 'Two', value: originalTwo}, {name: 'TwoMore', value: originalTwo},
|
||||||
|
{name: 'ɵa', value: originalOne}, {name: 'ɵb', value: originalTwo}
|
||||||
|
]);
|
||||||
expect(result.privates).toEqual([
|
expect(result.privates).toEqual([
|
||||||
{privateName: 'ɵa', name: 'PrivateOne', module: './src/one'},
|
{privateName: 'ɵa', name: 'PrivateOne', module: originalOne},
|
||||||
{privateName: 'ɵb', name: 'PrivateTwo', module: './src/two/index'}
|
{privateName: 'ɵb', name: 'PrivateTwo', module: originalTwo}
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue