nestjs-graphql-relay
Version:
@nestjs/graphql + graphql-relay + typeorm
66 lines • 2.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConnectionArgs = void 0;
exports.getPagingParameters = getPagingParameters;
exports.findAndPaginate = findAndPaginate;
const tslib_1 = require("tslib");
const Relay = tslib_1.__importStar(require("graphql-relay"));
const connectionArgs_1 = require("./connectionArgs");
Object.defineProperty(exports, "ConnectionArgs", { enumerable: true, get: function () { return connectionArgs_1.ConnectionArgs; } });
tslib_1.__exportStar(require("./orderBy.input"), exports);
tslib_1.__exportStar(require("./pageInfo"), exports);
function getMeta({ first = 0, last = 0, after, before, }) {
const isForwardPaging = !!first || !!after;
const isBackwardPaging = !!last || !!before;
return isForwardPaging
? { pagingType: "forward", after, first }
: isBackwardPaging
? { pagingType: "backward", before, last }
: { pagingType: "none" };
}
function getPagingParameters(args) {
const meta = getMeta(args);
switch (meta.pagingType) {
case "forward": {
let offset = 0;
if (meta.after) {
offset = Relay.cursorToOffset(meta.after) + 1;
}
if (Number.isNaN(offset)) {
throw new Error("invalid before query");
}
return {
limit: meta.first,
offset,
};
}
case "backward": {
const { last, before } = meta;
let limit = last;
let offset = Relay.cursorToOffset(before || "") - last;
if (Number.isNaN(offset)) {
throw new Error("invalid before query");
}
if (offset < 0) {
limit = Math.max(last + offset, 0);
offset = 0;
}
return { offset, limit };
}
default:
return {};
}
}
async function findAndPaginate(condition, connArgs, repository) {
const { limit, offset } = getPagingParameters(connArgs);
const [entities, count] = await repository.findAndCount({
...condition,
skip: offset,
take: limit,
});
return Relay.connectionFromArraySlice(entities, connArgs, {
arrayLength: count,
sliceStart: offset || 0,
});
}
//# sourceMappingURL=index.js.map