@giraphql/plugin-dataloader
Version:
A GiraphQL plugin for attaching dataloader to object types
37 lines (36 loc) • 1.26 kB
JavaScript
import DataLoader from 'dataloader';
import { createContextCache, isThenable } from '@giraphql/core';
export function rejectErrors(val) {
if (isThenable(val)) {
return val.then(rejectErrors);
}
return val.map((item) => (item instanceof Error ? Promise.reject(item) : item));
}
export function loadAndSort(load, toKey) {
if (!toKey) {
return load;
}
return async (keys, context) => {
var _a;
const list = await load(keys, context);
const map = new Map();
const results = new Array();
for (const val of list) {
if (val instanceof Error) {
throw val;
}
if (val != null) {
map.set(toKey(val), val);
}
}
for (let i = 0; i < list.length; i += 1) {
results[i] = (_a = map.get(keys[i])) !== null && _a !== void 0 ? _a : null;
}
return results;
};
}
export function dataloaderGetter(loaderOptions, load, toKey, sort) {
const loader = (sort ? loadAndSort(load, typeof sort === "function" ? sort : toKey) : load);
return createContextCache((context) => new DataLoader((keys) => loader(keys, context), loaderOptions));
}
//# sourceMappingURL=util.js.map