{"version":3,"file":"pagination.mjs","sources":["../src/pagination.ts"],"sourcesContent":["import { merge, flow, omit } from 'lodash';\nimport { PaginationError } from './errors';\n\ninterface PaginationArgs {\n  page: number;\n  pageSize: number | null;\n  start: number;\n  limit: number;\n}\n\nexport interface Pagination {\n  start: number;\n  limit: number;\n}\n\nexport interface PagePatinationInformation {\n  page: number;\n  pageSize: number;\n  pageCount: number;\n  total: number;\n}\n\nexport interface OffsetPaginationInformation {\n  start: number;\n  limit: number;\n  total: number;\n}\n\nconst STRAPI_DEFAULTS = {\n  offset: {\n    start: 0,\n    limit: 10,\n  },\n  page: {\n    page: 1,\n    pageSize: 10,\n  },\n};\n\nconst paginationAttributes = ['start', 'limit', 'page', 'pageSize'];\n\nconst withMaxLimit = (limit: number, maxLimit = -1) => {\n  if (maxLimit === -1 || limit < maxLimit) {\n    return limit;\n  }\n\n  return maxLimit;\n};\n\n// Ensure minimum page & pageSize values (page >= 1, pageSize >= 0, start >= 0, limit >= 0)\nconst ensureMinValues = ({ start, limit }: Pagination) => ({\n  start: Math.max(start, 0),\n  limit: limit === -1 ? limit : Math.max(limit, 1),\n});\n\nconst ensureMaxValues =\n  (maxLimit = -1) =>\n  ({ start, limit }: { start: number; limit: number }) => ({\n    start,\n    limit: withMaxLimit(limit, maxLimit),\n  });\n\n// Apply maxLimit as the limit when limit is -1\nconst withNoLimit = (pagination: Pagination, maxLimit = -1) => ({\n  ...pagination,\n  limit: pagination.limit === -1 ? maxLimit : pagination.limit,\n});\n\nconst withDefaultPagination = <T extends Partial<PaginationArgs>>(\n  args: T,\n  { defaults = {}, maxLimit = -1 } = {}\n) => {\n  const defaultValues = merge({}, STRAPI_DEFAULTS, defaults);\n\n  const usePagePagination = args.page != null || args.pageSize != null;\n  const useOffsetPagination = args.start != null || args.limit != null;\n\n  const ensureValidValues = flow(ensureMinValues, ensureMaxValues(maxLimit));\n\n  // If there is no pagination attribute, don't modify the payload\n  if (!usePagePagination && !useOffsetPagination) {\n    return merge({}, args, ensureValidValues(defaultValues.offset));\n  }\n\n  // If there is page & offset pagination attributes, throw an error\n  if (usePagePagination && useOffsetPagination) {\n    throw new PaginationError('Cannot use both page & offset pagination in the same query');\n  }\n\n  const pagination: Pagination = {\n    start: 0,\n    limit: 0,\n  };\n\n  // Start / Limit\n  if (useOffsetPagination) {\n    const { start, limit } = merge({}, defaultValues.offset, args);\n\n    Object.assign(pagination, { start, limit });\n  }\n\n  // Page / PageSize\n  if (usePagePagination) {\n    const pageArgs =\n      args.pageSize == null\n        ? omit(args, ['pageSize'])\n        : { ...args, pageSize: Math.max(1, args.pageSize) };\n    const { page, pageSize } = merge({}, defaultValues.page, pageArgs);\n    const pageLimit = ensureValidValues({ start: 0, limit: pageSize }).limit;\n\n    Object.assign(pagination, {\n      start: (page - 1) * pageLimit,\n      limit: pageLimit,\n    });\n  }\n\n  // Handle -1 limit\n  Object.assign(pagination, withNoLimit(pagination, maxLimit));\n\n  return merge({}, ensureValidValues(pagination), omit(args, paginationAttributes));\n};\n\n/**\n * Transform pagination information into a paginated response:\n * {\n *    page: number,\n *    pageSize: number,\n *    pageCount: number,\n *    total: number\n * }\n */\nconst transformPagedPaginationInfo = (\n  paginationInfo: Partial<PaginationArgs>,\n  total: number\n): PagePatinationInformation => {\n  if (paginationInfo.page != null) {\n    const page = paginationInfo.page;\n    const pageSize = paginationInfo.pageSize ?? total;\n\n    return {\n      page,\n      pageSize,\n      pageCount: pageSize > 0 ? Math.ceil(total / pageSize) : 0,\n      total,\n    };\n  }\n\n  if (paginationInfo.start != null) {\n    const start = paginationInfo.start;\n    const limit = paginationInfo.limit ?? total;\n\n    // Start limit to page page size\n    return {\n      page: Math.floor(start / limit) + 1,\n      pageSize: limit,\n      pageCount: limit > 0 ? Math.ceil(total / limit) : 0,\n      total,\n    };\n  }\n\n  // Default pagination\n  return {\n    ...paginationInfo,\n    page: 1,\n    pageSize: 10,\n    pageCount: 1,\n    total,\n  };\n};\n\n/**\n * Transform pagination information into a offset response:\n * {\n *    start: number,\n *    limit: number,\n *    total: number\n * }\n */\nconst transformOffsetPaginationInfo = (\n  paginationInfo: Partial<PaginationArgs>,\n  total: number\n): OffsetPaginationInformation => {\n  if (paginationInfo.page != null) {\n    const limit = paginationInfo.pageSize ?? total;\n    const start = (paginationInfo.page - 1) * limit;\n\n    return { start, limit, total };\n  }\n\n  if (paginationInfo.start != null) {\n    const start = paginationInfo.start;\n    const limit = paginationInfo.limit ?? total;\n\n    // Start limit to page page size\n    return { start, limit, total };\n  }\n\n  // Default pagination\n  return {\n    ...paginationInfo,\n    start: 0,\n    limit: 10,\n    total,\n  };\n};\n\nexport { withDefaultPagination, transformPagedPaginationInfo, transformOffsetPaginationInfo };\n"],"names":["STRAPI_DEFAULTS","offset","start","limit","page","pageSize","paginationAttributes","withMaxLimit","maxLimit","ensureMinValues","Math","max","ensureMaxValues","withNoLimit","pagination","withDefaultPagination","args","defaults","defaultValues","merge","usePagePagination","useOffsetPagination","ensureValidValues","flow","PaginationError","Object","assign","pageArgs","omit","pageLimit","transformPagedPaginationInfo","paginationInfo","total","pageCount","ceil","floor","transformOffsetPaginationInfo"],"mappings":"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"}