{"version":3,"file":"getShowingPages.mjs","sources":["../../../packages/pagination/getShowingPages.ts"],"sourcesContent":["import { SiblingsCount } from './types.js'\n\nexport const arrayPusher = (): ((\n  arr: unknown[],\n  element: unknown,\n) => number) => {\n  const innerArray: unknown[] = []\n\n  return (arr: unknown[], element: unknown) => {\n    if (!innerArray.includes(element) || element === '...') {\n      innerArray.push(element)\n      arr.push(element)\n    }\n\n    return innerArray.length\n  }\n}\n\nexport const numberSort = (a: number, b: number): number => a - b\n\nexport const range = (start: number, end: number): number[] => {\n  const length = end - start + 1\n  return Array.from({ length }, (_, i) => start + i)\n}\n\nconst getShowingPages = (\n  pagesCount: number,\n  currPage = 1,\n  siblingCount: SiblingsCount = 1,\n): (string | number)[] => {\n  if (!pagesCount) {\n    return []\n  }\n\n  const showingPagesCount = siblingCount === 1 ? 7 : 5\n  if (pagesCount <= showingPagesCount) {\n    return range(1, pagesCount)\n  }\n\n  const firstPage = 1\n  const lastPage = pagesCount\n\n  const firstPages: number[] = []\n  const firstEllipsis: string[] = []\n  const middlePages: number[] = []\n  const lastEllipsis: string[] = []\n  const lastPages: number[] = []\n\n  const pusher = arrayPusher()\n  pusher(firstPages, firstPage)\n\n  // see getShowingPages.test.ts for full example\n  let siblings\n  switch (true) {\n    case firstPage === currPage:\n      siblings = [0, 1, 1 + siblingCount] //currPage=1 => [1. 2, 3?]\n      break\n\n    case lastPage === currPage:\n      siblings = [-siblingCount - 1, -1, 0] // currPage=10 => [?8, 9, 10]\n      break\n\n    case siblingCount === 1 && currPage - firstPage === 3:\n      siblings = [-2, -1, 0, 1] // currPage=4 => [2, 3, 4, 5]\n      break\n\n    case siblingCount === 1 && lastPage - currPage === 3:\n      siblings = [-1, 0, 1, 2] // currPage=7 => [6, 7, 8, 9]\n      break\n\n    case siblingCount === 1:\n      siblings = [-1, 0, 1] // currPage=5 => [4, 5, 6]\n      break\n\n    case siblingCount === 0 && currPage - firstPage === 2:\n      siblings = [-1, 0] // currPage=3 => [1, 2, 3]\n      break\n\n    case siblingCount === 0 && lastPage - currPage === 2:\n      siblings = [0, 1] // currPage=8 => [8, 9]\n      break\n\n    default:\n      siblings = [0] // no siblings\n      break\n  }\n\n  siblings.forEach((sibling) => {\n    pusher(middlePages, currPage + sibling)\n  })\n\n  if (currPage - firstPage >= 3 + siblingCount) {\n    pusher(firstEllipsis, '...')\n  }\n\n  if (lastPage - currPage >= 3 + siblingCount) {\n    pusher(lastEllipsis, '...')\n  }\n\n  const count = pusher(lastPages, lastPage)\n\n  const rest = showingPagesCount - count\n  for (let i = rest; i > 0; i--) {\n    if (currPage < pagesCount / 2) {\n      pusher(lastPages, lastPage - i)\n    } else {\n      pusher(firstPages, firstPage + i)\n    }\n  }\n\n  return [\n    ...firstPages.sort(numberSort),\n    ...firstEllipsis,\n    ...middlePages,\n    ...lastEllipsis,\n    ...lastPages.sort(numberSort),\n  ]\n}\n\nexport default getShowingPages\n"],"names":["arrayPusher","innerArray","arr","element","includes","push","length","numberSort","a","b","range","start","end","Array","from","_","i","getShowingPages","pagesCount","currPage","arguments","undefined","siblingCount","showingPagesCount","firstPage","lastPage","firstPages","firstEllipsis","middlePages","lastEllipsis","lastPages","pusher","siblings","forEach","sibling","count","rest","sort"],"mappings":"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"}