UNPKG

@simulacrum/github-api-simulator

Version:

Provides common functionality to frontend app and plugins.

68 lines 2.16 kB
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