@simulacrum/github-api-simulator
Version:
Provides common functionality to frontend app and plugins.
68 lines • 2.16 kB
JavaScript
const identity = (a) => a;
export function applyRelayPagination(nodes, args, mapper = identity) {
let range = applyCursorsToEdges(nodes, args.before, args.after);
let edges = edgesToReturn(range, args.first, args.last).map(edge => ({
...edge,
node: mapper(edge.node),
}));
let [first] = edges;
let last = edges.slice().pop();
return {
totalCount: nodes.length,
edges,
nodes: edges.map(e => e.node),
pageInfo: {
get hasNextPage() {
let { first, before } = args;
if (first != null) {
return range.length > first;
}
else if (before != null) {
return Number(before) < range.length - 1;
}
return false;
},
get hasPreviousPage() {
let { last, after } = args;
if (last != null) {
return range.length > last;
}
else if (after != null) {
return Number(after) > 0;
}
return false;
},
startCursor: first?.cursor,
endCursor: last?.cursor,
},
};
}
function applyCursorsToEdges(nodes, before, after) {
let afterIdx = !!after ? Number(after) : -1;
let beforeIdx = !!before ? Number(before) : nodes.length;
let edges = nodes.slice(afterIdx + 1, beforeIdx).map((node, i) => ({
node,
cursor: (afterIdx + 1 + i).toString(),
}));
return edges;
}
function edgesToReturn(edges, first, last) {
let newEdges = [];
if (first == null && last == null) {
first = 100;
}
if (first != null) {
if (first < 0) {
throw new Error(`value of first must be greater than 0, was ${first}`);
}
newEdges = edges.slice(0, first);
}
if (last != null) {
if (last < 0) {
throw new Error(`value of 'after' must be greater than 0, was ${last}`);
}
newEdges = edges.slice(-last);
}
return newEdges;
}
//# sourceMappingURL=relay.js.map