@compodoc/compodoc
Version:
The missing documentation tool for your Angular application
85 lines (68 loc) • 2.85 kB
text/typescript
import * as _ from '../../../utils/collection.util';
import { IInterfaceDep } from '../../compiler/angular/dependencies.interfaces';
export class InterfaceDeclarationMerger {
public merge(interfaces: IInterfaceDep[]): IInterfaceDep[] {
if (!interfaces || interfaces.length === 0) {
return [];
}
const mergedInterfaces = _.chain(interfaces)
.filter((interf: IInterfaceDep) => !!interf.declarationMergeId)
.groupBy((interf: IInterfaceDep) => interf.declarationMergeId)
.values()
.map((group: IInterfaceDep[]) => this.mergeGroup(group))
.value();
const regularInterfaces = interfaces.filter(
(interf: IInterfaceDep) => !interf.declarationMergeId
);
return _.concat(regularInterfaces, mergedInterfaces);
}
private mergeGroup(group: IInterfaceDep[]): IInterfaceDep {
const merged = { ...group[0] };
const properties = this.mergeUniqueArrayValues(group.map(interf => interf.properties));
if (properties) {
merged.properties = properties;
}
const methods = this.mergeUniqueArrayValues(group.map(interf => interf.methods));
if (methods) {
merged.methods = methods;
}
const indexSignatures = this.mergeUniqueArrayValues(
group.map(interf => interf.indexSignatures)
);
if (indexSignatures) {
merged.indexSignatures = indexSignatures;
}
const extendsList = this.mergeUniqueArrayValues(group.map(interf => interf.extends));
if (extendsList) {
merged.extends = extendsList;
}
merged.deprecated = group.some(interf => !!interf.deprecated);
merged.deprecationMessage = this.mergeDeprecationMessages(group);
return merged;
}
private mergeDeprecationMessages(group: IInterfaceDep[]): string {
const deprecationMessages = _.uniq(
group.map(interf => interf.deprecationMessage).filter(Boolean)
);
return deprecationMessages.length > 0 ? deprecationMessages.join('\n\n') : '';
}
private mergeUniqueArrayValues<T>(arrays: Array<T[] | undefined>): T[] | undefined {
const merged = [];
const cache = new Set<string>();
for (const arr of arrays) {
if (!arr || arr.length === 0) {
continue;
}
for (const item of arr) {
const key =
typeof item === 'object' && item !== null ? JSON.stringify(item) : String(item);
if (cache.has(key)) {
continue;
}
cache.add(key);
merged.push(item);
}
}
return merged.length > 0 ? merged : undefined;
}
}