@graphql-box/cache-manager 5.2.5 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/cjs/index.cjs +1 -1
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/esm/index.mjs +1 -1
  4. package/dist/esm/index.mjs.map +1 -1
  5. package/dist/production.analysis.txt +62 -33
  6. package/dist/types/cjs/helpers/createEntityDataKey.d.cts +4 -0
  7. package/dist/types/cjs/helpers/createEntityDataKey.d.cts.map +1 -0
  8. package/dist/types/cjs/helpers/filterOutPropsWithEntityArgsOrDirectives.d.cts +5 -0
  9. package/dist/types/cjs/helpers/filterOutPropsWithEntityArgsOrDirectives.d.cts.map +1 -0
  10. package/dist/types/cjs/helpers/filterOutPropsWithEntityOrArgs.d.cts +6 -0
  11. package/dist/types/cjs/helpers/filterOutPropsWithEntityOrArgs.d.cts.map +1 -0
  12. package/dist/types/cjs/helpers/isFieldEntity.d.cts +3 -0
  13. package/dist/types/cjs/helpers/isFieldEntity.d.cts.map +1 -0
  14. package/dist/types/cjs/main.d.cts +0 -2
  15. package/dist/types/cjs/main.d.cts.map +1 -1
  16. package/dist/types/cjs/types.d.cts +2 -2
  17. package/dist/types/cjs/types.d.cts.map +1 -1
  18. package/dist/types/esm/helpers/createEntityDataKey.d.ts +4 -0
  19. package/dist/types/esm/helpers/createEntityDataKey.d.ts.map +1 -0
  20. package/dist/types/esm/helpers/filterOutPropsWithEntityArgsOrDirectives.d.ts +5 -0
  21. package/dist/types/esm/helpers/filterOutPropsWithEntityArgsOrDirectives.d.ts.map +1 -0
  22. package/dist/types/esm/helpers/filterOutPropsWithEntityOrArgs.d.ts +6 -0
  23. package/dist/types/esm/helpers/filterOutPropsWithEntityOrArgs.d.ts.map +1 -0
  24. package/dist/types/esm/helpers/isFieldEntity.d.ts +3 -0
  25. package/dist/types/esm/helpers/isFieldEntity.d.ts.map +1 -0
  26. package/dist/types/esm/main.d.ts +0 -2
  27. package/dist/types/esm/main.d.ts.map +1 -1
  28. package/dist/types/esm/types.d.ts +2 -2
  29. package/dist/types/esm/types.d.ts.map +1 -1
  30. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  31. package/package.json +4 -4
  32. package/src/helpers/createEntityDataKey.ts +11 -0
  33. package/src/helpers/filterOutPropsWithEntityArgsOrDirectives.ts +45 -0
  34. package/src/helpers/filterOutPropsWithEntityOrArgs.ts +31 -0
  35. package/src/helpers/isFieldEntity.ts +24 -0
  36. package/src/main.ts +79 -113
  37. package/src/types.ts +2 -2
  38. package/dist/types/cjs/helpers/filterOutPropsWithArgsOrDirectives.d.cts +0 -6
  39. package/dist/types/cjs/helpers/filterOutPropsWithArgsOrDirectives.d.cts.map +0 -1
  40. package/dist/types/esm/helpers/filterOutPropsWithArgsOrDirectives.d.ts +0 -6
  41. package/dist/types/esm/helpers/filterOutPropsWithArgsOrDirectives.d.ts.map +0 -1
  42. package/src/helpers/filterOutPropsWithArgsOrDirectives.ts +0 -29
