mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-10 00:23:30 +01:00
* chore: use descriptive type parameter names * refactor: requested changes --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import type { ApiItem, ApiItemContainerMixin } from '@discordjs/api-extractor-model';
|
|
|
|
/**
|
|
* Resolves all inherited members (including merged members) of a given parent.
|
|
*
|
|
* @param parent - The parent to resolve the inherited members of.
|
|
* @param predicate - A predicate to filter the members by.
|
|
*/
|
|
export function resolveMembers<WantedItem extends ApiItem>(
|
|
parent: ApiItemContainerMixin,
|
|
predicate: (item: ApiItem) => item is WantedItem,
|
|
) {
|
|
const seenItems = new Set<string>();
|
|
const inheritedMembers = parent.findMembersWithInheritance().items.reduce((acc, item) => {
|
|
if (predicate(item) && !seenItems.has(item.displayName)) {
|
|
acc.push({
|
|
item,
|
|
inherited:
|
|
item.parent?.containerKey === parent.containerKey
|
|
? undefined
|
|
: (item.parent as ApiItemContainerMixin | undefined),
|
|
});
|
|
|
|
seenItems.add(item.displayName);
|
|
}
|
|
|
|
return acc;
|
|
}, new Array<{ inherited?: ApiItemContainerMixin | undefined; item: WantedItem }>());
|
|
|
|
const mergedMembers = parent
|
|
.getMergedSiblings()
|
|
.filter((sibling) => sibling.containerKey !== parent.containerKey)
|
|
.flatMap((sibling) => (sibling as ApiItemContainerMixin).findMembersWithInheritance().items)
|
|
.filter((item) => predicate(item) && !seenItems.has(item.containerKey))
|
|
.map((item) => ({
|
|
item: item as WantedItem,
|
|
inherited: item.parent ? (item.parent as ApiItemContainerMixin) : undefined,
|
|
}));
|
|
|
|
return [...inheritedMembers, ...mergedMembers];
|
|
}
|