@grapi/server
Version:
Grapi Schema Generator For GraphQL Server
69 lines (68 loc) • 2.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.paginate = void 0;
const lodash_1 = require("../lodash");
const lodash_2 = require("../lodash");
const paginate = (rows, pagination) => {
if ((0, lodash_2.isEmpty)(pagination) || (0, lodash_2.isEmpty)(rows)) {
return {
data: rows,
total: rows.length,
hasNextPage: false,
hasPreviousPage: false,
};
}
const transforms = [];
if (pagination.perPage && pagination.page) {
const skip = pagination.perPage * (pagination.page - 1);
const limit = pagination.perPage;
if (!(0, lodash_2.isUndefined)(skip) && skip > 0) {
transforms.push((0, lodash_1.slice)(skip));
}
if (!(0, lodash_2.isUndefined)(limit)) {
transforms.push((0, lodash_1.take)(limit));
}
const totalPages = Math.ceil(rows.length / pagination.perPage);
return {
data: (0, lodash_1.flow)(transforms)(rows),
total: rows.length,
hasNextPage: totalPages > pagination.page,
hasPreviousPage: pagination.page > 1,
};
}
const { last, first, before, after } = pagination;
if (!(0, lodash_2.isUndefined)(before)) {
transforms.push((0, lodash_1.takeWhile)(row => row.id !== before));
}
if (!(0, lodash_2.isUndefined)(after)) {
transforms.push((0, lodash_1.takeRightWhile)(row => row.id !== after));
}
transforms.push(function (rows) {
if (first && last) {
if (first > rows.length) {
const diff = first - rows.length;
return diff < last ? (0, lodash_1.takeRight)(last - diff, rows) : [];
}
else {
return (0, lodash_1.takeRight)(last, (0, lodash_1.take)(first, rows));
}
}
if (first)
return (0, lodash_1.take)(first, rows);
if (last)
return (0, lodash_1.takeRight)(last, rows);
return rows;
});
const data = (0, lodash_1.flow)(transforms)(rows);
const firstRowId = (0, lodash_2.get)((0, lodash_2.first)(rows), 'id');
const firstFilteredDataId = (0, lodash_2.get)((0, lodash_2.first)(data), 'id');
const lastRowId = (0, lodash_2.get)((0, lodash_2.last)(rows), 'id');
const lastFilteredDataId = (0, lodash_2.get)((0, lodash_2.last)(data), 'id');
return {
data,
total: rows.length,
hasNextPage: (!(0, lodash_2.isNil)(lastRowId) && !(0, lodash_2.isNil)(lastFilteredDataId) && lastRowId !== lastFilteredDataId),
hasPreviousPage: (!(0, lodash_2.isNil)(firstRowId) && !(0, lodash_2.isNil)(firstFilteredDataId) && firstRowId !== firstFilteredDataId),
};
};
exports.paginate = paginate;