@@ -1,2 +1,2 @@
1
- import e from"@babel/runtime/helpers/defineProperty";import t from"@babel/runtime/helpers/applyDecoratedDescriptor";import"core-js/modules/es.array.push.js";import{CACHE_ENTRY_ADDED as a,CACHE_ENTRY_QUERIED as s,PARTIAL_QUERY_COMPILED as i,TYPE_NAME_KEY as n,DEFAULT_TYPE_ID_KEY as r,QUERY_RESPONSES as c,DATA_ENTITIES as h,REQUEST_FIELD_PATHS as o}from"@graphql-box/core";import{isPlainObject as d,isArray as l,mergeObjects as y,isObjectLike as p,resolveFragments as u,getName as f,buildFieldKeysAndPaths as _,deleteFragmentSpreads as m,getChildFields as g,deleteChildFields as C,getInlineFragments as D,deleteInlineFragments as F,hasChildFields as P,deleteFragmentDefinitions as q,getOperationDefinitions as E,ArgsError as R,GroupedError as w,getFragmentDefinitions as N,hashRequest as M,rehydrateCacheMetadata as b,iterateChildFields as v,dehydrateCacheMetadata as K}from"@graphql-box/helpers";import{Cacheability as I}from"cacheability";import{Kind as k,print as T,OperationTypeNode as A}from"graphql";import{isNumber as x,isString as O,isEmpty as Q,keys as $,merge as j,set as z,cloneDeep as S,get as H,isUndefined as U,assign as G,isEqual as L,unset as V}from"lodash-es";const Y="noCache",B=(e,t)=>l(e)?e.reduce(((e,a)=>!!e&&B(a,t)),!0):!!d(e)&&J(e,t),J=(e,t)=>{const a=d(e)?Object.keys(e):[...e.keys()];return!(1!==a.length||!d(e)||!e[t])||a.reduce(((a,s)=>!!a&&(x(s)&&l(e)||O(s)&&d(e)?B(e[s],t):a)),!0)},W=(e,t,a)=>y(e,t,((e,t)=>d(t)&&t[a]?t[a]:void 0)),X=(e,t,a)=>!e&&t?t:p(e)&&p(t)?W(e,t,a):e,Z=(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))}},ee=(e,t,a,s,i)=>{const{fragmentDefinitions:r,typeIDKey:c}=i,h=g(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:p,fragmentName:u,typeName:m}=l;p===k.FRAGMENT_SPREAD&&u&&!o[u]&&(o[u]={hasData:0,total:r?.[u]?g(r[u],{fragmentDefinitions:r})?.length??0:0});const D=f(y);if(D===c||D===n)continue;const{requestFieldPath:F}=_(y,{requestFieldPath:s},i),{hasData:q,typeUnused:E}=Z(t.get(F),m);if(q||E)if(p===k.FRAGMENT_SPREAD&&u){const e=o[u];e&&(e.hasData+=1)}else P(y,{fragmentDefinitions:r})?ee(y,t,a,F,i)&&C(e,y):C(e,y)}return((e,t,a,s)=>{if(!Q(t))for(const i of Object.keys(t)){const n=a[i];if(!n)continue;n.paths.push(s);const{hasData:r,total:c}=t[i];r===c&&(m(e,i),n.deleted+=1)}})(e,o,a,s),((e,{fragmentDefinitions:t,typeIDKey:a})=>{const s=D(e);let i=!1;for(const n of s){const s=g(n,{fragmentDefinitions:t});if(!s||0===s.length){F(e,n),i=!0;continue}const[r]=s;if(r){const{fieldNode:t}=r;f(t)===a&&(F(e,n),i=!0)}}})(e,i),((e,{fragmentDefinitions:t,typeIDKey:a})=>{const s=g(e,{fragmentDefinitions:t});if(!s||s.length>3)return!1;const i=s.map((({fieldNode:e})=>f(e)));if(2===i.length&&i.every((e=>e===a||e===n)))return C(e,s.map((({fieldNode:e})=>e))),!0;if(1===i.length&&i[0]===a||i[0]===n){const[t]=s;if(t){const{fieldNode:a}=t;return C(e,a),!0}}})(e,i),!P(e,{fragmentDefinitions:r})},te=(e,{fieldPathChecklist:t},a)=>{const{ast:s}=e,i=E(s,a.operation)[0];if(!i)return s;const{fragmentDefinitions:n,operation:r}=a,c=g(i,{fragmentDefinitions:n});if(!c)return s;const h=(({request:e},{fragmentDefinitions:t})=>$(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:n}=_(s,{requestFieldPath:r},a);ee(s,t,h,n,a)&&C(i,s)}return a.queryFiltered=!0,((e,t,a,s)=>{const i=$(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&&ee(i,t,a,r,s)}const r=$(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:q(e,{include:r})})(s,t,h,a)},ae=(e,t)=>l(e)&&x(t)||d(e)&&O(t)?e[t]:void 0,se=e=>!!p(e)&&(n in e&&O(e[n]));var ie,ne,re,ce;let he=(ie=(e,t,a)=>{const i=a.value;i&&(a.value=async function(...e){return new Promise((t=>{(async()=>{const{debugManager:a,requestFieldCacheKey:n,...r}=e[3];if(!a)return void t(await i.apply(this,e));const c=a.now(),h=await i.apply(this,e),o=a.now(),d=o-c;t(h);const l={cacheType:e[0],context:r,options:e[2],requestHash:e[1],result:h,stats:{duration:d,endTime:o,startTime:c},...n?{decryptedCacheKey:n}:{}};a.log(s,l)})()}))})},ne=(e,t,s)=>{const i=s.value;i&&(s.value=async function(...e){return new Promise((t=>{(async()=>{const{debugManager:s,requestFieldCacheKey:n,...r}=e[5];if(!s)return await i.apply(this,e),void t();const c=s.now();await i.apply(this,e);const h=s.now(),o=h-c;t();const d={cacheType:e[0],cachemapOptions:e[3],context:r,options:e[4],requestHash:e[1],stats:{duration:o,endTime:h,startTime:c},value:e[2],...n?{decryptedCacheKey:n}:{}};s.log(a,d)})()}))})},re=(e,t,a)=>{const s=a.value;s&&(a.value=function(...e){const{debugManager:t,...a}=e[3];if(!t)return void s.apply(this,e);const n=t.now();s.apply(this,e);const r=t.now(),c=r-n;t.log(i,{context:a,options:e[2],requestHash:e[0],result:e[1],stats:{duration:c,endTime:r,startTime:n}})})},ce=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,t){const a=ae(e,t);return p(a)?S(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!H(e,["metadata","cacheControl",Y],!1)&&e.checkTTL()}static _mergeResponseCacheMetadata(e,t){return t?new Map([...t.cacheMetadata,...e]):e}static _setCachedData(e,{data:t},a){const s=t=>{(l(e)&&x(a)||d(e))&&(e[a]=t)};p(t)||U(t)?l(t)?s([]):d(t)&&s({}):s(t)}static _setCachedResponseData(e,{cacheMetadata:a,data:s,fieldPathChecklist:i},{propNameOrIndex:n,requestFieldPath:r},c,h,{operation:o}){t._setCacheMetadata(a,e.cacheability,r,o),t._setFieldPathChecklist(i,e,r,c),t._setCachedData(s,e,n)}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(U(i)||n===k.FRAGMENT_SPREAD){if(e.has(a))return;return void e.set(a,[{fragmentKind:n,fragmentName:r,hasData:!U(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:!U(t),typeName:s}])}constructor(t){e(this,"_cache",void 0),e(this,"_cascadeCacheControl",void 0),e(this,"_fallbackOperationCacheability",void 0),e(this,"_partialQueryResponses",new Map),e(this,"_responseChunksAwaitingCaching",new Map),e(this,"_typeCacheDirectives",void 0),e(this,"_typeIDKey",void 0);const a=[];if("cache"in t||a.push(new R("@graphql-box/cache-manager expected cache to be in options.")),t.typeCacheDirectives&&!d(t.typeCacheDirectives)){const e="@graphql-box/cache-manager expected options.typeCacheDirectives to be a plain object.";a.push(new R(e))}if(a.length>0)throw new w("@graphql-box/cache-manager argument validation errors.",a);this._cache=t.cache,this._cascadeCacheControl=t.cascadeCacheControl??!1,this._fallbackOperationCacheability=t.fallbackOperationCacheability??Y,this._typeCacheDirectives=t.typeCacheDirectives??{},this._typeIDKey=t.typeIDKey??r}async analyzeQuery(e,t,a){const{ast:s,hash:i}=e,n={...a,fragmentDefinitions:N(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)=>J(e,t))(h,this._typeIDKey))return{updated:e};if(!o.missing){const e=this._setQueryResponseCacheEntry(i,{cacheMetadata:c,data:h},t,n);return t.awaitDataCaching&&await e,{response:{cacheMetadata:c,data:h}}}const d=te(e,r,n),l=T(d),{fragmentDefinitions:y,typeIDKey:p,...u}=n;return G(a,{...u,filteredRequest:l}),this._setPartialQueryResponse(i,{cacheMetadata:c,data:h},t,a),{updated:{ast:d,hash:M(l),request:l}}}get cache(){return this._cache}async cacheQuery(e,t,a,s,i){const n={...i,fragmentDefinitions:N((t??e).ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,t,a,s,n)}async cacheResponse(e,t,a,s){const i={...s,fragmentDefinitions:N(e.ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,void 0,t,a,i)}async checkCacheEntry(e,t,a,s){return this._checkCacheEntry(e,t,a,s)}async checkQueryResponseCacheEntry(e,t,a){const s=await this._checkCacheEntry(c,e,t,a);if(!s)return!1;const{cacheMetadata:i,data:n}=s.entry;return{cacheMetadata:b(i),data:n}}deletePartialQueryResponse(e){this._partialQueryResponses.delete(e)}async setQueryResponseCacheEntry(e,t,a,s){return this._setQueryResponseCacheEntry(e.hash,t,a,s)}async _analyzeFieldNode(e,t,a,s,i){await(P(e,{fragmentDefinitions:i.fragmentDefinitions})?this._analyzeParentFieldNode(e,t,a,s,i):this._analyzeLeafFieldNode(e,t,a,s,i))}async _analyzeLeafFieldNode(e,a,s,i,n){const r=_(e,a,n),{hashedRequestFieldCacheKey:c,propNameOrIndex:h,requestFieldCacheKey:o,requestFieldPath:d}=r,l=n.fieldTypeMap.get(d),{entityData:y,fragmentKind:p,fragmentName:u,requestFieldPathData:f,typeName:m}=a,g={dataTypename:se(y)?y.__typename:se(f)?f.__typename:void 0,fieldTypename:m,fragmentKind:p,fragmentName:u};if(t._isNodeRequestFieldPath(l)){const{cacheability:e,entry:a}=await this._retrieveCachedRequestFieldPathData(c,o,i,n);t._setCachedResponseData({cacheability:e,data:a},s,r,g,i,n)}else{const e=t._getFieldDataFromAncestor(y,h)??t._getFieldDataFromAncestor(f,h);t._setFieldPathChecklist(s.fieldPathChecklist,{data:e},d,g),t._setCachedData(s.data,{data:e},h)}}async _analyzeParentFieldNode(e,a,s,i,r){const c=_(e,a,r),{propNameOrIndex:h,requestFieldCacheKey:o,requestFieldPath:d}=c,l=r.fieldTypeMap.get(d),{cacheability:y,data:u,entityData:f,requestFieldPathData:m}=await this._retrieveCachedParentNodeData(a,c,l,i,r),{fragmentKind:g,fragmentName:C,typeName:D}=a;if(t._setCachedResponseData({cacheability:y,data:u},s,c,{dataTypename:H(u,n),fieldTypename:D,fragmentKind:g,fragmentName:C},i,r),!p(u))return;const F=[];v(e,u,r.fragmentDefinitions,((e,t,a,n,c)=>{F.push(this._analyzeFieldNode(e,{cacheability:y,entityData:f,fragmentKind:a,fragmentName:n,index:c,requestFieldCacheKey:o,requestFieldPath:d,requestFieldPathData:m,typeName:t},{...s,data:ae(s.data,h)},i,r))})),await Promise.all(F)}_buildCacheMetadata({ast:e},{data:t,...a},s,i){const n=this._createCacheMetadata({data:t,...a},i),r=E(e,i.operation)[0];if(!r)return n;const c=g(r);if(!c)return n;for(const{fieldNode:e}of c)this._setFieldCacheability(e,{requestFieldPath:i.operation},{cacheMetadata:n,data:t},s,i);return n}async _cacheResponse(e,a,s,i,n){const r=((e,t)=>{if(!t.normalizePatchResponseData)return e;const{data:a,paths:s,...i}=e;return s?.length&&O(s[0])?{...i,data:z({},s[0],a),paths:s}:e})(s,n);let c=r;((e,t)=>t.hasDeferOrStream&&e.hasNext)(s,n)&&(this._setResponseChunksAwaitingCaching(r,n),c=void 0),((e,t)=>t.hasDeferOrStream&&!e.hasNext&&e.paths)(s,n)&&(c=this._retrieveResponseDataForCaching(r,n));const h=[];if(c){const{data:s}=c,o=this._buildCacheMetadata(e,c,i,n);let d,l;if(h.push(this._setEntityAndRequestFieldPathCacheEntries(e,{cacheMetadata:o,entityData:S(s),requestFieldPathData:S(s)},i,n)),n.operation===A.QUERY){let r;n.queryFiltered&&a&&(h.push(this._setQueryResponseCacheEntry(a.hash,{cacheMetadata:o,data:s},i,n)),r=this._getPartialQueryResponse(e.hash)),d=t._mergeResponseCacheMetadata(o,r),l=this._mergeResponseData(s,r),h.push(this._setQueryResponseCacheEntry(e.hash,{cacheMetadata:d,data:l},i,n))}if(i.awaitDataCaching&&await Promise.all(h),((e,t)=>!t.hasDeferOrStream&&!e.hasNext&&!e.paths)(r,n)&&d&&l)return{cacheMetadata:d,data:l}}const{data:o,hasNext:d,paths:l}=r;return{cacheMetadata:this._buildCacheMetadata(e,r,i,n),data:o,hasNext:d,paths:l}}async _checkCacheEntry(e,a,s,i){try{const n=await this._hasCacheEntry(e,a);if(!n||!t._isValid(n))return!1;const r=await this._getCacheEntry(e,a,s,i);return!U(r)&&{cacheability:n,entry:r}}catch{return!1}}_createCacheMetadata({_cacheMetadata:e,headers:t},{operation:a}){const s=new Map,i=(({_cacheMetadata:e,fallback:t,headers:a})=>{if(e&&!Q(e)){const[t,...a]=Object.values(e);return new I({metadata:a.reduce(((e,t)=>e?t.ttl<e.ttl?t:e:t),t)})}return a?.has("cache-control")?new I({headers:a}):new I({cacheControl:t})})({_cacheMetadata:e,fallback:this._fallbackOperationCacheability,headers:t});return s.set(a,i),e&&b(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}`)}catch{return!1}}_isFieldEntity(e,{isEntity:t,possibleTypes:a}){return!(!d(e)||!(this._typeIDKey in e))&&(!!t||0!==a.length&&a.some((t=>t.typeName===e.__typename)))}_mergeResponseData(e,t){return t?W(t.data,e,this._typeIDKey):e}async _parseEntityAndRequestFieldPathCacheEntryData(e,t,{cacheMetadata:a,entityData:s,requestFieldPathData:i},n,r){const c=_(e,t,r),{requestFieldCacheKey:h,requestFieldPath:o,responseDataPath:d}=c,l=H(i,d),y=r.fieldTypeMap.get(o);if(p(l)||y?.hasDirectives){if(p(l)){const t=[];v(e,l,r.fragmentDefinitions,((e,c,l,y,p)=>{t.push(this._parseEntityAndRequestFieldPathCacheEntryData(e,{index:p,requestFieldCacheKey:h,requestFieldPath:o,responseDataPath:d},{cacheMetadata:a,entityData:s,requestFieldPathData:i},n,r))})),await Promise.all(t)}await this._setEntityAndRequestFieldPathCacheEntry(e,c,{cacheMetadata:a,entityData:s,requestFieldPathData:i},n,r)}}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(h,`${t}::${e}`,s,i))))).filter((e=>!!e));let c;return 1===r.length?c=r[0]:r.length>1&&(r.sort((({cacheability:e},{cacheability:t})=>e.metadata.ttl-t.metadata.ttl)),c={cacheability:r[0].cacheability,entry:r.reduce(((e,{entry:t})=>W(e,t,this._typeIDKey)),{})}),c??{}}async _retrieveCachedParentNodeData({entityData:e,requestFieldPathData:a},{hashedRequestFieldCacheKey:s,propNameOrIndex:i,requestFieldCacheKey:n},r,c,h){let o,l=t._getFieldDataFromAncestor(e,i),y=t._getFieldDataFromAncestor(a,i);if(t._isNodeRequestFieldPath(r)){const{cacheability:e,entry:t}=await this._retrieveCachedRequestFieldPathData(s,n,c,h);y=X(y,t,this._typeIDKey),e&&(o=e)}const p=((e,{typeIDValue:t},a)=>t||(d(e)?e[a]:void 0))(y,r,this._typeIDKey);if(t._isNodeEntity(r)&&p){const{cacheability:e,entry:t}=await this._retrieveCachedEntityData(p,r,c,h);l=X(l,t,this._typeIDKey),e&&(!o||e.metadata.ttl>o.metadata.ttl)&&(o=e)}return{cacheability:o,data:L(l,y)?l:X(l,y,this._typeIDKey),entityData:l,requestFieldPathData:y}}async _retrieveCachedRequestFieldPathData(e,t,a,s){return await this._checkCacheEntry(o,e,a,{...s,requestFieldCacheKey:t})||{}}async _retrieveCachedResponseData({ast:e},a,s){const i={cacheMetadata:new Map,data:{},fieldCount:{missing:0,total:0},fieldPathChecklist:new Map},n=E(e,s.operation)[0];if(!n)return i;const r=g(n);return r?(await Promise.all(r.map((({fieldNode:e})=>this._analyzeFieldNode(e,{requestFieldPath:s.operation},i,a,s)))),i.fieldCount=t._countFieldPathChecklist(i.fieldPathChecklist),i):i}_retrieveResponseDataForCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.requestID);return this._responseChunksAwaitingCaching.delete(t.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=[]),e.paths.push(...h)),e}),{data:{}});var s}async _setCacheEntry(e,t,a,s,i,n){try{await this._cache.set(`${e}::${t}`,S(a),s)}catch{}}async _setEntityAndRequestFieldPathCacheEntries(e,t,a,s){const i=E(e.ast,s.operation)[0];if(!i)return;const n=g(i);n&&await Promise.all(n.map((({fieldNode:e})=>this._parseEntityAndRequestFieldPathCacheEntryData(e,{requestFieldPath:s.operation},t,a,s))))}async _setEntityAndRequestFieldPathCacheEntry(e,t,{cacheMetadata:a,entityData:s,requestFieldPathData:i},n,r){const{requestFieldPath:c,responseDataPath:h}=t,o=H(s,h),d=r.fieldTypeMap.get(c),l=a.get(c);if(U(o)||!d||!l)return;const y=[];y.push(this._setRequestFieldPathCacheEntry(e,t,{cacheability:l,data:i,fieldTypeInfo:d},n,r));const p=this._isFieldEntity(o,d);!p&&d.hasArguments&&V(s,h),p&&y.push(this._setEntityCacheEntry(t,{cacheability:l,data:s,fieldTypeInfo:d},n,r)),await Promise.all(y)}async _setEntityCacheEntry({responseDataPath:e},{cacheability:t,data:a,fieldTypeInfo:s},i,n){let r=H(a,e);const c=`${s.isEntity?s.typeName:r.__typename}::${String(r[this._typeIDKey])}`,o=await this._checkCacheEntry(h,c,i,n);o&&(r=W(o.entry,r,this._typeIDKey)),await this._setCacheEntry(h,c,r,{cacheHeaders:{cacheControl:t.printCacheControl()},tag:i.tag},i,n),z(a,e,{__cacheKey:`${h}::${c}`})}_setFieldCacheability(e,t,{cacheMetadata:a,data:s},i,n){const{requestFieldPath:r}=t,c=_(e,t,n),{requestFieldPath:h,responseDataPath:o}=c;if(!p(s))return;const d=H(s,o),l=n.fieldTypeMap.get(h);(p(d)||l?.hasDirectives)&&(this._setFieldTypeCacheDirective(a,{ancestorRequestFieldPath:r,requestFieldPath:h},n),p(d)&&v(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:a,requestFieldPath:s},{fieldTypeMap:i,operation:n}){if(e.has(s))return;const r=i.get(s);if(r&&this._typeCacheDirectives[r.typeName]){const a=new I({cacheControl:this._typeCacheDirectives[r.typeName]});t._setCacheMetadata(e,a,s,n)}else this._cascadeCacheControl&&a&&t._setCacheMetadata(e,e.get(a),s,n)}_setPartialQueryResponse(e,t,a,s){this._partialQueryResponses.set(e,t)}async _setQueryResponseCacheEntry(e,{cacheMetadata:a,data:s},i,n){const r=K(a),h=t._getOperationCacheControl(a,n.operation);await this._setCacheEntry(c,e,{cacheMetadata:r,data:s},{cacheHeaders:{cacheControl:h},tag:i.tag},i,n)}async _setRequestFieldPathCacheEntry(e,t,{cacheability:a,data:s,fieldTypeInfo:i},n,r){const{hashedRequestFieldCacheKey:c,requestFieldCacheKey:h,responseDataPath:l}=t;let y=H(s,l);const m=this._isFieldEntity(y,i),g=i.hasArguments||i.hasDirectives;if(r.operation===A.QUERY&&(m||g)){d(y)&&e.selectionSet?.selections&&(y=((e,t,a,s)=>{const i=u(t,s.fragmentDefinitions);return $(e).reduce(((t,n)=>{const r=i.find((({fieldNode:e})=>f(e)===n));if(r){const{requestFieldPath:i}=_(r.fieldNode,a,s),c=s.fieldTypeMap.get(i);c?.hasArguments||c?.hasDirectives||(t[n]=e[n])}return t}),{})})(y,e.selectionSet.selections,t,r));const i=await this._checkCacheEntry(o,c,n,{...r,requestFieldCacheKey:h});i&&p(i.entry)&&p(y)&&(y=W(i.entry,y,this._typeIDKey)),await this._setCacheEntry(o,c,y,{cacheHeaders:{cacheControl:a.printCacheControl()},tag:n.tag},n,{...r,requestFieldCacheKey:h}),P(e,{fragmentDefinitions:r.fragmentDefinitions})&&(m?z(s,l,{__cacheKey:`${o}::${c}`}):V(s,l))}}_setResponseChunksAwaitingCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.requestID);a?this._responseChunksAwaitingCaching.set(t.requestID,[...a,e]):this._responseChunksAwaitingCaching.set(t.requestID,[e])}},t(ce.prototype,"_getCacheEntry",[ie],Object.getOwnPropertyDescriptor(ce.prototype,"_getCacheEntry"),ce.prototype),t(ce.prototype,"_setCacheEntry",[ne],Object.getOwnPropertyDescriptor(ce.prototype,"_setCacheEntry"),ce.prototype),t(ce.prototype,"_setPartialQueryResponse",[re],Object.getOwnPropertyDescriptor(ce.prototype,"_setPartialQueryResponse"),ce.prototype),ce);export{he as CacheManager};
1
+ import e from"@babel/runtime/helpers/defineProperty";import t from"@babel/runtime/helpers/applyDecoratedDescriptor";import"core-js/modules/web.structured-clone.js";import"core-js/modules/es.array.push.js";import{CACHE_ENTRY_ADDED as a,CACHE_ENTRY_QUERIED as s,PARTIAL_QUERY_COMPILED as i,TYPE_NAME_KEY as n,DEFAULT_TYPE_ID_KEY as r,QUERY_RESPONSES as c,REQUEST_FIELD_PATHS as h,DATA_ENTITIES as o}from"@graphql-box/core";import{isPlainObject as d,isArray as l,mergeObjects as y,isObjectLike as p,resolveFragments as u,getName as f,buildFieldKeysAndPaths as _,deleteFragmentSpreads as m,getChildFields as C,deleteChildFields as g,getInlineFragments as D,deleteInlineFragments as F,hasChildFields as P,deleteFragmentDefinitions as q,getOperationDefinitions as N,ArgsError as w,GroupedError as R,getFragmentDefinitions as E,hashRequest as b,rehydrateCacheMetadata as M,iterateChildFields as K,dehydrateCacheMetadata as v}from"@graphql-box/helpers";import{Cacheability as I}from"cacheability";import{Kind as k,print as T,OperationTypeNode as A}from"graphql";import{isNumber as x,isString as O,isEmpty as Q,keys as $,merge as j,set as S,get as z,isUndefined as H,assign as U,unset as G,isEqual as L}from"lodash-es";const V="noCache",Y=(e,t)=>l(e)?e.reduce(((e,a)=>!!e&&Y(a,t)),!0):!!d(e)&&B(e,t),B=(e,t)=>{const a=d(e)?Object.keys(e):[...e.keys()];return!(1!==a.length||!d(e)||!e[t])||a.reduce(((a,s)=>!!a&&(x(s)&&l(e)||O(s)&&d(e)?Y(e[s],t):a)),!0)},J=(e,t,a)=>y(e,t,((e,t)=>d(t)&&t[a]?t[a]:void 0)),W=(e,t,a)=>!e&&t?t:p(e)&&p(t)?J(e,t,a):e,X=(e,t,a)=>`${t.isEntity?t.typeName:e.__typename}::${String(e[a.typeIDKey])}`,Z=(e,t,a)=>{if(!d(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))},ee=(e,t,a,s)=>{if(!d(e))return e;const i=u(t.selectionSet?.selections,s.fragmentDefinitions);return $(e).reduce(((t,n)=>{const r=i.find((({fieldNode:e})=>f(e)===n));if(r){const t=_(r.fieldNode,a,s),i=s.fieldTypeMap.get(t.requestFieldPath);(Z(e[n],i,s.typeIDKey)||i?.hasArguments||i?.hasDirectives)&&delete e[n]}return t}),e)},te=(e,t,a,s)=>{const i=u(t.selectionSet?.selections,s.fragmentDefinitions);return $(e).reduce(((t,n)=>{const r=i.find((({fieldNode:e})=>f(e)===n));if(r){const{requestFieldPath:t}=_(r.fieldNode,a,s),i=s.fieldTypeMap.get(t);(Z(e[n],i,s.typeIDKey)||i?.hasArguments)&&delete e[n]}return t}),e)},ae=(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))}},se=(e,t,a,s,i)=>{const{fragmentDefinitions:r,typeIDKey:c}=i,h=C(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:p,fragmentName:u,typeName:m}=l;p===k.FRAGMENT_SPREAD&&u&&!o[u]&&(o[u]={hasData:0,total:r?.[u]?C(r[u],{fragmentDefinitions:r})?.length??0:0});const D=f(y);if(D===c||D===n)continue;const{requestFieldPath:F}=_(y,{requestFieldPath:s},i),{hasData:q,typeUnused:N}=ae(t.get(F),m);if(q||N)if(p===k.FRAGMENT_SPREAD&&u){const e=o[u];e&&(e.hasData+=1)}else P(y,{fragmentDefinitions:r})?se(y,t,a,F,i)&&g(e,y):g(e,y)}return((e,t,a,s)=>{if(!Q(t))for(const i of Object.keys(t)){const n=a[i];if(!n)continue;n.paths.push(s);const{hasData:r,total:c}=t[i];r===c&&(m(e,i),n.deleted+=1)}})(e,o,a,s),((e,{fragmentDefinitions:t,typeIDKey:a})=>{const s=D(e);let i=!1;for(const n of s){const s=C(n,{fragmentDefinitions:t});if(!s||0===s.length){F(e,n),i=!0;continue}const[r]=s;if(r){const{fieldNode:t}=r;f(t)===a&&(F(e,n),i=!0)}}})(e,i),((e,{fragmentDefinitions:t,typeIDKey:a})=>{const s=C(e,{fragmentDefinitions:t});if(!s||s.length>3)return!1;const i=s.map((({fieldNode:e})=>f(e)));if(2===i.length&&i.every((e=>e===a||e===n)))return g(e,s.map((({fieldNode:e})=>e))),!0;if(1===i.length&&i[0]===a||i[0]===n){const[t]=s;if(t){const{fieldNode:a}=t;return g(e,a),!0}}})(e,i),!P(e,{fragmentDefinitions:r})},ie=(e,{fieldPathChecklist:t},a)=>{const{ast:s}=e,i=N(s,a.operation)[0];if(!i)return s;const{fragmentDefinitions:n,operation:r}=a,c=C(i,{fragmentDefinitions:n});if(!c)return s;const h=(({request:e},{fragmentDefinitions:t})=>$(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:n}=_(s,{requestFieldPath:r},a);se(s,t,h,n,a)&&g(i,s)}return a.queryFiltered=!0,((e,t,a,s)=>{const i=$(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&&se(i,t,a,r,s)}const r=$(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:q(e,{include:r})})(s,t,h,a)},ne=(e,t)=>l(e)&&x(t)||d(e)&&O(t)?e[t]:void 0,re=e=>!!p(e)&&(n in e&&O(e[n]));var ce,he,oe,de;let le=(ce=(e,t,a)=>{const i=a.value;i&&(a.value=async function(...e){return new Promise((t=>{(async()=>{const{debugManager:a,requestFieldCacheKey:n,...r}=e[3];if(!a)return void t(await i.apply(this,e));const c=a.now(),h=await i.apply(this,e),o=a.now(),d=o-c;t(h);const l={cacheType:e[0],context:r,options:e[2],requestHash:e[1],result:h,stats:{duration:d,endTime:o,startTime:c},...n?{decryptedCacheKey:n}:{}};a.log(s,l)})()}))})},he=(e,t,s)=>{const i=s.value;i&&(s.value=async function(...e){return new Promise((t=>{(async()=>{const{debugManager:s,requestFieldCacheKey:n,...r}=e[5];if(!s)return await i.apply(this,e),void t();const c=s.now();await i.apply(this,e);const h=s.now(),o=h-c;t();const d={cacheType:e[0],cachemapOptions:e[3],context:r,options:e[4],requestHash:e[1],stats:{duration:o,endTime:h,startTime:c},value:e[2],...n?{decryptedCacheKey:n}:{}};s.log(a,d)})()}))})},oe=(e,t,a)=>{const s=a.value;s&&(a.value=function(...e){const{debugManager:t,...a}=e[3];if(!t)return void s.apply(this,e);const n=t.now();s.apply(this,e);const r=t.now(),c=r-n;t.log(i,{context:a,options:e[2],requestHash:e[0],result:e[1],stats:{duration:c,endTime:r,startTime:n}})})},de=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,t){const a=ne(e,t);return p(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!z(e,["metadata","cacheControl",V],!1)&&e.checkTTL()}static _mergeResponseCacheMetadata(e,t){return t?new Map([...t.cacheMetadata,...e]):e}static _setCachedData(e,{data:t},a){const s=t=>{(l(e)&&x(a)||d(e))&&(e[a]=t)};p(t)||H(t)?l(t)?s([]):d(t)&&s({}):s(t)}static _setCachedResponseData(e,{cacheMetadata:a,data:s,fieldPathChecklist:i},{propNameOrIndex:n,requestFieldPath:r},c,h,{operation:o}){t._setCacheMetadata(a,e.cacheability,r,o),t._setFieldPathChecklist(i,e,r,c),t._setCachedData(s,e,n)}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(H(i)||n===k.FRAGMENT_SPREAD){if(e.has(a))return;return void e.set(a,[{fragmentKind:n,fragmentName:r,hasData:!H(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:!H(t),typeName:s}])}constructor(t){e(this,"_cache",void 0),e(this,"_cascadeCacheControl",void 0),e(this,"_fallbackOperationCacheability",void 0),e(this,"_partialQueryResponses",new Map),e(this,"_responseChunksAwaitingCaching",new Map),e(this,"_typeCacheDirectives",void 0),e(this,"_typeIDKey",void 0);const a=[];if("cache"in t||a.push(new w("@graphql-box/cache-manager expected cache to be in options.")),t.typeCacheDirectives&&!d(t.typeCacheDirectives)){const e="@graphql-box/cache-manager expected options.typeCacheDirectives to be a plain object.";a.push(new w(e))}if(a.length>0)throw new R("@graphql-box/cache-manager argument validation errors.",a);this._cache=t.cache,this._cascadeCacheControl=t.cascadeCacheControl??!1,this._fallbackOperationCacheability=t.fallbackOperationCacheability??V,this._typeCacheDirectives=t.typeCacheDirectives??{},this._typeIDKey=t.typeIDKey??r}async analyzeQuery(e,t,a){const{ast:s,hash:i}=e,n={...a,fragmentDefinitions:E(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)=>B(e,t))(h,this._typeIDKey))return{updated:e};if(!o.missing){const e=this._setQueryResponseCacheEntry(i,{cacheMetadata:c,data:h},t,n);return t.awaitDataCaching&&await e,{response:{cacheMetadata:c,data:h}}}const d=ie(e,r,n),l=T(d),{fragmentDefinitions:y,typeIDKey:p,...u}=n;return U(a,{...u,filteredRequest:l}),this._setPartialQueryResponse(i,{cacheMetadata:c,data:h},t,a),{updated:{ast:d,hash:b(l),request:l}}}get cache(){return this._cache}async cacheQuery(e,t,a,s,i){const n={...i,fragmentDefinitions:E((t??e).ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,t,a,s,n)}async cacheResponse(e,t,a,s){const i={...s,fragmentDefinitions:E(e.ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,void 0,t,a,i)}async checkCacheEntry(e,t,a,s){return this._checkCacheEntry(e,t,a,s)}async checkQueryResponseCacheEntry(e,t,a){const s=await this._checkCacheEntry(c,e,t,a);if(!s)return!1;const{cacheMetadata:i,data:n}=s.entry;return{cacheMetadata:M(i),data:n}}deletePartialQueryResponse(e){this._partialQueryResponses.delete(e)}async setQueryResponseCacheEntry(e,t,a,s){return this._setQueryResponseCacheEntry(e.hash,t,a,s)}async _analyzeFieldNode(e,t,a,s,i){await(P(e,{fragmentDefinitions:i.fragmentDefinitions})?this._analyzeParentFieldNode(e,t,a,s,i):this._analyzeLeafFieldNode(e,t,a,s,i))}async _analyzeLeafFieldNode(e,a,s,i,n){const r=_(e,a,n),{hashedRequestFieldCacheKey:c,propNameOrIndex:h,requestFieldCacheKey:o,requestFieldPath:d}=r,l=n.fieldTypeMap.get(d),{entityData:y,fragmentKind:p,fragmentName:u,requestFieldPathData:f,typeName:m}=a,C={dataTypename:re(y)?y.__typename:re(f)?f.__typename:void 0,fieldTypename:m,fragmentKind:p,fragmentName:u};if(t._isNodeRequestFieldPath(l)){const{cacheability:e,entry:a}=await this._retrieveCachedRequestFieldPathData(c,o,i,n);t._setCachedResponseData({cacheability:e,data:a},s,r,C,i,n)}else{const e=t._getFieldDataFromAncestor(y,h)??t._getFieldDataFromAncestor(f,h);t._setFieldPathChecklist(s.fieldPathChecklist,{data:e},d,C),t._setCachedData(s.data,{data:e},h)}}async _analyzeParentFieldNode(e,a,s,i,r){const c=_(e,a,r),{propNameOrIndex:h,requestFieldCacheKey:o,requestFieldPath:d}=c,l=r.fieldTypeMap.get(d),{cacheability:y,data:u,entityData:f,requestFieldPathData:m}=await this._retrieveCachedParentNodeData(a,c,l,i,r),{fragmentKind:C,fragmentName:g,typeName:D}=a;if(t._setCachedResponseData({cacheability:y,data:u},s,c,{dataTypename:z(u,n),fieldTypename:D,fragmentKind:C,fragmentName:g},i,r),!p(u))return;const F=[];K(e,u,r.fragmentDefinitions,((e,t,a,n,c)=>{F.push(this._analyzeFieldNode(e,{cacheability:y,entityData:f,fragmentKind:a,fragmentName:n,index:c,requestFieldCacheKey:o,requestFieldPath:d,requestFieldPathData:m,typeName:t},{...s,data:ne(s.data,h)},i,r))})),await Promise.all(F)}_buildCacheMetadata({ast:e},{data:t,...a},s,i){const n=this._createCacheMetadata({data:t,...a},i),r=N(e,i.operation)[0];if(!r)return n;const c=C(r);if(!c)return n;for(const{fieldNode:e}of c)this._setFieldCacheability(e,{requestFieldPath:i.operation},{cacheMetadata:n,data:t},s,i);return n}async _cacheResponse(e,a,s,i,n){const r=((e,t)=>{if(!t.normalizePatchResponseData)return e;const{data:a,paths:s,...i}=e;return s?.length&&O(s[0])?{...i,data:S({},s[0],a),paths:s}:e})(s,n);let c=r;((e,t)=>t.hasDeferOrStream&&e.hasNext)(s,n)&&(this._setResponseChunksAwaitingCaching(r,n),c=void 0),((e,t)=>t.hasDeferOrStream&&!e.hasNext&&e.paths)(s,n)&&(c=this._retrieveResponseDataForCaching(r,n));const h=[];if(c){const{data:s}=c,o=this._buildCacheMetadata(e,c,i,n);let d,l;if(h.push(this._setEntityAndRequestFieldPathCacheEntries(e,{cacheMetadata:o,entityData:structuredClone(s),requestFieldPathData:structuredClone(s)},i,n)),n.operation===A.QUERY){let r;n.queryFiltered&&a&&(h.push(this._setQueryResponseCacheEntry(a.hash,{cacheMetadata:o,data:s},i,n)),r=this._getPartialQueryResponse(e.hash)),d=t._mergeResponseCacheMetadata(o,r),l=this._mergeResponseData(s,r),h.push(this._setQueryResponseCacheEntry(e.hash,{cacheMetadata:d,data:l},i,n))}if(i.awaitDataCaching&&await Promise.all(h),((e,t)=>!t.hasDeferOrStream&&!e.hasNext&&!e.paths)(r,n)&&d&&l)return{cacheMetadata:d,data:l}}const{data:o,hasNext:d,paths:l}=r;return{cacheMetadata:this._buildCacheMetadata(e,r,i,n),data:o,hasNext:d,paths:l}}async _checkCacheEntry(e,a,s,i){try{const n=await this._hasCacheEntry(e,a);if(!n||!t._isValid(n))return!1;const r=await this._getCacheEntry(e,a,s,i);return!H(r)&&{cacheability:n,entry:r}}catch{return!1}}_createCacheMetadata({_cacheMetadata:e,headers:t},{operation:a}){const s=new Map,i=(({_cacheMetadata:e,fallback:t,headers:a})=>{if(e&&!Q(e)){const[t,...a]=Object.values(e);return new I({metadata:a.reduce(((e,t)=>e?t.ttl<e.ttl?t:e:t),t)})}return a?.has("cache-control")?new I({headers:a}):new I({cacheControl:t})})({_cacheMetadata:e,fallback:this._fallbackOperationCacheability,headers:t});return s.set(a,i),e&&M(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}`)}catch{return!1}}_mergeResponseData(e,t){return t?J(t.data,e,this._typeIDKey):e}async _parseEntityAndRequestFieldPathCacheEntryData(e,t,{cacheMetadata:a,entityData:s,requestFieldPathData:i},n,r){const c=_(e,t,r),{hashedRequestFieldCacheKey:d,requestFieldCacheKey:l,requestFieldPath:y,responseDataPath:u}=c,f=z(i,u),m=r.fieldTypeMap.get(y),C=a.get(y);if(!p(f)&&!m?.hasDirectives)return;if(p(f)){const t=[];K(e,f,r.fragmentDefinitions,((e,c,h,o,d)=>{t.push(this._parseEntityAndRequestFieldPathCacheEntryData(e,{index:d,requestFieldCacheKey:l,requestFieldPath:y,responseDataPath:u},{cacheMetadata:a,entityData:s,requestFieldPathData:i},n,r))})),await Promise.all(t)}if(H(f)||!m||!C)return;const g=Z(f,m,this._typeIDKey),D=!!m.hasArguments||!!m.hasDirectives;r.operation===A.QUERY&&(g||D)&&(await this._setRequestFieldPathCacheEntry(c,{cacheability:C,fieldData:ee(structuredClone(f),e,c,r),fieldTypeInfo:m},n,r),P(e,{fragmentDefinitions:r.fragmentDefinitions})&&(g?S(i,u,{__cacheKey:`${h}::${d}`}):G(i,u))),g&&(await this._setEntityCacheEntry({cacheability:C,fieldData:te(structuredClone(z(s,u)),e,c,r),fieldTypeInfo:m},n,r),S(s,u,{__cacheKey:`${o}::${X(f,m,r)}`}))}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(o,`${t}::${e}`,s,i))))).filter((e=>!!e));let c;return 1===r.length?c=r[0]:r.length>1&&(r.sort((({cacheability:e},{cacheability:t})=>e.metadata.ttl-t.metadata.ttl)),c={cacheability:r[0].cacheability,entry:r.reduce(((e,{entry:t})=>J(e,t,this._typeIDKey)),{})}),c??{}}async _retrieveCachedParentNodeData({entityData:e,requestFieldPathData:a},{hashedRequestFieldCacheKey:s,propNameOrIndex:i,requestFieldCacheKey:n},r,c,h){let o,l=t._getFieldDataFromAncestor(e,i),y=t._getFieldDataFromAncestor(a,i);if(t._isNodeRequestFieldPath(r)){const{cacheability:e,entry:t}=await this._retrieveCachedRequestFieldPathData(s,n,c,h);y=W(y,t,this._typeIDKey),e&&(o=e)}const p=((e,{typeIDValue:t},a)=>t||(d(e)?e[a]:void 0))(y,r,this._typeIDKey);if(t._isNodeEntity(r)&&p){const{cacheability:e,entry:t}=await this._retrieveCachedEntityData(p,r,c,h);l=W(l,t,this._typeIDKey),e&&(!o||e.metadata.ttl>o.metadata.ttl)&&(o=e)}return{cacheability:o,data:L(l,y)?l:W(l,y,this._typeIDKey),entityData:l,requestFieldPathData:y}}async _retrieveCachedRequestFieldPathData(e,t,a,s){return await this._checkCacheEntry(h,e,a,{...s,requestFieldCacheKey:t})||{}}async _retrieveCachedResponseData({ast:e},a,s){const i={cacheMetadata:new Map,data:{},fieldCount:{missing:0,total:0},fieldPathChecklist:new Map},n=N(e,s.operation)[0];if(!n)return i;const r=C(n);return r?(await Promise.all(r.map((({fieldNode:e})=>this._analyzeFieldNode(e,{requestFieldPath:s.operation},i,a,s)))),i.fieldCount=t._countFieldPathChecklist(i.fieldPathChecklist),i):i}_retrieveResponseDataForCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.requestID);return this._responseChunksAwaitingCaching.delete(t.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=[]),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=N(e.ast,s.operation)[0];if(!i)return;const n=C(i);n&&await Promise.all(n.map((({fieldNode:e})=>this._parseEntityAndRequestFieldPathCacheEntryData(e,{requestFieldPath:s.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(o,n,s,i);r&&(t=J(r.entry,t,this._typeIDKey)),await this._setCacheEntry(o,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=_(e,t,n),{requestFieldPath:h,responseDataPath:o}=c;if(!p(s))return;const d=z(s,o),l=n.fieldTypeMap.get(h);(p(d)||l?.hasDirectives)&&(this._setFieldTypeCacheDirective(a,{ancestorRequestFieldPath:r,requestFieldPath:h},n),p(d)&&K(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:a,requestFieldPath:s},{fieldTypeMap:i,operation:n}){if(e.has(s))return;const r=i.get(s);if(r&&this._typeCacheDirectives[r.typeName]){const a=new I({cacheControl:this._typeCacheDirectives[r.typeName]});t._setCacheMetadata(e,a,s,n)}else this._cascadeCacheControl&&a&&t._setCacheMetadata(e,e.get(a),s,n)}_setPartialQueryResponse(e,t,a,s){this._partialQueryResponses.set(e,t)}async _setQueryResponseCacheEntry(e,{cacheMetadata:a,data:s},i,n){const r=v(a),h=t._getOperationCacheControl(a,n.operation);await this._setCacheEntry(c,e,{cacheMetadata:r,data:s},{cacheHeaders:{cacheControl:h},tag:i.tag},i,n)}async _setRequestFieldPathCacheEntry(e,{cacheability:t,fieldData:a},s,i){const{hashedRequestFieldCacheKey:n,requestFieldCacheKey:r}=e,c=await this._checkCacheEntry(h,n,s,{...i,requestFieldCacheKey:r});c&&p(c.entry)&&p(a)&&(a=J(c.entry,a,this._typeIDKey)),this._setCacheEntry(h,n,a,{cacheHeaders:{cacheControl:t.printCacheControl()},tag:s.tag},s,{...i,requestFieldCacheKey:r})}_setResponseChunksAwaitingCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.requestID);a?this._responseChunksAwaitingCaching.set(t.requestID,[...a,e]):this._responseChunksAwaitingCaching.set(t.requestID,[e])}},t(de.prototype,"_getCacheEntry",[ce],Object.getOwnPropertyDescriptor(de.prototype,"_getCacheEntry"),de.prototype),t(de.prototype,"_setCacheEntry",[he],Object.getOwnPropertyDescriptor(de.prototype,"_setCacheEntry"),de.prototype),t(de.prototype,"_setPartialQueryResponse",[oe],Object.getOwnPropertyDescriptor(de.prototype,"_setPartialQueryResponse"),de.prototype),de);export{le as CacheManager};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../cache-manager/src//constants.ts","../cache-manager/src//helpers/areOnlyPopulatedFieldsTypeIdKeys.ts","../cache-manager/src//helpers/mergeObjects.ts","../cache-manager/src//helpers/combineData.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//debug/logCacheQuery.ts","../cache-manager/src//debug/logCacheEntry.ts","../cache-manager/src//debug/logPartialCompiled.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/deriveOpCacheability.ts","../cache-manager/src//helpers/validTypeIdValue.ts","../cache-manager/src//helpers/mergeResponseDataSets.ts","../cache-manager/src//helpers/filterOutPropsWithArgsOrDirectives.ts"],"sourcesContent":["export const METADATA = 'metadata' as const;\nexport const CACHE_CONTROL = 'cacheControl' as const;\nexport const NO_CACHE = 'noCache' as const;\n\nexport const HEADER_CACHE_CONTROL = 'cache-control' as const;\nexport const HEADER_NO_CACHE = 'no-cache' as const;\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 { 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 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 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 of Object.keys(fragmentSpreadFieldCounter)) {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n continue;\n }\n\n checklist.paths.push(ancestorRequestFieldPath);\n const { hasData, total } = fragmentSpreadFieldCounter[key]!;\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, getName } 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 }) => getName(fieldNode)!);\n\n if (fieldNames.length === 2 && fieldNames.every(name => name === typeIDKey || name === TYPE_NAME_KEY)) {\n deleteChildFields(\n field,\n fieldsAndTypeNames.map(({ fieldNode }) => fieldNode)\n );\n\n return true;\n }\n\n if ((fieldNames.length === 1 && fieldNames[0] === typeIDKey) || fieldNames[0] === TYPE_NAME_KEY) {\n const [fieldAndTypeName] = fieldsAndTypeNames;\n\n if (fieldAndTypeName) {\n const { fieldNode } = fieldAndTypeName;\n deleteChildFields(field, fieldNode);\n return true;\n }\n }\n\n return false;\n};\n","import { type RequestData } from '@graphql-box/core';\nimport {\n buildFieldKeysAndPaths,\n deleteChildFields,\n getChildFields,\n getOperationDefinitions,\n} from '@graphql-box/helpers';\nimport { type CacheManagerContext, type CachedResponseData } from '../types.ts';\nimport { createFragmentSpreadChecklist } from './createFragmentSpreadChecklist.ts';\nimport { filterField } from './filterField.ts';\nimport { filterFragmentDefinitions } from './filterFragmentDefinitions.ts';\n\nexport const filterQuery = (\n requestData: RequestData,\n { fieldPathChecklist }: CachedResponseData,\n context: CacheManagerContext\n) => {\n const { ast } = requestData;\n const queryNode = getOperationDefinitions(ast, context.operation)[0];\n\n if (!queryNode) {\n return ast;\n }\n\n const { fragmentDefinitions, operation } = context;\n const fieldsAndTypeNames = getChildFields(queryNode, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames) {\n return ast;\n }\n\n const fragmentSpreadChecklist = createFragmentSpreadChecklist(requestData, context);\n\n for (let index = fieldsAndTypeNames.length - 1; index >= 0; index -= 1) {\n const { fieldNode } = fieldsAndTypeNames[index]!;\n\n const { requestFieldPath } = buildFieldKeysAndPaths(\n fieldNode,\n {\n requestFieldPath: operation,\n },\n context\n );\n\n if (filterField(fieldNode, fieldPathChecklist, fragmentSpreadChecklist, requestFieldPath, context)) {\n deleteChildFields(queryNode, fieldNode);\n }\n }\n\n context.queryFiltered = true;\n return filterFragmentDefinitions(ast, fieldPathChecklist, fragmentSpreadChecklist, context);\n};\n","import { type RequestData } from '@graphql-box/core';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport type FragmentSpreadCheckist = Record<\n string,\n {\n deleted: number;\n paths: string[];\n total: number;\n }\n>;\n\nexport const createFragmentSpreadChecklist = ({ request }: RequestData, { fragmentDefinitions }: CacheManagerContext) =>\n keys(fragmentDefinitions ?? {}).reduce<FragmentSpreadCheckist>((acc, name) => {\n acc[name] = { deleted: 0, paths: [], total: (request.match(new RegExp(`\\\\.\\\\.\\\\.${name}`, 'g')) ?? []).length };\n return acc;\n }, {});\n","import { deleteFragmentDefinitions } from '@graphql-box/helpers';\nimport { type DocumentNode } from 'graphql';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext, type FieldPathChecklist } from '../types.ts';\nimport { type FragmentSpreadCheckist } from './createFragmentSpreadChecklist.ts';\nimport { filterField } from './filterField.ts';\n\nexport const filterFragmentDefinitions = (\n ast: DocumentNode,\n fieldPathChecklist: FieldPathChecklist,\n fragmentSpreadChecklist: FragmentSpreadCheckist,\n context: CacheManagerContext\n) => {\n const definitionsToFilter = keys(fragmentSpreadChecklist).reduce<{ name: string; path: string }[]>(\n (namesAndPaths, key) => {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n return namesAndPaths;\n }\n\n const { deleted, paths, total } = checklist;\n 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 return value[key] as T;\n }\n\n if (isPlainObject(value) && isString(key)) {\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, cloneDeep, 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 { combineDataSets } from './helpers/combineData.ts';\nimport { deriveOpCacheability } from './helpers/deriveOpCacheability.ts';\nimport { filterOutPropsWithArgsOrDirectives } from './helpers/filterOutPropsWithArgsOrDirectives.ts';\nimport { filterQuery } from './helpers/filterQuery.ts';\nimport { getDataValue } from './helpers/getDataValue.ts';\nimport { hasTypename } from './helpers/hasTypename.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 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) ? cloneDeep(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 _setCachedResponseData(\n cachedFieldData: MergedCachedFieldData,\n { cacheMetadata, data, fieldPathChecklist }: CachedResponseData,\n { propNameOrIndex, requestFieldPath }: KeysAndPaths,\n typeNamesAndKind: TypenamesAndKind,\n _options: RequestOptions,\n { operation }: CacheManagerContext\n ) {\n CacheManager._setCacheMetadata(cacheMetadata, cachedFieldData.cacheability, requestFieldPath, operation);\n CacheManager._setFieldPathChecklist(fieldPathChecklist, cachedFieldData, requestFieldPath, typeNamesAndKind);\n CacheManager._setCachedData(data, cachedFieldData, propNameOrIndex);\n }\n\n private static _setCacheMetadata(\n cacheMetadata: CacheMetadata,\n cacheability: Cacheability | undefined,\n requestFieldPath: string,\n operation: string\n ): void {\n if (!cacheability) {\n return;\n }\n\n cacheMetadata.set(requestFieldPath, cacheability);\n const operationCacheability = cacheMetadata.get(operation);\n\n if (!operationCacheability || operationCacheability.metadata.ttl > cacheability.metadata.ttl) {\n cacheMetadata.set(operation, cacheability);\n }\n }\n\n private static _setFieldPathChecklist(\n fieldPathChecklist: FieldPathChecklist,\n { data }: MergedCachedFieldData,\n requestFieldPath: string,\n { dataTypename: dataTypeName, fieldTypename: fieldTypeName, fragmentKind, fragmentName }: TypenamesAndKind\n ): void {\n if (isUndefined(fieldTypeName) || fragmentKind === Kind.FRAGMENT_SPREAD) {\n if (fieldPathChecklist.has(requestFieldPath)) {\n return;\n }\n\n fieldPathChecklist.set(requestFieldPath, [{ fragmentKind, fragmentName, hasData: !isUndefined(data) }]);\n return;\n }\n\n if (dataTypeName !== fieldTypeName) {\n return;\n }\n\n const entry = fieldPathChecklist.get(requestFieldPath);\n const checklistValues = entry ?? [];\n\n if (checklistValues.some(({ typeName }) => typeName === dataTypeName)) {\n return;\n }\n\n fieldPathChecklist.set(requestFieldPath, [\n ...checklistValues,\n { fragmentKind, fragmentName, hasData: !isUndefined(data), typeName: dataTypeName },\n ]);\n }\n\n private _cache: Core;\n private _cascadeCacheControl: boolean;\n private _fallbackOperationCacheability: string;\n private _partialQueryResponses: PartialQueryResponses = new Map();\n private _responseChunksAwaitingCaching = new Map<string, RawResponseDataWithMaybeCacheMetadata[]>();\n private _typeCacheDirectives: Record<string, string>;\n private _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 this._cache = options.cache;\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 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 reponse 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) {\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 this._setPartialQueryResponse(hash, { cacheMetadata, data }, options, context);\n\n return {\n updated: { ast: filteredAST, hash: hashRequest(filteredRequest), request: filteredRequest },\n };\n }\n\n get cache(): Core {\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 public async checkCacheEntry(\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: RequestContext & { requestFieldCacheKey?: string }\n ): Promise<CheckCacheEntryResult | false> {\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 const result = await this._checkCacheEntry(QUERY_RESPONSES, hash, options, context);\n\n if (!result) {\n return false;\n }\n\n const { cacheMetadata, data } = result.entry as QueryResponseCacheEntry;\n\n return {\n cacheMetadata: rehydrateCacheMetadata(cacheMetadata),\n data,\n };\n }\n\n public deletePartialQueryResponse(hash: string): void {\n this._partialQueryResponses.delete(hash);\n }\n\n public async setQueryResponseCacheEntry(\n requestData: RequestData,\n responseData: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<void> {\n return this._setQueryResponseCacheEntry(requestData.hash, responseData, options, context);\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 { cacheability, entry } = await this._retrieveCachedRequestFieldPathData(\n hashedRequestFieldCacheKey,\n requestFieldCacheKey,\n options,\n context\n );\n\n CacheManager._setCachedResponseData(\n { cacheability, data: entry },\n cachedResponseData,\n keysAndPaths,\n typenamesAndKind,\n options,\n context\n );\n } else {\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 }\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 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\n CacheManager._setCachedResponseData(\n { cacheability, data },\n cachedResponseData,\n keysAndPaths,\n { dataTypename: get(data, TYPE_NAME_KEY), fieldTypename: typeName, fragmentKind, fragmentName },\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 /**\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 */\n data: getDataValue<PlainData>(cachedResponseData.data, propNameOrIndex)!,\n },\n options,\n context\n )\n );\n }\n );\n\n await Promise.all(promises);\n }\n\n private _buildCacheMetadata(\n { ast }: RequestData,\n { data, ...otherProps }: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: CacheManagerContext\n ): CacheMetadata {\n const cacheMetadata = this._createCacheMetadata({ data, ...otherProps }, context);\n const queryNode = getOperationDefinitions(ast, context.operation)[0];\n\n if (!queryNode) {\n return cacheMetadata;\n }\n\n const fieldsAndTypeNames = getChildFields(queryNode);\n\n if (!fieldsAndTypeNames) {\n return cacheMetadata;\n }\n\n for (const { fieldNode } of fieldsAndTypeNames)\n this._setFieldCacheability(\n fieldNode,\n { requestFieldPath: context.operation },\n { cacheMetadata, data },\n options,\n context\n );\n\n return cacheMetadata;\n }\n\n private async _cacheResponse(\n requestData: RequestData,\n updatedRequestData: RequestData | undefined,\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<ResponseData> {\n const normalizedResponseData = normalizePatchResponseData(rawResponseData, context);\n let responseDataForCaching: RawResponseDataWithMaybeCacheMetadata | undefined = normalizedResponseData;\n\n if (isNotLastResponseChunk(rawResponseData, context)) {\n this._setResponseChunksAwaitingCaching(normalizedResponseData, context);\n responseDataForCaching = undefined;\n }\n\n if (isLastResponseChunk(rawResponseData, context)) {\n responseDataForCaching = this._retrieveResponseDataForCaching(normalizedResponseData, context);\n }\n\n const dataCaching: Promise<void>[] = [];\n\n if (responseDataForCaching) {\n const { data } = responseDataForCaching;\n const cacheMetadata = this._buildCacheMetadata(requestData, responseDataForCaching, options, context);\n\n dataCaching.push(\n this._setEntityAndRequestFieldPathCacheEntries(\n requestData,\n {\n cacheMetadata,\n entityData: cloneDeep(data),\n requestFieldPathData: cloneDeep(data),\n },\n options,\n context\n )\n );\n\n let queryCacheMetadata: CacheMetadata | undefined;\n let queryData: PlainData | undefined;\n\n if (context.operation === OperationTypeNode.QUERY) {\n let partialQueryResponse: PartialQueryResponse | undefined;\n\n if (context.queryFiltered && updatedRequestData) {\n dataCaching.push(\n this._setQueryResponseCacheEntry(updatedRequestData.hash, { cacheMetadata, data }, options, context)\n );\n\n partialQueryResponse = this._getPartialQueryResponse(requestData.hash);\n }\n\n queryCacheMetadata = CacheManager._mergeResponseCacheMetadata(cacheMetadata, partialQueryResponse);\n queryData = this._mergeResponseData(data, partialQueryResponse);\n\n dataCaching.push(\n this._setQueryResponseCacheEntry(\n requestData.hash,\n { cacheMetadata: queryCacheMetadata, data: queryData },\n options,\n context\n )\n );\n }\n\n if (options.awaitDataCaching) {\n await Promise.all(dataCaching);\n }\n\n if (isNotResponseChunk(normalizedResponseData, context) && queryCacheMetadata && queryData) {\n return {\n cacheMetadata: queryCacheMetadata,\n data: queryData,\n };\n }\n }\n\n const { data, hasNext, paths } = normalizedResponseData;\n\n return {\n cacheMetadata: this._buildCacheMetadata(requestData, normalizedResponseData, options, context),\n data,\n hasNext,\n paths,\n };\n }\n\n private async _checkCacheEntry<T>(\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: CacheManagerContext & { requestFieldCacheKey?: string }\n ): Promise<CheckCacheEntryResult<T> | false> {\n try {\n const cacheability = await this._hasCacheEntry(cacheType, hash);\n\n if (!cacheability || !CacheManager._isValid(cacheability)) {\n return false;\n }\n\n const entry = await this._getCacheEntry<T>(cacheType, hash, options, context);\n\n if (isUndefined(entry)) {\n return false;\n }\n\n return { cacheability, entry };\n } catch {\n return false;\n }\n }\n\n private _createCacheMetadata(\n { _cacheMetadata, headers }: RawResponseDataWithMaybeCacheMetadata,\n { operation }: CacheManagerContext\n ): CacheMetadata {\n const cacheMetadata = new Map<string, Cacheability>();\n\n const cacheability = deriveOpCacheability({\n _cacheMetadata,\n fallback: this._fallbackOperationCacheability,\n headers,\n });\n\n cacheMetadata.set(operation, cacheability);\n\n if (_cacheMetadata) {\n rehydrateCacheMetadata(_cacheMetadata, cacheMetadata);\n }\n\n return cacheMetadata;\n }\n\n @logCacheQuery()\n private async _getCacheEntry<T>(\n cacheType: CacheTypes,\n hash: string,\n _options: RequestOptions,\n _context: CacheManagerContext & { requestFieldCacheKey?: string }\n ): Promise<T | undefined> {\n return this._cache.get<T>(`${cacheType}::${hash}`);\n }\n\n private _getPartialQueryResponse(hash: string): PartialQueryResponse | undefined {\n const partialQueryResponse = this._partialQueryResponses.get(hash);\n this._partialQueryResponses.delete(hash);\n return partialQueryResponse;\n }\n\n private async _hasCacheEntry(cacheType: CacheTypes, hash: string): Promise<Cacheability | false> {\n try {\n return await this._cache.has(`${cacheType}::${hash}`);\n } catch {\n return false;\n }\n }\n\n private _isFieldEntity(fieldData: unknown, { isEntity, possibleTypes }: FieldTypeInfo): boolean {\n if (!isPlainObject(fieldData) || !(this._typeIDKey in fieldData)) {\n return false;\n }\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\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 { requestFieldCacheKey, requestFieldPath, responseDataPath } = keysAndPaths;\n const fieldData = get(requestFieldPathData, responseDataPath) as unknown;\n const fieldTypeInfo = context.fieldTypeMap.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 await this._setEntityAndRequestFieldPathCacheEntry(\n field,\n keysAndPaths,\n { cacheMetadata, entityData, requestFieldPathData },\n options,\n context\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}::${validTypeIDValue}`, options, context)\n )\n );\n\n const validResults = checkResults.filter(result => !!result) as CheckCacheEntryResult<EntityData>[];\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 validResult = {\n cacheability: validResults[0]!.cacheability,\n entry: validResults.reduce<Partial<EntityData>>(\n (obj, { entry }) => mergeDataSets(obj, entry, this._typeIDKey),\n {}\n ) as EntityData,\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)) {\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 (CacheManager._isNodeEntity(fieldTypeInfo) && validTypeIDValue) {\n const { cacheability: entryCacheability, entry } = await this._retrieveCachedEntityData(\n validTypeIDValue,\n fieldTypeInfo,\n options,\n context\n );\n\n entityData = combineDataSets(entityData, entry, this._typeIDKey);\n\n if (entryCacheability && (!cacheability || entryCacheability.metadata.ttl > cacheability.metadata.ttl)) {\n cacheability = entryCacheability;\n }\n }\n\n const data = isEqual(entityData, requestFieldPathData)\n ? entityData\n : combineDataSets(entityData, requestFieldPathData, this._typeIDKey);\n\n return {\n cacheability,\n data,\n entityData,\n requestFieldPathData,\n };\n }\n\n private async _retrieveCachedRequestFieldPathData(\n hash: string,\n requestFieldCacheKey: string,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<Partial<CheckCacheEntryResult>> {\n return (\n (await this._checkCacheEntry(REQUEST_FIELD_PATHS, hash, options, { ...context, requestFieldCacheKey })) || {}\n );\n }\n\n private async _retrieveCachedResponseData(\n { ast }: RequestData,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<CachedResponseData> {\n const cachedResponseData: CachedResponseData = {\n cacheMetadata: new Map(),\n data: {},\n fieldCount: { missing: 0, total: 0 },\n fieldPathChecklist: new Map(),\n };\n\n const queryNode = getOperationDefinitions(ast, context.operation)[0];\n\n if (!queryNode) {\n return cachedResponseData;\n }\n\n const fieldsAndTypeNames = getChildFields(queryNode);\n\n if (!fieldsAndTypeNames) {\n return cachedResponseData;\n }\n\n await Promise.all(\n fieldsAndTypeNames.map(({ fieldNode }) =>\n this._analyzeFieldNode(fieldNode, { requestFieldPath: context.operation }, cachedResponseData, options, context)\n )\n );\n\n cachedResponseData.fieldCount = CacheManager._countFieldPathChecklist(cachedResponseData.fieldPathChecklist);\n return cachedResponseData;\n }\n\n private _retrieveResponseDataForCaching(\n normalizedResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n ) {\n const responseChunks = this._responseChunksAwaitingCaching.get(context.requestID)!;\n\n this._responseChunksAwaitingCaching.delete(context.requestID);\n return mergeResponseDataSets([...responseChunks, normalizedResponseData]);\n }\n\n @logCacheEntry()\n private async _setCacheEntry(\n cacheType: CacheTypes,\n hash: string,\n value: unknown,\n cachemapOptions: CachemapOptions,\n _options: RequestOptions,\n _context: CacheManagerContext & { requestFieldCacheKey?: string }\n ): Promise<void> {\n try {\n await this._cache.set(`${cacheType}::${hash}`, cloneDeep(value), cachemapOptions);\n } catch {\n // no catch\n }\n }\n\n private async _setEntityAndRequestFieldPathCacheEntries(\n requestData: RequestData,\n responseData: ResponseDataForCaching,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<void> {\n const operationNode = getOperationDefinitions(requestData.ast, context.operation)[0];\n\n if (!operationNode) {\n return;\n }\n\n const fieldsAndTypeNames = getChildFields(operationNode);\n\n if (!fieldsAndTypeNames) {\n return;\n }\n\n await Promise.all(\n fieldsAndTypeNames.map(({ fieldNode }) => {\n return this._parseEntityAndRequestFieldPathCacheEntryData(\n fieldNode,\n { requestFieldPath: context.operation },\n responseData,\n options,\n context\n );\n })\n );\n }\n\n private async _setEntityAndRequestFieldPathCacheEntry(\n field: FieldNode,\n keysAndPaths: KeysAndPaths,\n { cacheMetadata, entityData, requestFieldPathData }: ResponseDataForCaching,\n options: RequestOptions,\n context: CacheManagerContext\n ) {\n const { requestFieldPath, responseDataPath } = keysAndPaths;\n const fieldData = get(entityData, responseDataPath) as unknown;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n const cacheability = cacheMetadata.get(requestFieldPath);\n\n if (isUndefined(fieldData) || !fieldTypeInfo || !cacheability) {\n return;\n }\n\n const promises: Promise<void>[] = [];\n\n promises.push(\n this._setRequestFieldPathCacheEntry(\n field,\n keysAndPaths,\n { cacheability, data: requestFieldPathData, fieldTypeInfo },\n options,\n context\n )\n );\n\n const isEntity = this._isFieldEntity(fieldData, fieldTypeInfo);\n\n if (!isEntity && fieldTypeInfo.hasArguments) {\n unset(entityData, responseDataPath);\n }\n\n if (isEntity) {\n promises.push(\n this._setEntityCacheEntry(keysAndPaths, { cacheability, data: entityData, fieldTypeInfo }, options, context)\n );\n }\n\n await Promise.all(promises);\n }\n\n private async _setEntityCacheEntry(\n { responseDataPath }: KeysAndPaths,\n { cacheability, data, fieldTypeInfo }: DataForCachingEntry,\n options: RequestOptions,\n context: CacheManagerContext\n ) {\n let fieldData = get(data, responseDataPath) as EntityData;\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 set(data, responseDataPath, { __cacheKey: `${DATA_ENTITIES}::${entityDataKey}` });\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 const fieldData = get(data, responseDataPath) as unknown;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n\n if (!isObjectLike(fieldData) && !fieldTypeInfo?.hasDirectives) {\n return;\n }\n\n this._setFieldTypeCacheDirective(cacheMetadata, { ancestorRequestFieldPath, requestFieldPath }, context);\n\n if (isObjectLike(fieldData)) {\n iterateChildFields(\n field,\n fieldData,\n context.fragmentDefinitions,\n (\n childField: FieldNode,\n _typeName: string | undefined,\n _fragmentKind: string | undefined,\n _fragmentName: string | undefined,\n childIndex?: number\n ) => {\n this._setFieldCacheability(\n childField,\n { index: childIndex, requestFieldPath, responseDataPath },\n { cacheMetadata, data },\n options,\n context\n );\n }\n );\n }\n }\n\n private _setFieldTypeCacheDirective(\n cacheMetadata: CacheMetadata,\n { ancestorRequestFieldPath, requestFieldPath }: { ancestorRequestFieldPath?: string; requestFieldPath: string },\n { fieldTypeMap, operation }: CacheManagerContext\n ): void {\n if (cacheMetadata.has(requestFieldPath)) {\n return;\n }\n\n const fieldTypeInfo = fieldTypeMap.get(requestFieldPath);\n\n if (fieldTypeInfo && this._typeCacheDirectives[fieldTypeInfo.typeName]) {\n const cacheability = new Cacheability({ cacheControl: this._typeCacheDirectives[fieldTypeInfo.typeName] });\n CacheManager._setCacheMetadata(cacheMetadata, cacheability, requestFieldPath, operation);\n } else if (this._cascadeCacheControl && ancestorRequestFieldPath) {\n CacheManager._setCacheMetadata(\n cacheMetadata,\n cacheMetadata.get(ancestorRequestFieldPath),\n requestFieldPath,\n operation\n );\n }\n }\n\n @logPartialCompiled()\n private _setPartialQueryResponse(\n hash: string,\n partialQueryResponse: PartialQueryResponse,\n _options: RequestOptions,\n _context: CacheManagerContext\n ): void {\n this._partialQueryResponses.set(hash, partialQueryResponse);\n }\n\n private async _setQueryResponseCacheEntry(\n hash: string,\n { cacheMetadata, data }: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<void> {\n const dehydratedCacheMetadata = dehydrateCacheMetadata(cacheMetadata);\n const cacheControl = CacheManager._getOperationCacheControl(cacheMetadata, context.operation);\n\n await this._setCacheEntry(\n QUERY_RESPONSES,\n hash,\n { cacheMetadata: dehydratedCacheMetadata, data },\n { cacheHeaders: { cacheControl }, tag: options.tag },\n options,\n context\n );\n }\n\n private async _setRequestFieldPathCacheEntry(\n field: FieldNode,\n keysAndPaths: KeysAndPaths,\n { cacheability, data, fieldTypeInfo }: DataForCachingEntry,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<void> {\n const { hashedRequestFieldCacheKey, requestFieldCacheKey, responseDataPath } = keysAndPaths;\n let fieldData = get(data, responseDataPath) as unknown;\n const isEntity = this._isFieldEntity(fieldData, fieldTypeInfo);\n const hasArgsOrDirectives = fieldTypeInfo.hasArguments || fieldTypeInfo.hasDirectives;\n\n if (context.operation === OperationTypeNode.QUERY && (isEntity || hasArgsOrDirectives)) {\n if (isPlainObject(fieldData) && field.selectionSet?.selections) {\n fieldData = filterOutPropsWithArgsOrDirectives(fieldData, field.selectionSet.selections, keysAndPaths, context);\n }\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 await 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 if (hasChildFields(field, { fragmentDefinitions: context.fragmentDefinitions })) {\n if (isEntity) {\n set(data, responseDataPath, { __cacheKey: `${REQUEST_FIELD_PATHS}::${hashedRequestFieldCacheKey}` });\n } else {\n unset(data, responseDataPath);\n }\n }\n }\n }\n\n private _setResponseChunksAwaitingCaching(\n normalizedResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n ) {\n const responseChunks = this._responseChunksAwaitingCaching.get(context.requestID);\n\n if (responseChunks) {\n this._responseChunksAwaitingCaching.set(context.requestID, [...responseChunks, normalizedResponseData]);\n } else {\n this._responseChunksAwaitingCaching.set(context.requestID, [normalizedResponseData]);\n }\n }\n}\n","import { 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) => 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 return new Promise(resolve => {\n void (async () => {\n const { debugManager, requestFieldCacheKey, ...otherContext } = args[3];\n\n if (!debugManager) {\n resolve(await method.apply(this, args));\n return;\n }\n\n const startTime = debugManager.now();\n const result = await method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n resolve(result);\n\n const payload = {\n cacheType: args[0],\n context: otherContext,\n options: args[2],\n requestHash: args[1],\n result,\n stats: { duration, endTime, startTime },\n ...(requestFieldCacheKey ? { decryptedCacheKey: requestFieldCacheKey } : {}),\n };\n\n debugManager.log(CACHE_ENTRY_QUERIED, payload);\n })();\n });\n };\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 void (async () => {\n const { debugManager, requestFieldCacheKey, ...otherContext } = args[5];\n\n if (!debugManager) {\n await method.apply(this, args);\n resolve();\n return;\n }\n\n const startTime = debugManager.now();\n await method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n resolve();\n\n const payload = {\n cacheType: args[0],\n cachemapOptions: args[3],\n context: otherContext,\n options: args[4],\n requestHash: args[1],\n stats: { duration, endTime, startTime },\n value: args[2],\n ...(requestFieldCacheKey ? { decryptedCacheKey: requestFieldCacheKey } : {}),\n };\n\n debugManager.log(CACHE_ENTRY_ADDED, payload);\n })();\n });\n };\n };\n};\n","import { PARTIAL_QUERY_COMPILED, type RequestOptions } from '@graphql-box/core';\nimport { type CacheManagerContext, type CacheManagerDef, type PartialQueryResponse } from '../types.ts';\n\ntype Descriptor = (\n hash: string,\n partialQueryResponse: PartialQueryResponse,\n options: RequestOptions,\n context: CacheManagerContext\n) => void;\n\nexport const logPartialCompiled = () => {\n return (_target: CacheManagerDef, _propertyName: string, descriptor: TypedPropertyDescriptor<Descriptor>): void => {\n const method = descriptor.value;\n\n if (!method) {\n return;\n }\n\n descriptor.value = function descriptorValue(...args: Parameters<Descriptor>): ReturnType<Descriptor> {\n const { debugManager, ...otherContext } = args[3];\n\n if (!debugManager) {\n method.apply(this, args);\n return;\n }\n\n const startTime = debugManager.now();\n method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n\n debugManager.log(PARTIAL_QUERY_COMPILED, {\n context: otherContext,\n options: args[2],\n requestHash: args[0],\n result: args[1],\n stats: { duration, endTime, startTime },\n });\n };\n };\n};\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { isString, set } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const normalizePatchResponseData = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n) => {\n if (!context.normalizePatchResponseData) {\n return rawResponseData;\n }\n\n const { data, paths, ...rest } = rawResponseData;\n\n if (!paths?.length || !isString(paths[0])) {\n return rawResponseData;\n }\n\n return {\n ...rest,\n data: set({}, paths[0], data),\n paths,\n };\n};\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isNotLastResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n) => context.hasDeferOrStream && rawResponseData.hasNext;\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isLastResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n) => context.hasDeferOrStream && !rawResponseData.hasNext && rawResponseData.paths;\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isNotResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n) => !context.hasDeferOrStream && !rawResponseData.hasNext && !rawResponseData.paths;\n","import { type 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 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 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 if (!acc.paths) {\n acc.paths = [];\n }\n\n acc.paths.push(...paths);\n }\n\n return acc;\n },\n { data: {} }\n );\n};\n","import { type PlainObject } from '@graphql-box/core';\nimport { type KeysAndPaths, buildFieldKeysAndPaths, getName, resolveFragments } from '@graphql-box/helpers';\nimport { type SelectionNode } from 'graphql';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const filterOutPropsWithArgsOrDirectives = (\n fieldData: PlainObject,\n selectionNodes: readonly SelectionNode[],\n ancestorKeysAndPaths: KeysAndPaths,\n context: CacheManagerContext\n) => {\n const fieldAndTypeName = resolveFragments(selectionNodes, 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 { requestFieldPath } = buildFieldKeysAndPaths(match.fieldNode, ancestorKeysAndPaths, context);\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n\n if (!fieldTypeInfo?.hasArguments && !fieldTypeInfo?.hasDirectives) {\n acc[key] = fieldData[key];\n }\n }\n\n return acc;\n }, {});\n};\n"],"names":["NO_CACHE","checkValue","value","typeIDKey","isArray","reduce","acc","entry","isPlainObject","recursivelyCheckProps","data","keys","Object","length","key","isNumber","isString","mergeDataSets","obj","source","mergeObjects","_key","undefined","combineDataSets","dataSetA","dataSetB","isObjectLike","checkFieldPathChecklist","fieldPathChecklistValues","fieldTypeName","hasData","typeUnused","fieldPathChecklistValue","typeName","some","every","filterField","field","fieldPathChecklist","fragmentSpreadChecklist","ancestorRequestFieldPath","context","fragmentDefinitions","fieldsAndTypeNames","getChildFields","fragmentSpreadFieldCounter","index","fieldAndTypeName","fieldNode","childField","fragmentKind","fragmentName","childTypeName","Kind","FRAGMENT_SPREAD","total","childFieldName","getName","TYPE_NAME_KEY","requestFieldPath","buildFieldKeysAndPaths","get","counter","hasChildFields","deleteChildFields","filterFragmentSpreads","isEmpty","checklist","paths","push","deleteFragmentSpreads","deleted","filterInlineFragments","inlineFragments","getInlineFragments","filtered","fragment","deleteInlineFragments","filterIDsAndTypeNames","fieldNames","map","name","filterQuery","requestData","ast","queryNode","getOperationDefinitions","operation","createFragmentSpreadChecklist","request","match","RegExp","queryFiltered","filterFragmentDefinitions","definitionsToFilter","namesAndPaths","path","fragmentDefinition","definitionsToDelete","names","deleteFragmentDefinitions","include","getDataValue","hasTypename","CacheManager","_dec","_target","_propertyName","descriptor","method","async","args","Promise","resolve","debugManager","requestFieldCacheKey","otherContext","apply","this","startTime","now","result","endTime","duration","payload","cacheType","options","requestHash","stats","decryptedCacheKey","log","CACHE_ENTRY_QUERIED","_dec2","cachemapOptions","CACHE_ENTRY_ADDED","_dec3","PARTIAL_QUERY_COMPILED","_class","_countFieldPathChecklist","fieldCount","missing","checklistValues","filter","_getFieldDataFromAncestor","ancestorFieldData","propNameOrIndex","dataValue","cloneDeep","_getOperationCacheControl","cacheMetadata","defaultCacheControl","cacheability","printCacheControl","_isNodeEntity","fieldTypeInfo","isEntity","possibleTypes","type","_isNodeRequestFieldPath","hasArguments","hasDirectives","_isValid","checkTTL","_mergeResponseCacheMetadata","partialQueryResponse","Map","_setCachedData","responseData","setData","isUndefined","_setCachedResponseData","cachedFieldData","typeNamesAndKind","_options","_setCacheMetadata","_setFieldPathChecklist","set","operationCacheability","metadata","ttl","dataTypename","dataTypeName","fieldTypename","has","constructor","_defineProperty","errors","ArgsError","typeCacheDirectives","message","GroupedError","_cache","cache","_cascadeCacheControl","cascadeCacheControl","_fallbackOperationCacheability","fallbackOperationCacheability","_typeCacheDirectives","_typeIDKey","DEFAULT_TYPE_ID_KEY","analyzeQuery","hash","cacheManagerContext","getFragmentDefinitions","cachedResponseData","_retrieveCachedResponseData","areOnlyPopulatedFieldsTypeIdKeys","updated","dataCaching","_setQueryResponseCacheEntry","awaitDataCaching","response","filteredAST","filteredRequest","print","rest","assign","_setPartialQueryResponse","hashRequest","cacheQuery","updatedRequestData","rawResponseData","_cacheResponse","cacheResponse","checkCacheEntry","_checkCacheEntry","checkQueryResponseCacheEntry","QUERY_RESPONSES","rehydrateCacheMetadata","deletePartialQueryResponse","_partialQueryResponses","delete","setQueryResponseCacheEntry","_analyzeFieldNode","cachedAncestorFieldData","_analyzeParentFieldNode","_analyzeLeafFieldNode","keysAndPaths","hashedRequestFieldCacheKey","fieldTypeMap","entityData","requestFieldPathData","typenamesAndKind","__typename","_retrieveCachedRequestFieldPathData","_retrieveCachedParentNodeData","promises","iterateChildFields","childFragmentKind","childFragmentName","childIndex","all","_buildCacheMetadata","otherProps","_createCacheMetadata","_setFieldCacheability","normalizedResponseData","normalizePatchResponseData","responseDataForCaching","isNotLastResponseChunk","hasDeferOrStream","hasNext","_setResponseChunksAwaitingCaching","isLastResponseChunk","_retrieveResponseDataForCaching","queryCacheMetadata","queryData","_setEntityAndRequestFieldPathCacheEntries","OperationTypeNode","QUERY","_getPartialQueryResponse","_mergeResponseData","isNotResponseChunk","_hasCacheEntry","_getCacheEntry","_cacheMetadata","headers","deriveOpCacheability","fallback","first","values","Cacheability","cacheControl","_context","_isFieldEntity","fieldData","_parseEntityAndRequestFieldPathCacheEntryData","ancestorKeysAndPaths","responseDataPath","_typeName","_fragmentKind","_fragmentName","_setEntityAndRequestFieldPathCacheEntry","_retrieveCachedEntityData","validTypeIDValue","typeNames","validResults","DATA_ENTITIES","validResult","sort","a","b","ancestorEntityData","ancestorRequestFieldPathData","entryCacheability","getValidTypeIdValue","typeIDValue","isEqual","REQUEST_FIELD_PATHS","responseChunks","_responseChunksAwaitingCaching","requestID","responseDataSets","dataSet","merge","_setCacheEntry","operationNode","_setRequestFieldPathCacheEntry","unset","_setEntityCacheEntry","entityDataKey","String","cacheHeaders","tag","__cacheKey","_setFieldTypeCacheDirective","dehydratedCacheMetadata","dehydrateCacheMetadata","hasArgsOrDirectives","selectionSet","selections","filterOutPropsWithArgsOrDirectives","selectionNodes","resolveFragments","find","_applyDecoratedDescriptor","prototype","getOwnPropertyDescriptor"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../cache-manager/src//constants.ts","../cache-manager/src//helpers/areOnlyPopulatedFieldsTypeIdKeys.ts","../cache-manager/src//helpers/mergeObjects.ts","../cache-manager/src//helpers/combineData.ts","../cache-manager/src//helpers/createEntityDataKey.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//debug/logCacheQuery.ts","../cache-manager/src//debug/logCacheEntry.ts","../cache-manager/src//debug/logPartialCompiled.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/deriveOpCacheability.ts","../cache-manager/src//helpers/validTypeIdValue.ts","../cache-manager/src//helpers/mergeResponseDataSets.ts"],"sourcesContent":["export const METADATA = 'metadata' as const;\nexport const CACHE_CONTROL = 'cacheControl' as const;\nexport const NO_CACHE = 'noCache' as const;\n\nexport const HEADER_CACHE_CONTROL = 'cache-control' as const;\nexport const HEADER_NO_CACHE = 'no-cache' as const;\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 { 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 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 return `${fieldTypeName}::${String(fieldData[context.typeIDKey!])}`;\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 isFieldEntity(fieldData[key], fieldTypeInfo, context.typeIDKey!) ||\n fieldTypeInfo?.hasArguments ||\n fieldTypeInfo?.hasDirectives\n ) {\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 { keys } from 'lodash-es';\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 return 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 if (isFieldEntity(fieldData[key], fieldTypeInfo, context.typeIDKey!) || fieldTypeInfo?.hasArguments) {\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 of Object.keys(fragmentSpreadFieldCounter)) {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n continue;\n }\n\n checklist.paths.push(ancestorRequestFieldPath);\n const { hasData, total } = fragmentSpreadFieldCounter[key]!;\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, getName } 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 }) => getName(fieldNode)!);\n\n if (fieldNames.length === 2 && fieldNames.every(name => name === typeIDKey || name === TYPE_NAME_KEY)) {\n deleteChildFields(\n field,\n fieldsAndTypeNames.map(({ fieldNode }) => fieldNode)\n );\n\n return true;\n }\n\n if ((fieldNames.length === 1 && fieldNames[0] === typeIDKey) || fieldNames[0] === TYPE_NAME_KEY) {\n const [fieldAndTypeName] = fieldsAndTypeNames;\n\n if (fieldAndTypeName) {\n const { fieldNode } = fieldAndTypeName;\n deleteChildFields(field, fieldNode);\n return true;\n }\n }\n\n return false;\n};\n","import { type RequestData } from '@graphql-box/core';\nimport {\n buildFieldKeysAndPaths,\n deleteChildFields,\n getChildFields,\n getOperationDefinitions,\n} from '@graphql-box/helpers';\nimport { type CacheManagerContext, type CachedResponseData } from '../types.ts';\nimport { createFragmentSpreadChecklist } from './createFragmentSpreadChecklist.ts';\nimport { filterField } from './filterField.ts';\nimport { filterFragmentDefinitions } from './filterFragmentDefinitions.ts';\n\nexport const filterQuery = (\n requestData: RequestData,\n { fieldPathChecklist }: CachedResponseData,\n context: CacheManagerContext\n) => {\n const { ast } = requestData;\n const queryNode = getOperationDefinitions(ast, context.operation)[0];\n\n if (!queryNode) {\n return ast;\n }\n\n const { fragmentDefinitions, operation } = context;\n const fieldsAndTypeNames = getChildFields(queryNode, { fragmentDefinitions });\n\n if (!fieldsAndTypeNames) {\n return ast;\n }\n\n const fragmentSpreadChecklist = createFragmentSpreadChecklist(requestData, context);\n\n for (let index = fieldsAndTypeNames.length - 1; index >= 0; index -= 1) {\n const { fieldNode } = fieldsAndTypeNames[index]!;\n\n const { requestFieldPath } = buildFieldKeysAndPaths(\n fieldNode,\n {\n requestFieldPath: operation,\n },\n context\n );\n\n if (filterField(fieldNode, fieldPathChecklist, fragmentSpreadChecklist, requestFieldPath, context)) {\n deleteChildFields(queryNode, fieldNode);\n }\n }\n\n context.queryFiltered = true;\n return filterFragmentDefinitions(ast, fieldPathChecklist, fragmentSpreadChecklist, context);\n};\n","import { type RequestData } from '@graphql-box/core';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport type FragmentSpreadCheckist = Record<\n string,\n {\n deleted: number;\n paths: string[];\n total: number;\n }\n>;\n\nexport const createFragmentSpreadChecklist = ({ request }: RequestData, { fragmentDefinitions }: CacheManagerContext) =>\n keys(fragmentDefinitions ?? {}).reduce<FragmentSpreadCheckist>((acc, name) => {\n acc[name] = { deleted: 0, paths: [], total: (request.match(new RegExp(`\\\\.\\\\.\\\\.${name}`, 'g')) ?? []).length };\n return acc;\n }, {});\n","import { deleteFragmentDefinitions } from '@graphql-box/helpers';\nimport { type DocumentNode } from 'graphql';\nimport { keys } from 'lodash-es';\nimport { type CacheManagerContext, type FieldPathChecklist } from '../types.ts';\nimport { type FragmentSpreadCheckist } from './createFragmentSpreadChecklist.ts';\nimport { filterField } from './filterField.ts';\n\nexport const filterFragmentDefinitions = (\n ast: DocumentNode,\n fieldPathChecklist: FieldPathChecklist,\n fragmentSpreadChecklist: FragmentSpreadCheckist,\n context: CacheManagerContext\n) => {\n const definitionsToFilter = keys(fragmentSpreadChecklist).reduce<{ name: string; path: string }[]>(\n (namesAndPaths, key) => {\n const checklist = fragmentSpreadChecklist[key];\n\n if (!checklist) {\n return namesAndPaths;\n }\n\n const { deleted, paths, total } = checklist;\n 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 return value[key] as T;\n }\n\n if (isPlainObject(value) && isString(key)) {\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 { 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 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 _setCachedResponseData(\n cachedFieldData: MergedCachedFieldData,\n { cacheMetadata, data, fieldPathChecklist }: CachedResponseData,\n { propNameOrIndex, requestFieldPath }: KeysAndPaths,\n typeNamesAndKind: TypenamesAndKind,\n _options: RequestOptions,\n { operation }: CacheManagerContext\n ) {\n CacheManager._setCacheMetadata(cacheMetadata, cachedFieldData.cacheability, requestFieldPath, operation);\n CacheManager._setFieldPathChecklist(fieldPathChecklist, cachedFieldData, requestFieldPath, typeNamesAndKind);\n CacheManager._setCachedData(data, cachedFieldData, propNameOrIndex);\n }\n\n private static _setCacheMetadata(\n cacheMetadata: CacheMetadata,\n cacheability: Cacheability | undefined,\n requestFieldPath: string,\n operation: string\n ): void {\n if (!cacheability) {\n return;\n }\n\n cacheMetadata.set(requestFieldPath, cacheability);\n const operationCacheability = cacheMetadata.get(operation);\n\n if (!operationCacheability || operationCacheability.metadata.ttl > cacheability.metadata.ttl) {\n cacheMetadata.set(operation, cacheability);\n }\n }\n\n private static _setFieldPathChecklist(\n fieldPathChecklist: FieldPathChecklist,\n { data }: MergedCachedFieldData,\n requestFieldPath: string,\n { dataTypename: dataTypeName, fieldTypename: fieldTypeName, fragmentKind, fragmentName }: TypenamesAndKind\n ): void {\n if (isUndefined(fieldTypeName) || fragmentKind === Kind.FRAGMENT_SPREAD) {\n if (fieldPathChecklist.has(requestFieldPath)) {\n return;\n }\n\n fieldPathChecklist.set(requestFieldPath, [{ fragmentKind, fragmentName, hasData: !isUndefined(data) }]);\n return;\n }\n\n if (dataTypeName !== fieldTypeName) {\n return;\n }\n\n const entry = fieldPathChecklist.get(requestFieldPath);\n const checklistValues = entry ?? [];\n\n if (checklistValues.some(({ typeName }) => typeName === dataTypeName)) {\n return;\n }\n\n fieldPathChecklist.set(requestFieldPath, [\n ...checklistValues,\n { fragmentKind, fragmentName, hasData: !isUndefined(data), typeName: dataTypeName },\n ]);\n }\n\n private _cache: Core;\n private _cascadeCacheControl: boolean;\n private _fallbackOperationCacheability: string;\n private _partialQueryResponses: PartialQueryResponses = new Map();\n private _responseChunksAwaitingCaching = new Map<string, RawResponseDataWithMaybeCacheMetadata[]>();\n private _typeCacheDirectives: Record<string, string>;\n private _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 this._cache = options.cache;\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 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 reponse 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) {\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 this._setPartialQueryResponse(hash, { cacheMetadata, data }, options, context);\n\n return {\n updated: { ast: filteredAST, hash: hashRequest(filteredRequest), request: filteredRequest },\n };\n }\n\n get cache(): Core {\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 public async checkCacheEntry(\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: RequestContext & { requestFieldCacheKey?: string }\n ): Promise<CheckCacheEntryResult | false> {\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 const result = await this._checkCacheEntry(QUERY_RESPONSES, hash, options, context);\n\n if (!result) {\n return false;\n }\n\n const { cacheMetadata, data } = result.entry as QueryResponseCacheEntry;\n\n return {\n cacheMetadata: rehydrateCacheMetadata(cacheMetadata),\n data,\n };\n }\n\n public deletePartialQueryResponse(hash: string): void {\n this._partialQueryResponses.delete(hash);\n }\n\n public async setQueryResponseCacheEntry(\n requestData: RequestData,\n responseData: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<void> {\n return this._setQueryResponseCacheEntry(requestData.hash, responseData, options, context);\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 { cacheability, entry } = await this._retrieveCachedRequestFieldPathData(\n hashedRequestFieldCacheKey,\n requestFieldCacheKey,\n options,\n context\n );\n\n CacheManager._setCachedResponseData(\n { cacheability, data: entry },\n cachedResponseData,\n keysAndPaths,\n typenamesAndKind,\n options,\n context\n );\n } else {\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 }\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 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\n CacheManager._setCachedResponseData(\n { cacheability, data },\n cachedResponseData,\n keysAndPaths,\n { dataTypename: get(data, TYPE_NAME_KEY), fieldTypename: typeName, fragmentKind, fragmentName },\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 /**\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 */\n data: getDataValue<PlainData>(cachedResponseData.data, propNameOrIndex)!,\n },\n options,\n context\n )\n );\n }\n );\n\n await Promise.all(promises);\n }\n\n private _buildCacheMetadata(\n { ast }: RequestData,\n { data, ...otherProps }: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: CacheManagerContext\n ): CacheMetadata {\n const cacheMetadata = this._createCacheMetadata({ data, ...otherProps }, context);\n const queryNode = getOperationDefinitions(ast, context.operation)[0];\n\n if (!queryNode) {\n return cacheMetadata;\n }\n\n const fieldsAndTypeNames = getChildFields(queryNode);\n\n if (!fieldsAndTypeNames) {\n return cacheMetadata;\n }\n\n for (const { fieldNode } of fieldsAndTypeNames)\n this._setFieldCacheability(\n fieldNode,\n { requestFieldPath: context.operation },\n { cacheMetadata, data },\n options,\n context\n );\n\n return cacheMetadata;\n }\n\n private async _cacheResponse(\n requestData: RequestData,\n updatedRequestData: RequestData | undefined,\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<ResponseData> {\n const normalizedResponseData = normalizePatchResponseData(rawResponseData, context);\n let responseDataForCaching: RawResponseDataWithMaybeCacheMetadata | undefined = normalizedResponseData;\n\n if (isNotLastResponseChunk(rawResponseData, context)) {\n this._setResponseChunksAwaitingCaching(normalizedResponseData, context);\n responseDataForCaching = undefined;\n }\n\n if (isLastResponseChunk(rawResponseData, context)) {\n responseDataForCaching = this._retrieveResponseDataForCaching(normalizedResponseData, context);\n }\n\n const dataCaching: Promise<void>[] = [];\n\n if (responseDataForCaching) {\n const { data } = responseDataForCaching;\n const cacheMetadata = this._buildCacheMetadata(requestData, responseDataForCaching, options, context);\n\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 let queryCacheMetadata: CacheMetadata | undefined;\n let queryData: PlainData | undefined;\n\n if (context.operation === OperationTypeNode.QUERY) {\n let partialQueryResponse: PartialQueryResponse | undefined;\n\n if (context.queryFiltered && updatedRequestData) {\n dataCaching.push(\n this._setQueryResponseCacheEntry(updatedRequestData.hash, { cacheMetadata, data }, options, context)\n );\n\n partialQueryResponse = this._getPartialQueryResponse(requestData.hash);\n }\n\n queryCacheMetadata = CacheManager._mergeResponseCacheMetadata(cacheMetadata, partialQueryResponse);\n queryData = this._mergeResponseData(data, partialQueryResponse);\n\n dataCaching.push(\n this._setQueryResponseCacheEntry(\n requestData.hash,\n { cacheMetadata: queryCacheMetadata, data: queryData },\n options,\n context\n )\n );\n }\n\n if (options.awaitDataCaching) {\n await Promise.all(dataCaching);\n }\n\n if (isNotResponseChunk(normalizedResponseData, context) && queryCacheMetadata && queryData) {\n return {\n cacheMetadata: queryCacheMetadata,\n data: queryData,\n };\n }\n }\n\n const { data, hasNext, paths } = normalizedResponseData;\n\n return {\n cacheMetadata: this._buildCacheMetadata(requestData, normalizedResponseData, options, context),\n data,\n hasNext,\n paths,\n };\n }\n\n private async _checkCacheEntry<T>(\n cacheType: CacheTypes,\n hash: string,\n options: RequestOptions,\n context: CacheManagerContext & { requestFieldCacheKey?: string }\n ): Promise<CheckCacheEntryResult<T> | false> {\n try {\n const cacheability = await this._hasCacheEntry(cacheType, hash);\n\n if (!cacheability || !CacheManager._isValid(cacheability)) {\n return false;\n }\n\n const entry = await this._getCacheEntry<T>(cacheType, hash, options, context);\n\n if (isUndefined(entry)) {\n return false;\n }\n\n return { cacheability, entry };\n } catch {\n return false;\n }\n }\n\n private _createCacheMetadata(\n { _cacheMetadata, headers }: RawResponseDataWithMaybeCacheMetadata,\n { operation }: CacheManagerContext\n ): CacheMetadata {\n const cacheMetadata = new Map<string, Cacheability>();\n\n const cacheability = deriveOpCacheability({\n _cacheMetadata,\n fallback: this._fallbackOperationCacheability,\n headers,\n });\n\n cacheMetadata.set(operation, cacheability);\n\n if (_cacheMetadata) {\n rehydrateCacheMetadata(_cacheMetadata, cacheMetadata);\n }\n\n return cacheMetadata;\n }\n\n @logCacheQuery()\n private async _getCacheEntry<T>(\n cacheType: CacheTypes,\n hash: string,\n _options: RequestOptions,\n _context: CacheManagerContext & { requestFieldCacheKey?: string }\n ): Promise<T | undefined> {\n return this._cache.get<T>(`${cacheType}::${hash}`);\n }\n\n private _getPartialQueryResponse(hash: string): PartialQueryResponse | undefined {\n const partialQueryResponse = this._partialQueryResponses.get(hash);\n this._partialQueryResponses.delete(hash);\n return partialQueryResponse;\n }\n\n private async _hasCacheEntry(cacheType: CacheTypes, hash: string): Promise<Cacheability | false> {\n try {\n return await this._cache.has(`${cacheType}::${hash}`);\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 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 (context.operation === OperationTypeNode.QUERY && (isEntity || hasArgsOrDirectives)) {\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) {\n await this._setEntityCacheEntry(\n {\n cacheability,\n fieldData: filterOutPropsWithEntityOrArgs(\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}::${validTypeIDValue}`, options, context)\n )\n );\n\n const validResults = checkResults.filter(result => !!result) as CheckCacheEntryResult<EntityData>[];\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 validResult = {\n cacheability: validResults[0]!.cacheability,\n entry: validResults.reduce<Partial<EntityData>>(\n (obj, { entry }) => mergeDataSets(obj, entry, this._typeIDKey),\n {}\n ) as EntityData,\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)) {\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 (CacheManager._isNodeEntity(fieldTypeInfo) && validTypeIDValue) {\n const { cacheability: entryCacheability, entry } = await this._retrieveCachedEntityData(\n validTypeIDValue,\n fieldTypeInfo,\n options,\n context\n );\n\n entityData = combineDataSets(entityData, entry, this._typeIDKey);\n\n if (entryCacheability && (!cacheability || entryCacheability.metadata.ttl > cacheability.metadata.ttl)) {\n cacheability = entryCacheability;\n }\n }\n\n const data = isEqual(entityData, requestFieldPathData)\n ? entityData\n : combineDataSets(entityData, requestFieldPathData, this._typeIDKey);\n\n return {\n cacheability,\n data,\n entityData,\n requestFieldPathData,\n };\n }\n\n private async _retrieveCachedRequestFieldPathData(\n hash: string,\n requestFieldCacheKey: string,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<Partial<CheckCacheEntryResult>> {\n return (\n (await this._checkCacheEntry(REQUEST_FIELD_PATHS, hash, options, { ...context, requestFieldCacheKey })) || {}\n );\n }\n\n private async _retrieveCachedResponseData(\n { ast }: RequestData,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<CachedResponseData> {\n const cachedResponseData: CachedResponseData = {\n cacheMetadata: new Map(),\n data: {},\n fieldCount: { missing: 0, total: 0 },\n fieldPathChecklist: new Map(),\n };\n\n const queryNode = getOperationDefinitions(ast, context.operation)[0];\n\n if (!queryNode) {\n return cachedResponseData;\n }\n\n const fieldsAndTypeNames = getChildFields(queryNode);\n\n if (!fieldsAndTypeNames) {\n return cachedResponseData;\n }\n\n await Promise.all(\n fieldsAndTypeNames.map(({ fieldNode }) =>\n this._analyzeFieldNode(fieldNode, { requestFieldPath: context.operation }, cachedResponseData, options, context)\n )\n );\n\n cachedResponseData.fieldCount = CacheManager._countFieldPathChecklist(cachedResponseData.fieldPathChecklist);\n return cachedResponseData;\n }\n\n private _retrieveResponseDataForCaching(\n normalizedResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n ) {\n const responseChunks = this._responseChunksAwaitingCaching.get(context.requestID)!;\n\n this._responseChunksAwaitingCaching.delete(context.requestID);\n return mergeResponseDataSets([...responseChunks, normalizedResponseData]);\n }\n\n @logCacheEntry()\n private async _setCacheEntry(\n cacheType: CacheTypes,\n hash: string,\n value: unknown,\n cachemapOptions: CachemapOptions,\n _options: RequestOptions,\n _context: CacheManagerContext & { requestFieldCacheKey?: string }\n ): Promise<void> {\n try {\n await this._cache.set(`${cacheType}::${hash}`, structuredClone(value), cachemapOptions);\n } catch {\n // no catch\n }\n }\n\n private async _setEntityAndRequestFieldPathCacheEntries(\n requestData: RequestData,\n responseData: ResponseDataForCaching,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<void> {\n const operationNode = getOperationDefinitions(requestData.ast, context.operation)[0];\n\n if (!operationNode) {\n return;\n }\n\n const fieldsAndTypeNames = getChildFields(operationNode);\n\n if (!fieldsAndTypeNames) {\n return;\n }\n\n await Promise.all(\n fieldsAndTypeNames.map(({ fieldNode }) => {\n return this._parseEntityAndRequestFieldPathCacheEntryData(\n fieldNode,\n { requestFieldPath: context.operation },\n responseData,\n options,\n context\n );\n })\n );\n }\n\n private async _setEntityCacheEntry(\n { cacheability, fieldData, fieldTypeInfo }: DataForCachingEntry<EntityData>,\n options: RequestOptions,\n context: CacheManagerContext\n ) {\n const fieldTypeName = fieldTypeInfo.isEntity ? fieldTypeInfo.typeName : fieldData.__typename;\n const entityDataKey = `${fieldTypeName}::${String(fieldData[this._typeIDKey])}`;\n const result = await this._checkCacheEntry<EntityData>(DATA_ENTITIES, entityDataKey, options, context);\n\n if (result) {\n fieldData = mergeDataSets(result.entry, fieldData, this._typeIDKey);\n }\n\n await this._setCacheEntry(\n DATA_ENTITIES,\n entityDataKey,\n fieldData,\n { cacheHeaders: { cacheControl: cacheability.printCacheControl() }, tag: options.tag },\n options,\n context\n );\n }\n\n private _setFieldCacheability(\n field: FieldNode,\n ancestorKeysAndPaths: AncestorKeysAndPaths,\n { cacheMetadata, data }: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext\n ): void {\n const { requestFieldPath: ancestorRequestFieldPath } = ancestorKeysAndPaths;\n const keysAndPaths = buildFieldKeysAndPaths(field, ancestorKeysAndPaths, context);\n const { requestFieldPath, responseDataPath } = keysAndPaths;\n\n if (!isObjectLike(data)) {\n return;\n }\n\n const fieldData = get(data, responseDataPath) as unknown;\n const fieldTypeInfo = context.fieldTypeMap.get(requestFieldPath);\n\n if (!isObjectLike(fieldData) && !fieldTypeInfo?.hasDirectives) {\n return;\n }\n\n this._setFieldTypeCacheDirective(cacheMetadata, { ancestorRequestFieldPath, requestFieldPath }, context);\n\n if (isObjectLike(fieldData)) {\n iterateChildFields(\n field,\n fieldData,\n context.fragmentDefinitions,\n (\n childField: FieldNode,\n _typeName: string | undefined,\n _fragmentKind: string | undefined,\n _fragmentName: string | undefined,\n childIndex?: number\n ) => {\n this._setFieldCacheability(\n childField,\n { index: childIndex, requestFieldPath, responseDataPath },\n { cacheMetadata, data },\n options,\n context\n );\n }\n );\n }\n }\n\n private _setFieldTypeCacheDirective(\n cacheMetadata: CacheMetadata,\n { ancestorRequestFieldPath, requestFieldPath }: { ancestorRequestFieldPath?: string; requestFieldPath: string },\n { fieldTypeMap, operation }: CacheManagerContext\n ): void {\n if (cacheMetadata.has(requestFieldPath)) {\n return;\n }\n\n const fieldTypeInfo = fieldTypeMap.get(requestFieldPath);\n\n if (fieldTypeInfo && this._typeCacheDirectives[fieldTypeInfo.typeName]) {\n const cacheability = new Cacheability({ cacheControl: this._typeCacheDirectives[fieldTypeInfo.typeName] });\n CacheManager._setCacheMetadata(cacheMetadata, cacheability, requestFieldPath, operation);\n } else if (this._cascadeCacheControl && ancestorRequestFieldPath) {\n CacheManager._setCacheMetadata(\n cacheMetadata,\n cacheMetadata.get(ancestorRequestFieldPath),\n requestFieldPath,\n operation\n );\n }\n }\n\n @logPartialCompiled()\n private _setPartialQueryResponse(\n hash: string,\n partialQueryResponse: PartialQueryResponse,\n _options: RequestOptions,\n _context: CacheManagerContext\n ): void {\n this._partialQueryResponses.set(hash, partialQueryResponse);\n }\n\n private async _setQueryResponseCacheEntry(\n hash: string,\n { cacheMetadata, data }: ResponseData,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<void> {\n const dehydratedCacheMetadata = dehydrateCacheMetadata(cacheMetadata);\n const cacheControl = CacheManager._getOperationCacheControl(cacheMetadata, context.operation);\n\n await this._setCacheEntry(\n QUERY_RESPONSES,\n hash,\n { cacheMetadata: dehydratedCacheMetadata, data },\n { cacheHeaders: { cacheControl }, tag: options.tag },\n options,\n context\n );\n }\n\n private async _setRequestFieldPathCacheEntry(\n keysAndPaths: KeysAndPaths,\n { cacheability, fieldData }: DataForCachingEntry,\n options: RequestOptions,\n context: CacheManagerContext\n ): Promise<void> {\n const { hashedRequestFieldCacheKey, requestFieldCacheKey } = keysAndPaths;\n\n const result = await this._checkCacheEntry(REQUEST_FIELD_PATHS, hashedRequestFieldCacheKey, options, {\n ...context,\n requestFieldCacheKey,\n });\n\n if (result && isObjectLike(result.entry) && isObjectLike(fieldData)) {\n fieldData = mergeDataSets(result.entry, fieldData, this._typeIDKey);\n }\n\n void this._setCacheEntry(\n REQUEST_FIELD_PATHS,\n hashedRequestFieldCacheKey,\n fieldData,\n { cacheHeaders: { cacheControl: cacheability.printCacheControl() }, tag: options.tag },\n options,\n { ...context, requestFieldCacheKey }\n );\n }\n\n private _setResponseChunksAwaitingCaching(\n normalizedResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n ) {\n const responseChunks = this._responseChunksAwaitingCaching.get(context.requestID);\n\n if (responseChunks) {\n this._responseChunksAwaitingCaching.set(context.requestID, [...responseChunks, normalizedResponseData]);\n } else {\n this._responseChunksAwaitingCaching.set(context.requestID, [normalizedResponseData]);\n }\n }\n}\n","import { 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) => 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 return new Promise(resolve => {\n void (async () => {\n const { debugManager, requestFieldCacheKey, ...otherContext } = args[3];\n\n if (!debugManager) {\n resolve(await method.apply(this, args));\n return;\n }\n\n const startTime = debugManager.now();\n const result = await method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n resolve(result);\n\n const payload = {\n cacheType: args[0],\n context: otherContext,\n options: args[2],\n requestHash: args[1],\n result,\n stats: { duration, endTime, startTime },\n ...(requestFieldCacheKey ? { decryptedCacheKey: requestFieldCacheKey } : {}),\n };\n\n debugManager.log(CACHE_ENTRY_QUERIED, payload);\n })();\n });\n };\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 void (async () => {\n const { debugManager, requestFieldCacheKey, ...otherContext } = args[5];\n\n if (!debugManager) {\n await method.apply(this, args);\n resolve();\n return;\n }\n\n const startTime = debugManager.now();\n await method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n resolve();\n\n const payload = {\n cacheType: args[0],\n cachemapOptions: args[3],\n context: otherContext,\n options: args[4],\n requestHash: args[1],\n stats: { duration, endTime, startTime },\n value: args[2],\n ...(requestFieldCacheKey ? { decryptedCacheKey: requestFieldCacheKey } : {}),\n };\n\n debugManager.log(CACHE_ENTRY_ADDED, payload);\n })();\n });\n };\n };\n};\n","import { PARTIAL_QUERY_COMPILED, type RequestOptions } from '@graphql-box/core';\nimport { type CacheManagerContext, type CacheManagerDef, type PartialQueryResponse } from '../types.ts';\n\ntype Descriptor = (\n hash: string,\n partialQueryResponse: PartialQueryResponse,\n options: RequestOptions,\n context: CacheManagerContext\n) => void;\n\nexport const logPartialCompiled = () => {\n return (_target: CacheManagerDef, _propertyName: string, descriptor: TypedPropertyDescriptor<Descriptor>): void => {\n const method = descriptor.value;\n\n if (!method) {\n return;\n }\n\n descriptor.value = function descriptorValue(...args: Parameters<Descriptor>): ReturnType<Descriptor> {\n const { debugManager, ...otherContext } = args[3];\n\n if (!debugManager) {\n method.apply(this, args);\n return;\n }\n\n const startTime = debugManager.now();\n method.apply(this, args);\n const endTime = debugManager.now();\n const duration = endTime - startTime;\n\n debugManager.log(PARTIAL_QUERY_COMPILED, {\n context: otherContext,\n options: args[2],\n requestHash: args[0],\n result: args[1],\n stats: { duration, endTime, startTime },\n });\n };\n };\n};\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { isString, set } from 'lodash-es';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const normalizePatchResponseData = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n) => {\n if (!context.normalizePatchResponseData) {\n return rawResponseData;\n }\n\n const { data, paths, ...rest } = rawResponseData;\n\n if (!paths?.length || !isString(paths[0])) {\n return rawResponseData;\n }\n\n return {\n ...rest,\n data: set({}, paths[0], data),\n paths,\n };\n};\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isNotLastResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n) => context.hasDeferOrStream && rawResponseData.hasNext;\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isLastResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n) => context.hasDeferOrStream && !rawResponseData.hasNext && rawResponseData.paths;\n","import { type RawResponseDataWithMaybeCacheMetadata } from '@graphql-box/core';\nimport { type CacheManagerContext } from '../types.ts';\n\nexport const isNotResponseChunk = (\n rawResponseData: RawResponseDataWithMaybeCacheMetadata,\n context: CacheManagerContext\n) => !context.hasDeferOrStream && !rawResponseData.hasNext && !rawResponseData.paths;\n","import { type 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 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 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 if (!acc.paths) {\n acc.paths = [];\n }\n\n acc.paths.push(...paths);\n }\n\n return acc;\n },\n { data: {} }\n );\n};\n"],"names":["NO_CACHE","checkValue","value","typeIDKey","isArray","reduce","acc","entry","isPlainObject","recursivelyCheckProps","data","keys","Object","length","key","isNumber","isString","mergeDataSets","obj","source","mergeObjects","_key","undefined","combineDataSets","dataSetA","dataSetB","isObjectLike","createEntityDataKey","fieldData","fieldTypeInfo","context","isEntity","typeName","__typename","String","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","filterFragmentSpreads","isEmpty","checklist","paths","push","deleteFragmentSpreads","deleted","filterInlineFragments","inlineFragments","getInlineFragments","filtered","fragment","deleteInlineFragments","filterIDsAndTypeNames","fieldNames","map","name","filterQuery","requestData","ast","queryNode","getOperationDefinitions","operation","createFragmentSpreadChecklist","request","RegExp","queryFiltered","filterFragmentDefinitions","definitionsToFilter","namesAndPaths","path","fragmentDefinition","definitionsToDelete","names","deleteFragmentDefinitions","include","getDataValue","hasTypename","CacheManager","_dec","_target","_propertyName","descriptor","method","async","args","Promise","resolve","debugManager","requestFieldCacheKey","otherContext","apply","this","startTime","now","result","endTime","duration","payload","cacheType","options","requestHash","stats","decryptedCacheKey","log","CACHE_ENTRY_QUERIED","_dec2","cachemapOptions","CACHE_ENTRY_ADDED","_dec3","PARTIAL_QUERY_COMPILED","_class","_countFieldPathChecklist","fieldCount","missing","checklistValues","filter","_getFieldDataFromAncestor","ancestorFieldData","propNameOrIndex","dataValue","structuredClone","_getOperationCacheControl","cacheMetadata","defaultCacheControl","cacheability","printCacheControl","_isNodeEntity","_isNodeRequestFieldPath","_isValid","checkTTL","_mergeResponseCacheMetadata","partialQueryResponse","Map","_setCachedData","responseData","setData","isUndefined","_setCachedResponseData","cachedFieldData","typeNamesAndKind","_options","_setCacheMetadata","_setFieldPathChecklist","set","operationCacheability","metadata","ttl","dataTypename","dataTypeName","fieldTypename","has","constructor","_defineProperty","errors","ArgsError","typeCacheDirectives","message","GroupedError","_cache","cache","_cascadeCacheControl","cascadeCacheControl","_fallbackOperationCacheability","fallbackOperationCacheability","_typeCacheDirectives","_typeIDKey","DEFAULT_TYPE_ID_KEY","analyzeQuery","hash","cacheManagerContext","getFragmentDefinitions","cachedResponseData","_retrieveCachedResponseData","areOnlyPopulatedFieldsTypeIdKeys","updated","dataCaching","_setQueryResponseCacheEntry","awaitDataCaching","response","filteredAST","filteredRequest","print","rest","assign","_setPartialQueryResponse","hashRequest","cacheQuery","updatedRequestData","rawResponseData","_cacheResponse","cacheResponse","checkCacheEntry","_checkCacheEntry","checkQueryResponseCacheEntry","QUERY_RESPONSES","rehydrateCacheMetadata","deletePartialQueryResponse","_partialQueryResponses","delete","setQueryResponseCacheEntry","_analyzeFieldNode","cachedAncestorFieldData","_analyzeParentFieldNode","_analyzeLeafFieldNode","hashedRequestFieldCacheKey","entityData","requestFieldPathData","typenamesAndKind","_retrieveCachedRequestFieldPathData","_retrieveCachedParentNodeData","promises","iterateChildFields","childFragmentKind","childFragmentName","childIndex","all","_buildCacheMetadata","otherProps","_createCacheMetadata","_setFieldCacheability","normalizedResponseData","normalizePatchResponseData","responseDataForCaching","isNotLastResponseChunk","hasDeferOrStream","hasNext","_setResponseChunksAwaitingCaching","isLastResponseChunk","_retrieveResponseDataForCaching","queryCacheMetadata","queryData","_setEntityAndRequestFieldPathCacheEntries","OperationTypeNode","QUERY","_getPartialQueryResponse","_mergeResponseData","isNotResponseChunk","_hasCacheEntry","_getCacheEntry","_cacheMetadata","headers","deriveOpCacheability","fallback","first","values","Cacheability","cacheControl","_context","_parseEntityAndRequestFieldPathCacheEntryData","responseDataPath","_typeName","_fragmentKind","_fragmentName","hasArgsOrDirectives","_setRequestFieldPathCacheEntry","__cacheKey","REQUEST_FIELD_PATHS","unset","_setEntityCacheEntry","DATA_ENTITIES","_retrieveCachedEntityData","validTypeIDValue","typeNames","validResults","validResult","sort","a","b","ancestorEntityData","ancestorRequestFieldPathData","entryCacheability","getValidTypeIdValue","typeIDValue","isEqual","responseChunks","_responseChunksAwaitingCaching","requestID","responseDataSets","dataSet","merge","_setCacheEntry","operationNode","entityDataKey","cacheHeaders","tag","_setFieldTypeCacheDirective","dehydratedCacheMetadata","dehydrateCacheMetadata","_applyDecoratedDescriptor","prototype","getOwnPropertyDescriptor"],"mappings":"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"}