prisma-extension-pagination
Version:
Prisma Client extension for pagination
77 lines (76 loc) • 2.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.paginateWithCursor = paginateWithCursor;
const helpers_1 = require("./helpers");
async function paginateWithCursor(model, query, { after, before, getCursor, parseCursor, limit, }) {
let results;
let hasPreviousPage = false;
let hasNextPage = false;
if (typeof before === 'string') {
const cursor = parseCursor(before);
let nextResult;
[results, nextResult] = await Promise.all([
model.findMany({
...query,
cursor,
skip: 1,
take: limit === null ? undefined : -limit - 1,
}),
model.findMany({
...query,
...helpers_1.resetSelection,
cursor,
take: 1,
}),
]);
if (limit !== null && results.length > limit) {
hasPreviousPage = Boolean(results.shift());
}
hasNextPage = Boolean(nextResult.length);
}
else if (typeof after === 'string') {
const cursor = parseCursor(after);
let previousResult;
[results, previousResult] = await Promise.all([
model.findMany({
...query,
cursor,
skip: 1,
take: limit === null ? undefined : limit + 1,
}),
model.findMany({
...query,
...helpers_1.resetSelection,
cursor,
take: -1,
}),
]);
hasPreviousPage = Boolean(previousResult.length);
if (limit !== null && results.length > limit) {
hasNextPage = Boolean(results.pop());
}
}
else {
results = await model.findMany({
...query,
take: limit === null ? undefined : limit + 1,
});
hasPreviousPage = false;
if (limit !== null && results.length > limit) {
hasNextPage = Boolean(results.pop());
}
}
const startCursor = results.length ? getCursor(results[0]) : null;
const endCursor = results.length
? getCursor(results[results.length - 1])
: null;
return [
results,
{
hasNextPage,
hasPreviousPage,
startCursor,
endCursor,
},
];
}