@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.mjs","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":";;;;AAEA,MAAMA,sBAAsB,GAAG,IAAIC,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAErE,MAAMC,4BAA4B,GAAsBC,IAAO,IACpEC,MAAM,CAACD,IAAI,EAAE,CAACE,MAAM,EAAEC,GAAG,KAAK,CAACN,sBAAsB,CAACO,GAAG,CAACD,GAAG,CAAC;;ACFzD,MAAME,gBAAgB,GAAGA,CAAC;EAAEC,KAAK;AAAEC,EAAAA,MAAAA;AAA6C,CAAC,KAAK,CAAC,EAAED,KAAK,IAAIC,MAAM,CAAC;;ACSzG,MAAMC,YAAY,GAAG,OAC1BC,WAAiB,EACjB;EAAEC,KAAK;EAAEC,KAAK;EAAEC,OAAO;EAAEC,IAAI;EAAEC,UAAU;AAAEC,EAAAA,YAAAA;AAAqB,CAAC,KAC9D;AACH,EAAA,MAAMC,YAAY,GAAGJ,OAAO,CAACK,GAAG,CAAC,eAAe,CAAC,CAAA;EACjD,MAAMC,OAAO,GAAGF,YAAY,GAAG;AAAEG,IAAAA,YAAY,EAAE;AAAEH,MAAAA,YAAAA;AAAa,KAAA;AAAE,GAAC,GAAGI,SAAS,CAAA;EAE7E,MAAMC,OAAO,CAACC,GAAG,CACfZ,KAAK,CAACa,GAAG,CAAC,OAAO;IAAEC,MAAM;AAAEC,IAAAA,IAAAA;GAAM,EAAEC,KAAK,KAAKjB,WAAW,CAACkB,GAAG,CAACH,MAAM,EAAE;IAAEb,KAAK;IAAEe,KAAK;IAAED,IAAI;AAAEZ,IAAAA,IAAAA;AAAK,GAAC,EAAEK,OAAO,CAAC,CAC7G,CAAC,CAAA;AAED,EAAA,MAAMT,WAAW,CAACkB,GAAG,CAAE,CAAEhB,EAAAA,KAAM,WAAU,EAAE;IAAEG,UAAU;AAAEC,IAAAA,YAAAA;GAAc,EAAEG,OAAO,CAAC,CAAA;AACnF,CAAC;;ACtBM,MAAMU,SAAS,GAAGA,CAACC,KAAa,EAAEC,UAAkC,KACzED,KAAK,CAACN,GAAG,CAACE,IAAI,KAAK;AAAED,EAAAA,MAAM,EAAEM,UAAU,CAACL,IAAI,CAAC;AAAEA,EAAAA,IAAAA;AAAK,CAAC,CAAC,CAAC;;ACWlD,MAAMM,oBAAoB,GAAG,OAClCC,KAAe,EACf;EAAEvB,WAAW;EAAEwB,OAAO;EAAEC,WAAW;EAAEC,YAAY;AAAEC,EAAAA,gBAAAA;AAAkD,CAAC,KACnG;EACH,MAAMC,MAAe,GAAG,EAAE,CAAA;AAE1B,EAAA,MAAMC,WAAW,GAAG,MAAMjB,OAAO,CAACC,GAAG,CACnCU,KAAK,CAACT,GAAG,CAAC,MAAMV,IAAI,IAAI;IACtB,MAAM;AACJ0B,MAAAA,IAAI,EAAEC,cAAc;AACpBH,MAAAA,MAAM,EAAEI,gBAAgB;AACxB7B,MAAAA,OAAO,EAAE8B,iBAAAA;KACV,GAAG,MAAMN,gBAAgB,CAAC;AACzBvB,MAAAA,IAAAA;AACF,KAAC,CAAC,CAAA;AAEF,IAAA,IAAI2B,cAAc,IAAI,CAACC,gBAAgB,EAAEE,MAAM,EAAE;AAC/C,MAAA,MAAMjC,KAAK,GAAGkB,SAAS,CAACK,OAAO,CAACJ,KAAK,CAACW,cAAc,CAAC,EAAEf,IAAI,IAAIU,YAAY,CAACV,IAAI,CAACmB,EAAE,CAAC,CAAC,CAAA;MAErF,MAAMpC,YAAY,CAACC,WAAW,EAAE;QAC9BC,KAAK;AACLC,QAAAA,KAAK,EAAEuB,WAAW;AAClBtB,QAAAA,OAAO,EAAE8B,iBAAiB;QAC1B7B,IAAI;AACJC,QAAAA,UAAU,EAAEmB,OAAO,CAACnB,UAAU,CAAC0B,cAAc,CAAC;AAC9CzB,QAAAA,YAAY,EAAEkB,OAAO,CAAClB,YAAY,CAACyB,cAAc,CAAA;AACnD,OAAC,CAAC,CAAA;MAEF,OAAO;QAAE9B,KAAK;AAAEmC,QAAAA,UAAU,EAAEhC,IAAAA;OAAM,CAAA;AACpC,KAAA;IAEA,IAAI4B,gBAAgB,EAAEE,MAAM,EAAE;AAC5BN,MAAAA,MAAM,CAACS,IAAI,CAAC,GAAGL,gBAAgB,CAAC,CAAA;AAClC,KAAA;IAEA,OAAO;AAAE/B,MAAAA,KAAK,EAAE,EAAE;AAAEmC,MAAAA,UAAU,EAAEhC,IAAAA;KAAM,CAAA;AACxC,GAAC,CACH,CAAC,CAAA;EAED,OAAO;IAAEyB,WAAW;AAAED,IAAAA,MAAAA;GAAQ,CAAA;AAChC,CAAC;;ACpDM,MAAMU,YAAY,GAAIT,WAA0B,IACrDA,WAAW,CAACU,MAAM,CAAS,CAACtC,KAAK,EAAEuC,UAAU,KAAK,CAAC,GAAGvC,KAAK,EAAE,GAAGuC,UAAU,CAACvC,KAAK,CAAC,EAAE,EAAE,CAAC;;ACDjF,MAAMwC,YAAY,GAAIxC,KAAa,IAAKA,KAAK,CAACa,GAAG,CAAC4B,IAAI,IAAIA,IAAI,CAAC1B,IAAI,CAAC;;ACKpE,MAAM2B,wBAAwB,GAAGA,CAAC;EAAEC,SAAS;AAAEC,EAAAA,UAAAA;AAA8B,CAAC,KACnFD,SAAS,KAAK,CAAC,GAAGC,UAAU,CAACC,QAAQ,GAAG,CAAC,CAAA;AASpC,MAAMC,sBAAsB,GAAGA,CAAC;EAAEC,QAAQ;EAAEJ,SAAS;EAAEK,cAAc;AAAEC,EAAAA,gBAAAA;AAAkC,CAAC,KAC/GN,SAAS,KAAKM,gBAAgB,GAAG,CAAC,GAAGF,QAAQ,CAACF,QAAQ,GAAGG,cAAc,GAAG,CAAC;;ACTtE,MAAME,qBAAqB,GAAGA,CACnCC,iBAAgC,EAChC;EAAEJ,QAAQ;EAAEC,cAAc;AAAEJ,EAAAA,UAAAA;AAAoB,CAAC,KAC9C;EACH,OAAOO,iBAAiB,CAACb,MAAM,CAAgB,CAACc,OAAO,EAAEC,eAAe,EAAErC,KAAK,KAAK;IAClF,MAAMsC,qBAAqB,GAAGZ,wBAAwB,CAAC;AAAEC,MAAAA,SAAS,EAAE3B,KAAK;AAAE4B,MAAAA,UAAAA;AAAW,KAAC,CAAC,CAAA;IAExF,MAAMW,mBAAmB,GAAGT,sBAAsB,CAAC;MACjDC,QAAQ;AACRJ,MAAAA,SAAS,EAAE3B,KAAK;MAChBgC,cAAc;MACdC,gBAAgB,EAAEE,iBAAiB,CAAClB,MAAAA;AACtC,KAAC,CAAC,CAAA;AAEF,IAAA,MAAML,WAAW,GAAGyB,eAAe,CAACrD,KAAK,CAACwD,KAAK,CAACF,qBAAqB,EAAEC,mBAAmB,GAAG,CAAC,CAAC,CAAA;IAC/FH,OAAO,CAAChB,IAAI,CAAC;AAAEpC,MAAAA,KAAK,EAAE4B,WAAW;MAAEO,UAAU,EAAEkB,eAAe,CAAClB,UAAAA;AAAW,KAAC,CAAC,CAAA;AAC5E,IAAA,OAAOiB,OAAO,CAAA;GACf,EAAE,EAAE,CAAC,CAAA;AACR,CAAC;;ACzBM,MAAMK,cAAc,GAAIzD,KAAa,IAAKA,KAAK,CAAC,CAAC,CAAC,EAAEc,MAAM,CAAA;AAE1D,MAAM4C,YAAY,GAAI1D,KAAa,IAAK;EAC7C,MAAM2D,QAAQ,GAAG3D,KAAK,CAACA,KAAK,CAACiC,MAAM,GAAG,CAAC,CAAC,CAAA;EACxC,OAAO0B,QAAQ,EAAE7C,MAAM,CAAA;AACzB,CAAC;;ACLM,MAAM8C,gBAAgB,GAAGA,CAAChC,WAA0B,EAAEiC,kBAAiC,KAC5FjC,WAAW,CAACU,MAAM,CAAgB,CAACwB,iBAAiB,EAAEvB,UAAU,KAAK;AACnE,EAAA,IAAIA,UAAU,CAACvC,KAAK,CAACiC,MAAM,KAAK,CAAC,EAAE;AACjC,IAAA,MAAM8B,iBAAiB,GAAGF,kBAAkB,CAACG,IAAI,CAACC,OAAO,IAAIA,OAAO,CAAC9B,UAAU,KAAKI,UAAU,CAACJ,UAAU,CAAC,CAAA;AAE1G,IAAA,IAAI4B,iBAAiB,EAAE;AACrB,MAAA,OAAO,CAAC,GAAGD,iBAAiB,EAAEC,iBAAiB,CAAC,CAAA;AAClD,KAAA;AACF,GAAA;AAEA,EAAA,OAAO,CAAC,GAAGD,iBAAiB,EAAEvB,UAAU,CAAC,CAAA;AAC3C,CAAC,EAAE,EAAE,CAAC;;ACXD,MAAM2B,YAAY,GAAIC,IAAa,IAAiBA,IAAI,GAAG,UAAU,GAAG,SAAU;;ACGlF,MAAMC,UAAU,GAAGA,CAAC;EAAEjE,IAAI;AAAEC,EAAAA,UAAAA;AAAmB,CAAC,KAAKD,IAAI,KAAKC,UAAU;;ACUxE,MAAMiE,kBAAkB,GAAGA,CAChC/E,IAA4B,EAC5B;EAAEa,IAAI;EAAE6C,cAAc;AAAEJ,EAAAA,UAAAA;AAA4E,CAAC,KAClG;AACH,EAAA,IAAIsB,YAAY,CAAC5E,IAAI,CAAC6E,IAAI,CAAC,KAAK,SAAS,IAAIvB,UAAU,CAAC0B,QAAQ,IAAI,CAAC,EAAE;AACrE,IAAA,OAAOnE,IAAI,CAAA;AACb,GAAA;AAEA,EAAA,MAAMoE,eAAe,GAAGpE,IAAI,GAAGqE,IAAI,CAACC,IAAI,CAACD,IAAI,CAACE,GAAG,CAAC9B,UAAU,CAAC0B,QAAQ,CAAC,GAAGtB,cAAc,CAAC,CAAA;AACxF,EAAA,OAAOuB,eAAe,IAAI,CAAC,GAAG,CAAC,GAAGA,eAAe,CAAA;AACnD,CAAC,CAAA;AAEM,MAAMI,gBAAgB,GAAGA,CAC9BrF,IAA4B,EAC5B;EAAEyD,QAAQ;AAAE6B,EAAAA,QAAQ,EAAE;AAAExE,IAAAA,UAAAA;GAAY;EAAED,IAAI;AAAE6C,EAAAA,cAAAA;AAAgE,CAAC,KAC1G;AACH,EAAA,MAAM6B,cAAc,GAAG7B,cAAc,GAAG,CAAC,CAAA;EAEzC,IACEkB,YAAY,CAAC5E,IAAI,CAAC6E,IAAI,CAAC,KAAK,UAAU,IACtCC,UAAU,CAAC;IAAEjE,IAAI;AAAEC,IAAAA,UAAAA;AAAW,GAAC,CAAC,IAChC2C,QAAQ,CAACuB,QAAQ,IAAIO,cAAc,EACnC;AACA,IAAA,OAAO1E,IAAI,CAAA;AACb,GAAA;AAEA,EAAA,MAAM2E,aAAa,GAAG3E,IAAI,GAAGqE,IAAI,CAACC,IAAI,CAAC,CAAC1B,QAAQ,CAACuB,QAAQ,GAAGO,cAAc,IAAI7B,cAAc,CAAC,CAAA;AAC7F,EAAA,OAAO8B,aAAa,IAAI1E,UAAU,GAAGA,UAAU,GAAG0E,aAAa,CAAA;AACjE,CAAC;;ACvBM,MAAMC,uBAAuB,GAAGA,CACrCzF,IAA4B,EAC5B;EAAEyD,QAAQ;AAAEiC,EAAAA,KAAK,EAAE;AAAE7E,IAAAA,IAAAA;GAAM;EAAEyE,QAAQ;EAAE5B,cAAc;AAAEJ,EAAAA,UAAAA;AAAqD,CAAC,KAC1G;AACH,EAAA,MAAM2B,eAAe,GAAGF,kBAAkB,CAAC/E,IAAI,EAAE;IAAEa,IAAI;IAAE6C,cAAc;AAAEJ,IAAAA,UAAAA;AAAW,GAAC,CAAC,CAAA;AACtF,EAAA,MAAMkC,aAAa,GAAGH,gBAAgB,CAACrF,IAAI,EAAE;IAAEyD,QAAQ;IAAE6B,QAAQ;IAAEzE,IAAI;AAAE6C,IAAAA,cAAAA;AAAe,GAAC,CAAC,CAAA;EAE1F,IAAIuB,eAAe,KAAKO,aAAa,EAAE;IACrC,OAAO,CAAC3E,IAAI,CAAC,CAAA;AACf,GAAA;EAEA,OAAO,CAAC,GAAG8E,KAAK,CAACV,eAAe,EAAEO,aAAa,CAAC,EAAEA,aAAa,CAAC,CAAA;AAClE,CAAC;;AC9BM,MAAMI,wBAAwB,GAAI/B,iBAAgC,IAAK;EAC5E,OAAOA,iBAAiB,CAACb,MAAM,CAAW,CAAC2B,OAAO,EAAEZ,eAAe,KAAK;AACtE,IAAA,IAAIA,eAAe,CAACrD,KAAK,CAACiC,MAAM,KAAK,CAAC,EAAE;AACtCgC,MAAAA,OAAO,CAAC7B,IAAI,CAACiB,eAAe,CAAClB,UAAU,CAAC,CAAA;AAC1C,KAAA;AAEA,IAAA,OAAO8B,OAAO,CAAA;GACf,EAAE,EAAE,CAAC,CAAA;AACR,CAAC;;ACRM,MAAMkB,QAAQ,GAAGA,CAAC;EAAEC,KAAK;AAAEjB,EAAAA,IAAAA;AAA6B,CAAC,KAAKiB,KAAK,IAAIjB,IAAK;;ACG5E,MAAMkB,oBAAoB,GAAGA,CAAC;EAAErC,cAAc;AAAE3C,EAAAA,YAAAA;AAAqB,CAAC,KAAK;AAChF,EAAA,MAAMiF,SAAS,GAAGjF,YAAY,GAAG2C,cAAc,CAAA;AAC/C,EAAA,OAAOsC,SAAS,KAAK,CAAC,GAAGtC,cAAc,GAAGsC,SAAS,CAAA;AACrD,CAAC;;ACNM,MAAMC,oBAAoB,GAAGA,CAAC;EAAEvC,cAAc;AAAE3C,EAAAA,YAAAA;AAAqB,CAAC,KAC3EgF,oBAAoB,CAAC;EAAErC,cAAc;AAAE3C,EAAAA,YAAAA;AAAa,CAAC,CAAC,GAAG,CAAC;;ACHrD,MAAMmF,WAAW,GAAIrF,IAAY,IAAKA,IAAI,KAAK,CAAC;;ACahD,MAAMsF,aAAa,GAAGA,CAC3BnG,IAA4B,EAC5B;AAAE0F,EAAAA,KAAK,EAAE;IAAEhE,KAAK;AAAEb,IAAAA,IAAAA;GAAM;AAAE6C,EAAAA,cAAAA;AAA0D,CAAC,KAClF;AACH,EAAA,MAAM0C,KAAK,GAAGP,QAAQ,CAAC7F,IAAI,CAAC,CAAA;EAE5B,OAAO4E,YAAY,CAAC5E,IAAI,CAAC6E,IAAI,CAAC,KAAK,SAAS,GACxC;IAAEG,QAAQ,EAAEtD,KAAK,GAAG,CAAC;IAAE6B,QAAQ,EAAE7B,KAAK,GAAG,CAAA;GAAG,GAC5CwE,WAAW,CAACrF,IAAI,CAAC,IAAIa,KAAK,GAAG0E,KAAK,GAAG,CAAC,GACtC;AAAEpB,IAAAA,QAAQ,EAAE,CAAC;AAAEzB,IAAAA,QAAQ,EAAE,CAAA;GAAG,GAC5B,CAAC,MAAM;AACL,IAAA,MAAM8C,kBAAkB,GAAG3E,KAAK,GAAG0E,KAAK,CAAA;IAExC,IAAIC,kBAAkB,IAAI,CAAC,EAAE;MAC3B,OAAO;AAAErB,QAAAA,QAAQ,EAAEqB,kBAAkB;AAAE9C,QAAAA,QAAQ,EAAE8C,kBAAAA;OAAoB,CAAA;AACvE,KAAA;AAEA,IAAA,MAAMC,6BAA6B,GAAGpB,IAAI,CAACE,GAAG,CAACiB,kBAAkB,CAAC,CAAA;AAClE,IAAA,MAAME,cAAc,GAAGD,6BAA6B,GAAG5C,cAAc,GAAG,CAAC,CAAA;AACzE,IAAA,MAAMsC,SAAS,GAAGM,6BAA6B,GAAG5C,cAAc,CAAA;AAChE,IAAA,MAAM8C,kBAAkB,GAAGR,SAAS,KAAK,CAAC,GAAG,CAAC,GAAGnF,IAAI,GAAG0F,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG7C,cAAc,GAAGsC,SAAS,CAAA;IAC3G,OAAO;AAAEhB,MAAAA,QAAQ,EAAEqB,kBAAkB;AAAE9C,MAAAA,QAAQ,EAAEiD,kBAAAA;KAAoB,CAAA;AACvE,GAAC,GAAG,CAAA;AACV,CAAC,CAAA;AAEM,MAAMC,WAAW,GAAGA,CACzBzG,IAA4B,EAC5B;AAAE0F,EAAAA,KAAK,EAAE;IAAEhE,KAAK;AAAEb,IAAAA,IAAAA;GAAM;AAAEyE,EAAAA,QAAQ,EAAE;IAAExE,UAAU;AAAEC,IAAAA,YAAAA;GAAc;AAAE2C,EAAAA,cAAAA;AAAwB,CAAC,KACxF;AACH,EAAA,MAAM0C,KAAK,GAAGP,QAAQ,CAAC7F,IAAI,CAAC,CAAA;EAC5B,MAAM0G,iBAAiB,GAAGT,oBAAoB,CAAC;IAAEvC,cAAc;AAAE3C,IAAAA,YAAAA;AAAa,GAAC,CAAC,CAAA;EAEhF,OAAO6D,YAAY,CAAC5E,IAAI,CAAC6E,IAAI,CAAC,KAAK,UAAU,GACzC;IAAEG,QAAQ,EAAEtD,KAAK,GAAG,CAAC;IAAE6B,QAAQ,EAAE7B,KAAK,GAAG,CAAA;GAAG,GAC5CoD,UAAU,CAAC;IAAEjE,IAAI;AAAEC,IAAAA,UAAAA;AAAW,GAAC,CAAC,IAAIY,KAAK,GAAG0E,KAAK,GAAGM,iBAAiB,GACrE;AAAE1B,IAAAA,QAAQ,EAAE0B,iBAAiB;AAAEnD,IAAAA,QAAQ,EAAEmD,iBAAAA;GAAmB,GAC5D,CAAC,MAAM;AACL,IAAA,MAAMC,gBAAgB,GAAGjF,KAAK,GAAG0E,KAAK,CAAA;AACtC,IAAA,MAAMb,cAAc,GAAG7B,cAAc,GAAG,CAAC,CAAA;IAEzC,IAAIiD,gBAAgB,IAAIpB,cAAc,EAAE;MACtC,OAAO;AAAEP,QAAAA,QAAQ,EAAE2B,gBAAgB;AAAEpD,QAAAA,QAAQ,EAAEoD,gBAAAA;OAAkB,CAAA;AACnE,KAAA;AAEA,IAAA,MAAMC,8BAA8B,GAAGD,gBAAgB,GAAGpB,cAAc,CAAA;AACxE,IAAA,MAAMgB,cAAc,GAAGK,8BAA8B,GAAGlD,cAAc,CAAA;AACtE,IAAA,MAAMsC,SAAS,GAAGY,8BAA8B,GAAGlD,cAAc,CAAA;AAEjE,IAAA,MAAMmD,gBAAgB,GACpBb,SAAS,KAAK,CAAC,GAAGT,cAAc,GAAG1E,IAAI,GAAG0F,cAAc,GAAGzF,UAAU,GAAG4F,iBAAiB,GAAGV,SAAS,GAAG,CAAC,CAAA;IAE3G,OAAO;AAAEhB,MAAAA,QAAQ,EAAE2B,gBAAgB;AAAEpD,MAAAA,QAAQ,EAAEsD,gBAAAA;KAAkB,CAAA;AACnE,GAAC,GAAG,CAAA;AACV,CAAC;;AClDM,MAAMC,eAAe,GAAGA,CAAC;EAAEjD,iBAAiB;AAAEP,EAAAA,UAAAA;AAAkC,CAAC,KACrFyD,QAAQ,CAAClD,iBAAiB,CAAC,CAAC,CAAC,EAAEhB,UAAU,CAAC,IAAIgB,iBAAiB,CAAC,CAAC,CAAC,EAAEhB,UAAU,KAAK,CAAC,IAAKS,UAAU,CAACC,QAAQ,GAAG,CAAC,CAAA;AAE5G,MAAMyD,WAAW,GAAGA,CAAC;EAC1BnD,iBAAiB;EACjBJ,QAAQ;AACR6B,EAAAA,QAAQ,EAAE;IAAExE,UAAU;AAAEC,IAAAA,YAAAA;GAAc;AACtC2C,EAAAA,cAAAA;AACiB,CAAC,KACjBqD,QAAQ,CAAClD,iBAAiB,CAACA,iBAAiB,CAAClB,MAAM,GAAG,CAAC,CAAC,EAAEE,UAAU,CAAC,IACpEgB,iBAAiB,CAACA,iBAAiB,CAAClB,MAAM,GAAG,CAAC,CAAC,EAAEE,UAAU,KAAK/B,UAAU,IAC5E2C,QAAQ,CAACF,QAAQ,GAAG0C,oBAAoB,CAAC;EAAEvC,cAAc;AAAE3C,EAAAA,YAAAA;AAAa,CAAC,CAAC;;ACnBrE,MAAMkG,yBAAyB,GAAG,OAAOxG,WAAiB,EAAE;EAAEyB,WAAW;AAAEW,EAAAA,UAAAA;AAAoB,CAAC,KAAK;EAC1G,MAAM;IAAEqE,OAAO;AAAE5B,IAAAA,QAAAA;AAAS,GAAC,GAAG,MAAM7E,WAAW,CAAC0G,MAAM,CAAmB;AACvEC,IAAAA,aAAa,EAAE,CACb;AAAEC,MAAAA,UAAU,EAAExE,UAAU;AAAEyE,MAAAA,QAAQ,EAAE,MAAA;AAAO,KAAC,EAC5C;AAAED,MAAAA,UAAU,EAAEnF,WAAW;AAAEoF,MAAAA,QAAQ,EAAE,OAAA;KAAS,CAAA;AAElD,GAAC,CAAC,CAAA;EAEF,OAAO;IACL5G,KAAK,EAAEwG,OAAO,CAAClE,MAAM,CAAS,CAACuE,MAAM,EAAE,CAACpH,GAAG,EAAE;MAAEuB,KAAK;AAAED,MAAAA,IAAAA;AAAK,KAAC,CAAC,KAAK;MAChE,IAAI6D,QAAQ,CAAC5D,KAAK,CAAC,EAAE8F,YAAY,CAACC,QAAQ,EAAE,EAAE;QAC5CF,MAAM,CAAC7F,KAAK,CAAC,GAAG;AAAEF,UAAAA,MAAM,EAAErB,GAAG;AAAEsB,UAAAA,IAAAA;SAAM,CAAA;AACvC,OAAA;AAEA,MAAA,OAAO8F,MAAM,CAAA;KACd,EAAE,EAAE,CAAC;AACN1E,IAAAA,UAAAA;GACD,CAAA;AACH,CAAC;;ACxBM,MAAM6E,SAAS,GAAGA,CAAC;EAAEpH,KAAK;AAAEC,EAAAA,MAAAA;AAA+B,CAAC,KAAKA,MAAM,IAAID,KAAK;;ACOhF,MAAMqH,SAAS,GAAGA,CACvB3H,IAA4B,EAC5B;AAAEsF,EAAAA,QAAQ,EAAE;IAAExE,UAAU;AAAEC,IAAAA,YAAAA;GAAc;AAAE2C,EAAAA,cAAAA;AAAwB,CAAC,KAChE;EACH,IAAIkB,YAAY,CAAC5E,IAAI,CAAC6E,IAAI,CAAC,KAAK,UAAU,EAAE;IAC1C,OAAO;MAAEnD,KAAK,EAAEuE,oBAAoB,CAAC;QAAEvC,cAAc;AAAE3C,QAAAA,YAAAA;OAAc,CAAC,GAAG,CAAC;AAAEF,MAAAA,IAAI,EAAEC,UAAAA;KAAY,CAAA;AAChG,GAAA;EAEA,OAAO;IAAEY,KAAK,EAAE,CAAC,CAAC;AAAEb,IAAAA,IAAI,EAAE,CAAA;GAAG,CAAA;AAC/B,CAAC;;ACHM,MAAM+G,aAAa,GAAG,OAC3B5H,IAA4B,EAC5BsF,QAA6B,EAC7B;EAAE7E,WAAW;AAAEiD,EAAAA,cAAAA;AAAwB,CAAC,KACH;AACrC,EAAA,MAAMlC,MAAM,GAAGkG,SAAS,CAAC1H,IAAI,CAAC,CAAA;AAE9B,EAAA,IAAIwB,MAAM,EAAE;IACV,MAAMqG,gBAAgB,GAAG,MAAMpH,WAAW,CAACQ,GAAG,CAAmBO,MAAM,CAAC,CAAA;AAExE,IAAA,IAAIqG,gBAAgB,EAAE;AACpB,MAAA,OAAOA,gBAAgB,CAAA;AACzB,KAAA;AACF,GAAA;EAEA,OAAOF,SAAS,CAAC3H,IAAI,EAAE;IAAEsF,QAAQ;AAAE5B,IAAAA,cAAAA;AAAe,GAAC,CAAC,CAAA;AACtD,CAAC;;ACfM,MAAMoE,wBAAwB,GAAG,OACtC9H,IAA4B,EAC5B;EAAES,WAAW;EAAEyB,WAAW;AAAEwB,EAAAA,cAAAA;AAAwB,CAAC,KAClD;EAOH,MAAM4B,QAAQ,GAAI,MAAM7E,WAAW,CAACQ,GAAG,CAAuB,CAAA,EAAEiB,WAAY,CAAA,SAAA,CAAU,CAAG,CAAA;EACzF,MAAMwD,KAAK,GAAG,MAAMkC,aAAa,CAAC5H,IAAI,EAAEsF,QAAQ,EAAE;IAAE7E,WAAW;AAAEiD,IAAAA,cAAAA;AAAe,GAAC,CAAC,CAAA;AAClF,EAAA,MAAMJ,UAAU,GAAG6C,aAAa,CAACnG,IAAI,EAAE;IAAE0F,KAAK;AAAEhC,IAAAA,cAAAA;AAAe,GAAC,CAAC,CAAA;AACjE,EAAA,MAAMD,QAAQ,GAAGgD,WAAW,CAACzG,IAAI,EAAE;IAAE0F,KAAK;IAAEJ,QAAQ;AAAE5B,IAAAA,cAAAA;AAAe,GAAC,CAAC,CAAA;EACvE,MAAMqE,QAAgC,GAAG,EAAE,CAAA;AAC3C,EAAA,MAAMC,oBAAoB,GAAGvC,uBAAuB,CAACzF,IAAI,EAAE;IAAEyD,QAAQ;IAAEiC,KAAK;IAAEJ,QAAQ;IAAE5B,cAAc;AAAEJ,IAAAA,UAAAA;AAAW,GAAC,CAAC,CAAA;AAErH,EAAA,KAAK,MAAMT,UAAU,IAAImF,oBAAoB,EAAE;AAC7CD,IAAAA,QAAQ,CAACjF,IAAI,CAACmE,yBAAyB,CAACxG,WAAW,EAAE;MAAEyB,WAAW;AAAEW,MAAAA,UAAAA;AAAW,KAAC,CAAC,CAAC,CAAA;AACpF,GAAA;EAEA,MAAMgB,iBAAiB,GAAG,MAAMxC,OAAO,CAACC,GAAG,CAACyG,QAAQ,CAAC,CAAA;AACrD,EAAA,MAAME,YAAY,GAAGrC,wBAAwB,CAAC/B,iBAAiB,CAAC,CAAA;EAEhE,OAAO;IACLvB,WAAW,EACT2F,YAAY,CAACtF,MAAM,KAAK,CAAC,GACrBiB,qBAAqB,CAACC,iBAAiB,EAAE;MAAEJ,QAAQ;MAAEC,cAAc;AAAEJ,MAAAA,UAAAA;KAAY,CAAC,GAClFO,iBAAiB;IACvBmD,WAAW,EAAEA,WAAW,CAAC;MACvBnD,iBAAiB;MACjBJ,QAAQ;MACR6B,QAAQ;AACR5B,MAAAA,cAAAA;AACF,KAAC,CAAC;IACFoD,eAAe,EAAEA,eAAe,CAAC;MAAEjD,iBAAiB;AAAEP,MAAAA,UAAAA;AAAW,KAAC,CAAC;AACnE4E,IAAAA,OAAO,EAAE;AAAEC,MAAAA,GAAG,EAAE1E,QAAQ;AAAE2E,MAAAA,KAAK,EAAE9E,UAAAA;KAAY;IAC7C2E,YAAY;IACZlH,YAAY,EAAEuE,QAAQ,CAACvE,YAAAA;GACxB,CAAA;AACH,CAAC;;ACpCM,MAAMsH,iBAAiB,GAAG,OAC/BrI,IAA0C,EAC1C;EAAES,WAAW;EAAEwB,OAAO;EAAEC,WAAW;EAAEC,YAAY;EAAEC,gBAAgB;AAAEsB,EAAAA,cAAAA;AAAgD,CAAC,KACnH;EACH,MAAM;IAAEpB,WAAW;IAAE0E,WAAW;IAAEF,eAAe;IAAEoB,OAAO;IAAED,YAAY;AAAElH,IAAAA,YAAAA;AAAa,GAAC,GACtF,MAAM+G,wBAAwB,CAAC9H,IAAI,EAAE;IACnCS,WAAW;IACXyB,WAAW;AACXwB,IAAAA,cAAAA;AACF,GAAC,CAAC,CAAA;AAEJ,EAAA,IAAIuE,YAAY,CAACtF,MAAM,KAAK,CAAC,EAAE;AAC7B,IAAA,MAAMjC,KAAK,GAAGqC,YAAY,CAACT,WAAW,CAAC,CAAA;IAEvC,OAAO;MACL5B,KAAK;AACL2B,MAAAA,MAAM,EAAE,EAAE;AACVR,MAAAA,KAAK,EAAEqB,YAAY,CAACxC,KAAK,CAAC;AAC1B4H,MAAAA,QAAQ,EAAE;AACRC,QAAAA,SAAS,EAAEnE,YAAY,CAAC1D,KAAK,CAAC;QAC9BsG,WAAW;QACXF,eAAe;QACf0B,WAAW,EAAErE,cAAc,CAACzD,KAAK,CAAA;OAClC;AACD+H,MAAAA,UAAU,EAAE1H,YAAAA;KACb,CAAA;AACH,GAAA;EAEA,MAAM;AAAEuB,IAAAA,WAAW,EAAEiC,kBAAkB;AAAElC,IAAAA,MAAAA;AAAO,GAAC,GAAG,MAAMN,oBAAoB,CAAyBkG,YAAY,EAAE;IACnHxH,WAAW;IACXwB,OAAO;IACPC,WAAW;IACXC,YAAY;AACZC,IAAAA,gBAAAA;AACF,GAAC,CAAC,CAAA;EAEF,MAAMoC,iBAAiB,GAAGZ,qBAAqB,CAACU,gBAAgB,CAAChC,WAAW,EAAEiC,kBAAkB,CAAC,EAAE;IACjGd,QAAQ,EAAEyE,OAAO,CAACC,GAAG;IACrBzE,cAAc;IACdJ,UAAU,EAAE4E,OAAO,CAACE,KAAAA;AACtB,GAAC,CAAC,CAAA;AAEF,EAAA,MAAM1H,KAAK,GAAGqC,YAAY,CAACyB,iBAAiB,CAAC,CAAA;EAE7C,OAAO;IACL9D,KAAK;IACL2B,MAAM;AACNR,IAAAA,KAAK,EAAEqB,YAAY,CAACxC,KAAK,CAAC;AAC1B4H,IAAAA,QAAQ,EAAE;AACRC,MAAAA,SAAS,EAAEnE,YAAY,CAAC1D,KAAK,CAAC;MAC9BsG,WAAW;MACXF,eAAe;MACf0B,WAAW,EAAErE,cAAc,CAACzD,KAAK,CAAA;KAClC;AACD+H,IAAAA,UAAU,EAAE1H,YAAAA;GACb,CAAA;AACH,CAAC;;ACrEM,MAAM2H,aAAa,GAAGA,CAAC;EAAEC,SAAS;AAAEjD,EAAAA,KAAK,EAAE;IAAEhE,KAAK;AAAEb,IAAAA,IAAAA;AAAK,GAAA;AAAU,CAAC,KACzE8H,SAAS,KAAK,UAAU,IAAI9H,IAAI,KAAK,CAAC,IAAIa,KAAK,KAAK,CAAC;;ACGhD,MAAMkH,YAAY,GAAGA,CAAC;EAAED,SAAS;AAAEjD,EAAAA,KAAK,EAAE;IAAEhE,KAAK;AAAEb,IAAAA,IAAAA;GAAM;EAAE6C,cAAc;EAAE5C,UAAU;AAAEC,EAAAA,YAAAA;AAAqB,CAAC,KAClH4H,SAAS,KAAK,SAAS,IAAI9H,IAAI,KAAKC,UAAU,IAAIY,KAAK,KAAKuE,oBAAoB,CAAC;EAAEvC,cAAc;AAAE3C,EAAAA,YAAAA;AAAa,CAAC,CAAC;;ACE7G,MAAM8H,cAAc,GAAG,OAC5B;EAAEvI,KAAK;EAAEC,MAAM;EAAEuF,KAAK;AAAEjB,EAAAA,IAAAA;AAA6B,CAAC,EACtD;AAAEiE,EAAAA,UAAAA;AAA+B,CAAC,EAClC;EAAErI,WAAW;EAAEyB,WAAW;AAAEwB,EAAAA,cAAAA;AAAwB,CAAC,KAClD;AACH,EAAA,IAAIpD,KAAK,IAAI,CAACwF,KAAK,IAAI,CAACjB,IAAI,EAAE;AAC5B,IAAA,OAAO,IAAIkE,YAAY,CACrB,4FAA4F,EAC5F;AAAElH,MAAAA,KAAK,EAAEiH,UAAAA;AAAW,KACtB,CAAC,CAAA;AACH,GAAA;EAEA,IAAIxI,KAAK,IAAIuE,IAAI,EAAE;AACjB,IAAA,OAAO,IAAIkE,YAAY,CACrB,6FAA6F,EAC7F;AAAElH,MAAAA,KAAK,EAAEiH,UAAAA;AAAW,KACtB,CAAC,CAAA;AACH,GAAA;AAEA,EAAA,IAAIvI,MAAM,IAAI,CAACsE,IAAI,IAAI,CAACiB,KAAK,EAAE;AAC7B,IAAA,OAAO,IAAIiD,YAAY,CACrB,4FAA4F,EAC5F;AAAElH,MAAAA,KAAK,EAAEiH,UAAAA;AAAW,KACtB,CAAC,CAAA;AACH,GAAA;EAEA,IAAIvI,MAAM,IAAIuF,KAAK,EAAE;AACnB,IAAA,OAAO,IAAIiD,YAAY,CACrB,+FAA+F,EAC/F;AAAElH,MAAAA,KAAK,EAAEiH,UAAAA;AAAW,KACtB,CAAC,CAAA;AACH,GAAA;EAEA,MAAMxD,QAAQ,GAAG,MAAM7E,WAAW,CAACQ,GAAG,CAAuB,CAAA,EAAEiB,WAAY,CAAA,SAAA,CAAU,CAAC,CAAA;EAEtF,IAAI,CAACoD,QAAQ,EAAE;AACb,IAAA,OAAO,IAAIyD,YAAY,CAAC,8DAA8D,EAAE;AAAElH,MAAAA,KAAK,EAAEiH,UAAAA;AAAW,KAAC,CAAC,CAAA;AAChH,GAAA;EAEA,MAAMtH,MAAM,GAAGkG,SAAS,CAAC;IAAEpH,KAAK;AAAEC,IAAAA,MAAAA;AAAO,GAAC,CAAE,CAAA;EAC5C,MAAMmF,KAAK,GAAG,MAAMjF,WAAW,CAACQ,GAAG,CAAmBO,MAAM,CAAC,CAAA;EAE7D,IAAI,CAACkE,KAAK,EAAE;AACV,IAAA,OAAO,IAAIqD,YAAY,CAAE,CAAavH,WAAAA,EAAAA,MAAO,sBAAqB,EAAE;AAAEK,MAAAA,KAAK,EAAEiH,UAAAA;AAAW,KAAC,CAAC,CAAA;AAC5F,GAAA;AAEA,EAAA,MAAMH,SAAS,GAAG/D,YAAY,CAACC,IAAI,CAAC,CAAA;AAEpC,EAAA,IAAI+D,YAAY,CAAC;IAAED,SAAS;IAAEjD,KAAK;IAAEhC,cAAc;IAAE,GAAG4B,QAAAA;AAAS,GAAC,CAAC,EAAE;AACnE,IAAA,OAAO,IAAIyD,YAAY,CAAE,CAAavH,WAAAA,EAAAA,MAAO,kDAAiD,EAAE;AAC9FK,MAAAA,KAAK,EAAEiH,UAAAA;AACT,KAAC,CAAC,CAAA;AACJ,GAAA;AAEA,EAAA,IAAIJ,aAAa,CAAC;IAAEC,SAAS;AAAEjD,IAAAA,KAAAA;AAAM,GAAC,CAAC,EAAE;AACvC,IAAA,OAAO,IAAIqD,YAAY,CAAE,CAAavH,WAAAA,EAAAA,MAAO,oDAAmD,EAAE;AAChGK,MAAAA,KAAK,EAAEiH,UAAAA;AACT,KAAC,CAAC,CAAA;AACJ,GAAA;AAEA,EAAA,OAAA;AACF,CAAC;;AC9DM,MAAME,sBAAsB,GACjCA,CAME;EACAC,iBAAiB;EACjBC,sBAAsB;EACtBzI,WAAW;EACXwB,OAAO;EACPkH,QAAQ,GAAGC,MAAM,IAAIA,MAAM;AAC3B1F,EAAAA,cAAAA;AACwE,CAAC,KAC3E,OACE2F,MAAc,EACdrJ,IAAmC,EACnCsJ,OAAY,EACZC,IAAwB,KACA;EACxB,MAAM;IAAEC,eAAe;AAAErH,IAAAA,YAAAA;GAAc,GAAG8G,iBAAiB,CAACI,MAAM,EAAErJ,IAAI,EAAEsJ,OAAO,EAAEC,IAAI,CAAC,CAAA;EACxF,MAAMnH,gBAAgB,GAAG8G,sBAAsB,CAACG,MAAM,EAAErJ,IAAI,EAAEsJ,OAAO,EAAEC,IAAI,CAAC,CAAA;AAC5E,EAAA,MAAMrH,WAAW,GAAGsH,eAAe,EAAE,CAAA;AAErC,EAAA,IAAInJ,gBAAgB,CAACL,IAAI,CAAC,EAAE;IAC1B,MAAMyJ,WAAW,GAAG,MAAMZ,cAAc,CAAC7I,IAAI,EAAEuJ,IAAI,EAAE;MACnD9I,WAAW;MACXyB,WAAW;AACXwB,MAAAA,cAAAA;AACF,KAAC,CAAC,CAAA;AAEF,IAAA,IAAI+F,WAAW,EAAE;AACf,MAAA,OAAON,QAAQ,CAAC;AACdzI,QAAAA,KAAK,EAAE,EAAE;QACT2B,MAAM,EAAE,CAACoH,WAAW,CAAC;AACrB5H,QAAAA,KAAK,EAAE,EAAE;AACTyG,QAAAA,QAAQ,EAAE;AACRtB,UAAAA,WAAW,EAAE,KAAK;AAClBF,UAAAA,eAAe,EAAE,KAAA;SAClB;AACD2B,QAAAA,UAAU,EAAE,CAAA;AACd,OAAC,CAAC,CAAA;AACJ,KAAA;AAEA,IAAA,OAAOU,QAAQ,CACb,MAAMd,iBAAiB,CAACrI,IAAI,EAAE;MAC5BS,WAAW;MACXwB,OAAO;MACPC,WAAW;MACXC,YAAY;MACZC,gBAAgB;AAChBsB,MAAAA,cAAAA;AACF,KAAC,CACH,CAAC,CAAA;AACH,GAAA;EAEA,IAAI,MAAMjD,WAAW,CAACL,GAAG,CAAE,CAAE8B,EAAAA,WAAY,CAAU,SAAA,CAAA,CAAC,EAAE;AACpD,IAAA,OAAOiH,QAAQ,CACb,MAAMd,iBAAiB,CAACrI,IAAI,EAAE;MAC5BS,WAAW;MACXwB,OAAO;MACPC,WAAW;MACXC,YAAY;MACZC,gBAAgB;AAChBsB,MAAAA,cAAAA;AACF,KAAC,CACH,CAAC,CAAA;AACH,GAAA;AAEA,EAAA,MAAM3B,oBAAoB,CAAyB,CAAC,CAAC,CAAC,EAAE;IACtDtB,WAAW;IACXwB,OAAO;IACPC,WAAW;IACXC,YAAY;AACZC,IAAAA,gBAAAA;AACF,GAAC,CAAC,CAAA;AAEF,EAAA,OAAO+G,QAAQ,CACb,MAAMd,iBAAiB,CAACrI,IAAI,EAAE;IAC5BS,WAAW;IACXwB,OAAO;IACPC,WAAW;IACXC,YAAY;IACZC,gBAAgB;AAChBsB,IAAAA,cAAAA;AACF,GAAC,CACH,CAAC,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"index.mjs","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","removeConnectionInputOptions","args","pickBy","_value","key","has","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","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","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"],"mappings":"4IAEA,MAAMA,EAAyB,IAAIC,IAAI,CAAC,QAAS,SAAU,QAAS,SAEvDC,EAAkDC,GAC7DC,EAAOD,GAAM,CAACE,EAAQC,KAASN,EAAuBO,IAAID,KCS/CE,EAAuBC,MAClCC,GACEC,cAAaC,UAASC,cAAaC,eAAcC,uBAEnD,MAAMC,EAAkB,GAElBC,QAAoBC,QAAQC,IAChCT,EAAMU,KAAIX,UACR,MACEY,KAAMC,EACNN,OAAQO,EACRC,QAASC,SACDV,EAAiB,CACzBW,SAGF,GAAIJ,IAAmBC,GAAkBI,OAAQ,CAC/C,MAAMC,GC7BYC,ED6BMjB,EAAQiB,MAAMP,GC7BLQ,ED6BsBC,GAAQjB,EAAaiB,EAAKC,IC5BvFH,EAAMT,KAAIW,IAAS,CAAEE,OAAQH,EAAWC,GAAOA,YDuCzC,YE9BoBtB,OAC1BE,GACEiB,QAAOM,QAAOV,UAASE,OAAMS,aAAYC,mBAE3C,MAAMC,EAAeb,EAAQc,IAAI,iBAC3BC,EAAUF,EAAe,CAAEG,aAAc,CAAEH,sBAAmBI,QAE9DvB,QAAQC,IACZS,EAAMR,KAAIX,OAASwB,SAAQF,QAAQW,IAAU/B,EAAYgC,IAAIV,EAAQ,CAAEC,QAAOQ,QAAOX,OAAML,QAAQa,YAG/F5B,EAAYgC,IAAK,GAAET,aAAkB,CAAEC,aAAYC,gBAAgBG,EAAQ,EFUrEK,CAAajC,EAAa,CAC9BiB,QACAM,MAAOrB,EACPW,QAASC,EACTC,OACAS,WAAYvB,EAAQuB,WAAWb,GAC/Bc,aAAcxB,EAAQwB,aAAad,KAG9B,CAAEM,QAAOiB,WAAYnB,EAC9B,CCzCmBoB,IAACjB,EAAeC,ED+CnC,OAJIP,GAAkBI,QACpBX,EAAO+B,QAAQxB,GAGV,CAAEK,MAAO,GAAIiB,WAAYnB,EAAM,KAI1C,MAAO,CAAET,cAAaD,SAAQ,EGnDnBgC,EAAgB/B,GAC3BA,EAAYgC,QAAe,CAACrB,EAAOsB,IAAe,IAAItB,KAAUsB,EAAWtB,QAAQ,ICDxEuB,EAAgBvB,GAAkBA,EAAMR,KAAIgC,GAAQA,EAAKrB,OCOzDsB,EAAwBA,CACnCC,GACEC,WAAUC,iBAAgBC,gBAErBH,EAAkBL,QAAsB,CAACS,EAASC,EAAiBjB,KACxE,MAAMkB,ECP8BC,GAAGC,YAAWL,gBACtC,IAAdK,EAAkBL,EAAWM,SAAW,EDMRF,CAAyB,CAAEC,UAAWpB,EAAOe,eAErEO,ECC4BC,GAAGV,WAAUO,YAAWN,iBAAgBU,sBAC5EJ,IAAcI,EAAmB,EAAIX,EAASQ,SAAWP,EAAiB,EDF5CS,CAAuB,CACjDV,WACAO,UAAWpB,EACXc,iBACAU,iBAAkBZ,EAAkB3B,SAGhCV,EAAc0C,EAAgB/B,MAAMuC,MAAMP,EAAuBI,EAAsB,GAE7F,OADAN,EAAQX,KAAK,CAAEnB,MAAOX,EAAa4B,WAAYc,EAAgBd,aACxDa,CAAO,GACb,IExBQU,EAAkBxC,GAAkBA,EAAM,IAAIK,OAE9CoC,EAAgBzC,IAC3B,MAAM0C,EAAW1C,EAAMA,EAAMD,OAAS,GACtC,OAAO2C,GAAUrC,MAAM,ECJZsC,EAAgBC,GAA8BA,EAAO,WAAa,UCGlEC,EAAaA,EAAG/C,OAAMS,gBAAyBT,IAASS,ECexDuC,EAA0BA,CACrCvE,GACEoD,WAAUoB,OAASjD,QAAQkD,WAAUpB,iBAAgBC,iBAEvD,MAAMoB,ECT0BC,EAChC3E,GACEuB,OAAM8B,iBAAgBC,iBAExB,GAAgC,YAA5Bc,EAAapE,EAAKqE,OAAuBf,EAAWsB,UAAY,EAClE,OAAOrD,EAGT,MAAMmD,EAAkBnD,EAAOsD,KAAKC,KAAKD,KAAKE,IAAIzB,EAAWsB,UAAYvB,GACzE,OAAOqB,GAAmB,EAAI,EAAIA,CAAe,EDAzBC,CAAmB3E,EAAM,CAAEuB,OAAM8B,iBAAgBC,eACnE0B,ECEwBC,EAC9BjF,GACEoD,WAAUqB,UAAYzC,cAAcT,OAAM8B,qBAE5C,MAAM6B,EAAiB7B,EAAiB,EAExC,GAC8B,aAA5Be,EAAapE,EAAKqE,OAClBC,EAAW,CAAE/C,OAAMS,gBACnBoB,EAASwB,UAAYM,EAErB,OAAO3D,EAGT,MAAMyD,EAAgBzD,EAAOsD,KAAKC,MAAM1B,EAASwB,SAAWM,GAAkB7B,GAC9E,OAAO2B,GAAiBhD,EAAaA,EAAagD,CAAa,EDjBzCC,CAAiBjF,EAAM,CAAEoD,WAAUqB,WAAUlD,OAAM8B,mBAEzE,OAAIqB,IAAoBM,EACf,CAACzD,GAGH,IAAI4D,EAAMT,EAAiBM,GAAgBA,EAAc,EE7BrDI,EAAWA,EAAGC,QAAOhB,UAAmCgB,GAAShB,ECAjEiB,EAAuBA,EAAGjC,iBAAgBpB,kBCGnBsD,GAAGlC,iBAAgBpB,mBACrD,MAAMuD,EAAYvD,EAAeoB,EACjC,OAAqB,IAAdmC,EAAkBnC,EAAiBmC,CAAS,EDJnDD,CAAqB,CAAElC,iBAAgBpB,iBAAkB,EEa9CwD,EAAkBA,EAAGtC,oBAAmBG,gBAClDoC,EAASvC,EAAkB,IAAIT,aAAoD,IAArCS,EAAkB,IAAIT,YAAqBY,EAAWM,SAAW,EAErG+B,EAAcA,EACzBxC,oBACAC,WACAqB,UAAYzC,aAAYC,gBACxBoB,oBAECqC,EAASvC,EAAkBA,EAAkB3B,OAAS,IAAIkB,aACzDS,EAAkBA,EAAkB3B,OAAS,IAAIkB,aAAeV,GAClEoB,EAASQ,SAAW0B,EAAqB,CAAEjC,iBAAgBpB,iBCnBhD2D,EAA4BtF,MAAOE,GAAqBE,cAAagC,iBAChF,MAAMmD,QAAEA,EAAOpB,SAAEA,SAAmBjE,EAAYsF,OAAyB,CACvEC,cAAe,CACb,CAAEC,WAAYtD,EAAYuD,SAAU,QACpC,CAAED,WAAYtF,EAAauF,SAAU,YAIzC,MAAO,CACLxE,MAAOoE,EAAQ/C,QAAe,CAACoD,GAAS/F,GAAOoC,QAAOX,YAChD6C,EAASlC,IAAQ4D,aAAaC,aAChCF,EAAO3D,GAAS,CAAET,OAAQ3B,EAAKyB,SAG1BsE,IACN,IACHxD,aACD,ECvBU2D,EAAYA,EAAGC,QAAOC,YAAqCA,GAAUD,ECarEE,EAAgBlG,MAC3BN,EACAyE,GACEjE,cAAa6C,qBAEf,MAAMvB,EAASuE,EAAUrG,GAEzB,GAAI8B,EAAQ,CACV,MAAM2E,QAAyBjG,EAAY2B,IAAsBL,GAEjE,GAAI2E,EACF,OAAOA,CAEX,CAEA,MCrBuBC,EACvB1G,GACEyE,UAAYzC,aAAYC,gBAAgBoB,oBAEV,aAA5Be,EAAapE,EAAKqE,MACb,CAAE9B,MAAO+C,EAAqB,CAAEjC,iBAAgBpB,iBAAkB,EAAGV,KAAMS,GAG7E,CAAEO,OAAQ,EAAGhB,KAAM,GDanBmF,CAAU1G,EAAM,CAAEyE,WAAUpB,kBAAiB,EEdzCsD,EAA2BrG,MACtCN,GACEQ,cAAaE,cAAa2C,qBAQ5B,MAAMoB,QAAkBjE,EAAY2B,IAA0B,GAAEzB,cAC1D8D,QAAcgC,EAAcxG,EAAMyE,EAAU,CAAEjE,cAAa6C,mBAC3DC,ECfqBsD,EAC3B5G,GACEwE,OAASjC,QAAOhB,QAAQ8B,qBAE1B,MAAMwD,EAAQzB,EAASpF,GAEvB,MAAmC,YAA5BoE,EAAapE,EAAKqE,MACrB,CAAEO,SAAUrC,EAAQ,EAAGqB,SAAUrB,EAAQ,GCpBnBhB,IAA0B,IAATA,EDqBvCuF,CAAYvF,IAASgB,EAAQsE,EAAQ,EACrC,CAAEjC,SAAU,EAAGhB,SAAU,GACzB,MACE,MAAMmD,EAAqBxE,EAAQsE,EAEnC,GAAIE,GAAsB,EACxB,MAAO,CAAEnC,SAAUmC,EAAoBnD,SAAUmD,GAGnD,MAAMC,EAAgCnC,KAAKE,IAAIgC,GAEzCvB,EAAYwB,EAAgC3D,EAElD,MAAO,CAAEuB,SAAUmC,EAAoBnD,SADE,IAAd4B,GAAsBjE,GAF1ByF,EAAgC3D,EAAiB,GAEC,EAA5B,EAAoCA,EAAiBmC,EAEnG,EAZD,EAYI,EDPWoB,CAAc5G,EAAM,CAAEwE,QAAOnB,mBAC1CD,ECSmB6D,EACzBjH,GACEwE,OAASjC,QAAOhB,QAAQkD,UAAYzC,aAAYC,gBAAgBoB,qBAElE,MAAMwD,EAAQzB,EAASpF,GACjBkH,EAAoB5B,EAAqB,CAAEjC,iBAAgBpB,iBAEjE,MAAmC,aAA5BmC,EAAapE,EAAKqE,MACrB,CAAEO,SAAUrC,EAAQ,EAAGqB,SAAUrB,EAAQ,GACzC+B,EAAW,CAAE/C,OAAMS,gBAAiBO,EAAQsE,EAAQK,EACpD,CAAEtC,SAAUsC,EAAmBtD,SAAUsD,GACzC,MACE,MAAMC,EAAmB5E,EAAQsE,EAC3B3B,EAAiB7B,EAAiB,EAExC,GAAI8D,GAAoBjC,EACtB,MAAO,CAAEN,SAAUuC,EAAkBvD,SAAUuD,GAGjD,MAAMC,EAAiCD,EAAmBjC,EAEpDM,EAAY4B,EAAiC/D,EAKnD,MAAO,CAAEuB,SAAUuC,EAAkBvD,SAFrB,IAAd4B,EAAkBN,EAAiB3D,EAJd6F,EAAiC/D,EAIKrB,EAAakF,EAAoB1B,EAAY,EAG3G,EAhBD,EAgBI,EDpCSyB,CAAYjH,EAAM,CAAEwE,QAAOC,WAAUpB,mBAChDgE,EAAmC,GACnCC,EAAuB/C,EAAwBvE,EAAM,CAAEoD,WAAUoB,QAAOC,WAAUpB,iBAAgBC,eAExG,IAAK,MAAMZ,KAAc4E,EACvBD,EAASzE,KAAKgD,EAA0BpF,EAAa,CAAEE,cAAagC,gBAGtE,MAAMS,QAA0BpC,QAAQC,IAAIqG,GACtCE,EGpCiCpE,IAChCA,EAAkBL,QAAiB,CAAC0E,EAAShE,KACb,IAAjCA,EAAgB/B,MAAMD,QACxBgG,EAAQ5E,KAAKY,EAAgBd,YAGxB8E,IACN,IH6BkBC,CAAyBtE,GAE9C,MAAO,CACLrC,YAC0B,IAAxByG,EAAa/F,OACT0B,EAAsBC,EAAmB,CAAEC,WAAUC,iBAAgBC,eACrEH,EACNwC,YAAaA,EAAY,CACvBxC,oBACAC,WACAqB,WACApB,mBAEFoC,gBAAiBA,EAAgB,CAAEtC,oBAAmBG,eACtDoE,QAAS,CAAEC,IAAKvE,EAAUwE,MAAOtE,GACjCiE,eACAtF,aAAcwC,EAASxC,aACxB,EInCU4F,EAAoBvH,MAC/BN,GACEQ,cAAaC,UAASC,cAAaC,eAAcC,mBAAkByC,qBAErE,MAAMvC,YAAEA,EAAW6E,YAAEA,EAAWF,gBAAEA,EAAeiC,QAAEA,EAAOH,aAAEA,EAAYtF,aAAEA,SAClE0E,EAAyB3G,EAAM,CACnCQ,cACAE,cACA2C,mBAGJ,GAA4B,IAAxBkE,EAAa/F,OAAc,CAC7B,MAAMC,EAAQoB,EAAa/B,GAE3B,MAAO,CACLW,QACAZ,OAAQ,GACRa,MAAOsB,EAAavB,GACpBqG,SAAU,CACRC,UAAW7D,EAAazC,GACxBkE,cACAF,kBACAuC,YAAa/D,EAAexC,IAE9BwG,WAAYhG,EAEhB,CAEA,MAAQnB,YAAaoH,EAAkBrH,OAAEA,SAAiBR,EAA6CkH,EAAc,CACnH/G,cACAC,UACAC,cACAC,eACAC,qBAGIuH,EAAoBjF,ECtDIkF,EAACtH,EAA4BoH,IAC3DpH,EAAYgC,QAAsB,CAACqF,EAAmBpF,KACpD,GAAgC,IAA5BA,EAAWtB,MAAMD,OAAc,CACjC,MAAM6G,EAAoBH,EAAmBI,MAAKd,GAAWA,EAAQ9E,aAAeK,EAAWL,aAE/F,GAAI2F,EACF,MAAO,IAAIF,EAAmBE,EAElC,CAEA,MAAO,IAAIF,EAAmBpF,EAAW,GACxC,ID2C6CqF,CAAiBtH,EAAaoH,GAAqB,CACjG9E,SAAUsE,EAAQC,IAClBtE,iBACAC,WAAYoE,EAAQE,QAGhBnG,EAAQoB,EAAasF,GAE3B,MAAO,CACL1G,QACAZ,SACAa,MAAOsB,EAAavB,GACpBqG,SAAU,CACRC,UAAW7D,EAAazC,GACxBkE,cACAF,kBACAuC,YAAa/D,EAAexC,IAE9BwG,WAAYhG,EACb,EE7DUsG,EAAiBjI,OAC1BgG,QAAOC,SAAQlB,QAAOhB,SACtBmE,eACAhI,cAAaE,cAAa2C,qBAE5B,GAAIiD,IAAUjB,IAAUhB,EACtB,OAAO,IAAIoE,EACT,6FACA,CAAE/G,MAAO8G,IAIb,GAAIlC,GAASjC,EACX,OAAO,IAAIoE,EACT,8FACA,CAAE/G,MAAO8G,IAIb,GAAIjC,IAAWlC,IAASgB,EACtB,OAAO,IAAIoD,EACT,6FACA,CAAE/G,MAAO8G,IAIb,GAAIjC,GAAUlB,EACZ,OAAO,IAAIoD,EACT,gGACA,CAAE/G,MAAO8G,IAIb,MAAM/D,QAAiBjE,EAAY2B,IAA0B,GAAEzB,cAE/D,IAAK+D,EACH,OAAO,IAAIgE,EAAa,+DAAgE,CAAE/G,MAAO8G,IAGnG,MAAM1G,EAASuE,EAAU,CAAEC,QAAOC,WAC5B/B,QAAchE,EAAY2B,IAAsBL,GAEtD,IAAK0C,EACH,OAAO,IAAIiE,EAAc,cAAa3G,wBAA8B,CAAEJ,MAAO8G,IAG/E,MAAME,EAAYtE,EAAaC,GAE/B,MCnD0BsE,GAAGD,YAAWlE,OAASjC,QAAOhB,QAAQ8B,iBAAgBrB,aAAYC,kBAC9E,YAAdyG,GAA2BnH,IAASS,GAAcO,IAAU+C,EAAqB,CAAEjC,iBAAgBpB,iBDkD/F0G,CAAa,CAAED,YAAWlE,QAAOnB,oBAAmBoB,IAC/C,IAAIgE,EAAc,cAAa3G,oDAA0D,CAC9FJ,MAAO8G,IEzDgBI,GAAGF,YAAWlE,OAASjC,QAAOhB,WAC3C,aAAdmH,GAAqC,IAATnH,GAAwB,IAAVgB,EF4DtCqG,CAAc,CAAEF,YAAWlE,UACtB,IAAIiE,EAAc,cAAa3G,sDAA4D,CAChGJ,MAAO8G,SAFX,CAMA,EG7DWK,EACXA,EAOEC,oBACAC,yBACAvI,cACAC,UACAuI,WAAWC,IAAUA,GACrB5F,oBAEF/C,MACE4I,EACAlJ,EACAmJ,EACAC,KAEA,MAAMC,gBAAEA,EAAe1I,aAAEA,GAAiBmI,EAAkBI,EAAQlJ,EAAMmJ,EAASC,GAC7ExI,EAAmBmI,EAAuBG,EAAQlJ,EAAMmJ,EAASC,GACjE1I,EAAc2I,IAEpB,GCnC4BC,GAAGhD,QAAOC,eAAsDD,GAASC,GDmCjG+C,CAAiBtJ,GAAO,CAC1B,MAAMuJ,QAAoBhB,EAAevI,EAAMoJ,EAAM,CACnD5I,cACAE,cACA2C,mBAGF,OACS2F,EADLO,EACc,CACd9H,MAAO,GACPZ,OAAQ,CAAC0I,GACT7H,MAAO,GACPoG,SAAU,CACRnC,aAAa,EACbF,iBAAiB,GAEnBwC,WAAY,SAKRJ,EAAkB7H,EAAM,CAC5BQ,cACAC,UACAC,cACAC,eACAC,mBACAyC,mBAGN,CAEA,aAAU7C,EAAYJ,IAAK,GAAEM,qBAavBL,EAA6C,CAAC,GAAI,CACtDG,cACAC,UACAC,cACAC,eACAC,qBAjBOoI,QACCnB,EAAkB7H,EAAM,CAC5BQ,cACAC,UACAC,cACAC,eACAC,mBACAyC,mBAsBL"}
@@ -0,0 +1,314 @@
1
+ -----------------------------
2
+ Rollup File Analysis
3
+ -----------------------------
4
+ bundle size: 16.339 KB
5
+ original size: 26.514 KB
6
+ code reduction: 38.38 %
7
+ module count: 33
8
+
9
+ ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
10
+ file: /src/helpers/getStartAndEndIndexes.ts
11
+ bundle space: 13.33 %
12
+ rendered size: 2.178 KB
13
+ original size: 2.753 KB
14
+ code reduction: 20.89 %
15
+ dependents: 1
16
+ - /src/helpers/retrieveCachedConnection.ts
17
+
18
+ █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
19
+ file: /src/helpers/validateCursor.ts
20
+ bundle space: 11.2 %
21
+ rendered size: 1.83 KB
22
+ original size: 2.422 KB
23
+ code reduction: 24.44 %
24
+ dependents: 1
25
+ - /src/main/index.ts
26
+
27
+ ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
28
+ file: /src/main/index.ts
29
+ bundle space: 9.47 %
30
+ rendered size: 1.548 KB
31
+ original size: 2.663 KB
32
+ code reduction: 41.87 %
33
+ dependents: 1
34
+ - /src/index.ts
35
+
36
+ ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
37
+ file: /src/helpers/retrieveCachedConnection.ts
38
+ bundle space: 8.61 %
39
+ rendered size: 1.406 KB
40
+ original size: 2.459 KB
41
+ code reduction: 42.82 %
42
+ dependents: 1
43
+ - /src/helpers/resolveConnection.ts
44
+
45
+ ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
46
+ file: /src/helpers/resolveConnection.ts
47
+ bundle space: 8.54 %
48
+ rendered size: 1.396 KB
49
+ original size: 2.482 KB
50
+ code reduction: 43.76 %
51
+ dependents: 1
52
+ - /src/main/index.ts
53
+
54
+ ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
55
+ file: /src/helpers/requestAndCachePages.ts
56
+ bundle space: 6.39 %
57
+ rendered size: 1.044 KB
58
+ original size: 1.716 KB
59
+ code reduction: 39.16 %
60
+ dependents: 2
61
+ - /src/helpers/resolveConnection.ts
62
+ - /src/main/index.ts
63
+
64
+ ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
65
+ file: /src/helpers/getStartAndEndPageNumbers.ts
66
+ bundle space: 4.93 %
67
+ rendered size: 805 Bytes
68
+ original size: 1.365 KB
69
+ code reduction: 41.03 %
70
+ dependents: 1
71
+ - /src/helpers/getPageNumbersToRequest.ts
72
+
73
+ ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
74
+ file: /src/helpers/getInRangeCachedEdges.ts
75
+ bundle space: 4.24 %
76
+ rendered size: 693 Bytes
77
+ original size: 978 Bytes
78
+ code reduction: 29.14 %
79
+ dependents: 2
80
+ - /src/helpers/retrieveCachedConnection.ts
81
+ - /src/helpers/resolveConnection.ts
82
+
83
+ █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
84
+ file: /src/helpers/retrieveCachedEdgesByPage.ts
85
+ bundle space: 3.65 %
86
+ rendered size: 596 Bytes
87
+ original size: 760 Bytes
88
+ code reduction: 21.58 %
89
+ dependents: 1
90
+ - /src/helpers/retrieveCachedConnection.ts
91
+
92
+ █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
93
+ file: /src/helpers/hasPreviousNextPage.ts
94
+ bundle space: 3.31 %
95
+ rendered size: 541 Bytes
96
+ original size: 1.044 KB
97
+ code reduction: 48.18 %
98
+ dependents: 1
99
+ - /src/helpers/retrieveCachedConnection.ts
100
+
101
+ █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
102
+ file: /src/helpers/cacheCursors.ts
103
+ bundle space: 3.2 %
104
+ rendered size: 523 Bytes
105
+ original size: 724 Bytes
106
+ code reduction: 27.76 %
107
+ dependents: 1
108
+ - /src/helpers/requestAndCachePages.ts
109
+
110
+ █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
111
+ file: /src/helpers/getPageNumbersToRequest.ts
112
+ bundle space: 2.94 %
113
+ rendered size: 481 Bytes
114
+ original size: 992 Bytes
115
+ code reduction: 51.51 %
116
+ dependents: 1
117
+ - /src/helpers/retrieveCachedConnection.ts
118
+
119
+ █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
120
+ file: /src/helpers/mergeCachedEdges.ts
121
+ bundle space: 2.55 %
122
+ rendered size: 416 Bytes
123
+ original size: 538 Bytes
124
+ code reduction: 22.68 %
125
+ dependents: 1
126
+ - /src/helpers/resolveConnection.ts
127
+
128
+ █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
129
+ file: /src/helpers/makeEntry.ts
130
+ bundle space: 2.07 %
131
+ rendered size: 339 Bytes
132
+ original size: 614 Bytes
133
+ code reduction: 44.79 %
134
+ dependents: 1
135
+ - /src/helpers/retrieveEntry.ts
136
+
137
+ █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
138
+ file: /src/helpers/retrieveEntry.ts
139
+ bundle space: 2.04 %
140
+ rendered size: 334 Bytes
141
+ original size: 785 Bytes
142
+ code reduction: 57.45 %
143
+ dependents: 1
144
+ - /src/helpers/retrieveCachedConnection.ts
145
+
146
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
147
+ file: /src/helpers/getCurrentPageStartAndEndIndexes.ts
148
+ bundle space: 1.77 %
149
+ rendered size: 289 Bytes
150
+ original size: 592 Bytes
151
+ code reduction: 51.18 %
152
+ dependents: 1
153
+ - /src/helpers/getInRangeCachedEdges.ts
154
+
155
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
156
+ file: /src/helpers/getPagesMissingFromCache.ts
157
+ bundle space: 1.55 %
158
+ rendered size: 254 Bytes
159
+ original size: 339 Bytes
160
+ code reduction: 25.07 %
161
+ dependents: 1
162
+ - /src/helpers/retrieveCachedConnection.ts
163
+
164
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
165
+ file: /src/helpers/isCursorLast.ts
166
+ bundle space: 1.5 %
167
+ rendered size: 245 Bytes
168
+ original size: 525 Bytes
169
+ code reduction: 53.33 %
170
+ dependents: 1
171
+ - /src/helpers/validateCursor.ts
172
+
173
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
174
+ file: /src/helpers/removeConnectionInputOptions.ts
175
+ bundle space: 1.14 %
176
+ rendered size: 187 Bytes
177
+ original size: 258 Bytes
178
+ code reduction: 27.52 %
179
+ dependents: 1
180
+ - /src/index.ts
181
+
182
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
183
+ file: /src/helpers/getResultsOnLastPage.ts
184
+ bundle space: 1.11 %
185
+ rendered size: 181 Bytes
186
+ original size: 270 Bytes
187
+ code reduction: 32.96 %
188
+ dependents: 1
189
+ - /src/helpers/getIndexesOnLastPage.ts
190
+
191
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
192
+ file: /src/helpers/getStartAndEndCursors.ts
193
+ bundle space: 0.95 %
194
+ rendered size: 155 Bytes
195
+ original size: 233 Bytes
196
+ code reduction: 33.48 %
197
+ dependents: 1
198
+ - /src/helpers/resolveConnection.ts
199
+
200
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
201
+ file: /src/helpers/getIndexesOnLastPage.ts
202
+ bundle space: 0.82 %
203
+ rendered size: 134 Bytes
204
+ original size: 224 Bytes
205
+ code reduction: 40.18 %
206
+ dependents: 4
207
+ - /src/helpers/getStartAndEndIndexes.ts
208
+ - /src/helpers/hasPreviousNextPage.ts
209
+ - /src/helpers/makeEntry.ts
210
+ - /src/helpers/isCursorLast.ts
211
+
212
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
213
+ file: /src/helpers/isCursorFirst.ts
214
+ bundle space: 0.81 %
215
+ rendered size: 133 Bytes
216
+ original size: 285 Bytes
217
+ code reduction: 53.33 %
218
+ dependents: 1
219
+ - /src/helpers/validateCursor.ts
220
+
221
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
222
+ file: /src/helpers/extractEdges.ts
223
+ bundle space: 0.7 %
224
+ rendered size: 115 Bytes
225
+ original size: 210 Bytes
226
+ code reduction: 45.24 %
227
+ dependents: 1
228
+ - /src/helpers/resolveConnection.ts
229
+
230
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
231
+ file: /src/helpers/makeEdges.ts
232
+ bundle space: 0.62 %
233
+ rendered size: 101 Bytes
234
+ original size: 181 Bytes
235
+ code reduction: 44.2 %
236
+ dependents: 1
237
+ - /src/helpers/requestAndCachePages.ts
238
+
239
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
240
+ file: /src/helpers/isCursorSupplied.ts
241
+ bundle space: 0.44 %
242
+ rendered size: 72 Bytes
243
+ original size: 228 Bytes
244
+ code reduction: 68.42 %
245
+ dependents: 1
246
+ - /src/main/index.ts
247
+
248
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
249
+ file: /src/helpers/isLastPage.ts
250
+ bundle space: 0.42 %
251
+ rendered size: 69 Bytes
252
+ original size: 146 Bytes
253
+ code reduction: 52.74 %
254
+ dependents: 2
255
+ - /src/helpers/getStartAndEndPageNumbers.ts
256
+ - /src/helpers/getStartAndEndIndexes.ts
257
+
258
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
259
+ file: /src/helpers/getCursor.ts
260
+ bundle space: 0.37 %
261
+ rendered size: 61 Bytes
262
+ original size: 149 Bytes
263
+ code reduction: 59.06 %
264
+ dependents: 2
265
+ - /src/helpers/retrieveEntry.ts
266
+ - /src/helpers/validateCursor.ts
267
+
268
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
269
+ file: /src/helpers/extractNodes.ts
270
+ bundle space: 0.36 %
271
+ rendered size: 59 Bytes
272
+ original size: 119 Bytes
273
+ code reduction: 50.42 %
274
+ dependents: 1
275
+ - /src/helpers/resolveConnection.ts
276
+
277
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
278
+ file: /src/helpers/getDirection.ts
279
+ bundle space: 0.36 %
280
+ rendered size: 59 Bytes
281
+ original size: 138 Bytes
282
+ code reduction: 57.25 %
283
+ dependents: 4
284
+ - /src/helpers/getStartAndEndPageNumbers.ts
285
+ - /src/helpers/getStartAndEndIndexes.ts
286
+ - /src/helpers/makeEntry.ts
287
+ - /src/helpers/validateCursor.ts
288
+
289
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
290
+ file: /src/helpers/getCount.ts
291
+ bundle space: 0.34 %
292
+ rendered size: 56 Bytes
293
+ original size: 145 Bytes
294
+ code reduction: 61.38 %
295
+ dependents: 1
296
+ - /src/helpers/getStartAndEndIndexes.ts
297
+
298
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
299
+ file: /src/helpers/isFirstPage.ts
300
+ bundle space: 0.24 %
301
+ rendered size: 39 Bytes
302
+ original size: 57 Bytes
303
+ code reduction: 31.58 %
304
+ dependents: 1
305
+ - /src/helpers/getStartAndEndIndexes.ts
306
+
307
+ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
308
+ file: /src/index.ts
309
+ bundle space: 0 %
310
+ rendered size: 0 Byte
311
+ original size: 120 Bytes
312
+ code reduction: 100 %
313
+ dependents: 0
314
+