@graphql-box/connection-resolver 0.1.4 → 0.1.8

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 (36) hide show
  1. package/lib/browser/index.js.map +1 -1
  2. package/lib/browser/production.analysis.txt +18 -18
  3. package/lib/main/__testUtils__/generateCursorCache.js +2 -1
  4. package/lib/main/__testUtils__/generateCursorCache.js.map +1 -1
  5. package/lib/main/helpers/requestAndCachePages.js +2 -1
  6. package/lib/main/helpers/requestAndCachePages.js.map +1 -1
  7. package/lib/main/helpers/resolveConnection.js +2 -1
  8. package/lib/main/helpers/resolveConnection.js.map +1 -1
  9. package/lib/main/main/index.js +2 -1
  10. package/lib/main/main/index.js.map +1 -1
  11. package/lib/module/__testUtils__/generateCursorCache.js +2 -1
  12. package/lib/module/__testUtils__/generateCursorCache.js.map +1 -1
  13. package/lib/module/helpers/requestAndCachePages.js +5 -2
  14. package/lib/module/helpers/requestAndCachePages.js.map +1 -1
  15. package/lib/module/helpers/resolveConnection.js +5 -2
  16. package/lib/module/helpers/resolveConnection.js.map +1 -1
  17. package/lib/module/main/index.js +5 -2
  18. package/lib/module/main/index.js.map +1 -1
  19. package/lib/types/__testUtils__/generateCursorCache.d.ts.map +1 -1
  20. package/lib/types/defs/index.d.ts +15 -15
  21. package/lib/types/defs/index.d.ts.map +1 -1
  22. package/lib/types/helpers/requestAndCachePages.d.ts +7 -7
  23. package/lib/types/helpers/requestAndCachePages.d.ts.map +1 -1
  24. package/lib/types/helpers/resolveConnection.d.ts +7 -7
  25. package/lib/types/helpers/resolveConnection.d.ts.map +1 -1
  26. package/lib/types/main/index.d.ts +3 -3
  27. package/lib/types/main/index.d.ts.map +1 -1
  28. package/package.json +1 -1
  29. package/src/__testUtils__/generateCursorCache.ts +1 -0
  30. package/src/defs/index.ts +31 -23
  31. package/src/helpers/requestAndCachePages.ts +8 -6
  32. package/src/helpers/resolveConnection.ts +16 -7
  33. package/src/helpers/retrieveCachedConnection.test.ts +32 -32
  34. package/src/helpers/validateCursor.test.ts +1 -0
  35. package/src/main/index.test.ts +9 -6
  36. package/src/main/index.ts +15 -7
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../connection-resolver/src/helpers/removeConnectionInputOptions.ts","../connection-resolver/src/helpers/isCursorSupplied.ts","../connection-resolver/src/helpers/cacheCursors.ts","../connection-resolver/src/helpers/makeEdges.ts","../connection-resolver/src/helpers/requestAndCachePages.ts","../connection-resolver/src/helpers/extractEdges.ts","../connection-resolver/src/helpers/extractNodes.ts","../connection-resolver/src/helpers/getInRangeCachedEdges.ts","../connection-resolver/src/helpers/getCurrentPageStartAndEndIndexes.ts","../connection-resolver/src/helpers/getStartAndEndCursors.ts","../connection-resolver/src/helpers/mergeCachedEdges.ts","../connection-resolver/src/helpers/getCursor.ts","../connection-resolver/src/helpers/getDirection.ts","../connection-resolver/src/helpers/isLastPage.ts","../connection-resolver/src/helpers/getPageNumbersToRequest.ts","../connection-resolver/src/helpers/getStartAndEndPageNumbers.ts","../connection-resolver/src/helpers/getPagesMissingFromCache.ts","../connection-resolver/src/helpers/getCount.ts","../connection-resolver/src/helpers/getResultsOnLastPage.ts","../connection-resolver/src/helpers/getIndexesOnLastPage.ts","../connection-resolver/src/helpers/getStartAndEndIndexes.ts","../connection-resolver/src/helpers/isFirstPage.ts","../connection-resolver/src/helpers/hasPreviousNextPage.ts","../connection-resolver/src/helpers/makeEntry.ts","../connection-resolver/src/helpers/retrieveCachedEdgesByPage.ts","../connection-resolver/src/helpers/retrieveCachedConnection.ts","../connection-resolver/src/helpers/resolveConnection.ts","../connection-resolver/src/helpers/isCursorFirst.ts","../connection-resolver/src/helpers/isCursorLast.ts","../connection-resolver/src/helpers/validateCursor.ts","../connection-resolver/src/main/index.ts"],"sourcesContent":["import { pickBy } from \"lodash\";\n\nconst connectionInputOptions = [\"after\", \"before\", \"first\", \"last\"];\n\nexport default <O extends object>(args: O) => pickBy(args, (_value, key) => !connectionInputOptions.includes(key));\n","import { ConnectionInputOptions, PlainObject } from \"../defs\";\n\nexport default ({ after, before }: PlainObject & ConnectionInputOptions) => !!(after || before);\n","import Cachemap from \"@cachemap/core\";\nimport { Edge } from \"../defs\";\n\nexport type Params = {\n edges: Edge[];\n group: string;\n headers: Headers;\n page: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport default async (cursorCache: Cachemap, { edges, group, headers, page, totalPages, totalResults }: Params) => {\n const cacheControl = headers.get(\"cache-control\");\n const opts = cacheControl ? { cacheHeaders: { cacheControl } } : undefined;\n\n await Promise.all(\n edges.map(async ({ cursor, node }, index) => cursorCache.set(cursor, { node, index, group, page }, opts)),\n );\n\n await cursorCache.set(`${group}-metadata`, { totalPages, totalResults }, opts);\n};\n","import { Node } from \"../defs\";\n\nexport default (nodes: Node[], makeCursor: (node: Node) => string) =>\n nodes.map(node => ({ node, cursor: makeCursor(node) }));\n","import Cachemap from \"@cachemap/core\";\nimport { Getters, ResourceResolver } from \"../defs\";\nimport cacheCursors from \"./cacheCursors\";\nimport makeEdges from \"./makeEdges\";\n\nexport type Context = {\n cursorCache: Cachemap;\n getters: Getters;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver;\n};\n\nexport default async (\n pages: number[],\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context,\n) => {\n const errors: Error[] = [];\n\n const cachedEdges = await Promise.all(\n pages.map(async page => {\n const { data: pageResultData, errors: pageResultErrors, headers: pageResultHeaders } = await resourceResolver({\n page,\n });\n\n if (pageResultData && !pageResultErrors?.length) {\n const edges = makeEdges(getters.nodes(pageResultData), node => makeIDCursor(node.id));\n\n await cacheCursors(cursorCache, {\n edges,\n group: groupCursor,\n headers: pageResultHeaders,\n page,\n totalPages: getters.totalPages(pageResultData),\n totalResults: getters.totalResults(pageResultData),\n });\n\n return { edges, pageNumber: page };\n }\n\n if (pageResultErrors?.length) {\n errors.push(...pageResultErrors);\n }\n\n return { edges: [], pageNumber: page };\n }),\n );\n\n return { cachedEdges, errors };\n};\n","import { CachedEdges, Edge } from \"../defs\";\n\nexport default (cachedEdges: CachedEdges[]) =>\n cachedEdges.reduce((edges, cachedEdge) => [...edges, ...cachedEdge.edges], [] as Edge[]);\n","import { Edge } from \"../defs\";\n\nexport default (edges: Edge[]) => edges.map(edge => edge.node);\n","import { CachedEdges, Indexes } from \"../defs\";\nimport { getCurrentPageEndIndex, getCurrentPageStartIndex } from \"./getCurrentPageStartAndEndIndexes\";\n\nexport type Context = {\n endIndex: Indexes;\n resultsPerPage: number;\n startIndex: Indexes;\n};\n\nexport default (cachedEdgesByPage: CachedEdges[], { endIndex, resultsPerPage, startIndex }: Context) => {\n return cachedEdgesByPage.reduce((inRange, cachedEdgesPage, i) => {\n const currentPageStartIndex = getCurrentPageStartIndex({ startIndex, pageIndex: i });\n\n const currentPageEndIndex = getCurrentPageEndIndex({\n endIndex,\n pageIndex: i,\n resultsPerPage,\n totalCachedPages: cachedEdgesByPage.length,\n });\n\n const cachedEdges = cachedEdgesPage.edges.slice(currentPageStartIndex, currentPageEndIndex + 1);\n inRange.push({ edges: cachedEdges, pageNumber: cachedEdgesPage.pageNumber });\n return inRange;\n }, [] as CachedEdges[]);\n};\n","import { Indexes } from \"../defs\";\n\nexport type StartIndexContext = {\n pageIndex: number;\n startIndex: Indexes;\n};\n\nexport const getCurrentPageStartIndex = ({ pageIndex, startIndex }: StartIndexContext) =>\n pageIndex === 0 ? startIndex.relative : 0;\n\nexport type EndIndexContext = {\n endIndex: Indexes;\n pageIndex: number;\n resultsPerPage: number;\n totalCachedPages: number;\n};\n\nexport const getCurrentPageEndIndex = ({ endIndex, pageIndex, resultsPerPage, totalCachedPages }: EndIndexContext) =>\n pageIndex === totalCachedPages - 1 ? endIndex.relative : resultsPerPage - 1;\n","import { CachedEdges } from \"../defs\";\n\nexport const getStartCursor = (cachedEdges: CachedEdges[]) => cachedEdges[0].edges[0].cursor;\n\nexport const getEndCursor = (cachedEdges: CachedEdges[]) => {\n const lastCachedEdges = cachedEdges[cachedEdges.length - 1];\n const lastCachedEdge = lastCachedEdges.edges[lastCachedEdges.edges.length - 1];\n return lastCachedEdge.cursor;\n};\n","import { CachedEdges } from \"../defs\";\n\nexport default (cachedEdges: CachedEdges[], missingCachedEdges: CachedEdges[]) =>\n cachedEdges.reduce((mergedCachedEdges, cachedEdge) => {\n if (!cachedEdge.edges.length) {\n const missingCachedEdge = missingCachedEdges.find(missing => missing.pageNumber === cachedEdge.pageNumber);\n\n if (missingCachedEdge) {\n return [...mergedCachedEdges, missingCachedEdge];\n }\n }\n\n return [...mergedCachedEdges, cachedEdge];\n }, [] as CachedEdges[]);\n","import { ConnectionInputOptions } from \"../defs\";\n\nexport default ({ after, before }: ConnectionInputOptions) => before || after;\n","export default (last: number | undefined) => (last ? \"backward\" : \"forward\");\n","export type Params = {\n page: number;\n totalPages: number;\n};\n\nexport default ({ page, totalPages }: Params) => page === totalPages;\n","import { range } from \"lodash\";\nimport { ConnectionInputOptions, Context, Indexes } from \"../defs\";\nimport { getEndPageNumber, getStartPageNumber } from \"./getStartAndEndPageNumbers\";\n\nexport type GetPageNumbersToRequestContext = {\n endIndex: Indexes;\n startIndex: Indexes;\n};\n\nexport default (\n args: ConnectionInputOptions,\n { endIndex, entry: { page }, metadata, resultsPerPage, startIndex }: GetPageNumbersToRequestContext & Context,\n) => {\n const startPageNumber = getStartPageNumber(args, { page, startIndex, resultsPerPage });\n const endPageNumber = getEndPageNumber(args, { endIndex, metadata, page, resultsPerPage });\n\n if (startPageNumber === endPageNumber) {\n return [page];\n }\n\n return [...range(startPageNumber, endPageNumber), endPageNumber];\n};\n","import { ConnectionInputOptions, Context, Indexes } from \"../defs\";\nimport getDirection from \"./getDirection\";\nimport isLastPage from \"./isLastPage\";\n\nexport type PageNumberContext = {\n endIndex: Indexes;\n page: number;\n startIndex: Indexes;\n};\n\nexport const getStartPageNumber = (\n args: ConnectionInputOptions,\n { page, startIndex, resultsPerPage }: Omit<PageNumberContext, \"endIndex\"> & Omit<Context, \"entry\" | \"metadata\">,\n) => {\n if (getDirection(args.last) === \"forward\" || startIndex.absolute >= 0) {\n return page;\n }\n\n const startPageNumber = page - Math.ceil(Math.abs(startIndex.absolute) / resultsPerPage);\n return startPageNumber <= 1 ? 1 : startPageNumber;\n};\n\nexport const getEndPageNumber = (\n args: ConnectionInputOptions,\n {\n endIndex,\n metadata: { totalPages },\n page,\n resultsPerPage,\n }: Omit<PageNumberContext, \"startIndex\"> & Omit<Context, \"entry\">,\n) => {\n const indexesPerPage = resultsPerPage - 1;\n\n if (\n getDirection(args.last) === \"backward\" ||\n isLastPage({ page, totalPages }) ||\n endIndex.absolute <= indexesPerPage\n ) {\n return page;\n }\n\n const endPageNumber = page + Math.ceil((endIndex.absolute - indexesPerPage) / resultsPerPage);\n return endPageNumber >= totalPages ? totalPages : endPageNumber;\n};\n","import { CachedEdges } from \"../defs\";\n\nexport default (cachedEdgesByPage: CachedEdges[]) => {\n return cachedEdgesByPage.reduce((missing, cachedEdgesPage) => {\n if (!cachedEdgesPage.edges.length) {\n missing.push(cachedEdgesPage.pageNumber);\n }\n\n return missing;\n }, [] as number[]);\n};\n","import { ConnectionInputOptions } from \"../defs\";\n\nexport default ({ first, last }: ConnectionInputOptions) => (first || last) as number;\n","export type Params = {\n resultsPerPage: number;\n totalResults: number;\n};\n\nexport default ({ resultsPerPage, totalResults }: Params) => {\n const remainder = totalResults % resultsPerPage;\n return remainder === 0 ? resultsPerPage : remainder;\n};\n","import getResultsOnLastPage, { Params } from \"./getResultsOnLastPage\";\n\nexport default ({ resultsPerPage, totalResults }: Params) => getResultsOnLastPage({ resultsPerPage, totalResults }) - 1;\n","import { ConnectionInputOptions, Context } from \"../defs\";\nimport getCount from \"./getCount\";\nimport getDirection from \"./getDirection\";\nimport getIndexesOnLastPage from \"./getIndexesOnLastPage\";\nimport isFirstPage from \"./isFirstPage\";\nimport isLastPage from \"./isLastPage\";\n\nexport const getStartIndex = (\n args: ConnectionInputOptions,\n { entry: { index, page }, resultsPerPage }: Pick<Context, \"entry\" | \"resultsPerPage\">,\n) => {\n const count = getCount(args);\n\n return getDirection(args.last) === \"forward\"\n ? { absolute: index + 1, relative: index + 1 }\n : isFirstPage(page) && index - count < 0\n ? { absolute: 0, relative: 0 }\n : (() => {\n const absStartIndex = index - count;\n\n if (absStartIndex >= 0) {\n return { absolute: absStartIndex, relative: absStartIndex };\n }\n\n const indexesRemainingAfterLastPage = Math.abs(absStartIndex);\n const pagesRemaining = indexesRemainingAfterLastPage / resultsPerPage + 1;\n const remainder = indexesRemainingAfterLastPage % resultsPerPage;\n const relStartIndex = remainder === 0 ? 0 : page - pagesRemaining < 0 ? 0 : resultsPerPage - remainder;\n return { absolute: absStartIndex, relative: relStartIndex };\n })();\n};\n\nexport const getEndIndex = (\n args: ConnectionInputOptions,\n { entry: { index, page }, metadata: { totalPages, totalResults }, resultsPerPage }: Context,\n) => {\n const count = getCount(args);\n const indexesOnLastPage = getIndexesOnLastPage({ resultsPerPage, totalResults });\n\n return getDirection(args.last) === \"backward\"\n ? { absolute: index - 1, relative: index - 1 }\n : isLastPage({ page, totalPages }) && index + count > indexesOnLastPage\n ? { absolute: indexesOnLastPage, relative: indexesOnLastPage }\n : (() => {\n const absEndIndex = index + count;\n const indexesPerPage = resultsPerPage - 1;\n\n if (absEndIndex <= indexesPerPage) {\n return { absolute: absEndIndex, relative: absEndIndex };\n }\n\n const indexesRemainingAfterFirstPage = absEndIndex - indexesPerPage;\n const pagesRemaining = indexesRemainingAfterFirstPage / resultsPerPage;\n const remainder = indexesRemainingAfterFirstPage % resultsPerPage;\n\n const relEndIndex =\n remainder === 0 ? indexesPerPage : page + pagesRemaining > totalPages ? indexesOnLastPage : remainder - 1;\n\n return { absolute: absEndIndex, relative: relEndIndex };\n })();\n};\n","export default (page: number) => page === 1;\n","import { CachedEdges, CursorGroupMetadata, Indexes } from \"../defs\";\nimport getIndexesOnLastPage from \"./getIndexesOnLastPage\";\n\nexport type HasPreviousPageParams = {\n cachedEdgesByPage: CachedEdges[];\n startIndex: Indexes;\n};\n\nexport type HasNextPageParams = {\n cachedEdgesByPage: CachedEdges[];\n endIndex: Indexes;\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport const hasPreviousPage = ({ cachedEdgesByPage, startIndex }: HasPreviousPageParams) =>\n cachedEdgesByPage[0].pageNumber !== 1 || startIndex.relative > 0;\n\nexport const hasNextPage = ({\n cachedEdgesByPage,\n endIndex,\n metadata: { totalPages, totalResults },\n resultsPerPage,\n}: HasNextPageParams) =>\n cachedEdgesByPage[cachedEdgesByPage.length - 1].pageNumber !== totalPages ||\n endIndex.relative < getIndexesOnLastPage({ resultsPerPage, totalResults });\n","import { ConnectionInputOptions, CursorGroupMetadata } from \"..\";\nimport getDirection from \"./getDirection\";\nimport getIndexesOnLastPage from \"./getIndexesOnLastPage\";\n\nexport type Context = {\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport default (args: ConnectionInputOptions, { metadata: { totalPages, totalResults }, resultsPerPage }: Context) => {\n if (getDirection(args.last) === \"backward\") {\n return { index: getIndexesOnLastPage({ resultsPerPage, totalResults }) + 1, page: totalPages };\n }\n\n return { index: -1, page: 1 };\n};\n","import Cachemap, { ExportResult } from \"@cachemap/core\";\nimport { Edge } from \"../defs\";\n\nexport type Context = {\n groupCursor: string;\n pageNumber: number;\n};\n\nexport default async (cursorCache: Cachemap, { groupCursor, pageNumber }: Context) => {\n const { entries, metadata } = (await cursorCache.export({\n filterByValue: [\n { keyChain: \"page\", comparator: pageNumber },\n { keyChain: \"group\", comparator: groupCursor },\n ],\n })) as ExportResult;\n\n return {\n edges: entries.reduce((cached, [key, { index, node }]) => {\n if (metadata[index].cacheability.checkTTL()) {\n cached[index] = { cursor: key, node };\n }\n\n return cached;\n }, [] as Edge[]),\n pageNumber,\n };\n};\n","import Cachemap from \"@cachemap/core\";\nimport { CachedEdges, ConnectionInputOptions, CursorGroupMetadata } from \"../defs\";\nimport getCursor from \"./getCursor\";\nimport getInRangeCachedEdges from \"./getInRangeCachedEdges\";\nimport getPageNumbersToRequest from \"./getPageNumbersToRequest\";\nimport getPagesMissingFromCache from \"./getPagesMissingFromCache\";\nimport { getEndIndex, getStartIndex } from \"./getStartAndEndIndexes\";\nimport { hasNextPage, hasPreviousPage } from \"./hasPreviousNextPage\";\nimport makeEntry from \"./makeEntry\";\nimport retrieveCachedEdgesByPage from \"./retrieveCachedEdgesByPage\";\n\nexport type Context = {\n cursorCache: Cachemap;\n groupCursor: string;\n resultsPerPage: number;\n};\n\nexport default async (args: ConnectionInputOptions, { cursorCache, groupCursor, resultsPerPage }: Context) => {\n const metadata = (await cursorCache.get(`${groupCursor}-metadata`)) as CursorGroupMetadata;\n const cursor = getCursor(args);\n const entry = cursor ? await cursorCache.get(cursor) : makeEntry(args, { metadata, resultsPerPage });\n const startIndex = getStartIndex(args, { entry, resultsPerPage });\n const endIndex = getEndIndex(args, { entry, metadata, resultsPerPage });\n const promises: Promise<CachedEdges>[] = [];\n const pageNumbersToRequest = getPageNumbersToRequest(args, { endIndex, entry, metadata, resultsPerPage, startIndex });\n\n pageNumbersToRequest.forEach(pageNumber => {\n promises.push(retrieveCachedEdgesByPage(cursorCache, { groupCursor, pageNumber }));\n });\n\n const cachedEdgesByPage = await Promise.all(promises);\n const missingPages = getPagesMissingFromCache(cachedEdgesByPage);\n\n return {\n cachedEdges: !missingPages.length\n ? getInRangeCachedEdges(cachedEdgesByPage, { endIndex, resultsPerPage, startIndex })\n : cachedEdgesByPage,\n hasNextPage: hasNextPage({\n cachedEdgesByPage,\n endIndex,\n metadata,\n resultsPerPage,\n }),\n hasPreviousPage: hasPreviousPage({ cachedEdgesByPage, startIndex }),\n indexes: { end: endIndex, start: startIndex },\n missingPages,\n totalResults: metadata.totalResults,\n };\n};\n","import Cachemap from \"@cachemap/core\";\nimport { ConnectionInputOptions, Getters, PlainObject, ResourceResolver } from \"../defs\";\nimport extractEdges from \"./extractEdges\";\nimport extractNodes from \"./extractNodes\";\nimport getInRangeCachedEdges from \"./getInRangeCachedEdges\";\nimport { getEndCursor, getStartCursor } from \"./getStartAndEndCursors\";\nimport mergeCachedEdges from \"./mergeCachedEdges\";\nimport requestAndCachePages from \"./requestAndCachePages\";\nimport retrieveCachedConnection from \"./retrieveCachedConnection\";\n\nexport type Context = {\n cursorCache: Cachemap;\n getters: Getters;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver;\n resultsPerPage: number;\n};\n\nexport default async (\n args: PlainObject & ConnectionInputOptions,\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver, resultsPerPage }: Context,\n) => {\n const {\n cachedEdges,\n hasNextPage,\n hasPreviousPage,\n indexes,\n missingPages,\n totalResults,\n } = await retrieveCachedConnection(args, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (!missingPages.length) {\n const edges = extractEdges(cachedEdges);\n\n return {\n edges,\n errors: [],\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(cachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(cachedEdges),\n },\n totalCount: totalResults,\n };\n }\n\n const { cachedEdges: missingCachedEdges, errors } = await requestAndCachePages(missingPages, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n const mergedCachedEdges = getInRangeCachedEdges(mergeCachedEdges(cachedEdges, missingCachedEdges), {\n endIndex: indexes.end,\n resultsPerPage,\n startIndex: indexes.start,\n });\n\n const edges = extractEdges(mergedCachedEdges);\n\n return {\n edges,\n errors,\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(mergedCachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(mergedCachedEdges),\n },\n totalCount: totalResults,\n };\n};\n","import { CursorCacheEntry, Direction } from \"../defs\";\n\nexport type Params = {\n direction: Direction;\n entry: CursorCacheEntry;\n};\n\nexport default ({ direction, entry: { index, page } }: Params) => direction === \"backward\" && page === 1 && index === 0;\n","import { CursorCacheEntry, Direction } from \"../defs\";\nimport getIndexesOnLastPage from \"./getIndexesOnLastPage\";\n\nexport type Params = {\n direction: Direction;\n entry: CursorCacheEntry;\n resultsPerPage: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport default ({ direction, entry: { index, page }, resultsPerPage, totalPages, totalResults }: Params) =>\n direction === \"forward\" && page === totalPages && index === getIndexesOnLastPage({ resultsPerPage, totalResults });\n","import Cachemap from \"@cachemap/core\";\nimport { GraphQLError, GraphQLResolveInfo } from \"graphql\";\nimport { ConnectionInputOptions, CursorCacheEntry, CursorGroupMetadata } from \"../defs\";\nimport getCursor from \"./getCursor\";\nimport getDirection from \"./getDirection\";\nimport isCursorFirst from \"./isCursorFirst\";\nimport isCursorLast from \"./isCursorLast\";\n\nexport type Context = {\n cursorCache: Cachemap;\n groupCursor: string;\n resultsPerPage: number;\n};\n\nexport default async (\n { after, before, first, last }: ConnectionInputOptions,\n { fieldNodes }: GraphQLResolveInfo,\n { cursorCache, groupCursor, resultsPerPage }: Context,\n) => {\n if (after && !first && !last) {\n return new GraphQLError(\n \"Invalid connection argument combination. `after` must be used in combination with `first`.\",\n fieldNodes,\n );\n }\n\n if (after && last) {\n return new GraphQLError(\n \"Invalid connection argument combination. `after` cannot be used in combination with `last`.\",\n fieldNodes,\n );\n }\n\n if (before && !last && !first) {\n return new GraphQLError(\n \"Invalid connection argument combination. `before` must be used in combination with `last`.\",\n fieldNodes,\n );\n }\n\n if (before && first) {\n return new GraphQLError(\n \"Invalid connection argument combination. `before` cannot be used in combination with `first`.\",\n fieldNodes,\n );\n }\n\n const metadata = (await cursorCache.get(`${groupCursor}-metadata`)) as CursorGroupMetadata | undefined;\n\n if (!metadata) {\n return new GraphQLError(\"Curser cannot be supplied without previously being provided.\", fieldNodes);\n }\n\n const cursor = getCursor({ after, before }) as string;\n const entry = (await cursorCache.get(cursor)) as CursorCacheEntry | undefined;\n\n if (!entry) {\n return new GraphQLError(`The cursor ${cursor} could not be found.`, fieldNodes);\n }\n\n const direction = getDirection(last);\n\n if (isCursorLast({ direction, entry, resultsPerPage, ...metadata })) {\n return new GraphQLError(`The cursor ${cursor} is the last, you cannot go forward any further.`, fieldNodes);\n }\n\n if (isCursorFirst({ direction, entry })) {\n return new GraphQLError(`The cursor ${cursor} is the first, you cannot go backward any further.`, fieldNodes);\n }\n\n return undefined;\n};\n","import { GraphQLResolveInfo } from \"graphql\";\nimport { Connection, ConnectionInputOptions, ConnectionResolverUserOptions, PlainObject } from \"../defs\";\nimport isCursorSupplied from \"../helpers/isCursorSupplied\";\nimport requestAndCachePages from \"../helpers/requestAndCachePages\";\nimport resolveConnection from \"../helpers/resolveConnection\";\nimport validateCursor from \"../helpers/validateCursor\";\n\nexport default ({\n cursorCache,\n createMakeCursors,\n createResourceResolver,\n getters,\n resolver = result => result,\n resultsPerPage,\n}: ConnectionResolverUserOptions) => async (\n source: PlainObject,\n args: PlainObject & ConnectionInputOptions,\n context: PlainObject,\n info: GraphQLResolveInfo,\n): Promise<Connection> => {\n try {\n const { makeGroupCursor, makeIDCursor } = createMakeCursors(source, args, context, info);\n const resourceResolver = createResourceResolver(source, args, context, info);\n const groupCursor = makeGroupCursor();\n\n if (isCursorSupplied(args)) {\n const cursorError = await validateCursor(args, info, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (cursorError) {\n return resolver({\n edges: [],\n errors: [cursorError],\n nodes: [],\n pageInfo: {\n hasNextPage: false,\n hasPreviousPage: false,\n },\n totalCount: 0,\n });\n }\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n if (await cursorCache.has(`${groupCursor}-metadata`)) {\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n await requestAndCachePages([1], {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n } catch (e) {\n throw e;\n }\n};\n"],"names":["connectionInputOptions","args","_pickBy","_value","key","includes","after","before","cursorCache","edges","group","headers","page","totalPages","totalResults","cacheControl","get","opts","cacheHeaders","undefined","Promise","all","map","index","cursor","node","set","nodes","makeCursor","pages","getters","groupCursor","makeIDCursor","resourceResolver","errors","pageResultData","data","pageResultErrors","pageResultHeaders","length","makeEdges","id","cacheCursors","pageNumber","push","cachedEdges","reduce","cachedEdge","edge","cachedEdgesByPage","endIndex","resultsPerPage","startIndex","inRange","cachedEdgesPage","i","currentPageStartIndex","pageIndex","relative","getCurrentPageStartIndex","currentPageEndIndex","totalCachedPages","getCurrentPageEndIndex","slice","getStartCursor","getEndCursor","lastCachedEdges","missingCachedEdges","mergedCachedEdges","missingCachedEdge","find","missing","last","entry","metadata","startPageNumber","getDirection","absolute","Math","ceil","abs","getStartPageNumber","endPageNumber","indexesPerPage","isLastPage","getEndPageNumber","_range","first","remainder","getResultsOnLastPage","getStartIndex","count","getCount","isFirstPage","absStartIndex","indexesRemainingAfterLastPage","getEndIndex","indexesOnLastPage","getIndexesOnLastPage","absEndIndex","indexesRemainingAfterFirstPage","hasPreviousPage","hasNextPage","export","filterByValue","keyChain","comparator","entries","cached","cacheability","checkTTL","getCursor","makeEntry","promises","getPageNumbersToRequest","forEach","retrieveCachedEdgesByPage","missingPages","getPagesMissingFromCache","getInRangeCachedEdges","indexes","end","start","retrieveCachedConnection","extractEdges","extractNodes","pageInfo","endCursor","startCursor","totalCount","requestAndCachePages","mergeCachedEdges","direction","fieldNodes","GraphQLError","isCursorLast","isCursorFirst","createMakeCursors","createResourceResolver","resolver","result","source","context","info","makeGroupCursor","isCursorSupplied","validateCursor","cursorError","resolveConnection","has"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../connection-resolver/src/helpers/removeConnectionInputOptions.ts","../connection-resolver/src/helpers/isCursorSupplied.ts","../connection-resolver/src/helpers/cacheCursors.ts","../connection-resolver/src/helpers/makeEdges.ts","../connection-resolver/src/helpers/requestAndCachePages.ts","../connection-resolver/src/helpers/extractEdges.ts","../connection-resolver/src/helpers/extractNodes.ts","../connection-resolver/src/helpers/getInRangeCachedEdges.ts","../connection-resolver/src/helpers/getCurrentPageStartAndEndIndexes.ts","../connection-resolver/src/helpers/getStartAndEndCursors.ts","../connection-resolver/src/helpers/mergeCachedEdges.ts","../connection-resolver/src/helpers/getCursor.ts","../connection-resolver/src/helpers/getDirection.ts","../connection-resolver/src/helpers/isLastPage.ts","../connection-resolver/src/helpers/getPageNumbersToRequest.ts","../connection-resolver/src/helpers/getStartAndEndPageNumbers.ts","../connection-resolver/src/helpers/getPagesMissingFromCache.ts","../connection-resolver/src/helpers/getCount.ts","../connection-resolver/src/helpers/getResultsOnLastPage.ts","../connection-resolver/src/helpers/getIndexesOnLastPage.ts","../connection-resolver/src/helpers/getStartAndEndIndexes.ts","../connection-resolver/src/helpers/isFirstPage.ts","../connection-resolver/src/helpers/hasPreviousNextPage.ts","../connection-resolver/src/helpers/makeEntry.ts","../connection-resolver/src/helpers/retrieveCachedEdgesByPage.ts","../connection-resolver/src/helpers/retrieveCachedConnection.ts","../connection-resolver/src/helpers/resolveConnection.ts","../connection-resolver/src/helpers/isCursorFirst.ts","../connection-resolver/src/helpers/isCursorLast.ts","../connection-resolver/src/helpers/validateCursor.ts","../connection-resolver/src/main/index.ts"],"sourcesContent":["import { pickBy } from \"lodash\";\n\nconst connectionInputOptions = [\"after\", \"before\", \"first\", \"last\"];\n\nexport default <O extends object>(args: O) => pickBy(args, (_value, key) => !connectionInputOptions.includes(key));\n","import { ConnectionInputOptions, PlainObject } from \"../defs\";\n\nexport default ({ after, before }: PlainObject & ConnectionInputOptions) => !!(after || before);\n","import Cachemap from \"@cachemap/core\";\nimport { Edge } from \"../defs\";\n\nexport type Params = {\n edges: Edge[];\n group: string;\n headers: Headers;\n page: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport default async (cursorCache: Cachemap, { edges, group, headers, page, totalPages, totalResults }: Params) => {\n const cacheControl = headers.get(\"cache-control\");\n const opts = cacheControl ? { cacheHeaders: { cacheControl } } : undefined;\n\n await Promise.all(\n edges.map(async ({ cursor, node }, index) => cursorCache.set(cursor, { node, index, group, page }, opts)),\n );\n\n await cursorCache.set(`${group}-metadata`, { totalPages, totalResults }, opts);\n};\n","import { Node } from \"../defs\";\n\nexport default (nodes: Node[], makeCursor: (node: Node) => string) =>\n nodes.map(node => ({ node, cursor: makeCursor(node) }));\n","import Cachemap from \"@cachemap/core\";\nimport { Getters, Node, PlainObject, ResourceResolver } from \"../defs\";\nimport cacheCursors from \"./cacheCursors\";\nimport makeEdges from \"./makeEdges\";\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Cachemap;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n};\n\nconst requestAndCachePages = async <Resource extends PlainObject, ResourceNode extends Node>(\n pages: number[],\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context<Resource, ResourceNode>,\n) => {\n const errors: Error[] = [];\n\n const cachedEdges = await Promise.all(\n pages.map(async page => {\n const { data: pageResultData, errors: pageResultErrors, headers: pageResultHeaders } = await resourceResolver({\n page,\n });\n\n if (pageResultData && !pageResultErrors?.length) {\n const edges = makeEdges(getters.nodes(pageResultData), node => makeIDCursor(node.id));\n\n await cacheCursors(cursorCache, {\n edges,\n group: groupCursor,\n headers: pageResultHeaders,\n page,\n totalPages: getters.totalPages(pageResultData),\n totalResults: getters.totalResults(pageResultData),\n });\n\n return { edges, pageNumber: page };\n }\n\n if (pageResultErrors?.length) {\n errors.push(...pageResultErrors);\n }\n\n return { edges: [], pageNumber: page };\n }),\n );\n\n return { cachedEdges, errors };\n};\n\nexport default requestAndCachePages;\n","import { CachedEdges, Edge } from \"../defs\";\n\nexport default (cachedEdges: CachedEdges[]) =>\n cachedEdges.reduce((edges, cachedEdge) => [...edges, ...cachedEdge.edges], [] as Edge[]);\n","import { Edge } from \"../defs\";\n\nexport default (edges: Edge[]) => edges.map(edge => edge.node);\n","import { CachedEdges, Indexes } from \"../defs\";\nimport { getCurrentPageEndIndex, getCurrentPageStartIndex } from \"./getCurrentPageStartAndEndIndexes\";\n\nexport type Context = {\n endIndex: Indexes;\n resultsPerPage: number;\n startIndex: Indexes;\n};\n\nexport default (cachedEdgesByPage: CachedEdges[], { endIndex, resultsPerPage, startIndex }: Context) => {\n return cachedEdgesByPage.reduce((inRange, cachedEdgesPage, i) => {\n const currentPageStartIndex = getCurrentPageStartIndex({ startIndex, pageIndex: i });\n\n const currentPageEndIndex = getCurrentPageEndIndex({\n endIndex,\n pageIndex: i,\n resultsPerPage,\n totalCachedPages: cachedEdgesByPage.length,\n });\n\n const cachedEdges = cachedEdgesPage.edges.slice(currentPageStartIndex, currentPageEndIndex + 1);\n inRange.push({ edges: cachedEdges, pageNumber: cachedEdgesPage.pageNumber });\n return inRange;\n }, [] as CachedEdges[]);\n};\n","import { Indexes } from \"../defs\";\n\nexport type StartIndexContext = {\n pageIndex: number;\n startIndex: Indexes;\n};\n\nexport const getCurrentPageStartIndex = ({ pageIndex, startIndex }: StartIndexContext) =>\n pageIndex === 0 ? startIndex.relative : 0;\n\nexport type EndIndexContext = {\n endIndex: Indexes;\n pageIndex: number;\n resultsPerPage: number;\n totalCachedPages: number;\n};\n\nexport const getCurrentPageEndIndex = ({ endIndex, pageIndex, resultsPerPage, totalCachedPages }: EndIndexContext) =>\n pageIndex === totalCachedPages - 1 ? endIndex.relative : resultsPerPage - 1;\n","import { CachedEdges } from \"../defs\";\n\nexport const getStartCursor = (cachedEdges: CachedEdges[]) => cachedEdges[0].edges[0].cursor;\n\nexport const getEndCursor = (cachedEdges: CachedEdges[]) => {\n const lastCachedEdges = cachedEdges[cachedEdges.length - 1];\n const lastCachedEdge = lastCachedEdges.edges[lastCachedEdges.edges.length - 1];\n return lastCachedEdge.cursor;\n};\n","import { CachedEdges } from \"../defs\";\n\nexport default (cachedEdges: CachedEdges[], missingCachedEdges: CachedEdges[]) =>\n cachedEdges.reduce((mergedCachedEdges, cachedEdge) => {\n if (!cachedEdge.edges.length) {\n const missingCachedEdge = missingCachedEdges.find(missing => missing.pageNumber === cachedEdge.pageNumber);\n\n if (missingCachedEdge) {\n return [...mergedCachedEdges, missingCachedEdge];\n }\n }\n\n return [...mergedCachedEdges, cachedEdge];\n }, [] as CachedEdges[]);\n","import { ConnectionInputOptions } from \"../defs\";\n\nexport default ({ after, before }: ConnectionInputOptions) => before || after;\n","export default (last: number | undefined) => (last ? \"backward\" : \"forward\");\n","export type Params = {\n page: number;\n totalPages: number;\n};\n\nexport default ({ page, totalPages }: Params) => page === totalPages;\n","import { range } from \"lodash\";\nimport { ConnectionInputOptions, Context, Indexes } from \"../defs\";\nimport { getEndPageNumber, getStartPageNumber } from \"./getStartAndEndPageNumbers\";\n\nexport type GetPageNumbersToRequestContext = {\n endIndex: Indexes;\n startIndex: Indexes;\n};\n\nexport default (\n args: ConnectionInputOptions,\n { endIndex, entry: { page }, metadata, resultsPerPage, startIndex }: GetPageNumbersToRequestContext & Context,\n) => {\n const startPageNumber = getStartPageNumber(args, { page, startIndex, resultsPerPage });\n const endPageNumber = getEndPageNumber(args, { endIndex, metadata, page, resultsPerPage });\n\n if (startPageNumber === endPageNumber) {\n return [page];\n }\n\n return [...range(startPageNumber, endPageNumber), endPageNumber];\n};\n","import { ConnectionInputOptions, Context, Indexes } from \"../defs\";\nimport getDirection from \"./getDirection\";\nimport isLastPage from \"./isLastPage\";\n\nexport type PageNumberContext = {\n endIndex: Indexes;\n page: number;\n startIndex: Indexes;\n};\n\nexport const getStartPageNumber = (\n args: ConnectionInputOptions,\n { page, startIndex, resultsPerPage }: Omit<PageNumberContext, \"endIndex\"> & Omit<Context, \"entry\" | \"metadata\">,\n) => {\n if (getDirection(args.last) === \"forward\" || startIndex.absolute >= 0) {\n return page;\n }\n\n const startPageNumber = page - Math.ceil(Math.abs(startIndex.absolute) / resultsPerPage);\n return startPageNumber <= 1 ? 1 : startPageNumber;\n};\n\nexport const getEndPageNumber = (\n args: ConnectionInputOptions,\n {\n endIndex,\n metadata: { totalPages },\n page,\n resultsPerPage,\n }: Omit<PageNumberContext, \"startIndex\"> & Omit<Context, \"entry\">,\n) => {\n const indexesPerPage = resultsPerPage - 1;\n\n if (\n getDirection(args.last) === \"backward\" ||\n isLastPage({ page, totalPages }) ||\n endIndex.absolute <= indexesPerPage\n ) {\n return page;\n }\n\n const endPageNumber = page + Math.ceil((endIndex.absolute - indexesPerPage) / resultsPerPage);\n return endPageNumber >= totalPages ? totalPages : endPageNumber;\n};\n","import { CachedEdges } from \"../defs\";\n\nexport default (cachedEdgesByPage: CachedEdges[]) => {\n return cachedEdgesByPage.reduce((missing, cachedEdgesPage) => {\n if (!cachedEdgesPage.edges.length) {\n missing.push(cachedEdgesPage.pageNumber);\n }\n\n return missing;\n }, [] as number[]);\n};\n","import { ConnectionInputOptions } from \"../defs\";\n\nexport default ({ first, last }: ConnectionInputOptions) => (first || last) as number;\n","export type Params = {\n resultsPerPage: number;\n totalResults: number;\n};\n\nexport default ({ resultsPerPage, totalResults }: Params) => {\n const remainder = totalResults % resultsPerPage;\n return remainder === 0 ? resultsPerPage : remainder;\n};\n","import getResultsOnLastPage, { Params } from \"./getResultsOnLastPage\";\n\nexport default ({ resultsPerPage, totalResults }: Params) => getResultsOnLastPage({ resultsPerPage, totalResults }) - 1;\n","import { ConnectionInputOptions, Context } from \"../defs\";\nimport getCount from \"./getCount\";\nimport getDirection from \"./getDirection\";\nimport getIndexesOnLastPage from \"./getIndexesOnLastPage\";\nimport isFirstPage from \"./isFirstPage\";\nimport isLastPage from \"./isLastPage\";\n\nexport const getStartIndex = (\n args: ConnectionInputOptions,\n { entry: { index, page }, resultsPerPage }: Pick<Context, \"entry\" | \"resultsPerPage\">,\n) => {\n const count = getCount(args);\n\n return getDirection(args.last) === \"forward\"\n ? { absolute: index + 1, relative: index + 1 }\n : isFirstPage(page) && index - count < 0\n ? { absolute: 0, relative: 0 }\n : (() => {\n const absStartIndex = index - count;\n\n if (absStartIndex >= 0) {\n return { absolute: absStartIndex, relative: absStartIndex };\n }\n\n const indexesRemainingAfterLastPage = Math.abs(absStartIndex);\n const pagesRemaining = indexesRemainingAfterLastPage / resultsPerPage + 1;\n const remainder = indexesRemainingAfterLastPage % resultsPerPage;\n const relStartIndex = remainder === 0 ? 0 : page - pagesRemaining < 0 ? 0 : resultsPerPage - remainder;\n return { absolute: absStartIndex, relative: relStartIndex };\n })();\n};\n\nexport const getEndIndex = (\n args: ConnectionInputOptions,\n { entry: { index, page }, metadata: { totalPages, totalResults }, resultsPerPage }: Context,\n) => {\n const count = getCount(args);\n const indexesOnLastPage = getIndexesOnLastPage({ resultsPerPage, totalResults });\n\n return getDirection(args.last) === \"backward\"\n ? { absolute: index - 1, relative: index - 1 }\n : isLastPage({ page, totalPages }) && index + count > indexesOnLastPage\n ? { absolute: indexesOnLastPage, relative: indexesOnLastPage }\n : (() => {\n const absEndIndex = index + count;\n const indexesPerPage = resultsPerPage - 1;\n\n if (absEndIndex <= indexesPerPage) {\n return { absolute: absEndIndex, relative: absEndIndex };\n }\n\n const indexesRemainingAfterFirstPage = absEndIndex - indexesPerPage;\n const pagesRemaining = indexesRemainingAfterFirstPage / resultsPerPage;\n const remainder = indexesRemainingAfterFirstPage % resultsPerPage;\n\n const relEndIndex =\n remainder === 0 ? indexesPerPage : page + pagesRemaining > totalPages ? indexesOnLastPage : remainder - 1;\n\n return { absolute: absEndIndex, relative: relEndIndex };\n })();\n};\n","export default (page: number) => page === 1;\n","import { CachedEdges, CursorGroupMetadata, Indexes } from \"../defs\";\nimport getIndexesOnLastPage from \"./getIndexesOnLastPage\";\n\nexport type HasPreviousPageParams = {\n cachedEdgesByPage: CachedEdges[];\n startIndex: Indexes;\n};\n\nexport type HasNextPageParams = {\n cachedEdgesByPage: CachedEdges[];\n endIndex: Indexes;\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport const hasPreviousPage = ({ cachedEdgesByPage, startIndex }: HasPreviousPageParams) =>\n cachedEdgesByPage[0].pageNumber !== 1 || startIndex.relative > 0;\n\nexport const hasNextPage = ({\n cachedEdgesByPage,\n endIndex,\n metadata: { totalPages, totalResults },\n resultsPerPage,\n}: HasNextPageParams) =>\n cachedEdgesByPage[cachedEdgesByPage.length - 1].pageNumber !== totalPages ||\n endIndex.relative < getIndexesOnLastPage({ resultsPerPage, totalResults });\n","import { ConnectionInputOptions, CursorGroupMetadata } from \"..\";\nimport getDirection from \"./getDirection\";\nimport getIndexesOnLastPage from \"./getIndexesOnLastPage\";\n\nexport type Context = {\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport default (args: ConnectionInputOptions, { metadata: { totalPages, totalResults }, resultsPerPage }: Context) => {\n if (getDirection(args.last) === \"backward\") {\n return { index: getIndexesOnLastPage({ resultsPerPage, totalResults }) + 1, page: totalPages };\n }\n\n return { index: -1, page: 1 };\n};\n","import Cachemap, { ExportResult } from \"@cachemap/core\";\nimport { Edge } from \"../defs\";\n\nexport type Context = {\n groupCursor: string;\n pageNumber: number;\n};\n\nexport default async (cursorCache: Cachemap, { groupCursor, pageNumber }: Context) => {\n const { entries, metadata } = (await cursorCache.export({\n filterByValue: [\n { keyChain: \"page\", comparator: pageNumber },\n { keyChain: \"group\", comparator: groupCursor },\n ],\n })) as ExportResult;\n\n return {\n edges: entries.reduce((cached, [key, { index, node }]) => {\n if (metadata[index].cacheability.checkTTL()) {\n cached[index] = { cursor: key, node };\n }\n\n return cached;\n }, [] as Edge[]),\n pageNumber,\n };\n};\n","import Cachemap from \"@cachemap/core\";\nimport { CachedEdges, ConnectionInputOptions, CursorGroupMetadata } from \"../defs\";\nimport getCursor from \"./getCursor\";\nimport getInRangeCachedEdges from \"./getInRangeCachedEdges\";\nimport getPageNumbersToRequest from \"./getPageNumbersToRequest\";\nimport getPagesMissingFromCache from \"./getPagesMissingFromCache\";\nimport { getEndIndex, getStartIndex } from \"./getStartAndEndIndexes\";\nimport { hasNextPage, hasPreviousPage } from \"./hasPreviousNextPage\";\nimport makeEntry from \"./makeEntry\";\nimport retrieveCachedEdgesByPage from \"./retrieveCachedEdgesByPage\";\n\nexport type Context = {\n cursorCache: Cachemap;\n groupCursor: string;\n resultsPerPage: number;\n};\n\nexport default async (args: ConnectionInputOptions, { cursorCache, groupCursor, resultsPerPage }: Context) => {\n const metadata = (await cursorCache.get(`${groupCursor}-metadata`)) as CursorGroupMetadata;\n const cursor = getCursor(args);\n const entry = cursor ? await cursorCache.get(cursor) : makeEntry(args, { metadata, resultsPerPage });\n const startIndex = getStartIndex(args, { entry, resultsPerPage });\n const endIndex = getEndIndex(args, { entry, metadata, resultsPerPage });\n const promises: Promise<CachedEdges>[] = [];\n const pageNumbersToRequest = getPageNumbersToRequest(args, { endIndex, entry, metadata, resultsPerPage, startIndex });\n\n pageNumbersToRequest.forEach(pageNumber => {\n promises.push(retrieveCachedEdgesByPage(cursorCache, { groupCursor, pageNumber }));\n });\n\n const cachedEdgesByPage = await Promise.all(promises);\n const missingPages = getPagesMissingFromCache(cachedEdgesByPage);\n\n return {\n cachedEdges: !missingPages.length\n ? getInRangeCachedEdges(cachedEdgesByPage, { endIndex, resultsPerPage, startIndex })\n : cachedEdgesByPage,\n hasNextPage: hasNextPage({\n cachedEdgesByPage,\n endIndex,\n metadata,\n resultsPerPage,\n }),\n hasPreviousPage: hasPreviousPage({ cachedEdgesByPage, startIndex }),\n indexes: { end: endIndex, start: startIndex },\n missingPages,\n totalResults: metadata.totalResults,\n };\n};\n","import Cachemap from \"@cachemap/core\";\nimport { ConnectionInputOptions, Getters, Node, PlainObject, ResourceResolver } from \"../defs\";\nimport extractEdges from \"./extractEdges\";\nimport extractNodes from \"./extractNodes\";\nimport getInRangeCachedEdges from \"./getInRangeCachedEdges\";\nimport { getEndCursor, getStartCursor } from \"./getStartAndEndCursors\";\nimport mergeCachedEdges from \"./mergeCachedEdges\";\nimport requestAndCachePages from \"./requestAndCachePages\";\nimport retrieveCachedConnection from \"./retrieveCachedConnection\";\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Cachemap;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n resultsPerPage: number;\n};\n\nconst resolveConnection = async <Resource extends PlainObject, ResourceNode extends Node>(\n args: PlainObject & ConnectionInputOptions,\n {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }: Context<Resource, ResourceNode>,\n) => {\n const {\n cachedEdges,\n hasNextPage,\n hasPreviousPage,\n indexes,\n missingPages,\n totalResults,\n } = await retrieveCachedConnection(args, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (!missingPages.length) {\n const edges = extractEdges(cachedEdges);\n\n return {\n edges,\n errors: [],\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(cachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(cachedEdges),\n },\n totalCount: totalResults,\n };\n }\n\n const { cachedEdges: missingCachedEdges, errors } = await requestAndCachePages<Resource, ResourceNode>(missingPages, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n const mergedCachedEdges = getInRangeCachedEdges(mergeCachedEdges(cachedEdges, missingCachedEdges), {\n endIndex: indexes.end,\n resultsPerPage,\n startIndex: indexes.start,\n });\n\n const edges = extractEdges(mergedCachedEdges);\n\n return {\n edges,\n errors,\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(mergedCachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(mergedCachedEdges),\n },\n totalCount: totalResults,\n };\n};\n\nexport default resolveConnection;\n","import { CursorCacheEntry, Direction } from \"../defs\";\n\nexport type Params = {\n direction: Direction;\n entry: CursorCacheEntry;\n};\n\nexport default ({ direction, entry: { index, page } }: Params) => direction === \"backward\" && page === 1 && index === 0;\n","import { CursorCacheEntry, Direction } from \"../defs\";\nimport getIndexesOnLastPage from \"./getIndexesOnLastPage\";\n\nexport type Params = {\n direction: Direction;\n entry: CursorCacheEntry;\n resultsPerPage: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport default ({ direction, entry: { index, page }, resultsPerPage, totalPages, totalResults }: Params) =>\n direction === \"forward\" && page === totalPages && index === getIndexesOnLastPage({ resultsPerPage, totalResults });\n","import Cachemap from \"@cachemap/core\";\nimport { GraphQLError, GraphQLResolveInfo } from \"graphql\";\nimport { ConnectionInputOptions, CursorCacheEntry, CursorGroupMetadata } from \"../defs\";\nimport getCursor from \"./getCursor\";\nimport getDirection from \"./getDirection\";\nimport isCursorFirst from \"./isCursorFirst\";\nimport isCursorLast from \"./isCursorLast\";\n\nexport type Context = {\n cursorCache: Cachemap;\n groupCursor: string;\n resultsPerPage: number;\n};\n\nexport default async (\n { after, before, first, last }: ConnectionInputOptions,\n { fieldNodes }: GraphQLResolveInfo,\n { cursorCache, groupCursor, resultsPerPage }: Context,\n) => {\n if (after && !first && !last) {\n return new GraphQLError(\n \"Invalid connection argument combination. `after` must be used in combination with `first`.\",\n fieldNodes,\n );\n }\n\n if (after && last) {\n return new GraphQLError(\n \"Invalid connection argument combination. `after` cannot be used in combination with `last`.\",\n fieldNodes,\n );\n }\n\n if (before && !last && !first) {\n return new GraphQLError(\n \"Invalid connection argument combination. `before` must be used in combination with `last`.\",\n fieldNodes,\n );\n }\n\n if (before && first) {\n return new GraphQLError(\n \"Invalid connection argument combination. `before` cannot be used in combination with `first`.\",\n fieldNodes,\n );\n }\n\n const metadata = (await cursorCache.get(`${groupCursor}-metadata`)) as CursorGroupMetadata | undefined;\n\n if (!metadata) {\n return new GraphQLError(\"Curser cannot be supplied without previously being provided.\", fieldNodes);\n }\n\n const cursor = getCursor({ after, before }) as string;\n const entry = (await cursorCache.get(cursor)) as CursorCacheEntry | undefined;\n\n if (!entry) {\n return new GraphQLError(`The cursor ${cursor} could not be found.`, fieldNodes);\n }\n\n const direction = getDirection(last);\n\n if (isCursorLast({ direction, entry, resultsPerPage, ...metadata })) {\n return new GraphQLError(`The cursor ${cursor} is the last, you cannot go forward any further.`, fieldNodes);\n }\n\n if (isCursorFirst({ direction, entry })) {\n return new GraphQLError(`The cursor ${cursor} is the first, you cannot go backward any further.`, fieldNodes);\n }\n\n return undefined;\n};\n","import { GraphQLResolveInfo } from \"graphql\";\nimport { Connection, ConnectionInputOptions, ConnectionResolverUserOptions, Node, PlainObject } from \"../defs\";\nimport isCursorSupplied from \"../helpers/isCursorSupplied\";\nimport requestAndCachePages from \"../helpers/requestAndCachePages\";\nimport resolveConnection from \"../helpers/resolveConnection\";\nimport validateCursor from \"../helpers/validateCursor\";\n\nconst main = <\n Source extends PlainObject | undefined,\n Args extends PlainObject,\n Ctx extends PlainObject,\n Resource extends PlainObject,\n ResourceNode extends Node\n>({\n cursorCache,\n createMakeCursors,\n createResourceResolver,\n getters,\n resolver = result => result,\n resultsPerPage,\n}: ConnectionResolverUserOptions<Source, Args, Ctx, Resource, ResourceNode>) => async (\n source: Source,\n args: Args & ConnectionInputOptions,\n context: Ctx,\n info: GraphQLResolveInfo,\n): Promise<Connection> => {\n try {\n const { makeGroupCursor, makeIDCursor } = createMakeCursors(source, args, context, info);\n const resourceResolver = createResourceResolver(source, args, context, info);\n const groupCursor = makeGroupCursor();\n\n if (isCursorSupplied(args)) {\n const cursorError = await validateCursor(args, info, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (cursorError) {\n return resolver({\n edges: [],\n errors: [cursorError],\n nodes: [],\n pageInfo: {\n hasNextPage: false,\n hasPreviousPage: false,\n },\n totalCount: 0,\n });\n }\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n if (await cursorCache.has(`${groupCursor}-metadata`)) {\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n await requestAndCachePages<Resource, ResourceNode>([1], {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n } catch (e) {\n throw e;\n }\n};\n\nexport default main;\n"],"names":["connectionInputOptions","args","_pickBy","_value","key","includes","after","before","cursorCache","edges","group","headers","page","totalPages","totalResults","cacheControl","get","opts","cacheHeaders","undefined","Promise","all","map","index","cursor","node","set","nodes","makeCursor","requestAndCachePages","pages","getters","groupCursor","makeIDCursor","resourceResolver","errors","pageResultData","data","pageResultErrors","pageResultHeaders","length","makeEdges","id","cacheCursors","pageNumber","push","cachedEdges","reduce","cachedEdge","edge","cachedEdgesByPage","endIndex","resultsPerPage","startIndex","inRange","cachedEdgesPage","i","currentPageStartIndex","pageIndex","relative","getCurrentPageStartIndex","currentPageEndIndex","totalCachedPages","getCurrentPageEndIndex","slice","getStartCursor","getEndCursor","lastCachedEdges","missingCachedEdges","mergedCachedEdges","missingCachedEdge","find","missing","last","entry","metadata","startPageNumber","getDirection","absolute","Math","ceil","abs","getStartPageNumber","endPageNumber","indexesPerPage","isLastPage","getEndPageNumber","_range","first","remainder","getResultsOnLastPage","getStartIndex","count","getCount","isFirstPage","absStartIndex","indexesRemainingAfterLastPage","getEndIndex","indexesOnLastPage","getIndexesOnLastPage","absEndIndex","indexesRemainingAfterFirstPage","hasPreviousPage","hasNextPage","export","filterByValue","keyChain","comparator","entries","cached","cacheability","checkTTL","getCursor","makeEntry","promises","getPageNumbersToRequest","forEach","retrieveCachedEdgesByPage","missingPages","getPagesMissingFromCache","getInRangeCachedEdges","indexes","end","start","resolveConnection","retrieveCachedConnection","extractEdges","extractNodes","pageInfo","endCursor","startCursor","totalCount","mergeCachedEdges","direction","fieldNodes","GraphQLError","isCursorLast","isCursorFirst","createMakeCursors","createResourceResolver","resolver","result","source","context","info","makeGroupCursor","isCursorSupplied","validateCursor","cursorError","has"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  -----------------------------
2
2
  Rollup File Analysis
3
3
  -----------------------------
4
- bundle size: 34.371 KB
5
- original size: 25.403 KB
4
+ bundle size: 34.405 KB
5
+ original size: 26.512 KB
6
6
  code reduction: 0 %
7
7
  module count: 33
8
8
 
9
9
  ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
10
10
  file: /src/helpers/validateCursor.ts
11
- bundle space: 13.85 %
11
+ bundle space: 13.84 %
12
12
  rendered size: 4.761 KB
13
13
  original size: 2.3 KB
14
14
  code reduction: 0 %
@@ -17,18 +17,18 @@ dependents: 1
17
17
 
18
18
  ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
19
19
  file: /src/main/index.ts
20
- bundle space: 13.56 %
21
- rendered size: 4.659 KB
22
- original size: 2.323 KB
20
+ bundle space: 13.54 %
21
+ rendered size: 4.66 KB
22
+ original size: 2.556 KB
23
23
  code reduction: 0 %
24
24
  dependents: 1
25
25
  - /src/index.ts
26
26
 
27
27
  █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
28
28
  file: /src/helpers/requestAndCachePages.ts
29
- bundle space: 11 %
30
- rendered size: 3.781 KB
31
- original size: 1.4 KB
29
+ bundle space: 11.04 %
30
+ rendered size: 3.799 KB
31
+ original size: 1.643 KB
32
32
  code reduction: 0 %
33
33
  dependents: 2
34
34
  - /src/helpers/resolveConnection.ts
@@ -36,16 +36,16 @@ dependents: 2
36
36
 
37
37
  █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
38
38
  file: /src/helpers/resolveConnection.ts
39
- bundle space: 10.24 %
40
- rendered size: 3.518 KB
41
- original size: 2.198 KB
39
+ bundle space: 10.27 %
40
+ rendered size: 3.533 KB
41
+ original size: 2.473 KB
42
42
  code reduction: 0 %
43
43
  dependents: 1
44
44
  - /src/main/index.ts
45
45
 
46
46
  ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
47
47
  file: /src/helpers/retrieveCachedConnection.ts
48
- bundle space: 9.95 %
48
+ bundle space: 9.94 %
49
49
  rendered size: 3.42 KB
50
50
  original size: 2.103 KB
51
51
  code reduction: 0 %
@@ -63,7 +63,7 @@ dependents: 1
63
63
 
64
64
  ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
65
65
  file: /src/helpers/cacheCursors.ts
66
- bundle space: 6.56 %
66
+ bundle space: 6.55 %
67
67
  rendered size: 2.255 KB
68
68
  original size: 687 Bytes
69
69
  code reduction: 0 %
@@ -81,7 +81,7 @@ dependents: 1
81
81
 
82
82
  █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
83
83
  file: /src/helpers/getStartAndEndPageNumbers.ts
84
- bundle space: 2.94 %
84
+ bundle space: 2.93 %
85
85
  rendered size: 1.009 KB
86
86
  original size: 1.279 KB
87
87
  code reduction: 21.11 %
@@ -229,7 +229,7 @@ dependents: 1
229
229
 
230
230
  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
231
231
  file: /src/helpers/isCursorSupplied.ts
232
- bundle space: 0.38 %
232
+ bundle space: 0.37 %
233
233
  rendered size: 129 Bytes
234
234
  original size: 161 Bytes
235
235
  code reduction: 19.88 %
@@ -238,7 +238,7 @@ dependents: 1
238
238
 
239
239
  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
240
240
  file: /src/helpers/isLastPage.ts
241
- bundle space: 0.38 %
241
+ bundle space: 0.37 %
242
242
  rendered size: 129 Bytes
243
243
  original size: 135 Bytes
244
244
  code reduction: 4.44 %
@@ -299,7 +299,7 @@ dependents: 1
299
299
  file: /src/defs/index.ts
300
300
  bundle space: 0 %
301
301
  rendered size: 0 Byte
302
- original size: 2.353 KB
302
+ original size: 2.711 KB
303
303
  code reduction: 100 %
304
304
  dependents: 1
305
305
  - /src/index.ts
@@ -28,7 +28,8 @@ var _default = async ({
28
28
  }) => {
29
29
  const cursorCache = new _core.default({
30
30
  name: "cursorCache",
31
- store: (0, _map.default)()
31
+ store: (0, _map.default)(),
32
+ type: "someType"
32
33
  });
33
34
  const headers = new Headers({
34
35
  "Cache-Control": "max-age=60"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__testUtils__/generateCursorCache.ts"],"names":["group","pageRanges","resultsPerPage","totalPages","totalResults","cursorCache","Cachemap","name","store","headers","Headers","length","pages","Promise","all","map","page","isLastPage","resultsOnCurrentPage","remainder","edges","Array","from","_v","i","index","id","cursor","node","set","cacheHeaders","cacheControl","get","undefined"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;eAUe,OAAO;AAAEA,EAAAA,KAAF;AAASC,EAAAA,UAAU,GAAG,EAAtB;AAA0BC,EAAAA,cAA1B;AAA0CC,EAAAA,UAA1C;AAAsDC,EAAAA;AAAtD,CAAP,KAAwF;AACrG,QAAMC,WAAW,GAAG,IAAIC,aAAJ,CAAa;AAC/BC,IAAAA,IAAI,EAAE,aADyB;AAE/BC,IAAAA,KAAK,EAAE;AAFwB,GAAb,CAApB;AAKA,QAAMC,OAAO,GAAG,IAAIC,OAAJ,CAAY;AAAE,qBAAiB;AAAnB,GAAZ,CAAhB;;AAEA,MAAIT,UAAU,CAACU,MAAX,IAAqBT,cAAzB,EAAyC;AACvC,UAAMU,KAAK,GAAG,4BAAcX,UAAd,CAAd;AAEA,UAAMY,OAAO,CAACC,GAAR,CACJF,KAAK,CAACG,GAAN,CAAU,MAAMC,IAAN,IAAc;AACtB,YAAMC,UAAU,GAAGD,IAAI,KAAKJ,KAAK,CAACA,KAAK,CAACD,MAAN,GAAe,CAAhB,CAAjC;AACA,UAAIO,oBAAJ;;AAEA,UAAID,UAAJ,EAAgB;AACd,cAAME,SAAS,GAAGf,YAAY,GAAGF,cAAjC;AACAgB,QAAAA,oBAAoB,GAAGC,SAAS,KAAK,CAAd,GAAkBjB,cAAlB,GAAmCiB,SAA1D;AACD,OAHD,MAGO;AACLD,QAAAA,oBAAoB,GAAGhB,cAAvB;AACD;;AAED,YAAMkB,KAAK,GAAGC,KAAK,CAACC,IAAN,CAAW;AAAEX,QAAAA,MAAM,EAAEO;AAAV,OAAX,EAA6C,CAACK,EAAD,EAAKC,CAAL,KAAWA,CAAxD,EAA2DT,GAA3D,CAA+DU,KAAK,IAAI;AACpF,cAAMC,EAAE,GAAG,oBAAQ,GAAED,KAAM,KAAIT,IAAK,EAAzB,CAAX;AACA,eAAO;AAAEW,UAAAA,MAAM,EAAG,GAAED,EAAG,KAAI1B,KAAM,EAA1B;AAA6B4B,UAAAA,IAAI,EAAE;AAAEF,YAAAA;AAAF;AAAnC,SAAP;AACD,OAHa,CAAd;AAKA,YAAM,2BAAarB,WAAb,EAA0B;AAAEe,QAAAA,KAAF;AAASpB,QAAAA,KAAT;AAAgBS,QAAAA,OAAhB;AAAyBO,QAAAA,IAAzB;AAA+Bb,QAAAA,UAA/B;AAA2CC,QAAAA;AAA3C,OAA1B,CAAN;AACD,KAjBD,CADI,CAAN;AAoBD,GAvBD,MAuBO;AAAA;;AACL,UAAMC,WAAW,CAACwB,GAAZ,CACH,GAAE7B,KAAM,WADL,EAEJ;AAAEG,MAAAA,UAAF;AAAcC,MAAAA;AAAd,KAFI,EAGJ;AAAE0B,MAAAA,YAAY,EAAE;AAAEC,QAAAA,YAAY,kBAAEtB,OAAO,CAACuB,GAAR,CAAY,eAAZ,CAAF,uDAAkCC;AAAhD;AAAhB,KAHI,CAAN;AAKD;;AAED,SAAO5B,WAAP;AACD,C","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport map from \"@cachemap/map\";\nimport { encode } from \"js-base64\";\nimport cacheCursors from \"../helpers/cacheCursors\";\nimport generatePages from \"./generatePages\";\n\nexport type Params = {\n group: string;\n pageRanges?: string[];\n resultsPerPage?: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport default async ({ group, pageRanges = [], resultsPerPage, totalPages, totalResults }: Params) => {\n const cursorCache = new Cachemap({\n name: \"cursorCache\",\n store: map(),\n });\n\n const headers = new Headers({ \"Cache-Control\": \"max-age=60\" });\n\n if (pageRanges.length && resultsPerPage) {\n const pages = generatePages(pageRanges);\n\n await Promise.all(\n pages.map(async page => {\n const isLastPage = page === pages[pages.length - 1];\n let resultsOnCurrentPage: number;\n\n if (isLastPage) {\n const remainder = totalResults % resultsPerPage;\n resultsOnCurrentPage = remainder === 0 ? resultsPerPage : remainder;\n } else {\n resultsOnCurrentPage = resultsPerPage;\n }\n\n const edges = Array.from({ length: resultsOnCurrentPage }, (_v, i) => i).map(index => {\n const id = encode(`${index}::${page}`);\n return { cursor: `${id}::${group}`, node: { id } };\n });\n\n await cacheCursors(cursorCache, { edges, group, headers, page, totalPages, totalResults });\n }),\n );\n } else {\n await cursorCache.set(\n `${group}-metadata`,\n { totalPages, totalResults },\n { cacheHeaders: { cacheControl: headers.get(\"cache-control\") ?? undefined } },\n );\n }\n\n return cursorCache;\n};\n"],"file":"generateCursorCache.js"}
1
+ {"version":3,"sources":["../../../src/__testUtils__/generateCursorCache.ts"],"names":["group","pageRanges","resultsPerPage","totalPages","totalResults","cursorCache","Cachemap","name","store","type","headers","Headers","length","pages","Promise","all","map","page","isLastPage","resultsOnCurrentPage","remainder","edges","Array","from","_v","i","index","id","cursor","node","set","cacheHeaders","cacheControl","get","undefined"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;eAUe,OAAO;AAAEA,EAAAA,KAAF;AAASC,EAAAA,UAAU,GAAG,EAAtB;AAA0BC,EAAAA,cAA1B;AAA0CC,EAAAA,UAA1C;AAAsDC,EAAAA;AAAtD,CAAP,KAAwF;AACrG,QAAMC,WAAW,GAAG,IAAIC,aAAJ,CAAa;AAC/BC,IAAAA,IAAI,EAAE,aADyB;AAE/BC,IAAAA,KAAK,EAAE,mBAFwB;AAG/BC,IAAAA,IAAI,EAAE;AAHyB,GAAb,CAApB;AAMA,QAAMC,OAAO,GAAG,IAAIC,OAAJ,CAAY;AAAE,qBAAiB;AAAnB,GAAZ,CAAhB;;AAEA,MAAIV,UAAU,CAACW,MAAX,IAAqBV,cAAzB,EAAyC;AACvC,UAAMW,KAAK,GAAG,4BAAcZ,UAAd,CAAd;AAEA,UAAMa,OAAO,CAACC,GAAR,CACJF,KAAK,CAACG,GAAN,CAAU,MAAMC,IAAN,IAAc;AACtB,YAAMC,UAAU,GAAGD,IAAI,KAAKJ,KAAK,CAACA,KAAK,CAACD,MAAN,GAAe,CAAhB,CAAjC;AACA,UAAIO,oBAAJ;;AAEA,UAAID,UAAJ,EAAgB;AACd,cAAME,SAAS,GAAGhB,YAAY,GAAGF,cAAjC;AACAiB,QAAAA,oBAAoB,GAAGC,SAAS,KAAK,CAAd,GAAkBlB,cAAlB,GAAmCkB,SAA1D;AACD,OAHD,MAGO;AACLD,QAAAA,oBAAoB,GAAGjB,cAAvB;AACD;;AAED,YAAMmB,KAAK,GAAGC,KAAK,CAACC,IAAN,CAAW;AAAEX,QAAAA,MAAM,EAAEO;AAAV,OAAX,EAA6C,CAACK,EAAD,EAAKC,CAAL,KAAWA,CAAxD,EAA2DT,GAA3D,CAA+DU,KAAK,IAAI;AACpF,cAAMC,EAAE,GAAG,oBAAQ,GAAED,KAAM,KAAIT,IAAK,EAAzB,CAAX;AACA,eAAO;AAAEW,UAAAA,MAAM,EAAG,GAAED,EAAG,KAAI3B,KAAM,EAA1B;AAA6B6B,UAAAA,IAAI,EAAE;AAAEF,YAAAA;AAAF;AAAnC,SAAP;AACD,OAHa,CAAd;AAKA,YAAM,2BAAatB,WAAb,EAA0B;AAAEgB,QAAAA,KAAF;AAASrB,QAAAA,KAAT;AAAgBU,QAAAA,OAAhB;AAAyBO,QAAAA,IAAzB;AAA+Bd,QAAAA,UAA/B;AAA2CC,QAAAA;AAA3C,OAA1B,CAAN;AACD,KAjBD,CADI,CAAN;AAoBD,GAvBD,MAuBO;AAAA;;AACL,UAAMC,WAAW,CAACyB,GAAZ,CACH,GAAE9B,KAAM,WADL,EAEJ;AAAEG,MAAAA,UAAF;AAAcC,MAAAA;AAAd,KAFI,EAGJ;AAAE2B,MAAAA,YAAY,EAAE;AAAEC,QAAAA,YAAY,kBAAEtB,OAAO,CAACuB,GAAR,CAAY,eAAZ,CAAF,uDAAkCC;AAAhD;AAAhB,KAHI,CAAN;AAKD;;AAED,SAAO7B,WAAP;AACD,C","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport map from \"@cachemap/map\";\nimport { encode } from \"js-base64\";\nimport cacheCursors from \"../helpers/cacheCursors\";\nimport generatePages from \"./generatePages\";\n\nexport type Params = {\n group: string;\n pageRanges?: string[];\n resultsPerPage?: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport default async ({ group, pageRanges = [], resultsPerPage, totalPages, totalResults }: Params) => {\n const cursorCache = new Cachemap({\n name: \"cursorCache\",\n store: map(),\n type: \"someType\",\n });\n\n const headers = new Headers({ \"Cache-Control\": \"max-age=60\" });\n\n if (pageRanges.length && resultsPerPage) {\n const pages = generatePages(pageRanges);\n\n await Promise.all(\n pages.map(async page => {\n const isLastPage = page === pages[pages.length - 1];\n let resultsOnCurrentPage: number;\n\n if (isLastPage) {\n const remainder = totalResults % resultsPerPage;\n resultsOnCurrentPage = remainder === 0 ? resultsPerPage : remainder;\n } else {\n resultsOnCurrentPage = resultsPerPage;\n }\n\n const edges = Array.from({ length: resultsOnCurrentPage }, (_v, i) => i).map(index => {\n const id = encode(`${index}::${page}`);\n return { cursor: `${id}::${group}`, node: { id } };\n });\n\n await cacheCursors(cursorCache, { edges, group, headers, page, totalPages, totalResults });\n }),\n );\n } else {\n await cursorCache.set(\n `${group}-metadata`,\n { totalPages, totalResults },\n { cacheHeaders: { cacheControl: headers.get(\"cache-control\") ?? undefined } },\n );\n }\n\n return cursorCache;\n};\n"],"file":"generateCursorCache.js"}
@@ -13,7 +13,7 @@ var _cacheCursors = _interopRequireDefault(require("./cacheCursors"));
13
13
 
14
14
  var _makeEdges = _interopRequireDefault(require("./makeEdges"));
15
15
 
16
- var _default = async (pages, {
16
+ const requestAndCachePages = async (pages, {
17
17
  cursorCache,
18
18
  getters,
19
19
  groupCursor,
@@ -61,5 +61,6 @@ var _default = async (pages, {
61
61
  };
62
62
  };
63
63
 
64
+ var _default = requestAndCachePages;
64
65
  exports.default = _default;
65
66
  //# sourceMappingURL=requestAndCachePages.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/helpers/requestAndCachePages.ts"],"names":["pages","cursorCache","getters","groupCursor","makeIDCursor","resourceResolver","errors","cachedEdges","Promise","all","map","page","data","pageResultData","pageResultErrors","headers","pageResultHeaders","length","edges","nodes","node","id","group","totalPages","totalResults","pageNumber","push"],"mappings":";;;;;;;;;;;AAEA;;AACA;;eAUe,OACbA,KADa,EAEb;AAAEC,EAAAA,WAAF;AAAeC,EAAAA,OAAf;AAAwBC,EAAAA,WAAxB;AAAqCC,EAAAA,YAArC;AAAmDC,EAAAA;AAAnD,CAFa,KAGV;AACH,QAAMC,MAAe,GAAG,EAAxB;AAEA,QAAMC,WAAW,GAAG,MAAMC,OAAO,CAACC,GAAR,CACxBT,KAAK,CAACU,GAAN,CAAU,MAAMC,IAAN,IAAc;AACtB,UAAM;AAAEC,MAAAA,IAAI,EAAEC,cAAR;AAAwBP,MAAAA,MAAM,EAAEQ,gBAAhC;AAAkDC,MAAAA,OAAO,EAAEC;AAA3D,QAAiF,MAAMX,gBAAgB,CAAC;AAC5GM,MAAAA;AAD4G,KAAD,CAA7G;;AAIA,QAAIE,cAAc,IAAI,EAACC,gBAAD,aAACA,gBAAD,eAACA,gBAAgB,CAAEG,MAAnB,CAAtB,EAAiD;AAC/C,YAAMC,KAAK,GAAG,wBAAUhB,OAAO,CAACiB,KAAR,CAAcN,cAAd,CAAV,EAAyCO,IAAI,IAAIhB,YAAY,CAACgB,IAAI,CAACC,EAAN,CAA7D,CAAd;AAEA,YAAM,2BAAapB,WAAb,EAA0B;AAC9BiB,QAAAA,KAD8B;AAE9BI,QAAAA,KAAK,EAAEnB,WAFuB;AAG9BY,QAAAA,OAAO,EAAEC,iBAHqB;AAI9BL,QAAAA,IAJ8B;AAK9BY,QAAAA,UAAU,EAAErB,OAAO,CAACqB,UAAR,CAAmBV,cAAnB,CALkB;AAM9BW,QAAAA,YAAY,EAAEtB,OAAO,CAACsB,YAAR,CAAqBX,cAArB;AANgB,OAA1B,CAAN;AASA,aAAO;AAAEK,QAAAA,KAAF;AAASO,QAAAA,UAAU,EAAEd;AAArB,OAAP;AACD;;AAED,QAAIG,gBAAJ,aAAIA,gBAAJ,eAAIA,gBAAgB,CAAEG,MAAtB,EAA8B;AAC5BX,MAAAA,MAAM,CAACoB,IAAP,CAAY,GAAGZ,gBAAf;AACD;;AAED,WAAO;AAAEI,MAAAA,KAAK,EAAE,EAAT;AAAaO,MAAAA,UAAU,EAAEd;AAAzB,KAAP;AACD,GAzBD,CADwB,CAA1B;AA6BA,SAAO;AAAEJ,IAAAA,WAAF;AAAeD,IAAAA;AAAf,GAAP;AACD,C","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport { Getters, ResourceResolver } from \"../defs\";\nimport cacheCursors from \"./cacheCursors\";\nimport makeEdges from \"./makeEdges\";\n\nexport type Context = {\n cursorCache: Cachemap;\n getters: Getters;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver;\n};\n\nexport default async (\n pages: number[],\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context,\n) => {\n const errors: Error[] = [];\n\n const cachedEdges = await Promise.all(\n pages.map(async page => {\n const { data: pageResultData, errors: pageResultErrors, headers: pageResultHeaders } = await resourceResolver({\n page,\n });\n\n if (pageResultData && !pageResultErrors?.length) {\n const edges = makeEdges(getters.nodes(pageResultData), node => makeIDCursor(node.id));\n\n await cacheCursors(cursorCache, {\n edges,\n group: groupCursor,\n headers: pageResultHeaders,\n page,\n totalPages: getters.totalPages(pageResultData),\n totalResults: getters.totalResults(pageResultData),\n });\n\n return { edges, pageNumber: page };\n }\n\n if (pageResultErrors?.length) {\n errors.push(...pageResultErrors);\n }\n\n return { edges: [], pageNumber: page };\n }),\n );\n\n return { cachedEdges, errors };\n};\n"],"file":"requestAndCachePages.js"}
1
+ {"version":3,"sources":["../../../src/helpers/requestAndCachePages.ts"],"names":["requestAndCachePages","pages","cursorCache","getters","groupCursor","makeIDCursor","resourceResolver","errors","cachedEdges","Promise","all","map","page","data","pageResultData","pageResultErrors","headers","pageResultHeaders","length","edges","nodes","node","id","group","totalPages","totalResults","pageNumber","push"],"mappings":";;;;;;;;;;;AAEA;;AACA;;AAUA,MAAMA,oBAAoB,GAAG,OAC3BC,KAD2B,EAE3B;AAAEC,EAAAA,WAAF;AAAeC,EAAAA,OAAf;AAAwBC,EAAAA,WAAxB;AAAqCC,EAAAA,YAArC;AAAmDC,EAAAA;AAAnD,CAF2B,KAGxB;AACH,QAAMC,MAAe,GAAG,EAAxB;AAEA,QAAMC,WAAW,GAAG,MAAMC,OAAO,CAACC,GAAR,CACxBT,KAAK,CAACU,GAAN,CAAU,MAAMC,IAAN,IAAc;AACtB,UAAM;AAAEC,MAAAA,IAAI,EAAEC,cAAR;AAAwBP,MAAAA,MAAM,EAAEQ,gBAAhC;AAAkDC,MAAAA,OAAO,EAAEC;AAA3D,QAAiF,MAAMX,gBAAgB,CAAC;AAC5GM,MAAAA;AAD4G,KAAD,CAA7G;;AAIA,QAAIE,cAAc,IAAI,EAACC,gBAAD,aAACA,gBAAD,eAACA,gBAAgB,CAAEG,MAAnB,CAAtB,EAAiD;AAC/C,YAAMC,KAAK,GAAG,wBAAUhB,OAAO,CAACiB,KAAR,CAAcN,cAAd,CAAV,EAAyCO,IAAI,IAAIhB,YAAY,CAACgB,IAAI,CAACC,EAAN,CAA7D,CAAd;AAEA,YAAM,2BAAapB,WAAb,EAA0B;AAC9BiB,QAAAA,KAD8B;AAE9BI,QAAAA,KAAK,EAAEnB,WAFuB;AAG9BY,QAAAA,OAAO,EAAEC,iBAHqB;AAI9BL,QAAAA,IAJ8B;AAK9BY,QAAAA,UAAU,EAAErB,OAAO,CAACqB,UAAR,CAAmBV,cAAnB,CALkB;AAM9BW,QAAAA,YAAY,EAAEtB,OAAO,CAACsB,YAAR,CAAqBX,cAArB;AANgB,OAA1B,CAAN;AASA,aAAO;AAAEK,QAAAA,KAAF;AAASO,QAAAA,UAAU,EAAEd;AAArB,OAAP;AACD;;AAED,QAAIG,gBAAJ,aAAIA,gBAAJ,eAAIA,gBAAgB,CAAEG,MAAtB,EAA8B;AAC5BX,MAAAA,MAAM,CAACoB,IAAP,CAAY,GAAGZ,gBAAf;AACD;;AAED,WAAO;AAAEI,MAAAA,KAAK,EAAE,EAAT;AAAaO,MAAAA,UAAU,EAAEd;AAAzB,KAAP;AACD,GAzBD,CADwB,CAA1B;AA6BA,SAAO;AAAEJ,IAAAA,WAAF;AAAeD,IAAAA;AAAf,GAAP;AACD,CApCD;;eAsCeP,oB","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport { Getters, Node, PlainObject, ResourceResolver } from \"../defs\";\nimport cacheCursors from \"./cacheCursors\";\nimport makeEdges from \"./makeEdges\";\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Cachemap;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n};\n\nconst requestAndCachePages = async <Resource extends PlainObject, ResourceNode extends Node>(\n pages: number[],\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context<Resource, ResourceNode>,\n) => {\n const errors: Error[] = [];\n\n const cachedEdges = await Promise.all(\n pages.map(async page => {\n const { data: pageResultData, errors: pageResultErrors, headers: pageResultHeaders } = await resourceResolver({\n page,\n });\n\n if (pageResultData && !pageResultErrors?.length) {\n const edges = makeEdges(getters.nodes(pageResultData), node => makeIDCursor(node.id));\n\n await cacheCursors(cursorCache, {\n edges,\n group: groupCursor,\n headers: pageResultHeaders,\n page,\n totalPages: getters.totalPages(pageResultData),\n totalResults: getters.totalResults(pageResultData),\n });\n\n return { edges, pageNumber: page };\n }\n\n if (pageResultErrors?.length) {\n errors.push(...pageResultErrors);\n }\n\n return { edges: [], pageNumber: page };\n }),\n );\n\n return { cachedEdges, errors };\n};\n\nexport default requestAndCachePages;\n"],"file":"requestAndCachePages.js"}
@@ -23,7 +23,7 @@ var _requestAndCachePages = _interopRequireDefault(require("./requestAndCachePag
23
23
 
24
24
  var _retrieveCachedConnection = _interopRequireDefault(require("./retrieveCachedConnection"));
25
25
 
26
- var _default = async (args, {
26
+ const resolveConnection = async (args, {
27
27
  cursorCache,
28
28
  getters,
29
29
  groupCursor,
@@ -90,5 +90,6 @@ var _default = async (args, {
90
90
  };
91
91
  };
92
92
 
93
+ var _default = resolveConnection;
93
94
  exports.default = _default;
94
95
  //# sourceMappingURL=resolveConnection.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/helpers/resolveConnection.ts"],"names":["args","cursorCache","getters","groupCursor","makeIDCursor","resourceResolver","resultsPerPage","cachedEdges","hasNextPage","hasPreviousPage","indexes","missingPages","totalResults","length","edges","errors","nodes","pageInfo","endCursor","startCursor","totalCount","missingCachedEdges","mergedCachedEdges","endIndex","end","startIndex","start"],"mappings":";;;;;;;;;;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;eAWe,OACbA,IADa,EAEb;AAAEC,EAAAA,WAAF;AAAeC,EAAAA,OAAf;AAAwBC,EAAAA,WAAxB;AAAqCC,EAAAA,YAArC;AAAmDC,EAAAA,gBAAnD;AAAqEC,EAAAA;AAArE,CAFa,KAGV;AACH,QAAM;AACJC,IAAAA,WADI;AAEJC,IAAAA,WAFI;AAGJC,IAAAA,eAHI;AAIJC,IAAAA,OAJI;AAKJC,IAAAA,YALI;AAMJC,IAAAA;AANI,MAOF,MAAM,uCAAyBZ,IAAzB,EAA+B;AACvCC,IAAAA,WADuC;AAEvCE,IAAAA,WAFuC;AAGvCG,IAAAA;AAHuC,GAA/B,CAPV;;AAaA,MAAI,CAACK,YAAY,CAACE,MAAlB,EAA0B;AACxB,UAAMC,KAAK,GAAG,2BAAaP,WAAb,CAAd;AAEA,WAAO;AACLO,MAAAA,KADK;AAELC,MAAAA,MAAM,EAAE,EAFH;AAGLC,MAAAA,KAAK,EAAE,2BAAaF,KAAb,CAHF;AAILG,MAAAA,QAAQ,EAAE;AACRC,QAAAA,SAAS,EAAE,yCAAaX,WAAb,CADH;AAERC,QAAAA,WAFQ;AAGRC,QAAAA,eAHQ;AAIRU,QAAAA,WAAW,EAAE,2CAAeZ,WAAf;AAJL,OAJL;AAULa,MAAAA,UAAU,EAAER;AAVP,KAAP;AAYD;;AAED,QAAM;AAAEL,IAAAA,WAAW,EAAEc,kBAAf;AAAmCN,IAAAA;AAAnC,MAA8C,MAAM,mCAAqBJ,YAArB,EAAmC;AAC3FV,IAAAA,WAD2F;AAE3FC,IAAAA,OAF2F;AAG3FC,IAAAA,WAH2F;AAI3FC,IAAAA,YAJ2F;AAK3FC,IAAAA;AAL2F,GAAnC,CAA1D;AAQA,QAAMiB,iBAAiB,GAAG,oCAAsB,+BAAiBf,WAAjB,EAA8Bc,kBAA9B,CAAtB,EAAyE;AACjGE,IAAAA,QAAQ,EAAEb,OAAO,CAACc,GAD+E;AAEjGlB,IAAAA,cAFiG;AAGjGmB,IAAAA,UAAU,EAAEf,OAAO,CAACgB;AAH6E,GAAzE,CAA1B;AAMA,QAAMZ,KAAK,GAAG,2BAAaQ,iBAAb,CAAd;AAEA,SAAO;AACLR,IAAAA,KADK;AAELC,IAAAA,MAFK;AAGLC,IAAAA,KAAK,EAAE,2BAAaF,KAAb,CAHF;AAILG,IAAAA,QAAQ,EAAE;AACRC,MAAAA,SAAS,EAAE,yCAAaI,iBAAb,CADH;AAERd,MAAAA,WAFQ;AAGRC,MAAAA,eAHQ;AAIRU,MAAAA,WAAW,EAAE,2CAAeG,iBAAf;AAJL,KAJL;AAULF,IAAAA,UAAU,EAAER;AAVP,GAAP;AAYD,C","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport { ConnectionInputOptions, Getters, PlainObject, ResourceResolver } from \"../defs\";\nimport extractEdges from \"./extractEdges\";\nimport extractNodes from \"./extractNodes\";\nimport getInRangeCachedEdges from \"./getInRangeCachedEdges\";\nimport { getEndCursor, getStartCursor } from \"./getStartAndEndCursors\";\nimport mergeCachedEdges from \"./mergeCachedEdges\";\nimport requestAndCachePages from \"./requestAndCachePages\";\nimport retrieveCachedConnection from \"./retrieveCachedConnection\";\n\nexport type Context = {\n cursorCache: Cachemap;\n getters: Getters;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver;\n resultsPerPage: number;\n};\n\nexport default async (\n args: PlainObject & ConnectionInputOptions,\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver, resultsPerPage }: Context,\n) => {\n const {\n cachedEdges,\n hasNextPage,\n hasPreviousPage,\n indexes,\n missingPages,\n totalResults,\n } = await retrieveCachedConnection(args, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (!missingPages.length) {\n const edges = extractEdges(cachedEdges);\n\n return {\n edges,\n errors: [],\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(cachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(cachedEdges),\n },\n totalCount: totalResults,\n };\n }\n\n const { cachedEdges: missingCachedEdges, errors } = await requestAndCachePages(missingPages, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n const mergedCachedEdges = getInRangeCachedEdges(mergeCachedEdges(cachedEdges, missingCachedEdges), {\n endIndex: indexes.end,\n resultsPerPage,\n startIndex: indexes.start,\n });\n\n const edges = extractEdges(mergedCachedEdges);\n\n return {\n edges,\n errors,\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(mergedCachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(mergedCachedEdges),\n },\n totalCount: totalResults,\n };\n};\n"],"file":"resolveConnection.js"}
1
+ {"version":3,"sources":["../../../src/helpers/resolveConnection.ts"],"names":["resolveConnection","args","cursorCache","getters","groupCursor","makeIDCursor","resourceResolver","resultsPerPage","cachedEdges","hasNextPage","hasPreviousPage","indexes","missingPages","totalResults","length","edges","errors","nodes","pageInfo","endCursor","startCursor","totalCount","missingCachedEdges","mergedCachedEdges","endIndex","end","startIndex","start"],"mappings":";;;;;;;;;;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAWA,MAAMA,iBAAiB,GAAG,OACxBC,IADwB,EAExB;AACEC,EAAAA,WADF;AAEEC,EAAAA,OAFF;AAGEC,EAAAA,WAHF;AAIEC,EAAAA,YAJF;AAKEC,EAAAA,gBALF;AAMEC,EAAAA;AANF,CAFwB,KAUrB;AACH,QAAM;AACJC,IAAAA,WADI;AAEJC,IAAAA,WAFI;AAGJC,IAAAA,eAHI;AAIJC,IAAAA,OAJI;AAKJC,IAAAA,YALI;AAMJC,IAAAA;AANI,MAOF,MAAM,uCAAyBZ,IAAzB,EAA+B;AACvCC,IAAAA,WADuC;AAEvCE,IAAAA,WAFuC;AAGvCG,IAAAA;AAHuC,GAA/B,CAPV;;AAaA,MAAI,CAACK,YAAY,CAACE,MAAlB,EAA0B;AACxB,UAAMC,KAAK,GAAG,2BAAaP,WAAb,CAAd;AAEA,WAAO;AACLO,MAAAA,KADK;AAELC,MAAAA,MAAM,EAAE,EAFH;AAGLC,MAAAA,KAAK,EAAE,2BAAaF,KAAb,CAHF;AAILG,MAAAA,QAAQ,EAAE;AACRC,QAAAA,SAAS,EAAE,yCAAaX,WAAb,CADH;AAERC,QAAAA,WAFQ;AAGRC,QAAAA,eAHQ;AAIRU,QAAAA,WAAW,EAAE,2CAAeZ,WAAf;AAJL,OAJL;AAULa,MAAAA,UAAU,EAAER;AAVP,KAAP;AAYD;;AAED,QAAM;AAAEL,IAAAA,WAAW,EAAEc,kBAAf;AAAmCN,IAAAA;AAAnC,MAA8C,MAAM,mCAA6CJ,YAA7C,EAA2D;AACnHV,IAAAA,WADmH;AAEnHC,IAAAA,OAFmH;AAGnHC,IAAAA,WAHmH;AAInHC,IAAAA,YAJmH;AAKnHC,IAAAA;AALmH,GAA3D,CAA1D;AAQA,QAAMiB,iBAAiB,GAAG,oCAAsB,+BAAiBf,WAAjB,EAA8Bc,kBAA9B,CAAtB,EAAyE;AACjGE,IAAAA,QAAQ,EAAEb,OAAO,CAACc,GAD+E;AAEjGlB,IAAAA,cAFiG;AAGjGmB,IAAAA,UAAU,EAAEf,OAAO,CAACgB;AAH6E,GAAzE,CAA1B;AAMA,QAAMZ,KAAK,GAAG,2BAAaQ,iBAAb,CAAd;AAEA,SAAO;AACLR,IAAAA,KADK;AAELC,IAAAA,MAFK;AAGLC,IAAAA,KAAK,EAAE,2BAAaF,KAAb,CAHF;AAILG,IAAAA,QAAQ,EAAE;AACRC,MAAAA,SAAS,EAAE,yCAAaI,iBAAb,CADH;AAERd,MAAAA,WAFQ;AAGRC,MAAAA,eAHQ;AAIRU,MAAAA,WAAW,EAAE,2CAAeG,iBAAf;AAJL,KAJL;AAULF,IAAAA,UAAU,EAAER;AAVP,GAAP;AAYD,CArED;;eAuEeb,iB","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport { ConnectionInputOptions, Getters, Node, PlainObject, ResourceResolver } from \"../defs\";\nimport extractEdges from \"./extractEdges\";\nimport extractNodes from \"./extractNodes\";\nimport getInRangeCachedEdges from \"./getInRangeCachedEdges\";\nimport { getEndCursor, getStartCursor } from \"./getStartAndEndCursors\";\nimport mergeCachedEdges from \"./mergeCachedEdges\";\nimport requestAndCachePages from \"./requestAndCachePages\";\nimport retrieveCachedConnection from \"./retrieveCachedConnection\";\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Cachemap;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n resultsPerPage: number;\n};\n\nconst resolveConnection = async <Resource extends PlainObject, ResourceNode extends Node>(\n args: PlainObject & ConnectionInputOptions,\n {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }: Context<Resource, ResourceNode>,\n) => {\n const {\n cachedEdges,\n hasNextPage,\n hasPreviousPage,\n indexes,\n missingPages,\n totalResults,\n } = await retrieveCachedConnection(args, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (!missingPages.length) {\n const edges = extractEdges(cachedEdges);\n\n return {\n edges,\n errors: [],\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(cachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(cachedEdges),\n },\n totalCount: totalResults,\n };\n }\n\n const { cachedEdges: missingCachedEdges, errors } = await requestAndCachePages<Resource, ResourceNode>(missingPages, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n const mergedCachedEdges = getInRangeCachedEdges(mergeCachedEdges(cachedEdges, missingCachedEdges), {\n endIndex: indexes.end,\n resultsPerPage,\n startIndex: indexes.start,\n });\n\n const edges = extractEdges(mergedCachedEdges);\n\n return {\n edges,\n errors,\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(mergedCachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(mergedCachedEdges),\n },\n totalCount: totalResults,\n };\n};\n\nexport default resolveConnection;\n"],"file":"resolveConnection.js"}
@@ -17,7 +17,7 @@ var _resolveConnection = _interopRequireDefault(require("../helpers/resolveConne
17
17
 
18
18
  var _validateCursor = _interopRequireDefault(require("../helpers/validateCursor"));
19
19
 
20
- var _default = ({
20
+ const main = ({
21
21
  cursorCache,
22
22
  createMakeCursors,
23
23
  createResourceResolver,
@@ -94,5 +94,6 @@ var _default = ({
94
94
  }
95
95
  };
96
96
 
97
+ var _default = main;
97
98
  exports.default = _default;
98
99
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/main/index.ts"],"names":["cursorCache","createMakeCursors","createResourceResolver","getters","resolver","result","resultsPerPage","source","args","context","info","makeGroupCursor","makeIDCursor","resourceResolver","groupCursor","cursorError","edges","errors","nodes","pageInfo","hasNextPage","hasPreviousPage","totalCount","has","e"],"mappings":";;;;;;;;;;;AAEA;;AACA;;AACA;;AACA;;eAEe,CAAC;AACdA,EAAAA,WADc;AAEdC,EAAAA,iBAFc;AAGdC,EAAAA,sBAHc;AAIdC,EAAAA,OAJc;AAKdC,EAAAA,QAAQ,GAAGC,MAAM,IAAIA,MALP;AAMdC,EAAAA;AANc,CAAD,KAOsB,OACnCC,MADmC,EAEnCC,IAFmC,EAGnCC,OAHmC,EAInCC,IAJmC,KAKX;AACxB,MAAI;AACF,UAAM;AAAEC,MAAAA,eAAF;AAAmBC,MAAAA;AAAnB,QAAoCX,iBAAiB,CAACM,MAAD,EAASC,IAAT,EAAeC,OAAf,EAAwBC,IAAxB,CAA3D;AACA,UAAMG,gBAAgB,GAAGX,sBAAsB,CAACK,MAAD,EAASC,IAAT,EAAeC,OAAf,EAAwBC,IAAxB,CAA/C;AACA,UAAMI,WAAW,GAAGH,eAAe,EAAnC;;AAEA,QAAI,+BAAiBH,IAAjB,CAAJ,EAA4B;AAC1B,YAAMO,WAAW,GAAG,MAAM,6BAAeP,IAAf,EAAqBE,IAArB,EAA2B;AACnDV,QAAAA,WADmD;AAEnDc,QAAAA,WAFmD;AAGnDR,QAAAA;AAHmD,OAA3B,CAA1B;;AAMA,UAAIS,WAAJ,EAAiB;AACf,eAAOX,QAAQ,CAAC;AACdY,UAAAA,KAAK,EAAE,EADO;AAEdC,UAAAA,MAAM,EAAE,CAACF,WAAD,CAFM;AAGdG,UAAAA,KAAK,EAAE,EAHO;AAIdC,UAAAA,QAAQ,EAAE;AACRC,YAAAA,WAAW,EAAE,KADL;AAERC,YAAAA,eAAe,EAAE;AAFT,WAJI;AAQdC,UAAAA,UAAU,EAAE;AARE,SAAD,CAAf;AAUD;;AAED,aAAOlB,QAAQ,CACb,MAAM,gCAAkBI,IAAlB,EAAwB;AAC5BR,QAAAA,WAD4B;AAE5BG,QAAAA,OAF4B;AAG5BW,QAAAA,WAH4B;AAI5BF,QAAAA,YAJ4B;AAK5BC,QAAAA,gBAL4B;AAM5BP,QAAAA;AAN4B,OAAxB,CADO,CAAf;AAUD;;AAED,QAAI,MAAMN,WAAW,CAACuB,GAAZ,CAAiB,GAAET,WAAY,WAA/B,CAAV,EAAsD;AACpD,aAAOV,QAAQ,CACb,MAAM,gCAAkBI,IAAlB,EAAwB;AAC5BR,QAAAA,WAD4B;AAE5BG,QAAAA,OAF4B;AAG5BW,QAAAA,WAH4B;AAI5BF,QAAAA,YAJ4B;AAK5BC,QAAAA,gBAL4B;AAM5BP,QAAAA;AAN4B,OAAxB,CADO,CAAf;AAUD;;AAED,UAAM,mCAAqB,CAAC,CAAD,CAArB,EAA0B;AAC9BN,MAAAA,WAD8B;AAE9BG,MAAAA,OAF8B;AAG9BW,MAAAA,WAH8B;AAI9BF,MAAAA,YAJ8B;AAK9BC,MAAAA;AAL8B,KAA1B,CAAN;AAQA,WAAOT,QAAQ,CACb,MAAM,gCAAkBI,IAAlB,EAAwB;AAC5BR,MAAAA,WAD4B;AAE5BG,MAAAA,OAF4B;AAG5BW,MAAAA,WAH4B;AAI5BF,MAAAA,YAJ4B;AAK5BC,MAAAA,gBAL4B;AAM5BP,MAAAA;AAN4B,KAAxB,CADO,CAAf;AAUD,GApED,CAoEE,OAAOkB,CAAP,EAAU;AACV,UAAMA,CAAN;AACD;AACF,C","sourcesContent":["import { GraphQLResolveInfo } from \"graphql\";\nimport { Connection, ConnectionInputOptions, ConnectionResolverUserOptions, PlainObject } from \"../defs\";\nimport isCursorSupplied from \"../helpers/isCursorSupplied\";\nimport requestAndCachePages from \"../helpers/requestAndCachePages\";\nimport resolveConnection from \"../helpers/resolveConnection\";\nimport validateCursor from \"../helpers/validateCursor\";\n\nexport default ({\n cursorCache,\n createMakeCursors,\n createResourceResolver,\n getters,\n resolver = result => result,\n resultsPerPage,\n}: ConnectionResolverUserOptions) => async (\n source: PlainObject,\n args: PlainObject & ConnectionInputOptions,\n context: PlainObject,\n info: GraphQLResolveInfo,\n): Promise<Connection> => {\n try {\n const { makeGroupCursor, makeIDCursor } = createMakeCursors(source, args, context, info);\n const resourceResolver = createResourceResolver(source, args, context, info);\n const groupCursor = makeGroupCursor();\n\n if (isCursorSupplied(args)) {\n const cursorError = await validateCursor(args, info, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (cursorError) {\n return resolver({\n edges: [],\n errors: [cursorError],\n nodes: [],\n pageInfo: {\n hasNextPage: false,\n hasPreviousPage: false,\n },\n totalCount: 0,\n });\n }\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n if (await cursorCache.has(`${groupCursor}-metadata`)) {\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n await requestAndCachePages([1], {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n } catch (e) {\n throw e;\n }\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../../src/main/index.ts"],"names":["main","cursorCache","createMakeCursors","createResourceResolver","getters","resolver","result","resultsPerPage","source","args","context","info","makeGroupCursor","makeIDCursor","resourceResolver","groupCursor","cursorError","edges","errors","nodes","pageInfo","hasNextPage","hasPreviousPage","totalCount","has","e"],"mappings":";;;;;;;;;;;AAEA;;AACA;;AACA;;AACA;;AAEA,MAAMA,IAAI,GAAG,CAMX;AACAC,EAAAA,WADA;AAEAC,EAAAA,iBAFA;AAGAC,EAAAA,sBAHA;AAIAC,EAAAA,OAJA;AAKAC,EAAAA,QAAQ,GAAGC,MAAM,IAAIA,MALrB;AAMAC,EAAAA;AANA,CANW,KAamE,OAC9EC,MAD8E,EAE9EC,IAF8E,EAG9EC,OAH8E,EAI9EC,IAJ8E,KAKtD;AACxB,MAAI;AACF,UAAM;AAAEC,MAAAA,eAAF;AAAmBC,MAAAA;AAAnB,QAAoCX,iBAAiB,CAACM,MAAD,EAASC,IAAT,EAAeC,OAAf,EAAwBC,IAAxB,CAA3D;AACA,UAAMG,gBAAgB,GAAGX,sBAAsB,CAACK,MAAD,EAASC,IAAT,EAAeC,OAAf,EAAwBC,IAAxB,CAA/C;AACA,UAAMI,WAAW,GAAGH,eAAe,EAAnC;;AAEA,QAAI,+BAAiBH,IAAjB,CAAJ,EAA4B;AAC1B,YAAMO,WAAW,GAAG,MAAM,6BAAeP,IAAf,EAAqBE,IAArB,EAA2B;AACnDV,QAAAA,WADmD;AAEnDc,QAAAA,WAFmD;AAGnDR,QAAAA;AAHmD,OAA3B,CAA1B;;AAMA,UAAIS,WAAJ,EAAiB;AACf,eAAOX,QAAQ,CAAC;AACdY,UAAAA,KAAK,EAAE,EADO;AAEdC,UAAAA,MAAM,EAAE,CAACF,WAAD,CAFM;AAGdG,UAAAA,KAAK,EAAE,EAHO;AAIdC,UAAAA,QAAQ,EAAE;AACRC,YAAAA,WAAW,EAAE,KADL;AAERC,YAAAA,eAAe,EAAE;AAFT,WAJI;AAQdC,UAAAA,UAAU,EAAE;AARE,SAAD,CAAf;AAUD;;AAED,aAAOlB,QAAQ,CACb,MAAM,gCAAkBI,IAAlB,EAAwB;AAC5BR,QAAAA,WAD4B;AAE5BG,QAAAA,OAF4B;AAG5BW,QAAAA,WAH4B;AAI5BF,QAAAA,YAJ4B;AAK5BC,QAAAA,gBAL4B;AAM5BP,QAAAA;AAN4B,OAAxB,CADO,CAAf;AAUD;;AAED,QAAI,MAAMN,WAAW,CAACuB,GAAZ,CAAiB,GAAET,WAAY,WAA/B,CAAV,EAAsD;AACpD,aAAOV,QAAQ,CACb,MAAM,gCAAkBI,IAAlB,EAAwB;AAC5BR,QAAAA,WAD4B;AAE5BG,QAAAA,OAF4B;AAG5BW,QAAAA,WAH4B;AAI5BF,QAAAA,YAJ4B;AAK5BC,QAAAA,gBAL4B;AAM5BP,QAAAA;AAN4B,OAAxB,CADO,CAAf;AAUD;;AAED,UAAM,mCAA6C,CAAC,CAAD,CAA7C,EAAkD;AACtDN,MAAAA,WADsD;AAEtDG,MAAAA,OAFsD;AAGtDW,MAAAA,WAHsD;AAItDF,MAAAA,YAJsD;AAKtDC,MAAAA;AALsD,KAAlD,CAAN;AAQA,WAAOT,QAAQ,CACb,MAAM,gCAAkBI,IAAlB,EAAwB;AAC5BR,MAAAA,WAD4B;AAE5BG,MAAAA,OAF4B;AAG5BW,MAAAA,WAH4B;AAI5BF,MAAAA,YAJ4B;AAK5BC,MAAAA,gBAL4B;AAM5BP,MAAAA;AAN4B,KAAxB,CADO,CAAf;AAUD,GApED,CAoEE,OAAOkB,CAAP,EAAU;AACV,UAAMA,CAAN;AACD;AACF,CA1FD;;eA4FezB,I","sourcesContent":["import { GraphQLResolveInfo } from \"graphql\";\nimport { Connection, ConnectionInputOptions, ConnectionResolverUserOptions, Node, PlainObject } from \"../defs\";\nimport isCursorSupplied from \"../helpers/isCursorSupplied\";\nimport requestAndCachePages from \"../helpers/requestAndCachePages\";\nimport resolveConnection from \"../helpers/resolveConnection\";\nimport validateCursor from \"../helpers/validateCursor\";\n\nconst main = <\n Source extends PlainObject | undefined,\n Args extends PlainObject,\n Ctx extends PlainObject,\n Resource extends PlainObject,\n ResourceNode extends Node\n>({\n cursorCache,\n createMakeCursors,\n createResourceResolver,\n getters,\n resolver = result => result,\n resultsPerPage,\n}: ConnectionResolverUserOptions<Source, Args, Ctx, Resource, ResourceNode>) => async (\n source: Source,\n args: Args & ConnectionInputOptions,\n context: Ctx,\n info: GraphQLResolveInfo,\n): Promise<Connection> => {\n try {\n const { makeGroupCursor, makeIDCursor } = createMakeCursors(source, args, context, info);\n const resourceResolver = createResourceResolver(source, args, context, info);\n const groupCursor = makeGroupCursor();\n\n if (isCursorSupplied(args)) {\n const cursorError = await validateCursor(args, info, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (cursorError) {\n return resolver({\n edges: [],\n errors: [cursorError],\n nodes: [],\n pageInfo: {\n hasNextPage: false,\n hasPreviousPage: false,\n },\n totalCount: 0,\n });\n }\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n if (await cursorCache.has(`${groupCursor}-metadata`)) {\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n }\n\n await requestAndCachePages<Resource, ResourceNode>([1], {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n return resolver(\n await resolveConnection(args, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }),\n );\n } catch (e) {\n throw e;\n }\n};\n\nexport default main;\n"],"file":"index.js"}
@@ -13,7 +13,8 @@ export default (async ({
13
13
  }) => {
14
14
  const cursorCache = new Cachemap({
15
15
  name: "cursorCache",
16
- store: map()
16
+ store: map(),
17
+ type: "someType"
17
18
  });
18
19
  const headers = new Headers({
19
20
  "Cache-Control": "max-age=60"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__testUtils__/generateCursorCache.ts"],"names":["Cachemap","map","encode","cacheCursors","generatePages","group","pageRanges","resultsPerPage","totalPages","totalResults","cursorCache","name","store","headers","Headers","length","pages","Promise","all","page","isLastPage","resultsOnCurrentPage","remainder","edges","Array","from","_v","i","index","id","cursor","node","set","cacheHeaders","cacheControl","get","undefined"],"mappings":";AAAA,OAAOA,QAAP,MAAqB,gBAArB;AACA,OAAOC,GAAP,MAAgB,eAAhB;AACA,SAASC,MAAT,QAAuB,WAAvB;AACA,OAAOC,YAAP,MAAyB,yBAAzB;AACA,OAAOC,aAAP,MAA0B,iBAA1B;AAUA,gBAAe,OAAO;AAAEC,EAAAA,KAAF;AAASC,EAAAA,UAAU,GAAG,EAAtB;AAA0BC,EAAAA,cAA1B;AAA0CC,EAAAA,UAA1C;AAAsDC,EAAAA;AAAtD,CAAP,KAAwF;AACrG,QAAMC,WAAW,GAAG,IAAIV,QAAJ,CAAa;AAC/BW,IAAAA,IAAI,EAAE,aADyB;AAE/BC,IAAAA,KAAK,EAAEX,GAAG;AAFqB,GAAb,CAApB;AAKA,QAAMY,OAAO,GAAG,IAAIC,OAAJ,CAAY;AAAE,qBAAiB;AAAnB,GAAZ,CAAhB;;AAEA,MAAIR,UAAU,CAACS,MAAX,IAAqBR,cAAzB,EAAyC;AACvC,UAAMS,KAAK,GAAGZ,aAAa,CAACE,UAAD,CAA3B;AAEA,UAAMW,OAAO,CAACC,GAAR,CACJF,KAAK,CAACf,GAAN,CAAU,MAAMkB,IAAN,IAAc;AACtB,YAAMC,UAAU,GAAGD,IAAI,KAAKH,KAAK,CAACA,KAAK,CAACD,MAAN,GAAe,CAAhB,CAAjC;AACA,UAAIM,oBAAJ;;AAEA,UAAID,UAAJ,EAAgB;AACd,cAAME,SAAS,GAAGb,YAAY,GAAGF,cAAjC;AACAc,QAAAA,oBAAoB,GAAGC,SAAS,KAAK,CAAd,GAAkBf,cAAlB,GAAmCe,SAA1D;AACD,OAHD,MAGO;AACLD,QAAAA,oBAAoB,GAAGd,cAAvB;AACD;;AAED,YAAMgB,KAAK,GAAGC,KAAK,CAACC,IAAN,CAAW;AAAEV,QAAAA,MAAM,EAAEM;AAAV,OAAX,EAA6C,CAACK,EAAD,EAAKC,CAAL,KAAWA,CAAxD,EAA2D1B,GAA3D,CAA+D2B,KAAK,IAAI;AACpF,cAAMC,EAAE,GAAG3B,MAAM,CAAE,GAAE0B,KAAM,KAAIT,IAAK,EAAnB,CAAjB;AACA,eAAO;AAAEW,UAAAA,MAAM,EAAG,GAAED,EAAG,KAAIxB,KAAM,EAA1B;AAA6B0B,UAAAA,IAAI,EAAE;AAAEF,YAAAA;AAAF;AAAnC,SAAP;AACD,OAHa,CAAd;AAKA,YAAM1B,YAAY,CAACO,WAAD,EAAc;AAAEa,QAAAA,KAAF;AAASlB,QAAAA,KAAT;AAAgBQ,QAAAA,OAAhB;AAAyBM,QAAAA,IAAzB;AAA+BX,QAAAA,UAA/B;AAA2CC,QAAAA;AAA3C,OAAd,CAAlB;AACD,KAjBD,CADI,CAAN;AAoBD,GAvBD,MAuBO;AAAA;;AACL,UAAMC,WAAW,CAACsB,GAAZ,CACH,GAAE3B,KAAM,WADL,EAEJ;AAAEG,MAAAA,UAAF;AAAcC,MAAAA;AAAd,KAFI,EAGJ;AAAEwB,MAAAA,YAAY,EAAE;AAAEC,QAAAA,YAAY,kBAAErB,OAAO,CAACsB,GAAR,CAAY,eAAZ,CAAF,uDAAkCC;AAAhD;AAAhB,KAHI,CAAN;AAKD;;AAED,SAAO1B,WAAP;AACD,CAxCD","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport map from \"@cachemap/map\";\nimport { encode } from \"js-base64\";\nimport cacheCursors from \"../helpers/cacheCursors\";\nimport generatePages from \"./generatePages\";\n\nexport type Params = {\n group: string;\n pageRanges?: string[];\n resultsPerPage?: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport default async ({ group, pageRanges = [], resultsPerPage, totalPages, totalResults }: Params) => {\n const cursorCache = new Cachemap({\n name: \"cursorCache\",\n store: map(),\n });\n\n const headers = new Headers({ \"Cache-Control\": \"max-age=60\" });\n\n if (pageRanges.length && resultsPerPage) {\n const pages = generatePages(pageRanges);\n\n await Promise.all(\n pages.map(async page => {\n const isLastPage = page === pages[pages.length - 1];\n let resultsOnCurrentPage: number;\n\n if (isLastPage) {\n const remainder = totalResults % resultsPerPage;\n resultsOnCurrentPage = remainder === 0 ? resultsPerPage : remainder;\n } else {\n resultsOnCurrentPage = resultsPerPage;\n }\n\n const edges = Array.from({ length: resultsOnCurrentPage }, (_v, i) => i).map(index => {\n const id = encode(`${index}::${page}`);\n return { cursor: `${id}::${group}`, node: { id } };\n });\n\n await cacheCursors(cursorCache, { edges, group, headers, page, totalPages, totalResults });\n }),\n );\n } else {\n await cursorCache.set(\n `${group}-metadata`,\n { totalPages, totalResults },\n { cacheHeaders: { cacheControl: headers.get(\"cache-control\") ?? undefined } },\n );\n }\n\n return cursorCache;\n};\n"],"file":"generateCursorCache.js"}
1
+ {"version":3,"sources":["../../../src/__testUtils__/generateCursorCache.ts"],"names":["Cachemap","map","encode","cacheCursors","generatePages","group","pageRanges","resultsPerPage","totalPages","totalResults","cursorCache","name","store","type","headers","Headers","length","pages","Promise","all","page","isLastPage","resultsOnCurrentPage","remainder","edges","Array","from","_v","i","index","id","cursor","node","set","cacheHeaders","cacheControl","get","undefined"],"mappings":";AAAA,OAAOA,QAAP,MAAqB,gBAArB;AACA,OAAOC,GAAP,MAAgB,eAAhB;AACA,SAASC,MAAT,QAAuB,WAAvB;AACA,OAAOC,YAAP,MAAyB,yBAAzB;AACA,OAAOC,aAAP,MAA0B,iBAA1B;AAUA,gBAAe,OAAO;AAAEC,EAAAA,KAAF;AAASC,EAAAA,UAAU,GAAG,EAAtB;AAA0BC,EAAAA,cAA1B;AAA0CC,EAAAA,UAA1C;AAAsDC,EAAAA;AAAtD,CAAP,KAAwF;AACrG,QAAMC,WAAW,GAAG,IAAIV,QAAJ,CAAa;AAC/BW,IAAAA,IAAI,EAAE,aADyB;AAE/BC,IAAAA,KAAK,EAAEX,GAAG,EAFqB;AAG/BY,IAAAA,IAAI,EAAE;AAHyB,GAAb,CAApB;AAMA,QAAMC,OAAO,GAAG,IAAIC,OAAJ,CAAY;AAAE,qBAAiB;AAAnB,GAAZ,CAAhB;;AAEA,MAAIT,UAAU,CAACU,MAAX,IAAqBT,cAAzB,EAAyC;AACvC,UAAMU,KAAK,GAAGb,aAAa,CAACE,UAAD,CAA3B;AAEA,UAAMY,OAAO,CAACC,GAAR,CACJF,KAAK,CAAChB,GAAN,CAAU,MAAMmB,IAAN,IAAc;AACtB,YAAMC,UAAU,GAAGD,IAAI,KAAKH,KAAK,CAACA,KAAK,CAACD,MAAN,GAAe,CAAhB,CAAjC;AACA,UAAIM,oBAAJ;;AAEA,UAAID,UAAJ,EAAgB;AACd,cAAME,SAAS,GAAGd,YAAY,GAAGF,cAAjC;AACAe,QAAAA,oBAAoB,GAAGC,SAAS,KAAK,CAAd,GAAkBhB,cAAlB,GAAmCgB,SAA1D;AACD,OAHD,MAGO;AACLD,QAAAA,oBAAoB,GAAGf,cAAvB;AACD;;AAED,YAAMiB,KAAK,GAAGC,KAAK,CAACC,IAAN,CAAW;AAAEV,QAAAA,MAAM,EAAEM;AAAV,OAAX,EAA6C,CAACK,EAAD,EAAKC,CAAL,KAAWA,CAAxD,EAA2D3B,GAA3D,CAA+D4B,KAAK,IAAI;AACpF,cAAMC,EAAE,GAAG5B,MAAM,CAAE,GAAE2B,KAAM,KAAIT,IAAK,EAAnB,CAAjB;AACA,eAAO;AAAEW,UAAAA,MAAM,EAAG,GAAED,EAAG,KAAIzB,KAAM,EAA1B;AAA6B2B,UAAAA,IAAI,EAAE;AAAEF,YAAAA;AAAF;AAAnC,SAAP;AACD,OAHa,CAAd;AAKA,YAAM3B,YAAY,CAACO,WAAD,EAAc;AAAEc,QAAAA,KAAF;AAASnB,QAAAA,KAAT;AAAgBS,QAAAA,OAAhB;AAAyBM,QAAAA,IAAzB;AAA+BZ,QAAAA,UAA/B;AAA2CC,QAAAA;AAA3C,OAAd,CAAlB;AACD,KAjBD,CADI,CAAN;AAoBD,GAvBD,MAuBO;AAAA;;AACL,UAAMC,WAAW,CAACuB,GAAZ,CACH,GAAE5B,KAAM,WADL,EAEJ;AAAEG,MAAAA,UAAF;AAAcC,MAAAA;AAAd,KAFI,EAGJ;AAAEyB,MAAAA,YAAY,EAAE;AAAEC,QAAAA,YAAY,kBAAErB,OAAO,CAACsB,GAAR,CAAY,eAAZ,CAAF,uDAAkCC;AAAhD;AAAhB,KAHI,CAAN;AAKD;;AAED,SAAO3B,WAAP;AACD,CAzCD","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport map from \"@cachemap/map\";\nimport { encode } from \"js-base64\";\nimport cacheCursors from \"../helpers/cacheCursors\";\nimport generatePages from \"./generatePages\";\n\nexport type Params = {\n group: string;\n pageRanges?: string[];\n resultsPerPage?: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport default async ({ group, pageRanges = [], resultsPerPage, totalPages, totalResults }: Params) => {\n const cursorCache = new Cachemap({\n name: \"cursorCache\",\n store: map(),\n type: \"someType\",\n });\n\n const headers = new Headers({ \"Cache-Control\": \"max-age=60\" });\n\n if (pageRanges.length && resultsPerPage) {\n const pages = generatePages(pageRanges);\n\n await Promise.all(\n pages.map(async page => {\n const isLastPage = page === pages[pages.length - 1];\n let resultsOnCurrentPage: number;\n\n if (isLastPage) {\n const remainder = totalResults % resultsPerPage;\n resultsOnCurrentPage = remainder === 0 ? resultsPerPage : remainder;\n } else {\n resultsOnCurrentPage = resultsPerPage;\n }\n\n const edges = Array.from({ length: resultsOnCurrentPage }, (_v, i) => i).map(index => {\n const id = encode(`${index}::${page}`);\n return { cursor: `${id}::${group}`, node: { id } };\n });\n\n await cacheCursors(cursorCache, { edges, group, headers, page, totalPages, totalResults });\n }),\n );\n } else {\n await cursorCache.set(\n `${group}-metadata`,\n { totalPages, totalResults },\n { cacheHeaders: { cacheControl: headers.get(\"cache-control\") ?? undefined } },\n );\n }\n\n return cursorCache;\n};\n"],"file":"generateCursorCache.js"}
@@ -1,7 +1,8 @@
1
1
  import "core-js/modules/es.promise.js";
2
2
  import cacheCursors from "./cacheCursors";
3
3
  import makeEdges from "./makeEdges";
4
- export default (async (pages, {
4
+
5
+ const requestAndCachePages = async (pages, {
5
6
  cursorCache,
6
7
  getters,
7
8
  groupCursor,
@@ -47,5 +48,7 @@ export default (async (pages, {
47
48
  cachedEdges,
48
49
  errors
49
50
  };
50
- });
51
+ };
52
+
53
+ export default requestAndCachePages;
51
54
  //# sourceMappingURL=requestAndCachePages.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/helpers/requestAndCachePages.ts"],"names":["cacheCursors","makeEdges","pages","cursorCache","getters","groupCursor","makeIDCursor","resourceResolver","errors","cachedEdges","Promise","all","map","page","data","pageResultData","pageResultErrors","headers","pageResultHeaders","length","edges","nodes","node","id","group","totalPages","totalResults","pageNumber","push"],"mappings":";AAEA,OAAOA,YAAP,MAAyB,gBAAzB;AACA,OAAOC,SAAP,MAAsB,aAAtB;AAUA,gBAAe,OACbC,KADa,EAEb;AAAEC,EAAAA,WAAF;AAAeC,EAAAA,OAAf;AAAwBC,EAAAA,WAAxB;AAAqCC,EAAAA,YAArC;AAAmDC,EAAAA;AAAnD,CAFa,KAGV;AACH,QAAMC,MAAe,GAAG,EAAxB;AAEA,QAAMC,WAAW,GAAG,MAAMC,OAAO,CAACC,GAAR,CACxBT,KAAK,CAACU,GAAN,CAAU,MAAMC,IAAN,IAAc;AACtB,UAAM;AAAEC,MAAAA,IAAI,EAAEC,cAAR;AAAwBP,MAAAA,MAAM,EAAEQ,gBAAhC;AAAkDC,MAAAA,OAAO,EAAEC;AAA3D,QAAiF,MAAMX,gBAAgB,CAAC;AAC5GM,MAAAA;AAD4G,KAAD,CAA7G;;AAIA,QAAIE,cAAc,IAAI,EAACC,gBAAD,aAACA,gBAAD,eAACA,gBAAgB,CAAEG,MAAnB,CAAtB,EAAiD;AAC/C,YAAMC,KAAK,GAAGnB,SAAS,CAACG,OAAO,CAACiB,KAAR,CAAcN,cAAd,CAAD,EAAgCO,IAAI,IAAIhB,YAAY,CAACgB,IAAI,CAACC,EAAN,CAApD,CAAvB;AAEA,YAAMvB,YAAY,CAACG,WAAD,EAAc;AAC9BiB,QAAAA,KAD8B;AAE9BI,QAAAA,KAAK,EAAEnB,WAFuB;AAG9BY,QAAAA,OAAO,EAAEC,iBAHqB;AAI9BL,QAAAA,IAJ8B;AAK9BY,QAAAA,UAAU,EAAErB,OAAO,CAACqB,UAAR,CAAmBV,cAAnB,CALkB;AAM9BW,QAAAA,YAAY,EAAEtB,OAAO,CAACsB,YAAR,CAAqBX,cAArB;AANgB,OAAd,CAAlB;AASA,aAAO;AAAEK,QAAAA,KAAF;AAASO,QAAAA,UAAU,EAAEd;AAArB,OAAP;AACD;;AAED,QAAIG,gBAAJ,aAAIA,gBAAJ,eAAIA,gBAAgB,CAAEG,MAAtB,EAA8B;AAC5BX,MAAAA,MAAM,CAACoB,IAAP,CAAY,GAAGZ,gBAAf;AACD;;AAED,WAAO;AAAEI,MAAAA,KAAK,EAAE,EAAT;AAAaO,MAAAA,UAAU,EAAEd;AAAzB,KAAP;AACD,GAzBD,CADwB,CAA1B;AA6BA,SAAO;AAAEJ,IAAAA,WAAF;AAAeD,IAAAA;AAAf,GAAP;AACD,CApCD","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport { Getters, ResourceResolver } from \"../defs\";\nimport cacheCursors from \"./cacheCursors\";\nimport makeEdges from \"./makeEdges\";\n\nexport type Context = {\n cursorCache: Cachemap;\n getters: Getters;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver;\n};\n\nexport default async (\n pages: number[],\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context,\n) => {\n const errors: Error[] = [];\n\n const cachedEdges = await Promise.all(\n pages.map(async page => {\n const { data: pageResultData, errors: pageResultErrors, headers: pageResultHeaders } = await resourceResolver({\n page,\n });\n\n if (pageResultData && !pageResultErrors?.length) {\n const edges = makeEdges(getters.nodes(pageResultData), node => makeIDCursor(node.id));\n\n await cacheCursors(cursorCache, {\n edges,\n group: groupCursor,\n headers: pageResultHeaders,\n page,\n totalPages: getters.totalPages(pageResultData),\n totalResults: getters.totalResults(pageResultData),\n });\n\n return { edges, pageNumber: page };\n }\n\n if (pageResultErrors?.length) {\n errors.push(...pageResultErrors);\n }\n\n return { edges: [], pageNumber: page };\n }),\n );\n\n return { cachedEdges, errors };\n};\n"],"file":"requestAndCachePages.js"}
1
+ {"version":3,"sources":["../../../src/helpers/requestAndCachePages.ts"],"names":["cacheCursors","makeEdges","requestAndCachePages","pages","cursorCache","getters","groupCursor","makeIDCursor","resourceResolver","errors","cachedEdges","Promise","all","map","page","data","pageResultData","pageResultErrors","headers","pageResultHeaders","length","edges","nodes","node","id","group","totalPages","totalResults","pageNumber","push"],"mappings":";AAEA,OAAOA,YAAP,MAAyB,gBAAzB;AACA,OAAOC,SAAP,MAAsB,aAAtB;;AAUA,MAAMC,oBAAoB,GAAG,OAC3BC,KAD2B,EAE3B;AAAEC,EAAAA,WAAF;AAAeC,EAAAA,OAAf;AAAwBC,EAAAA,WAAxB;AAAqCC,EAAAA,YAArC;AAAmDC,EAAAA;AAAnD,CAF2B,KAGxB;AACH,QAAMC,MAAe,GAAG,EAAxB;AAEA,QAAMC,WAAW,GAAG,MAAMC,OAAO,CAACC,GAAR,CACxBT,KAAK,CAACU,GAAN,CAAU,MAAMC,IAAN,IAAc;AACtB,UAAM;AAAEC,MAAAA,IAAI,EAAEC,cAAR;AAAwBP,MAAAA,MAAM,EAAEQ,gBAAhC;AAAkDC,MAAAA,OAAO,EAAEC;AAA3D,QAAiF,MAAMX,gBAAgB,CAAC;AAC5GM,MAAAA;AAD4G,KAAD,CAA7G;;AAIA,QAAIE,cAAc,IAAI,EAACC,gBAAD,aAACA,gBAAD,eAACA,gBAAgB,CAAEG,MAAnB,CAAtB,EAAiD;AAC/C,YAAMC,KAAK,GAAGpB,SAAS,CAACI,OAAO,CAACiB,KAAR,CAAcN,cAAd,CAAD,EAAgCO,IAAI,IAAIhB,YAAY,CAACgB,IAAI,CAACC,EAAN,CAApD,CAAvB;AAEA,YAAMxB,YAAY,CAACI,WAAD,EAAc;AAC9BiB,QAAAA,KAD8B;AAE9BI,QAAAA,KAAK,EAAEnB,WAFuB;AAG9BY,QAAAA,OAAO,EAAEC,iBAHqB;AAI9BL,QAAAA,IAJ8B;AAK9BY,QAAAA,UAAU,EAAErB,OAAO,CAACqB,UAAR,CAAmBV,cAAnB,CALkB;AAM9BW,QAAAA,YAAY,EAAEtB,OAAO,CAACsB,YAAR,CAAqBX,cAArB;AANgB,OAAd,CAAlB;AASA,aAAO;AAAEK,QAAAA,KAAF;AAASO,QAAAA,UAAU,EAAEd;AAArB,OAAP;AACD;;AAED,QAAIG,gBAAJ,aAAIA,gBAAJ,eAAIA,gBAAgB,CAAEG,MAAtB,EAA8B;AAC5BX,MAAAA,MAAM,CAACoB,IAAP,CAAY,GAAGZ,gBAAf;AACD;;AAED,WAAO;AAAEI,MAAAA,KAAK,EAAE,EAAT;AAAaO,MAAAA,UAAU,EAAEd;AAAzB,KAAP;AACD,GAzBD,CADwB,CAA1B;AA6BA,SAAO;AAAEJ,IAAAA,WAAF;AAAeD,IAAAA;AAAf,GAAP;AACD,CApCD;;AAsCA,eAAeP,oBAAf","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport { Getters, Node, PlainObject, ResourceResolver } from \"../defs\";\nimport cacheCursors from \"./cacheCursors\";\nimport makeEdges from \"./makeEdges\";\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Cachemap;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n};\n\nconst requestAndCachePages = async <Resource extends PlainObject, ResourceNode extends Node>(\n pages: number[],\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver }: Context<Resource, ResourceNode>,\n) => {\n const errors: Error[] = [];\n\n const cachedEdges = await Promise.all(\n pages.map(async page => {\n const { data: pageResultData, errors: pageResultErrors, headers: pageResultHeaders } = await resourceResolver({\n page,\n });\n\n if (pageResultData && !pageResultErrors?.length) {\n const edges = makeEdges(getters.nodes(pageResultData), node => makeIDCursor(node.id));\n\n await cacheCursors(cursorCache, {\n edges,\n group: groupCursor,\n headers: pageResultHeaders,\n page,\n totalPages: getters.totalPages(pageResultData),\n totalResults: getters.totalResults(pageResultData),\n });\n\n return { edges, pageNumber: page };\n }\n\n if (pageResultErrors?.length) {\n errors.push(...pageResultErrors);\n }\n\n return { edges: [], pageNumber: page };\n }),\n );\n\n return { cachedEdges, errors };\n};\n\nexport default requestAndCachePages;\n"],"file":"requestAndCachePages.js"}
@@ -6,7 +6,8 @@ import { getEndCursor, getStartCursor } from "./getStartAndEndCursors";
6
6
  import mergeCachedEdges from "./mergeCachedEdges";
7
7
  import requestAndCachePages from "./requestAndCachePages";
8
8
  import retrieveCachedConnection from "./retrieveCachedConnection";
9
- export default (async (args, {
9
+
10
+ const resolveConnection = async (args, {
10
11
  cursorCache,
11
12
  getters,
12
13
  groupCursor,
@@ -71,5 +72,7 @@ export default (async (args, {
71
72
  },
72
73
  totalCount: totalResults
73
74
  };
74
- });
75
+ };
76
+
77
+ export default resolveConnection;
75
78
  //# sourceMappingURL=resolveConnection.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/helpers/resolveConnection.ts"],"names":["extractEdges","extractNodes","getInRangeCachedEdges","getEndCursor","getStartCursor","mergeCachedEdges","requestAndCachePages","retrieveCachedConnection","args","cursorCache","getters","groupCursor","makeIDCursor","resourceResolver","resultsPerPage","cachedEdges","hasNextPage","hasPreviousPage","indexes","missingPages","totalResults","length","edges","errors","nodes","pageInfo","endCursor","startCursor","totalCount","missingCachedEdges","mergedCachedEdges","endIndex","end","startIndex","start"],"mappings":";AAEA,OAAOA,YAAP,MAAyB,gBAAzB;AACA,OAAOC,YAAP,MAAyB,gBAAzB;AACA,OAAOC,qBAAP,MAAkC,yBAAlC;AACA,SAASC,YAAT,EAAuBC,cAAvB,QAA6C,yBAA7C;AACA,OAAOC,gBAAP,MAA6B,oBAA7B;AACA,OAAOC,oBAAP,MAAiC,wBAAjC;AACA,OAAOC,wBAAP,MAAqC,4BAArC;AAWA,gBAAe,OACbC,IADa,EAEb;AAAEC,EAAAA,WAAF;AAAeC,EAAAA,OAAf;AAAwBC,EAAAA,WAAxB;AAAqCC,EAAAA,YAArC;AAAmDC,EAAAA,gBAAnD;AAAqEC,EAAAA;AAArE,CAFa,KAGV;AACH,QAAM;AACJC,IAAAA,WADI;AAEJC,IAAAA,WAFI;AAGJC,IAAAA,eAHI;AAIJC,IAAAA,OAJI;AAKJC,IAAAA,YALI;AAMJC,IAAAA;AANI,MAOF,MAAMb,wBAAwB,CAACC,IAAD,EAAO;AACvCC,IAAAA,WADuC;AAEvCE,IAAAA,WAFuC;AAGvCG,IAAAA;AAHuC,GAAP,CAPlC;;AAaA,MAAI,CAACK,YAAY,CAACE,MAAlB,EAA0B;AACxB,UAAMC,KAAK,GAAGtB,YAAY,CAACe,WAAD,CAA1B;AAEA,WAAO;AACLO,MAAAA,KADK;AAELC,MAAAA,MAAM,EAAE,EAFH;AAGLC,MAAAA,KAAK,EAAEvB,YAAY,CAACqB,KAAD,CAHd;AAILG,MAAAA,QAAQ,EAAE;AACRC,QAAAA,SAAS,EAAEvB,YAAY,CAACY,WAAD,CADf;AAERC,QAAAA,WAFQ;AAGRC,QAAAA,eAHQ;AAIRU,QAAAA,WAAW,EAAEvB,cAAc,CAACW,WAAD;AAJnB,OAJL;AAULa,MAAAA,UAAU,EAAER;AAVP,KAAP;AAYD;;AAED,QAAM;AAAEL,IAAAA,WAAW,EAAEc,kBAAf;AAAmCN,IAAAA;AAAnC,MAA8C,MAAMjB,oBAAoB,CAACa,YAAD,EAAe;AAC3FV,IAAAA,WAD2F;AAE3FC,IAAAA,OAF2F;AAG3FC,IAAAA,WAH2F;AAI3FC,IAAAA,YAJ2F;AAK3FC,IAAAA;AAL2F,GAAf,CAA9E;AAQA,QAAMiB,iBAAiB,GAAG5B,qBAAqB,CAACG,gBAAgB,CAACU,WAAD,EAAcc,kBAAd,CAAjB,EAAoD;AACjGE,IAAAA,QAAQ,EAAEb,OAAO,CAACc,GAD+E;AAEjGlB,IAAAA,cAFiG;AAGjGmB,IAAAA,UAAU,EAAEf,OAAO,CAACgB;AAH6E,GAApD,CAA/C;AAMA,QAAMZ,KAAK,GAAGtB,YAAY,CAAC8B,iBAAD,CAA1B;AAEA,SAAO;AACLR,IAAAA,KADK;AAELC,IAAAA,MAFK;AAGLC,IAAAA,KAAK,EAAEvB,YAAY,CAACqB,KAAD,CAHd;AAILG,IAAAA,QAAQ,EAAE;AACRC,MAAAA,SAAS,EAAEvB,YAAY,CAAC2B,iBAAD,CADf;AAERd,MAAAA,WAFQ;AAGRC,MAAAA,eAHQ;AAIRU,MAAAA,WAAW,EAAEvB,cAAc,CAAC0B,iBAAD;AAJnB,KAJL;AAULF,IAAAA,UAAU,EAAER;AAVP,GAAP;AAYD,CA9DD","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport { ConnectionInputOptions, Getters, PlainObject, ResourceResolver } from \"../defs\";\nimport extractEdges from \"./extractEdges\";\nimport extractNodes from \"./extractNodes\";\nimport getInRangeCachedEdges from \"./getInRangeCachedEdges\";\nimport { getEndCursor, getStartCursor } from \"./getStartAndEndCursors\";\nimport mergeCachedEdges from \"./mergeCachedEdges\";\nimport requestAndCachePages from \"./requestAndCachePages\";\nimport retrieveCachedConnection from \"./retrieveCachedConnection\";\n\nexport type Context = {\n cursorCache: Cachemap;\n getters: Getters;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver;\n resultsPerPage: number;\n};\n\nexport default async (\n args: PlainObject & ConnectionInputOptions,\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver, resultsPerPage }: Context,\n) => {\n const {\n cachedEdges,\n hasNextPage,\n hasPreviousPage,\n indexes,\n missingPages,\n totalResults,\n } = await retrieveCachedConnection(args, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (!missingPages.length) {\n const edges = extractEdges(cachedEdges);\n\n return {\n edges,\n errors: [],\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(cachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(cachedEdges),\n },\n totalCount: totalResults,\n };\n }\n\n const { cachedEdges: missingCachedEdges, errors } = await requestAndCachePages(missingPages, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n const mergedCachedEdges = getInRangeCachedEdges(mergeCachedEdges(cachedEdges, missingCachedEdges), {\n endIndex: indexes.end,\n resultsPerPage,\n startIndex: indexes.start,\n });\n\n const edges = extractEdges(mergedCachedEdges);\n\n return {\n edges,\n errors,\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(mergedCachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(mergedCachedEdges),\n },\n totalCount: totalResults,\n };\n};\n"],"file":"resolveConnection.js"}
1
+ {"version":3,"sources":["../../../src/helpers/resolveConnection.ts"],"names":["extractEdges","extractNodes","getInRangeCachedEdges","getEndCursor","getStartCursor","mergeCachedEdges","requestAndCachePages","retrieveCachedConnection","resolveConnection","args","cursorCache","getters","groupCursor","makeIDCursor","resourceResolver","resultsPerPage","cachedEdges","hasNextPage","hasPreviousPage","indexes","missingPages","totalResults","length","edges","errors","nodes","pageInfo","endCursor","startCursor","totalCount","missingCachedEdges","mergedCachedEdges","endIndex","end","startIndex","start"],"mappings":";AAEA,OAAOA,YAAP,MAAyB,gBAAzB;AACA,OAAOC,YAAP,MAAyB,gBAAzB;AACA,OAAOC,qBAAP,MAAkC,yBAAlC;AACA,SAASC,YAAT,EAAuBC,cAAvB,QAA6C,yBAA7C;AACA,OAAOC,gBAAP,MAA6B,oBAA7B;AACA,OAAOC,oBAAP,MAAiC,wBAAjC;AACA,OAAOC,wBAAP,MAAqC,4BAArC;;AAWA,MAAMC,iBAAiB,GAAG,OACxBC,IADwB,EAExB;AACEC,EAAAA,WADF;AAEEC,EAAAA,OAFF;AAGEC,EAAAA,WAHF;AAIEC,EAAAA,YAJF;AAKEC,EAAAA,gBALF;AAMEC,EAAAA;AANF,CAFwB,KAUrB;AACH,QAAM;AACJC,IAAAA,WADI;AAEJC,IAAAA,WAFI;AAGJC,IAAAA,eAHI;AAIJC,IAAAA,OAJI;AAKJC,IAAAA,YALI;AAMJC,IAAAA;AANI,MAOF,MAAMd,wBAAwB,CAACE,IAAD,EAAO;AACvCC,IAAAA,WADuC;AAEvCE,IAAAA,WAFuC;AAGvCG,IAAAA;AAHuC,GAAP,CAPlC;;AAaA,MAAI,CAACK,YAAY,CAACE,MAAlB,EAA0B;AACxB,UAAMC,KAAK,GAAGvB,YAAY,CAACgB,WAAD,CAA1B;AAEA,WAAO;AACLO,MAAAA,KADK;AAELC,MAAAA,MAAM,EAAE,EAFH;AAGLC,MAAAA,KAAK,EAAExB,YAAY,CAACsB,KAAD,CAHd;AAILG,MAAAA,QAAQ,EAAE;AACRC,QAAAA,SAAS,EAAExB,YAAY,CAACa,WAAD,CADf;AAERC,QAAAA,WAFQ;AAGRC,QAAAA,eAHQ;AAIRU,QAAAA,WAAW,EAAExB,cAAc,CAACY,WAAD;AAJnB,OAJL;AAULa,MAAAA,UAAU,EAAER;AAVP,KAAP;AAYD;;AAED,QAAM;AAAEL,IAAAA,WAAW,EAAEc,kBAAf;AAAmCN,IAAAA;AAAnC,MAA8C,MAAMlB,oBAAoB,CAAyBc,YAAzB,EAAuC;AACnHV,IAAAA,WADmH;AAEnHC,IAAAA,OAFmH;AAGnHC,IAAAA,WAHmH;AAInHC,IAAAA,YAJmH;AAKnHC,IAAAA;AALmH,GAAvC,CAA9E;AAQA,QAAMiB,iBAAiB,GAAG7B,qBAAqB,CAACG,gBAAgB,CAACW,WAAD,EAAcc,kBAAd,CAAjB,EAAoD;AACjGE,IAAAA,QAAQ,EAAEb,OAAO,CAACc,GAD+E;AAEjGlB,IAAAA,cAFiG;AAGjGmB,IAAAA,UAAU,EAAEf,OAAO,CAACgB;AAH6E,GAApD,CAA/C;AAMA,QAAMZ,KAAK,GAAGvB,YAAY,CAAC+B,iBAAD,CAA1B;AAEA,SAAO;AACLR,IAAAA,KADK;AAELC,IAAAA,MAFK;AAGLC,IAAAA,KAAK,EAAExB,YAAY,CAACsB,KAAD,CAHd;AAILG,IAAAA,QAAQ,EAAE;AACRC,MAAAA,SAAS,EAAExB,YAAY,CAAC4B,iBAAD,CADf;AAERd,MAAAA,WAFQ;AAGRC,MAAAA,eAHQ;AAIRU,MAAAA,WAAW,EAAExB,cAAc,CAAC2B,iBAAD;AAJnB,KAJL;AAULF,IAAAA,UAAU,EAAER;AAVP,GAAP;AAYD,CArED;;AAuEA,eAAeb,iBAAf","sourcesContent":["import Cachemap from \"@cachemap/core\";\nimport { ConnectionInputOptions, Getters, Node, PlainObject, ResourceResolver } from \"../defs\";\nimport extractEdges from \"./extractEdges\";\nimport extractNodes from \"./extractNodes\";\nimport getInRangeCachedEdges from \"./getInRangeCachedEdges\";\nimport { getEndCursor, getStartCursor } from \"./getStartAndEndCursors\";\nimport mergeCachedEdges from \"./mergeCachedEdges\";\nimport requestAndCachePages from \"./requestAndCachePages\";\nimport retrieveCachedConnection from \"./retrieveCachedConnection\";\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Cachemap;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n resultsPerPage: number;\n};\n\nconst resolveConnection = async <Resource extends PlainObject, ResourceNode extends Node>(\n args: PlainObject & ConnectionInputOptions,\n {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n resultsPerPage,\n }: Context<Resource, ResourceNode>,\n) => {\n const {\n cachedEdges,\n hasNextPage,\n hasPreviousPage,\n indexes,\n missingPages,\n totalResults,\n } = await retrieveCachedConnection(args, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (!missingPages.length) {\n const edges = extractEdges(cachedEdges);\n\n return {\n edges,\n errors: [],\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(cachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(cachedEdges),\n },\n totalCount: totalResults,\n };\n }\n\n const { cachedEdges: missingCachedEdges, errors } = await requestAndCachePages<Resource, ResourceNode>(missingPages, {\n cursorCache,\n getters,\n groupCursor,\n makeIDCursor,\n resourceResolver,\n });\n\n const mergedCachedEdges = getInRangeCachedEdges(mergeCachedEdges(cachedEdges, missingCachedEdges), {\n endIndex: indexes.end,\n resultsPerPage,\n startIndex: indexes.start,\n });\n\n const edges = extractEdges(mergedCachedEdges);\n\n return {\n edges,\n errors,\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(mergedCachedEdges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(mergedCachedEdges),\n },\n totalCount: totalResults,\n };\n};\n\nexport default resolveConnection;\n"],"file":"resolveConnection.js"}
@@ -3,7 +3,8 @@ import isCursorSupplied from "../helpers/isCursorSupplied";
3
3
  import requestAndCachePages from "../helpers/requestAndCachePages";
4
4
  import resolveConnection from "../helpers/resolveConnection";
5
5
  import validateCursor from "../helpers/validateCursor";
6
- export default (({
6
+
7
+ const main = ({
7
8
  cursorCache,
8
9
  createMakeCursors,
9
10
  createResourceResolver,
@@ -78,5 +79,7 @@ export default (({
78
79
  } catch (e) {
79
80
  throw e;
80
81
  }
81
- });
82
+ };
83
+
84
+ export default main;
82
85
  //# sourceMappingURL=index.js.map