@graphql-box/connection-resolver 5.0.1 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","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/getCurrentPageStartAndEndIndexes.ts","../connection-resolver/src//helpers/getInRangeCachedEdges.ts","../connection-resolver/src//helpers/getStartAndEndCursors.ts","../connection-resolver/src//helpers/mergeCachedEdges.ts","../connection-resolver/src//helpers/getDirection.ts","../connection-resolver/src//helpers/isLastPage.ts","../connection-resolver/src//helpers/getStartAndEndPageNumbers.ts","../connection-resolver/src//helpers/getPageNumbersToRequest.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/isFirstPage.ts","../connection-resolver/src//helpers/getStartAndEndIndexes.ts","../connection-resolver/src//helpers/hasPreviousNextPage.ts","../connection-resolver/src//helpers/retrieveCachedEdgesByPage.ts","../connection-resolver/src//helpers/getCursor.ts","../connection-resolver/src//helpers/makeEntry.ts","../connection-resolver/src//helpers/retrieveEntry.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-es';\n\nconst connectionInputOptions = new Set(['after', 'before', 'first', 'last']);\n\nexport const removeConnectionInputOptions = <O extends object>(args: O) =>\n pickBy(args, (_value, key) => !connectionInputOptions.has(key));\n","import type { PlainObject } from '@graphql-box/core';\nimport { type ConnectionInputOptions } from '../types.ts';\n\nexport const isCursorSupplied = ({ after, before }: PlainObject & ConnectionInputOptions) => !!(after ?? before);\n","import { type Core } from '@cachemap/core';\nimport { type Edge } from '../types.ts';\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 const cacheCursors = async (\n cursorCache: Core,\n { edges, group, headers, page, totalPages, totalResults }: Params\n) => {\n const cacheControl = headers.get('cache-control');\n const options = cacheControl ? { cacheHeaders: { cacheControl } } : undefined;\n\n await Promise.all(\n edges.map(async ({ cursor, node }, index) => cursorCache.set(cursor, { group, index, node, page }, options))\n );\n\n await cursorCache.set(`${group}-metadata`, { totalPages, totalResults }, options);\n};\n","import { type Node } from '../types.ts';\n\nexport const makeEdges = (nodes: Node[], makeCursor: (node: Node) => string) =>\n nodes.map(node => ({ cursor: makeCursor(node), node }));\n","import { type Core } from '@cachemap/core';\nimport type { PlainObject } from '@graphql-box/core';\nimport { type Getters, type Node, type ResourceResolver } from '../types.ts';\nimport { cacheCursors } from './cacheCursors.ts';\nimport { makeEdges } from './makeEdges.ts';\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Core;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n};\n\nexport const 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 {\n data: pageResultData,\n errors: pageResultErrors,\n headers: pageResultHeaders,\n } = 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 { type CachedEdges, type Edge } from '../types.ts';\n\nexport const extractEdges = (cachedEdges: CachedEdges[]) =>\n cachedEdges.reduce<Edge[]>((edges, cachedEdge) => [...edges, ...cachedEdge.edges], []);\n","import { type Edge } from '../types.ts';\n\nexport const extractNodes = (edges: Edge[]) => edges.map(edge => edge.node);\n","import { type Indexes } from '../types.ts';\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 { type CachedEdges, type Indexes } from '../types.ts';\nimport { getCurrentPageEndIndex, getCurrentPageStartIndex } from './getCurrentPageStartAndEndIndexes.ts';\n\nexport type Context = {\n endIndex: Indexes;\n resultsPerPage: number;\n startIndex: Indexes;\n};\n\nexport const getInRangeCachedEdges = (\n cachedEdgesByPage: CachedEdges[],\n { endIndex, resultsPerPage, startIndex }: Context\n) => {\n return cachedEdgesByPage.reduce<CachedEdges[]>((inRange, cachedEdgesPage, index) => {\n const currentPageStartIndex = getCurrentPageStartIndex({ pageIndex: index, startIndex });\n\n const currentPageEndIndex = getCurrentPageEndIndex({\n endIndex,\n pageIndex: index,\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 }, []);\n};\n","import { type Edge } from '../types.ts';\n\nexport const getStartCursor = (edges: Edge[]) => edges[0]?.cursor;\n\nexport const getEndCursor = (edges: Edge[]) => {\n const lastEdge = edges[edges.length - 1];\n return lastEdge?.cursor;\n};\n","import { type CachedEdges } from '../types.ts';\n\nexport const mergeCachedEdges = (cachedEdges: CachedEdges[], missingCachedEdges: CachedEdges[]) =>\n cachedEdges.reduce<CachedEdges[]>((mergedCachedEdges, cachedEdge) => {\n if (cachedEdge.edges.length === 0) {\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 }, []);\n","import type { Direction } from '../types.ts';\n\nexport const getDirection = (last?: number): Direction => (last ? 'backward' : 'forward');\n","export type Params = {\n page: number;\n totalPages: number;\n};\n\nexport const isLastPage = ({ page, totalPages }: Params) => page === totalPages;\n","import { type ConnectionInputOptions, type CursorGroupMetadata, type Indexes } from '../types.ts';\nimport { getDirection } from './getDirection.ts';\nimport { isLastPage } from './isLastPage.ts';\n\nexport type PageNumberContext = {\n endIndex: Indexes;\n page: number;\n startIndex: Indexes;\n};\n\nexport type Context = {\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport const getStartPageNumber = (\n args: ConnectionInputOptions,\n { page, resultsPerPage, startIndex }: Omit<PageNumberContext, 'endIndex'> & Omit<Context, '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 { endIndex, metadata: { totalPages }, page, resultsPerPage }: Omit<PageNumberContext, 'startIndex'> & Context\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 { range } from 'lodash-es';\nimport {\n type ConnectionInputOptions,\n type CursorGroupMetadata,\n type Indexes,\n type PartialCursorCacheEntry,\n} from '../types.ts';\nimport { getEndPageNumber, getStartPageNumber } from './getStartAndEndPageNumbers.ts';\n\nexport type GetPageNumbersToRequestContext = {\n endIndex: Indexes;\n startIndex: Indexes;\n};\n\nexport type Context = {\n entry: PartialCursorCacheEntry;\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport const getPageNumbersToRequest = (\n args: ConnectionInputOptions,\n { endIndex, entry: { page }, metadata, resultsPerPage, startIndex }: GetPageNumbersToRequestContext & Context\n) => {\n const startPageNumber = getStartPageNumber(args, { page, resultsPerPage, startIndex });\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 { type CachedEdges } from '../types.ts';\n\nexport const getPagesMissingFromCache = (cachedEdgesByPage: CachedEdges[]) => {\n return cachedEdgesByPage.reduce<number[]>((missing, cachedEdgesPage) => {\n if (cachedEdgesPage.edges.length === 0) {\n missing.push(cachedEdgesPage.pageNumber);\n }\n\n return missing;\n }, []);\n};\n","import { type ConnectionInputOptions } from '../types.ts';\n\nexport const getCount = ({ first, last }: ConnectionInputOptions) => first ?? last!;\n","export type Params = {\n resultsPerPage: number;\n totalResults: number;\n};\n\nexport const getResultsOnLastPage = ({ resultsPerPage, totalResults }: Params) => {\n const remainder = totalResults % resultsPerPage;\n return remainder === 0 ? resultsPerPage : remainder;\n};\n","import { type Params, getResultsOnLastPage } from './getResultsOnLastPage.ts';\n\nexport const getIndexesOnLastPage = ({ resultsPerPage, totalResults }: Params) =>\n getResultsOnLastPage({ resultsPerPage, totalResults }) - 1;\n","export const isFirstPage = (page: number) => page === 1;\n","import { type ConnectionInputOptions, type CursorGroupMetadata, type PartialCursorCacheEntry } from '../types.ts';\nimport { getCount } from './getCount.ts';\nimport { getDirection } from './getDirection.ts';\nimport { getIndexesOnLastPage } from './getIndexesOnLastPage.ts';\nimport { isFirstPage } from './isFirstPage.ts';\nimport { isLastPage } from './isLastPage.ts';\n\nexport type Context = {\n entry: PartialCursorCacheEntry;\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\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 absoluteStartIndex = index - count;\n\n if (absoluteStartIndex >= 0) {\n return { absolute: absoluteStartIndex, relative: absoluteStartIndex };\n }\n\n const indexesRemainingAfterLastPage = Math.abs(absoluteStartIndex);\n const pagesRemaining = indexesRemainingAfterLastPage / resultsPerPage + 1;\n const remainder = indexesRemainingAfterLastPage % resultsPerPage;\n const relativeStartIndex = remainder === 0 ? 0 : page - pagesRemaining < 0 ? 0 : resultsPerPage - remainder;\n return { absolute: absoluteStartIndex, relative: relativeStartIndex };\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 absoluteEndIndex = index + count;\n const indexesPerPage = resultsPerPage - 1;\n\n if (absoluteEndIndex <= indexesPerPage) {\n return { absolute: absoluteEndIndex, relative: absoluteEndIndex };\n }\n\n const indexesRemainingAfterFirstPage = absoluteEndIndex - indexesPerPage;\n const pagesRemaining = indexesRemainingAfterFirstPage / resultsPerPage;\n const remainder = indexesRemainingAfterFirstPage % resultsPerPage;\n\n const relativeEndIndex =\n remainder === 0 ? indexesPerPage : page + pagesRemaining > totalPages ? indexesOnLastPage : remainder - 1;\n\n return { absolute: absoluteEndIndex, relative: relativeEndIndex };\n })();\n};\n","import { isNumber } from 'lodash-es';\nimport { type CachedEdges, type CursorGroupMetadata, type Indexes } from '../types.ts';\nimport { getIndexesOnLastPage } from './getIndexesOnLastPage.ts';\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 (isNumber(cachedEdgesByPage[0]?.pageNumber) && cachedEdgesByPage[0]?.pageNumber !== 1) || startIndex.relative > 0;\n\nexport const hasNextPage = ({\n cachedEdgesByPage,\n endIndex,\n metadata: { totalPages, totalResults },\n resultsPerPage,\n}: HasNextPageParams) =>\n (isNumber(cachedEdgesByPage[cachedEdgesByPage.length - 1]?.pageNumber) &&\n cachedEdgesByPage[cachedEdgesByPage.length - 1]?.pageNumber !== totalPages) ||\n endIndex.relative < getIndexesOnLastPage({ resultsPerPage, totalResults });\n","import { type Core } from '@cachemap/core';\nimport { type CursorCacheEntry, type Edge } from '../types.ts';\n\nexport type Context = {\n groupCursor: string;\n pageNumber: number;\n};\n\nexport const retrieveCachedEdgesByPage = async (cursorCache: Core, { groupCursor, pageNumber }: Context) => {\n const { entries, metadata } = await cursorCache.export<CursorCacheEntry>({\n filterByValue: [\n { comparator: pageNumber, keyChain: 'page' },\n { comparator: groupCursor, keyChain: 'group' },\n ],\n });\n\n return {\n edges: entries.reduce<Edge[]>((cached, [key, { index, node }]) => {\n if (metadata[index]?.cacheability.checkTTL()) {\n cached[index] = { cursor: key, node };\n }\n\n return cached;\n }, []),\n pageNumber,\n };\n};\n","import { type ConnectionInputOptions } from '../types.ts';\n\nexport const getCursor = ({ after, before }: ConnectionInputOptions) => before ?? after;\n","import { type ConnectionInputOptions, type CursorGroupMetadata } from '../types.ts';\nimport { getDirection } from './getDirection.ts';\nimport { getIndexesOnLastPage } from './getIndexesOnLastPage.ts';\n\nexport type Context = {\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport const makeEntry = (\n args: ConnectionInputOptions,\n { metadata: { totalPages, totalResults }, resultsPerPage }: Context\n) => {\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 type { Core } from '@cachemap/core';\nimport type {\n ConnectionInputOptions,\n CursorCacheEntry,\n CursorGroupMetadata,\n PartialCursorCacheEntry,\n} from '../types.ts';\nimport { getCursor } from './getCursor.ts';\nimport { makeEntry } from './makeEntry.ts';\n\nexport type Context = {\n cursorCache: Core;\n resultsPerPage: number;\n};\n\nexport const retrieveEntry = async (\n args: ConnectionInputOptions,\n metadata: CursorGroupMetadata,\n { cursorCache, resultsPerPage }: Context\n): Promise<PartialCursorCacheEntry> => {\n const cursor = getCursor(args);\n\n if (cursor) {\n const cursorCacheEntry = await cursorCache.get<CursorCacheEntry>(cursor);\n\n if (cursorCacheEntry) {\n return cursorCacheEntry;\n }\n }\n\n return makeEntry(args, { metadata, resultsPerPage });\n};\n","import { type Core } from '@cachemap/core';\nimport { type CachedEdges, type ConnectionInputOptions, type CursorGroupMetadata } from '../types.ts';\nimport { getInRangeCachedEdges } from './getInRangeCachedEdges.ts';\nimport { getPageNumbersToRequest } from './getPageNumbersToRequest.ts';\nimport { getPagesMissingFromCache } from './getPagesMissingFromCache.ts';\nimport { getEndIndex, getStartIndex } from './getStartAndEndIndexes.ts';\nimport { hasNextPage, hasPreviousPage } from './hasPreviousNextPage.ts';\nimport { retrieveCachedEdgesByPage } from './retrieveCachedEdgesByPage.ts';\nimport { retrieveEntry } from './retrieveEntry.ts';\n\nexport type Context = {\n cursorCache: Core;\n groupCursor: string;\n resultsPerPage: number;\n};\n\nexport const retrieveCachedConnection = async (\n args: ConnectionInputOptions,\n { cursorCache, groupCursor, resultsPerPage }: Context\n) => {\n /**\n * At this point the cache will always have metadata because `retrieveCachedConnection`\n * is called from `resolveConnection` and is only called if there is a cursor, either\n * after a direct check or after calling `validateCursor` or `requestAndCachePages`,\n * which check and set the metadata respectively.\n */\n const metadata = (await cursorCache.get<CursorGroupMetadata>(`${groupCursor}-metadata`))!;\n const entry = await retrieveEntry(args, metadata, { cursorCache, 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 for (const pageNumber of pageNumbersToRequest) {\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:\n missingPages.length === 0\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 { type Core } from '@cachemap/core';\nimport type { PlainObject } from '@graphql-box/core';\nimport { type ConnectionInputOptions, type Getters, type Node, type ResourceResolver } from '../types.ts';\nimport { extractEdges } from './extractEdges.ts';\nimport { extractNodes } from './extractNodes.ts';\nimport { getInRangeCachedEdges } from './getInRangeCachedEdges.ts';\nimport { getEndCursor, getStartCursor } from './getStartAndEndCursors.ts';\nimport { mergeCachedEdges } from './mergeCachedEdges.ts';\nimport { requestAndCachePages } from './requestAndCachePages.ts';\nimport { retrieveCachedConnection } from './retrieveCachedConnection.ts';\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Core;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n resultsPerPage: number;\n};\n\nexport const resolveConnection = async <Resource extends PlainObject, ResourceNode extends Node>(\n args: PlainObject & ConnectionInputOptions,\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver, resultsPerPage }: Context<Resource, ResourceNode>\n) => {\n const { cachedEdges, hasNextPage, hasPreviousPage, indexes, missingPages, totalResults } =\n await retrieveCachedConnection(args, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (missingPages.length === 0) {\n const edges = extractEdges(cachedEdges);\n\n return {\n edges,\n errors: [],\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(edges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(edges),\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(edges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(edges),\n },\n totalCount: totalResults,\n };\n};\n","import { type CursorCacheEntry, type Direction } from '../types.ts';\n\nexport type Params = {\n direction: Direction;\n entry: CursorCacheEntry;\n};\n\nexport const isCursorFirst = ({ direction, entry: { index, page } }: Params) =>\n direction === 'backward' && page === 1 && index === 0;\n","import { type CursorCacheEntry, type Direction } from '../types.ts';\nimport { getIndexesOnLastPage } from './getIndexesOnLastPage.ts';\n\nexport type Params = {\n direction: Direction;\n entry: CursorCacheEntry;\n resultsPerPage: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport const isCursorLast = ({ direction, entry: { index, page }, resultsPerPage, totalPages, totalResults }: Params) =>\n direction === 'forward' && page === totalPages && index === getIndexesOnLastPage({ resultsPerPage, totalResults });\n","import { type Core } from '@cachemap/core';\nimport { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport { type ConnectionInputOptions, type CursorCacheEntry, type CursorGroupMetadata } from '../types.ts';\nimport { getCursor } from './getCursor.ts';\nimport { getDirection } from './getDirection.ts';\nimport { isCursorFirst } from './isCursorFirst.ts';\nimport { isCursorLast } from './isCursorLast.ts';\n\nexport type Context = {\n cursorCache: Core;\n groupCursor: string;\n resultsPerPage: number;\n};\n\nexport const validateCursor = 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 { nodes: 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 { nodes: 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 { nodes: 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 { nodes: fieldNodes }\n );\n }\n\n const metadata = await cursorCache.get<CursorGroupMetadata>(`${groupCursor}-metadata`);\n\n if (!metadata) {\n return new GraphQLError('Curser cannot be supplied without previously being provided.', { nodes: fieldNodes });\n }\n\n const cursor = getCursor({ after, before })!;\n const entry = await cursorCache.get<CursorCacheEntry>(cursor);\n\n if (!entry) {\n return new GraphQLError(`The cursor ${cursor} could not be found.`, { nodes: 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.`, {\n nodes: fieldNodes,\n });\n }\n\n if (isCursorFirst({ direction, entry })) {\n return new GraphQLError(`The cursor ${cursor} is the first, you cannot go backward any further.`, {\n nodes: fieldNodes,\n });\n }\n\n return;\n};\n","import type { PlainObject } from '@graphql-box/core';\nimport { type GraphQLResolveInfo } from 'graphql';\nimport { isCursorSupplied } from '../helpers/isCursorSupplied.ts';\nimport { requestAndCachePages } from '../helpers/requestAndCachePages.ts';\nimport { resolveConnection } from '../helpers/resolveConnection.ts';\nimport { validateCursor } from '../helpers/validateCursor.ts';\nimport {\n type Connection,\n type ConnectionInputOptions,\n type ConnectionResolverUserOptions,\n type Node,\n} from '../types.ts';\n\nexport const makeConnectionResolver =\n <\n Source extends PlainObject | undefined,\n Args extends PlainObject,\n Ctx extends PlainObject,\n Resource extends PlainObject,\n ResourceNode extends Node\n >({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resolver = result => result,\n resultsPerPage,\n }: ConnectionResolverUserOptions<Source, Args, Ctx, Resource, ResourceNode>) =>\n async (\n source: Source,\n args: Args & ConnectionInputOptions,\n context: Ctx,\n info: GraphQLResolveInfo\n ): Promise<Connection> => {\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 };\n"],"names":["connectionInputOptions","Set","removeConnectionInputOptions","args","pickBy","_value","key","has","isCursorSupplied","after","before","cacheCursors","cursorCache","edges","group","headers","page","totalPages","totalResults","cacheControl","get","options","cacheHeaders","undefined","Promise","all","map","cursor","node","index","set","makeEdges","nodes","makeCursor","requestAndCachePages","pages","getters","groupCursor","makeIDCursor","resourceResolver","errors","cachedEdges","data","pageResultData","pageResultErrors","pageResultHeaders","length","id","pageNumber","push","extractEdges","reduce","cachedEdge","extractNodes","edge","getCurrentPageStartIndex","pageIndex","startIndex","relative","getCurrentPageEndIndex","endIndex","resultsPerPage","totalCachedPages","getInRangeCachedEdges","cachedEdgesByPage","inRange","cachedEdgesPage","currentPageStartIndex","currentPageEndIndex","slice","getStartCursor","getEndCursor","lastEdge","mergeCachedEdges","missingCachedEdges","mergedCachedEdges","missingCachedEdge","find","missing","getDirection","last","isLastPage","getStartPageNumber","absolute","startPageNumber","Math","ceil","abs","getEndPageNumber","metadata","indexesPerPage","endPageNumber","getPageNumbersToRequest","entry","range","getPagesMissingFromCache","getCount","first","getResultsOnLastPage","remainder","getIndexesOnLastPage","isFirstPage","getStartIndex","count","absoluteStartIndex","indexesRemainingAfterLastPage","pagesRemaining","relativeStartIndex","getEndIndex","indexesOnLastPage","absoluteEndIndex","indexesRemainingAfterFirstPage","relativeEndIndex","hasPreviousPage","isNumber","hasNextPage","retrieveCachedEdgesByPage","entries","export","filterByValue","comparator","keyChain","cached","cacheability","checkTTL","getCursor","makeEntry","retrieveEntry","cursorCacheEntry","retrieveCachedConnection","promises","pageNumbersToRequest","missingPages","indexes","end","start","resolveConnection","pageInfo","endCursor","startCursor","totalCount","isCursorFirst","direction","isCursorLast","validateCursor","fieldNodes","GraphQLError","makeConnectionResolver","createMakeCursors","createResourceResolver","resolver","result","source","context","info","makeGroupCursor","cursorError"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../connection-resolver/src//helpers/removeConnectionInputOptions.ts","../connection-resolver/src//helpers/requestAndCachePages.ts","../connection-resolver/src//helpers/makeEdges.ts","../connection-resolver/src//helpers/cacheCursors.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/getDirection.ts","../connection-resolver/src//helpers/isLastPage.ts","../connection-resolver/src//helpers/getPageNumbersToRequest.ts","../connection-resolver/src//helpers/getStartAndEndPageNumbers.ts","../connection-resolver/src//helpers/getCount.ts","../connection-resolver/src//helpers/getIndexesOnLastPage.ts","../connection-resolver/src//helpers/getResultsOnLastPage.ts","../connection-resolver/src//helpers/hasPreviousNextPage.ts","../connection-resolver/src//helpers/retrieveCachedEdgesByPage.ts","../connection-resolver/src//helpers/getCursor.ts","../connection-resolver/src//helpers/retrieveEntry.ts","../connection-resolver/src//helpers/makeEntry.ts","../connection-resolver/src//helpers/retrieveCachedConnection.ts","../connection-resolver/src//helpers/getStartAndEndIndexes.ts","../connection-resolver/src//helpers/isFirstPage.ts","../connection-resolver/src//helpers/getPagesMissingFromCache.ts","../connection-resolver/src//helpers/resolveConnection.ts","../connection-resolver/src//helpers/mergeCachedEdges.ts","../connection-resolver/src//helpers/validateCursor.ts","../connection-resolver/src//helpers/isCursorLast.ts","../connection-resolver/src//helpers/isCursorFirst.ts","../connection-resolver/src//main/index.ts","../connection-resolver/src//helpers/isCursorSupplied.ts"],"sourcesContent":["import { pickBy } from 'lodash-es';\n\nconst connectionInputOptions = new Set(['after', 'before', 'first', 'last']);\n\nexport const removeConnectionInputOptions = <O extends object>(args: O) =>\n pickBy(args, (_value, key) => !connectionInputOptions.has(key));\n","import { type Core } from '@cachemap/core';\nimport type { PlainObject } from '@graphql-box/core';\nimport { type Getters, type Node, type ResourceResolver } from '../types.ts';\nimport { cacheCursors } from './cacheCursors.ts';\nimport { makeEdges } from './makeEdges.ts';\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Core;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n};\n\nexport const 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 {\n data: pageResultData,\n errors: pageResultErrors,\n headers: pageResultHeaders,\n } = 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 { type Node } from '../types.ts';\n\nexport const makeEdges = (nodes: Node[], makeCursor: (node: Node) => string) =>\n nodes.map(node => ({ cursor: makeCursor(node), node }));\n","import { type Core } from '@cachemap/core';\nimport { type Edge } from '../types.ts';\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 const cacheCursors = async (\n cursorCache: Core,\n { edges, group, headers, page, totalPages, totalResults }: Params\n) => {\n const cacheControl = headers.get('cache-control');\n const options = cacheControl ? { cacheHeaders: { cacheControl } } : undefined;\n\n await Promise.all(\n edges.map(async ({ cursor, node }, index) => cursorCache.set(cursor, { group, index, node, page }, options))\n );\n\n await cursorCache.set(`${group}-metadata`, { totalPages, totalResults }, options);\n};\n","import { type CachedEdges, type Edge } from '../types.ts';\n\nexport const extractEdges = (cachedEdges: CachedEdges[]) =>\n cachedEdges.reduce<Edge[]>((edges, cachedEdge) => [...edges, ...cachedEdge.edges], []);\n","import { type Edge } from '../types.ts';\n\nexport const extractNodes = (edges: Edge[]) => edges.map(edge => edge.node);\n","import { type CachedEdges, type Indexes } from '../types.ts';\nimport { getCurrentPageEndIndex, getCurrentPageStartIndex } from './getCurrentPageStartAndEndIndexes.ts';\n\nexport type Context = {\n endIndex: Indexes;\n resultsPerPage: number;\n startIndex: Indexes;\n};\n\nexport const getInRangeCachedEdges = (\n cachedEdgesByPage: CachedEdges[],\n { endIndex, resultsPerPage, startIndex }: Context\n) => {\n return cachedEdgesByPage.reduce<CachedEdges[]>((inRange, cachedEdgesPage, index) => {\n const currentPageStartIndex = getCurrentPageStartIndex({ pageIndex: index, startIndex });\n\n const currentPageEndIndex = getCurrentPageEndIndex({\n endIndex,\n pageIndex: index,\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 }, []);\n};\n","import { type Indexes } from '../types.ts';\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 { type Edge } from '../types.ts';\n\nexport const getStartCursor = (edges: Edge[]) => edges[0]?.cursor;\n\nexport const getEndCursor = (edges: Edge[]) => {\n const lastEdge = edges[edges.length - 1];\n return lastEdge?.cursor;\n};\n","import type { Direction } from '../types.ts';\n\nexport const getDirection = (last?: number): Direction => (last ? 'backward' : 'forward');\n","export type Params = {\n page: number;\n totalPages: number;\n};\n\nexport const isLastPage = ({ page, totalPages }: Params) => page === totalPages;\n","import { range } from 'lodash-es';\nimport {\n type ConnectionInputOptions,\n type CursorGroupMetadata,\n type Indexes,\n type PartialCursorCacheEntry,\n} from '../types.ts';\nimport { getEndPageNumber, getStartPageNumber } from './getStartAndEndPageNumbers.ts';\n\nexport type GetPageNumbersToRequestContext = {\n endIndex: Indexes;\n startIndex: Indexes;\n};\n\nexport type Context = {\n entry: PartialCursorCacheEntry;\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport const getPageNumbersToRequest = (\n args: ConnectionInputOptions,\n { endIndex, entry: { page }, metadata, resultsPerPage, startIndex }: GetPageNumbersToRequestContext & Context\n) => {\n const startPageNumber = getStartPageNumber(args, { page, resultsPerPage, startIndex });\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 { type ConnectionInputOptions, type CursorGroupMetadata, type Indexes } from '../types.ts';\nimport { getDirection } from './getDirection.ts';\nimport { isLastPage } from './isLastPage.ts';\n\nexport type PageNumberContext = {\n endIndex: Indexes;\n page: number;\n startIndex: Indexes;\n};\n\nexport type Context = {\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport const getStartPageNumber = (\n args: ConnectionInputOptions,\n { page, resultsPerPage, startIndex }: Omit<PageNumberContext, 'endIndex'> & Omit<Context, '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 { endIndex, metadata: { totalPages }, page, resultsPerPage }: Omit<PageNumberContext, 'startIndex'> & Context\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 { type ConnectionInputOptions } from '../types.ts';\n\nexport const getCount = ({ first, last }: ConnectionInputOptions) => first ?? last!;\n","import { type Params, getResultsOnLastPage } from './getResultsOnLastPage.ts';\n\nexport const getIndexesOnLastPage = ({ resultsPerPage, totalResults }: Params) =>\n getResultsOnLastPage({ resultsPerPage, totalResults }) - 1;\n","export type Params = {\n resultsPerPage: number;\n totalResults: number;\n};\n\nexport const getResultsOnLastPage = ({ resultsPerPage, totalResults }: Params) => {\n const remainder = totalResults % resultsPerPage;\n return remainder === 0 ? resultsPerPage : remainder;\n};\n","import { isNumber } from 'lodash-es';\nimport { type CachedEdges, type CursorGroupMetadata, type Indexes } from '../types.ts';\nimport { getIndexesOnLastPage } from './getIndexesOnLastPage.ts';\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 (isNumber(cachedEdgesByPage[0]?.pageNumber) && cachedEdgesByPage[0]?.pageNumber !== 1) || startIndex.relative > 0;\n\nexport const hasNextPage = ({\n cachedEdgesByPage,\n endIndex,\n metadata: { totalPages, totalResults },\n resultsPerPage,\n}: HasNextPageParams) =>\n (isNumber(cachedEdgesByPage[cachedEdgesByPage.length - 1]?.pageNumber) &&\n cachedEdgesByPage[cachedEdgesByPage.length - 1]?.pageNumber !== totalPages) ||\n endIndex.relative < getIndexesOnLastPage({ resultsPerPage, totalResults });\n","import { type Core } from '@cachemap/core';\nimport { type CursorCacheEntry, type Edge } from '../types.ts';\n\nexport type Context = {\n groupCursor: string;\n pageNumber: number;\n};\n\nexport const retrieveCachedEdgesByPage = async (cursorCache: Core, { groupCursor, pageNumber }: Context) => {\n const { entries, metadata } = await cursorCache.export<CursorCacheEntry>({\n filterByValue: [\n { comparator: pageNumber, keyChain: 'page' },\n { comparator: groupCursor, keyChain: 'group' },\n ],\n });\n\n return {\n edges: entries.reduce<Edge[]>((cached, [key, { index, node }]) => {\n if (metadata[index]?.cacheability.checkTTL()) {\n cached[index] = { cursor: key, node };\n }\n\n return cached;\n }, []),\n pageNumber,\n };\n};\n","import { type ConnectionInputOptions } from '../types.ts';\n\nexport const getCursor = ({ after, before }: ConnectionInputOptions) => before ?? after;\n","import type { Core } from '@cachemap/core';\nimport type {\n ConnectionInputOptions,\n CursorCacheEntry,\n CursorGroupMetadata,\n PartialCursorCacheEntry,\n} from '../types.ts';\nimport { getCursor } from './getCursor.ts';\nimport { makeEntry } from './makeEntry.ts';\n\nexport type Context = {\n cursorCache: Core;\n resultsPerPage: number;\n};\n\nexport const retrieveEntry = async (\n args: ConnectionInputOptions,\n metadata: CursorGroupMetadata,\n { cursorCache, resultsPerPage }: Context\n): Promise<PartialCursorCacheEntry> => {\n const cursor = getCursor(args);\n\n if (cursor) {\n const cursorCacheEntry = await cursorCache.get<CursorCacheEntry>(cursor);\n\n if (cursorCacheEntry) {\n return cursorCacheEntry;\n }\n }\n\n return makeEntry(args, { metadata, resultsPerPage });\n};\n","import { type ConnectionInputOptions, type CursorGroupMetadata } from '../types.ts';\nimport { getDirection } from './getDirection.ts';\nimport { getIndexesOnLastPage } from './getIndexesOnLastPage.ts';\n\nexport type Context = {\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\n\nexport const makeEntry = (\n args: ConnectionInputOptions,\n { metadata: { totalPages, totalResults }, resultsPerPage }: Context\n) => {\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 { type Core } from '@cachemap/core';\nimport { type CachedEdges, type ConnectionInputOptions, type CursorGroupMetadata } from '../types.ts';\nimport { getInRangeCachedEdges } from './getInRangeCachedEdges.ts';\nimport { getPageNumbersToRequest } from './getPageNumbersToRequest.ts';\nimport { getPagesMissingFromCache } from './getPagesMissingFromCache.ts';\nimport { getEndIndex, getStartIndex } from './getStartAndEndIndexes.ts';\nimport { hasNextPage, hasPreviousPage } from './hasPreviousNextPage.ts';\nimport { retrieveCachedEdgesByPage } from './retrieveCachedEdgesByPage.ts';\nimport { retrieveEntry } from './retrieveEntry.ts';\n\nexport type Context = {\n cursorCache: Core;\n groupCursor: string;\n resultsPerPage: number;\n};\n\nexport const retrieveCachedConnection = async (\n args: ConnectionInputOptions,\n { cursorCache, groupCursor, resultsPerPage }: Context\n) => {\n /**\n * At this point the cache will always have metadata because `retrieveCachedConnection`\n * is called from `resolveConnection` and is only called if there is a cursor, either\n * after a direct check or after calling `validateCursor` or `requestAndCachePages`,\n * which check and set the metadata respectively.\n */\n const metadata = (await cursorCache.get<CursorGroupMetadata>(`${groupCursor}-metadata`))!;\n const entry = await retrieveEntry(args, metadata, { cursorCache, 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 for (const pageNumber of pageNumbersToRequest) {\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:\n missingPages.length === 0\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 { type ConnectionInputOptions, type CursorGroupMetadata, type PartialCursorCacheEntry } from '../types.ts';\nimport { getCount } from './getCount.ts';\nimport { getDirection } from './getDirection.ts';\nimport { getIndexesOnLastPage } from './getIndexesOnLastPage.ts';\nimport { isFirstPage } from './isFirstPage.ts';\nimport { isLastPage } from './isLastPage.ts';\n\nexport type Context = {\n entry: PartialCursorCacheEntry;\n metadata: CursorGroupMetadata;\n resultsPerPage: number;\n};\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 absoluteStartIndex = index - count;\n\n if (absoluteStartIndex >= 0) {\n return { absolute: absoluteStartIndex, relative: absoluteStartIndex };\n }\n\n const indexesRemainingAfterLastPage = Math.abs(absoluteStartIndex);\n const pagesRemaining = indexesRemainingAfterLastPage / resultsPerPage + 1;\n const remainder = indexesRemainingAfterLastPage % resultsPerPage;\n const relativeStartIndex = remainder === 0 ? 0 : page - pagesRemaining < 0 ? 0 : resultsPerPage - remainder;\n return { absolute: absoluteStartIndex, relative: relativeStartIndex };\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 absoluteEndIndex = index + count;\n const indexesPerPage = resultsPerPage - 1;\n\n if (absoluteEndIndex <= indexesPerPage) {\n return { absolute: absoluteEndIndex, relative: absoluteEndIndex };\n }\n\n const indexesRemainingAfterFirstPage = absoluteEndIndex - indexesPerPage;\n const pagesRemaining = indexesRemainingAfterFirstPage / resultsPerPage;\n const remainder = indexesRemainingAfterFirstPage % resultsPerPage;\n\n const relativeEndIndex =\n remainder === 0 ? indexesPerPage : page + pagesRemaining > totalPages ? indexesOnLastPage : remainder - 1;\n\n return { absolute: absoluteEndIndex, relative: relativeEndIndex };\n })();\n};\n","export const isFirstPage = (page: number) => page === 1;\n","import { type CachedEdges } from '../types.ts';\n\nexport const getPagesMissingFromCache = (cachedEdgesByPage: CachedEdges[]) => {\n return cachedEdgesByPage.reduce<number[]>((missing, cachedEdgesPage) => {\n if (cachedEdgesPage.edges.length === 0) {\n missing.push(cachedEdgesPage.pageNumber);\n }\n\n return missing;\n }, []);\n};\n","import { type Core } from '@cachemap/core';\nimport type { PlainObject } from '@graphql-box/core';\nimport { type ConnectionInputOptions, type Getters, type Node, type ResourceResolver } from '../types.ts';\nimport { extractEdges } from './extractEdges.ts';\nimport { extractNodes } from './extractNodes.ts';\nimport { getInRangeCachedEdges } from './getInRangeCachedEdges.ts';\nimport { getEndCursor, getStartCursor } from './getStartAndEndCursors.ts';\nimport { mergeCachedEdges } from './mergeCachedEdges.ts';\nimport { requestAndCachePages } from './requestAndCachePages.ts';\nimport { retrieveCachedConnection } from './retrieveCachedConnection.ts';\n\nexport type Context<Resource extends PlainObject, ResourceNode extends Node> = {\n cursorCache: Core;\n getters: Getters<Resource, ResourceNode>;\n groupCursor: string;\n makeIDCursor: (id: string | number) => string;\n resourceResolver: ResourceResolver<Resource>;\n resultsPerPage: number;\n};\n\nexport const resolveConnection = async <Resource extends PlainObject, ResourceNode extends Node>(\n args: PlainObject & ConnectionInputOptions,\n { cursorCache, getters, groupCursor, makeIDCursor, resourceResolver, resultsPerPage }: Context<Resource, ResourceNode>\n) => {\n const { cachedEdges, hasNextPage, hasPreviousPage, indexes, missingPages, totalResults } =\n await retrieveCachedConnection(args, {\n cursorCache,\n groupCursor,\n resultsPerPage,\n });\n\n if (missingPages.length === 0) {\n const edges = extractEdges(cachedEdges);\n\n return {\n edges,\n errors: [],\n nodes: extractNodes(edges),\n pageInfo: {\n endCursor: getEndCursor(edges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(edges),\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(edges),\n hasNextPage,\n hasPreviousPage,\n startCursor: getStartCursor(edges),\n },\n totalCount: totalResults,\n };\n};\n","import { type CachedEdges } from '../types.ts';\n\nexport const mergeCachedEdges = (cachedEdges: CachedEdges[], missingCachedEdges: CachedEdges[]) =>\n cachedEdges.reduce<CachedEdges[]>((mergedCachedEdges, cachedEdge) => {\n if (cachedEdge.edges.length === 0) {\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 }, []);\n","import { type Core } from '@cachemap/core';\nimport { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport { type ConnectionInputOptions, type CursorCacheEntry, type CursorGroupMetadata } from '../types.ts';\nimport { getCursor } from './getCursor.ts';\nimport { getDirection } from './getDirection.ts';\nimport { isCursorFirst } from './isCursorFirst.ts';\nimport { isCursorLast } from './isCursorLast.ts';\n\nexport type Context = {\n cursorCache: Core;\n groupCursor: string;\n resultsPerPage: number;\n};\n\nexport const validateCursor = 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 { nodes: 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 { nodes: 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 { nodes: 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 { nodes: fieldNodes }\n );\n }\n\n const metadata = await cursorCache.get<CursorGroupMetadata>(`${groupCursor}-metadata`);\n\n if (!metadata) {\n return new GraphQLError('Curser cannot be supplied without previously being provided.', { nodes: fieldNodes });\n }\n\n const cursor = getCursor({ after, before })!;\n const entry = await cursorCache.get<CursorCacheEntry>(cursor);\n\n if (!entry) {\n return new GraphQLError(`The cursor ${cursor} could not be found.`, { nodes: 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.`, {\n nodes: fieldNodes,\n });\n }\n\n if (isCursorFirst({ direction, entry })) {\n return new GraphQLError(`The cursor ${cursor} is the first, you cannot go backward any further.`, {\n nodes: fieldNodes,\n });\n }\n\n return;\n};\n","import { type CursorCacheEntry, type Direction } from '../types.ts';\nimport { getIndexesOnLastPage } from './getIndexesOnLastPage.ts';\n\nexport type Params = {\n direction: Direction;\n entry: CursorCacheEntry;\n resultsPerPage: number;\n totalPages: number;\n totalResults: number;\n};\n\nexport const isCursorLast = ({ direction, entry: { index, page }, resultsPerPage, totalPages, totalResults }: Params) =>\n direction === 'forward' && page === totalPages && index === getIndexesOnLastPage({ resultsPerPage, totalResults });\n","import { type CursorCacheEntry, type Direction } from '../types.ts';\n\nexport type Params = {\n direction: Direction;\n entry: CursorCacheEntry;\n};\n\nexport const isCursorFirst = ({ direction, entry: { index, page } }: Params) =>\n direction === 'backward' && page === 1 && index === 0;\n","import type { PlainObject } from '@graphql-box/core';\nimport { type GraphQLResolveInfo } from 'graphql';\nimport { isCursorSupplied } from '../helpers/isCursorSupplied.ts';\nimport { requestAndCachePages } from '../helpers/requestAndCachePages.ts';\nimport { resolveConnection } from '../helpers/resolveConnection.ts';\nimport { validateCursor } from '../helpers/validateCursor.ts';\nimport {\n type Connection,\n type ConnectionInputOptions,\n type ConnectionResolverUserOptions,\n type Node,\n} from '../types.ts';\n\nexport const makeConnectionResolver =\n <\n Source extends PlainObject | undefined,\n Args extends PlainObject,\n Ctx extends PlainObject,\n Resource extends PlainObject,\n ResourceNode extends Node\n >({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resolver = result => result,\n resultsPerPage,\n }: ConnectionResolverUserOptions<Source, Args, Ctx, Resource, ResourceNode>) =>\n async (\n source: Source,\n args: Args & ConnectionInputOptions,\n context: Ctx,\n info: GraphQLResolveInfo\n ): Promise<Connection> => {\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 };\n","import type { PlainObject } from '@graphql-box/core';\nimport { type ConnectionInputOptions } from '../types.ts';\n\nexport const isCursorSupplied = ({ after, before }: PlainObject & ConnectionInputOptions) => !!(after ?? before);\n"],"names":["connectionInputOptions","Set","requestAndCachePages","async","pages","cursorCache","getters","groupCursor","makeIDCursor","resourceResolver","errors","cachedEdges","Promise","all","map","data","pageResultData","pageResultErrors","headers","pageResultHeaders","page","length","edges","nodes","makeCursor","node","id","cursor","group","totalPages","totalResults","cacheControl","get","options","cacheHeaders","undefined","index","set","cacheCursors","pageNumber","makeEdges","push","extractEdges","reduce","cachedEdge","extractNodes","edge","getInRangeCachedEdges","cachedEdgesByPage","endIndex","resultsPerPage","startIndex","inRange","cachedEdgesPage","currentPageStartIndex","getCurrentPageStartIndex","pageIndex","relative","currentPageEndIndex","getCurrentPageEndIndex","totalCachedPages","slice","getStartCursor","getEndCursor","lastEdge","getDirection","last","isLastPage","getPageNumbersToRequest","args","entry","metadata","startPageNumber","getStartPageNumber","absolute","Math","ceil","abs","endPageNumber","getEndPageNumber","indexesPerPage","range","getCount","first","getIndexesOnLastPage","getResultsOnLastPage","remainder","hasPreviousPage","isNumber","hasNextPage","retrieveCachedEdgesByPage","entries","export","filterByValue","comparator","keyChain","cached","key","cacheability","checkTTL","getCursor","after","before","retrieveEntry","cursorCacheEntry","makeEntry","retrieveCachedConnection","getStartIndex","count","isFirstPage","absoluteStartIndex","indexesRemainingAfterLastPage","getEndIndex","indexesOnLastPage","absoluteEndIndex","indexesRemainingAfterFirstPage","promises","pageNumbersToRequest","missingPages","missing","getPagesMissingFromCache","indexes","end","start","resolveConnection","pageInfo","endCursor","startCursor","totalCount","missingCachedEdges","mergedCachedEdges","mergeCachedEdges","missingCachedEdge","find","validateCursor","fieldNodes","GraphQLError","direction","isCursorLast","isCursorFirst","makeConnectionResolver","createMakeCursors","createResourceResolver","resolver","result","source","context","info","makeGroupCursor","isCursorSupplied","cursorError","has","pickBy","_value"],"mappings":"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"}