@graphql-box/connection-resolver 4.1.3 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/README.md +1 -5
  2. package/dist/cjs/index.cjs +703 -0
  3. package/dist/cjs/index.cjs.map +1 -0
  4. package/dist/esm/index.mjs +700 -0
  5. package/dist/esm/index.mjs.map +1 -0
  6. package/dist/types/cjs/__testUtils__/generateCursorCache.d.cts +10 -0
  7. package/dist/types/cjs/__testUtils__/generateCursorCache.d.cts.map +1 -0
  8. package/dist/types/cjs/__testUtils__/generatePageResponse.d.cts +9 -0
  9. package/dist/types/cjs/__testUtils__/generatePageResponse.d.cts.map +1 -0
  10. package/dist/types/cjs/__testUtils__/generatePages.d.cts +2 -0
  11. package/dist/types/cjs/__testUtils__/generatePages.d.cts.map +1 -0
  12. package/dist/types/cjs/helpers/cacheCursors.d.cts +12 -0
  13. package/dist/types/cjs/helpers/cacheCursors.d.cts.map +1 -0
  14. package/dist/types/cjs/helpers/extractEdges.d.cts +3 -0
  15. package/dist/types/cjs/helpers/extractEdges.d.cts.map +1 -0
  16. package/dist/types/cjs/helpers/extractNodes.d.cts +3 -0
  17. package/dist/types/cjs/helpers/extractNodes.d.cts.map +1 -0
  18. package/dist/types/cjs/helpers/getCount.d.cts +3 -0
  19. package/dist/types/cjs/helpers/getCount.d.cts.map +1 -0
  20. package/dist/types/cjs/helpers/getCurrentPageStartAndEndIndexes.d.cts +14 -0
  21. package/dist/types/cjs/helpers/getCurrentPageStartAndEndIndexes.d.cts.map +1 -0
  22. package/dist/types/cjs/helpers/getCursor.d.cts +3 -0
  23. package/dist/types/cjs/helpers/getCursor.d.cts.map +1 -0
  24. package/dist/types/cjs/helpers/getDirection.d.cts +3 -0
  25. package/dist/types/cjs/helpers/getDirection.d.cts.map +1 -0
  26. package/dist/types/cjs/helpers/getInRangeCachedEdges.d.cts +8 -0
  27. package/dist/types/cjs/helpers/getInRangeCachedEdges.d.cts.map +1 -0
  28. package/dist/types/cjs/helpers/getIndexesOnCurrentPage.d.cts +10 -0
  29. package/dist/types/cjs/helpers/getIndexesOnCurrentPage.d.cts.map +1 -0
  30. package/dist/types/cjs/helpers/getIndexesOnLastPage.d.cts +3 -0
  31. package/dist/types/cjs/helpers/getIndexesOnLastPage.d.cts.map +1 -0
  32. package/dist/types/cjs/helpers/getPageNumbersToRequest.d.cts +12 -0
  33. package/dist/types/cjs/helpers/getPageNumbersToRequest.d.cts.map +1 -0
  34. package/dist/types/cjs/helpers/getPagesMissingFromCache.d.cts +3 -0
  35. package/dist/types/cjs/helpers/getPagesMissingFromCache.d.cts.map +1 -0
  36. package/dist/types/cjs/helpers/getResultsOnLastPage.d.cts +6 -0
  37. package/dist/types/cjs/helpers/getResultsOnLastPage.d.cts.map +1 -0
  38. package/dist/types/cjs/helpers/getStartAndEndCursors.d.cts +4 -0
  39. package/dist/types/cjs/helpers/getStartAndEndCursors.d.cts.map +1 -0
  40. package/dist/types/cjs/helpers/getStartAndEndIndexes.d.cts +15 -0
  41. package/dist/types/cjs/helpers/getStartAndEndIndexes.d.cts.map +1 -0
  42. package/dist/types/cjs/helpers/getStartAndEndPageNumbers.d.cts +13 -0
  43. package/dist/types/cjs/helpers/getStartAndEndPageNumbers.d.cts.map +1 -0
  44. package/dist/types/cjs/helpers/hasPreviousNextPage.d.cts +14 -0
  45. package/dist/types/cjs/helpers/hasPreviousNextPage.d.cts.map +1 -0
  46. package/dist/types/cjs/helpers/isCursorFirst.d.cts +7 -0
  47. package/dist/types/cjs/helpers/isCursorFirst.d.cts.map +1 -0
  48. package/dist/types/cjs/helpers/isCursorLast.d.cts +10 -0
  49. package/dist/types/cjs/helpers/isCursorLast.d.cts.map +1 -0
  50. package/dist/types/cjs/helpers/isCursorSupplied.d.cts +4 -0
  51. package/dist/types/cjs/helpers/isCursorSupplied.d.cts.map +1 -0
  52. package/dist/types/cjs/helpers/isFirstPage.d.cts +2 -0
  53. package/dist/types/cjs/helpers/isFirstPage.d.cts.map +1 -0
  54. package/dist/types/cjs/helpers/isLastPage.d.cts +6 -0
  55. package/dist/types/cjs/helpers/isLastPage.d.cts.map +1 -0
  56. package/dist/types/cjs/helpers/makeEdges.d.cts +6 -0
  57. package/dist/types/cjs/helpers/makeEdges.d.cts.map +1 -0
  58. package/dist/types/cjs/helpers/makeEntry.d.cts +10 -0
  59. package/dist/types/cjs/helpers/makeEntry.d.cts.map +1 -0
  60. package/dist/types/cjs/helpers/mergeCachedEdges.d.cts +3 -0
  61. package/dist/types/cjs/helpers/mergeCachedEdges.d.cts.map +1 -0
  62. package/dist/types/cjs/helpers/removeConnectionInputOptions.d.cts +2 -0
  63. package/dist/types/cjs/helpers/removeConnectionInputOptions.d.cts.map +1 -0
  64. package/dist/types/cjs/helpers/requestAndCachePages.d.cts +21 -0
  65. package/dist/types/cjs/helpers/requestAndCachePages.d.cts.map +1 -0
  66. package/dist/types/cjs/helpers/requestOutstandingPages.d.cts +18 -0
  67. package/dist/types/cjs/helpers/requestOutstandingPages.d.cts.map +1 -0
  68. package/dist/types/cjs/helpers/resolveConnection.d.cts +24 -0
  69. package/dist/types/cjs/helpers/resolveConnection.d.cts.map +1 -0
  70. package/dist/types/cjs/helpers/retrieveCachedConnection.d.cts +25 -0
  71. package/dist/types/cjs/helpers/retrieveCachedConnection.d.cts.map +1 -0
  72. package/dist/types/cjs/helpers/retrieveCachedEdgesByPage.d.cts +11 -0
  73. package/dist/types/cjs/helpers/retrieveCachedEdgesByPage.d.cts.map +1 -0
  74. package/dist/types/cjs/helpers/retrieveEntry.d.cts +8 -0
  75. package/dist/types/cjs/helpers/retrieveEntry.d.cts.map +1 -0
  76. package/dist/types/cjs/helpers/validateCursor.d.cts +10 -0
  77. package/dist/types/cjs/helpers/validateCursor.d.cts.map +1 -0
  78. package/dist/types/cjs/index.d.cts +4 -0
  79. package/dist/types/cjs/index.d.cts.map +1 -0
  80. package/dist/types/cjs/main/index.d.cts +5 -0
  81. package/dist/types/cjs/main/index.d.cts.map +1 -0
  82. package/{lib/types/defs/index.d.ts → dist/types/cjs/types.d.cts} +22 -27
  83. package/dist/types/cjs/types.d.cts.map +1 -0
  84. package/dist/types/esm/__testUtils__/generateCursorCache.d.ts +10 -0
  85. package/dist/types/esm/__testUtils__/generateCursorCache.d.ts.map +1 -0
  86. package/dist/types/esm/__testUtils__/generatePageResponse.d.ts +9 -0
  87. package/dist/types/esm/__testUtils__/generatePageResponse.d.ts.map +1 -0
  88. package/dist/types/esm/__testUtils__/generatePages.d.ts +2 -0
  89. package/dist/types/esm/__testUtils__/generatePages.d.ts.map +1 -0
  90. package/dist/types/esm/helpers/cacheCursors.d.ts +12 -0
  91. package/dist/types/esm/helpers/cacheCursors.d.ts.map +1 -0
  92. package/dist/types/esm/helpers/extractEdges.d.ts +3 -0
  93. package/dist/types/esm/helpers/extractEdges.d.ts.map +1 -0
  94. package/dist/types/esm/helpers/extractNodes.d.ts +3 -0
  95. package/dist/types/esm/helpers/extractNodes.d.ts.map +1 -0
  96. package/dist/types/esm/helpers/getCount.d.ts +3 -0
  97. package/dist/types/esm/helpers/getCount.d.ts.map +1 -0
  98. package/{lib/types → dist/types/esm}/helpers/getCurrentPageStartAndEndIndexes.d.ts +3 -3
  99. package/dist/types/esm/helpers/getCurrentPageStartAndEndIndexes.d.ts.map +1 -0
  100. package/dist/types/esm/helpers/getCursor.d.ts +3 -0
  101. package/dist/types/esm/helpers/getCursor.d.ts.map +1 -0
  102. package/dist/types/esm/helpers/getDirection.d.ts +3 -0
  103. package/dist/types/esm/helpers/getDirection.d.ts.map +1 -0
  104. package/dist/types/esm/helpers/getInRangeCachedEdges.d.ts +8 -0
  105. package/dist/types/esm/helpers/getInRangeCachedEdges.d.ts.map +1 -0
  106. package/dist/types/esm/helpers/getIndexesOnCurrentPage.d.ts +10 -0
  107. package/dist/types/esm/helpers/getIndexesOnCurrentPage.d.ts.map +1 -0
  108. package/dist/types/esm/helpers/getIndexesOnLastPage.d.ts +3 -0
  109. package/dist/types/esm/helpers/getIndexesOnLastPage.d.ts.map +1 -0
  110. package/dist/types/esm/helpers/getPageNumbersToRequest.d.ts +12 -0
  111. package/dist/types/esm/helpers/getPageNumbersToRequest.d.ts.map +1 -0
  112. package/dist/types/esm/helpers/getPagesMissingFromCache.d.ts +3 -0
  113. package/dist/types/esm/helpers/getPagesMissingFromCache.d.ts.map +1 -0
  114. package/dist/types/esm/helpers/getResultsOnLastPage.d.ts +6 -0
  115. package/dist/types/esm/helpers/getResultsOnLastPage.d.ts.map +1 -0
  116. package/dist/types/esm/helpers/getStartAndEndCursors.d.ts +4 -0
  117. package/dist/types/esm/helpers/getStartAndEndCursors.d.ts.map +1 -0
  118. package/dist/types/esm/helpers/getStartAndEndIndexes.d.ts +15 -0
  119. package/dist/types/esm/helpers/getStartAndEndIndexes.d.ts.map +1 -0
  120. package/dist/types/esm/helpers/getStartAndEndPageNumbers.d.ts +13 -0
  121. package/dist/types/esm/helpers/getStartAndEndPageNumbers.d.ts.map +1 -0
  122. package/{lib/types → dist/types/esm}/helpers/hasPreviousNextPage.d.ts +3 -3
  123. package/dist/types/esm/helpers/hasPreviousNextPage.d.ts.map +1 -0
  124. package/dist/types/esm/helpers/isCursorFirst.d.ts +7 -0
  125. package/dist/types/esm/helpers/isCursorFirst.d.ts.map +1 -0
  126. package/dist/types/esm/helpers/isCursorLast.d.ts +10 -0
  127. package/dist/types/esm/helpers/isCursorLast.d.ts.map +1 -0
  128. package/dist/types/esm/helpers/isCursorSupplied.d.ts +4 -0
  129. package/dist/types/esm/helpers/isCursorSupplied.d.ts.map +1 -0
  130. package/dist/types/esm/helpers/isFirstPage.d.ts +2 -0
  131. package/dist/types/esm/helpers/isFirstPage.d.ts.map +1 -0
  132. package/dist/types/esm/helpers/isLastPage.d.ts +6 -0
  133. package/dist/types/esm/helpers/isLastPage.d.ts.map +1 -0
  134. package/dist/types/esm/helpers/makeEdges.d.ts +6 -0
  135. package/dist/types/esm/helpers/makeEdges.d.ts.map +1 -0
  136. package/dist/types/esm/helpers/makeEntry.d.ts +10 -0
  137. package/dist/types/esm/helpers/makeEntry.d.ts.map +1 -0
  138. package/dist/types/esm/helpers/mergeCachedEdges.d.ts +3 -0
  139. package/dist/types/esm/helpers/mergeCachedEdges.d.ts.map +1 -0
  140. package/dist/types/esm/helpers/removeConnectionInputOptions.d.ts +2 -0
  141. package/dist/types/esm/helpers/removeConnectionInputOptions.d.ts.map +1 -0
  142. package/dist/types/esm/helpers/requestAndCachePages.d.ts +21 -0
  143. package/dist/types/esm/helpers/requestAndCachePages.d.ts.map +1 -0
  144. package/dist/types/esm/helpers/requestOutstandingPages.d.ts +18 -0
  145. package/dist/types/esm/helpers/requestOutstandingPages.d.ts.map +1 -0
  146. package/dist/types/esm/helpers/resolveConnection.d.ts +24 -0
  147. package/dist/types/esm/helpers/resolveConnection.d.ts.map +1 -0
  148. package/{lib/types → dist/types/esm}/helpers/retrieveCachedConnection.d.ts +5 -6
  149. package/dist/types/esm/helpers/retrieveCachedConnection.d.ts.map +1 -0
  150. package/dist/types/esm/helpers/retrieveCachedEdgesByPage.d.ts +11 -0
  151. package/dist/types/esm/helpers/retrieveCachedEdgesByPage.d.ts.map +1 -0
  152. package/dist/types/esm/helpers/retrieveEntry.d.ts +8 -0
  153. package/dist/types/esm/helpers/retrieveEntry.d.ts.map +1 -0
  154. package/dist/types/esm/helpers/validateCursor.d.ts +10 -0
  155. package/dist/types/esm/helpers/validateCursor.d.ts.map +1 -0
  156. package/dist/types/esm/index.d.ts +4 -0
  157. package/dist/types/esm/index.d.ts.map +1 -0
  158. package/dist/types/esm/main/index.d.ts +5 -0
  159. package/dist/types/esm/main/index.d.ts.map +1 -0
  160. package/dist/types/esm/types.d.ts +77 -0
  161. package/dist/types/esm/types.d.ts.map +1 -0
  162. package/dist/types/tsconfig.build.tsbuildinfo +1 -0
  163. package/package.json +54 -38
  164. package/src/__testUtils__/generateCursorCache.ts +20 -14
  165. package/src/__testUtils__/generatePageResponse.ts +17 -12
  166. package/src/__testUtils__/generatePages.ts +5 -5
  167. package/src/helpers/cacheCursors.ts +10 -7
  168. package/src/helpers/extractEdges.ts +3 -3
  169. package/src/helpers/extractNodes.ts +2 -2
  170. package/src/helpers/getCount.test.ts +10 -6
  171. package/src/helpers/getCount.ts +2 -2
  172. package/src/helpers/getCurrentPageStartAndEndIndexes.ts +1 -1
  173. package/src/helpers/getCursor.test.ts +10 -6
  174. package/src/helpers/getCursor.ts +2 -2
  175. package/src/helpers/getDirection.test.ts +10 -6
  176. package/src/helpers/getDirection.ts +3 -1
  177. package/src/helpers/getInRangeCachedEdges.ts +10 -7
  178. package/src/helpers/getIndexesOnCurrentPage.test.ts +14 -10
  179. package/src/helpers/getIndexesOnCurrentPage.ts +11 -6
  180. package/src/helpers/getIndexesOnLastPage.test.ts +10 -6
  181. package/src/helpers/getIndexesOnLastPage.ts +3 -2
  182. package/src/helpers/getPageNumbersToRequest.test.ts +15 -11
  183. package/src/helpers/getPageNumbersToRequest.ts +17 -6
  184. package/src/helpers/getPagesMissingFromCache.ts +5 -5
  185. package/src/helpers/getResultsOnLastPage.test.ts +10 -6
  186. package/src/helpers/getResultsOnLastPage.ts +1 -1
  187. package/src/helpers/getStartAndEndCursors.ts +1 -1
  188. package/src/helpers/getStartAndEndIndexes.test.ts +77 -57
  189. package/src/helpers/getStartAndEndIndexes.ts +28 -22
  190. package/src/helpers/getStartAndEndPageNumbers.test.ts +46 -28
  191. package/src/helpers/getStartAndEndPageNumbers.ts +12 -12
  192. package/src/helpers/hasPreviousNextPage.test.ts +17 -8
  193. package/src/helpers/hasPreviousNextPage.ts +6 -4
  194. package/src/helpers/isCursorFirst.test.ts +13 -7
  195. package/src/helpers/isCursorFirst.ts +3 -2
  196. package/src/helpers/isCursorLast.test.ts +27 -23
  197. package/src/helpers/isCursorLast.ts +4 -4
  198. package/src/helpers/isCursorSupplied.test.ts +18 -10
  199. package/src/helpers/isCursorSupplied.ts +3 -2
  200. package/src/helpers/isFirstPage.test.ts +10 -6
  201. package/src/helpers/isFirstPage.ts +1 -1
  202. package/src/helpers/isLastPage.test.ts +10 -6
  203. package/src/helpers/isLastPage.ts +1 -1
  204. package/src/helpers/makeEdges.ts +3 -3
  205. package/src/helpers/makeEntry.ts +8 -5
  206. package/src/helpers/mergeCachedEdges.ts +5 -5
  207. package/src/helpers/removeConnectionInputOptions.test.ts +10 -8
  208. package/src/helpers/removeConnectionInputOptions.ts +4 -3
  209. package/src/helpers/requestAndCachePages.ts +14 -11
  210. package/src/helpers/requestOutstandingPages.ts +18 -19
  211. package/src/helpers/resolveConnection.ts +20 -34
  212. package/src/helpers/retrieveCachedConnection.test.ts +703 -338
  213. package/src/helpers/retrieveCachedConnection.ts +28 -20
  214. package/src/helpers/retrieveCachedEdgesByPage.ts +10 -10
  215. package/src/helpers/retrieveEntry.ts +32 -0
  216. package/src/helpers/validateCursor.test.ts +88 -61
  217. package/src/helpers/validateCursor.ts +30 -26
  218. package/src/index.ts +3 -3
  219. package/src/main/__snapshots__/index.test.ts.snap +258 -258
  220. package/src/main/index.test.ts +405 -287
  221. package/src/main/index.ts +37 -35
  222. package/src/{defs/index.ts → types.ts} +12 -18
  223. package/tsconfig.build.json +10 -0
  224. package/tsconfig.json +11 -0
  225. package/lib/browser/index.js +0 -2
  226. package/lib/browser/index.js.map +0 -1
  227. package/lib/browser/production.analysis.txt +0 -314
  228. package/lib/main/__testUtils__/generateCursorCache.js +0 -88
  229. package/lib/main/__testUtils__/generateCursorCache.js.map +0 -1
  230. package/lib/main/__testUtils__/generatePageResponse.js +0 -33
  231. package/lib/main/__testUtils__/generatePageResponse.js.map +0 -1
  232. package/lib/main/__testUtils__/generatePages.js +0 -23
  233. package/lib/main/__testUtils__/generatePages.js.map +0 -1
  234. package/lib/main/defs/index.js +0 -2
  235. package/lib/main/defs/index.js.map +0 -1
  236. package/lib/main/helpers/cacheCursors.js +0 -40
  237. package/lib/main/helpers/cacheCursors.js.map +0 -1
  238. package/lib/main/helpers/extractEdges.js +0 -11
  239. package/lib/main/helpers/extractEdges.js.map +0 -1
  240. package/lib/main/helpers/extractNodes.js +0 -11
  241. package/lib/main/helpers/extractNodes.js.map +0 -1
  242. package/lib/main/helpers/getCount.js +0 -14
  243. package/lib/main/helpers/getCount.js.map +0 -1
  244. package/lib/main/helpers/getCurrentPageStartAndEndIndexes.js +0 -23
  245. package/lib/main/helpers/getCurrentPageStartAndEndIndexes.js.map +0 -1
  246. package/lib/main/helpers/getCursor.js +0 -14
  247. package/lib/main/helpers/getCursor.js.map +0 -1
  248. package/lib/main/helpers/getDirection.js +0 -11
  249. package/lib/main/helpers/getDirection.js.map +0 -1
  250. package/lib/main/helpers/getInRangeCachedEdges.js +0 -36
  251. package/lib/main/helpers/getInRangeCachedEdges.js.map +0 -1
  252. package/lib/main/helpers/getIndexesOnCurrentPage.js +0 -30
  253. package/lib/main/helpers/getIndexesOnCurrentPage.js.map +0 -1
  254. package/lib/main/helpers/getIndexesOnLastPage.js +0 -21
  255. package/lib/main/helpers/getIndexesOnLastPage.js.map +0 -1
  256. package/lib/main/helpers/getPageNumbersToRequest.js +0 -43
  257. package/lib/main/helpers/getPageNumbersToRequest.js.map +0 -1
  258. package/lib/main/helpers/getPagesMissingFromCache.js +0 -19
  259. package/lib/main/helpers/getPagesMissingFromCache.js.map +0 -1
  260. package/lib/main/helpers/getResultsOnLastPage.js +0 -17
  261. package/lib/main/helpers/getResultsOnLastPage.js.map +0 -1
  262. package/lib/main/helpers/getStartAndEndCursors.js +0 -22
  263. package/lib/main/helpers/getStartAndEndCursors.js.map +0 -1
  264. package/lib/main/helpers/getStartAndEndIndexes.js +0 -105
  265. package/lib/main/helpers/getStartAndEndIndexes.js.map +0 -1
  266. package/lib/main/helpers/getStartAndEndPageNumbers.js +0 -51
  267. package/lib/main/helpers/getStartAndEndPageNumbers.js.map +0 -1
  268. package/lib/main/helpers/hasPreviousNextPage.js +0 -33
  269. package/lib/main/helpers/hasPreviousNextPage.js.map +0 -1
  270. package/lib/main/helpers/isCursorFirst.js +0 -17
  271. package/lib/main/helpers/isCursorFirst.js.map +0 -1
  272. package/lib/main/helpers/isCursorLast.js +0 -27
  273. package/lib/main/helpers/isCursorLast.js.map +0 -1
  274. package/lib/main/helpers/isCursorSupplied.js +0 -14
  275. package/lib/main/helpers/isCursorSupplied.js.map +0 -1
  276. package/lib/main/helpers/isFirstPage.js +0 -11
  277. package/lib/main/helpers/isFirstPage.js.map +0 -1
  278. package/lib/main/helpers/isLastPage.js +0 -14
  279. package/lib/main/helpers/isLastPage.js.map +0 -1
  280. package/lib/main/helpers/makeEdges.js +0 -14
  281. package/lib/main/helpers/makeEdges.js.map +0 -1
  282. package/lib/main/helpers/makeEntry.js +0 -38
  283. package/lib/main/helpers/makeEntry.js.map +0 -1
  284. package/lib/main/helpers/mergeCachedEdges.js +0 -21
  285. package/lib/main/helpers/mergeCachedEdges.js.map +0 -1
  286. package/lib/main/helpers/removeConnectionInputOptions.js +0 -17
  287. package/lib/main/helpers/removeConnectionInputOptions.js.map +0 -1
  288. package/lib/main/helpers/requestAndCachePages.js +0 -66
  289. package/lib/main/helpers/requestAndCachePages.js.map +0 -1
  290. package/lib/main/helpers/requestOutstandingPages.js +0 -67
  291. package/lib/main/helpers/requestOutstandingPages.js.map +0 -1
  292. package/lib/main/helpers/resolveConnection.js +0 -95
  293. package/lib/main/helpers/resolveConnection.js.map +0 -1
  294. package/lib/main/helpers/retrieveCachedConnection.js +0 -90
  295. package/lib/main/helpers/retrieveCachedConnection.js.map +0 -1
  296. package/lib/main/helpers/retrieveCachedEdgesByPage.js +0 -45
  297. package/lib/main/helpers/retrieveCachedEdgesByPage.js.map +0 -1
  298. package/lib/main/helpers/validateCursor.js +0 -88
  299. package/lib/main/helpers/validateCursor.js.map +0 -1
  300. package/lib/main/index.js +0 -52
  301. package/lib/main/index.js.map +0 -1
  302. package/lib/main/main/index.js +0 -100
  303. package/lib/main/main/index.js.map +0 -1
  304. package/lib/module/__testUtils__/generateCursorCache.js +0 -71
  305. package/lib/module/__testUtils__/generateCursorCache.js.map +0 -1
  306. package/lib/module/__testUtils__/generatePageResponse.js +0 -23
  307. package/lib/module/__testUtils__/generatePageResponse.js.map +0 -1
  308. package/lib/module/__testUtils__/generatePages.js +0 -11
  309. package/lib/module/__testUtils__/generatePages.js.map +0 -1
  310. package/lib/module/defs/index.js +0 -2
  311. package/lib/module/defs/index.js.map +0 -1
  312. package/lib/module/helpers/cacheCursors.js +0 -30
  313. package/lib/module/helpers/cacheCursors.js.map +0 -1
  314. package/lib/module/helpers/extractEdges.js +0 -2
  315. package/lib/module/helpers/extractEdges.js.map +0 -1
  316. package/lib/module/helpers/extractNodes.js +0 -2
  317. package/lib/module/helpers/extractNodes.js.map +0 -1
  318. package/lib/module/helpers/getCount.js +0 -5
  319. package/lib/module/helpers/getCount.js.map +0 -1
  320. package/lib/module/helpers/getCurrentPageStartAndEndIndexes.js +0 -11
  321. package/lib/module/helpers/getCurrentPageStartAndEndIndexes.js.map +0 -1
  322. package/lib/module/helpers/getCursor.js +0 -5
  323. package/lib/module/helpers/getCursor.js.map +0 -1
  324. package/lib/module/helpers/getDirection.js +0 -2
  325. package/lib/module/helpers/getDirection.js.map +0 -1
  326. package/lib/module/helpers/getInRangeCachedEdges.js +0 -26
  327. package/lib/module/helpers/getInRangeCachedEdges.js.map +0 -1
  328. package/lib/module/helpers/getIndexesOnCurrentPage.js +0 -17
  329. package/lib/module/helpers/getIndexesOnCurrentPage.js.map +0 -1
  330. package/lib/module/helpers/getIndexesOnLastPage.js +0 -9
  331. package/lib/module/helpers/getIndexesOnLastPage.js.map +0 -1
  332. package/lib/module/helpers/getPageNumbersToRequest.js +0 -30
  333. package/lib/module/helpers/getPageNumbersToRequest.js.map +0 -1
  334. package/lib/module/helpers/getPagesMissingFromCache.js +0 -10
  335. package/lib/module/helpers/getPagesMissingFromCache.js.map +0 -1
  336. package/lib/module/helpers/getResultsOnLastPage.js +0 -8
  337. package/lib/module/helpers/getResultsOnLastPage.js.map +0 -1
  338. package/lib/module/helpers/getStartAndEndCursors.js +0 -10
  339. package/lib/module/helpers/getStartAndEndCursors.js.map +0 -1
  340. package/lib/module/helpers/getStartAndEndIndexes.js +0 -86
  341. package/lib/module/helpers/getStartAndEndIndexes.js.map +0 -1
  342. package/lib/module/helpers/getStartAndEndPageNumbers.js +0 -35
  343. package/lib/module/helpers/getStartAndEndPageNumbers.js.map +0 -1
  344. package/lib/module/helpers/hasPreviousNextPage.js +0 -18
  345. package/lib/module/helpers/hasPreviousNextPage.js.map +0 -1
  346. package/lib/module/helpers/isCursorFirst.js +0 -8
  347. package/lib/module/helpers/isCursorFirst.js.map +0 -1
  348. package/lib/module/helpers/isCursorLast.js +0 -15
  349. package/lib/module/helpers/isCursorLast.js.map +0 -1
  350. package/lib/module/helpers/isCursorSupplied.js +0 -5
  351. package/lib/module/helpers/isCursorSupplied.js.map +0 -1
  352. package/lib/module/helpers/isFirstPage.js +0 -2
  353. package/lib/module/helpers/isFirstPage.js.map +0 -1
  354. package/lib/module/helpers/isLastPage.js +0 -5
  355. package/lib/module/helpers/isLastPage.js.map +0 -1
  356. package/lib/module/helpers/makeEdges.js +0 -5
  357. package/lib/module/helpers/makeEdges.js.map +0 -1
  358. package/lib/module/helpers/makeEntry.js +0 -25
  359. package/lib/module/helpers/makeEntry.js.map +0 -1
  360. package/lib/module/helpers/mergeCachedEdges.js +0 -12
  361. package/lib/module/helpers/mergeCachedEdges.js.map +0 -1
  362. package/lib/module/helpers/removeConnectionInputOptions.js +0 -4
  363. package/lib/module/helpers/removeConnectionInputOptions.js.map +0 -1
  364. package/lib/module/helpers/requestAndCachePages.js +0 -54
  365. package/lib/module/helpers/requestAndCachePages.js.map +0 -1
  366. package/lib/module/helpers/requestOutstandingPages.js +0 -57
  367. package/lib/module/helpers/requestOutstandingPages.js.map +0 -1
  368. package/lib/module/helpers/resolveConnection.js +0 -78
  369. package/lib/module/helpers/resolveConnection.js.map +0 -1
  370. package/lib/module/helpers/retrieveCachedConnection.js +0 -70
  371. package/lib/module/helpers/retrieveCachedConnection.js.map +0 -1
  372. package/lib/module/helpers/retrieveCachedEdgesByPage.js +0 -35
  373. package/lib/module/helpers/retrieveCachedEdgesByPage.js.map +0 -1
  374. package/lib/module/helpers/validateCursor.js +0 -71
  375. package/lib/module/helpers/validateCursor.js.map +0 -1
  376. package/lib/module/index.js +0 -4
  377. package/lib/module/index.js.map +0 -1
  378. package/lib/module/main/index.js +0 -83
  379. package/lib/module/main/index.js.map +0 -1
  380. package/lib/types/__testUtils__/generateCursorCache.d.ts +0 -11
  381. package/lib/types/__testUtils__/generateCursorCache.d.ts.map +0 -1
  382. package/lib/types/__testUtils__/generatePageResponse.d.ts +0 -18
  383. package/lib/types/__testUtils__/generatePageResponse.d.ts.map +0 -1
  384. package/lib/types/__testUtils__/generatePages.d.ts +0 -3
  385. package/lib/types/__testUtils__/generatePages.d.ts.map +0 -1
  386. package/lib/types/defs/index.d.ts.map +0 -1
  387. package/lib/types/helpers/cacheCursors.d.ts +0 -13
  388. package/lib/types/helpers/cacheCursors.d.ts.map +0 -1
  389. package/lib/types/helpers/extractEdges.d.ts +0 -4
  390. package/lib/types/helpers/extractEdges.d.ts.map +0 -1
  391. package/lib/types/helpers/extractNodes.d.ts +0 -4
  392. package/lib/types/helpers/extractNodes.d.ts.map +0 -1
  393. package/lib/types/helpers/getCount.d.ts +0 -4
  394. package/lib/types/helpers/getCount.d.ts.map +0 -1
  395. package/lib/types/helpers/getCount.test.d.ts +0 -2
  396. package/lib/types/helpers/getCount.test.d.ts.map +0 -1
  397. package/lib/types/helpers/getCurrentPageStartAndEndIndexes.d.ts.map +0 -1
  398. package/lib/types/helpers/getCursor.d.ts +0 -4
  399. package/lib/types/helpers/getCursor.d.ts.map +0 -1
  400. package/lib/types/helpers/getCursor.test.d.ts +0 -2
  401. package/lib/types/helpers/getCursor.test.d.ts.map +0 -1
  402. package/lib/types/helpers/getDirection.d.ts +0 -3
  403. package/lib/types/helpers/getDirection.d.ts.map +0 -1
  404. package/lib/types/helpers/getDirection.test.d.ts +0 -2
  405. package/lib/types/helpers/getDirection.test.d.ts.map +0 -1
  406. package/lib/types/helpers/getInRangeCachedEdges.d.ts +0 -9
  407. package/lib/types/helpers/getInRangeCachedEdges.d.ts.map +0 -1
  408. package/lib/types/helpers/getIndexesOnCurrentPage.d.ts +0 -7
  409. package/lib/types/helpers/getIndexesOnCurrentPage.d.ts.map +0 -1
  410. package/lib/types/helpers/getIndexesOnCurrentPage.test.d.ts +0 -2
  411. package/lib/types/helpers/getIndexesOnCurrentPage.test.d.ts.map +0 -1
  412. package/lib/types/helpers/getIndexesOnLastPage.d.ts +0 -4
  413. package/lib/types/helpers/getIndexesOnLastPage.d.ts.map +0 -1
  414. package/lib/types/helpers/getIndexesOnLastPage.test.d.ts +0 -2
  415. package/lib/types/helpers/getIndexesOnLastPage.test.d.ts.map +0 -1
  416. package/lib/types/helpers/getPageNumbersToRequest.d.ts +0 -8
  417. package/lib/types/helpers/getPageNumbersToRequest.d.ts.map +0 -1
  418. package/lib/types/helpers/getPageNumbersToRequest.test.d.ts +0 -2
  419. package/lib/types/helpers/getPageNumbersToRequest.test.d.ts.map +0 -1
  420. package/lib/types/helpers/getPagesMissingFromCache.d.ts +0 -4
  421. package/lib/types/helpers/getPagesMissingFromCache.d.ts.map +0 -1
  422. package/lib/types/helpers/getResultsOnLastPage.d.ts +0 -7
  423. package/lib/types/helpers/getResultsOnLastPage.d.ts.map +0 -1
  424. package/lib/types/helpers/getResultsOnLastPage.test.d.ts +0 -2
  425. package/lib/types/helpers/getResultsOnLastPage.test.d.ts.map +0 -1
  426. package/lib/types/helpers/getStartAndEndCursors.d.ts +0 -4
  427. package/lib/types/helpers/getStartAndEndCursors.d.ts.map +0 -1
  428. package/lib/types/helpers/getStartAndEndIndexes.d.ts +0 -10
  429. package/lib/types/helpers/getStartAndEndIndexes.d.ts.map +0 -1
  430. package/lib/types/helpers/getStartAndEndIndexes.test.d.ts +0 -2
  431. package/lib/types/helpers/getStartAndEndIndexes.test.d.ts.map +0 -1
  432. package/lib/types/helpers/getStartAndEndPageNumbers.d.ts +0 -9
  433. package/lib/types/helpers/getStartAndEndPageNumbers.d.ts.map +0 -1
  434. package/lib/types/helpers/getStartAndEndPageNumbers.test.d.ts +0 -2
  435. package/lib/types/helpers/getStartAndEndPageNumbers.test.d.ts.map +0 -1
  436. package/lib/types/helpers/hasPreviousNextPage.d.ts.map +0 -1
  437. package/lib/types/helpers/hasPreviousNextPage.test.d.ts +0 -2
  438. package/lib/types/helpers/hasPreviousNextPage.test.d.ts.map +0 -1
  439. package/lib/types/helpers/isCursorFirst.d.ts +0 -8
  440. package/lib/types/helpers/isCursorFirst.d.ts.map +0 -1
  441. package/lib/types/helpers/isCursorFirst.test.d.ts +0 -2
  442. package/lib/types/helpers/isCursorFirst.test.d.ts.map +0 -1
  443. package/lib/types/helpers/isCursorLast.d.ts +0 -11
  444. package/lib/types/helpers/isCursorLast.d.ts.map +0 -1
  445. package/lib/types/helpers/isCursorLast.test.d.ts +0 -2
  446. package/lib/types/helpers/isCursorLast.test.d.ts.map +0 -1
  447. package/lib/types/helpers/isCursorSupplied.d.ts +0 -4
  448. package/lib/types/helpers/isCursorSupplied.d.ts.map +0 -1
  449. package/lib/types/helpers/isCursorSupplied.test.d.ts +0 -2
  450. package/lib/types/helpers/isCursorSupplied.test.d.ts.map +0 -1
  451. package/lib/types/helpers/isFirstPage.d.ts +0 -3
  452. package/lib/types/helpers/isFirstPage.d.ts.map +0 -1
  453. package/lib/types/helpers/isFirstPage.test.d.ts +0 -2
  454. package/lib/types/helpers/isFirstPage.test.d.ts.map +0 -1
  455. package/lib/types/helpers/isLastPage.d.ts +0 -7
  456. package/lib/types/helpers/isLastPage.d.ts.map +0 -1
  457. package/lib/types/helpers/isLastPage.test.d.ts +0 -2
  458. package/lib/types/helpers/isLastPage.test.d.ts.map +0 -1
  459. package/lib/types/helpers/makeEdges.d.ts +0 -7
  460. package/lib/types/helpers/makeEdges.d.ts.map +0 -1
  461. package/lib/types/helpers/makeEntry.d.ts +0 -11
  462. package/lib/types/helpers/makeEntry.d.ts.map +0 -1
  463. package/lib/types/helpers/mergeCachedEdges.d.ts +0 -4
  464. package/lib/types/helpers/mergeCachedEdges.d.ts.map +0 -1
  465. package/lib/types/helpers/removeConnectionInputOptions.d.ts +0 -3
  466. package/lib/types/helpers/removeConnectionInputOptions.d.ts.map +0 -1
  467. package/lib/types/helpers/removeConnectionInputOptions.test.d.ts +0 -2
  468. package/lib/types/helpers/removeConnectionInputOptions.test.d.ts.map +0 -1
  469. package/lib/types/helpers/requestAndCachePages.d.ts +0 -21
  470. package/lib/types/helpers/requestAndCachePages.d.ts.map +0 -1
  471. package/lib/types/helpers/requestOutstandingPages.d.ts +0 -18
  472. package/lib/types/helpers/requestOutstandingPages.d.ts.map +0 -1
  473. package/lib/types/helpers/resolveConnection.d.ts +0 -24
  474. package/lib/types/helpers/resolveConnection.d.ts.map +0 -1
  475. package/lib/types/helpers/retrieveCachedConnection.d.ts.map +0 -1
  476. package/lib/types/helpers/retrieveCachedConnection.test.d.ts +0 -2
  477. package/lib/types/helpers/retrieveCachedConnection.test.d.ts.map +0 -1
  478. package/lib/types/helpers/retrieveCachedEdgesByPage.d.ts +0 -12
  479. package/lib/types/helpers/retrieveCachedEdgesByPage.d.ts.map +0 -1
  480. package/lib/types/helpers/validateCursor.d.ts +0 -11
  481. package/lib/types/helpers/validateCursor.d.ts.map +0 -1
  482. package/lib/types/helpers/validateCursor.test.d.ts +0 -2
  483. package/lib/types/helpers/validateCursor.test.d.ts.map +0 -1
  484. package/lib/types/index.d.ts +0 -4
  485. package/lib/types/index.d.ts.map +0 -1
  486. package/lib/types/main/index.d.ts +0 -5
  487. package/lib/types/main/index.d.ts.map +0 -1
  488. package/lib/types/main/index.test.d.ts +0 -2
  489. package/lib/types/main/index.test.d.ts.map +0 -1
  490. package/package-lock.json +0 -18
