@baseplate-dev/sync
Version:
Library for syncing Baseplate descriptions
24 lines • 1.08 kB
JavaScript
import { notEmpty, toposortOrdered } from '@baseplate-dev/utils';
function normalizeArray(array) {
return Array.isArray(array) ? array : [array];
}
export function createOrderedList() {
const items = [];
return {
addItem(key, item, orderRules) {
if (items.some((i) => i.key === key)) {
throw new Error(`Item with key ${key} already exists`);
}
items.push({ key, item, orderRules });
return this;
},
getItems() {
const comesBeforeRules = items.flatMap((item) => normalizeArray(item.orderRules?.comesBefore ?? []).map((rule) => [rule, item.key]));
const comesAfterRules = items.flatMap((item) => normalizeArray(item.orderRules?.comesAfter ?? []).map((rule) => [item.key, rule]));
return toposortOrdered(items.map((item) => item.key), [...comesBeforeRules, ...comesAfterRules])
.map((key) => items.find((item) => item.key === key)?.item)
.filter(notEmpty);
},
};
}
//# sourceMappingURL=ordered-list.js.map