@graphql-box/cache-manager 5.4.13 → 5.4.15-unstable-12345.1
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.
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/production.analysis.txt +13 -267
- package/dist/types/cjs/helpers/filterQuery.d.cts +2 -3
- package/dist/types/cjs/helpers/filterQuery.d.cts.map +1 -1
- package/dist/types/cjs/main.d.cts +9 -56
- package/dist/types/cjs/main.d.cts.map +1 -1
- package/dist/types/cjs/types.d.cts +12 -129
- package/dist/types/cjs/types.d.cts.map +1 -1
- package/dist/types/esm/helpers/filterQuery.d.ts +2 -3
- package/dist/types/esm/helpers/filterQuery.d.ts.map +1 -1
- package/dist/types/esm/main.d.ts +9 -56
- package/dist/types/esm/main.d.ts.map +1 -1
- package/dist/types/esm/types.d.ts +12 -129
- package/dist/types/esm/types.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +14 -12
- package/src/helpers/filterQuery.test.ts +227 -0
- package/src/helpers/filterQuery.ts +38 -52
- package/src/index.test.ts +182 -1645
- package/src/main.ts +93 -1180
- package/src/types.ts +13 -183
- package/dist/types/cjs/debug/index.d.cts +0 -4
- package/dist/types/cjs/debug/index.d.cts.map +0 -1
- package/dist/types/cjs/debug/logCacheEntry.d.cts +0 -8
- package/dist/types/cjs/debug/logCacheEntry.d.cts.map +0 -1
- package/dist/types/cjs/debug/logCacheQuery.d.cts +0 -8
- package/dist/types/cjs/debug/logCacheQuery.d.cts.map +0 -1
- package/dist/types/cjs/debug/logPartialCompiled.d.cts +0 -6
- package/dist/types/cjs/debug/logPartialCompiled.d.cts.map +0 -1
- package/dist/types/cjs/helpers/areOnlyPopulatedFieldsTypeIdKeys.d.cts +0 -3
- package/dist/types/cjs/helpers/areOnlyPopulatedFieldsTypeIdKeys.d.cts.map +0 -1
- package/dist/types/cjs/helpers/cacheTiersEnabled.d.cts +0 -8
- package/dist/types/cjs/helpers/cacheTiersEnabled.d.cts.map +0 -1
- package/dist/types/cjs/helpers/checkFieldPathChecklist.d.cts +0 -3
- package/dist/types/cjs/helpers/checkFieldPathChecklist.d.cts.map +0 -1
- package/dist/types/cjs/helpers/combineData.d.cts +0 -2
- package/dist/types/cjs/helpers/combineData.d.cts.map +0 -1
- package/dist/types/cjs/helpers/createEntityDataKey.d.cts +0 -4
- package/dist/types/cjs/helpers/createEntityDataKey.d.cts.map +0 -1
- package/dist/types/cjs/helpers/createFragmentSpreadChecklist.d.cts +0 -9
- package/dist/types/cjs/helpers/createFragmentSpreadChecklist.d.cts.map +0 -1
- package/dist/types/cjs/helpers/deriveOpCacheability.d.cts +0 -9
- package/dist/types/cjs/helpers/deriveOpCacheability.d.cts.map +0 -1
- package/dist/types/cjs/helpers/filterField.d.cts +0 -5
- package/dist/types/cjs/helpers/filterField.d.cts.map +0 -1
- package/dist/types/cjs/helpers/filterFragmentDefinitions.d.cts +0 -5
- package/dist/types/cjs/helpers/filterFragmentDefinitions.d.cts.map +0 -1
- package/dist/types/cjs/helpers/filterFragmentSpreads.d.cts +0 -5
- package/dist/types/cjs/helpers/filterFragmentSpreads.d.cts.map +0 -1
- package/dist/types/cjs/helpers/filterIDsAndTypeNames.d.cts +0 -4
- package/dist/types/cjs/helpers/filterIDsAndTypeNames.d.cts.map +0 -1
- package/dist/types/cjs/helpers/filterInlineFragments.d.cts +0 -4
- package/dist/types/cjs/helpers/filterInlineFragments.d.cts.map +0 -1
- package/dist/types/cjs/helpers/filterOperationAndFragmentDefinitions.d.cts +0 -3
- package/dist/types/cjs/helpers/filterOperationAndFragmentDefinitions.d.cts.map +0 -1
- package/dist/types/cjs/helpers/filterOutPropsWithEntityArgsOrDirectives.d.cts +0 -5
- package/dist/types/cjs/helpers/filterOutPropsWithEntityArgsOrDirectives.d.cts.map +0 -1
- package/dist/types/cjs/helpers/filterOutPropsWithEntityOrArgs.d.cts +0 -6
- package/dist/types/cjs/helpers/filterOutPropsWithEntityOrArgs.d.cts.map +0 -1
- package/dist/types/cjs/helpers/getDataValue.d.cts +0 -2
- package/dist/types/cjs/helpers/getDataValue.d.cts.map +0 -1
- package/dist/types/cjs/helpers/hasTypename.d.cts +0 -3
- package/dist/types/cjs/helpers/hasTypename.d.cts.map +0 -1
- package/dist/types/cjs/helpers/isFieldEntity.d.cts +0 -3
- package/dist/types/cjs/helpers/isFieldEntity.d.cts.map +0 -1
- package/dist/types/cjs/helpers/isFirstResponseChunk.d.cts +0 -4
- package/dist/types/cjs/helpers/isFirstResponseChunk.d.cts.map +0 -1
- package/dist/types/cjs/helpers/isLastResponseChunk.d.cts +0 -4
- package/dist/types/cjs/helpers/isLastResponseChunk.d.cts.map +0 -1
- package/dist/types/cjs/helpers/isNotLastResponseChunk.d.cts +0 -4
- package/dist/types/cjs/helpers/isNotLastResponseChunk.d.cts.map +0 -1
- package/dist/types/cjs/helpers/isNotResponseChunk.d.cts +0 -4
- package/dist/types/cjs/helpers/isNotResponseChunk.d.cts.map +0 -1
- package/dist/types/cjs/helpers/mergeObjects.d.cts +0 -2
- package/dist/types/cjs/helpers/mergeObjects.d.cts.map +0 -1
- package/dist/types/cjs/helpers/mergeResponseDataSets.d.cts +0 -3
- package/dist/types/cjs/helpers/mergeResponseDataSets.d.cts.map +0 -1
- package/dist/types/cjs/helpers/normalizePatchResponseData.d.cts +0 -11
- package/dist/types/cjs/helpers/normalizePatchResponseData.d.cts.map +0 -1
- package/dist/types/cjs/helpers/validTypeIdValue.d.cts +0 -3
- package/dist/types/cjs/helpers/validTypeIdValue.d.cts.map +0 -1
- package/dist/types/esm/debug/index.d.ts +0 -4
- package/dist/types/esm/debug/index.d.ts.map +0 -1
- package/dist/types/esm/debug/logCacheEntry.d.ts +0 -8
- package/dist/types/esm/debug/logCacheEntry.d.ts.map +0 -1
- package/dist/types/esm/debug/logCacheQuery.d.ts +0 -8
- package/dist/types/esm/debug/logCacheQuery.d.ts.map +0 -1
- package/dist/types/esm/debug/logPartialCompiled.d.ts +0 -6
- package/dist/types/esm/debug/logPartialCompiled.d.ts.map +0 -1
- package/dist/types/esm/helpers/areOnlyPopulatedFieldsTypeIdKeys.d.ts +0 -3
- package/dist/types/esm/helpers/areOnlyPopulatedFieldsTypeIdKeys.d.ts.map +0 -1
- package/dist/types/esm/helpers/cacheTiersEnabled.d.ts +0 -8
- package/dist/types/esm/helpers/cacheTiersEnabled.d.ts.map +0 -1
- package/dist/types/esm/helpers/checkFieldPathChecklist.d.ts +0 -3
- package/dist/types/esm/helpers/checkFieldPathChecklist.d.ts.map +0 -1
- package/dist/types/esm/helpers/combineData.d.ts +0 -2
- package/dist/types/esm/helpers/combineData.d.ts.map +0 -1
- package/dist/types/esm/helpers/createEntityDataKey.d.ts +0 -4
- package/dist/types/esm/helpers/createEntityDataKey.d.ts.map +0 -1
- package/dist/types/esm/helpers/createFragmentSpreadChecklist.d.ts +0 -9
- package/dist/types/esm/helpers/createFragmentSpreadChecklist.d.ts.map +0 -1
- package/dist/types/esm/helpers/deriveOpCacheability.d.ts +0 -9
- package/dist/types/esm/helpers/deriveOpCacheability.d.ts.map +0 -1
- package/dist/types/esm/helpers/filterField.d.ts +0 -5
- package/dist/types/esm/helpers/filterField.d.ts.map +0 -1
- package/dist/types/esm/helpers/filterFragmentDefinitions.d.ts +0 -5
- package/dist/types/esm/helpers/filterFragmentDefinitions.d.ts.map +0 -1
- package/dist/types/esm/helpers/filterFragmentSpreads.d.ts +0 -5
- package/dist/types/esm/helpers/filterFragmentSpreads.d.ts.map +0 -1
- package/dist/types/esm/helpers/filterIDsAndTypeNames.d.ts +0 -4
- package/dist/types/esm/helpers/filterIDsAndTypeNames.d.ts.map +0 -1
- package/dist/types/esm/helpers/filterInlineFragments.d.ts +0 -4
- package/dist/types/esm/helpers/filterInlineFragments.d.ts.map +0 -1
- package/dist/types/esm/helpers/filterOperationAndFragmentDefinitions.d.ts +0 -3
- package/dist/types/esm/helpers/filterOperationAndFragmentDefinitions.d.ts.map +0 -1
- package/dist/types/esm/helpers/filterOutPropsWithEntityArgsOrDirectives.d.ts +0 -5
- package/dist/types/esm/helpers/filterOutPropsWithEntityArgsOrDirectives.d.ts.map +0 -1
- package/dist/types/esm/helpers/filterOutPropsWithEntityOrArgs.d.ts +0 -6
- package/dist/types/esm/helpers/filterOutPropsWithEntityOrArgs.d.ts.map +0 -1
- package/dist/types/esm/helpers/getDataValue.d.ts +0 -2
- package/dist/types/esm/helpers/getDataValue.d.ts.map +0 -1
- package/dist/types/esm/helpers/hasTypename.d.ts +0 -3
- package/dist/types/esm/helpers/hasTypename.d.ts.map +0 -1
- package/dist/types/esm/helpers/isFieldEntity.d.ts +0 -3
- package/dist/types/esm/helpers/isFieldEntity.d.ts.map +0 -1
- package/dist/types/esm/helpers/isFirstResponseChunk.d.ts +0 -4
- package/dist/types/esm/helpers/isFirstResponseChunk.d.ts.map +0 -1
- package/dist/types/esm/helpers/isLastResponseChunk.d.ts +0 -4
- package/dist/types/esm/helpers/isLastResponseChunk.d.ts.map +0 -1
- package/dist/types/esm/helpers/isNotLastResponseChunk.d.ts +0 -4
- package/dist/types/esm/helpers/isNotLastResponseChunk.d.ts.map +0 -1
- package/dist/types/esm/helpers/isNotResponseChunk.d.ts +0 -4
- package/dist/types/esm/helpers/isNotResponseChunk.d.ts.map +0 -1
- package/dist/types/esm/helpers/mergeObjects.d.ts +0 -2
- package/dist/types/esm/helpers/mergeObjects.d.ts.map +0 -1
- package/dist/types/esm/helpers/mergeResponseDataSets.d.ts +0 -3
- package/dist/types/esm/helpers/mergeResponseDataSets.d.ts.map +0 -1
- package/dist/types/esm/helpers/normalizePatchResponseData.d.ts +0 -11
- package/dist/types/esm/helpers/normalizePatchResponseData.d.ts.map +0 -1
- package/dist/types/esm/helpers/validTypeIdValue.d.ts +0 -3
- package/dist/types/esm/helpers/validTypeIdValue.d.ts.map +0 -1
- package/src/__snapshots__/index.test.ts.snap +0 -51963
- package/src/debug/index.ts +0 -3
- package/src/debug/logCacheEntry.ts +0 -53
- package/src/debug/logCacheQuery.ts +0 -57
- package/src/debug/logPartialCompiled.ts +0 -38
- package/src/helpers/areOnlyPopulatedFieldsTypeIdKeys.ts +0 -47
- package/src/helpers/cacheTiersEnabled.ts +0 -15
- package/src/helpers/checkFieldPathChecklist.ts +0 -23
- package/src/helpers/combineData.ts +0 -14
- package/src/helpers/createEntityDataKey.ts +0 -13
- package/src/helpers/createFragmentSpreadChecklist.ts +0 -18
- package/src/helpers/deriveOpCacheability.ts +0 -36
- package/src/helpers/filterField.ts +0 -86
- package/src/helpers/filterFragmentDefinitions.ts +0 -60
- package/src/helpers/filterFragmentSpreads.ts +0 -32
- package/src/helpers/filterIDsAndTypeNames.ts +0 -38
- package/src/helpers/filterInlineFragments.ts +0 -34
- package/src/helpers/filterOperationAndFragmentDefinitions.ts +0 -10
- package/src/helpers/filterOutPropsWithEntityArgsOrDirectives.ts +0 -48
- package/src/helpers/filterOutPropsWithEntityOrArgs.ts +0 -35
- package/src/helpers/getDataValue.ts +0 -18
- package/src/helpers/hasTypename.ts +0 -11
- package/src/helpers/isFieldEntity.ts +0 -24
- package/src/helpers/isFirstResponseChunk.ts +0 -7
- package/src/helpers/isLastResponseChunk.ts +0 -7
- package/src/helpers/isNotLastResponseChunk.ts +0 -7
- package/src/helpers/isNotResponseChunk.ts +0 -7
- package/src/helpers/mergeObjects.ts +0 -9
- package/src/helpers/mergeResponseDataSets.ts +0 -32
- package/src/helpers/normalizePatchResponseData.ts +0 -24
- package/src/helpers/validTypeIdValue.ts +0 -20
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";require("core-js/modules/web.structured-clone.js"),require("core-js/modules/es.array.push.js");var e=require("@graphql-box/core"),t=require("@graphql-box/helpers"),a=require("cacheability"),i=require("graphql"),s=require("lodash-es");const n="noCache",r=(e,a)=>t.isArray(e)?e.reduce(((e,t)=>!!e&&r(t,a)),!0):!!t.isPlainObject(e)&&c(e,a),c=(e,a)=>{const i=t.isPlainObject(e)?Object.keys(e):[...e.keys()];return!(1!==i.length||!t.isPlainObject(e)||!e[a])||i.reduce(((i,n)=>!!i&&(s.isNumber(n)&&t.isArray(e)||s.isString(n)&&t.isPlainObject(e)?r(e[n],a):i)),!0)},h=({entity:e,queryResponse:t,requestPath:a})=>!e&&!t&&!a,d=e=>!!e.entity,o=({entity:e,requestPath:t})=>!!(e??t),l=e=>!!e.queryResponse,y=e=>!!e.requestPath,u=(e,a,i)=>t.mergeObjects(e,a,((e,a)=>t.isPlainObject(a)&&a[i]?a[i]:void 0)),p=(e,a,i)=>!e&&a?a:t.isObjectLike(e)&&t.isObjectLike(a)?u(e,a,i):e,f=(e,t,a)=>`${t.isEntity?t.typeName:e.__typename}::${String(e[a.typeIDKey])}`,_=({_cacheMetadata:e,fallback:t,headers:i})=>{if(e&&!s.isEmpty(e)){const[t,...i]=Object.values(e);return new a.Cacheability({metadata:i.reduce(((e,t)=>e?t.ttl<e.ttl?t:e:t),t)})}return i?.has("cache-control")?new a.Cacheability({headers:i}):new a.Cacheability({cacheControl:t})},g=(e,a,i)=>{if(!t.isPlainObject(e)||!(i in e))return!1;const{isEntity:s=!1,possibleTypes:n=[]}=a??{};return!!s||0!==n.length&&n.some((t=>t.typeName===e.__typename))},C=(e,a,i,n)=>{if(!t.isPlainObject(e))return e;const r=t.resolveFragments(a.selectionSet?.selections,n.fragmentDefinitions);return s.keys(e).reduce(((a,s)=>{const c=r.find((({fieldNode:e})=>t.getName(e)===s));if(c){const a=t.buildFieldKeysAndPaths(c.fieldNode,i,n),r=n.fieldTypeMap.get(a.requestFieldPath);(g(e[s],r,n.typeIDKey)||r?.hasArguments||r?.hasDirectives)&&delete e[s]}return a}),e)},m=(e,a,i,s)=>{const n=t.resolveFragments(a.selectionSet?.selections,s.fragmentDefinitions);return Object.keys(e).reduce(((a,r)=>{const c=n.find((({fieldNode:e})=>t.getName(e)===r));if(c){const{requestFieldPath:a}=t.buildFieldKeysAndPaths(c.fieldNode,i,s),n=s.fieldTypeMap.get(a);(g(e[r],n,s.typeIDKey)||n?.hasArguments)&&delete e[r]}return a}),e)},D=(e,t)=>{if(!e||0===e.length)return{hasData:!1,typeUnused:!!t};const[a]=e;if(a){const{hasData:e,typeName:i}=a;return{hasData:e,typeUnused:i?i!==t:void 0}}return{hasData:e.some((({hasData:e,typeName:a})=>a===t&&e)),typeUnused:!e.every((({typeName:e})=>e===t))}},E=(a,n,r,c,h)=>{const{fragmentDefinitions:d,typeIDKey:o}=h,l=t.getChildFields(a,{fragmentDefinitions:d});if(!l)return!1;const y={};for(let s=l.length-1;s>=0;s-=1){const u=l[s];if(!u)continue;const{fieldNode:p,fragmentKind:f,fragmentName:_,typeName:g}=u;f===i.Kind.FRAGMENT_SPREAD&&_&&!y[_]&&(y[_]={hasData:0,total:d?.[_]?t.getChildFields(d[_],{fragmentDefinitions:d})?.length??0:0});const C=t.getName(p);if(C===o||C===e.TYPE_NAME_KEY)continue;const{requestFieldPath:m}=t.buildFieldKeysAndPaths(p,{requestFieldPath:c},h),{hasData:F,typeUnused:b}=D(n.get(m),g);if(F||b)if(f===i.Kind.FRAGMENT_SPREAD&&_){const e=y[_];e&&(e.hasData+=1)}else t.hasChildFields(p,{fragmentDefinitions:d})?E(p,n,r,m,h)&&t.deleteChildFields(a,p):t.deleteChildFields(a,p)}return((e,a,i,n)=>{if(!s.isEmpty(a))for(const[s,r]of Object.entries(a)){const a=i[s];if(!a)continue;a.paths.push(n);const{hasData:c,total:h}=r;c===h&&(t.deleteFragmentSpreads(e,s),a.deleted+=1)}})(a,y,r,c),((e,{fragmentDefinitions:a,typeIDKey:i})=>{const s=t.getInlineFragments(e);let n=!1;for(const r of s){const s=t.getChildFields(r,{fragmentDefinitions:a});if(!s||0===s.length){t.deleteInlineFragments(e,r),n=!0;continue}const[c]=s;if(c){const{fieldNode:a}=c;t.getName(a)===i&&(t.deleteInlineFragments(e,r),n=!0)}}})(a,h),((a,{fragmentDefinitions:i,typeIDKey:s})=>{const n=t.getChildFields(a,{fragmentDefinitions:i});if(!n||n.length>3)return!1;const r=n.map((({fieldNode:e})=>e.name.value));if(2===r.length&&r.every((t=>t===s||t===e.TYPE_NAME_KEY)))return t.deleteChildFields(a,n.map((({fieldNode:e})=>e))),!0;if(1===r.length&&r[0]===s||r[0]===e.TYPE_NAME_KEY){const[e]=n;if(e){const{fieldNode:i}=e;return t.deleteChildFields(a,i),!0}}})(a,h),!t.hasChildFields(a,{fragmentDefinitions:d})},F=(e,{fieldPathChecklist:a},i)=>{const{ast:n}=e,r=t.getOperationDefinitions(n,i.data.operation)[0];if(!r)return n;const{data:c,fragmentDefinitions:h}=i,d=t.getChildFields(r,{fragmentDefinitions:h});if(!d)return n;const o=(({request:e},{fragmentDefinitions:t})=>s.keys(t??{}).reduce(((t,a)=>(t[a]={deleted:0,paths:[],total:(e.match(new RegExp(`\\.\\.\\.${a}`,"g"))??[]).length},t)),{}))(e,i);for(let e=d.length-1;e>=0;e-=1){const{fieldNode:s}=d[e],{requestFieldPath:n}=t.buildFieldKeysAndPaths(s,{requestFieldPath:c.operation},i);E(s,a,o,n,i)&&t.deleteChildFields(r,s)}return i.data.queryFiltered=!0,((e,a,i,n)=>{const r=s.keys(i).reduce(((e,t)=>{const a=i[t];if(!a)return e;const{deleted:s,paths:n,total:r}=a;return 0===s&&1===r?[...e,{name:t,path:n[0]}]:e}),[]),{fragmentDefinitions:c={}}=n;for(const{name:e,path:t}of r){const s=c[e];s&&E(s,a,i,t,n)}const h=s.keys(i).reduce(((e,t)=>{const a=i[t];if(!a)return e;const{deleted:s,total:n}=a;return s>0&&s===n?[...e,t]:e}),[]);return 0===h.length?e:t.deleteFragmentDefinitions(e,{include:h})})(n,a,o,i)},b=(e,a)=>t.isArray(e)&&s.isNumber(a)||t.isPlainObject(e)&&s.isString(a)?e[a]:void 0,P=a=>!!t.isObjectLike(a)&&(e.TYPE_NAME_KEY in a&&s.isString(a[e.TYPE_NAME_KEY]));function q(e,t,a,i){var s,n=arguments.length,r=n<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,a,i);else for(var c=e.length-1;c>=0;c--)(s=e[c])&&(r=(n<3?s(r):n>3?s(t,a,r):s(t,a))||r);return n>3&&r&&Object.defineProperty(t,a,r),r}function R(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}class T{static _countFieldPathChecklist(e){const t={missing:0,total:0};for(const[,a]of e){t.total+=a.length;const e=a.filter((({hasData:e})=>!e));t.missing+=e.length}return t}static _getFieldDataFromAncestor(e,a){const i=b(e,a);return t.isObjectLike(i)?structuredClone(i):i}static _getOperationCacheControl(e,t){const a="no-cache";if(!e)return a;const i=e.get(t);return i?i.printCacheControl():a}static _isNodeEntity(e){if(!e)return!1;const{isEntity:t,possibleTypes:a}=e;return t||a.some((e=>e.isEntity))}static _isNodeRequestFieldPath(e){return!!e&&(this._isNodeEntity(e)||e.hasArguments||e.hasDirectives)}static _isValid(e){return!s.get(e,["metadata","cacheControl",n],!1)&&e.checkTTL()}static _mergeResponseCacheMetadata(e,t){return t?new Map([...t.cacheMetadata,...e]):e}static _setCachedData(e,{data:a},i){const n=a=>{(t.isArray(e)&&s.isNumber(i)||t.isPlainObject(e))&&(e[i]=a)};t.isObjectLike(a)||s.isUndefined(a)?t.isArray(a)?n([]):t.isPlainObject(a)&&n({}):n(a)}static _setCachedResponseSlice(e,{cacheMetadata:t,data:a,fieldPathChecklist:i},{propNameOrIndex:s,requestFieldPath:n},r,c,{data:h}){T._setCacheMetadata(t,e.cacheability,n,h.operation),T._setFieldPathChecklist(i,e,n,r),T._setCachedData(a,e,s)}static _setCacheMetadata(e,t,a,i){if(!t)return;e.set(a,t);const s=e.get(i);(!s||s.metadata.ttl>t.metadata.ttl)&&e.set(i,t)}static _setFieldPathChecklist(e,{data:t},a,{dataTypename:n,fieldTypename:r,fragmentKind:c,fragmentName:h}){if(s.isUndefined(r)||c===i.Kind.FRAGMENT_SPREAD){if(e.has(a))return;return void e.set(a,[{fragmentKind:c,fragmentName:h,hasData:!s.isUndefined(t)}])}if(n!==r)return;const d=e.get(a)??[];d.some((({typeName:e})=>e===n))||e.set(a,[...d,{fragmentKind:c,fragmentName:h,hasData:!s.isUndefined(t),typeName:n}])}constructor(a){this._cacheTiersEnabled={entity:!1,queryResponse:!0,requestPath:!1},this._partialQueryResponses=new Map,this._responseChunksAwaitingCaching=new Map;const i=[];if("cache"in a||i.push(new t.ArgsError("@graphql-box/cache-manager expected cache to be in options.")),a.typeCacheDirectives&&!t.isPlainObject(a.typeCacheDirectives)){const e="@graphql-box/cache-manager expected options.typeCacheDirectives to be a plain object.";i.push(new t.ArgsError(e))}if(i.length>0)throw new t.GroupedError("@graphql-box/cache-manager argument validation errors.",i);"function"==typeof a.cache?a.cache().then((e=>{this._cache=e})).catch((e=>{throw e})):this._cache=a.cache,this._cacheTiersEnabled={...this._cacheTiersEnabled,...a.cacheTiersEnabled},this._cascadeCacheControl=a.cascadeCacheControl??!1,this._fallbackOperationCacheability=a.fallbackOperationCacheability??n,this._typeCacheDirectives=a.typeCacheDirectives??{},this._typeIDKey=a.typeIDKey??e.DEFAULT_TYPE_ID_KEY}async analyzeQuery(e,a,n){if(!o(this._cacheTiersEnabled))return{updated:e};const{ast:r,hash:h}=e,d={...n,fragmentDefinitions:t.getFragmentDefinitions(r),typeIDKey:this._typeIDKey},y=await this._retrieveCachedResponseData(e,a,d),{cacheMetadata:u,data:p,fieldCount:f}=y;if(f.missing===f.total||((e,t)=>c(e,t))(p,this._typeIDKey))return{updated:e};if(!f.missing&&l(this._cacheTiersEnabled)){const e=this._setQueryResponseCacheEntry(h,{cacheMetadata:u,data:p},a,d);return a.awaitDataCaching&&await e,{response:{cacheMetadata:u,data:p}}}const _=F(e,y,d),g=i.print(_),{fragmentDefinitions:C,typeIDKey:m,...D}=d;return s.assign(n,{...D,filteredRequest:g}),l(this._cacheTiersEnabled)&&this._setPartialQueryResponse(h,{cacheMetadata:u,data:p},a,n),{updated:{ast:_,hash:t.hashRequest(g),request:g}}}get cache(){return this._cache}async cacheQuery(e,a,i,s,n){const r={...n,fragmentDefinitions:t.getFragmentDefinitions((a??e).ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,a,i,s,r)}async cacheResponse(e,a,i,s){const n={...s,fragmentDefinitions:t.getFragmentDefinitions(e.ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,void 0,a,i,n)}get cacheTiersEnabled(){return this._cacheTiersEnabled}async checkCacheEntry(e,t,a,i){return!h(this._cacheTiersEnabled)&&this._checkCacheEntry(e,t,a,i)}async checkQueryResponseCacheEntry(a,i,s){if(!l(this._cacheTiersEnabled))return!1;const n=await this._checkCacheEntry(e.QUERY_RESPONSES,a,i,s);if(!n)return!1;const{cacheMetadata:r,data:c}=n.entry;return{cacheMetadata:t.rehydrateCacheMetadata(r),data:c}}deletePartialQueryResponse(e){l(this._cacheTiersEnabled)&&this._partialQueryResponses.delete(e)}async setQueryResponseCacheEntry(e,t,a,i){if(l(this._cacheTiersEnabled))return this._setQueryResponseCacheEntry(e.hash,t,a,i)}async _analyzeFieldNode(e,a,i,s,n){await(t.hasChildFields(e,{fragmentDefinitions:n.fragmentDefinitions})?this._analyzeParentFieldNode(e,a,i,s,n):this._analyzeLeafFieldNode(e,a,i,s,n))}async _analyzeLeafFieldNode(e,a,i,s,n){const r=t.buildFieldKeysAndPaths(e,a,n),{hashedRequestFieldCacheKey:c,propNameOrIndex:h,requestFieldCacheKey:d,requestFieldPath:o}=r,l=n.fieldTypeMap.get(o),{entityData:u,fragmentKind:p,fragmentName:f,requestFieldPathData:_,typeName:g}=a,C={dataTypename:P(u)?u.__typename:P(_)?_.__typename:void 0,fieldTypename:g,fragmentKind:p,fragmentName:f};if(T._isNodeRequestFieldPath(l)){if(y(this._cacheTiersEnabled)){const{cacheability:e,entry:t}=await this._retrieveCachedRequestFieldPathData(c,d,s,n);T._setCachedResponseSlice({cacheability:e,data:t},i,r,C,s,n)}}else{const e=T._getFieldDataFromAncestor(u,h)??T._getFieldDataFromAncestor(_,h);T._setFieldPathChecklist(i.fieldPathChecklist,{data:e},o,C),T._setCachedData(i.data,{data:e},h)}}async _analyzeParentFieldNode(a,i,n,r,c){const h=t.buildFieldKeysAndPaths(a,i,c),{propNameOrIndex:d,requestFieldCacheKey:o,requestFieldPath:l}=h,y=c.fieldTypeMap.get(l);if(!y)return;const{cacheability:u,data:p,entityData:f,requestFieldPathData:_}=await this._retrieveCachedParentNodeData(i,h,y,r,c),{fragmentKind:g,fragmentName:C,typeName:m}=i,D=s.get(p,e.TYPE_NAME_KEY);if(T._setCachedResponseSlice({cacheability:u,data:p},n,h,{dataTypename:D,fieldTypename:m,fragmentKind:g,fragmentName:C},r,c),!t.isObjectLike(p))return;const E=[];t.iterateChildFields(a,p,c.fragmentDefinitions,((e,t,a,i,s)=>{E.push(this._analyzeFieldNode(e,{cacheability:u,entityData:f,fragmentKind:a,fragmentName:i,index:s,requestFieldCacheKey:o,requestFieldPath:l,requestFieldPathData:_,typeName:t},{...n,data:b(n.data,d)},r,c))})),await Promise.all(E)}_buildCacheMetadata({ast:e},{data:a,...i},s,n){const r=this._createCacheMetadata({data:a,...i},n),c=t.getOperationDefinitions(e,n.data.operation)[0];if(!c)return r;const h=t.getChildFields(c);if(!h)return r;for(const{fieldNode:e}of h)this._setFieldCacheability(e,{requestFieldPath:n.data.operation},{cacheMetadata:r,data:a},s,n);return r}async _cacheResponse(e,t,a,n,r){const c=((e,t)=>{if(!t.deprecated.normalizePatchResponseData)return e;const{data:a,paths:i,...n}=e;return i?.length&&s.isString(i[0])?{...n,data:s.set({},i[0],a),paths:i}:e})(a,r);let d=c;((e,t)=>t.deprecated.hasDeferOrStream&&e.hasNext)(a,r)&&(this._setResponseChunksAwaitingCaching(c,r),d=void 0),((e,t)=>t.deprecated.hasDeferOrStream&&!e.hasNext&&e.paths)(a,r)&&(d=this._retrieveResponseDataForCaching(c,r));const y=[];if(d&&(u=this._cacheTiersEnabled,!h(u))){const{data:a}=d,s=this._buildCacheMetadata(e,d,n,r);let h,u;if(o(this._cacheTiersEnabled)&&y.push(this._setEntityAndRequestFieldPathCacheEntries(e,{cacheMetadata:s,entityData:structuredClone(a),requestFieldPathData:structuredClone(a)},n,r)),r.data.operation===i.OperationTypeNode.QUERY&&l(this._cacheTiersEnabled)){let i;r.data.queryFiltered&&t&&(y.push(this._setQueryResponseCacheEntry(t.hash,{cacheMetadata:s,data:a},n,r)),i=this._getPartialQueryResponse(e.hash)),h=T._mergeResponseCacheMetadata(s,i),u=this._mergeResponseData(a,i),y.push(this._setQueryResponseCacheEntry(e.hash,{cacheMetadata:h,data:u},n,r))}if(n.awaitDataCaching&&await Promise.all(y),((e,t)=>!t.deprecated.hasDeferOrStream&&!e.hasNext&&!e.paths)(c,r)&&h&&u)return{cacheMetadata:h,data:u}}var u;const{data:p,hasNext:f,paths:_}=c;return{cacheMetadata:this._buildCacheMetadata(e,c,n,r),data:p,hasNext:f,paths:_}}async _checkCacheEntry(e,t,a,i){try{const n=await this._hasCacheEntry(e,t);if(!n||!T._isValid(n))return!1;const r=await this._getCacheEntry(e,t,a,i);return!s.isUndefined(r)&&{cacheability:n,entry:r}}catch{return!1}}_createCacheMetadata({_cacheMetadata:e,headers:a},{data:i}){const s=new Map,n=_({_cacheMetadata:e,fallback:this._fallbackOperationCacheability,headers:a});return s.set(i.operation,n),e&&t.rehydrateCacheMetadata(e,s),s}async _getCacheEntry(e,t,a,i){return this._cache?.get(`${e}::${t}`)}_getPartialQueryResponse(e){const t=this._partialQueryResponses.get(e);return this._partialQueryResponses.delete(e),t}async _hasCacheEntry(e,t){try{return await(this._cache?.has(`${e}::${t}`))??!1}catch{return!1}}_mergeResponseData(e,t){return t?u(t.data,e,this._typeIDKey):e}async _parseEntityAndRequestFieldPathCacheEntryData(a,n,{cacheMetadata:r,entityData:c,requestFieldPathData:h},o,l){const u=t.buildFieldKeysAndPaths(a,n,l),{hashedRequestFieldCacheKey:p,requestFieldCacheKey:_,requestFieldPath:D,responseDataPath:E}=u,F=s.get(h,E),b=l.fieldTypeMap.get(D),P=r.get(D);if(!t.isObjectLike(F)&&!b?.hasDirectives)return;if(t.isObjectLike(F)){const e=[];t.iterateChildFields(a,F,l.fragmentDefinitions,((t,a,i,s,n)=>{e.push(this._parseEntityAndRequestFieldPathCacheEntryData(t,{index:n,requestFieldCacheKey:_,requestFieldPath:D,responseDataPath:E},{cacheMetadata:r,entityData:c,requestFieldPathData:h},o,l))})),await Promise.all(e)}if(s.isUndefined(F)||!b||!P)return;const q=g(F,b,this._typeIDKey),R=b.hasArguments||b.hasDirectives;l.data.operation===i.OperationTypeNode.QUERY&&(q||R)&&y(this._cacheTiersEnabled)&&(await this._setRequestFieldPathCacheEntry(u,{cacheability:P,fieldData:C(structuredClone(F),a,u,l),fieldTypeInfo:b},o,l),t.hasChildFields(a,{fragmentDefinitions:l.fragmentDefinitions})&&(q?s.set(h,E,{__cacheKey:`${e.REQUEST_FIELD_PATHS}::${p}`}):s.unset(h,E))),q&&d(this._cacheTiersEnabled)&&(await this._setEntityCacheEntry({cacheability:P,fieldData:m(structuredClone(s.get(c,E)),a,u,l),fieldTypeInfo:b},o,l),s.set(c,E,{__cacheKey:`${e.DATA_ENTITIES}::${f(F,b,l)}`}))}async _retrieveCachedEntityData(t,{possibleTypes:a,typeName:i},s,n){const r=[...a.map((e=>e.typeName)),i],c=(await Promise.all(r.map((a=>this._checkCacheEntry(e.DATA_ENTITIES,`${a}::${String(t)}`,s,n))))).filter((e=>!!e));let h;if(1===c.length)h=c[0];else if(c.length>1){c.sort((({cacheability:e},{cacheability:t})=>e.metadata.ttl-t.metadata.ttl));const e=c[0];e&&(h={cacheability:e.cacheability,entry:c.reduce(((e,{entry:t})=>u(e,t,this._typeIDKey)),{})})}return h??{}}async _retrieveCachedParentNodeData({entityData:e,requestFieldPathData:a},{hashedRequestFieldCacheKey:i,propNameOrIndex:n,requestFieldCacheKey:r},c,h,o){let l,u=T._getFieldDataFromAncestor(e,n),f=T._getFieldDataFromAncestor(a,n);if(T._isNodeRequestFieldPath(c)&&y(this._cacheTiersEnabled)){const{cacheability:e,entry:t}=await this._retrieveCachedRequestFieldPathData(i,r,h,o);f=p(f,t,this._typeIDKey),e&&(l=e)}const _=((e,{typeIDValue:a},i)=>a||(t.isPlainObject(e)?e[i]:void 0))(f,c,this._typeIDKey);if(T._isNodeEntity(c)&&_&&d(this._cacheTiersEnabled)){const{cacheability:e,entry:t}=await this._retrieveCachedEntityData(_,c,h,o);u=p(u,t,this._typeIDKey),e&&(!l||e.metadata.ttl>l.metadata.ttl)&&(l=e)}return{cacheability:l,data:s.isEqual(u,f)?u:p(u,f,this._typeIDKey),entityData:u,requestFieldPathData:f}}async _retrieveCachedRequestFieldPathData(t,a,i,s){return await this._checkCacheEntry(e.REQUEST_FIELD_PATHS,t,i,{...s,requestFieldCacheKey:a})||{}}async _retrieveCachedResponseData({ast:e},a,i){const s={cacheMetadata:new Map,data:{},fieldCount:{missing:0,total:0},fieldPathChecklist:new Map},n=t.getOperationDefinitions(e,i.data.operation)[0];if(!n)return s;const r=t.getChildFields(n);return r?(await Promise.all(r.map((({fieldNode:e})=>this._analyzeFieldNode(e,{requestFieldPath:i.data.operation},s,a,i)))),s.fieldCount=T._countFieldPathChecklist(s.fieldPathChecklist),s):s}_retrieveResponseDataForCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.data.requestID);return this._responseChunksAwaitingCaching.delete(t.data.requestID),(i=[...a??[],e]).reduce(((e,t,a)=>{const{_cacheMetadata:n,data:r,hasNext:c,headers:h,paths:d}=t;return n&&(e._cacheMetadata=e._cacheMetadata?{...e._cacheMetadata,...n}:n),e.data=s.merge(e.data,r),0===a&&(e.headers=h),a===i.length-1&&(e.hasNext=c),d&&(e.paths??=[],e.paths.push(...d)),e}),{data:{}});var i}async _setCacheEntry(e,t,a,i,s,n){try{await(this._cache?.set(`${e}::${t}`,structuredClone(a),i))}catch{}}async _setEntityAndRequestFieldPathCacheEntries(e,a,i,s){const n=t.getOperationDefinitions(e.ast,s.data.operation)[0];if(!n)return;const r=t.getChildFields(n);r&&await Promise.all(r.map((({fieldNode:e})=>this._parseEntityAndRequestFieldPathCacheEntryData(e,{requestFieldPath:s.data.operation},a,i,s))))}async _setEntityCacheEntry({cacheability:t,fieldData:a,fieldTypeInfo:i},s,n){const r=`${i.isEntity?i.typeName:a.__typename}::${String(a[this._typeIDKey])}`,c=await this._checkCacheEntry(e.DATA_ENTITIES,r,s,n);c&&(a=u(c.entry,a,this._typeIDKey)),await this._setCacheEntry(e.DATA_ENTITIES,r,a,{cacheHeaders:{cacheControl:t.printCacheControl()},tag:s.tag},s,n)}_setFieldCacheability(e,a,{cacheMetadata:i,data:n},r,c){const{requestFieldPath:h}=a,d=t.buildFieldKeysAndPaths(e,a,c),{requestFieldPath:o,responseDataPath:l}=d;if(!t.isObjectLike(n))return;const y=s.get(n,l),u=c.fieldTypeMap.get(o);(t.isObjectLike(y)||u?.hasDirectives)&&(this._setFieldTypeCacheDirective(i,{ancestorRequestFieldPath:h,requestFieldPath:o},c),t.isObjectLike(y)&&t.iterateChildFields(e,y,c.fragmentDefinitions,((e,t,a,s,h)=>{this._setFieldCacheability(e,{index:h,requestFieldPath:o,responseDataPath:l},{cacheMetadata:i,data:n},r,c)})))}_setFieldTypeCacheDirective(e,{ancestorRequestFieldPath:t,requestFieldPath:i},{data:s,fieldTypeMap:n}){if(e.has(i))return;const r=n.get(i);if(r&&this._typeCacheDirectives[r.typeName]){const t=new a.Cacheability({cacheControl:this._typeCacheDirectives[r.typeName]});T._setCacheMetadata(e,t,i,s.operation)}else this._cascadeCacheControl&&t&&T._setCacheMetadata(e,e.get(t),i,s.operation)}_setPartialQueryResponse(e,t,a,i){this._partialQueryResponses.set(e,t)}async _setQueryResponseCacheEntry(a,{cacheMetadata:i,data:s},n,r){const c=t.dehydrateCacheMetadata(i),h=T._getOperationCacheControl(i,r.data.operation);await this._setCacheEntry(e.QUERY_RESPONSES,a,{cacheMetadata:c,data:s},{cacheHeaders:{cacheControl:h},tag:n.tag},n,r)}async _setRequestFieldPathCacheEntry(a,{cacheability:i,fieldData:s},n,r){const{hashedRequestFieldCacheKey:c,requestFieldCacheKey:h}=a,d=await this._checkCacheEntry(e.REQUEST_FIELD_PATHS,c,n,{...r,requestFieldCacheKey:h});d&&t.isObjectLike(d.entry)&&t.isObjectLike(s)&&(s=u(d.entry,s,this._typeIDKey)),this._setCacheEntry(e.REQUEST_FIELD_PATHS,c,s,{cacheHeaders:{cacheControl:i.printCacheControl()},tag:n.tag},n,{...r,requestFieldCacheKey:h})}_setResponseChunksAwaitingCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.data.requestID);a?this._responseChunksAwaitingCaching.set(t.data.requestID,[...a,e]):this._responseChunksAwaitingCaching.set(t.data.requestID,[e])}}q([(t,a,i)=>{const s=i.value;s&&(i.value=async function(...t){return new Promise((a=>{(async()=>{const{data:i,debugManager:n,requestFieldCacheKey:r}=t[3];if(!n)return void a(await s.apply(this,t));const c=n.now(),h=await s.apply(this,t),d=n.now(),o=d-c;a(h),n.log(e.CACHE_ENTRY_QUERIED,{data:{...i,cacheType:t[0],...r?{decryptedCacheKey:r}:void 0},stats:{duration:o,endTime:d,startTime:c}})})()}))})},R("design:type",Function),R("design:paramtypes",["undefined"==typeof CacheTypes?Object:CacheTypes,String,"undefined"==typeof RequestOptions?Object:RequestOptions,Object]),R("design:returntype",Promise)],T.prototype,"_getCacheEntry",null),q([(t,a,i)=>{const s=i.value;s&&(i.value=async function(...t){return new Promise((a=>{(async()=>{const{data:i,debugManager:n,requestFieldCacheKey:r}=t[5];if(!n)return await s.apply(this,t),void a();const c=n.now();await s.apply(this,t);const h=n.now(),d=h-c;a(),n.log(e.CACHE_ENTRY_ADDED,{data:{...i,cacheHeaders:t[3].cacheHeaders,cacheType:t[0],...r?{decryptedCacheKey:r}:void 0},stats:{duration:d,endTime:h,startTime:c}})})()}))})},R("design:type",Function),R("design:paramtypes",["undefined"==typeof CacheTypes?Object:CacheTypes,String,Object,"undefined"==typeof CachemapOptions?Object:CachemapOptions,"undefined"==typeof RequestOptions?Object:RequestOptions,Object]),R("design:returntype",Promise)],T.prototype,"_setCacheEntry",null),q([(t,a,i)=>{const s=i.value;s&&(i.value=function(...t){const{data:a,debugManager:i}=t[3];if(!i)return void s.apply(this,t);const n=i.now();s.apply(this,t);const r=i.now(),c=r-n;i.log(e.PARTIAL_QUERY_COMPILED,{data:a,stats:{duration:c,endTime:r,startTime:n}})})},R("design:type",Function),R("design:paramtypes",[String,"undefined"==typeof PartialQueryResponse?Object:PartialQueryResponse,"undefined"==typeof RequestOptions?Object:RequestOptions,"undefined"==typeof CacheManagerContext?Object:CacheManagerContext]),R("design:returntype",void 0)],T.prototype,"_setPartialQueryResponse",null),exports.CacheManager=T;
|
|
1
|
+
"use strict";require("core-js/modules/es.array.push.js");var e=require("@graphql-box/helpers"),a=require("cacheability"),t=require("graphql"),s=require("lodash-es");exports.CacheManager=class{constructor(a){const t=[];if("cache"in a||t.push(new e.ArgsError('Expected "cache" to be in options.')),t.length>0)throw new e.GroupedError("Argument validation errors",t);"function"==typeof a.cache?a.cache().then(e=>{this._cache=e}).catch(e=>{throw e}):this._cache=a.cache,this._hashCacheKeys=a.hashCacheKeys??!1}async analyzeQuery(a,s){const{ast:h}=a,{allPathsResolved:r,cacheMetadata:o,data:c,resolvedPaths:n}=await this._retrieveResponseData(s.fieldPaths);if(0===n.length)return{operationData:a};if(r)return{responseData:{__cacheMetadata:o,data:c}};const i=((a,s)=>t.visit(a,{enter:(a,h,r,o,c)=>{if(e.isKind(a,t.Kind.FIELD)){const t=e.buildAncestorFieldNames(c).join("."),h=e.getAlias(a)??a.name.value,r=e.buildFieldOperationPath(h,t);if(s.includes(r))return null}},leave:a=>{if((e.isKind(a,t.Kind.FIELD)||e.isKind(a,t.Kind.INLINE_FRAGMENT)||e.isKind(a,t.Kind.OPERATION_DEFINITION))&&0===a.selectionSet?.selections.length)return null}}))(h,n),d=t.print(i);return{operationData:{ast:i,hash:e.hashOperation(d),operation:d}}}get cache(){return this._cache}async cacheQuery(e,a){await this._storeResponseData(e,a.fieldPaths)}get hashCacheKeys(){return this._hashCacheKeys}async _retrieveResponseData(e){const a={},t={},h=[],r=Object.entries(e);for(const[e,{cachePaths:o,responsePaths:c}]of r)for(const[r,n]of o.entries()){const o=await(this._cache?.has(n,{hashKey:this._hashCacheKeys}));if(!(!!o&&o.checkTTL()))continue;const i=await(this._cache?.get(n,{hashKey:this._hashCacheKeys})),d=c[r];if(!d)throw new Error(`Your context has got corrupted. No matching response path was found for cache path "${n}", but it is part of a response path group for which data should exist.`);s.set(a,d,i),s.has(t,e)||(t[e]=o.metadata),h.push(e)}return{allPathsResolved:r.length===h.length,cacheMetadata:t,data:a,resolvedPaths:h}}async _storeResponseData({__cacheMetadata:e,data:t},h){const r=Object.entries(h),o=[];for(const[h,{cachePaths:c,responsePaths:n}]of r)for(const[r,i]of n.entries()){const n=s.get(t,i);if(void 0===n)throw new Error(`Response data value undefined for response path "${i}"`);const d=c[r];if(!d)throw new Error(`Your context has got corrupted. No matching cache path was found for response path "${i}", but it is part of a cache path group for which data should exist.`);const u=e?.[h];if(!u)throw new Error(`Your response data has got corrupted. No matching cache metadata was found for operation path "${h}".`);this._cache&&o.push(this._cache.set(d,n,{cacheHeaders:{cacheControl:new a.Cacheability({metadata:u}).printCacheControl()},hashKey:this._hashCacheKeys}))}await Promise.all(o)}};
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -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.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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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../cache-manager/src//main.ts","../cache-manager/src//helpers/filterQuery.ts"],"sourcesContent":["import { type Core } from '@cachemap/core';\nimport {\n type CacheMetadata,\n type FieldPaths,\n type OperationContext,\n type OperationData,\n type ResponseData,\n} from '@graphql-box/core';\nimport { ArgsError, GroupedError, hashOperation } from '@graphql-box/helpers';\nimport { Cacheability, type Metadata as CacheabilityMetadata } from 'cacheability';\nimport { print } from 'graphql';\nimport { get, has, set } from 'lodash-es';\nimport { type SetRequired } from 'type-fest';\nimport { filterQuery } from './helpers/filterQuery.ts';\nimport { type AnalyzeQueryResult, type CacheManagerDef, type UserOptions } from './types.ts';\n\nexport class CacheManager implements CacheManagerDef {\n private _cache: Core | undefined;\n private readonly _hashCacheKeys: boolean;\n\n constructor(options: UserOptions) {\n const errors: ArgsError[] = [];\n\n if (!('cache' in options)) {\n errors.push(new ArgsError('Expected \"cache\" to be in options.'));\n }\n\n if (errors.length > 0) {\n throw new GroupedError('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._hashCacheKeys = options.hashCacheKeys ?? false;\n }\n\n public async analyzeQuery(\n operationData: OperationData,\n context: SetRequired<OperationContext, 'fieldPaths'>,\n ): Promise<AnalyzeQueryResult> {\n const { ast } = operationData;\n\n const { allPathsResolved, cacheMetadata, data, resolvedPaths } = await this._retrieveResponseData(\n context.fieldPaths,\n );\n\n if (resolvedPaths.length === 0) {\n return { operationData };\n }\n\n if (allPathsResolved) {\n return { responseData: { __cacheMetadata: cacheMetadata, data } };\n }\n\n const filteredAst = filterQuery(ast, resolvedPaths);\n const filteredOperation = print(filteredAst);\n\n return {\n operationData: {\n ast: filteredAst,\n hash: hashOperation(filteredOperation),\n operation: filteredOperation,\n },\n };\n }\n\n get cache(): Core | undefined {\n return this._cache;\n }\n\n public async cacheQuery(\n responseData: ResponseData,\n context: SetRequired<OperationContext, 'fieldPaths'>,\n ): Promise<void> {\n await this._storeResponseData(responseData, context.fieldPaths);\n }\n\n get hashCacheKeys(): boolean {\n return this._hashCacheKeys;\n }\n\n private async _retrieveResponseData(fieldPaths: FieldPaths): Promise<{\n allPathsResolved: boolean;\n cacheMetadata: CacheMetadata;\n data: Record<string, unknown>;\n resolvedPaths: string[];\n }> {\n const cachedResponseData: Record<string, unknown> = {};\n const cacheMetadata: Record<string, CacheabilityMetadata> = {};\n const resolvedOperationPaths: string[] = [];\n const fieldPathEntries = Object.entries(fieldPaths);\n\n for (const [operationPath, { cachePaths, responsePaths }] of fieldPathEntries) {\n for (const [index, cachePath] of cachePaths.entries()) {\n const cacheability = await this._cache?.has(cachePath, { hashKey: this._hashCacheKeys });\n const cacheEntryValid = !!cacheability && cacheability.checkTTL();\n\n if (!cacheEntryValid) {\n continue;\n }\n\n const cachedData = await this._cache?.get(cachePath, { hashKey: this._hashCacheKeys });\n const matchingResponsePath = responsePaths[index];\n\n if (!matchingResponsePath) {\n throw new Error(\n `Your context has got corrupted. No matching response path was found for cache path \"${cachePath}\", but it is part of a response path group for which data should exist.`,\n );\n }\n\n set(cachedResponseData, matchingResponsePath, cachedData);\n\n if (!has(cacheMetadata, operationPath)) {\n cacheMetadata[operationPath] = cacheability.metadata;\n }\n\n resolvedOperationPaths.push(operationPath);\n }\n }\n\n return {\n allPathsResolved: fieldPathEntries.length === resolvedOperationPaths.length,\n cacheMetadata,\n data: cachedResponseData,\n resolvedPaths: resolvedOperationPaths,\n };\n }\n\n private async _storeResponseData({ __cacheMetadata, data }: ResponseData, fieldPaths: FieldPaths): Promise<void> {\n const fieldPathEntries = Object.entries(fieldPaths);\n const cacheSetPromises: Promise<void>[] = [];\n\n for (const [operationPath, { cachePaths, responsePaths }] of fieldPathEntries) {\n for (const [index, responsePath] of responsePaths.entries()) {\n const value = get(data, responsePath);\n\n if (value === undefined) {\n throw new Error(`Response data value undefined for response path \"${responsePath}\"`);\n }\n\n const matchingCachePath = cachePaths[index];\n\n if (!matchingCachePath) {\n throw new Error(\n `Your context has got corrupted. No matching cache path was found for response path \"${responsePath}\", but it is part of a cache path group for which data should exist.`,\n );\n }\n\n const matchingMetadata = __cacheMetadata?.[operationPath];\n\n if (!matchingMetadata) {\n throw new Error(\n `Your response data has got corrupted. No matching cache metadata was found for operation path \"${operationPath}\".`,\n );\n }\n\n if (this._cache) {\n cacheSetPromises.push(\n this._cache.set(matchingCachePath, value, {\n cacheHeaders: { cacheControl: new Cacheability({ metadata: matchingMetadata }).printCacheControl() },\n hashKey: this._hashCacheKeys,\n }),\n );\n }\n }\n }\n\n await Promise.all(cacheSetPromises);\n }\n}\n","import { buildAncestorFieldNames, buildFieldOperationPath, getAlias, isKind } from '@graphql-box/helpers';\nimport {\n type DocumentNode,\n type FieldNode,\n type InlineFragmentNode,\n Kind,\n type OperationDefinitionNode,\n visit,\n} from 'graphql';\n\nexport const filterQuery = (ast: DocumentNode, resolvedPaths: string[]): DocumentNode => {\n return visit(ast, {\n enter: (node, _key, _parent, _path, ancestors) => {\n if (isKind<FieldNode>(node, Kind.FIELD)) {\n const ancestorFieldNames = buildAncestorFieldNames(ancestors);\n const parentFieldPath = ancestorFieldNames.join('.');\n const fieldName = getAlias(node) ?? node.name.value;\n const fieldOperationPath = buildFieldOperationPath(fieldName, parentFieldPath);\n\n if (resolvedPaths.includes(fieldOperationPath)) {\n return null;\n }\n }\n\n return;\n },\n leave: node => {\n if (\n (isKind<FieldNode>(node, Kind.FIELD) ||\n isKind<InlineFragmentNode>(node, Kind.INLINE_FRAGMENT) ||\n isKind<OperationDefinitionNode>(node, Kind.OPERATION_DEFINITION)) &&\n node.selectionSet?.selections.length === 0\n ) {\n return null;\n }\n\n return;\n },\n });\n};\n"],"names":["constructor","options","errors","push","ArgsError","length","GroupedError","cache","then","this","_cache","catch","error","_hashCacheKeys","hashCacheKeys","analyzeQuery","operationData","context","ast","allPathsResolved","cacheMetadata","data","resolvedPaths","_retrieveResponseData","fieldPaths","responseData","__cacheMetadata","filteredAst","visit","enter","node","_key","_parent","_path","ancestors","isKind","Kind","FIELD","parentFieldPath","buildAncestorFieldNames","join","fieldName","getAlias","name","value","fieldOperationPath","buildFieldOperationPath","includes","leave","INLINE_FRAGMENT","OPERATION_DEFINITION","selectionSet","selections","filterQuery","filteredOperation","print","hash","hashOperation","operation","cacheQuery","_storeResponseData","cachedResponseData","resolvedOperationPaths","fieldPathEntries","Object","entries","operationPath","cachePaths","responsePaths","index","cachePath","cacheability","has","hashKey","checkTTL","cachedData","get","matchingResponsePath","Error","set","metadata","cacheSetPromises","responsePath","undefined","matchingCachePath","matchingMetadata","cacheHeaders","cacheControl","Cacheability","printCacheControl","Promise","all"],"mappings":"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"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"core-js/modules/web.structured-clone.js";import"core-js/modules/es.array.push.js";import{CACHE_ENTRY_ADDED as e,CACHE_ENTRY_QUERIED as t,PARTIAL_QUERY_COMPILED as a,TYPE_NAME_KEY as s,DEFAULT_TYPE_ID_KEY as i,QUERY_RESPONSES as n,REQUEST_FIELD_PATHS as r,DATA_ENTITIES as c}from"@graphql-box/core";import{isPlainObject as h,isArray as o,mergeObjects as d,isObjectLike as l,resolveFragments as y,getName as p,buildFieldKeysAndPaths as u,deleteFragmentSpreads as f,getChildFields as _,deleteChildFields as g,getInlineFragments as m,deleteInlineFragments as C,hasChildFields as D,deleteFragmentDefinitions as F,getOperationDefinitions as P,ArgsError as b,GroupedError as q,getFragmentDefinitions as R,hashRequest as E,rehydrateCacheMetadata as N,iterateChildFields as w,dehydrateCacheMetadata as M}from"@graphql-box/helpers";import{Cacheability as T}from"cacheability";import{Kind as K,print as v,OperationTypeNode as I}from"graphql";import{isNumber as O,isString as k,isEmpty as A,keys as x,merge as j,set as Q,get as S,isUndefined as $,assign as z,unset as U,isEqual as H}from"lodash-es";const G="noCache",L=(e,t)=>o(e)?e.reduce(((e,a)=>!!e&&L(a,t)),!0):!!h(e)&&V(e,t),V=(e,t)=>{const a=h(e)?Object.keys(e):[...e.keys()];return!(1!==a.length||!h(e)||!e[t])||a.reduce(((a,s)=>!!a&&(O(s)&&o(e)||k(s)&&h(e)?L(e[s],t):a)),!0)},Y=({entity:e,queryResponse:t,requestPath:a})=>!e&&!t&&!a,B=e=>!!e.entity,J=({entity:e,requestPath:t})=>!!(e??t),W=e=>!!e.queryResponse,X=e=>!!e.requestPath,Z=(e,t,a)=>d(e,t,((e,t)=>h(t)&&t[a]?t[a]:void 0)),ee=(e,t,a)=>!e&&t?t:l(e)&&l(t)?Z(e,t,a):e,te=(e,t,a)=>`${t.isEntity?t.typeName:e.__typename}::${String(e[a.typeIDKey])}`,ae=(e,t,a)=>{if(!h(e)||!(a in e))return!1;const{isEntity:s=!1,possibleTypes:i=[]}=t??{};return!!s||0!==i.length&&i.some((t=>t.typeName===e.__typename))},se=(e,t,a,s)=>{if(!h(e))return e;const i=y(t.selectionSet?.selections,s.fragmentDefinitions);return x(e).reduce(((t,n)=>{const r=i.find((({fieldNode:e})=>p(e)===n));if(r){const t=u(r.fieldNode,a,s),i=s.fieldTypeMap.get(t.requestFieldPath);(ae(e[n],i,s.typeIDKey)||i?.hasArguments||i?.hasDirectives)&&delete e[n]}return t}),e)},ie=(e,t,a,s)=>{const i=y(t.selectionSet?.selections,s.fragmentDefinitions);return Object.keys(e).reduce(((t,n)=>{const r=i.find((({fieldNode:e})=>p(e)===n));if(r){const{requestFieldPath:t}=u(r.fieldNode,a,s),i=s.fieldTypeMap.get(t);(ae(e[n],i,s.typeIDKey)||i?.hasArguments)&&delete e[n]}return t}),e)},ne=(e,t)=>{if(!e||0===e.length)return{hasData:!1,typeUnused:!!t};const[a]=e;if(a){const{hasData:e,typeName:s}=a;return{hasData:e,typeUnused:s?s!==t:void 0}}return{hasData:e.some((({hasData:e,typeName:a})=>a===t&&e)),typeUnused:!e.every((({typeName:e})=>e===t))}},re=(e,t,a,i,n)=>{const{fragmentDefinitions:r,typeIDKey:c}=n,h=_(e,{fragmentDefinitions:r});if(!h)return!1;const o={};for(let d=h.length-1;d>=0;d-=1){const l=h[d];if(!l)continue;const{fieldNode:y,fragmentKind:f,fragmentName:m,typeName:C}=l;f===K.FRAGMENT_SPREAD&&m&&!o[m]&&(o[m]={hasData:0,total:r?.[m]?_(r[m],{fragmentDefinitions:r})?.length??0:0});const F=p(y);if(F===c||F===s)continue;const{requestFieldPath:P}=u(y,{requestFieldPath:i},n),{hasData:b,typeUnused:q}=ne(t.get(P),C);if(b||q)if(f===K.FRAGMENT_SPREAD&&m){const e=o[m];e&&(e.hasData+=1)}else D(y,{fragmentDefinitions:r})?re(y,t,a,P,n)&&g(e,y):g(e,y)}return((e,t,a,s)=>{if(!A(t))for(const[i,n]of Object.entries(t)){const t=a[i];if(!t)continue;t.paths.push(s);const{hasData:r,total:c}=n;r===c&&(f(e,i),t.deleted+=1)}})(e,o,a,i),((e,{fragmentDefinitions:t,typeIDKey:a})=>{const s=m(e);let i=!1;for(const n of s){const s=_(n,{fragmentDefinitions:t});if(!s||0===s.length){C(e,n),i=!0;continue}const[r]=s;if(r){const{fieldNode:t}=r;p(t)===a&&(C(e,n),i=!0)}}})(e,n),((e,{fragmentDefinitions:t,typeIDKey:a})=>{const i=_(e,{fragmentDefinitions:t});if(!i||i.length>3)return!1;const n=i.map((({fieldNode:e})=>e.name.value));if(2===n.length&&n.every((e=>e===a||e===s)))return g(e,i.map((({fieldNode:e})=>e))),!0;if(1===n.length&&n[0]===a||n[0]===s){const[t]=i;if(t){const{fieldNode:a}=t;return g(e,a),!0}}})(e,n),!D(e,{fragmentDefinitions:r})},ce=(e,{fieldPathChecklist:t},a)=>{const{ast:s}=e,i=P(s,a.data.operation)[0];if(!i)return s;const{data:n,fragmentDefinitions:r}=a,c=_(i,{fragmentDefinitions:r});if(!c)return s;const h=(({request:e},{fragmentDefinitions:t})=>x(t??{}).reduce(((t,a)=>(t[a]={deleted:0,paths:[],total:(e.match(new RegExp(`\\.\\.\\.${a}`,"g"))??[]).length},t)),{}))(e,a);for(let e=c.length-1;e>=0;e-=1){const{fieldNode:s}=c[e],{requestFieldPath:r}=u(s,{requestFieldPath:n.operation},a);re(s,t,h,r,a)&&g(i,s)}return a.data.queryFiltered=!0,((e,t,a,s)=>{const i=x(a).reduce(((e,t)=>{const s=a[t];if(!s)return e;const{deleted:i,paths:n,total:r}=s;return 0===i&&1===r?[...e,{name:t,path:n[0]}]:e}),[]),{fragmentDefinitions:n={}}=s;for(const{name:e,path:r}of i){const i=n[e];i&&re(i,t,a,r,s)}const r=x(a).reduce(((e,t)=>{const s=a[t];if(!s)return e;const{deleted:i,total:n}=s;return i>0&&i===n?[...e,t]:e}),[]);return 0===r.length?e:F(e,{include:r})})(s,t,h,a)},he=(e,t)=>o(e)&&O(t)||h(e)&&k(t)?e[t]:void 0,oe=e=>!!l(e)&&(s in e&&k(e[s]));function de(e,t,a,s){var i,n=arguments.length,r=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,a):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,a,s);else for(var c=e.length-1;c>=0;c--)(i=e[c])&&(r=(n<3?i(r):n>3?i(t,a,r):i(t,a))||r);return n>3&&r&&Object.defineProperty(t,a,r),r}function le(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}class ye{static _countFieldPathChecklist(e){const t={missing:0,total:0};for(const[,a]of e){t.total+=a.length;const e=a.filter((({hasData:e})=>!e));t.missing+=e.length}return t}static _getFieldDataFromAncestor(e,t){const a=he(e,t);return l(a)?structuredClone(a):a}static _getOperationCacheControl(e,t){const a="no-cache";if(!e)return a;const s=e.get(t);return s?s.printCacheControl():a}static _isNodeEntity(e){if(!e)return!1;const{isEntity:t,possibleTypes:a}=e;return t||a.some((e=>e.isEntity))}static _isNodeRequestFieldPath(e){return!!e&&(this._isNodeEntity(e)||e.hasArguments||e.hasDirectives)}static _isValid(e){return!S(e,["metadata","cacheControl",G],!1)&&e.checkTTL()}static _mergeResponseCacheMetadata(e,t){return t?new Map([...t.cacheMetadata,...e]):e}static _setCachedData(e,{data:t},a){const s=t=>{(o(e)&&O(a)||h(e))&&(e[a]=t)};l(t)||$(t)?o(t)?s([]):h(t)&&s({}):s(t)}static _setCachedResponseSlice(e,{cacheMetadata:t,data:a,fieldPathChecklist:s},{propNameOrIndex:i,requestFieldPath:n},r,c,{data:h}){ye._setCacheMetadata(t,e.cacheability,n,h.operation),ye._setFieldPathChecklist(s,e,n,r),ye._setCachedData(a,e,i)}static _setCacheMetadata(e,t,a,s){if(!t)return;e.set(a,t);const i=e.get(s);(!i||i.metadata.ttl>t.metadata.ttl)&&e.set(s,t)}static _setFieldPathChecklist(e,{data:t},a,{dataTypename:s,fieldTypename:i,fragmentKind:n,fragmentName:r}){if($(i)||n===K.FRAGMENT_SPREAD){if(e.has(a))return;return void e.set(a,[{fragmentKind:n,fragmentName:r,hasData:!$(t)}])}if(s!==i)return;const c=e.get(a)??[];c.some((({typeName:e})=>e===s))||e.set(a,[...c,{fragmentKind:n,fragmentName:r,hasData:!$(t),typeName:s}])}constructor(e){this._cacheTiersEnabled={entity:!1,queryResponse:!0,requestPath:!1},this._partialQueryResponses=new Map,this._responseChunksAwaitingCaching=new Map;const t=[];if("cache"in e||t.push(new b("@graphql-box/cache-manager expected cache to be in options.")),e.typeCacheDirectives&&!h(e.typeCacheDirectives)){const e="@graphql-box/cache-manager expected options.typeCacheDirectives to be a plain object.";t.push(new b(e))}if(t.length>0)throw new q("@graphql-box/cache-manager argument validation errors.",t);"function"==typeof e.cache?e.cache().then((e=>{this._cache=e})).catch((e=>{throw e})):this._cache=e.cache,this._cacheTiersEnabled={...this._cacheTiersEnabled,...e.cacheTiersEnabled},this._cascadeCacheControl=e.cascadeCacheControl??!1,this._fallbackOperationCacheability=e.fallbackOperationCacheability??G,this._typeCacheDirectives=e.typeCacheDirectives??{},this._typeIDKey=e.typeIDKey??i}async analyzeQuery(e,t,a){if(!J(this._cacheTiersEnabled))return{updated:e};const{ast:s,hash:i}=e,n={...a,fragmentDefinitions:R(s),typeIDKey:this._typeIDKey},r=await this._retrieveCachedResponseData(e,t,n),{cacheMetadata:c,data:h,fieldCount:o}=r;if(o.missing===o.total||((e,t)=>V(e,t))(h,this._typeIDKey))return{updated:e};if(!o.missing&&W(this._cacheTiersEnabled)){const e=this._setQueryResponseCacheEntry(i,{cacheMetadata:c,data:h},t,n);return t.awaitDataCaching&&await e,{response:{cacheMetadata:c,data:h}}}const d=ce(e,r,n),l=v(d),{fragmentDefinitions:y,typeIDKey:p,...u}=n;return z(a,{...u,filteredRequest:l}),W(this._cacheTiersEnabled)&&this._setPartialQueryResponse(i,{cacheMetadata:c,data:h},t,a),{updated:{ast:d,hash:E(l),request:l}}}get cache(){return this._cache}async cacheQuery(e,t,a,s,i){const n={...i,fragmentDefinitions:R((t??e).ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,t,a,s,n)}async cacheResponse(e,t,a,s){const i={...s,fragmentDefinitions:R(e.ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,void 0,t,a,i)}get cacheTiersEnabled(){return this._cacheTiersEnabled}async checkCacheEntry(e,t,a,s){return!Y(this._cacheTiersEnabled)&&this._checkCacheEntry(e,t,a,s)}async checkQueryResponseCacheEntry(e,t,a){if(!W(this._cacheTiersEnabled))return!1;const s=await this._checkCacheEntry(n,e,t,a);if(!s)return!1;const{cacheMetadata:i,data:r}=s.entry;return{cacheMetadata:N(i),data:r}}deletePartialQueryResponse(e){W(this._cacheTiersEnabled)&&this._partialQueryResponses.delete(e)}async setQueryResponseCacheEntry(e,t,a,s){if(W(this._cacheTiersEnabled))return this._setQueryResponseCacheEntry(e.hash,t,a,s)}async _analyzeFieldNode(e,t,a,s,i){await(D(e,{fragmentDefinitions:i.fragmentDefinitions})?this._analyzeParentFieldNode(e,t,a,s,i):this._analyzeLeafFieldNode(e,t,a,s,i))}async _analyzeLeafFieldNode(e,t,a,s,i){const n=u(e,t,i),{hashedRequestFieldCacheKey:r,propNameOrIndex:c,requestFieldCacheKey:h,requestFieldPath:o}=n,d=i.fieldTypeMap.get(o),{entityData:l,fragmentKind:y,fragmentName:p,requestFieldPathData:f,typeName:_}=t,g={dataTypename:oe(l)?l.__typename:oe(f)?f.__typename:void 0,fieldTypename:_,fragmentKind:y,fragmentName:p};if(ye._isNodeRequestFieldPath(d)){if(X(this._cacheTiersEnabled)){const{cacheability:e,entry:t}=await this._retrieveCachedRequestFieldPathData(r,h,s,i);ye._setCachedResponseSlice({cacheability:e,data:t},a,n,g,s,i)}}else{const e=ye._getFieldDataFromAncestor(l,c)??ye._getFieldDataFromAncestor(f,c);ye._setFieldPathChecklist(a.fieldPathChecklist,{data:e},o,g),ye._setCachedData(a.data,{data:e},c)}}async _analyzeParentFieldNode(e,t,a,i,n){const r=u(e,t,n),{propNameOrIndex:c,requestFieldCacheKey:h,requestFieldPath:o}=r,d=n.fieldTypeMap.get(o);if(!d)return;const{cacheability:y,data:p,entityData:f,requestFieldPathData:_}=await this._retrieveCachedParentNodeData(t,r,d,i,n),{fragmentKind:g,fragmentName:m,typeName:C}=t,D=S(p,s);if(ye._setCachedResponseSlice({cacheability:y,data:p},a,r,{dataTypename:D,fieldTypename:C,fragmentKind:g,fragmentName:m},i,n),!l(p))return;const F=[];w(e,p,n.fragmentDefinitions,((e,t,s,r,d)=>{F.push(this._analyzeFieldNode(e,{cacheability:y,entityData:f,fragmentKind:s,fragmentName:r,index:d,requestFieldCacheKey:h,requestFieldPath:o,requestFieldPathData:_,typeName:t},{...a,data:he(a.data,c)},i,n))})),await Promise.all(F)}_buildCacheMetadata({ast:e},{data:t,...a},s,i){const n=this._createCacheMetadata({data:t,...a},i),r=P(e,i.data.operation)[0];if(!r)return n;const c=_(r);if(!c)return n;for(const{fieldNode:e}of c)this._setFieldCacheability(e,{requestFieldPath:i.data.operation},{cacheMetadata:n,data:t},s,i);return n}async _cacheResponse(e,t,a,s,i){const n=((e,t)=>{if(!t.deprecated.normalizePatchResponseData)return e;const{data:a,paths:s,...i}=e;return s?.length&&k(s[0])?{...i,data:Q({},s[0],a),paths:s}:e})(a,i);let r=n;((e,t)=>t.deprecated.hasDeferOrStream&&e.hasNext)(a,i)&&(this._setResponseChunksAwaitingCaching(n,i),r=void 0),((e,t)=>t.deprecated.hasDeferOrStream&&!e.hasNext&&e.paths)(a,i)&&(r=this._retrieveResponseDataForCaching(n,i));const c=[];if(r&&(h=this._cacheTiersEnabled,!Y(h))){const{data:a}=r,h=this._buildCacheMetadata(e,r,s,i);let o,d;if(J(this._cacheTiersEnabled)&&c.push(this._setEntityAndRequestFieldPathCacheEntries(e,{cacheMetadata:h,entityData:structuredClone(a),requestFieldPathData:structuredClone(a)},s,i)),i.data.operation===I.QUERY&&W(this._cacheTiersEnabled)){let n;i.data.queryFiltered&&t&&(c.push(this._setQueryResponseCacheEntry(t.hash,{cacheMetadata:h,data:a},s,i)),n=this._getPartialQueryResponse(e.hash)),o=ye._mergeResponseCacheMetadata(h,n),d=this._mergeResponseData(a,n),c.push(this._setQueryResponseCacheEntry(e.hash,{cacheMetadata:o,data:d},s,i))}if(s.awaitDataCaching&&await Promise.all(c),((e,t)=>!t.deprecated.hasDeferOrStream&&!e.hasNext&&!e.paths)(n,i)&&o&&d)return{cacheMetadata:o,data:d}}var h;const{data:o,hasNext:d,paths:l}=n;return{cacheMetadata:this._buildCacheMetadata(e,n,s,i),data:o,hasNext:d,paths:l}}async _checkCacheEntry(e,t,a,s){try{const i=await this._hasCacheEntry(e,t);if(!i||!ye._isValid(i))return!1;const n=await this._getCacheEntry(e,t,a,s);return!$(n)&&{cacheability:i,entry:n}}catch{return!1}}_createCacheMetadata({_cacheMetadata:e,headers:t},{data:a}){const s=new Map,i=(({_cacheMetadata:e,fallback:t,headers:a})=>{if(e&&!A(e)){const[t,...a]=Object.values(e);return new T({metadata:a.reduce(((e,t)=>e?t.ttl<e.ttl?t:e:t),t)})}return a?.has("cache-control")?new T({headers:a}):new T({cacheControl:t})})({_cacheMetadata:e,fallback:this._fallbackOperationCacheability,headers:t});return s.set(a.operation,i),e&&N(e,s),s}async _getCacheEntry(e,t,a,s){return this._cache?.get(`${e}::${t}`)}_getPartialQueryResponse(e){const t=this._partialQueryResponses.get(e);return this._partialQueryResponses.delete(e),t}async _hasCacheEntry(e,t){try{return await(this._cache?.has(`${e}::${t}`))??!1}catch{return!1}}_mergeResponseData(e,t){return t?Z(t.data,e,this._typeIDKey):e}async _parseEntityAndRequestFieldPathCacheEntryData(e,t,{cacheMetadata:a,entityData:s,requestFieldPathData:i},n,h){const o=u(e,t,h),{hashedRequestFieldCacheKey:d,requestFieldCacheKey:y,requestFieldPath:p,responseDataPath:f}=o,_=S(i,f),g=h.fieldTypeMap.get(p),m=a.get(p);if(!l(_)&&!g?.hasDirectives)return;if(l(_)){const t=[];w(e,_,h.fragmentDefinitions,((e,r,c,o,d)=>{t.push(this._parseEntityAndRequestFieldPathCacheEntryData(e,{index:d,requestFieldCacheKey:y,requestFieldPath:p,responseDataPath:f},{cacheMetadata:a,entityData:s,requestFieldPathData:i},n,h))})),await Promise.all(t)}if($(_)||!g||!m)return;const C=ae(_,g,this._typeIDKey),F=g.hasArguments||g.hasDirectives;h.data.operation===I.QUERY&&(C||F)&&X(this._cacheTiersEnabled)&&(await this._setRequestFieldPathCacheEntry(o,{cacheability:m,fieldData:se(structuredClone(_),e,o,h),fieldTypeInfo:g},n,h),D(e,{fragmentDefinitions:h.fragmentDefinitions})&&(C?Q(i,f,{__cacheKey:`${r}::${d}`}):U(i,f))),C&&B(this._cacheTiersEnabled)&&(await this._setEntityCacheEntry({cacheability:m,fieldData:ie(structuredClone(S(s,f)),e,o,h),fieldTypeInfo:g},n,h),Q(s,f,{__cacheKey:`${c}::${te(_,g,h)}`}))}async _retrieveCachedEntityData(e,{possibleTypes:t,typeName:a},s,i){const n=[...t.map((e=>e.typeName)),a],r=(await Promise.all(n.map((t=>this._checkCacheEntry(c,`${t}::${String(e)}`,s,i))))).filter((e=>!!e));let h;if(1===r.length)h=r[0];else if(r.length>1){r.sort((({cacheability:e},{cacheability:t})=>e.metadata.ttl-t.metadata.ttl));const e=r[0];e&&(h={cacheability:e.cacheability,entry:r.reduce(((e,{entry:t})=>Z(e,t,this._typeIDKey)),{})})}return h??{}}async _retrieveCachedParentNodeData({entityData:e,requestFieldPathData:t},{hashedRequestFieldCacheKey:a,propNameOrIndex:s,requestFieldCacheKey:i},n,r,c){let o,d=ye._getFieldDataFromAncestor(e,s),l=ye._getFieldDataFromAncestor(t,s);if(ye._isNodeRequestFieldPath(n)&&X(this._cacheTiersEnabled)){const{cacheability:e,entry:t}=await this._retrieveCachedRequestFieldPathData(a,i,r,c);l=ee(l,t,this._typeIDKey),e&&(o=e)}const y=((e,{typeIDValue:t},a)=>t||(h(e)?e[a]:void 0))(l,n,this._typeIDKey);if(ye._isNodeEntity(n)&&y&&B(this._cacheTiersEnabled)){const{cacheability:e,entry:t}=await this._retrieveCachedEntityData(y,n,r,c);d=ee(d,t,this._typeIDKey),e&&(!o||e.metadata.ttl>o.metadata.ttl)&&(o=e)}return{cacheability:o,data:H(d,l)?d:ee(d,l,this._typeIDKey),entityData:d,requestFieldPathData:l}}async _retrieveCachedRequestFieldPathData(e,t,a,s){return await this._checkCacheEntry(r,e,a,{...s,requestFieldCacheKey:t})||{}}async _retrieveCachedResponseData({ast:e},t,a){const s={cacheMetadata:new Map,data:{},fieldCount:{missing:0,total:0},fieldPathChecklist:new Map},i=P(e,a.data.operation)[0];if(!i)return s;const n=_(i);return n?(await Promise.all(n.map((({fieldNode:e})=>this._analyzeFieldNode(e,{requestFieldPath:a.data.operation},s,t,a)))),s.fieldCount=ye._countFieldPathChecklist(s.fieldPathChecklist),s):s}_retrieveResponseDataForCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.data.requestID);return this._responseChunksAwaitingCaching.delete(t.data.requestID),(s=[...a??[],e]).reduce(((e,t,a)=>{const{_cacheMetadata:i,data:n,hasNext:r,headers:c,paths:h}=t;return i&&(e._cacheMetadata=e._cacheMetadata?{...e._cacheMetadata,...i}:i),e.data=j(e.data,n),0===a&&(e.headers=c),a===s.length-1&&(e.hasNext=r),h&&(e.paths??=[],e.paths.push(...h)),e}),{data:{}});var s}async _setCacheEntry(e,t,a,s,i,n){try{await(this._cache?.set(`${e}::${t}`,structuredClone(a),s))}catch{}}async _setEntityAndRequestFieldPathCacheEntries(e,t,a,s){const i=P(e.ast,s.data.operation)[0];if(!i)return;const n=_(i);n&&await Promise.all(n.map((({fieldNode:e})=>this._parseEntityAndRequestFieldPathCacheEntryData(e,{requestFieldPath:s.data.operation},t,a,s))))}async _setEntityCacheEntry({cacheability:e,fieldData:t,fieldTypeInfo:a},s,i){const n=`${a.isEntity?a.typeName:t.__typename}::${String(t[this._typeIDKey])}`,r=await this._checkCacheEntry(c,n,s,i);r&&(t=Z(r.entry,t,this._typeIDKey)),await this._setCacheEntry(c,n,t,{cacheHeaders:{cacheControl:e.printCacheControl()},tag:s.tag},s,i)}_setFieldCacheability(e,t,{cacheMetadata:a,data:s},i,n){const{requestFieldPath:r}=t,c=u(e,t,n),{requestFieldPath:h,responseDataPath:o}=c;if(!l(s))return;const d=S(s,o),y=n.fieldTypeMap.get(h);(l(d)||y?.hasDirectives)&&(this._setFieldTypeCacheDirective(a,{ancestorRequestFieldPath:r,requestFieldPath:h},n),l(d)&&w(e,d,n.fragmentDefinitions,((e,t,r,c,d)=>{this._setFieldCacheability(e,{index:d,requestFieldPath:h,responseDataPath:o},{cacheMetadata:a,data:s},i,n)})))}_setFieldTypeCacheDirective(e,{ancestorRequestFieldPath:t,requestFieldPath:a},{data:s,fieldTypeMap:i}){if(e.has(a))return;const n=i.get(a);if(n&&this._typeCacheDirectives[n.typeName]){const t=new T({cacheControl:this._typeCacheDirectives[n.typeName]});ye._setCacheMetadata(e,t,a,s.operation)}else this._cascadeCacheControl&&t&&ye._setCacheMetadata(e,e.get(t),a,s.operation)}_setPartialQueryResponse(e,t,a,s){this._partialQueryResponses.set(e,t)}async _setQueryResponseCacheEntry(e,{cacheMetadata:t,data:a},s,i){const r=M(t),c=ye._getOperationCacheControl(t,i.data.operation);await this._setCacheEntry(n,e,{cacheMetadata:r,data:a},{cacheHeaders:{cacheControl:c},tag:s.tag},s,i)}async _setRequestFieldPathCacheEntry(e,{cacheability:t,fieldData:a},s,i){const{hashedRequestFieldCacheKey:n,requestFieldCacheKey:c}=e,h=await this._checkCacheEntry(r,n,s,{...i,requestFieldCacheKey:c});h&&l(h.entry)&&l(a)&&(a=Z(h.entry,a,this._typeIDKey)),this._setCacheEntry(r,n,a,{cacheHeaders:{cacheControl:t.printCacheControl()},tag:s.tag},s,{...i,requestFieldCacheKey:c})}_setResponseChunksAwaitingCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.data.requestID);a?this._responseChunksAwaitingCaching.set(t.data.requestID,[...a,e]):this._responseChunksAwaitingCaching.set(t.data.requestID,[e])}}de([(e,a,s)=>{const i=s.value;i&&(s.value=async function(...e){return new Promise((a=>{(async()=>{const{data:s,debugManager:n,requestFieldCacheKey:r}=e[3];if(!n)return void a(await i.apply(this,e));const c=n.now(),h=await i.apply(this,e),o=n.now(),d=o-c;a(h),n.log(t,{data:{...s,cacheType:e[0],...r?{decryptedCacheKey:r}:void 0},stats:{duration:d,endTime:o,startTime:c}})})()}))})},le("design:type",Function),le("design:paramtypes",["undefined"==typeof CacheTypes?Object:CacheTypes,String,"undefined"==typeof RequestOptions?Object:RequestOptions,Object]),le("design:returntype",Promise)],ye.prototype,"_getCacheEntry",null),de([(t,a,s)=>{const i=s.value;i&&(s.value=async function(...t){return new Promise((a=>{(async()=>{const{data:s,debugManager:n,requestFieldCacheKey:r}=t[5];if(!n)return await i.apply(this,t),void a();const c=n.now();await i.apply(this,t);const h=n.now(),o=h-c;a(),n.log(e,{data:{...s,cacheHeaders:t[3].cacheHeaders,cacheType:t[0],...r?{decryptedCacheKey:r}:void 0},stats:{duration:o,endTime:h,startTime:c}})})()}))})},le("design:type",Function),le("design:paramtypes",["undefined"==typeof CacheTypes?Object:CacheTypes,String,Object,"undefined"==typeof CachemapOptions?Object:CachemapOptions,"undefined"==typeof RequestOptions?Object:RequestOptions,Object]),le("design:returntype",Promise)],ye.prototype,"_setCacheEntry",null),de([(e,t,s)=>{const i=s.value;i&&(s.value=function(...e){const{data:t,debugManager:s}=e[3];if(!s)return void i.apply(this,e);const n=s.now();i.apply(this,e);const r=s.now(),c=r-n;s.log(a,{data:t,stats:{duration:c,endTime:r,startTime:n}})})},le("design:type",Function),le("design:paramtypes",[String,"undefined"==typeof PartialQueryResponse?Object:PartialQueryResponse,"undefined"==typeof RequestOptions?Object:RequestOptions,"undefined"==typeof CacheManagerContext?Object:CacheManagerContext]),le("design:returntype",void 0)],ye.prototype,"_setPartialQueryResponse",null);export{ye as CacheManager};
|
|
1
|
+
import"core-js/modules/es.array.push.js";import{isKind as e,buildAncestorFieldNames as a,getAlias as t,buildFieldOperationPath as s,ArgsError as h,GroupedError as o,hashOperation as r}from"@graphql-box/helpers";import{Cacheability as c}from"cacheability";import{visit as n,Kind as i,print as p}from"graphql";import{set as l,has as u,get as f}from"lodash-es";class d{constructor(e){const a=[];if("cache"in e||a.push(new h('Expected "cache" to be in options.')),a.length>0)throw new o("Argument validation errors",a);"function"==typeof e.cache?e.cache().then(e=>{this._cache=e}).catch(e=>{throw e}):this._cache=e.cache,this._hashCacheKeys=e.hashCacheKeys??!1}async analyzeQuery(h,o){const{ast:c}=h,{allPathsResolved:l,cacheMetadata:u,data:f,resolvedPaths:d}=await this._retrieveResponseData(o.fieldPaths);if(0===d.length)return{operationData:h};if(l)return{responseData:{__cacheMetadata:u,data:f}};const w=((h,o)=>n(h,{enter:(h,r,c,n,p)=>{if(e(h,i.FIELD)){const e=a(p).join("."),r=t(h)??h.name.value,c=s(r,e);if(o.includes(c))return null}},leave:a=>{if((e(a,i.FIELD)||e(a,i.INLINE_FRAGMENT)||e(a,i.OPERATION_DEFINITION))&&0===a.selectionSet?.selections.length)return null}}))(c,d),_=p(w);return{operationData:{ast:w,hash:r(_),operation:_}}}get cache(){return this._cache}async cacheQuery(e,a){await this._storeResponseData(e,a.fieldPaths)}get hashCacheKeys(){return this._hashCacheKeys}async _retrieveResponseData(e){const a={},t={},s=[],h=Object.entries(e);for(const[e,{cachePaths:o,responsePaths:r}]of h)for(const[h,c]of o.entries()){const o=await(this._cache?.has(c,{hashKey:this._hashCacheKeys}));if(!(!!o&&o.checkTTL()))continue;const n=await(this._cache?.get(c,{hashKey:this._hashCacheKeys})),i=r[h];if(!i)throw new Error(`Your context has got corrupted. No matching response path was found for cache path "${c}", but it is part of a response path group for which data should exist.`);l(a,i,n),u(t,e)||(t[e]=o.metadata),s.push(e)}return{allPathsResolved:h.length===s.length,cacheMetadata:t,data:a,resolvedPaths:s}}async _storeResponseData({__cacheMetadata:e,data:a},t){const s=Object.entries(t),h=[];for(const[t,{cachePaths:o,responsePaths:r}]of s)for(const[s,n]of r.entries()){const r=f(a,n);if(void 0===r)throw new Error(`Response data value undefined for response path "${n}"`);const i=o[s];if(!i)throw new Error(`Your context has got corrupted. No matching cache path was found for response path "${n}", but it is part of a cache path group for which data should exist.`);const p=e?.[t];if(!p)throw new Error(`Your response data has got corrupted. No matching cache metadata was found for operation path "${t}".`);this._cache&&h.push(this._cache.set(i,r,{cacheHeaders:{cacheControl:new c({metadata:p}).printCacheControl()},hashKey:this._hashCacheKeys}))}await Promise.all(h)}}export{d as CacheManager};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|