@graphql-box/cache-manager 5.4.11 → 5.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/LICENSE +1 -1
  2. package/dist/cjs/index.cjs +1 -1
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/esm/index.mjs +1 -1
  5. package/dist/esm/index.mjs.map +1 -1
  6. package/dist/production.analysis.txt +49 -49
  7. package/dist/types/cjs/debug/logCacheEntry.d.cts.map +1 -1
  8. package/dist/types/cjs/debug/logCacheQuery.d.cts.map +1 -1
  9. package/dist/types/cjs/debug/logPartialCompiled.d.cts.map +1 -1
  10. package/dist/types/cjs/helpers/isFirstResponseChunk.d.cts.map +1 -1
  11. package/dist/types/cjs/helpers/isLastResponseChunk.d.cts.map +1 -1
  12. package/dist/types/cjs/helpers/isNotLastResponseChunk.d.cts.map +1 -1
  13. package/dist/types/cjs/helpers/isNotResponseChunk.d.cts.map +1 -1
  14. package/dist/types/cjs/main.d.cts.map +1 -1
  15. package/dist/types/esm/debug/logCacheEntry.d.ts.map +1 -1
  16. package/dist/types/esm/debug/logCacheQuery.d.ts.map +1 -1
  17. package/dist/types/esm/debug/logPartialCompiled.d.ts.map +1 -1
  18. package/dist/types/esm/helpers/isFirstResponseChunk.d.ts.map +1 -1
  19. package/dist/types/esm/helpers/isLastResponseChunk.d.ts.map +1 -1
  20. package/dist/types/esm/helpers/isNotLastResponseChunk.d.ts.map +1 -1
  21. package/dist/types/esm/helpers/isNotResponseChunk.d.ts.map +1 -1
  22. package/dist/types/esm/main.d.ts.map +1 -1
  23. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  24. package/package.json +5 -5
  25. package/src/__snapshots__/index.test.ts.snap +10 -10
  26. package/src/debug/logCacheEntry.ts +9 -12
  27. package/src/debug/logCacheQuery.ts +8 -11
  28. package/src/debug/logPartialCompiled.ts +2 -5
  29. package/src/helpers/filterQuery.ts +4 -4
  30. package/src/helpers/isFirstResponseChunk.ts +1 -1
  31. package/src/helpers/isLastResponseChunk.ts +1 -1
  32. package/src/helpers/isNotLastResponseChunk.ts +1 -1
  33. package/src/helpers/isNotResponseChunk.ts +1 -1
  34. package/src/helpers/normalizePatchResponseData.ts +1 -1
  35. package/src/index.test.ts +45 -20
  36. package/src/main.ts +25 -22
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../cache-manager/src//constants.ts","../cache-manager/src//helpers/areOnlyPopulatedFieldsTypeIdKeys.ts","../cache-manager/src//helpers/cacheTiersEnabled.ts","../cache-manager/src//helpers/mergeObjects.ts","../cache-manager/src//helpers/combineData.ts","../cache-manager/src//helpers/createEntityDataKey.ts","../cache-manager/src//helpers/deriveOpCacheability.ts","../cache-manager/src//helpers/isFieldEntity.ts","../cache-manager/src//helpers/filterOutPropsWithEntityArgsOrDirectives.ts","../cache-manager/src//helpers/filterOutPropsWithEntityOrArgs.ts","../cache-manager/src//helpers/checkFieldPathChecklist.ts","../cache-manager/src//helpers/filterField.ts","../cache-manager/src//helpers/filterFragmentSpreads.ts","../cache-manager/src//helpers/filterInlineFragments.ts","../cache-manager/src//helpers/filterIDsAndTypeNames.ts","../cache-manager/src//helpers/filterQuery.ts","../cache-manager/src//helpers/createFragmentSpreadChecklist.ts","../cache-manager/src//helpers/filterFragmentDefinitions.ts","../cache-manager/src//helpers/getDataValue.ts","../cache-manager/src//helpers/hasTypename.ts","../cache-manager/src//main.ts","../cache-manager/src//helpers/normalizePatchResponseData.ts","../cache-manager/src//helpers/isNotLastResponseChunk.ts","../cache-manager/src//helpers/isLastResponseChunk.ts","../cache-manager/src//helpers/isNotResponseChunk.ts","../cache-manager/src//helpers/validTypeIdValue.ts","../cache-manager/src//helpers/mergeResponseDataSets.ts","../cache-manager/src//debug/logCacheQuery.ts","../cache-manager/src//debug/logCacheEntry.ts","../cache-manager/src//debug/logPartialCompiled.ts"],"sourcesContent":["export const METADATA = 'metadata';\nexport const CACHE_CONTROL = 'cacheControl';\nexport const NO_CACHE = 'noCache';\n\nexport const HEADER_CACHE_CONTROL = 'cache-control';\nexport const HEADER_NO_CACHE = 'no-cache';\n","import { type PlainData } from '@graphql-box/core';\nimport { isArray, isPlainObject } from '@graphql-box/helpers';\nimport { isNumber, isString } from 'lodash-es';\n\nconst checkValue = (value: unknown, typeIDKey: string): boolean => {\n if (isArray(value)) {\n return value.reduce<boolean>((acc, entry) => {\n if (!acc) {\n return false;\n }\n\n return checkValue(entry, typeIDKey);\n }, true);\n }\n\n if (isPlainObject(value)) {\n return recursivelyCheckProps(value, typeIDKey);\n }\n\n return false;\n};\n\nconst recursivelyCheckProps = (data: PlainData, typeIDKey: string): boolean => {\n const keys = isPlainObject(data) ? Object.keys(data) : [...data.keys()];\n\n if (keys.length === 1 && isPlainObject(data) && !!data[typeIDKey]) {\n return true;\n }\n\n return keys.reduce<boolean>((acc, key) => {\n if (!acc) {\n return false;\n }\n\n if (isNumber(key) && isArray(data)) {\n return checkValue(data[key], typeIDKey);\n } else if (isString(key) && isPlainObject(data)) {\n return checkValue(data[key], typeIDKey);\n }\n\n return acc;\n }, true);\n};\n\nexport const areOnlyPopulatedFieldsTypeIdKeys = (data: PlainData, typeIDKey: string) => {\n return recursivelyCheckProps(data, typeIDKey);\n};\n","import { type CacheTiersEnabled } from '../types.ts';\n\nexport const allCacheTiersDisabled = ({ entity, queryResponse, requestPath }: CacheTiersEnabled) =>\n !entity && !queryResponse && !requestPath;\n\nexport const entityCacheTierEnabled = (tiersEnabled: CacheTiersEnabled) => !!tiersEnabled.entity;\n\nexport const entityOrRequestPathCacheTiersEnabled = ({ entity, requestPath }: CacheTiersEnabled) =>\n !!(entity ?? requestPath);\n\nexport const queryResponseCacheTierEnabled = (tiersEnabled: CacheTiersEnabled) => !!tiersEnabled.queryResponse;\n\nexport const requestPathCacheTierEnabled = (tiersEnabled: CacheTiersEnabled) => !!tiersEnabled.requestPath;\n\nexport const someCacheTiersEnabled = (tiersEnabled: CacheTiersEnabled) => !allCacheTiersDisabled(tiersEnabled);\n","import { isPlainObject, mergeObjects } from '@graphql-box/helpers';\n\nexport const mergeDataSets = <T extends object>(obj: T, source: T, typeIDKey: string): T => {\n return mergeObjects<T>(obj, source, (_key: string, value: unknown): string | number | undefined => {\n // Casting of ease of typing\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return isPlainObject(value) && value[typeIDKey] ? (value[typeIDKey] as string | number) : undefined;\n });\n};\n","import { isObjectLike } from '@graphql-box/helpers';\nimport { mergeDataSets } from './mergeObjects.ts';\n\nexport const combineDataSets = (dataSetA: unknown, dataSetB: unknown, typeIDKey: string) => {\n if (!dataSetA && dataSetB) {\n return dataSetB;\n }\n\n if (isObjectLike(dataSetA) && isObjectLike(dataSetB)) {\n return mergeDataSets(dataSetA, dataSetB, typeIDKey);\n }\n\n return dataSetA;\n};\n","import { type EntityData, type FieldTypeInfo } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const createEntityDataKey = (\n fieldData: EntityData,\n fieldTypeInfo: FieldTypeInfo,\n context: CacheManagerContext,\n) => {\n const fieldTypeName = fieldTypeInfo.isEntity ? fieldTypeInfo.typeName : fieldData.__typename;\n // In context, context.typeIDKey is never gonna be undefined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return `${fieldTypeName}::${String(fieldData[context.typeIDKey!])}`;\n};\n","import { type DehydratedCacheMetadata } from '@graphql-box/core';\nimport { Cacheability } from 'cacheability';\nimport { isEmpty } from 'lodash-es';\nimport { HEADER_CACHE_CONTROL } from '../constants.ts';\n\nexport type Params = {\n _cacheMetadata?: DehydratedCacheMetadata;\n fallback: string;\n headers?: Headers;\n};\n\nexport const deriveOpCacheability = ({ _cacheMetadata, fallback, headers }: Params): Cacheability => {\n if (_cacheMetadata && !isEmpty(_cacheMetadata)) {\n const [first, ...rest] = Object.values(_cacheMetadata);\n\n return new Cacheability({\n metadata: rest.reduce((acc, metadata) => {\n if (!acc) {\n return metadata;\n }\n\n if (metadata.ttl < acc.ttl) {\n return metadata;\n }\n\n return acc;\n }, first),\n });\n }\n\n if (headers?.has(HEADER_CACHE_CONTROL)) {\n return new Cacheability({ headers });\n }\n\n return new Cacheability({ cacheControl: fallback });\n};\n","import { type EntityData, type FieldTypeInfo } from '@graphql-box/core';\nimport { isPlainObject } from '@graphql-box/helpers';\n\nexport const isFieldEntity = (\n fieldData: unknown,\n fieldTypeInfo: FieldTypeInfo | undefined,\n typeIDKey: string,\n): fieldData is EntityData => {\n if (!isPlainObject(fieldData) || !(typeIDKey in fieldData)) {\n return false;\n }\n\n const { isEntity = false, possibleTypes = [] } = fieldTypeInfo ?? {};\n\n if (isEntity) {\n return true;\n }\n\n if (possibleTypes.length === 0) {\n return false;\n }\n\n return possibleTypes.some(type => type.typeName === fieldData.__typename);\n};\n","import { type PlainObject } from '@graphql-box/core';\nimport {\n type KeysAndPaths,\n buildFieldKeysAndPaths,\n getName,\n isPlainObject,\n resolveFragments,\n} from '@graphql-box/helpers';\nimport { type FieldNode } from 'graphql';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\nimport { isFieldEntity } from './isFieldEntity.ts';\n\nexport const filterOutPropsWithEntityArgsOrDirectives = (\n fieldData: unknown,\n field: FieldNode,\n ancestorKeysAndPaths: KeysAndPaths,\n context: CacheManagerContext,\n) => {\n if (!isPlainObject(fieldData)) {\n return fieldData;\n }\n\n const fieldAndTypeName = resolveFragments(field.selectionSet?.selections, context.fragmentDefinitions);\n\n return keys(fieldData).reduce<PlainObject>((acc, key) => {\n const match = fieldAndTypeName.find(({ fieldNode }) => getName(fieldNode) === key);\n\n if (match) {\n const keysAndPaths = buildFieldKeysAndPaths(match.fieldNode, ancestorKeysAndPaths, context);\n const fieldTypeInfo = context.fieldTypeMap.get(keysAndPaths.requestFieldPath);\n\n if (\n // In this context, typeIDKey cannot be undefined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n isFieldEntity(fieldData[key], fieldTypeInfo, context.typeIDKey!) ||\n fieldTypeInfo?.hasArguments ||\n fieldTypeInfo?.hasDirectives\n ) {\n // In this context, this is safe\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete fieldData[key];\n }\n }\n\n return acc;\n }, fieldData);\n};\n","import { type EntityData } from '@graphql-box/core';\nimport { type KeysAndPaths, buildFieldKeysAndPaths, getName, resolveFragments } from '@graphql-box/helpers';\nimport { type FieldNode } from 'graphql';\nimport { type CacheManagerContext } from '../types.ts';\nimport { isFieldEntity } from './isFieldEntity.ts';\n\nexport const filterOutPropsWithEntityOrArgs = (\n fieldData: EntityData,\n field: FieldNode,\n ancestorKeysAndPaths: KeysAndPaths,\n context: CacheManagerContext,\n) => {\n const fieldAndTypeName = resolveFragments(field.selectionSet?.selections, context.fragmentDefinitions);\n\n // The data returned will be EntityData\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return Object.keys(fieldData).reduce<Partial<EntityData>>((acc, key) => {\n const match = fieldAndTypeName.find(({ fieldNode }) => getName(fieldNode) === key);\n\n if (match) {\n const { requestFieldPath } = buildFieldKeysAndPaths(match.fieldNode, ancestorKeysAndPaths, context);\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n\n // In this context, typeIDKey will not be undefined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (isFieldEntity(fieldData[key], fieldTypeInfo, context.typeIDKey!) || fieldTypeInfo?.hasArguments) {\n // In this context, this is safe\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete fieldData[key];\n }\n }\n\n return acc;\n }, fieldData) as EntityData;\n};\n","import { type CheckFieldPathChecklistResult, type FieldPathChecklistValue } from '../types.ts';\n\nexport const checkFieldPathChecklist = (\n fieldPathChecklistValues: FieldPathChecklistValue[] | undefined,\n fieldTypeName: string | undefined,\n): CheckFieldPathChecklistResult => {\n if (!fieldPathChecklistValues || fieldPathChecklistValues.length === 0) {\n return { hasData: false, typeUnused: !!fieldTypeName };\n }\n\n const [fieldPathChecklistValue] = fieldPathChecklistValues;\n\n if (fieldPathChecklistValue) {\n const { hasData, typeName } = fieldPathChecklistValue;\n const typeUnused = typeName ? typeName !== fieldTypeName : undefined;\n return { hasData, typeUnused };\n }\n\n return {\n hasData: fieldPathChecklistValues.some(({ hasData, typeName }) => typeName === fieldTypeName && hasData),\n typeUnused: !fieldPathChecklistValues.every(({ typeName }) => typeName === fieldTypeName),\n };\n};\n","import { TYPE_NAME_KEY } from '@graphql-box/core';\nimport {\n buildFieldKeysAndPaths,\n deleteChildFields,\n getChildFields,\n getName,\n hasChildFields,\n} from '@graphql-box/helpers';\nimport { type FieldNode, type FragmentDefinitionNode, Kind, type OperationDefinitionNode } from 'graphql';\nimport { type CacheManagerContext, type FieldPathChecklist, type FragmentSpreadFieldCounter } from '../types.ts';\nimport { checkFieldPathChecklist } from './checkFieldPathChecklist.ts';\nimport { type FragmentSpreadCheckist } from './createFragmentSpreadChecklist.ts';\nimport { filterFragmentSpreads } from './filterFragmentSpreads.ts';\nimport { filterIDsAndTypeNames } from './filterIDsAndTypeNames.ts';\nimport { filterInlineFragments } from './filterInlineFragments.ts';\n\nexport const filterField = (\n field: FieldNode | FragmentDefinitionNode | OperationDefinitionNode,\n fieldPathChecklist: FieldPathChecklist,\n fragmentSpreadChecklist: FragmentSpreadCheckist,\n ancestorRequestFieldPath: string,\n context: CacheManagerContext,\n): boolean => {\n const { fragmentDefinitions, typeIDKey } = context;\n const fieldsAndTypeNames = getChildFields(field, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames) {\n return false;\n }\n\n const fragmentSpreadFieldCounter: FragmentSpreadFieldCounter = {};\n\n for (let index = fieldsAndTypeNames.length - 1; index >= 0; index -= 1) {\n const fieldAndTypeName = fieldsAndTypeNames[index];\n\n if (!fieldAndTypeName) {\n continue;\n }\n\n const { fieldNode: childField, fragmentKind, fragmentName, typeName: childTypeName } = fieldAndTypeName;\n\n if (fragmentKind === Kind.FRAGMENT_SPREAD && fragmentName && !fragmentSpreadFieldCounter[fragmentName]) {\n fragmentSpreadFieldCounter[fragmentName] = {\n hasData: 0,\n total: fragmentDefinitions?.[fragmentName]\n ? (getChildFields(fragmentDefinitions[fragmentName], { fragmentDefinitions })?.length ?? 0)\n : 0,\n };\n }\n\n const childFieldName = getName(childField);\n\n if (childFieldName === typeIDKey || childFieldName === TYPE_NAME_KEY) {\n continue;\n }\n\n const { requestFieldPath } = buildFieldKeysAndPaths(\n childField,\n {\n requestFieldPath: ancestorRequestFieldPath,\n },\n context,\n );\n\n const { hasData, typeUnused } = checkFieldPathChecklist(fieldPathChecklist.get(requestFieldPath), childTypeName);\n\n if (hasData || typeUnused) {\n if (fragmentKind === Kind.FRAGMENT_SPREAD && fragmentName) {\n const counter = fragmentSpreadFieldCounter[fragmentName];\n\n if (counter) {\n counter.hasData += 1;\n }\n } else if (!hasChildFields(childField, { fragmentDefinitions })) {\n deleteChildFields(field, childField);\n } else if (filterField(childField, fieldPathChecklist, fragmentSpreadChecklist, requestFieldPath, context)) {\n deleteChildFields(field, childField);\n }\n }\n }\n\n filterFragmentSpreads(field, fragmentSpreadFieldCounter, fragmentSpreadChecklist, ancestorRequestFieldPath);\n filterInlineFragments(field, context);\n filterIDsAndTypeNames(field, context);\n return !hasChildFields(field, { fragmentDefinitions });\n};\n","import { deleteFragmentSpreads } from '@graphql-box/helpers';\nimport { type FieldNode, type FragmentDefinitionNode, type OperationDefinitionNode } from 'graphql';\nimport { isEmpty } from 'lodash-es';\nimport { type FragmentSpreadFieldCounter } from '../types.ts';\nimport { type FragmentSpreadCheckist } from './createFragmentSpreadChecklist.ts';\n\nexport const filterFragmentSpreads = (\n field: FieldNode | FragmentDefinitionNode | OperationDefinitionNode,\n fragmentSpreadFieldCounter: FragmentSpreadFieldCounter,\n fragmentSpreadChecklist: FragmentSpreadCheckist,\n ancestorRequestFieldPath: string,\n) => {\n if (isEmpty(fragmentSpreadFieldCounter)) {\n return;\n }\n\n for (const [key, value] of Object.entries(fragmentSpreadFieldCounter)) {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n continue;\n }\n\n checklist.paths.push(ancestorRequestFieldPath);\n const { hasData, total } = value;\n\n if (hasData === total) {\n deleteFragmentSpreads(field, key);\n checklist.deleted += 1;\n }\n }\n};\n","import { deleteInlineFragments, getChildFields, getInlineFragments, getName } from '@graphql-box/helpers';\nimport { type FieldNode, type FragmentDefinitionNode, type OperationDefinitionNode } from 'graphql';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const filterInlineFragments = (\n field: FieldNode | FragmentDefinitionNode | OperationDefinitionNode,\n { fragmentDefinitions, typeIDKey }: CacheManagerContext,\n) => {\n const inlineFragments = getInlineFragments(field);\n let filtered = false;\n\n for (const fragment of inlineFragments) {\n const fieldsAndTypeNames = getChildFields(fragment, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames || fieldsAndTypeNames.length === 0) {\n deleteInlineFragments(field, fragment);\n filtered = true;\n continue;\n }\n\n const [fieldAndTypeName] = fieldsAndTypeNames;\n\n if (fieldAndTypeName) {\n const { fieldNode } = fieldAndTypeName;\n\n if (getName(fieldNode) === typeIDKey) {\n deleteInlineFragments(field, fragment);\n filtered = true;\n }\n }\n }\n\n return filtered;\n};\n","import { TYPE_NAME_KEY } from '@graphql-box/core';\nimport { deleteChildFields, getChildFields } from '@graphql-box/helpers';\nimport { type FieldNode, type FragmentDefinitionNode, type OperationDefinitionNode } from 'graphql';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const filterIDsAndTypeNames = (\n field: FieldNode | FragmentDefinitionNode | OperationDefinitionNode,\n { fragmentDefinitions, typeIDKey }: CacheManagerContext,\n) => {\n const fieldsAndTypeNames = getChildFields(field, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames || fieldsAndTypeNames.length > 3) {\n return false;\n }\n\n const fieldNames = fieldsAndTypeNames.map(({ fieldNode }) => fieldNode.name.value);\n\n if (fieldNames.length === 2 && fieldNames.every(name => name === typeIDKey || name === TYPE_NAME_KEY)) {\n deleteChildFields(\n field,\n fieldsAndTypeNames.map(({ fieldNode }) => fieldNode),\n );\n\n return true;\n }\n\n if ((fieldNames.length === 1 && fieldNames[0] === typeIDKey) || fieldNames[0] === TYPE_NAME_KEY) {\n const [fieldAndTypeName] = fieldsAndTypeNames;\n\n if (fieldAndTypeName) {\n const { fieldNode } = fieldAndTypeName;\n deleteChildFields(field, fieldNode);\n return true;\n }\n }\n\n return false;\n};\n","import { type RequestData } from '@graphql-box/core';\nimport {\n buildFieldKeysAndPaths,\n deleteChildFields,\n getChildFields,\n getOperationDefinitions,\n} from '@graphql-box/helpers';\nimport { type CacheManagerContext, type CachedResponseData } from '../types.ts';\nimport { createFragmentSpreadChecklist } from './createFragmentSpreadChecklist.ts';\nimport { filterField } from './filterField.ts';\nimport { filterFragmentDefinitions } from './filterFragmentDefinitions.ts';\n\nexport const filterQuery = (\n requestData: RequestData,\n { fieldPathChecklist }: CachedResponseData,\n context: CacheManagerContext,\n) => {\n const { ast } = requestData;\n const queryNode = getOperationDefinitions(ast, context.operation)[0];\n\n if (!queryNode) {\n return ast;\n }\n\n const { fragmentDefinitions, operation } = context;\n const fieldsAndTypeNames = getChildFields(queryNode, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames) {\n return ast;\n }\n\n const fragmentSpreadChecklist = createFragmentSpreadChecklist(requestData, context);\n\n for (let index = fieldsAndTypeNames.length - 1; index >= 0; index -= 1) {\n // In this context fieldsAndTypeNames[index] will not be undefined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const { fieldNode } = fieldsAndTypeNames[index]!;\n\n const { requestFieldPath } = buildFieldKeysAndPaths(\n fieldNode,\n {\n requestFieldPath: operation,\n },\n context,\n );\n\n if (filterField(fieldNode, fieldPathChecklist, fragmentSpreadChecklist, requestFieldPath, context)) {\n deleteChildFields(queryNode, fieldNode);\n }\n }\n\n context.queryFiltered = true;\n return filterFragmentDefinitions(ast, fieldPathChecklist, fragmentSpreadChecklist, context);\n};\n","import { type RequestData } from '@graphql-box/core';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport type FragmentSpreadCheckist = Record<\n string,\n {\n deleted: number;\n paths: string[];\n total: number;\n }\n>;\n\nexport const createFragmentSpreadChecklist = ({ request }: RequestData, { fragmentDefinitions }: CacheManagerContext) =>\n keys(fragmentDefinitions ?? {}).reduce<FragmentSpreadCheckist>((acc, name) => {\n acc[name] = { deleted: 0, paths: [], total: (request.match(new RegExp(`\\\\.\\\\.\\\\.${name}`, 'g')) ?? []).length };\n return acc;\n }, {});\n","import { deleteFragmentDefinitions } from '@graphql-box/helpers';\nimport { type DocumentNode } from 'graphql';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext, type FieldPathChecklist } from '../types.ts';\nimport { type FragmentSpreadCheckist } from './createFragmentSpreadChecklist.ts';\nimport { filterField } from './filterField.ts';\n\nexport const filterFragmentDefinitions = (\n ast: DocumentNode,\n fieldPathChecklist: FieldPathChecklist,\n fragmentSpreadChecklist: FragmentSpreadCheckist,\n context: CacheManagerContext,\n) => {\n const definitionsToFilter = keys(fragmentSpreadChecklist).reduce<{ name: string; path: string }[]>(\n (namesAndPaths, key) => {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n return namesAndPaths;\n }\n\n const { deleted, paths, total } = checklist;\n // Will come back and sort this out later\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return deleted === 0 && total === 1 ? [...namesAndPaths, { name: key, path: paths[0]! }] : namesAndPaths;\n },\n [],\n );\n\n const { fragmentDefinitions = {} } = context;\n\n for (const { name, path } of definitionsToFilter) {\n const fragmentDefinition = fragmentDefinitions[name];\n\n if (!fragmentDefinition) {\n continue;\n }\n\n filterField(fragmentDefinition, fieldPathChecklist, fragmentSpreadChecklist, path, context);\n }\n\n const definitionsToDelete = keys(fragmentSpreadChecklist).reduce<string[]>((names, key) => {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n return names;\n }\n\n const { deleted, total } = checklist;\n return deleted > 0 && deleted === total ? [...names, key] : names;\n }, []);\n\n if (definitionsToDelete.length === 0) {\n return ast;\n }\n\n return deleteFragmentDefinitions(ast, {\n include: definitionsToDelete,\n });\n};\n","import { isArray, isPlainObject } from '@graphql-box/helpers';\nimport { isNumber, isString } from 'lodash-es';\n\nexport const getDataValue = <T>(value: unknown, key: string | number): T | undefined => {\n if (isArray(value) && isNumber(key)) {\n // Casting for ease of typing for consumers\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return value[key] as T;\n }\n\n if (isPlainObject(value) && isString(key)) {\n // Casting for ease of typing for consumers\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return value[key] as T;\n }\n\n return;\n};\n","import { TYPE_NAME_KEY, type TypedData } from '@graphql-box/core';\nimport { isObjectLike } from '@graphql-box/helpers';\nimport { isString } from 'lodash-es';\n\nexport const hasTypename = (value: unknown): value is TypedData => {\n if (!isObjectLike(value)) {\n return false;\n }\n\n return TYPE_NAME_KEY in value && isString(value[TYPE_NAME_KEY]);\n};\n","import { type Core } from '@cachemap/core';\nimport {\n type CacheMetadata,\n type CacheTypes,\n type CachemapOptions,\n DATA_ENTITIES,\n DEFAULT_TYPE_ID_KEY,\n type EntityData,\n type FieldTypeInfo,\n type PlainData,\n QUERY_RESPONSES,\n REQUEST_FIELD_PATHS,\n type RawResponseDataWithMaybeCacheMetadata,\n type RequestContext,\n type RequestData,\n type RequestOptions,\n type ResponseData,\n TYPE_NAME_KEY,\n} from '@graphql-box/core';\nimport {\n ArgsError,\n GroupedError,\n type KeysAndPaths,\n buildFieldKeysAndPaths,\n dehydrateCacheMetadata,\n getChildFields,\n getFragmentDefinitions,\n getOperationDefinitions,\n hasChildFields,\n hashRequest,\n isArray,\n isObjectLike,\n isPlainObject,\n iterateChildFields,\n rehydrateCacheMetadata,\n} from '@graphql-box/helpers';\nimport { Cacheability } from 'cacheability';\nimport { type FieldNode, Kind, OperationTypeNode, print } from 'graphql';\nimport { assign, get, isEqual, isNumber, isUndefined, set, unset } from 'lodash-es';\nimport { CACHE_CONTROL, HEADER_NO_CACHE, METADATA, NO_CACHE } from './constants.ts';\nimport { logCacheEntry, logCacheQuery, logPartialCompiled } from './debug/index.ts';\nimport { areOnlyPopulatedFieldsTypeIdKeys } from './helpers/areOnlyPopulatedFieldsTypeIdKeys.ts';\nimport {\n allCacheTiersDisabled,\n entityCacheTierEnabled,\n entityOrRequestPathCacheTiersEnabled,\n queryResponseCacheTierEnabled,\n requestPathCacheTierEnabled,\n someCacheTiersEnabled,\n} from './helpers/cacheTiersEnabled.ts';\nimport { combineDataSets } from './helpers/combineData.ts';\nimport { createEntityDataKey } from './helpers/createEntityDataKey.ts';\nimport { deriveOpCacheability } from './helpers/deriveOpCacheability.ts';\nimport { filterOutPropsWithEntityArgsOrDirectives } from './helpers/filterOutPropsWithEntityArgsOrDirectives.ts';\nimport { filterOutPropsWithEntityOrArgs } from './helpers/filterOutPropsWithEntityOrArgs.ts';\nimport { filterQuery } from './helpers/filterQuery.ts';\nimport { getDataValue } from './helpers/getDataValue.ts';\nimport { hasTypename } from './helpers/hasTypename.ts';\nimport { isFieldEntity } from './helpers/isFieldEntity.ts';\nimport { isLastResponseChunk } from './helpers/isLastResponseChunk.ts';\nimport { isNotLastResponseChunk } from './helpers/isNotLastResponseChunk.ts';\nimport { isNotResponseChunk } from './helpers/isNotResponseChunk.ts';\nimport { mergeDataSets } from './helpers/mergeObjects.ts';\nimport { mergeResponseDataSets } from './helpers/mergeResponseDataSets.ts';\nimport { normalizePatchResponseData } from './helpers/normalizePatchResponseData.ts';\nimport { getValidTypeIdValue } from './helpers/validTypeIdValue.ts';\nimport {\n type AnalyzeQueryResult,\n type AncestorKeysAndPaths,\n type CacheManagerContext,\n type CacheManagerDef,\n type CacheTiersEnabled,\n type CachedAncestorFieldData,\n type CachedResponseData,\n type CheckCacheEntryResult,\n type DataForCachingEntry,\n type FieldCount,\n type FieldPathChecklist,\n type MergedCachedFieldData,\n type PartialQueryResponse,\n type PartialQueryResponses,\n type QueryResponseCacheEntry,\n type ResponseDataForCaching,\n type TypenamesAndKind,\n type UserOptions,\n} from './types.ts';\n\nexport class CacheManager implements CacheManagerDef {\n private static _countFieldPathChecklist(fieldPathChecklist: FieldPathChecklist): FieldCount {\n const fieldCount: FieldCount = { missing: 0, total: 0 };\n\n for (const [, checklistValues] of fieldPathChecklist) {\n fieldCount.total += checklistValues.length;\n const missing = checklistValues.filter(({ hasData }) => !hasData);\n fieldCount.missing += missing.length;\n }\n\n return fieldCount;\n }\n\n private static _getFieldDataFromAncestor<T>(ancestorFieldData: unknown, propNameOrIndex: string | number) {\n const dataValue = getDataValue<T>(ancestorFieldData, propNameOrIndex);\n return isObjectLike(dataValue) ? structuredClone(dataValue) : dataValue;\n }\n\n private static _getOperationCacheControl(cacheMetadata: CacheMetadata | undefined, operation: string): string {\n const defaultCacheControl = HEADER_NO_CACHE;\n\n if (!cacheMetadata) {\n return defaultCacheControl;\n }\n\n const cacheability = cacheMetadata.get(operation);\n return cacheability ? cacheability.printCacheControl() : defaultCacheControl;\n }\n\n private static _isNodeEntity(fieldTypeInfo?: FieldTypeInfo): boolean {\n if (!fieldTypeInfo) {\n return false;\n }\n\n const { isEntity, possibleTypes } = fieldTypeInfo;\n return isEntity || possibleTypes.some(type => type.isEntity);\n }\n\n private static _isNodeRequestFieldPath(fieldTypeInfo?: FieldTypeInfo): boolean {\n return (\n !!fieldTypeInfo &&\n (this._isNodeEntity(fieldTypeInfo) || fieldTypeInfo.hasArguments || fieldTypeInfo.hasDirectives)\n );\n }\n\n private static _isValid(cacheability: Cacheability): boolean {\n const noCache = get(cacheability, [METADATA, CACHE_CONTROL, NO_CACHE], false);\n return !noCache && cacheability.checkTTL();\n }\n\n private static _mergeResponseCacheMetadata(\n cacheMetadata: CacheMetadata,\n partialQueryResponse?: PartialQueryResponse,\n ): CacheMetadata {\n if (!partialQueryResponse) {\n return cacheMetadata;\n }\n\n return new Map([...partialQueryResponse.cacheMetadata, ...cacheMetadata]);\n }\n\n private static _setCachedData(\n responseData: unknown,\n { data }: MergedCachedFieldData,\n propNameOrIndex: string | number,\n ): void {\n const setData = (value: unknown) => {\n if (isArray(responseData) && isNumber(propNameOrIndex)) {\n responseData[propNameOrIndex] = value;\n } else if (isPlainObject(responseData)) {\n responseData[propNameOrIndex] = value;\n }\n };\n\n if (!isObjectLike(data) && !isUndefined(data)) {\n setData(data);\n } else if (isArray(data)) {\n setData([]);\n } else if (isPlainObject(data)) {\n setData({});\n }\n }\n\n private static _setCachedResponseSlice(\n cachedFieldData: MergedCachedFieldData,\n { cacheMetadata, data, fieldPathChecklist }: CachedResponseData,\n { propNameOrIndex, requestFieldPath }: KeysAndPaths,\n typeNamesAndKind: TypenamesAndKind,\n _options: RequestOptions,\n { operation }: CacheManagerContext,\n ) {\n CacheManager._setCacheMetadata(cacheMetadata, cachedFieldData.cacheability, requestFieldPath, operation);\n CacheManager._setFieldPathChecklist(fieldPathChecklist, cachedFieldData, requestFieldPath, typeNamesAndKind);\n CacheManager._setCachedData(data, cachedFieldData, propNameOrIndex);\n }\n\n private static _setCacheMetadata(\n cacheMetadata: CacheMetadata,\n cacheability: Cacheability | undefined,\n requestFieldPath: string,\n operation: string,\n ): void {\n if (!cacheability) {\n return;\n }\n\n cacheMetadata.set(requestFieldPath, cacheability);\n const operationCacheability = cacheMetadata.get(operation);\n\n if (!operationCacheability || operationCacheability.metadata.ttl > cacheability.metadata.ttl) {\n cacheMetadata.set(operation, cacheability);\n }\n }\n\n private static _setFieldPathChecklist(\n fieldPathChecklist: FieldPathChecklist,\n { data }: MergedCachedFieldData,\n requestFieldPath: string,\n { dataTypename: dataTypeName, fieldTypename: fieldTypeName, fragmentKind, fragmentName }: TypenamesAndKind,\n ): void {\n if (isUndefined(fieldTypeName) || fragmentKind === Kind.FRAGMENT_SPREAD) {\n if (fieldPathChecklist.has(requestFieldPath)) {\n return;\n }\n\n fieldPathChecklist.set(requestFieldPath, [{ fragmentKind, fragmentName, hasData: !isUndefined(data) }]);\n return;\n }\n\n if (dataTypeName !== fieldTypeName) {\n return;\n }\n\n const entry = fieldPathChecklist.get(requestFieldPath);\n const checklistValues = entry ?? [];\n\n if (checklistValues.some(({ typeName }) => typeName === dataTypeName)) {\n return;\n }\n\n fieldPathChecklist.set(requestFieldPath, [\n ...checklistValues,\n { fragmentKind, fragmentName, hasData: !isUndefined(data), typeName: dataTypeName },\n ]);\n }\n\n private _cache: Core | undefined;\n private readonly _cacheTiersEnabled: CacheTiersEnabled = { entity: false, queryResponse: true, requestPath: false };\n private readonly _cascadeCacheControl: boolean;\n private readonly _fallbackOperationCacheability: string;\n private _partialQueryResponses: PartialQueryResponses = new Map();\n private _responseChunksAwaitingCaching = new Map<string, RawResponseDataWithMaybeCacheMetadata[]>();\n private readonly _typeCacheDirectives: Record<string, string>;\n private readonly _typeIDKey: string;\n\n constructor(options: UserOptions) {\n const errors: ArgsError[] = [];\n\n if (!('cache' in options)) {\n errors.push(new ArgsError('@graphql-box/cache-manager expected cache to be in options.'));\n }\n\n if (!!options.typeCacheDirectives && !isPlainObject(options.typeCacheDirectives)) {\n const message = '@graphql-box/cache-manager expected options.typeCacheDirectives to be a plain object.';\n errors.push(new ArgsError(message));\n }\n\n if (errors.length > 0) {\n throw new GroupedError('@graphql-box/cache-manager argument validation errors.', errors);\n }\n\n if (typeof options.cache === 'function') {\n void options\n .cache()\n .then(cache => {\n this._cache = cache;\n })\n .catch((error: unknown) => {\n throw error;\n });\n } else {\n this._cache = options.cache;\n }\n\n this._cacheTiersEnabled = { ...this._cacheTiersEnabled, ...options.cacheTiersEnabled };\n this._cascadeCacheControl = options.cascadeCacheControl ?? false;\n this._fallbackOperationCacheability = options.fallbackOperationCacheability ?? NO_CACHE;\n this._typeCacheDirectives = options.typeCacheDirectives ?? {};\n this._typeIDKey = options.typeIDKey ?? DEFAULT_TYPE_ID_KEY;\n }\n\n public async analyzeQuery(\n requestData: RequestData,\n options: RequestOptions,\n context: RequestContext,\n ): Promise<AnalyzeQueryResult> {\n // the client has already checked the query response cache with\n // `checkQueryResponseCacheEntry`, so at this point the entity and\n // request path caches are the only relevant ones.\n if (!entityOrRequestPathCacheTiersEnabled(this._cacheTiersEnabled)) {\n return { updated: requestData };\n }\n\n const { ast, hash } = requestData;\n\n const cacheManagerContext: CacheManagerContext = {\n ...context,\n fragmentDefinitions: getFragmentDefinitions(ast),\n typeIDKey: this._typeIDKey,\n };\n\n const cachedResponseData = await this._retrieveCachedResponseData(requestData, options, cacheManagerContext);\n const { cacheMetadata, data, fieldCount } = cachedResponseData;\n\n /**\n * Second half of check is required for the scenario where the only matching data is\n * the typeIDKey field, i.e. \"id\", in which case there is no point settings a partial\n * query response because we request the typeIDKey field with every request.\n */\n if (fieldCount.missing === fieldCount.total || areOnlyPopulatedFieldsTypeIdKeys(data, this._typeIDKey)) {\n return { updated: requestData };\n }\n\n if (!fieldCount.missing && queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n const dataCaching = this._setQueryResponseCacheEntry(hash, { cacheMetadata, data }, options, cacheManagerContext);\n\n if (options.awaitDataCaching) {\n await dataCaching;\n }\n\n return { response: { cacheMetadata, data } };\n }\n\n const filteredAST = filterQuery(requestData, cachedResponseData, cacheManagerContext);\n const filteredRequest = print(filteredAST);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fragmentDefinitions, typeIDKey, ...rest } = cacheManagerContext;\n assign(context, { ...rest, filteredRequest });\n\n if (queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n this._setPartialQueryResponse(hash, { cacheMetadata, data }, options, context);\n }\n\n return {\n updated: { ast: filteredAST, hash: hashRequest(filteredRequest), request: filteredRequest },\n };\n }\n\n get cache(): Core | undefined {\n return this._cache;\n }\n\n public async cacheQuery(\n requestData: RequestData,\n updatedRequestData: RequestData | undefined,\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: RequestContext,\n ): Promise<ResponseData> {\n const cacheManagerContext: CacheManagerContext = {\n ...context,\n fragmentDefinitions: getFragmentDefinitions((updatedRequestData ?? requestData).ast),\n typeIDKey: this._typeIDKey,\n };\n\n return this._cacheResponse(requestData, updatedRequestData, rawResponseData, options, cacheManagerContext);\n }\n\n public async cacheResponse(\n requestData: RequestData,\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: RequestContext,\n ): Promise<ResponseData> {\n const cacheManagerContext: CacheManagerContext = {\n ...context,\n fragmentDefinitions: getFragmentDefinitions(requestData.ast),\n typeIDKey: this._typeIDKey,\n };\n\n return this._cacheResponse(requestData, undefined, rawResponseData, options, cacheManagerContext);\n }\n\n get cacheTiersEnabled(): CacheTiersEnabled {\n return this._cacheTiersEnabled;\n }\n\n public async checkCacheEntry(\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: RequestContext & { requestFieldCacheKey?: string },\n ): Promise<CheckCacheEntryResult | false> {\n if (allCacheTiersDisabled(this._cacheTiersEnabled)) {\n return false;\n }\n\n return this._checkCacheEntry(cacheType, hash, options, context);\n }\n\n public async checkQueryResponseCacheEntry(\n hash: string,\n options: RequestOptions,\n context: RequestContext,\n ): Promise<ResponseData | false> {\n if (!queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n return false;\n }\n\n const result = await this._checkCacheEntry<QueryResponseCacheEntry>(QUERY_RESPONSES, hash, options, context);\n\n if (!result) {\n return false;\n }\n\n const { cacheMetadata, data } = result.entry;\n\n return {\n cacheMetadata: rehydrateCacheMetadata(cacheMetadata),\n data,\n };\n }\n\n public deletePartialQueryResponse(hash: string): void {\n if (queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n this._partialQueryResponses.delete(hash);\n }\n }\n\n public async setQueryResponseCacheEntry(\n requestData: RequestData,\n responseData: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n if (queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n return this._setQueryResponseCacheEntry(requestData.hash, responseData, options, context);\n }\n }\n\n private async _analyzeFieldNode(\n fieldNode: FieldNode,\n cachedAncestorFieldData: CachedAncestorFieldData,\n cachedResponseData: CachedResponseData & { data: unknown },\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n await (hasChildFields(fieldNode, { fragmentDefinitions: context.fragmentDefinitions })\n ? this._analyzeParentFieldNode(fieldNode, cachedAncestorFieldData, cachedResponseData, options, context)\n : this._analyzeLeafFieldNode(fieldNode, cachedAncestorFieldData, cachedResponseData, options, context));\n }\n\n private async _analyzeLeafFieldNode(\n fieldNode: FieldNode,\n cachedAncestorFieldData: CachedAncestorFieldData,\n cachedResponseData: CachedResponseData & { data: unknown },\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const keysAndPaths = buildFieldKeysAndPaths(fieldNode, cachedAncestorFieldData, context);\n const { hashedRequestFieldCacheKey, propNameOrIndex, requestFieldCacheKey, requestFieldPath } = keysAndPaths;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n const { entityData, fragmentKind, fragmentName, requestFieldPathData, typeName } = cachedAncestorFieldData;\n\n const dataTypename = hasTypename(entityData)\n ? entityData.__typename\n : hasTypename(requestFieldPathData)\n ? requestFieldPathData.__typename\n : undefined;\n\n const typenamesAndKind = {\n dataTypename,\n fieldTypename: typeName,\n fragmentKind,\n fragmentName,\n };\n\n if (!CacheManager._isNodeRequestFieldPath(fieldTypeInfo)) {\n const cachedFieldData =\n CacheManager._getFieldDataFromAncestor(entityData, propNameOrIndex) ??\n CacheManager._getFieldDataFromAncestor(requestFieldPathData, propNameOrIndex);\n\n CacheManager._setFieldPathChecklist(\n cachedResponseData.fieldPathChecklist,\n { data: cachedFieldData },\n requestFieldPath,\n typenamesAndKind,\n );\n\n CacheManager._setCachedData(cachedResponseData.data, { data: cachedFieldData }, propNameOrIndex);\n } else if (requestPathCacheTierEnabled(this._cacheTiersEnabled)) {\n const { cacheability, entry } = await this._retrieveCachedRequestFieldPathData(\n hashedRequestFieldCacheKey,\n requestFieldCacheKey,\n options,\n context,\n );\n\n CacheManager._setCachedResponseSlice(\n { cacheability, data: entry },\n cachedResponseData,\n keysAndPaths,\n typenamesAndKind,\n options,\n context,\n );\n }\n }\n\n private async _analyzeParentFieldNode(\n fieldNode: FieldNode,\n cachedAncestorFieldData: CachedAncestorFieldData,\n cachedResponseData: CachedResponseData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const keysAndPaths = buildFieldKeysAndPaths(fieldNode, cachedAncestorFieldData, context);\n const { propNameOrIndex, requestFieldCacheKey, requestFieldPath } = keysAndPaths;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n\n if (!fieldTypeInfo) {\n return;\n }\n\n const { cacheability, data, entityData, requestFieldPathData } = await this._retrieveCachedParentNodeData(\n cachedAncestorFieldData,\n keysAndPaths,\n fieldTypeInfo,\n options,\n context,\n );\n\n const { fragmentKind, fragmentName, typeName } = cachedAncestorFieldData;\n // Don't get this one, need to look into it more\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n const dataTypename = get(data, TYPE_NAME_KEY);\n\n CacheManager._setCachedResponseSlice(\n { cacheability, data },\n cachedResponseData,\n keysAndPaths,\n\n {\n dataTypename,\n fieldTypename: typeName,\n fragmentKind,\n fragmentName,\n },\n options,\n context,\n );\n\n if (!isObjectLike(data)) {\n return;\n }\n\n const promises: Promise<void>[] = [];\n\n iterateChildFields(\n fieldNode,\n data,\n context.fragmentDefinitions,\n (\n childField: FieldNode,\n childTypeName: string | undefined,\n childFragmentKind: string | undefined,\n childFragmentName: string | undefined,\n childIndex?: number,\n ) => {\n promises.push(\n this._analyzeFieldNode(\n childField,\n {\n cacheability,\n entityData,\n fragmentKind: childFragmentKind,\n fragmentName: childFragmentName,\n index: childIndex,\n requestFieldCacheKey,\n requestFieldPath,\n requestFieldPathData,\n typeName: childTypeName,\n },\n {\n ...cachedResponseData,\n // `cachedResponseData.data[propNameOrIndex]` will always be either an empty array\n // or an empty object at this point as based on whether `data` is object-like\n // `cachedResponseData.data[propNameOrIndex]` is set accordingly in\n // _setCachedResponseData > _setCachedData\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n data: getDataValue<PlainData>(cachedResponseData.data, propNameOrIndex)!,\n },\n options,\n context,\n ),\n );\n },\n );\n\n await Promise.all(promises);\n }\n\n private _buildCacheMetadata(\n { ast }: RequestData,\n { data, ...otherProps }: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: CacheManagerContext,\n ): CacheMetadata {\n const cacheMetadata = this._createCacheMetadata({ data, ...otherProps }, context);\n const queryNode = getOperationDefinitions(ast, context.operation)[0];\n\n if (!queryNode) {\n return cacheMetadata;\n }\n\n const fieldsAndTypeNames = getChildFields(queryNode);\n\n if (!fieldsAndTypeNames) {\n return cacheMetadata;\n }\n\n for (const { fieldNode } of fieldsAndTypeNames)\n this._setFieldCacheability(\n fieldNode,\n { requestFieldPath: context.operation },\n { cacheMetadata, data },\n options,\n context,\n );\n\n return cacheMetadata;\n }\n\n private async _cacheResponse(\n requestData: RequestData,\n updatedRequestData: RequestData | undefined,\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<ResponseData> {\n const normalizedResponseData = normalizePatchResponseData(rawResponseData, context);\n let responseDataForCaching: RawResponseDataWithMaybeCacheMetadata | undefined = normalizedResponseData;\n\n if (isNotLastResponseChunk(rawResponseData, context)) {\n this._setResponseChunksAwaitingCaching(normalizedResponseData, context);\n responseDataForCaching = undefined;\n }\n\n if (isLastResponseChunk(rawResponseData, context)) {\n responseDataForCaching = this._retrieveResponseDataForCaching(normalizedResponseData, context);\n }\n\n const dataCaching: Promise<void>[] = [];\n\n if (responseDataForCaching && someCacheTiersEnabled(this._cacheTiersEnabled)) {\n const { data } = responseDataForCaching;\n const cacheMetadata = this._buildCacheMetadata(requestData, responseDataForCaching, options, context);\n\n if (entityOrRequestPathCacheTiersEnabled(this._cacheTiersEnabled)) {\n dataCaching.push(\n this._setEntityAndRequestFieldPathCacheEntries(\n requestData,\n {\n cacheMetadata,\n entityData: structuredClone(data),\n requestFieldPathData: structuredClone(data),\n },\n options,\n context,\n ),\n );\n }\n\n let queryCacheMetadata: CacheMetadata | undefined;\n let queryData: PlainData | undefined;\n\n if (context.operation === OperationTypeNode.QUERY && queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n let partialQueryResponse: PartialQueryResponse | undefined;\n\n if (context.queryFiltered && updatedRequestData) {\n dataCaching.push(\n this._setQueryResponseCacheEntry(updatedRequestData.hash, { cacheMetadata, data }, options, context),\n );\n\n partialQueryResponse = this._getPartialQueryResponse(requestData.hash);\n }\n\n queryCacheMetadata = CacheManager._mergeResponseCacheMetadata(cacheMetadata, partialQueryResponse);\n queryData = this._mergeResponseData(data, partialQueryResponse);\n\n dataCaching.push(\n this._setQueryResponseCacheEntry(\n requestData.hash,\n { cacheMetadata: queryCacheMetadata, data: queryData },\n options,\n context,\n ),\n );\n }\n\n if (options.awaitDataCaching) {\n await Promise.all(dataCaching);\n }\n\n if (isNotResponseChunk(normalizedResponseData, context) && queryCacheMetadata && queryData) {\n return {\n cacheMetadata: queryCacheMetadata,\n data: queryData,\n };\n }\n }\n\n const { data, hasNext, paths } = normalizedResponseData;\n\n return {\n cacheMetadata: this._buildCacheMetadata(requestData, normalizedResponseData, options, context),\n data,\n hasNext,\n paths,\n };\n }\n\n private async _checkCacheEntry<T>(\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: CacheManagerContext & { requestFieldCacheKey?: string },\n ): Promise<CheckCacheEntryResult<T> | false> {\n try {\n const cacheability = await this._hasCacheEntry(cacheType, hash);\n\n if (!cacheability || !CacheManager._isValid(cacheability)) {\n return false;\n }\n\n const entry = await this._getCacheEntry<T>(cacheType, hash, options, context);\n\n if (isUndefined(entry)) {\n return false;\n }\n\n return { cacheability, entry };\n } catch {\n return false;\n }\n }\n\n private _createCacheMetadata(\n { _cacheMetadata, headers }: RawResponseDataWithMaybeCacheMetadata,\n { operation }: CacheManagerContext,\n ): CacheMetadata {\n const cacheMetadata = new Map<string, Cacheability>();\n\n const cacheability = deriveOpCacheability({\n _cacheMetadata,\n fallback: this._fallbackOperationCacheability,\n headers,\n });\n\n cacheMetadata.set(operation, cacheability);\n\n if (_cacheMetadata) {\n rehydrateCacheMetadata(_cacheMetadata, cacheMetadata);\n }\n\n return cacheMetadata;\n }\n\n @logCacheQuery()\n private async _getCacheEntry<T>(\n cacheType: CacheTypes,\n hash: string,\n _options: RequestOptions,\n _context: CacheManagerContext & { requestFieldCacheKey?: string },\n ): Promise<T | undefined> {\n return this._cache?.get<T>(`${cacheType}::${hash}`);\n }\n\n private _getPartialQueryResponse(hash: string): PartialQueryResponse | undefined {\n const partialQueryResponse = this._partialQueryResponses.get(hash);\n this._partialQueryResponses.delete(hash);\n return partialQueryResponse;\n }\n\n private async _hasCacheEntry(cacheType: CacheTypes, hash: string): Promise<Cacheability | false> {\n try {\n return (await this._cache?.has(`${cacheType}::${hash}`)) ?? false;\n } catch {\n return false;\n }\n }\n\n private _mergeResponseData(responseData: PlainData, partialQueryResponse?: PartialQueryResponse): PlainData {\n if (!partialQueryResponse) {\n return responseData;\n }\n\n return mergeDataSets(partialQueryResponse.data, responseData, this._typeIDKey);\n }\n\n private async _parseEntityAndRequestFieldPathCacheEntryData(\n field: FieldNode,\n ancestorKeysAndPaths: AncestorKeysAndPaths,\n { cacheMetadata, entityData, requestFieldPathData }: ResponseDataForCaching,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const keysAndPaths = buildFieldKeysAndPaths(field, ancestorKeysAndPaths, context);\n const { hashedRequestFieldCacheKey, requestFieldCacheKey, requestFieldPath, responseDataPath } = keysAndPaths;\n // get has rubbish return typing\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const fieldData = get(requestFieldPathData, responseDataPath) as unknown;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n const cacheability = cacheMetadata.get(requestFieldPath);\n\n if (!isObjectLike(fieldData) && !fieldTypeInfo?.hasDirectives) {\n return;\n }\n\n if (isObjectLike(fieldData)) {\n const promises: Promise<void>[] = [];\n\n iterateChildFields(\n field,\n fieldData,\n context.fragmentDefinitions,\n (\n childField: FieldNode,\n _typeName: string | undefined,\n _fragmentKind: string | undefined,\n _fragmentName: string | undefined,\n childIndex?: number,\n ) => {\n promises.push(\n this._parseEntityAndRequestFieldPathCacheEntryData(\n childField,\n { index: childIndex, requestFieldCacheKey, requestFieldPath, responseDataPath },\n { cacheMetadata, entityData, requestFieldPathData },\n options,\n context,\n ),\n );\n },\n );\n\n await Promise.all(promises);\n }\n\n if (isUndefined(fieldData) || !fieldTypeInfo || !cacheability) {\n return;\n }\n\n const isEntity = isFieldEntity(fieldData, fieldTypeInfo, this._typeIDKey);\n const hasArgsOrDirectives = fieldTypeInfo.hasArguments || fieldTypeInfo.hasDirectives;\n\n if (\n context.operation === OperationTypeNode.QUERY &&\n (isEntity || hasArgsOrDirectives) &&\n requestPathCacheTierEnabled(this._cacheTiersEnabled)\n ) {\n await this._setRequestFieldPathCacheEntry(\n keysAndPaths,\n {\n cacheability,\n fieldData: filterOutPropsWithEntityArgsOrDirectives(structuredClone(fieldData), field, keysAndPaths, context),\n fieldTypeInfo,\n },\n options,\n context,\n );\n\n if (hasChildFields(field, { fragmentDefinitions: context.fragmentDefinitions })) {\n if (isEntity) {\n set(requestFieldPathData, responseDataPath, {\n __cacheKey: `${REQUEST_FIELD_PATHS}::${hashedRequestFieldCacheKey}`,\n });\n } else {\n unset(requestFieldPathData, responseDataPath);\n }\n }\n }\n\n if (isEntity && entityCacheTierEnabled(this._cacheTiersEnabled)) {\n await this._setEntityCacheEntry(\n {\n cacheability,\n fieldData: filterOutPropsWithEntityOrArgs(\n // Casting here for ease of typing\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n structuredClone(get(entityData, responseDataPath) as EntityData),\n field,\n keysAndPaths,\n context,\n ),\n fieldTypeInfo,\n },\n options,\n context,\n );\n\n set(entityData, responseDataPath, {\n __cacheKey: `${DATA_ENTITIES}::${createEntityDataKey(fieldData, fieldTypeInfo, context)}`,\n });\n }\n }\n\n private async _retrieveCachedEntityData(\n validTypeIDValue: string | number,\n { possibleTypes, typeName }: FieldTypeInfo,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<Partial<CheckCacheEntryResult<EntityData>>> {\n const typeNames = [...possibleTypes.map(type => type.typeName), typeName];\n\n const checkResults = await Promise.all(\n typeNames.map(name =>\n this._checkCacheEntry<EntityData>(DATA_ENTITIES, `${name}::${String(validTypeIDValue)}`, options, context),\n ),\n );\n\n const validResults = checkResults.filter(result => !!result);\n let validResult: CheckCacheEntryResult<EntityData> | undefined;\n\n if (validResults.length === 1) {\n validResult = validResults[0];\n } else if (validResults.length > 1) {\n validResults.sort(({ cacheability: a }, { cacheability: b }) => a.metadata.ttl - b.metadata.ttl);\n\n const firstResult = validResults[0];\n\n if (firstResult) {\n validResult = {\n cacheability: firstResult.cacheability,\n // By the time the merge has happened, the type is EntityData\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n entry: validResults.reduce<Partial<EntityData>>(\n (obj, { entry }) => mergeDataSets(obj, entry, this._typeIDKey),\n {},\n ) as EntityData,\n };\n }\n }\n\n return validResult ?? {};\n }\n\n private async _retrieveCachedParentNodeData(\n { entityData: ancestorEntityData, requestFieldPathData: ancestorRequestFieldPathData }: CachedAncestorFieldData,\n { hashedRequestFieldCacheKey, propNameOrIndex, requestFieldCacheKey }: KeysAndPaths,\n fieldTypeInfo: FieldTypeInfo,\n options: RequestOptions,\n context: CacheManagerContext,\n ) {\n let entityData = CacheManager._getFieldDataFromAncestor(ancestorEntityData, propNameOrIndex);\n let requestFieldPathData = CacheManager._getFieldDataFromAncestor(ancestorRequestFieldPathData, propNameOrIndex);\n let cacheability: Cacheability | undefined;\n\n if (CacheManager._isNodeRequestFieldPath(fieldTypeInfo) && requestPathCacheTierEnabled(this._cacheTiersEnabled)) {\n const { cacheability: entryCacheability, entry } = await this._retrieveCachedRequestFieldPathData(\n hashedRequestFieldCacheKey,\n requestFieldCacheKey,\n options,\n context,\n );\n\n requestFieldPathData = combineDataSets(requestFieldPathData, entry, this._typeIDKey);\n\n if (entryCacheability) {\n cacheability = entryCacheability;\n }\n }\n\n const validTypeIDValue = getValidTypeIdValue(requestFieldPathData, fieldTypeInfo, this._typeIDKey);\n\n if (\n CacheManager._isNodeEntity(fieldTypeInfo) &&\n validTypeIDValue &&\n entityCacheTierEnabled(this._cacheTiersEnabled)\n ) {\n const { cacheability: entryCacheability, entry } = await this._retrieveCachedEntityData(\n validTypeIDValue,\n fieldTypeInfo,\n options,\n context,\n );\n\n entityData = combineDataSets(entityData, entry, this._typeIDKey);\n\n if (entryCacheability && (!cacheability || entryCacheability.metadata.ttl > cacheability.metadata.ttl)) {\n cacheability = entryCacheability;\n }\n }\n\n const data = isEqual(entityData, requestFieldPathData)\n ? entityData\n : combineDataSets(entityData, requestFieldPathData, this._typeIDKey);\n\n return {\n cacheability,\n data,\n entityData,\n requestFieldPathData,\n };\n }\n\n private async _retrieveCachedRequestFieldPathData(\n hash: string,\n requestFieldCacheKey: string,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<Partial<CheckCacheEntryResult>> {\n return (\n (await this._checkCacheEntry(REQUEST_FIELD_PATHS, hash, options, { ...context, requestFieldCacheKey })) || {}\n );\n }\n\n private async _retrieveCachedResponseData(\n { ast }: RequestData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<CachedResponseData> {\n const cachedResponseData: CachedResponseData = {\n cacheMetadata: new Map(),\n data: {},\n fieldCount: { missing: 0, total: 0 },\n fieldPathChecklist: new Map(),\n };\n\n const queryNode = getOperationDefinitions(ast, context.operation)[0];\n\n if (!queryNode) {\n return cachedResponseData;\n }\n\n const fieldsAndTypeNames = getChildFields(queryNode);\n\n if (!fieldsAndTypeNames) {\n return cachedResponseData;\n }\n\n await Promise.all(\n fieldsAndTypeNames.map(({ fieldNode }) =>\n this._analyzeFieldNode(\n fieldNode,\n { requestFieldPath: context.operation },\n cachedResponseData,\n options,\n context,\n ),\n ),\n );\n\n cachedResponseData.fieldCount = CacheManager._countFieldPathChecklist(cachedResponseData.fieldPathChecklist);\n return cachedResponseData;\n }\n\n private _retrieveResponseDataForCaching(\n normalizedResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n ) {\n const responseChunks = this._responseChunksAwaitingCaching.get(context.requestID);\n this._responseChunksAwaitingCaching.delete(context.requestID);\n return mergeResponseDataSets([...(responseChunks ?? []), normalizedResponseData]);\n }\n\n @logCacheEntry()\n private async _setCacheEntry(\n cacheType: CacheTypes,\n hash: string,\n value: unknown,\n cachemapOptions: CachemapOptions,\n _options: RequestOptions,\n _context: CacheManagerContext & { requestFieldCacheKey?: string },\n ): Promise<void> {\n try {\n await this._cache?.set(`${cacheType}::${hash}`, structuredClone(value), cachemapOptions);\n } catch {\n // no catch\n }\n }\n\n private async _setEntityAndRequestFieldPathCacheEntries(\n requestData: RequestData,\n responseData: ResponseDataForCaching,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const operationNode = getOperationDefinitions(requestData.ast, context.operation)[0];\n\n if (!operationNode) {\n return;\n }\n\n const fieldsAndTypeNames = getChildFields(operationNode);\n\n if (!fieldsAndTypeNames) {\n return;\n }\n\n await Promise.all(\n fieldsAndTypeNames.map(({ fieldNode }) => {\n return this._parseEntityAndRequestFieldPathCacheEntryData(\n fieldNode,\n { requestFieldPath: context.operation },\n responseData,\n options,\n context,\n );\n }),\n );\n }\n\n private async _setEntityCacheEntry(\n { cacheability, fieldData, fieldTypeInfo }: DataForCachingEntry<EntityData>,\n options: RequestOptions,\n context: CacheManagerContext,\n ) {\n const fieldTypeName = fieldTypeInfo.isEntity ? fieldTypeInfo.typeName : fieldData.__typename;\n const entityDataKey = `${fieldTypeName}::${String(fieldData[this._typeIDKey])}`;\n const result = await this._checkCacheEntry<EntityData>(DATA_ENTITIES, entityDataKey, options, context);\n\n if (result) {\n fieldData = mergeDataSets(result.entry, fieldData, this._typeIDKey);\n }\n\n await this._setCacheEntry(\n DATA_ENTITIES,\n entityDataKey,\n fieldData,\n { cacheHeaders: { cacheControl: cacheability.printCacheControl() }, tag: options.tag },\n options,\n context,\n );\n }\n\n private _setFieldCacheability(\n field: FieldNode,\n ancestorKeysAndPaths: AncestorKeysAndPaths,\n { cacheMetadata, data }: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): void {\n const { requestFieldPath: ancestorRequestFieldPath } = ancestorKeysAndPaths;\n const keysAndPaths = buildFieldKeysAndPaths(field, ancestorKeysAndPaths, context);\n const { requestFieldPath, responseDataPath } = keysAndPaths;\n\n if (!isObjectLike(data)) {\n return;\n }\n\n // get return type annotation is rubbish\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const fieldData = get(data, responseDataPath) as unknown;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n\n if (!isObjectLike(fieldData) && !fieldTypeInfo?.hasDirectives) {\n return;\n }\n\n this._setFieldTypeCacheDirective(cacheMetadata, { ancestorRequestFieldPath, requestFieldPath }, context);\n\n if (isObjectLike(fieldData)) {\n iterateChildFields(\n field,\n fieldData,\n context.fragmentDefinitions,\n (\n childField: FieldNode,\n _typeName: string | undefined,\n _fragmentKind: string | undefined,\n _fragmentName: string | undefined,\n childIndex?: number,\n ) => {\n this._setFieldCacheability(\n childField,\n { index: childIndex, requestFieldPath, responseDataPath },\n { cacheMetadata, data },\n options,\n context,\n );\n },\n );\n }\n }\n\n private _setFieldTypeCacheDirective(\n cacheMetadata: CacheMetadata,\n { ancestorRequestFieldPath, requestFieldPath }: { ancestorRequestFieldPath?: string; requestFieldPath: string },\n { fieldTypeMap, operation }: CacheManagerContext,\n ): void {\n if (cacheMetadata.has(requestFieldPath)) {\n return;\n }\n\n const fieldTypeInfo = fieldTypeMap.get(requestFieldPath);\n\n if (fieldTypeInfo && this._typeCacheDirectives[fieldTypeInfo.typeName]) {\n const cacheability = new Cacheability({ cacheControl: this._typeCacheDirectives[fieldTypeInfo.typeName] });\n CacheManager._setCacheMetadata(cacheMetadata, cacheability, requestFieldPath, operation);\n } else if (this._cascadeCacheControl && ancestorRequestFieldPath) {\n CacheManager._setCacheMetadata(\n cacheMetadata,\n cacheMetadata.get(ancestorRequestFieldPath),\n requestFieldPath,\n operation,\n );\n }\n }\n\n @logPartialCompiled()\n private _setPartialQueryResponse(\n hash: string,\n partialQueryResponse: PartialQueryResponse,\n _options: RequestOptions,\n _context: CacheManagerContext,\n ): void {\n this._partialQueryResponses.set(hash, partialQueryResponse);\n }\n\n private async _setQueryResponseCacheEntry(\n hash: string,\n { cacheMetadata, data }: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const dehydratedCacheMetadata = dehydrateCacheMetadata(cacheMetadata);\n const cacheControl = CacheManager._getOperationCacheControl(cacheMetadata, context.operation);\n\n await this._setCacheEntry(\n QUERY_RESPONSES,\n hash,\n { cacheMetadata: dehydratedCacheMetadata, data },\n { cacheHeaders: { cacheControl }, tag: options.tag },\n options,\n context,\n );\n }\n\n private async _setRequestFieldPathCacheEntry(\n keysAndPaths: KeysAndPaths,\n { cacheability, fieldData }: DataForCachingEntry,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const { hashedRequestFieldCacheKey, requestFieldCacheKey } = keysAndPaths;\n\n const result = await this._checkCacheEntry(REQUEST_FIELD_PATHS, hashedRequestFieldCacheKey, options, {\n ...context,\n requestFieldCacheKey,\n });\n\n if (result && isObjectLike(result.entry) && isObjectLike(fieldData)) {\n fieldData = mergeDataSets(result.entry, fieldData, this._typeIDKey);\n }\n\n void this._setCacheEntry(\n REQUEST_FIELD_PATHS,\n hashedRequestFieldCacheKey,\n fieldData,\n { cacheHeaders: { cacheControl: cacheability.printCacheControl() }, tag: options.tag },\n options,\n { ...context, requestFieldCacheKey },\n );\n }\n\n private _setResponseChunksAwaitingCaching(\n normalizedResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n ) {\n const responseChunks = this._responseChunksAwaitingCaching.get(context.requestID);\n\n if (responseChunks) {\n this._responseChunksAwaitingCaching.set(context.requestID, [...responseChunks, normalizedResponseData]);\n } else {\n this._responseChunksAwaitingCaching.set(context.requestID, [normalizedResponseData]);\n }\n }\n}\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { isString, set } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const normalizePatchResponseData = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n) => {\n if (!context.normalizePatchResponseData) {\n return rawResponseData;\n }\n\n const { data, paths, ...rest } = rawResponseData;\n\n if (!paths?.length || !isString(paths[0])) {\n return rawResponseData;\n }\n\n return {\n ...rest,\n data: set({}, paths[0], data),\n paths,\n };\n};\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isNotLastResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n) => context.hasDeferOrStream && rawResponseData.hasNext;\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isLastResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n) => context.hasDeferOrStream && !rawResponseData.hasNext && rawResponseData.paths;\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isNotResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n) => !context.hasDeferOrStream && !rawResponseData.hasNext && !rawResponseData.paths;\n","import { type FieldTypeInfo } from '@graphql-box/core';\nimport { isPlainObject } from '@graphql-box/helpers';\n\nexport const getValidTypeIdValue = (\n requestFieldPathData: unknown,\n { typeIDValue }: FieldTypeInfo,\n typeIDKey: string,\n): string | number | undefined => {\n if (typeIDValue) {\n return typeIDValue;\n }\n\n if (isPlainObject(requestFieldPathData)) {\n // Identifier value can only be one of these types\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return requestFieldPathData[typeIDKey] as string | number | undefined;\n }\n\n return;\n};\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { merge } from 'lodash-es';\n\nexport const mergeResponseDataSets = (responseDataSets: RawResponseDataWithMaybeCacheMetadata[]) => {\n return responseDataSets.reduce<RawResponseDataWithMaybeCacheMetadata>(\n (acc, dataSet, index) => {\n const { _cacheMetadata, data, hasNext, headers, paths } = dataSet;\n\n if (_cacheMetadata) {\n acc._cacheMetadata = acc._cacheMetadata ? { ...acc._cacheMetadata, ..._cacheMetadata } : _cacheMetadata;\n }\n\n acc.data = merge(acc.data, data);\n\n if (index === 0) {\n acc.headers = headers;\n }\n\n if (index === responseDataSets.length - 1) {\n acc.hasNext = hasNext;\n }\n\n if (paths) {\n acc.paths ??= [];\n acc.paths.push(...paths);\n }\n\n return acc;\n },\n { data: {} },\n );\n};\n","import { CACHE_ENTRY_QUERIED, type CacheTypes, type RequestOptions } from '@graphql-box/core';\nimport { type CacheManagerContext, type CacheManagerDef } from '../types.ts';\n\ntype Descriptor = (\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: CacheManagerContext & { requestFieldCacheKey?: string },\n // Proving more difficult to fix, that worth the effort\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n) => Promise<never | undefined>;\n\nexport const logCacheQuery = () => {\n return (_target: CacheManagerDef, _propertyName: string, descriptor: TypedPropertyDescriptor<Descriptor>): void => {\n const method = descriptor.value;\n\n if (!method) {\n return;\n }\n\n descriptor.value = async function descriptorValue(...args: Parameters<Descriptor>): ReturnType<Descriptor> {\n // Proving more difficult to fix, that worth the effort\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n return new Promise<never | undefined>(resolve => {\n const resolver = async () => {\n const { debugManager, requestFieldCacheKey, ...otherContext } = args[3];\n\n if (!debugManager) {\n // Proving more difficult to fix, that worth the effort\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n resolve(await method.apply(this, args));\n return;\n }\n\n const startTime = debugManager.now();\n // Proving more difficult to fix, that worth the effort\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n const result = await method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n resolve(result);\n\n const payload = {\n cacheType: args[0],\n context: otherContext,\n options: args[2],\n requestHash: args[1],\n result,\n stats: { duration, endTime, startTime },\n ...(requestFieldCacheKey ? { decryptedCacheKey: requestFieldCacheKey } : {}),\n };\n\n debugManager.log(CACHE_ENTRY_QUERIED, payload);\n };\n\n void resolver();\n });\n };\n };\n};\n","import { CACHE_ENTRY_ADDED, type CacheTypes, type CachemapOptions, type RequestOptions } from '@graphql-box/core';\nimport { type CacheManagerContext, type CacheManagerDef } from '../types.ts';\n\ntype Descriptor = (\n cacheType: CacheTypes,\n hash: string,\n value: unknown,\n cachemapOptions: CachemapOptions,\n options: RequestOptions,\n context: CacheManagerContext & { requestFieldCacheKey?: string },\n) => Promise<void>;\n\nexport const logCacheEntry = () => {\n return (_target: CacheManagerDef, _propertyName: string, descriptor: TypedPropertyDescriptor<Descriptor>): void => {\n const method = descriptor.value;\n\n if (!method) {\n return;\n }\n\n descriptor.value = async function descriptorValue(...args: Parameters<Descriptor>): ReturnType<Descriptor> {\n return new Promise<void>(resolve => {\n const resolver = async () => {\n const { debugManager, requestFieldCacheKey, ...otherContext } = args[5];\n\n if (!debugManager) {\n await method.apply(this, args);\n resolve();\n return;\n }\n\n const startTime = debugManager.now();\n await method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n resolve();\n\n const payload = {\n cacheType: args[0],\n cachemapOptions: args[3],\n context: otherContext,\n options: args[4],\n requestHash: args[1],\n stats: { duration, endTime, startTime },\n value: args[2],\n ...(requestFieldCacheKey ? { decryptedCacheKey: requestFieldCacheKey } : {}),\n };\n\n debugManager.log(CACHE_ENTRY_ADDED, payload);\n };\n\n void resolver();\n });\n };\n };\n};\n","import { PARTIAL_QUERY_COMPILED, type RequestOptions } from '@graphql-box/core';\nimport { type CacheManagerContext, type CacheManagerDef, type PartialQueryResponse } from '../types.ts';\n\ntype Descriptor = (\n hash: string,\n partialQueryResponse: PartialQueryResponse,\n options: RequestOptions,\n context: CacheManagerContext,\n) => void;\n\nexport const logPartialCompiled = () => {\n return (_target: CacheManagerDef, _propertyName: string, descriptor: TypedPropertyDescriptor<Descriptor>): void => {\n const method = descriptor.value;\n\n if (!method) {\n return;\n }\n\n descriptor.value = function descriptorValue(...args: Parameters<Descriptor>): ReturnType<Descriptor> {\n const { debugManager, ...otherContext } = args[3];\n\n if (!debugManager) {\n method.apply(this, args);\n return;\n }\n\n const startTime = debugManager.now();\n method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n\n debugManager.log(PARTIAL_QUERY_COMPILED, {\n context: otherContext,\n options: args[2],\n requestHash: args[0],\n result: args[1],\n stats: { duration, endTime, startTime },\n });\n };\n };\n};\n"],"names":["NO_CACHE","checkValue","value","typeIDKey","isArray","reduce","acc","entry","isPlainObject","recursivelyCheckProps","data","keys","Object","length","key","isNumber","isString","allCacheTiersDisabled","entity","queryResponse","requestPath","entityCacheTierEnabled","tiersEnabled","entityOrRequestPathCacheTiersEnabled","queryResponseCacheTierEnabled","requestPathCacheTierEnabled","mergeDataSets","obj","source","mergeObjects","_key","undefined","combineDataSets","dataSetA","dataSetB","isObjectLike","createEntityDataKey","fieldData","fieldTypeInfo","context","isEntity","typeName","__typename","String","deriveOpCacheability","_cacheMetadata","fallback","headers","isEmpty","first","rest","values","Cacheability","metadata","ttl","has","cacheControl","isFieldEntity","possibleTypes","some","type","filterOutPropsWithEntityArgsOrDirectives","field","ancestorKeysAndPaths","fieldAndTypeName","resolveFragments","selectionSet","selections","fragmentDefinitions","match","find","fieldNode","getName","keysAndPaths","buildFieldKeysAndPaths","fieldTypeMap","get","requestFieldPath","hasArguments","hasDirectives","filterOutPropsWithEntityOrArgs","checkFieldPathChecklist","fieldPathChecklistValues","fieldTypeName","hasData","typeUnused","fieldPathChecklistValue","every","filterField","fieldPathChecklist","fragmentSpreadChecklist","ancestorRequestFieldPath","fieldsAndTypeNames","getChildFields","fragmentSpreadFieldCounter","index","childField","fragmentKind","fragmentName","childTypeName","Kind","FRAGMENT_SPREAD","total","childFieldName","TYPE_NAME_KEY","counter","hasChildFields","deleteChildFields","entries","checklist","paths","push","deleteFragmentSpreads","deleted","filterFragmentSpreads","inlineFragments","getInlineFragments","filtered","fragment","deleteInlineFragments","filterInlineFragments","fieldNames","map","name","filterIDsAndTypeNames","filterQuery","requestData","ast","queryNode","getOperationDefinitions","operation","request","RegExp","createFragmentSpreadChecklist","queryFiltered","definitionsToFilter","namesAndPaths","path","fragmentDefinition","definitionsToDelete","names","deleteFragmentDefinitions","include","filterFragmentDefinitions","getDataValue","hasTypename","CacheManager","_countFieldPathChecklist","fieldCount","missing","checklistValues","filter","_getFieldDataFromAncestor","ancestorFieldData","propNameOrIndex","dataValue","structuredClone","_getOperationCacheControl","cacheMetadata","defaultCacheControl","cacheability","printCacheControl","_isNodeEntity","_isNodeRequestFieldPath","this","_isValid","checkTTL","_mergeResponseCacheMetadata","partialQueryResponse","Map","_setCachedData","responseData","setData","isUndefined","_setCachedResponseSlice","cachedFieldData","typeNamesAndKind","_options","_setCacheMetadata","_setFieldPathChecklist","set","operationCacheability","dataTypename","dataTypeName","fieldTypename","constructor","options","_cacheTiersEnabled","_partialQueryResponses","_responseChunksAwaitingCaching","errors","ArgsError","typeCacheDirectives","message","GroupedError","cache","then","_cache","catch","error","cacheTiersEnabled","_cascadeCacheControl","cascadeCacheControl","_fallbackOperationCacheability","fallbackOperationCacheability","_typeCacheDirectives","_typeIDKey","DEFAULT_TYPE_ID_KEY","analyzeQuery","updated","hash","cacheManagerContext","getFragmentDefinitions","cachedResponseData","_retrieveCachedResponseData","areOnlyPopulatedFieldsTypeIdKeys","dataCaching","_setQueryResponseCacheEntry","awaitDataCaching","response","filteredAST","filteredRequest","print","assign","_setPartialQueryResponse","hashRequest","cacheQuery","updatedRequestData","rawResponseData","_cacheResponse","cacheResponse","checkCacheEntry","cacheType","_checkCacheEntry","checkQueryResponseCacheEntry","result","QUERY_RESPONSES","rehydrateCacheMetadata","deletePartialQueryResponse","delete","setQueryResponseCacheEntry","_analyzeFieldNode","cachedAncestorFieldData","_analyzeParentFieldNode","_analyzeLeafFieldNode","hashedRequestFieldCacheKey","requestFieldCacheKey","entityData","requestFieldPathData","typenamesAndKind","_retrieveCachedRequestFieldPathData","_retrieveCachedParentNodeData","promises","iterateChildFields","childFragmentKind","childFragmentName","childIndex","Promise","all","_buildCacheMetadata","otherProps","_createCacheMetadata","_setFieldCacheability","normalizedResponseData","normalizePatchResponseData","responseDataForCaching","hasDeferOrStream","hasNext","isNotLastResponseChunk","_setResponseChunksAwaitingCaching","isLastResponseChunk","_retrieveResponseDataForCaching","queryCacheMetadata","queryData","_setEntityAndRequestFieldPathCacheEntries","OperationTypeNode","QUERY","_getPartialQueryResponse","_mergeResponseData","isNotResponseChunk","_hasCacheEntry","_getCacheEntry","_context","_parseEntityAndRequestFieldPathCacheEntryData","responseDataPath","_typeName","_fragmentKind","_fragmentName","hasArgsOrDirectives","_setRequestFieldPathCacheEntry","__cacheKey","REQUEST_FIELD_PATHS","unset","_setEntityCacheEntry","DATA_ENTITIES","_retrieveCachedEntityData","validTypeIDValue","typeNames","validResults","validResult","sort","a","b","firstResult","ancestorEntityData","ancestorRequestFieldPathData","entryCacheability","typeIDValue","getValidTypeIdValue","isEqual","responseChunks","requestID","responseDataSets","dataSet","merge","_setCacheEntry","cachemapOptions","operationNode","entityDataKey","cacheHeaders","tag","_setFieldTypeCacheDirective","dehydratedCacheMetadata","dehydrateCacheMetadata","_target","_propertyName","descriptor","method","async","args","resolve","debugManager","otherContext","apply","startTime","now","endTime","duration","payload","requestHash","stats","decryptedCacheKey","log","CACHE_ENTRY_QUERIED","resolver","CACHE_ENTRY_ADDED","PARTIAL_QUERY_COMPILED","_ts_metadata"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../cache-manager/src//constants.ts","../cache-manager/src//helpers/areOnlyPopulatedFieldsTypeIdKeys.ts","../cache-manager/src//helpers/cacheTiersEnabled.ts","../cache-manager/src//helpers/mergeObjects.ts","../cache-manager/src//helpers/combineData.ts","../cache-manager/src//helpers/createEntityDataKey.ts","../cache-manager/src//helpers/deriveOpCacheability.ts","../cache-manager/src//helpers/isFieldEntity.ts","../cache-manager/src//helpers/filterOutPropsWithEntityArgsOrDirectives.ts","../cache-manager/src//helpers/filterOutPropsWithEntityOrArgs.ts","../cache-manager/src//helpers/checkFieldPathChecklist.ts","../cache-manager/src//helpers/filterField.ts","../cache-manager/src//helpers/filterFragmentSpreads.ts","../cache-manager/src//helpers/filterInlineFragments.ts","../cache-manager/src//helpers/filterIDsAndTypeNames.ts","../cache-manager/src//helpers/filterQuery.ts","../cache-manager/src//helpers/createFragmentSpreadChecklist.ts","../cache-manager/src//helpers/filterFragmentDefinitions.ts","../cache-manager/src//helpers/getDataValue.ts","../cache-manager/src//helpers/hasTypename.ts","../cache-manager/src//main.ts","../cache-manager/src//helpers/normalizePatchResponseData.ts","../cache-manager/src//helpers/isNotLastResponseChunk.ts","../cache-manager/src//helpers/isLastResponseChunk.ts","../cache-manager/src//helpers/isNotResponseChunk.ts","../cache-manager/src//helpers/validTypeIdValue.ts","../cache-manager/src//helpers/mergeResponseDataSets.ts","../cache-manager/src//debug/logCacheQuery.ts","../cache-manager/src//debug/logCacheEntry.ts","../cache-manager/src//debug/logPartialCompiled.ts"],"sourcesContent":["export const METADATA = 'metadata';\nexport const CACHE_CONTROL = 'cacheControl';\nexport const NO_CACHE = 'noCache';\n\nexport const HEADER_CACHE_CONTROL = 'cache-control';\nexport const HEADER_NO_CACHE = 'no-cache';\n","import { type PlainData } from '@graphql-box/core';\nimport { isArray, isPlainObject } from '@graphql-box/helpers';\nimport { isNumber, isString } from 'lodash-es';\n\nconst checkValue = (value: unknown, typeIDKey: string): boolean => {\n if (isArray(value)) {\n return value.reduce<boolean>((acc, entry) => {\n if (!acc) {\n return false;\n }\n\n return checkValue(entry, typeIDKey);\n }, true);\n }\n\n if (isPlainObject(value)) {\n return recursivelyCheckProps(value, typeIDKey);\n }\n\n return false;\n};\n\nconst recursivelyCheckProps = (data: PlainData, typeIDKey: string): boolean => {\n const keys = isPlainObject(data) ? Object.keys(data) : [...data.keys()];\n\n if (keys.length === 1 && isPlainObject(data) && !!data[typeIDKey]) {\n return true;\n }\n\n return keys.reduce<boolean>((acc, key) => {\n if (!acc) {\n return false;\n }\n\n if (isNumber(key) && isArray(data)) {\n return checkValue(data[key], typeIDKey);\n } else if (isString(key) && isPlainObject(data)) {\n return checkValue(data[key], typeIDKey);\n }\n\n return acc;\n }, true);\n};\n\nexport const areOnlyPopulatedFieldsTypeIdKeys = (data: PlainData, typeIDKey: string) => {\n return recursivelyCheckProps(data, typeIDKey);\n};\n","import { type CacheTiersEnabled } from '../types.ts';\n\nexport const allCacheTiersDisabled = ({ entity, queryResponse, requestPath }: CacheTiersEnabled) =>\n !entity && !queryResponse && !requestPath;\n\nexport const entityCacheTierEnabled = (tiersEnabled: CacheTiersEnabled) => !!tiersEnabled.entity;\n\nexport const entityOrRequestPathCacheTiersEnabled = ({ entity, requestPath }: CacheTiersEnabled) =>\n !!(entity ?? requestPath);\n\nexport const queryResponseCacheTierEnabled = (tiersEnabled: CacheTiersEnabled) => !!tiersEnabled.queryResponse;\n\nexport const requestPathCacheTierEnabled = (tiersEnabled: CacheTiersEnabled) => !!tiersEnabled.requestPath;\n\nexport const someCacheTiersEnabled = (tiersEnabled: CacheTiersEnabled) => !allCacheTiersDisabled(tiersEnabled);\n","import { isPlainObject, mergeObjects } from '@graphql-box/helpers';\n\nexport const mergeDataSets = <T extends object>(obj: T, source: T, typeIDKey: string): T => {\n return mergeObjects<T>(obj, source, (_key: string, value: unknown): string | number | undefined => {\n // Casting of ease of typing\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return isPlainObject(value) && value[typeIDKey] ? (value[typeIDKey] as string | number) : undefined;\n });\n};\n","import { isObjectLike } from '@graphql-box/helpers';\nimport { mergeDataSets } from './mergeObjects.ts';\n\nexport const combineDataSets = (dataSetA: unknown, dataSetB: unknown, typeIDKey: string) => {\n if (!dataSetA && dataSetB) {\n return dataSetB;\n }\n\n if (isObjectLike(dataSetA) && isObjectLike(dataSetB)) {\n return mergeDataSets(dataSetA, dataSetB, typeIDKey);\n }\n\n return dataSetA;\n};\n","import { type EntityData, type FieldTypeInfo } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const createEntityDataKey = (\n fieldData: EntityData,\n fieldTypeInfo: FieldTypeInfo,\n context: CacheManagerContext,\n) => {\n const fieldTypeName = fieldTypeInfo.isEntity ? fieldTypeInfo.typeName : fieldData.__typename;\n // In context, context.typeIDKey is never gonna be undefined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return `${fieldTypeName}::${String(fieldData[context.typeIDKey!])}`;\n};\n","import { type DehydratedCacheMetadata } from '@graphql-box/core';\nimport { Cacheability } from 'cacheability';\nimport { isEmpty } from 'lodash-es';\nimport { HEADER_CACHE_CONTROL } from '../constants.ts';\n\nexport type Params = {\n _cacheMetadata?: DehydratedCacheMetadata;\n fallback: string;\n headers?: Headers;\n};\n\nexport const deriveOpCacheability = ({ _cacheMetadata, fallback, headers }: Params): Cacheability => {\n if (_cacheMetadata && !isEmpty(_cacheMetadata)) {\n const [first, ...rest] = Object.values(_cacheMetadata);\n\n return new Cacheability({\n metadata: rest.reduce((acc, metadata) => {\n if (!acc) {\n return metadata;\n }\n\n if (metadata.ttl < acc.ttl) {\n return metadata;\n }\n\n return acc;\n }, first),\n });\n }\n\n if (headers?.has(HEADER_CACHE_CONTROL)) {\n return new Cacheability({ headers });\n }\n\n return new Cacheability({ cacheControl: fallback });\n};\n","import { type EntityData, type FieldTypeInfo } from '@graphql-box/core';\nimport { isPlainObject } from '@graphql-box/helpers';\n\nexport const isFieldEntity = (\n fieldData: unknown,\n fieldTypeInfo: FieldTypeInfo | undefined,\n typeIDKey: string,\n): fieldData is EntityData => {\n if (!isPlainObject(fieldData) || !(typeIDKey in fieldData)) {\n return false;\n }\n\n const { isEntity = false, possibleTypes = [] } = fieldTypeInfo ?? {};\n\n if (isEntity) {\n return true;\n }\n\n if (possibleTypes.length === 0) {\n return false;\n }\n\n return possibleTypes.some(type => type.typeName === fieldData.__typename);\n};\n","import { type PlainObject } from '@graphql-box/core';\nimport {\n type KeysAndPaths,\n buildFieldKeysAndPaths,\n getName,\n isPlainObject,\n resolveFragments,\n} from '@graphql-box/helpers';\nimport { type FieldNode } from 'graphql';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\nimport { isFieldEntity } from './isFieldEntity.ts';\n\nexport const filterOutPropsWithEntityArgsOrDirectives = (\n fieldData: unknown,\n field: FieldNode,\n ancestorKeysAndPaths: KeysAndPaths,\n context: CacheManagerContext,\n) => {\n if (!isPlainObject(fieldData)) {\n return fieldData;\n }\n\n const fieldAndTypeName = resolveFragments(field.selectionSet?.selections, context.fragmentDefinitions);\n\n return keys(fieldData).reduce<PlainObject>((acc, key) => {\n const match = fieldAndTypeName.find(({ fieldNode }) => getName(fieldNode) === key);\n\n if (match) {\n const keysAndPaths = buildFieldKeysAndPaths(match.fieldNode, ancestorKeysAndPaths, context);\n const fieldTypeInfo = context.fieldTypeMap.get(keysAndPaths.requestFieldPath);\n\n if (\n // In this context, typeIDKey cannot be undefined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n isFieldEntity(fieldData[key], fieldTypeInfo, context.typeIDKey!) ||\n fieldTypeInfo?.hasArguments ||\n fieldTypeInfo?.hasDirectives\n ) {\n // In this context, this is safe\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete fieldData[key];\n }\n }\n\n return acc;\n }, fieldData);\n};\n","import { type EntityData } from '@graphql-box/core';\nimport { type KeysAndPaths, buildFieldKeysAndPaths, getName, resolveFragments } from '@graphql-box/helpers';\nimport { type FieldNode } from 'graphql';\nimport { type CacheManagerContext } from '../types.ts';\nimport { isFieldEntity } from './isFieldEntity.ts';\n\nexport const filterOutPropsWithEntityOrArgs = (\n fieldData: EntityData,\n field: FieldNode,\n ancestorKeysAndPaths: KeysAndPaths,\n context: CacheManagerContext,\n) => {\n const fieldAndTypeName = resolveFragments(field.selectionSet?.selections, context.fragmentDefinitions);\n\n // The data returned will be EntityData\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return Object.keys(fieldData).reduce<Partial<EntityData>>((acc, key) => {\n const match = fieldAndTypeName.find(({ fieldNode }) => getName(fieldNode) === key);\n\n if (match) {\n const { requestFieldPath } = buildFieldKeysAndPaths(match.fieldNode, ancestorKeysAndPaths, context);\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n\n // In this context, typeIDKey will not be undefined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (isFieldEntity(fieldData[key], fieldTypeInfo, context.typeIDKey!) || fieldTypeInfo?.hasArguments) {\n // In this context, this is safe\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete fieldData[key];\n }\n }\n\n return acc;\n }, fieldData) as EntityData;\n};\n","import { type CheckFieldPathChecklistResult, type FieldPathChecklistValue } from '../types.ts';\n\nexport const checkFieldPathChecklist = (\n fieldPathChecklistValues: FieldPathChecklistValue[] | undefined,\n fieldTypeName: string | undefined,\n): CheckFieldPathChecklistResult => {\n if (!fieldPathChecklistValues || fieldPathChecklistValues.length === 0) {\n return { hasData: false, typeUnused: !!fieldTypeName };\n }\n\n const [fieldPathChecklistValue] = fieldPathChecklistValues;\n\n if (fieldPathChecklistValue) {\n const { hasData, typeName } = fieldPathChecklistValue;\n const typeUnused = typeName ? typeName !== fieldTypeName : undefined;\n return { hasData, typeUnused };\n }\n\n return {\n hasData: fieldPathChecklistValues.some(({ hasData, typeName }) => typeName === fieldTypeName && hasData),\n typeUnused: !fieldPathChecklistValues.every(({ typeName }) => typeName === fieldTypeName),\n };\n};\n","import { TYPE_NAME_KEY } from '@graphql-box/core';\nimport {\n buildFieldKeysAndPaths,\n deleteChildFields,\n getChildFields,\n getName,\n hasChildFields,\n} from '@graphql-box/helpers';\nimport { type FieldNode, type FragmentDefinitionNode, Kind, type OperationDefinitionNode } from 'graphql';\nimport { type CacheManagerContext, type FieldPathChecklist, type FragmentSpreadFieldCounter } from '../types.ts';\nimport { checkFieldPathChecklist } from './checkFieldPathChecklist.ts';\nimport { type FragmentSpreadCheckist } from './createFragmentSpreadChecklist.ts';\nimport { filterFragmentSpreads } from './filterFragmentSpreads.ts';\nimport { filterIDsAndTypeNames } from './filterIDsAndTypeNames.ts';\nimport { filterInlineFragments } from './filterInlineFragments.ts';\n\nexport const filterField = (\n field: FieldNode | FragmentDefinitionNode | OperationDefinitionNode,\n fieldPathChecklist: FieldPathChecklist,\n fragmentSpreadChecklist: FragmentSpreadCheckist,\n ancestorRequestFieldPath: string,\n context: CacheManagerContext,\n): boolean => {\n const { fragmentDefinitions, typeIDKey } = context;\n const fieldsAndTypeNames = getChildFields(field, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames) {\n return false;\n }\n\n const fragmentSpreadFieldCounter: FragmentSpreadFieldCounter = {};\n\n for (let index = fieldsAndTypeNames.length - 1; index >= 0; index -= 1) {\n const fieldAndTypeName = fieldsAndTypeNames[index];\n\n if (!fieldAndTypeName) {\n continue;\n }\n\n const { fieldNode: childField, fragmentKind, fragmentName, typeName: childTypeName } = fieldAndTypeName;\n\n if (fragmentKind === Kind.FRAGMENT_SPREAD && fragmentName && !fragmentSpreadFieldCounter[fragmentName]) {\n fragmentSpreadFieldCounter[fragmentName] = {\n hasData: 0,\n total: fragmentDefinitions?.[fragmentName]\n ? (getChildFields(fragmentDefinitions[fragmentName], { fragmentDefinitions })?.length ?? 0)\n : 0,\n };\n }\n\n const childFieldName = getName(childField);\n\n if (childFieldName === typeIDKey || childFieldName === TYPE_NAME_KEY) {\n continue;\n }\n\n const { requestFieldPath } = buildFieldKeysAndPaths(\n childField,\n {\n requestFieldPath: ancestorRequestFieldPath,\n },\n context,\n );\n\n const { hasData, typeUnused } = checkFieldPathChecklist(fieldPathChecklist.get(requestFieldPath), childTypeName);\n\n if (hasData || typeUnused) {\n if (fragmentKind === Kind.FRAGMENT_SPREAD && fragmentName) {\n const counter = fragmentSpreadFieldCounter[fragmentName];\n\n if (counter) {\n counter.hasData += 1;\n }\n } else if (!hasChildFields(childField, { fragmentDefinitions })) {\n deleteChildFields(field, childField);\n } else if (filterField(childField, fieldPathChecklist, fragmentSpreadChecklist, requestFieldPath, context)) {\n deleteChildFields(field, childField);\n }\n }\n }\n\n filterFragmentSpreads(field, fragmentSpreadFieldCounter, fragmentSpreadChecklist, ancestorRequestFieldPath);\n filterInlineFragments(field, context);\n filterIDsAndTypeNames(field, context);\n return !hasChildFields(field, { fragmentDefinitions });\n};\n","import { deleteFragmentSpreads } from '@graphql-box/helpers';\nimport { type FieldNode, type FragmentDefinitionNode, type OperationDefinitionNode } from 'graphql';\nimport { isEmpty } from 'lodash-es';\nimport { type FragmentSpreadFieldCounter } from '../types.ts';\nimport { type FragmentSpreadCheckist } from './createFragmentSpreadChecklist.ts';\n\nexport const filterFragmentSpreads = (\n field: FieldNode | FragmentDefinitionNode | OperationDefinitionNode,\n fragmentSpreadFieldCounter: FragmentSpreadFieldCounter,\n fragmentSpreadChecklist: FragmentSpreadCheckist,\n ancestorRequestFieldPath: string,\n) => {\n if (isEmpty(fragmentSpreadFieldCounter)) {\n return;\n }\n\n for (const [key, value] of Object.entries(fragmentSpreadFieldCounter)) {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n continue;\n }\n\n checklist.paths.push(ancestorRequestFieldPath);\n const { hasData, total } = value;\n\n if (hasData === total) {\n deleteFragmentSpreads(field, key);\n checklist.deleted += 1;\n }\n }\n};\n","import { deleteInlineFragments, getChildFields, getInlineFragments, getName } from '@graphql-box/helpers';\nimport { type FieldNode, type FragmentDefinitionNode, type OperationDefinitionNode } from 'graphql';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const filterInlineFragments = (\n field: FieldNode | FragmentDefinitionNode | OperationDefinitionNode,\n { fragmentDefinitions, typeIDKey }: CacheManagerContext,\n) => {\n const inlineFragments = getInlineFragments(field);\n let filtered = false;\n\n for (const fragment of inlineFragments) {\n const fieldsAndTypeNames = getChildFields(fragment, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames || fieldsAndTypeNames.length === 0) {\n deleteInlineFragments(field, fragment);\n filtered = true;\n continue;\n }\n\n const [fieldAndTypeName] = fieldsAndTypeNames;\n\n if (fieldAndTypeName) {\n const { fieldNode } = fieldAndTypeName;\n\n if (getName(fieldNode) === typeIDKey) {\n deleteInlineFragments(field, fragment);\n filtered = true;\n }\n }\n }\n\n return filtered;\n};\n","import { TYPE_NAME_KEY } from '@graphql-box/core';\nimport { deleteChildFields, getChildFields } from '@graphql-box/helpers';\nimport { type FieldNode, type FragmentDefinitionNode, type OperationDefinitionNode } from 'graphql';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const filterIDsAndTypeNames = (\n field: FieldNode | FragmentDefinitionNode | OperationDefinitionNode,\n { fragmentDefinitions, typeIDKey }: CacheManagerContext,\n) => {\n const fieldsAndTypeNames = getChildFields(field, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames || fieldsAndTypeNames.length > 3) {\n return false;\n }\n\n const fieldNames = fieldsAndTypeNames.map(({ fieldNode }) => fieldNode.name.value);\n\n if (fieldNames.length === 2 && fieldNames.every(name => name === typeIDKey || name === TYPE_NAME_KEY)) {\n deleteChildFields(\n field,\n fieldsAndTypeNames.map(({ fieldNode }) => fieldNode),\n );\n\n return true;\n }\n\n if ((fieldNames.length === 1 && fieldNames[0] === typeIDKey) || fieldNames[0] === TYPE_NAME_KEY) {\n const [fieldAndTypeName] = fieldsAndTypeNames;\n\n if (fieldAndTypeName) {\n const { fieldNode } = fieldAndTypeName;\n deleteChildFields(field, fieldNode);\n return true;\n }\n }\n\n return false;\n};\n","import { type RequestData } from '@graphql-box/core';\nimport {\n buildFieldKeysAndPaths,\n deleteChildFields,\n getChildFields,\n getOperationDefinitions,\n} from '@graphql-box/helpers';\nimport { type CacheManagerContext, type CachedResponseData } from '../types.ts';\nimport { createFragmentSpreadChecklist } from './createFragmentSpreadChecklist.ts';\nimport { filterField } from './filterField.ts';\nimport { filterFragmentDefinitions } from './filterFragmentDefinitions.ts';\n\nexport const filterQuery = (\n requestData: RequestData,\n { fieldPathChecklist }: CachedResponseData,\n context: CacheManagerContext,\n) => {\n const { ast } = requestData;\n const queryNode = getOperationDefinitions(ast, context.data.operation)[0];\n\n if (!queryNode) {\n return ast;\n }\n\n const { data, fragmentDefinitions } = context;\n const fieldsAndTypeNames = getChildFields(queryNode, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames) {\n return ast;\n }\n\n const fragmentSpreadChecklist = createFragmentSpreadChecklist(requestData, context);\n\n for (let index = fieldsAndTypeNames.length - 1; index >= 0; index -= 1) {\n // In this context fieldsAndTypeNames[index] will not be undefined\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const { fieldNode } = fieldsAndTypeNames[index]!;\n\n const { requestFieldPath } = buildFieldKeysAndPaths(\n fieldNode,\n {\n requestFieldPath: data.operation,\n },\n context,\n );\n\n if (filterField(fieldNode, fieldPathChecklist, fragmentSpreadChecklist, requestFieldPath, context)) {\n deleteChildFields(queryNode, fieldNode);\n }\n }\n\n context.data.queryFiltered = true;\n return filterFragmentDefinitions(ast, fieldPathChecklist, fragmentSpreadChecklist, context);\n};\n","import { type RequestData } from '@graphql-box/core';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport type FragmentSpreadCheckist = Record<\n string,\n {\n deleted: number;\n paths: string[];\n total: number;\n }\n>;\n\nexport const createFragmentSpreadChecklist = ({ request }: RequestData, { fragmentDefinitions }: CacheManagerContext) =>\n keys(fragmentDefinitions ?? {}).reduce<FragmentSpreadCheckist>((acc, name) => {\n acc[name] = { deleted: 0, paths: [], total: (request.match(new RegExp(`\\\\.\\\\.\\\\.${name}`, 'g')) ?? []).length };\n return acc;\n }, {});\n","import { deleteFragmentDefinitions } from '@graphql-box/helpers';\nimport { type DocumentNode } from 'graphql';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext, type FieldPathChecklist } from '../types.ts';\nimport { type FragmentSpreadCheckist } from './createFragmentSpreadChecklist.ts';\nimport { filterField } from './filterField.ts';\n\nexport const filterFragmentDefinitions = (\n ast: DocumentNode,\n fieldPathChecklist: FieldPathChecklist,\n fragmentSpreadChecklist: FragmentSpreadCheckist,\n context: CacheManagerContext,\n) => {\n const definitionsToFilter = keys(fragmentSpreadChecklist).reduce<{ name: string; path: string }[]>(\n (namesAndPaths, key) => {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n return namesAndPaths;\n }\n\n const { deleted, paths, total } = checklist;\n // Will come back and sort this out later\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return deleted === 0 && total === 1 ? [...namesAndPaths, { name: key, path: paths[0]! }] : namesAndPaths;\n },\n [],\n );\n\n const { fragmentDefinitions = {} } = context;\n\n for (const { name, path } of definitionsToFilter) {\n const fragmentDefinition = fragmentDefinitions[name];\n\n if (!fragmentDefinition) {\n continue;\n }\n\n filterField(fragmentDefinition, fieldPathChecklist, fragmentSpreadChecklist, path, context);\n }\n\n const definitionsToDelete = keys(fragmentSpreadChecklist).reduce<string[]>((names, key) => {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n return names;\n }\n\n const { deleted, total } = checklist;\n return deleted > 0 && deleted === total ? [...names, key] : names;\n }, []);\n\n if (definitionsToDelete.length === 0) {\n return ast;\n }\n\n return deleteFragmentDefinitions(ast, {\n include: definitionsToDelete,\n });\n};\n","import { isArray, isPlainObject } from '@graphql-box/helpers';\nimport { isNumber, isString } from 'lodash-es';\n\nexport const getDataValue = <T>(value: unknown, key: string | number): T | undefined => {\n if (isArray(value) && isNumber(key)) {\n // Casting for ease of typing for consumers\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return value[key] as T;\n }\n\n if (isPlainObject(value) && isString(key)) {\n // Casting for ease of typing for consumers\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return value[key] as T;\n }\n\n return;\n};\n","import { TYPE_NAME_KEY, type TypedData } from '@graphql-box/core';\nimport { isObjectLike } from '@graphql-box/helpers';\nimport { isString } from 'lodash-es';\n\nexport const hasTypename = (value: unknown): value is TypedData => {\n if (!isObjectLike(value)) {\n return false;\n }\n\n return TYPE_NAME_KEY in value && isString(value[TYPE_NAME_KEY]);\n};\n","import { type Core } from '@cachemap/core';\nimport {\n type CacheMetadata,\n type CacheTypes,\n type CachemapOptions,\n DATA_ENTITIES,\n DEFAULT_TYPE_ID_KEY,\n type EntityData,\n type FieldTypeInfo,\n type PlainData,\n QUERY_RESPONSES,\n REQUEST_FIELD_PATHS,\n type RawResponseDataWithMaybeCacheMetadata,\n type RequestContext,\n type RequestData,\n type RequestOptions,\n type ResponseData,\n TYPE_NAME_KEY,\n} from '@graphql-box/core';\nimport {\n ArgsError,\n GroupedError,\n type KeysAndPaths,\n buildFieldKeysAndPaths,\n dehydrateCacheMetadata,\n getChildFields,\n getFragmentDefinitions,\n getOperationDefinitions,\n hasChildFields,\n hashRequest,\n isArray,\n isObjectLike,\n isPlainObject,\n iterateChildFields,\n rehydrateCacheMetadata,\n} from '@graphql-box/helpers';\nimport { Cacheability } from 'cacheability';\nimport { type FieldNode, Kind, OperationTypeNode, print } from 'graphql';\nimport { assign, get, isEqual, isNumber, isUndefined, set, unset } from 'lodash-es';\nimport { CACHE_CONTROL, HEADER_NO_CACHE, METADATA, NO_CACHE } from './constants.ts';\nimport { logCacheEntry, logCacheQuery, logPartialCompiled } from './debug/index.ts';\nimport { areOnlyPopulatedFieldsTypeIdKeys } from './helpers/areOnlyPopulatedFieldsTypeIdKeys.ts';\nimport {\n allCacheTiersDisabled,\n entityCacheTierEnabled,\n entityOrRequestPathCacheTiersEnabled,\n queryResponseCacheTierEnabled,\n requestPathCacheTierEnabled,\n someCacheTiersEnabled,\n} from './helpers/cacheTiersEnabled.ts';\nimport { combineDataSets } from './helpers/combineData.ts';\nimport { createEntityDataKey } from './helpers/createEntityDataKey.ts';\nimport { deriveOpCacheability } from './helpers/deriveOpCacheability.ts';\nimport { filterOutPropsWithEntityArgsOrDirectives } from './helpers/filterOutPropsWithEntityArgsOrDirectives.ts';\nimport { filterOutPropsWithEntityOrArgs } from './helpers/filterOutPropsWithEntityOrArgs.ts';\nimport { filterQuery } from './helpers/filterQuery.ts';\nimport { getDataValue } from './helpers/getDataValue.ts';\nimport { hasTypename } from './helpers/hasTypename.ts';\nimport { isFieldEntity } from './helpers/isFieldEntity.ts';\nimport { isLastResponseChunk } from './helpers/isLastResponseChunk.ts';\nimport { isNotLastResponseChunk } from './helpers/isNotLastResponseChunk.ts';\nimport { isNotResponseChunk } from './helpers/isNotResponseChunk.ts';\nimport { mergeDataSets } from './helpers/mergeObjects.ts';\nimport { mergeResponseDataSets } from './helpers/mergeResponseDataSets.ts';\nimport { normalizePatchResponseData } from './helpers/normalizePatchResponseData.ts';\nimport { getValidTypeIdValue } from './helpers/validTypeIdValue.ts';\nimport {\n type AnalyzeQueryResult,\n type AncestorKeysAndPaths,\n type CacheManagerContext,\n type CacheManagerDef,\n type CacheTiersEnabled,\n type CachedAncestorFieldData,\n type CachedResponseData,\n type CheckCacheEntryResult,\n type DataForCachingEntry,\n type FieldCount,\n type FieldPathChecklist,\n type MergedCachedFieldData,\n type PartialQueryResponse,\n type PartialQueryResponses,\n type QueryResponseCacheEntry,\n type ResponseDataForCaching,\n type TypenamesAndKind,\n type UserOptions,\n} from './types.ts';\n\nexport class CacheManager implements CacheManagerDef {\n private static _countFieldPathChecklist(fieldPathChecklist: FieldPathChecklist): FieldCount {\n const fieldCount: FieldCount = { missing: 0, total: 0 };\n\n for (const [, checklistValues] of fieldPathChecklist) {\n fieldCount.total += checklistValues.length;\n const missing = checklistValues.filter(({ hasData }) => !hasData);\n fieldCount.missing += missing.length;\n }\n\n return fieldCount;\n }\n\n private static _getFieldDataFromAncestor<T>(ancestorFieldData: unknown, propNameOrIndex: string | number) {\n const dataValue = getDataValue<T>(ancestorFieldData, propNameOrIndex);\n return isObjectLike(dataValue) ? structuredClone(dataValue) : dataValue;\n }\n\n private static _getOperationCacheControl(cacheMetadata: CacheMetadata | undefined, operation: string): string {\n const defaultCacheControl = HEADER_NO_CACHE;\n\n if (!cacheMetadata) {\n return defaultCacheControl;\n }\n\n const cacheability = cacheMetadata.get(operation);\n return cacheability ? cacheability.printCacheControl() : defaultCacheControl;\n }\n\n private static _isNodeEntity(fieldTypeInfo?: FieldTypeInfo): boolean {\n if (!fieldTypeInfo) {\n return false;\n }\n\n const { isEntity, possibleTypes } = fieldTypeInfo;\n return isEntity || possibleTypes.some(type => type.isEntity);\n }\n\n private static _isNodeRequestFieldPath(fieldTypeInfo?: FieldTypeInfo): boolean {\n return (\n !!fieldTypeInfo &&\n (this._isNodeEntity(fieldTypeInfo) || fieldTypeInfo.hasArguments || fieldTypeInfo.hasDirectives)\n );\n }\n\n private static _isValid(cacheability: Cacheability): boolean {\n const noCache = get(cacheability, [METADATA, CACHE_CONTROL, NO_CACHE], false);\n return !noCache && cacheability.checkTTL();\n }\n\n private static _mergeResponseCacheMetadata(\n cacheMetadata: CacheMetadata,\n partialQueryResponse?: PartialQueryResponse,\n ): CacheMetadata {\n if (!partialQueryResponse) {\n return cacheMetadata;\n }\n\n return new Map([...partialQueryResponse.cacheMetadata, ...cacheMetadata]);\n }\n\n private static _setCachedData(\n responseData: unknown,\n { data }: MergedCachedFieldData,\n propNameOrIndex: string | number,\n ): void {\n const setData = (value: unknown) => {\n if (isArray(responseData) && isNumber(propNameOrIndex)) {\n responseData[propNameOrIndex] = value;\n } else if (isPlainObject(responseData)) {\n responseData[propNameOrIndex] = value;\n }\n };\n\n if (!isObjectLike(data) && !isUndefined(data)) {\n setData(data);\n } else if (isArray(data)) {\n setData([]);\n } else if (isPlainObject(data)) {\n setData({});\n }\n }\n\n private static _setCachedResponseSlice(\n cachedFieldData: MergedCachedFieldData,\n { cacheMetadata, data, fieldPathChecklist }: CachedResponseData,\n { propNameOrIndex, requestFieldPath }: KeysAndPaths,\n typeNamesAndKind: TypenamesAndKind,\n _options: RequestOptions,\n { data: ctxData }: CacheManagerContext,\n ) {\n CacheManager._setCacheMetadata(cacheMetadata, cachedFieldData.cacheability, requestFieldPath, ctxData.operation);\n CacheManager._setFieldPathChecklist(fieldPathChecklist, cachedFieldData, requestFieldPath, typeNamesAndKind);\n CacheManager._setCachedData(data, cachedFieldData, propNameOrIndex);\n }\n\n private static _setCacheMetadata(\n cacheMetadata: CacheMetadata,\n cacheability: Cacheability | undefined,\n requestFieldPath: string,\n operation: string,\n ): void {\n if (!cacheability) {\n return;\n }\n\n cacheMetadata.set(requestFieldPath, cacheability);\n const operationCacheability = cacheMetadata.get(operation);\n\n if (!operationCacheability || operationCacheability.metadata.ttl > cacheability.metadata.ttl) {\n cacheMetadata.set(operation, cacheability);\n }\n }\n\n private static _setFieldPathChecklist(\n fieldPathChecklist: FieldPathChecklist,\n { data }: MergedCachedFieldData,\n requestFieldPath: string,\n { dataTypename: dataTypeName, fieldTypename: fieldTypeName, fragmentKind, fragmentName }: TypenamesAndKind,\n ): void {\n if (isUndefined(fieldTypeName) || fragmentKind === Kind.FRAGMENT_SPREAD) {\n if (fieldPathChecklist.has(requestFieldPath)) {\n return;\n }\n\n fieldPathChecklist.set(requestFieldPath, [{ fragmentKind, fragmentName, hasData: !isUndefined(data) }]);\n return;\n }\n\n if (dataTypeName !== fieldTypeName) {\n return;\n }\n\n const entry = fieldPathChecklist.get(requestFieldPath);\n const checklistValues = entry ?? [];\n\n if (checklistValues.some(({ typeName }) => typeName === dataTypeName)) {\n return;\n }\n\n fieldPathChecklist.set(requestFieldPath, [\n ...checklistValues,\n { fragmentKind, fragmentName, hasData: !isUndefined(data), typeName: dataTypeName },\n ]);\n }\n\n private _cache: Core | undefined;\n private readonly _cacheTiersEnabled: CacheTiersEnabled = { entity: false, queryResponse: true, requestPath: false };\n private readonly _cascadeCacheControl: boolean;\n private readonly _fallbackOperationCacheability: string;\n private _partialQueryResponses: PartialQueryResponses = new Map();\n private _responseChunksAwaitingCaching = new Map<string, RawResponseDataWithMaybeCacheMetadata[]>();\n private readonly _typeCacheDirectives: Record<string, string>;\n private readonly _typeIDKey: string;\n\n constructor(options: UserOptions) {\n const errors: ArgsError[] = [];\n\n if (!('cache' in options)) {\n errors.push(new ArgsError('@graphql-box/cache-manager expected cache to be in options.'));\n }\n\n if (!!options.typeCacheDirectives && !isPlainObject(options.typeCacheDirectives)) {\n const message = '@graphql-box/cache-manager expected options.typeCacheDirectives to be a plain object.';\n errors.push(new ArgsError(message));\n }\n\n if (errors.length > 0) {\n throw new GroupedError('@graphql-box/cache-manager argument validation errors.', errors);\n }\n\n if (typeof options.cache === 'function') {\n void options\n .cache()\n .then(cache => {\n this._cache = cache;\n })\n .catch((error: unknown) => {\n throw error;\n });\n } else {\n this._cache = options.cache;\n }\n\n this._cacheTiersEnabled = { ...this._cacheTiersEnabled, ...options.cacheTiersEnabled };\n this._cascadeCacheControl = options.cascadeCacheControl ?? false;\n this._fallbackOperationCacheability = options.fallbackOperationCacheability ?? NO_CACHE;\n this._typeCacheDirectives = options.typeCacheDirectives ?? {};\n this._typeIDKey = options.typeIDKey ?? DEFAULT_TYPE_ID_KEY;\n }\n\n public async analyzeQuery(\n requestData: RequestData,\n options: RequestOptions,\n context: RequestContext,\n ): Promise<AnalyzeQueryResult> {\n // the client has already checked the query response cache with\n // `checkQueryResponseCacheEntry`, so at this point the entity and\n // request path caches are the only relevant ones.\n if (!entityOrRequestPathCacheTiersEnabled(this._cacheTiersEnabled)) {\n return { updated: requestData };\n }\n\n const { ast, hash } = requestData;\n\n const cacheManagerContext: CacheManagerContext = {\n ...context,\n fragmentDefinitions: getFragmentDefinitions(ast),\n typeIDKey: this._typeIDKey,\n };\n\n const cachedResponseData = await this._retrieveCachedResponseData(requestData, options, cacheManagerContext);\n const { cacheMetadata, data, fieldCount } = cachedResponseData;\n\n /**\n * Second half of check is required for the scenario where the only matching data is\n * the typeIDKey field, i.e. \"id\", in which case there is no point settings a partial\n * query response because we request the typeIDKey field with every request.\n */\n if (fieldCount.missing === fieldCount.total || areOnlyPopulatedFieldsTypeIdKeys(data, this._typeIDKey)) {\n return { updated: requestData };\n }\n\n if (!fieldCount.missing && queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n const dataCaching = this._setQueryResponseCacheEntry(hash, { cacheMetadata, data }, options, cacheManagerContext);\n\n if (options.awaitDataCaching) {\n await dataCaching;\n }\n\n return { response: { cacheMetadata, data } };\n }\n\n const filteredAST = filterQuery(requestData, cachedResponseData, cacheManagerContext);\n const filteredRequest = print(filteredAST);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fragmentDefinitions, typeIDKey, ...rest } = cacheManagerContext;\n assign(context, { ...rest, filteredRequest });\n\n if (queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n this._setPartialQueryResponse(hash, { cacheMetadata, data }, options, context);\n }\n\n return {\n updated: { ast: filteredAST, hash: hashRequest(filteredRequest), request: filteredRequest },\n };\n }\n\n get cache(): Core | undefined {\n return this._cache;\n }\n\n public async cacheQuery(\n requestData: RequestData,\n updatedRequestData: RequestData | undefined,\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: RequestContext,\n ): Promise<ResponseData> {\n const cacheManagerContext: CacheManagerContext = {\n ...context,\n fragmentDefinitions: getFragmentDefinitions((updatedRequestData ?? requestData).ast),\n typeIDKey: this._typeIDKey,\n };\n\n return this._cacheResponse(requestData, updatedRequestData, rawResponseData, options, cacheManagerContext);\n }\n\n public async cacheResponse(\n requestData: RequestData,\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: RequestContext,\n ): Promise<ResponseData> {\n const cacheManagerContext: CacheManagerContext = {\n ...context,\n fragmentDefinitions: getFragmentDefinitions(requestData.ast),\n typeIDKey: this._typeIDKey,\n };\n\n return this._cacheResponse(requestData, undefined, rawResponseData, options, cacheManagerContext);\n }\n\n get cacheTiersEnabled(): CacheTiersEnabled {\n return this._cacheTiersEnabled;\n }\n\n public async checkCacheEntry(\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: RequestContext & { requestFieldCacheKey?: string },\n ): Promise<CheckCacheEntryResult | false> {\n if (allCacheTiersDisabled(this._cacheTiersEnabled)) {\n return false;\n }\n\n return this._checkCacheEntry(cacheType, hash, options, context);\n }\n\n public async checkQueryResponseCacheEntry(\n hash: string,\n options: RequestOptions,\n context: RequestContext,\n ): Promise<ResponseData | false> {\n if (!queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n return false;\n }\n\n const result = await this._checkCacheEntry<QueryResponseCacheEntry>(QUERY_RESPONSES, hash, options, context);\n\n if (!result) {\n return false;\n }\n\n const { cacheMetadata, data } = result.entry;\n\n return {\n cacheMetadata: rehydrateCacheMetadata(cacheMetadata),\n data,\n };\n }\n\n public deletePartialQueryResponse(hash: string): void {\n if (queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n this._partialQueryResponses.delete(hash);\n }\n }\n\n public async setQueryResponseCacheEntry(\n requestData: RequestData,\n responseData: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n if (queryResponseCacheTierEnabled(this._cacheTiersEnabled)) {\n return this._setQueryResponseCacheEntry(requestData.hash, responseData, options, context);\n }\n }\n\n private async _analyzeFieldNode(\n fieldNode: FieldNode,\n cachedAncestorFieldData: CachedAncestorFieldData,\n cachedResponseData: CachedResponseData & { data: unknown },\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n await (hasChildFields(fieldNode, { fragmentDefinitions: context.fragmentDefinitions })\n ? this._analyzeParentFieldNode(fieldNode, cachedAncestorFieldData, cachedResponseData, options, context)\n : this._analyzeLeafFieldNode(fieldNode, cachedAncestorFieldData, cachedResponseData, options, context));\n }\n\n private async _analyzeLeafFieldNode(\n fieldNode: FieldNode,\n cachedAncestorFieldData: CachedAncestorFieldData,\n cachedResponseData: CachedResponseData & { data: unknown },\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const keysAndPaths = buildFieldKeysAndPaths(fieldNode, cachedAncestorFieldData, context);\n const { hashedRequestFieldCacheKey, propNameOrIndex, requestFieldCacheKey, requestFieldPath } = keysAndPaths;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n const { entityData, fragmentKind, fragmentName, requestFieldPathData, typeName } = cachedAncestorFieldData;\n\n const dataTypename = hasTypename(entityData)\n ? entityData.__typename\n : hasTypename(requestFieldPathData)\n ? requestFieldPathData.__typename\n : undefined;\n\n const typenamesAndKind = {\n dataTypename,\n fieldTypename: typeName,\n fragmentKind,\n fragmentName,\n };\n\n if (!CacheManager._isNodeRequestFieldPath(fieldTypeInfo)) {\n const cachedFieldData =\n CacheManager._getFieldDataFromAncestor(entityData, propNameOrIndex) ??\n CacheManager._getFieldDataFromAncestor(requestFieldPathData, propNameOrIndex);\n\n CacheManager._setFieldPathChecklist(\n cachedResponseData.fieldPathChecklist,\n { data: cachedFieldData },\n requestFieldPath,\n typenamesAndKind,\n );\n\n CacheManager._setCachedData(cachedResponseData.data, { data: cachedFieldData }, propNameOrIndex);\n } else if (requestPathCacheTierEnabled(this._cacheTiersEnabled)) {\n const { cacheability, entry } = await this._retrieveCachedRequestFieldPathData(\n hashedRequestFieldCacheKey,\n requestFieldCacheKey,\n options,\n context,\n );\n\n CacheManager._setCachedResponseSlice(\n { cacheability, data: entry },\n cachedResponseData,\n keysAndPaths,\n typenamesAndKind,\n options,\n context,\n );\n }\n }\n\n private async _analyzeParentFieldNode(\n fieldNode: FieldNode,\n cachedAncestorFieldData: CachedAncestorFieldData,\n cachedResponseData: CachedResponseData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const keysAndPaths = buildFieldKeysAndPaths(fieldNode, cachedAncestorFieldData, context);\n const { propNameOrIndex, requestFieldCacheKey, requestFieldPath } = keysAndPaths;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n\n if (!fieldTypeInfo) {\n return;\n }\n\n const { cacheability, data, entityData, requestFieldPathData } = await this._retrieveCachedParentNodeData(\n cachedAncestorFieldData,\n keysAndPaths,\n fieldTypeInfo,\n options,\n context,\n );\n\n const { fragmentKind, fragmentName, typeName } = cachedAncestorFieldData;\n // Don't get this one, need to look into it more\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n const dataTypename = get(data, TYPE_NAME_KEY);\n\n CacheManager._setCachedResponseSlice(\n { cacheability, data },\n cachedResponseData,\n keysAndPaths,\n\n {\n dataTypename,\n fieldTypename: typeName,\n fragmentKind,\n fragmentName,\n },\n options,\n context,\n );\n\n if (!isObjectLike(data)) {\n return;\n }\n\n const promises: Promise<void>[] = [];\n\n iterateChildFields(\n fieldNode,\n data,\n context.fragmentDefinitions,\n (\n childField: FieldNode,\n childTypeName: string | undefined,\n childFragmentKind: string | undefined,\n childFragmentName: string | undefined,\n childIndex?: number,\n ) => {\n promises.push(\n this._analyzeFieldNode(\n childField,\n {\n cacheability,\n entityData,\n fragmentKind: childFragmentKind,\n fragmentName: childFragmentName,\n index: childIndex,\n requestFieldCacheKey,\n requestFieldPath,\n requestFieldPathData,\n typeName: childTypeName,\n },\n {\n ...cachedResponseData,\n // `cachedResponseData.data[propNameOrIndex]` will always be either an empty array\n // or an empty object at this point as based on whether `data` is object-like\n // `cachedResponseData.data[propNameOrIndex]` is set accordingly in\n // _setCachedResponseData > _setCachedData\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n data: getDataValue<PlainData>(cachedResponseData.data, propNameOrIndex)!,\n },\n options,\n context,\n ),\n );\n },\n );\n\n await Promise.all(promises);\n }\n\n private _buildCacheMetadata(\n { ast }: RequestData,\n { data, ...otherProps }: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: CacheManagerContext,\n ): CacheMetadata {\n const cacheMetadata = this._createCacheMetadata({ data, ...otherProps }, context);\n const queryNode = getOperationDefinitions(ast, context.data.operation)[0];\n\n if (!queryNode) {\n return cacheMetadata;\n }\n\n const fieldsAndTypeNames = getChildFields(queryNode);\n\n if (!fieldsAndTypeNames) {\n return cacheMetadata;\n }\n\n for (const { fieldNode } of fieldsAndTypeNames)\n this._setFieldCacheability(\n fieldNode,\n { requestFieldPath: context.data.operation },\n { cacheMetadata, data },\n options,\n context,\n );\n\n return cacheMetadata;\n }\n\n private async _cacheResponse(\n requestData: RequestData,\n updatedRequestData: RequestData | undefined,\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<ResponseData> {\n const normalizedResponseData = normalizePatchResponseData(rawResponseData, context);\n let responseDataForCaching: RawResponseDataWithMaybeCacheMetadata | undefined = normalizedResponseData;\n\n if (isNotLastResponseChunk(rawResponseData, context)) {\n this._setResponseChunksAwaitingCaching(normalizedResponseData, context);\n responseDataForCaching = undefined;\n }\n\n if (isLastResponseChunk(rawResponseData, context)) {\n responseDataForCaching = this._retrieveResponseDataForCaching(normalizedResponseData, context);\n }\n\n const dataCaching: Promise<void>[] = [];\n\n if (responseDataForCaching && someCacheTiersEnabled(this._cacheTiersEnabled)) {\n const { data } = responseDataForCaching;\n const cacheMetadata = this._buildCacheMetadata(requestData, responseDataForCaching, options, context);\n\n if (entityOrRequestPathCacheTiersEnabled(this._cacheTiersEnabled)) {\n dataCaching.push(\n this._setEntityAndRequestFieldPathCacheEntries(\n requestData,\n {\n cacheMetadata,\n entityData: structuredClone(data),\n requestFieldPathData: structuredClone(data),\n },\n options,\n context,\n ),\n );\n }\n\n let queryCacheMetadata: CacheMetadata | undefined;\n let queryData: PlainData | undefined;\n\n if (\n context.data.operation === OperationTypeNode.QUERY &&\n queryResponseCacheTierEnabled(this._cacheTiersEnabled)\n ) {\n let partialQueryResponse: PartialQueryResponse | undefined;\n\n if (context.data.queryFiltered && updatedRequestData) {\n dataCaching.push(\n this._setQueryResponseCacheEntry(updatedRequestData.hash, { cacheMetadata, data }, options, context),\n );\n\n partialQueryResponse = this._getPartialQueryResponse(requestData.hash);\n }\n\n queryCacheMetadata = CacheManager._mergeResponseCacheMetadata(cacheMetadata, partialQueryResponse);\n queryData = this._mergeResponseData(data, partialQueryResponse);\n\n dataCaching.push(\n this._setQueryResponseCacheEntry(\n requestData.hash,\n { cacheMetadata: queryCacheMetadata, data: queryData },\n options,\n context,\n ),\n );\n }\n\n if (options.awaitDataCaching) {\n await Promise.all(dataCaching);\n }\n\n if (isNotResponseChunk(normalizedResponseData, context) && queryCacheMetadata && queryData) {\n return {\n cacheMetadata: queryCacheMetadata,\n data: queryData,\n };\n }\n }\n\n const { data, hasNext, paths } = normalizedResponseData;\n\n return {\n cacheMetadata: this._buildCacheMetadata(requestData, normalizedResponseData, options, context),\n data,\n hasNext,\n paths,\n };\n }\n\n private async _checkCacheEntry<T>(\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: CacheManagerContext & { requestFieldCacheKey?: string },\n ): Promise<CheckCacheEntryResult<T> | false> {\n try {\n const cacheability = await this._hasCacheEntry(cacheType, hash);\n\n if (!cacheability || !CacheManager._isValid(cacheability)) {\n return false;\n }\n\n const entry = await this._getCacheEntry<T>(cacheType, hash, options, context);\n\n if (isUndefined(entry)) {\n return false;\n }\n\n return { cacheability, entry };\n } catch {\n return false;\n }\n }\n\n private _createCacheMetadata(\n { _cacheMetadata, headers }: RawResponseDataWithMaybeCacheMetadata,\n { data }: CacheManagerContext,\n ): CacheMetadata {\n const cacheMetadata = new Map<string, Cacheability>();\n\n const cacheability = deriveOpCacheability({\n _cacheMetadata,\n fallback: this._fallbackOperationCacheability,\n headers,\n });\n\n cacheMetadata.set(data.operation, cacheability);\n\n if (_cacheMetadata) {\n rehydrateCacheMetadata(_cacheMetadata, cacheMetadata);\n }\n\n return cacheMetadata;\n }\n\n @logCacheQuery()\n private async _getCacheEntry<T>(\n cacheType: CacheTypes,\n hash: string,\n _options: RequestOptions,\n _context: CacheManagerContext & { requestFieldCacheKey?: string },\n ): Promise<T | undefined> {\n return this._cache?.get<T>(`${cacheType}::${hash}`);\n }\n\n private _getPartialQueryResponse(hash: string): PartialQueryResponse | undefined {\n const partialQueryResponse = this._partialQueryResponses.get(hash);\n this._partialQueryResponses.delete(hash);\n return partialQueryResponse;\n }\n\n private async _hasCacheEntry(cacheType: CacheTypes, hash: string): Promise<Cacheability | false> {\n try {\n return (await this._cache?.has(`${cacheType}::${hash}`)) ?? false;\n } catch {\n return false;\n }\n }\n\n private _mergeResponseData(responseData: PlainData, partialQueryResponse?: PartialQueryResponse): PlainData {\n if (!partialQueryResponse) {\n return responseData;\n }\n\n return mergeDataSets(partialQueryResponse.data, responseData, this._typeIDKey);\n }\n\n private async _parseEntityAndRequestFieldPathCacheEntryData(\n field: FieldNode,\n ancestorKeysAndPaths: AncestorKeysAndPaths,\n { cacheMetadata, entityData, requestFieldPathData }: ResponseDataForCaching,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const keysAndPaths = buildFieldKeysAndPaths(field, ancestorKeysAndPaths, context);\n const { hashedRequestFieldCacheKey, requestFieldCacheKey, requestFieldPath, responseDataPath } = keysAndPaths;\n // get has rubbish return typing\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const fieldData = get(requestFieldPathData, responseDataPath) as unknown;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n const cacheability = cacheMetadata.get(requestFieldPath);\n\n if (!isObjectLike(fieldData) && !fieldTypeInfo?.hasDirectives) {\n return;\n }\n\n if (isObjectLike(fieldData)) {\n const promises: Promise<void>[] = [];\n\n iterateChildFields(\n field,\n fieldData,\n context.fragmentDefinitions,\n (\n childField: FieldNode,\n _typeName: string | undefined,\n _fragmentKind: string | undefined,\n _fragmentName: string | undefined,\n childIndex?: number,\n ) => {\n promises.push(\n this._parseEntityAndRequestFieldPathCacheEntryData(\n childField,\n { index: childIndex, requestFieldCacheKey, requestFieldPath, responseDataPath },\n { cacheMetadata, entityData, requestFieldPathData },\n options,\n context,\n ),\n );\n },\n );\n\n await Promise.all(promises);\n }\n\n if (isUndefined(fieldData) || !fieldTypeInfo || !cacheability) {\n return;\n }\n\n const isEntity = isFieldEntity(fieldData, fieldTypeInfo, this._typeIDKey);\n const hasArgsOrDirectives = fieldTypeInfo.hasArguments || fieldTypeInfo.hasDirectives;\n\n if (\n context.data.operation === OperationTypeNode.QUERY &&\n (isEntity || hasArgsOrDirectives) &&\n requestPathCacheTierEnabled(this._cacheTiersEnabled)\n ) {\n await this._setRequestFieldPathCacheEntry(\n keysAndPaths,\n {\n cacheability,\n fieldData: filterOutPropsWithEntityArgsOrDirectives(structuredClone(fieldData), field, keysAndPaths, context),\n fieldTypeInfo,\n },\n options,\n context,\n );\n\n if (hasChildFields(field, { fragmentDefinitions: context.fragmentDefinitions })) {\n if (isEntity) {\n set(requestFieldPathData, responseDataPath, {\n __cacheKey: `${REQUEST_FIELD_PATHS}::${hashedRequestFieldCacheKey}`,\n });\n } else {\n unset(requestFieldPathData, responseDataPath);\n }\n }\n }\n\n if (isEntity && entityCacheTierEnabled(this._cacheTiersEnabled)) {\n await this._setEntityCacheEntry(\n {\n cacheability,\n fieldData: filterOutPropsWithEntityOrArgs(\n // Casting here for ease of typing\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n structuredClone(get(entityData, responseDataPath) as EntityData),\n field,\n keysAndPaths,\n context,\n ),\n fieldTypeInfo,\n },\n options,\n context,\n );\n\n set(entityData, responseDataPath, {\n __cacheKey: `${DATA_ENTITIES}::${createEntityDataKey(fieldData, fieldTypeInfo, context)}`,\n });\n }\n }\n\n private async _retrieveCachedEntityData(\n validTypeIDValue: string | number,\n { possibleTypes, typeName }: FieldTypeInfo,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<Partial<CheckCacheEntryResult<EntityData>>> {\n const typeNames = [...possibleTypes.map(type => type.typeName), typeName];\n\n const checkResults = await Promise.all(\n typeNames.map(name =>\n this._checkCacheEntry<EntityData>(DATA_ENTITIES, `${name}::${String(validTypeIDValue)}`, options, context),\n ),\n );\n\n const validResults = checkResults.filter(result => !!result);\n let validResult: CheckCacheEntryResult<EntityData> | undefined;\n\n if (validResults.length === 1) {\n validResult = validResults[0];\n } else if (validResults.length > 1) {\n validResults.sort(({ cacheability: a }, { cacheability: b }) => a.metadata.ttl - b.metadata.ttl);\n\n const firstResult = validResults[0];\n\n if (firstResult) {\n validResult = {\n cacheability: firstResult.cacheability,\n // By the time the merge has happened, the type is EntityData\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n entry: validResults.reduce<Partial<EntityData>>(\n (obj, { entry }) => mergeDataSets(obj, entry, this._typeIDKey),\n {},\n ) as EntityData,\n };\n }\n }\n\n return validResult ?? {};\n }\n\n private async _retrieveCachedParentNodeData(\n { entityData: ancestorEntityData, requestFieldPathData: ancestorRequestFieldPathData }: CachedAncestorFieldData,\n { hashedRequestFieldCacheKey, propNameOrIndex, requestFieldCacheKey }: KeysAndPaths,\n fieldTypeInfo: FieldTypeInfo,\n options: RequestOptions,\n context: CacheManagerContext,\n ) {\n let entityData = CacheManager._getFieldDataFromAncestor(ancestorEntityData, propNameOrIndex);\n let requestFieldPathData = CacheManager._getFieldDataFromAncestor(ancestorRequestFieldPathData, propNameOrIndex);\n let cacheability: Cacheability | undefined;\n\n if (CacheManager._isNodeRequestFieldPath(fieldTypeInfo) && requestPathCacheTierEnabled(this._cacheTiersEnabled)) {\n const { cacheability: entryCacheability, entry } = await this._retrieveCachedRequestFieldPathData(\n hashedRequestFieldCacheKey,\n requestFieldCacheKey,\n options,\n context,\n );\n\n requestFieldPathData = combineDataSets(requestFieldPathData, entry, this._typeIDKey);\n\n if (entryCacheability) {\n cacheability = entryCacheability;\n }\n }\n\n const validTypeIDValue = getValidTypeIdValue(requestFieldPathData, fieldTypeInfo, this._typeIDKey);\n\n if (\n CacheManager._isNodeEntity(fieldTypeInfo) &&\n validTypeIDValue &&\n entityCacheTierEnabled(this._cacheTiersEnabled)\n ) {\n const { cacheability: entryCacheability, entry } = await this._retrieveCachedEntityData(\n validTypeIDValue,\n fieldTypeInfo,\n options,\n context,\n );\n\n entityData = combineDataSets(entityData, entry, this._typeIDKey);\n\n if (entryCacheability && (!cacheability || entryCacheability.metadata.ttl > cacheability.metadata.ttl)) {\n cacheability = entryCacheability;\n }\n }\n\n const data = isEqual(entityData, requestFieldPathData)\n ? entityData\n : combineDataSets(entityData, requestFieldPathData, this._typeIDKey);\n\n return {\n cacheability,\n data,\n entityData,\n requestFieldPathData,\n };\n }\n\n private async _retrieveCachedRequestFieldPathData(\n hash: string,\n requestFieldCacheKey: string,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<Partial<CheckCacheEntryResult>> {\n return (\n (await this._checkCacheEntry(REQUEST_FIELD_PATHS, hash, options, { ...context, requestFieldCacheKey })) || {}\n );\n }\n\n private async _retrieveCachedResponseData(\n { ast }: RequestData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<CachedResponseData> {\n const cachedResponseData: CachedResponseData = {\n cacheMetadata: new Map(),\n data: {},\n fieldCount: { missing: 0, total: 0 },\n fieldPathChecklist: new Map(),\n };\n\n const queryNode = getOperationDefinitions(ast, context.data.operation)[0];\n\n if (!queryNode) {\n return cachedResponseData;\n }\n\n const fieldsAndTypeNames = getChildFields(queryNode);\n\n if (!fieldsAndTypeNames) {\n return cachedResponseData;\n }\n\n await Promise.all(\n fieldsAndTypeNames.map(({ fieldNode }) =>\n this._analyzeFieldNode(\n fieldNode,\n { requestFieldPath: context.data.operation },\n cachedResponseData,\n options,\n context,\n ),\n ),\n );\n\n cachedResponseData.fieldCount = CacheManager._countFieldPathChecklist(cachedResponseData.fieldPathChecklist);\n return cachedResponseData;\n }\n\n private _retrieveResponseDataForCaching(\n normalizedResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n ) {\n const responseChunks = this._responseChunksAwaitingCaching.get(context.data.requestID);\n this._responseChunksAwaitingCaching.delete(context.data.requestID);\n return mergeResponseDataSets([...(responseChunks ?? []), normalizedResponseData]);\n }\n\n @logCacheEntry()\n private async _setCacheEntry(\n cacheType: CacheTypes,\n hash: string,\n value: unknown,\n cachemapOptions: CachemapOptions,\n _options: RequestOptions,\n _context: CacheManagerContext & { requestFieldCacheKey?: string },\n ): Promise<void> {\n try {\n await this._cache?.set(`${cacheType}::${hash}`, structuredClone(value), cachemapOptions);\n } catch {\n // no catch\n }\n }\n\n private async _setEntityAndRequestFieldPathCacheEntries(\n requestData: RequestData,\n responseData: ResponseDataForCaching,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const operationNode = getOperationDefinitions(requestData.ast, context.data.operation)[0];\n\n if (!operationNode) {\n return;\n }\n\n const fieldsAndTypeNames = getChildFields(operationNode);\n\n if (!fieldsAndTypeNames) {\n return;\n }\n\n await Promise.all(\n fieldsAndTypeNames.map(({ fieldNode }) => {\n return this._parseEntityAndRequestFieldPathCacheEntryData(\n fieldNode,\n { requestFieldPath: context.data.operation },\n responseData,\n options,\n context,\n );\n }),\n );\n }\n\n private async _setEntityCacheEntry(\n { cacheability, fieldData, fieldTypeInfo }: DataForCachingEntry<EntityData>,\n options: RequestOptions,\n context: CacheManagerContext,\n ) {\n const fieldTypeName = fieldTypeInfo.isEntity ? fieldTypeInfo.typeName : fieldData.__typename;\n const entityDataKey = `${fieldTypeName}::${String(fieldData[this._typeIDKey])}`;\n const result = await this._checkCacheEntry<EntityData>(DATA_ENTITIES, entityDataKey, options, context);\n\n if (result) {\n fieldData = mergeDataSets(result.entry, fieldData, this._typeIDKey);\n }\n\n await this._setCacheEntry(\n DATA_ENTITIES,\n entityDataKey,\n fieldData,\n { cacheHeaders: { cacheControl: cacheability.printCacheControl() }, tag: options.tag },\n options,\n context,\n );\n }\n\n private _setFieldCacheability(\n field: FieldNode,\n ancestorKeysAndPaths: AncestorKeysAndPaths,\n { cacheMetadata, data }: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): void {\n const { requestFieldPath: ancestorRequestFieldPath } = ancestorKeysAndPaths;\n const keysAndPaths = buildFieldKeysAndPaths(field, ancestorKeysAndPaths, context);\n const { requestFieldPath, responseDataPath } = keysAndPaths;\n\n if (!isObjectLike(data)) {\n return;\n }\n\n // get return type annotation is rubbish\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const fieldData = get(data, responseDataPath) as unknown;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n\n if (!isObjectLike(fieldData) && !fieldTypeInfo?.hasDirectives) {\n return;\n }\n\n this._setFieldTypeCacheDirective(cacheMetadata, { ancestorRequestFieldPath, requestFieldPath }, context);\n\n if (isObjectLike(fieldData)) {\n iterateChildFields(\n field,\n fieldData,\n context.fragmentDefinitions,\n (\n childField: FieldNode,\n _typeName: string | undefined,\n _fragmentKind: string | undefined,\n _fragmentName: string | undefined,\n childIndex?: number,\n ) => {\n this._setFieldCacheability(\n childField,\n { index: childIndex, requestFieldPath, responseDataPath },\n { cacheMetadata, data },\n options,\n context,\n );\n },\n );\n }\n }\n\n private _setFieldTypeCacheDirective(\n cacheMetadata: CacheMetadata,\n { ancestorRequestFieldPath, requestFieldPath }: { ancestorRequestFieldPath?: string; requestFieldPath: string },\n { data, fieldTypeMap }: CacheManagerContext,\n ): void {\n if (cacheMetadata.has(requestFieldPath)) {\n return;\n }\n\n const fieldTypeInfo = fieldTypeMap.get(requestFieldPath);\n\n if (fieldTypeInfo && this._typeCacheDirectives[fieldTypeInfo.typeName]) {\n const cacheability = new Cacheability({ cacheControl: this._typeCacheDirectives[fieldTypeInfo.typeName] });\n CacheManager._setCacheMetadata(cacheMetadata, cacheability, requestFieldPath, data.operation);\n } else if (this._cascadeCacheControl && ancestorRequestFieldPath) {\n CacheManager._setCacheMetadata(\n cacheMetadata,\n cacheMetadata.get(ancestorRequestFieldPath),\n requestFieldPath,\n data.operation,\n );\n }\n }\n\n @logPartialCompiled()\n private _setPartialQueryResponse(\n hash: string,\n partialQueryResponse: PartialQueryResponse,\n _options: RequestOptions,\n _context: CacheManagerContext,\n ): void {\n this._partialQueryResponses.set(hash, partialQueryResponse);\n }\n\n private async _setQueryResponseCacheEntry(\n hash: string,\n { cacheMetadata, data }: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const dehydratedCacheMetadata = dehydrateCacheMetadata(cacheMetadata);\n const cacheControl = CacheManager._getOperationCacheControl(cacheMetadata, context.data.operation);\n\n await this._setCacheEntry(\n QUERY_RESPONSES,\n hash,\n { cacheMetadata: dehydratedCacheMetadata, data },\n { cacheHeaders: { cacheControl }, tag: options.tag },\n options,\n context,\n );\n }\n\n private async _setRequestFieldPathCacheEntry(\n keysAndPaths: KeysAndPaths,\n { cacheability, fieldData }: DataForCachingEntry,\n options: RequestOptions,\n context: CacheManagerContext,\n ): Promise<void> {\n const { hashedRequestFieldCacheKey, requestFieldCacheKey } = keysAndPaths;\n\n const result = await this._checkCacheEntry(REQUEST_FIELD_PATHS, hashedRequestFieldCacheKey, options, {\n ...context,\n requestFieldCacheKey,\n });\n\n if (result && isObjectLike(result.entry) && isObjectLike(fieldData)) {\n fieldData = mergeDataSets(result.entry, fieldData, this._typeIDKey);\n }\n\n void this._setCacheEntry(\n REQUEST_FIELD_PATHS,\n hashedRequestFieldCacheKey,\n fieldData,\n { cacheHeaders: { cacheControl: cacheability.printCacheControl() }, tag: options.tag },\n options,\n { ...context, requestFieldCacheKey },\n );\n }\n\n private _setResponseChunksAwaitingCaching(\n normalizedResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n ) {\n const responseChunks = this._responseChunksAwaitingCaching.get(context.data.requestID);\n\n if (responseChunks) {\n this._responseChunksAwaitingCaching.set(context.data.requestID, [...responseChunks, normalizedResponseData]);\n } else {\n this._responseChunksAwaitingCaching.set(context.data.requestID, [normalizedResponseData]);\n }\n }\n}\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { isString, set } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const normalizePatchResponseData = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n) => {\n if (!context.deprecated.normalizePatchResponseData) {\n return rawResponseData;\n }\n\n const { data, paths, ...rest } = rawResponseData;\n\n if (!paths?.length || !isString(paths[0])) {\n return rawResponseData;\n }\n\n return {\n ...rest,\n data: set({}, paths[0], data),\n paths,\n };\n};\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isNotLastResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n) => context.deprecated.hasDeferOrStream && rawResponseData.hasNext;\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isLastResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n) => context.deprecated.hasDeferOrStream && !rawResponseData.hasNext && rawResponseData.paths;\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isNotResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext,\n) => !context.deprecated.hasDeferOrStream && !rawResponseData.hasNext && !rawResponseData.paths;\n","import { type FieldTypeInfo } from '@graphql-box/core';\nimport { isPlainObject } from '@graphql-box/helpers';\n\nexport const getValidTypeIdValue = (\n requestFieldPathData: unknown,\n { typeIDValue }: FieldTypeInfo,\n typeIDKey: string,\n): string | number | undefined => {\n if (typeIDValue) {\n return typeIDValue;\n }\n\n if (isPlainObject(requestFieldPathData)) {\n // Identifier value can only be one of these types\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return requestFieldPathData[typeIDKey] as string | number | undefined;\n }\n\n return;\n};\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { merge } from 'lodash-es';\n\nexport const mergeResponseDataSets = (responseDataSets: RawResponseDataWithMaybeCacheMetadata[]) => {\n return responseDataSets.reduce<RawResponseDataWithMaybeCacheMetadata>(\n (acc, dataSet, index) => {\n const { _cacheMetadata, data, hasNext, headers, paths } = dataSet;\n\n if (_cacheMetadata) {\n acc._cacheMetadata = acc._cacheMetadata ? { ...acc._cacheMetadata, ..._cacheMetadata } : _cacheMetadata;\n }\n\n acc.data = merge(acc.data, data);\n\n if (index === 0) {\n acc.headers = headers;\n }\n\n if (index === responseDataSets.length - 1) {\n acc.hasNext = hasNext;\n }\n\n if (paths) {\n acc.paths ??= [];\n acc.paths.push(...paths);\n }\n\n return acc;\n },\n { data: {} },\n );\n};\n","import { CACHE_ENTRY_QUERIED, type CacheTypes, type RequestOptions } from '@graphql-box/core';\nimport { type CacheManagerContext, type CacheManagerDef } from '../types.ts';\n\ntype Descriptor = (\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: CacheManagerContext & { requestFieldCacheKey?: string },\n // Proving more difficult to fix, that worth the effort\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n) => Promise<never | undefined>;\n\nexport const logCacheQuery = () => {\n return (_target: CacheManagerDef, _propertyName: string, descriptor: TypedPropertyDescriptor<Descriptor>): void => {\n const method = descriptor.value;\n\n if (!method) {\n return;\n }\n\n descriptor.value = async function descriptorValue(...args: Parameters<Descriptor>): ReturnType<Descriptor> {\n // Proving more difficult to fix, that worth the effort\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n return new Promise<never | undefined>(resolve => {\n const resolver = async () => {\n const { data, debugManager, requestFieldCacheKey } = args[3];\n\n if (!debugManager) {\n // Proving more difficult to fix, that worth the effort\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n resolve(await method.apply(this, args));\n return;\n }\n\n const startTime = debugManager.now();\n // Proving more difficult to fix, that worth the effort\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n const result = await method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n resolve(result);\n\n debugManager.log(CACHE_ENTRY_QUERIED, {\n data: {\n ...data,\n cacheType: args[0],\n ...(requestFieldCacheKey ? { decryptedCacheKey: requestFieldCacheKey } : undefined),\n },\n stats: { duration, endTime, startTime },\n });\n };\n\n void resolver();\n });\n };\n };\n};\n","import { CACHE_ENTRY_ADDED, type CacheTypes, type CachemapOptions, type RequestOptions } from '@graphql-box/core';\nimport { type CacheManagerContext, type CacheManagerDef } from '../types.ts';\n\ntype Descriptor = (\n cacheType: CacheTypes,\n hash: string,\n value: unknown,\n cachemapOptions: CachemapOptions,\n options: RequestOptions,\n context: CacheManagerContext & { requestFieldCacheKey?: string },\n) => Promise<void>;\n\nexport const logCacheEntry = () => {\n return (_target: CacheManagerDef, _propertyName: string, descriptor: TypedPropertyDescriptor<Descriptor>): void => {\n const method = descriptor.value;\n\n if (!method) {\n return;\n }\n\n descriptor.value = async function descriptorValue(...args: Parameters<Descriptor>): ReturnType<Descriptor> {\n return new Promise<void>(resolve => {\n const resolver = async () => {\n const { data, debugManager, requestFieldCacheKey } = args[5];\n\n if (!debugManager) {\n await method.apply(this, args);\n resolve();\n return;\n }\n\n const startTime = debugManager.now();\n await method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n resolve();\n\n debugManager.log(CACHE_ENTRY_ADDED, {\n data: {\n ...data,\n cacheHeaders: args[3].cacheHeaders,\n cacheType: args[0],\n ...(requestFieldCacheKey ? { decryptedCacheKey: requestFieldCacheKey } : undefined),\n },\n stats: { duration, endTime, startTime },\n });\n };\n\n void resolver();\n });\n };\n };\n};\n","import { PARTIAL_QUERY_COMPILED, type RequestOptions } from '@graphql-box/core';\nimport { type CacheManagerContext, type CacheManagerDef, type PartialQueryResponse } from '../types.ts';\n\ntype Descriptor = (\n hash: string,\n partialQueryResponse: PartialQueryResponse,\n options: RequestOptions,\n context: CacheManagerContext,\n) => void;\n\nexport const logPartialCompiled = () => {\n return (_target: CacheManagerDef, _propertyName: string, descriptor: TypedPropertyDescriptor<Descriptor>): void => {\n const method = descriptor.value;\n\n if (!method) {\n return;\n }\n\n descriptor.value = function descriptorValue(...args: Parameters<Descriptor>): ReturnType<Descriptor> {\n const { data, debugManager } = args[3];\n\n if (!debugManager) {\n method.apply(this, args);\n return;\n }\n\n const startTime = debugManager.now();\n method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n\n debugManager.log(PARTIAL_QUERY_COMPILED, {\n data,\n stats: { duration, endTime, startTime },\n });\n };\n };\n};\n"],"names":["NO_CACHE","checkValue","value","typeIDKey","isArray","reduce","acc","entry","isPlainObject","recursivelyCheckProps","data","keys","Object","length","key","isNumber","isString","allCacheTiersDisabled","entity","queryResponse","requestPath","entityCacheTierEnabled","tiersEnabled","entityOrRequestPathCacheTiersEnabled","queryResponseCacheTierEnabled","requestPathCacheTierEnabled","mergeDataSets","obj","source","mergeObjects","_key","undefined","combineDataSets","dataSetA","dataSetB","isObjectLike","createEntityDataKey","fieldData","fieldTypeInfo","context","isEntity","typeName","__typename","String","deriveOpCacheability","_cacheMetadata","fallback","headers","isEmpty","first","rest","values","Cacheability","metadata","ttl","has","cacheControl","isFieldEntity","possibleTypes","some","type","filterOutPropsWithEntityArgsOrDirectives","field","ancestorKeysAndPaths","fieldAndTypeName","resolveFragments","selectionSet","selections","fragmentDefinitions","match","find","fieldNode","getName","keysAndPaths","buildFieldKeysAndPaths","fieldTypeMap","get","requestFieldPath","hasArguments","hasDirectives","filterOutPropsWithEntityOrArgs","checkFieldPathChecklist","fieldPathChecklistValues","fieldTypeName","hasData","typeUnused","fieldPathChecklistValue","every","filterField","fieldPathChecklist","fragmentSpreadChecklist","ancestorRequestFieldPath","fieldsAndTypeNames","getChildFields","fragmentSpreadFieldCounter","index","childField","fragmentKind","fragmentName","childTypeName","Kind","FRAGMENT_SPREAD","total","childFieldName","TYPE_NAME_KEY","counter","hasChildFields","deleteChildFields","entries","checklist","paths","push","deleteFragmentSpreads","deleted","filterFragmentSpreads","inlineFragments","getInlineFragments","filtered","fragment","deleteInlineFragments","filterInlineFragments","fieldNames","map","name","filterIDsAndTypeNames","filterQuery","requestData","ast","queryNode","getOperationDefinitions","operation","request","RegExp","createFragmentSpreadChecklist","queryFiltered","definitionsToFilter","namesAndPaths","path","fragmentDefinition","definitionsToDelete","names","deleteFragmentDefinitions","include","filterFragmentDefinitions","getDataValue","hasTypename","CacheManager","_countFieldPathChecklist","fieldCount","missing","checklistValues","filter","_getFieldDataFromAncestor","ancestorFieldData","propNameOrIndex","dataValue","structuredClone","_getOperationCacheControl","cacheMetadata","defaultCacheControl","cacheability","printCacheControl","_isNodeEntity","_isNodeRequestFieldPath","this","_isValid","checkTTL","_mergeResponseCacheMetadata","partialQueryResponse","Map","_setCachedData","responseData","setData","isUndefined","_setCachedResponseSlice","cachedFieldData","typeNamesAndKind","_options","ctxData","_setCacheMetadata","_setFieldPathChecklist","set","operationCacheability","dataTypename","dataTypeName","fieldTypename","constructor","options","_cacheTiersEnabled","_partialQueryResponses","_responseChunksAwaitingCaching","errors","ArgsError","typeCacheDirectives","message","GroupedError","cache","then","_cache","catch","error","cacheTiersEnabled","_cascadeCacheControl","cascadeCacheControl","_fallbackOperationCacheability","fallbackOperationCacheability","_typeCacheDirectives","_typeIDKey","DEFAULT_TYPE_ID_KEY","analyzeQuery","updated","hash","cacheManagerContext","getFragmentDefinitions","cachedResponseData","_retrieveCachedResponseData","areOnlyPopulatedFieldsTypeIdKeys","dataCaching","_setQueryResponseCacheEntry","awaitDataCaching","response","filteredAST","filteredRequest","print","assign","_setPartialQueryResponse","hashRequest","cacheQuery","updatedRequestData","rawResponseData","_cacheResponse","cacheResponse","checkCacheEntry","cacheType","_checkCacheEntry","checkQueryResponseCacheEntry","result","QUERY_RESPONSES","rehydrateCacheMetadata","deletePartialQueryResponse","delete","setQueryResponseCacheEntry","_analyzeFieldNode","cachedAncestorFieldData","_analyzeParentFieldNode","_analyzeLeafFieldNode","hashedRequestFieldCacheKey","requestFieldCacheKey","entityData","requestFieldPathData","typenamesAndKind","_retrieveCachedRequestFieldPathData","_retrieveCachedParentNodeData","promises","iterateChildFields","childFragmentKind","childFragmentName","childIndex","Promise","all","_buildCacheMetadata","otherProps","_createCacheMetadata","_setFieldCacheability","normalizedResponseData","deprecated","normalizePatchResponseData","responseDataForCaching","hasDeferOrStream","hasNext","isNotLastResponseChunk","_setResponseChunksAwaitingCaching","isLastResponseChunk","_retrieveResponseDataForCaching","queryCacheMetadata","queryData","_setEntityAndRequestFieldPathCacheEntries","OperationTypeNode","QUERY","_getPartialQueryResponse","_mergeResponseData","isNotResponseChunk","_hasCacheEntry","_getCacheEntry","_context","_parseEntityAndRequestFieldPathCacheEntryData","responseDataPath","_typeName","_fragmentKind","_fragmentName","hasArgsOrDirectives","_setRequestFieldPathCacheEntry","__cacheKey","REQUEST_FIELD_PATHS","unset","_setEntityCacheEntry","DATA_ENTITIES","_retrieveCachedEntityData","validTypeIDValue","typeNames","validResults","validResult","sort","a","b","firstResult","ancestorEntityData","ancestorRequestFieldPathData","entryCacheability","typeIDValue","getValidTypeIdValue","isEqual","responseChunks","requestID","responseDataSets","dataSet","merge","_setCacheEntry","cachemapOptions","operationNode","entityDataKey","cacheHeaders","tag","_setFieldTypeCacheDirective","dehydratedCacheMetadata","dehydrateCacheMetadata","_target","_propertyName","descriptor","method","async","args","resolve","debugManager","apply","startTime","now","endTime","duration","log","CACHE_ENTRY_QUERIED","decryptedCacheKey","stats","resolver","CACHE_ENTRY_ADDED","PARTIAL_QUERY_COMPILED","_ts_metadata"],"mappings":"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"}