{"version":3,"file":"pagination.mjs","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { has, toNumber, isUndefined } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\n\ninterface BasePaginationParams {\n  withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n  page?: number;\n  pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n  start?: number;\n  limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n  | {\n      page: number;\n      pageSize: number;\n    }\n  | {\n      start: number;\n      limit: number;\n    };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n  defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n  maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\n/**\n * Should maxLimit be used as the limit or not\n */\nconst shouldApplyMaxLimit = (\n  limit: number,\n  maxLimit: number | null,\n  { isPagedPagination = false } = {}\n) => (!isPagedPagination && limit === -1) || (maxLimit !== null && limit > maxLimit);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n  if (has('pagination.withCount', params)) {\n    const withCount = params.pagination?.withCount;\n\n    if (typeof withCount === 'boolean') {\n      return withCount;\n    }\n\n    if (typeof withCount === 'undefined') {\n      return false;\n    }\n\n    if (['true', 't', '1', 1].includes(withCount)) {\n      return true;\n    }\n\n    if (['false', 'f', '0', 0].includes(withCount)) {\n      return false;\n    }\n\n    throw new errors.ValidationError(\n      'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n    );\n  }\n\n  return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n  has('start', pagination) || has('limit', pagination);\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n  has('page', pagination) || has('pageSize', pagination);\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n  const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n  const { pagination } = params;\n\n  const isPaged = isPagedPagination(pagination);\n  const isOffset = isOffsetPagination(pagination);\n\n  if (isOffset && isPaged) {\n    throw new errors.ValidationError(\n      'Invalid pagination parameters. Expected either start/limit or page/pageSize'\n    );\n  }\n\n  if (!isOffset && !isPaged) {\n    return {\n      page: 1,\n      pageSize: defaultLimit,\n    };\n  }\n\n  if (isPagedPagination(pagination)) {\n    const pageSize = isUndefined(pagination.pageSize)\n      ? defaultLimit\n      : Math.max(1, toNumber(pagination.pageSize));\n\n    return {\n      page: Math.max(1, toNumber(pagination.page || 1)),\n      pageSize:\n        typeof maxLimit === 'number' &&\n        shouldApplyMaxLimit(pageSize, maxLimit, { isPagedPagination: true })\n          ? maxLimit\n          : Math.max(1, pageSize),\n    };\n  }\n\n  const limit = isUndefined(pagination.limit) ? defaultLimit : toNumber(pagination.limit);\n\n  return {\n    start: Math.max(0, toNumber(pagination.start || 0)),\n    limit: shouldApplyMaxLimit(limit, maxLimit) ? maxLimit || -1 : Math.max(1, limit),\n  };\n};\n\nconst convertPagedToStartLimit = (paginationInfo: PaginationInfo) => {\n  if ('page' in paginationInfo) {\n    const { page, pageSize } = paginationInfo;\n    return {\n      start: (page - 1) * pageSize,\n      limit: pageSize,\n    };\n  }\n\n  return paginationInfo;\n};\n\nconst transformPaginationResponse = (paginationInfo: PaginationInfo, count: number) => {\n  if ('page' in paginationInfo) {\n    return {\n      ...paginationInfo,\n      pageCount: Math.ceil(count / paginationInfo.pageSize),\n      total: count,\n    };\n  }\n\n  return {\n    ...paginationInfo,\n    total: count,\n  };\n};\n\nexport { getPaginationInfo, convertPagedToStartLimit, transformPaginationResponse, shouldCount };\n"],"names":["isPagedPagination"],"mappings":";;AAgCA,MAAM,yBAAyB,OAAO;AAAA,EACpC,cAAc,SAAS,OAAO,OAAO,IAAI,yBAAyB,EAAE,CAAC;AAAA,EACrE,UAAU,SAAS,OAAO,OAAO,IAAI,mBAAmB,CAAC,KAAK;AAChE;AAKA,MAAM,sBAAsB,CAC1B,OACA,UACA,EAAE,mBAAAA,qBAAoB,UAAU,CAAA,MAC5B,CAACA,sBAAqB,UAAU,MAAQ,aAAa,QAAQ,QAAQ;AAErE,MAAA,cAAc,CAAC,WAA8C;AAC7D,MAAA,IAAI,wBAAwB,MAAM,GAAG;AACjC,UAAA,YAAY,OAAO,YAAY;AAEjC,QAAA,OAAO,cAAc,WAAW;AAC3B,aAAA;AAAA,IACT;AAEI,QAAA,OAAO,cAAc,aAAa;AAC7B,aAAA;AAAA,IACT;AAEI,QAAA,CAAC,QAAQ,KAAK,KAAK,CAAC,EAAE,SAAS,SAAS,GAAG;AACtC,aAAA;AAAA,IACT;AAEI,QAAA,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,SAAS,SAAS,GAAG;AACvC,aAAA;AAAA,IACT;AAEA,UAAM,IAAI,OAAO;AAAA,MACf;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO,QAAQ,OAAO,OAAO,IAAI,sBAAsB,IAAI,CAAC;AAC9D;AAEA,MAAM,qBAAqB,CAAC,eAC1B,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,UAAU;AACrD,MAAM,oBAAoB,CAAC,eACzB,IAAI,QAAQ,UAAU,KAAK,IAAI,YAAY,UAAU;AAEjD,MAAA,oBAAoB,CAAC,WAA8D;AACvF,QAAM,EAAE,cAAc,SAAS,IAAI,uBAAuB;AAEpD,QAAA,EAAE,WAAe,IAAA;AAEjB,QAAA,UAAU,kBAAkB,UAAU;AACtC,QAAA,WAAW,mBAAmB,UAAU;AAE9C,MAAI,YAAY,SAAS;AACvB,UAAM,IAAI,OAAO;AAAA,MACf;AAAA,IAAA;AAAA,EAEJ;AAEI,MAAA,CAAC,YAAY,CAAC,SAAS;AAClB,WAAA;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EAEd;AAEI,MAAA,kBAAkB,UAAU,GAAG;AACjC,UAAM,WAAW,YAAY,WAAW,QAAQ,IAC5C,eACA,KAAK,IAAI,GAAG,SAAS,WAAW,QAAQ,CAAC;AAEtC,WAAA;AAAA,MACL,MAAM,KAAK,IAAI,GAAG,SAAS,WAAW,QAAQ,CAAC,CAAC;AAAA,MAChD,UACE,OAAO,aAAa,YACpB,oBAAoB,UAAU,UAAU,EAAE,mBAAmB,KAAA,CAAM,IAC/D,WACA,KAAK,IAAI,GAAG,QAAQ;AAAA,IAAA;AAAA,EAE9B;AAEM,QAAA,QAAQ,YAAY,WAAW,KAAK,IAAI,eAAe,SAAS,WAAW,KAAK;AAE/E,SAAA;AAAA,IACL,OAAO,KAAK,IAAI,GAAG,SAAS,WAAW,SAAS,CAAC,CAAC;AAAA,IAClD,OAAO,oBAAoB,OAAO,QAAQ,IAAI,YAAY,KAAK,KAAK,IAAI,GAAG,KAAK;AAAA,EAAA;AAEpF;AAEM,MAAA,2BAA2B,CAAC,mBAAmC;AACnE,MAAI,UAAU,gBAAgB;AACtB,UAAA,EAAE,MAAM,SAAa,IAAA;AACpB,WAAA;AAAA,MACL,QAAQ,OAAO,KAAK;AAAA,MACpB,OAAO;AAAA,IAAA;AAAA,EAEX;AAEO,SAAA;AACT;AAEM,MAAA,8BAA8B,CAAC,gBAAgC,UAAkB;AACrF,MAAI,UAAU,gBAAgB;AACrB,WAAA;AAAA,MACL,GAAG;AAAA,MACH,WAAW,KAAK,KAAK,QAAQ,eAAe,QAAQ;AAAA,MACpD,OAAO;AAAA,IAAA;AAAA,EAEX;AAEO,SAAA;AAAA,IACL,GAAG;AAAA,IACH,OAAO;AAAA,EAAA;AAEX;"}