@@ -0,0 +1,700 @@
1
+ import { pickBy, range, isNumber } from 'lodash-es';
2
+ import 'core-js/modules/es.array.push.js';
3
+ import { GraphQLError } from 'graphql';
4
+
5
+ const connectionInputOptions = new Set(['after', 'before', 'first', 'last']);
6
+ const removeConnectionInputOptions = args => pickBy(args, (_value, key) => !connectionInputOptions.has(key));
7
+
8
+ const isCursorSupplied = ({
9
+ after,
10
+ before
11
+ }) => !!(after ?? before);
12
+
13
+ const cacheCursors = async (cursorCache, {
14
+ edges,
15
+ group,
16
+ headers,
17
+ page,
18
+ totalPages,
19
+ totalResults
20
+ }) => {
21
+ const cacheControl = headers.get('cache-control');
22
+ const options = cacheControl ? {
23
+ cacheHeaders: {
24
+ cacheControl
25
+ }
26
+ } : undefined;
27
+ await Promise.all(edges.map(async ({
28
+ cursor,
29
+ node
30
+ }, index) => cursorCache.set(cursor, {
31
+ group,
32
+ index,
33
+ node,
34
+ page
35
+ }, options)));
36
+ await cursorCache.set(`${group}-metadata`, {
37
+ totalPages,
38
+ totalResults
39
+ }, options);
40
+ };
41
+
42
+ const makeEdges = (nodes, makeCursor) => nodes.map(node => ({
43
+ cursor: makeCursor(node),
44
+ node
45
+ }));
46
+
47
+ const requestAndCachePages = async (pages, {
48
+ cursorCache,
49
+ getters,
50
+ groupCursor,
51
+ makeIDCursor,
52
+ resourceResolver
53
+ }) => {
54
+ const errors = [];
55
+ const cachedEdges = await Promise.all(pages.map(async page => {
56
+ const {
57
+ data: pageResultData,
58
+ errors: pageResultErrors,
59
+ headers: pageResultHeaders
60
+ } = await resourceResolver({
61
+ page
62
+ });
63
+ if (pageResultData && !pageResultErrors?.length) {
64
+ const edges = makeEdges(getters.nodes(pageResultData), node => makeIDCursor(node.id));
65
+ await cacheCursors(cursorCache, {
66
+ edges,
67
+ group: groupCursor,
68
+ headers: pageResultHeaders,
69
+ page,
70
+ totalPages: getters.totalPages(pageResultData),
71
+ totalResults: getters.totalResults(pageResultData)
72
+ });
73
+ return {
74
+ edges,
75
+ pageNumber: page
76
+ };
77
+ }
78
+ if (pageResultErrors?.length) {
79
+ errors.push(...pageResultErrors);
80
+ }
81
+ return {
82
+ edges: [],
83
+ pageNumber: page
84
+ };
85
+ }));
86
+ return {
87
+ cachedEdges,
88
+ errors
89
+ };
90
+ };
91
+
92
+ const extractEdges = cachedEdges => cachedEdges.reduce((edges, cachedEdge) => [...edges, ...cachedEdge.edges], []);
93
+
94
+ const extractNodes = edges => edges.map(edge => edge.node);
95
+
96
+ const getCurrentPageStartIndex = ({
97
+ pageIndex,
98
+ startIndex
99
+ }) => pageIndex === 0 ? startIndex.relative : 0;
100
+ const getCurrentPageEndIndex = ({
101
+ endIndex,
102
+ pageIndex,
103
+ resultsPerPage,
104
+ totalCachedPages
105
+ }) => pageIndex === totalCachedPages - 1 ? endIndex.relative : resultsPerPage - 1;
106
+
107
+ const getInRangeCachedEdges = (cachedEdgesByPage, {
108
+ endIndex,
109
+ resultsPerPage,
110
+ startIndex
111
+ }) => {
112
+ return cachedEdgesByPage.reduce((inRange, cachedEdgesPage, index) => {
113
+ const currentPageStartIndex = getCurrentPageStartIndex({
114
+ pageIndex: index,
115
+ startIndex
116
+ });
117
+ const currentPageEndIndex = getCurrentPageEndIndex({
118
+ endIndex,
119
+ pageIndex: index,
120
+ resultsPerPage,
121
+ totalCachedPages: cachedEdgesByPage.length
122
+ });
123
+ const cachedEdges = cachedEdgesPage.edges.slice(currentPageStartIndex, currentPageEndIndex + 1);
124
+ inRange.push({
125
+ edges: cachedEdges,
126
+ pageNumber: cachedEdgesPage.pageNumber
127
+ });
128
+ return inRange;
129
+ }, []);
130
+ };
131
+
132
+ const getStartCursor = edges => edges[0]?.cursor;
133
+ const getEndCursor = edges => {
134
+ const lastEdge = edges[edges.length - 1];
135
+ return lastEdge?.cursor;
136
+ };
137
+
138
+ const mergeCachedEdges = (cachedEdges, missingCachedEdges) => cachedEdges.reduce((mergedCachedEdges, cachedEdge) => {
139
+ if (cachedEdge.edges.length === 0) {
140
+ const missingCachedEdge = missingCachedEdges.find(missing => missing.pageNumber === cachedEdge.pageNumber);
141
+ if (missingCachedEdge) {
142
+ return [...mergedCachedEdges, missingCachedEdge];
143
+ }
144
+ }
145
+ return [...mergedCachedEdges, cachedEdge];
146
+ }, []);
147
+
148
+ const getDirection = last => last ? 'backward' : 'forward';
149
+
150
+ const isLastPage = ({
151
+ page,
152
+ totalPages
153
+ }) => page === totalPages;
154
+
155
+ const getStartPageNumber = (args, {
156
+ page,
157
+ resultsPerPage,
158
+ startIndex
159
+ }) => {
160
+ if (getDirection(args.last) === 'forward' || startIndex.absolute >= 0) {
161
+ return page;
162
+ }
163
+ const startPageNumber = page - Math.ceil(Math.abs(startIndex.absolute) / resultsPerPage);
164
+ return startPageNumber <= 1 ? 1 : startPageNumber;
165
+ };
166
+ const getEndPageNumber = (args, {
167
+ endIndex,
168
+ metadata: {
169
+ totalPages
170
+ },
171
+ page,
172
+ resultsPerPage
173
+ }) => {
174
+ const indexesPerPage = resultsPerPage - 1;
175
+ if (getDirection(args.last) === 'backward' || isLastPage({
176
+ page,
177
+ totalPages
178
+ }) || endIndex.absolute <= indexesPerPage) {
179
+ return page;
180
+ }
181
+ const endPageNumber = page + Math.ceil((endIndex.absolute - indexesPerPage) / resultsPerPage);
182
+ return endPageNumber >= totalPages ? totalPages : endPageNumber;
183
+ };
184
+
185
+ const getPageNumbersToRequest = (args, {
186
+ endIndex,
187
+ entry: {
188
+ page
189
+ },
190
+ metadata,
191
+ resultsPerPage,
192
+ startIndex
193
+ }) => {
194
+ const startPageNumber = getStartPageNumber(args, {
195
+ page,
196
+ resultsPerPage,
197
+ startIndex
198
+ });
199
+ const endPageNumber = getEndPageNumber(args, {
200
+ endIndex,
201
+ metadata,
202
+ page,
203
+ resultsPerPage
204
+ });
205
+ if (startPageNumber === endPageNumber) {
206
+ return [page];
207
+ }
208
+ return [...range(startPageNumber, endPageNumber), endPageNumber];
209
+ };
210
+
211
+ const getPagesMissingFromCache = cachedEdgesByPage => {
212
+ return cachedEdgesByPage.reduce((missing, cachedEdgesPage) => {
213
+ if (cachedEdgesPage.edges.length === 0) {
214
+ missing.push(cachedEdgesPage.pageNumber);
215
+ }
216
+ return missing;
217
+ }, []);
218
+ };
219
+
220
+ const getCount = ({
221
+ first,
222
+ last
223
+ }) => first ?? last;
224
+
225
+ const getResultsOnLastPage = ({
226
+ resultsPerPage,
227
+ totalResults
228
+ }) => {
229
+ const remainder = totalResults % resultsPerPage;
230
+ return remainder === 0 ? resultsPerPage : remainder;
231
+ };
232
+
233
+ const getIndexesOnLastPage = ({
234
+ resultsPerPage,
235
+ totalResults
236
+ }) => getResultsOnLastPage({
237
+ resultsPerPage,
238
+ totalResults
239
+ }) - 1;
240
+
241
+ const isFirstPage = page => page === 1;
242
+
243
+ const getStartIndex = (args, {
244
+ entry: {
245
+ index,
246
+ page
247
+ },
248
+ resultsPerPage
249
+ }) => {
250
+ const count = getCount(args);
251
+ return getDirection(args.last) === 'forward' ? {
252
+ absolute: index + 1,
253
+ relative: index + 1
254
+ } : isFirstPage(page) && index - count < 0 ? {
255
+ absolute: 0,
256
+ relative: 0
257
+ } : (() => {
258
+ const absoluteStartIndex = index - count;
259
+ if (absoluteStartIndex >= 0) {
260
+ return {
261
+ absolute: absoluteStartIndex,
262
+ relative: absoluteStartIndex
263
+ };
264
+ }
265
+ const indexesRemainingAfterLastPage = Math.abs(absoluteStartIndex);
266
+ const pagesRemaining = indexesRemainingAfterLastPage / resultsPerPage + 1;
267
+ const remainder = indexesRemainingAfterLastPage % resultsPerPage;
268
+ const relativeStartIndex = remainder === 0 ? 0 : page - pagesRemaining < 0 ? 0 : resultsPerPage - remainder;
269
+ return {
270
+ absolute: absoluteStartIndex,
271
+ relative: relativeStartIndex
272
+ };
273
+ })();
274
+ };
275
+ const getEndIndex = (args, {
276
+ entry: {
277
+ index,
278
+ page
279
+ },
280
+ metadata: {
281
+ totalPages,
282
+ totalResults
283
+ },
284
+ resultsPerPage
285
+ }) => {
286
+ const count = getCount(args);
287
+ const indexesOnLastPage = getIndexesOnLastPage({
288
+ resultsPerPage,
289
+ totalResults
290
+ });
291
+ return getDirection(args.last) === 'backward' ? {
292
+ absolute: index - 1,
293
+ relative: index - 1
294
+ } : isLastPage({
295
+ page,
296
+ totalPages
297
+ }) && index + count > indexesOnLastPage ? {
298
+ absolute: indexesOnLastPage,
299
+ relative: indexesOnLastPage
300
+ } : (() => {
301
+ const absoluteEndIndex = index + count;
302
+ const indexesPerPage = resultsPerPage - 1;
303
+ if (absoluteEndIndex <= indexesPerPage) {
304
+ return {
305
+ absolute: absoluteEndIndex,
306
+ relative: absoluteEndIndex
307
+ };
308
+ }
309
+ const indexesRemainingAfterFirstPage = absoluteEndIndex - indexesPerPage;
310
+ const pagesRemaining = indexesRemainingAfterFirstPage / resultsPerPage;
311
+ const remainder = indexesRemainingAfterFirstPage % resultsPerPage;
312
+ const relativeEndIndex = remainder === 0 ? indexesPerPage : page + pagesRemaining > totalPages ? indexesOnLastPage : remainder - 1;
313
+ return {
314
+ absolute: absoluteEndIndex,
315
+ relative: relativeEndIndex
316
+ };
317
+ })();
318
+ };
319
+
320
+ const hasPreviousPage = ({
321
+ cachedEdgesByPage,
322
+ startIndex
323
+ }) => isNumber(cachedEdgesByPage[0]?.pageNumber) && cachedEdgesByPage[0]?.pageNumber !== 1 || startIndex.relative > 0;
324
+ const hasNextPage = ({
325
+ cachedEdgesByPage,
326
+ endIndex,
327
+ metadata: {
328
+ totalPages,
329
+ totalResults
330
+ },
331
+ resultsPerPage
332
+ }) => isNumber(cachedEdgesByPage[cachedEdgesByPage.length - 1]?.pageNumber) && cachedEdgesByPage[cachedEdgesByPage.length - 1]?.pageNumber !== totalPages || endIndex.relative < getIndexesOnLastPage({
333
+ resultsPerPage,
334
+ totalResults
335
+ });
336
+
337
+ const retrieveCachedEdgesByPage = async (cursorCache, {
338
+ groupCursor,
339
+ pageNumber
340
+ }) => {
341
+ const {
342
+ entries,
343
+ metadata
344
+ } = await cursorCache.export({
345
+ filterByValue: [{
346
+ comparator: pageNumber,
347
+ keyChain: 'page'
348
+ }, {
349
+ comparator: groupCursor,
350
+ keyChain: 'group'
351
+ }]
352
+ });
353
+ return {
354
+ edges: entries.reduce((cached, [key, {
355
+ index,
356
+ node
357
+ }]) => {
358
+ if (metadata[index]?.cacheability.checkTTL()) {
359
+ cached[index] = {
360
+ cursor: key,
361
+ node
362
+ };
363
+ }
364
+ return cached;
365
+ }, []),
366
+ pageNumber
367
+ };
368
+ };
369
+
370
+ const getCursor = ({
371
+ after,
372
+ before
373
+ }) => before ?? after;
374
+
375
+ const makeEntry = (args, {
376
+ metadata: {
377
+ totalPages,
378
+ totalResults
379
+ },
380
+ resultsPerPage
381
+ }) => {
382
+ if (getDirection(args.last) === 'backward') {
383
+ return {
384
+ index: getIndexesOnLastPage({
385
+ resultsPerPage,
386
+ totalResults
387
+ }) + 1,
388
+ page: totalPages
389
+ };
390
+ }
391
+ return {
392
+ index: -1,
393
+ page: 1
394
+ };
395
+ };
396
+
397
+ const retrieveEntry = async (args, metadata, {
398
+ cursorCache,
399
+ resultsPerPage
400
+ }) => {
401
+ const cursor = getCursor(args);
402
+ if (cursor) {
403
+ const cursorCacheEntry = await cursorCache.get(cursor);
404
+ if (cursorCacheEntry) {
405
+ return cursorCacheEntry;
406
+ }
407
+ }
408
+ return makeEntry(args, {
409
+ metadata,
410
+ resultsPerPage
411
+ });
412
+ };
413
+
414
+ const retrieveCachedConnection = async (args, {
415
+ cursorCache,
416
+ groupCursor,
417
+ resultsPerPage
418
+ }) => {
419
+ const metadata = await cursorCache.get(`${groupCursor}-metadata`);
420
+ const entry = await retrieveEntry(args, metadata, {
421
+ cursorCache,
422
+ resultsPerPage
423
+ });
424
+ const startIndex = getStartIndex(args, {
425
+ entry,
426
+ resultsPerPage
427
+ });
428
+ const endIndex = getEndIndex(args, {
429
+ entry,
430
+ metadata,
431
+ resultsPerPage
432
+ });
433
+ const promises = [];
434
+ const pageNumbersToRequest = getPageNumbersToRequest(args, {
435
+ endIndex,
436
+ entry,
437
+ metadata,
438
+ resultsPerPage,
439
+ startIndex
440
+ });
441
+ for (const pageNumber of pageNumbersToRequest) {
442
+ promises.push(retrieveCachedEdgesByPage(cursorCache, {
443
+ groupCursor,
444
+ pageNumber
445
+ }));
446
+ }
447
+ const cachedEdgesByPage = await Promise.all(promises);
448
+ const missingPages = getPagesMissingFromCache(cachedEdgesByPage);
449
+ return {
450
+ cachedEdges: missingPages.length === 0 ? getInRangeCachedEdges(cachedEdgesByPage, {
451
+ endIndex,
452
+ resultsPerPage,
453
+ startIndex
454
+ }) : cachedEdgesByPage,
455
+ hasNextPage: hasNextPage({
456
+ cachedEdgesByPage,
457
+ endIndex,
458
+ metadata,
459
+ resultsPerPage
460
+ }),
461
+ hasPreviousPage: hasPreviousPage({
462
+ cachedEdgesByPage,
463
+ startIndex
464
+ }),
465
+ indexes: {
466
+ end: endIndex,
467
+ start: startIndex
468
+ },
469
+ missingPages,
470
+ totalResults: metadata.totalResults
471
+ };
472
+ };
473
+
474
+ const resolveConnection = async (args, {
475
+ cursorCache,
476
+ getters,
477
+ groupCursor,
478
+ makeIDCursor,
479
+ resourceResolver,
480
+ resultsPerPage
481
+ }) => {
482
+ const {
483
+ cachedEdges,
484
+ hasNextPage,
485
+ hasPreviousPage,
486
+ indexes,
487
+ missingPages,
488
+ totalResults
489
+ } = await retrieveCachedConnection(args, {
490
+ cursorCache,
491
+ groupCursor,
492
+ resultsPerPage
493
+ });
494
+ if (missingPages.length === 0) {
495
+ const edges = extractEdges(cachedEdges);
496
+ return {
497
+ edges,
498
+ errors: [],
499
+ nodes: extractNodes(edges),
500
+ pageInfo: {
501
+ endCursor: getEndCursor(edges),
502
+ hasNextPage,
503
+ hasPreviousPage,
504
+ startCursor: getStartCursor(edges)
505
+ },
506
+ totalCount: totalResults
507
+ };
508
+ }
509
+ const {
510
+ cachedEdges: missingCachedEdges,
511
+ errors
512
+ } = await requestAndCachePages(missingPages, {
513
+ cursorCache,
514
+ getters,
515
+ groupCursor,
516
+ makeIDCursor,
517
+ resourceResolver
518
+ });
519
+ const mergedCachedEdges = getInRangeCachedEdges(mergeCachedEdges(cachedEdges, missingCachedEdges), {
520
+ endIndex: indexes.end,
521
+ resultsPerPage,
522
+ startIndex: indexes.start
523
+ });
524
+ const edges = extractEdges(mergedCachedEdges);
525
+ return {
526
+ edges,
527
+ errors,
528
+ nodes: extractNodes(edges),
529
+ pageInfo: {
530
+ endCursor: getEndCursor(edges),
531
+ hasNextPage,
532
+ hasPreviousPage,
533
+ startCursor: getStartCursor(edges)
534
+ },
535
+ totalCount: totalResults
536
+ };
537
+ };
538
+
539
+ const isCursorFirst = ({
540
+ direction,
541
+ entry: {
542
+ index,
543
+ page
544
+ }
545
+ }) => direction === 'backward' && page === 1 && index === 0;
546
+
547
+ const isCursorLast = ({
548
+ direction,
549
+ entry: {
550
+ index,
551
+ page
552
+ },
553
+ resultsPerPage,
554
+ totalPages,
555
+ totalResults
556
+ }) => direction === 'forward' && page === totalPages && index === getIndexesOnLastPage({
557
+ resultsPerPage,
558
+ totalResults
559
+ });
560
+
561
+ const validateCursor = async ({
562
+ after,
563
+ before,
564
+ first,
565
+ last
566
+ }, {
567
+ fieldNodes
568
+ }, {
569
+ cursorCache,
570
+ groupCursor,
571
+ resultsPerPage
572
+ }) => {
573
+ if (after && !first && !last) {
574
+ return new GraphQLError('Invalid connection argument combination. `after` must be used in combination with `first`.', {
575
+ nodes: fieldNodes
576
+ });
577
+ }
578
+ if (after && last) {
579
+ return new GraphQLError('Invalid connection argument combination. `after` cannot be used in combination with `last`.', {
580
+ nodes: fieldNodes
581
+ });
582
+ }
583
+ if (before && !last && !first) {
584
+ return new GraphQLError('Invalid connection argument combination. `before` must be used in combination with `last`.', {
585
+ nodes: fieldNodes
586
+ });
587
+ }
588
+ if (before && first) {
589
+ return new GraphQLError('Invalid connection argument combination. `before` cannot be used in combination with `first`.', {
590
+ nodes: fieldNodes
591
+ });
592
+ }
593
+ const metadata = await cursorCache.get(`${groupCursor}-metadata`);
594
+ if (!metadata) {
595
+ return new GraphQLError('Curser cannot be supplied without previously being provided.', {
596
+ nodes: fieldNodes
597
+ });
598
+ }
599
+ const cursor = getCursor({
600
+ after,
601
+ before
602
+ });
603
+ const entry = await cursorCache.get(cursor);
604
+ if (!entry) {
605
+ return new GraphQLError(`The cursor ${cursor} could not be found.`, {
606
+ nodes: fieldNodes
607
+ });
608
+ }
609
+ const direction = getDirection(last);
610
+ if (isCursorLast({
611
+ direction,
612
+ entry,
613
+ resultsPerPage,
614
+ ...metadata
615
+ })) {
616
+ return new GraphQLError(`The cursor ${cursor} is the last, you cannot go forward any further.`, {
617
+ nodes: fieldNodes
618
+ });
619
+ }
620
+ if (isCursorFirst({
621
+ direction,
622
+ entry
623
+ })) {
624
+ return new GraphQLError(`The cursor ${cursor} is the first, you cannot go backward any further.`, {
625
+ nodes: fieldNodes
626
+ });
627
+ }
628
+ return;
629
+ };
630
+
631
+ const makeConnectionResolver = ({
632
+ createMakeCursors,
633
+ createResourceResolver,
634
+ cursorCache,
635
+ getters,
636
+ resolver = result => result,
637
+ resultsPerPage
638
+ }) => async (source, args, context, info) => {
639
+ const {
640
+ makeGroupCursor,
641
+ makeIDCursor
642
+ } = createMakeCursors(source, args, context, info);
643
+ const resourceResolver = createResourceResolver(source, args, context, info);
644
+ const groupCursor = makeGroupCursor();
645
+ if (isCursorSupplied(args)) {
646
+ const cursorError = await validateCursor(args, info, {
647
+ cursorCache,
648
+ groupCursor,
649
+ resultsPerPage
650
+ });
651
+ if (cursorError) {
652
+ return resolver({
653
+ edges: [],
654
+ errors: [cursorError],
655
+ nodes: [],
656
+ pageInfo: {
657
+ hasNextPage: false,
658
+ hasPreviousPage: false
659
+ },
660
+ totalCount: 0
661
+ });
662
+ }
663
+ return resolver(await resolveConnection(args, {
664
+ cursorCache,
665
+ getters,
666
+ groupCursor,
667
+ makeIDCursor,
668
+ resourceResolver,
669
+ resultsPerPage
670
+ }));
671
+ }
672
+ if (await cursorCache.has(`${groupCursor}-metadata`)) {
673
+ return resolver(await resolveConnection(args, {
674
+ cursorCache,
675
+ getters,
676
+ groupCursor,
677
+ makeIDCursor,
678
+ resourceResolver,
679
+ resultsPerPage
680
+ }));
681
+ }
682
+ await requestAndCachePages([1], {
683
+ cursorCache,
684
+ getters,
685
+ groupCursor,
686
+ makeIDCursor,
687
+ resourceResolver
688
+ });
689
+ return resolver(await resolveConnection(args, {
690
+ cursorCache,
691
+ getters,
692
+ groupCursor,
693
+ makeIDCursor,
694
+ resourceResolver,
695
+ resultsPerPage
696
+ }));
697
+ };
698
+
699
+ export { makeConnectionResolver, removeConnectionInputOptions };
700
+ //# sourceMappingURL=index.mjs.map