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