@graphql-box/cache-manager 5.3.1 → 5.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/production.analysis.txt +45 -36
- package/dist/types/cjs/helpers/cacheTiersEnabled.d.cts +8 -0
- package/dist/types/cjs/helpers/cacheTiersEnabled.d.cts.map +1 -0
- package/dist/types/cjs/main.d.cts +2 -1
- package/dist/types/cjs/main.d.cts.map +1 -1
- package/dist/types/cjs/types.d.cts +10 -0
- package/dist/types/cjs/types.d.cts.map +1 -1
- package/dist/types/esm/helpers/cacheTiersEnabled.d.ts +8 -0
- package/dist/types/esm/helpers/cacheTiersEnabled.d.ts.map +1 -0
- package/dist/types/esm/main.d.ts +2 -1
- package/dist/types/esm/main.d.ts.map +1 -1
- package/dist/types/esm/types.d.ts +10 -0
- package/dist/types/esm/types.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/helpers/cacheTiersEnabled.ts +15 -0
- package/src/main.ts +82 -39
- package/src/types.ts +11 -0
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("@babel/runtime/helpers/defineProperty"),t=require("@babel/runtime/helpers/applyDecoratedDescriptor");require("core-js/modules/web.structured-clone.js"),require("core-js/modules/es.array.push.js");var a=require("@graphql-box/core"),i=require("@graphql-box/helpers"),s=require("cacheability"),n=require("graphql"),r=require("lodash-es");const c="noCache",h=(e,t)=>i.isArray(e)?e.reduce(((e,a)=>!!e&&h(a,t)),!0):!!i.isPlainObject(e)&&o(e,t),o=(e,t)=>{const a=i.isPlainObject(e)?Object.keys(e):[...e.keys()];return!(1!==a.length||!i.isPlainObject(e)||!e[t])||a.reduce(((a,s)=>!!a&&(r.isNumber(s)&&i.isArray(e)||r.isString(s)&&i.isPlainObject(e)?h(e[s],t):a)),!0)},d=(e,t,a)=>i.mergeObjects(e,t,((e,t)=>i.isPlainObject(t)&&t[a]?t[a]:void 0)),l=(e,t,a)=>!e&&t?t:i.isObjectLike(e)&&i.isObjectLike(t)?d(e,t,a):e,y=(e,t,a)=>`${t.isEntity?t.typeName:e.__typename}::${String(e[a.typeIDKey])}`,p=({_cacheMetadata:e,fallback:t,headers:a})=>{if(e&&!r.isEmpty(e)){const[t,...a]=Object.values(e);return new s.Cacheability({metadata:a.reduce(((e,t)=>e?t.ttl<e.ttl?t:e:t),t)})}return a?.has("cache-control")?new s.Cacheability({headers:a}):new s.Cacheability({cacheControl:t})},u=(e,t,a)=>{if(!i.isPlainObject(e)||!(a in e))return!1;const{isEntity:s=!1,possibleTypes:n=[]}=t??{};return!!s||0!==n.length&&n.some((t=>t.typeName===e.__typename))},f=(e,t,a,s)=>{if(!i.isPlainObject(e))return e;const n=i.resolveFragments(t.selectionSet?.selections,s.fragmentDefinitions);return r.keys(e).reduce(((t,r)=>{const c=n.find((({fieldNode:e})=>i.getName(e)===r));if(c){const t=i.buildFieldKeysAndPaths(c.fieldNode,a,s),n=s.fieldTypeMap.get(t.requestFieldPath);(u(e[r],n,s.typeIDKey)||n?.hasArguments||n?.hasDirectives)&&delete e[r]}return t}),e)},_=(e,t,a,s)=>{const n=i.resolveFragments(t.selectionSet?.selections,s.fragmentDefinitions);return r.keys(e).reduce(((t,r)=>{const c=n.find((({fieldNode:e})=>i.getName(e)===r));if(c){const{requestFieldPath:t}=i.buildFieldKeysAndPaths(c.fieldNode,a,s),n=s.fieldTypeMap.get(t);(u(e[r],n,s.typeIDKey)||n?.hasArguments)&&delete e[r]}return t}),e)},g=(e,t)=>{if(!e||0===e.length)return{hasData:!1,typeUnused:!!t};const[a]=e;if(a){const{hasData:e,typeName:i}=a;return{hasData:e,typeUnused:i?i!==t:void 0}}return{hasData:e.some((({hasData:e,typeName:a})=>a===t&&e)),typeUnused:!e.every((({typeName:e})=>e===t))}},C=(e,t,s,c,h)=>{const{fragmentDefinitions:o,typeIDKey:d}=h,l=i.getChildFields(e,{fragmentDefinitions:o});if(!l)return!1;const y={};for(let r=l.length-1;r>=0;r-=1){const p=l[r];if(!p)continue;const{fieldNode:u,fragmentKind:f,fragmentName:_,typeName:D}=p;f===n.Kind.FRAGMENT_SPREAD&&_&&!y[_]&&(y[_]={hasData:0,total:o?.[_]?i.getChildFields(o[_],{fragmentDefinitions:o})?.length??0:0});const m=i.getName(u);if(m===d||m===a.TYPE_NAME_KEY)continue;const{requestFieldPath:F}=i.buildFieldKeysAndPaths(u,{requestFieldPath:c},h),{hasData:E,typeUnused:P}=g(t.get(F),D);if(E||P)if(f===n.Kind.FRAGMENT_SPREAD&&_){const e=y[_];e&&(e.hasData+=1)}else i.hasChildFields(u,{fragmentDefinitions:o})?C(u,t,s,F,h)&&i.deleteChildFields(e,u):i.deleteChildFields(e,u)}return((e,t,a,s)=>{if(!r.isEmpty(t))for(const n of Object.keys(t)){const r=a[n];if(!r)continue;r.paths.push(s);const{hasData:c,total:h}=t[n];c===h&&(i.deleteFragmentSpreads(e,n),r.deleted+=1)}})(e,y,s,c),((e,{fragmentDefinitions:t,typeIDKey:a})=>{const s=i.getInlineFragments(e);let n=!1;for(const r of s){const s=i.getChildFields(r,{fragmentDefinitions:t});if(!s||0===s.length){i.deleteInlineFragments(e,r),n=!0;continue}const[c]=s;if(c){const{fieldNode:t}=c;i.getName(t)===a&&(i.deleteInlineFragments(e,r),n=!0)}}})(e,h),((e,{fragmentDefinitions:t,typeIDKey:s})=>{const n=i.getChildFields(e,{fragmentDefinitions:t});if(!n||n.length>3)return!1;const r=n.map((({fieldNode:e})=>i.getName(e)));if(2===r.length&&r.every((e=>e===s||e===a.TYPE_NAME_KEY)))return i.deleteChildFields(e,n.map((({fieldNode:e})=>e))),!0;if(1===r.length&&r[0]===s||r[0]===a.TYPE_NAME_KEY){const[t]=n;if(t){const{fieldNode:a}=t;return i.deleteChildFields(e,a),!0}}})(e,h),!i.hasChildFields(e,{fragmentDefinitions:o})},D=(e,{fieldPathChecklist:t},a)=>{const{ast:s}=e,n=i.getOperationDefinitions(s,a.operation)[0];if(!n)return s;const{fragmentDefinitions:c,operation:h}=a,o=i.getChildFields(n,{fragmentDefinitions:c});if(!o)return s;const d=(({request:e},{fragmentDefinitions:t})=>r.keys(t??{}).reduce(((t,a)=>(t[a]={deleted:0,paths:[],total:(e.match(new RegExp(`\\.\\.\\.${a}`,"g"))??[]).length},t)),{}))(e,a);for(let e=o.length-1;e>=0;e-=1){const{fieldNode:s}=o[e],{requestFieldPath:r}=i.buildFieldKeysAndPaths(s,{requestFieldPath:h},a);C(s,t,d,r,a)&&i.deleteChildFields(n,s)}return a.queryFiltered=!0,((e,t,a,s)=>{const n=r.keys(a).reduce(((e,t)=>{const i=a[t];if(!i)return e;const{deleted:s,paths:n,total:r}=i;return 0===s&&1===r?[...e,{name:t,path:n[0]}]:e}),[]),{fragmentDefinitions:c={}}=s;for(const{name:e,path:i}of n){const n=c[e];n&&C(n,t,a,i,s)}const h=r.keys(a).reduce(((e,t)=>{const i=a[t];if(!i)return e;const{deleted:s,total:n}=i;return s>0&&s===n?[...e,t]:e}),[]);return 0===h.length?e:i.deleteFragmentDefinitions(e,{include:h})})(s,t,d,a)},m=(e,t)=>i.isArray(e)&&r.isNumber(t)||i.isPlainObject(e)&&r.isString(t)?e[t]:void 0,F=e=>!!i.isObjectLike(e)&&(a.TYPE_NAME_KEY in e&&r.isString(e[a.TYPE_NAME_KEY]));var E,P,b,N;let q=(E=(e,t,i)=>{const s=i.value;s&&(i.value=async function(...e){return new Promise((t=>{(async()=>{const{debugManager:i,requestFieldCacheKey:n,...r}=e[3];if(!i)return void t(await s.apply(this,e));const c=i.now(),h=await s.apply(this,e),o=i.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}:{}};i.log(a.CACHE_ENTRY_QUERIED,l)})()}))})},P=(e,t,i)=>{const s=i.value;s&&(i.value=async function(...e){return new Promise((t=>{(async()=>{const{debugManager:i,requestFieldCacheKey:n,...r}=e[5];if(!i)return await s.apply(this,e),void t();const c=i.now();await s.apply(this,e);const h=i.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}:{}};i.log(a.CACHE_ENTRY_ADDED,d)})()}))})},b=(e,t,i)=>{const s=i.value;s&&(i.value=function(...e){const{debugManager:t,...i}=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(a.PARTIAL_QUERY_COMPILED,{context:i,options:e[2],requestHash:e[0],result:e[1],stats:{duration:c,endTime:r,startTime:n}})})},N=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=m(e,t);return i.isObjectLike(a)?structuredClone(a):a}static _getOperationCacheControl(e,t){const a="no-cache";if(!e)return a;const i=e.get(t);return i?i.printCacheControl():a}static _isNodeEntity(e){if(!e)return!1;const{isEntity:t,possibleTypes:a}=e;return t||a.some((e=>!!e.isEntity))}static _isNodeRequestFieldPath(e){return!!e&&(this._isNodeEntity(e)||e.hasArguments||e.hasDirectives)}static _isValid(e){return!r.get(e,["metadata","cacheControl",c],!1)&&e.checkTTL()}static _mergeResponseCacheMetadata(e,t){return t?new Map([...t.cacheMetadata,...e]):e}static _setCachedData(e,{data:t},a){const s=t=>{(i.isArray(e)&&r.isNumber(a)||i.isPlainObject(e))&&(e[a]=t)};i.isObjectLike(t)||r.isUndefined(t)?i.isArray(t)?s([]):i.isPlainObject(t)&&s({}):s(t)}static _setCachedResponseData(e,{cacheMetadata:a,data:i,fieldPathChecklist:s},{propNameOrIndex:n,requestFieldPath:r},c,h,{operation:o}){t._setCacheMetadata(a,e.cacheability,r,o),t._setFieldPathChecklist(s,e,r,c),t._setCachedData(i,e,n)}static _setCacheMetadata(e,t,a,i){if(!t)return;e.set(a,t);const s=e.get(i);(!s||s.metadata.ttl>t.metadata.ttl)&&e.set(i,t)}static _setFieldPathChecklist(e,{data:t},a,{dataTypename:i,fieldTypename:s,fragmentKind:c,fragmentName:h}){if(r.isUndefined(s)||c===n.Kind.FRAGMENT_SPREAD){if(e.has(a))return;return void e.set(a,[{fragmentKind:c,fragmentName:h,hasData:!r.isUndefined(t)}])}if(i!==s)return;const o=e.get(a)??[];o.some((({typeName:e})=>e===i))||e.set(a,[...o,{fragmentKind:c,fragmentName:h,hasData:!r.isUndefined(t),typeName:i}])}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 s=[];if("cache"in t||s.push(new i.ArgsError("@graphql-box/cache-manager expected cache to be in options.")),t.typeCacheDirectives&&!i.isPlainObject(t.typeCacheDirectives)){const e="@graphql-box/cache-manager expected options.typeCacheDirectives to be a plain object.";s.push(new i.ArgsError(e))}if(s.length>0)throw new i.GroupedError("@graphql-box/cache-manager argument validation errors.",s);this._cache=t.cache,this._cascadeCacheControl=t.cascadeCacheControl??!1,this._fallbackOperationCacheability=t.fallbackOperationCacheability??c,this._typeCacheDirectives=t.typeCacheDirectives??{},this._typeIDKey=t.typeIDKey??a.DEFAULT_TYPE_ID_KEY}async analyzeQuery(e,t,a){const{ast:s,hash:c}=e,h={...a,fragmentDefinitions:i.getFragmentDefinitions(s),typeIDKey:this._typeIDKey},d=await this._retrieveCachedResponseData(e,t,h),{cacheMetadata:l,data:y,fieldCount:p}=d;if(p.missing===p.total||((e,t)=>o(e,t))(y,this._typeIDKey))return{updated:e};if(!p.missing){const e=this._setQueryResponseCacheEntry(c,{cacheMetadata:l,data:y},t,h);return t.awaitDataCaching&&await e,{response:{cacheMetadata:l,data:y}}}const u=D(e,d,h),f=n.print(u),{fragmentDefinitions:_,typeIDKey:g,...C}=h;return r.assign(a,{...C,filteredRequest:f}),this._setPartialQueryResponse(c,{cacheMetadata:l,data:y},t,a),{updated:{ast:u,hash:i.hashRequest(f),request:f}}}get cache(){return this._cache}async cacheQuery(e,t,a,s,n){const r={...n,fragmentDefinitions:i.getFragmentDefinitions((t??e).ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,t,a,s,r)}async cacheResponse(e,t,a,s){const n={...s,fragmentDefinitions:i.getFragmentDefinitions(e.ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,void 0,t,a,n)}async checkCacheEntry(e,t,a,i){return this._checkCacheEntry(e,t,a,i)}async checkQueryResponseCacheEntry(e,t,s){const n=await this._checkCacheEntry(a.QUERY_RESPONSES,e,t,s);if(!n)return!1;const{cacheMetadata:r,data:c}=n.entry;return{cacheMetadata:i.rehydrateCacheMetadata(r),data:c}}deletePartialQueryResponse(e){this._partialQueryResponses.delete(e)}async setQueryResponseCacheEntry(e,t,a,i){return this._setQueryResponseCacheEntry(e.hash,t,a,i)}async _analyzeFieldNode(e,t,a,s,n){await(i.hasChildFields(e,{fragmentDefinitions:n.fragmentDefinitions})?this._analyzeParentFieldNode(e,t,a,s,n):this._analyzeLeafFieldNode(e,t,a,s,n))}async _analyzeLeafFieldNode(e,a,s,n,r){const c=i.buildFieldKeysAndPaths(e,a,r),{hashedRequestFieldCacheKey:h,propNameOrIndex:o,requestFieldCacheKey:d,requestFieldPath:l}=c,y=r.fieldTypeMap.get(l),{entityData:p,fragmentKind:u,fragmentName:f,requestFieldPathData:_,typeName:g}=a,C={dataTypename:F(p)?p.__typename:F(_)?_.__typename:void 0,fieldTypename:g,fragmentKind:u,fragmentName:f};if(t._isNodeRequestFieldPath(y)){const{cacheability:e,entry:a}=await this._retrieveCachedRequestFieldPathData(h,d,n,r);t._setCachedResponseData({cacheability:e,data:a},s,c,C,n,r)}else{const e=t._getFieldDataFromAncestor(p,o)??t._getFieldDataFromAncestor(_,o);t._setFieldPathChecklist(s.fieldPathChecklist,{data:e},l,C),t._setCachedData(s.data,{data:e},o)}}async _analyzeParentFieldNode(e,s,n,c,h){const o=i.buildFieldKeysAndPaths(e,s,h),{propNameOrIndex:d,requestFieldCacheKey:l,requestFieldPath:y}=o,p=h.fieldTypeMap.get(y),{cacheability:u,data:f,entityData:_,requestFieldPathData:g}=await this._retrieveCachedParentNodeData(s,o,p,c,h),{fragmentKind:C,fragmentName:D,typeName:F}=s;if(t._setCachedResponseData({cacheability:u,data:f},n,o,{dataTypename:r.get(f,a.TYPE_NAME_KEY),fieldTypename:F,fragmentKind:C,fragmentName:D},c,h),!i.isObjectLike(f))return;const E=[];i.iterateChildFields(e,f,h.fragmentDefinitions,((e,t,a,i,s)=>{E.push(this._analyzeFieldNode(e,{cacheability:u,entityData:_,fragmentKind:a,fragmentName:i,index:s,requestFieldCacheKey:l,requestFieldPath:y,requestFieldPathData:g,typeName:t},{...n,data:m(n.data,d)},c,h))})),await Promise.all(E)}_buildCacheMetadata({ast:e},{data:t,...a},s,n){const r=this._createCacheMetadata({data:t,...a},n),c=i.getOperationDefinitions(e,n.operation)[0];if(!c)return r;const h=i.getChildFields(c);if(!h)return r;for(const{fieldNode:e}of h)this._setFieldCacheability(e,{requestFieldPath:n.operation},{cacheMetadata:r,data:t},s,n);return r}async _cacheResponse(e,a,i,s,c){const h=((e,t)=>{if(!t.normalizePatchResponseData)return e;const{data:a,paths:i,...s}=e;return i?.length&&r.isString(i[0])?{...s,data:r.set({},i[0],a),paths:i}:e})(i,c);let o=h;((e,t)=>t.hasDeferOrStream&&e.hasNext)(i,c)&&(this._setResponseChunksAwaitingCaching(h,c),o=void 0),((e,t)=>t.hasDeferOrStream&&!e.hasNext&&e.paths)(i,c)&&(o=this._retrieveResponseDataForCaching(h,c));const d=[];if(o){const{data:i}=o,r=this._buildCacheMetadata(e,o,s,c);let l,y;if(d.push(this._setEntityAndRequestFieldPathCacheEntries(e,{cacheMetadata:r,entityData:structuredClone(i),requestFieldPathData:structuredClone(i)},s,c)),c.operation===n.OperationTypeNode.QUERY){let n;c.queryFiltered&&a&&(d.push(this._setQueryResponseCacheEntry(a.hash,{cacheMetadata:r,data:i},s,c)),n=this._getPartialQueryResponse(e.hash)),l=t._mergeResponseCacheMetadata(r,n),y=this._mergeResponseData(i,n),d.push(this._setQueryResponseCacheEntry(e.hash,{cacheMetadata:l,data:y},s,c))}if(s.awaitDataCaching&&await Promise.all(d),((e,t)=>!t.hasDeferOrStream&&!e.hasNext&&!e.paths)(h,c)&&l&&y)return{cacheMetadata:l,data:y}}const{data:l,hasNext:y,paths:p}=h;return{cacheMetadata:this._buildCacheMetadata(e,h,s,c),data:l,hasNext:y,paths:p}}async _checkCacheEntry(e,a,i,s){try{const n=await this._hasCacheEntry(e,a);if(!n||!t._isValid(n))return!1;const c=await this._getCacheEntry(e,a,i,s);return!r.isUndefined(c)&&{cacheability:n,entry:c}}catch{return!1}}_createCacheMetadata({_cacheMetadata:e,headers:t},{operation:a}){const s=new Map,n=p({_cacheMetadata:e,fallback:this._fallbackOperationCacheability,headers:t});return s.set(a,n),e&&i.rehydrateCacheMetadata(e,s),s}async _getCacheEntry(e,t,a,i){return this._cache.get(`${e}::${t}`)}_getPartialQueryResponse(e){const t=this._partialQueryResponses.get(e);return this._partialQueryResponses.delete(e),t}async _hasCacheEntry(e,t){try{return await this._cache.has(`${e}::${t}`)}catch{return!1}}_mergeResponseData(e,t){return t?d(t.data,e,this._typeIDKey):e}async _parseEntityAndRequestFieldPathCacheEntryData(e,t,{cacheMetadata:s,entityData:c,requestFieldPathData:h},o,d){const l=i.buildFieldKeysAndPaths(e,t,d),{hashedRequestFieldCacheKey:p,requestFieldCacheKey:g,requestFieldPath:C,responseDataPath:D}=l,m=r.get(h,D),F=d.fieldTypeMap.get(C),E=s.get(C);if(!i.isObjectLike(m)&&!F?.hasDirectives)return;if(i.isObjectLike(m)){const t=[];i.iterateChildFields(e,m,d.fragmentDefinitions,((e,a,i,n,r)=>{t.push(this._parseEntityAndRequestFieldPathCacheEntryData(e,{index:r,requestFieldCacheKey:g,requestFieldPath:C,responseDataPath:D},{cacheMetadata:s,entityData:c,requestFieldPathData:h},o,d))})),await Promise.all(t)}if(r.isUndefined(m)||!F||!E)return;const P=u(m,F,this._typeIDKey),b=!!F.hasArguments||!!F.hasDirectives;d.operation===n.OperationTypeNode.QUERY&&(P||b)&&(await this._setRequestFieldPathCacheEntry(l,{cacheability:E,fieldData:f(structuredClone(m),e,l,d),fieldTypeInfo:F},o,d),i.hasChildFields(e,{fragmentDefinitions:d.fragmentDefinitions})&&(P?r.set(h,D,{__cacheKey:`${a.REQUEST_FIELD_PATHS}::${p}`}):r.unset(h,D))),P&&(await this._setEntityCacheEntry({cacheability:E,fieldData:_(structuredClone(r.get(c,D)),e,l,d),fieldTypeInfo:F},o,d),r.set(c,D,{__cacheKey:`${a.DATA_ENTITIES}::${y(m,F,d)}`}))}async _retrieveCachedEntityData(e,{possibleTypes:t,typeName:i},s,n){const r=[...t.map((e=>e.typeName)),i],c=(await Promise.all(r.map((t=>this._checkCacheEntry(a.DATA_ENTITIES,`${t}::${e}`,s,n))))).filter((e=>!!e));let h;return 1===c.length?h=c[0]:c.length>1&&(c.sort((({cacheability:e},{cacheability:t})=>e.metadata.ttl-t.metadata.ttl)),h={cacheability:c[0].cacheability,entry:c.reduce(((e,{entry:t})=>d(e,t,this._typeIDKey)),{})}),h??{}}async _retrieveCachedParentNodeData({entityData:e,requestFieldPathData:a},{hashedRequestFieldCacheKey:s,propNameOrIndex:n,requestFieldCacheKey:c},h,o,d){let y,p=t._getFieldDataFromAncestor(e,n),u=t._getFieldDataFromAncestor(a,n);if(t._isNodeRequestFieldPath(h)){const{cacheability:e,entry:t}=await this._retrieveCachedRequestFieldPathData(s,c,o,d);u=l(u,t,this._typeIDKey),e&&(y=e)}const f=((e,{typeIDValue:t},a)=>t||(i.isPlainObject(e)?e[a]:void 0))(u,h,this._typeIDKey);if(t._isNodeEntity(h)&&f){const{cacheability:e,entry:t}=await this._retrieveCachedEntityData(f,h,o,d);p=l(p,t,this._typeIDKey),e&&(!y||e.metadata.ttl>y.metadata.ttl)&&(y=e)}return{cacheability:y,data:r.isEqual(p,u)?p:l(p,u,this._typeIDKey),entityData:p,requestFieldPathData:u}}async _retrieveCachedRequestFieldPathData(e,t,i,s){return await this._checkCacheEntry(a.REQUEST_FIELD_PATHS,e,i,{...s,requestFieldCacheKey:t})||{}}async _retrieveCachedResponseData({ast:e},a,s){const n={cacheMetadata:new Map,data:{},fieldCount:{missing:0,total:0},fieldPathChecklist:new Map},r=i.getOperationDefinitions(e,s.operation)[0];if(!r)return n;const c=i.getChildFields(r);return c?(await Promise.all(c.map((({fieldNode:e})=>this._analyzeFieldNode(e,{requestFieldPath:s.operation},n,a,s)))),n.fieldCount=t._countFieldPathChecklist(n.fieldPathChecklist),n):n}_retrieveResponseDataForCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.requestID);return this._responseChunksAwaitingCaching.delete(t.requestID),(i=[...a,e]).reduce(((e,t,a)=>{const{_cacheMetadata:s,data:n,hasNext:c,headers:h,paths:o}=t;return s&&(e._cacheMetadata=e._cacheMetadata?{...e._cacheMetadata,...s}:s),e.data=r.merge(e.data,n),0===a&&(e.headers=h),a===i.length-1&&(e.hasNext=c),o&&(e.paths||(e.paths=[]),e.paths.push(...o)),e}),{data:{}});var i}async _setCacheEntry(e,t,a,i,s,n){try{await this._cache.set(`${e}::${t}`,structuredClone(a),i)}catch{}}async _setEntityAndRequestFieldPathCacheEntries(e,t,a,s){const n=i.getOperationDefinitions(e.ast,s.operation)[0];if(!n)return;const r=i.getChildFields(n);r&&await Promise.all(r.map((({fieldNode:e})=>this._parseEntityAndRequestFieldPathCacheEntryData(e,{requestFieldPath:s.operation},t,a,s))))}async _setEntityCacheEntry({cacheability:e,fieldData:t,fieldTypeInfo:i},s,n){const r=`${i.isEntity?i.typeName:t.__typename}::${String(t[this._typeIDKey])}`,c=await this._checkCacheEntry(a.DATA_ENTITIES,r,s,n);c&&(t=d(c.entry,t,this._typeIDKey)),await this._setCacheEntry(a.DATA_ENTITIES,r,t,{cacheHeaders:{cacheControl:e.printCacheControl()},tag:s.tag},s,n)}_setFieldCacheability(e,t,{cacheMetadata:a,data:s},n,c){const{requestFieldPath:h}=t,o=i.buildFieldKeysAndPaths(e,t,c),{requestFieldPath:d,responseDataPath:l}=o;if(!i.isObjectLike(s))return;const y=r.get(s,l),p=c.fieldTypeMap.get(d);(i.isObjectLike(y)||p?.hasDirectives)&&(this._setFieldTypeCacheDirective(a,{ancestorRequestFieldPath:h,requestFieldPath:d},c),i.isObjectLike(y)&&i.iterateChildFields(e,y,c.fragmentDefinitions,((e,t,i,r,h)=>{this._setFieldCacheability(e,{index:h,requestFieldPath:d,responseDataPath:l},{cacheMetadata:a,data:s},n,c)})))}_setFieldTypeCacheDirective(e,{ancestorRequestFieldPath:a,requestFieldPath:i},{fieldTypeMap:n,operation:r}){if(e.has(i))return;const c=n.get(i);if(c&&this._typeCacheDirectives[c.typeName]){const a=new s.Cacheability({cacheControl:this._typeCacheDirectives[c.typeName]});t._setCacheMetadata(e,a,i,r)}else this._cascadeCacheControl&&a&&t._setCacheMetadata(e,e.get(a),i,r)}_setPartialQueryResponse(e,t,a,i){this._partialQueryResponses.set(e,t)}async _setQueryResponseCacheEntry(e,{cacheMetadata:s,data:n},r,c){const h=i.dehydrateCacheMetadata(s),o=t._getOperationCacheControl(s,c.operation);await this._setCacheEntry(a.QUERY_RESPONSES,e,{cacheMetadata:h,data:n},{cacheHeaders:{cacheControl:o},tag:r.tag},r,c)}async _setRequestFieldPathCacheEntry(e,{cacheability:t,fieldData:s},n,r){const{hashedRequestFieldCacheKey:c,requestFieldCacheKey:h}=e,o=await this._checkCacheEntry(a.REQUEST_FIELD_PATHS,c,n,{...r,requestFieldCacheKey:h});o&&i.isObjectLike(o.entry)&&i.isObjectLike(s)&&(s=d(o.entry,s,this._typeIDKey)),this._setCacheEntry(a.REQUEST_FIELD_PATHS,c,s,{cacheHeaders:{cacheControl:t.printCacheControl()},tag:n.tag},n,{...r,requestFieldCacheKey:h})}_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(N.prototype,"_getCacheEntry",[E],Object.getOwnPropertyDescriptor(N.prototype,"_getCacheEntry"),N.prototype),t(N.prototype,"_setCacheEntry",[P],Object.getOwnPropertyDescriptor(N.prototype,"_setCacheEntry"),N.prototype),t(N.prototype,"_setPartialQueryResponse",[b],Object.getOwnPropertyDescriptor(N.prototype,"_setPartialQueryResponse"),N.prototype),N);exports.CacheManager=q;
|
|
1
|
+
"use strict";var e=require("@babel/runtime/helpers/defineProperty"),t=require("@babel/runtime/helpers/applyDecoratedDescriptor");require("core-js/modules/web.structured-clone.js"),require("core-js/modules/es.array.push.js");var a=require("@graphql-box/core"),i=require("@graphql-box/helpers"),s=require("cacheability"),n=require("graphql"),r=require("lodash-es");const c="noCache",h=(e,t)=>i.isArray(e)?e.reduce(((e,a)=>!!e&&h(a,t)),!0):!!i.isPlainObject(e)&&d(e,t),d=(e,t)=>{const a=i.isPlainObject(e)?Object.keys(e):[...e.keys()];return!(1!==a.length||!i.isPlainObject(e)||!e[t])||a.reduce(((a,s)=>!!a&&(r.isNumber(s)&&i.isArray(e)||r.isString(s)&&i.isPlainObject(e)?h(e[s],t):a)),!0)},o=({entity:e,queryResponse:t,requestPath:a})=>!e&&!t&&!a,l=e=>!!e.entity,y=({entity:e,requestPath:t})=>!!(e??t),u=e=>!!e.queryResponse,p=e=>!!e.requestPath,_=(e,t,a)=>i.mergeObjects(e,t,((e,t)=>i.isPlainObject(t)&&t[a]?t[a]:void 0)),f=(e,t,a)=>!e&&t?t:i.isObjectLike(e)&&i.isObjectLike(t)?_(e,t,a):e,g=(e,t,a)=>`${t.isEntity?t.typeName:e.__typename}::${String(e[a.typeIDKey])}`,C=({_cacheMetadata:e,fallback:t,headers:a})=>{if(e&&!r.isEmpty(e)){const[t,...a]=Object.values(e);return new s.Cacheability({metadata:a.reduce(((e,t)=>e?t.ttl<e.ttl?t:e:t),t)})}return a?.has("cache-control")?new s.Cacheability({headers:a}):new s.Cacheability({cacheControl:t})},m=(e,t,a)=>{if(!i.isPlainObject(e)||!(a in e))return!1;const{isEntity:s=!1,possibleTypes:n=[]}=t??{};return!!s||0!==n.length&&n.some((t=>t.typeName===e.__typename))},D=(e,t,a,s)=>{if(!i.isPlainObject(e))return e;const n=i.resolveFragments(t.selectionSet?.selections,s.fragmentDefinitions);return r.keys(e).reduce(((t,r)=>{const c=n.find((({fieldNode:e})=>i.getName(e)===r));if(c){const t=i.buildFieldKeysAndPaths(c.fieldNode,a,s),n=s.fieldTypeMap.get(t.requestFieldPath);(m(e[r],n,s.typeIDKey)||n?.hasArguments||n?.hasDirectives)&&delete e[r]}return t}),e)},E=(e,t,a,s)=>{const n=i.resolveFragments(t.selectionSet?.selections,s.fragmentDefinitions);return r.keys(e).reduce(((t,r)=>{const c=n.find((({fieldNode:e})=>i.getName(e)===r));if(c){const{requestFieldPath:t}=i.buildFieldKeysAndPaths(c.fieldNode,a,s),n=s.fieldTypeMap.get(t);(m(e[r],n,s.typeIDKey)||n?.hasArguments)&&delete e[r]}return t}),e)},F=(e,t)=>{if(!e||0===e.length)return{hasData:!1,typeUnused:!!t};const[a]=e;if(a){const{hasData:e,typeName:i}=a;return{hasData:e,typeUnused:i?i!==t:void 0}}return{hasData:e.some((({hasData:e,typeName:a})=>a===t&&e)),typeUnused:!e.every((({typeName:e})=>e===t))}},P=(e,t,s,c,h)=>{const{fragmentDefinitions:d,typeIDKey:o}=h,l=i.getChildFields(e,{fragmentDefinitions:d});if(!l)return!1;const y={};for(let r=l.length-1;r>=0;r-=1){const u=l[r];if(!u)continue;const{fieldNode:p,fragmentKind:_,fragmentName:f,typeName:g}=u;_===n.Kind.FRAGMENT_SPREAD&&f&&!y[f]&&(y[f]={hasData:0,total:d?.[f]?i.getChildFields(d[f],{fragmentDefinitions:d})?.length??0:0});const C=i.getName(p);if(C===o||C===a.TYPE_NAME_KEY)continue;const{requestFieldPath:m}=i.buildFieldKeysAndPaths(p,{requestFieldPath:c},h),{hasData:D,typeUnused:E}=F(t.get(m),g);if(D||E)if(_===n.Kind.FRAGMENT_SPREAD&&f){const e=y[f];e&&(e.hasData+=1)}else i.hasChildFields(p,{fragmentDefinitions:d})?P(p,t,s,m,h)&&i.deleteChildFields(e,p):i.deleteChildFields(e,p)}return((e,t,a,s)=>{if(!r.isEmpty(t))for(const n of Object.keys(t)){const r=a[n];if(!r)continue;r.paths.push(s);const{hasData:c,total:h}=t[n];c===h&&(i.deleteFragmentSpreads(e,n),r.deleted+=1)}})(e,y,s,c),((e,{fragmentDefinitions:t,typeIDKey:a})=>{const s=i.getInlineFragments(e);let n=!1;for(const r of s){const s=i.getChildFields(r,{fragmentDefinitions:t});if(!s||0===s.length){i.deleteInlineFragments(e,r),n=!0;continue}const[c]=s;if(c){const{fieldNode:t}=c;i.getName(t)===a&&(i.deleteInlineFragments(e,r),n=!0)}}})(e,h),((e,{fragmentDefinitions:t,typeIDKey:s})=>{const n=i.getChildFields(e,{fragmentDefinitions:t});if(!n||n.length>3)return!1;const r=n.map((({fieldNode:e})=>i.getName(e)));if(2===r.length&&r.every((e=>e===s||e===a.TYPE_NAME_KEY)))return i.deleteChildFields(e,n.map((({fieldNode:e})=>e))),!0;if(1===r.length&&r[0]===s||r[0]===a.TYPE_NAME_KEY){const[t]=n;if(t){const{fieldNode:a}=t;return i.deleteChildFields(e,a),!0}}})(e,h),!i.hasChildFields(e,{fragmentDefinitions:d})},b=(e,{fieldPathChecklist:t},a)=>{const{ast:s}=e,n=i.getOperationDefinitions(s,a.operation)[0];if(!n)return s;const{fragmentDefinitions:c,operation:h}=a,d=i.getChildFields(n,{fragmentDefinitions:c});if(!d)return s;const o=(({request:e},{fragmentDefinitions:t})=>r.keys(t??{}).reduce(((t,a)=>(t[a]={deleted:0,paths:[],total:(e.match(new RegExp(`\\.\\.\\.${a}`,"g"))??[]).length},t)),{}))(e,a);for(let e=d.length-1;e>=0;e-=1){const{fieldNode:s}=d[e],{requestFieldPath:r}=i.buildFieldKeysAndPaths(s,{requestFieldPath:h},a);P(s,t,o,r,a)&&i.deleteChildFields(n,s)}return a.queryFiltered=!0,((e,t,a,s)=>{const n=r.keys(a).reduce(((e,t)=>{const i=a[t];if(!i)return e;const{deleted:s,paths:n,total:r}=i;return 0===s&&1===r?[...e,{name:t,path:n[0]}]:e}),[]),{fragmentDefinitions:c={}}=s;for(const{name:e,path:i}of n){const n=c[e];n&&P(n,t,a,i,s)}const h=r.keys(a).reduce(((e,t)=>{const i=a[t];if(!i)return e;const{deleted:s,total:n}=i;return s>0&&s===n?[...e,t]:e}),[]);return 0===h.length?e:i.deleteFragmentDefinitions(e,{include:h})})(s,t,o,a)},q=(e,t)=>i.isArray(e)&&r.isNumber(t)||i.isPlainObject(e)&&r.isString(t)?e[t]:void 0,N=e=>!!i.isObjectLike(e)&&(a.TYPE_NAME_KEY in e&&r.isString(e[a.TYPE_NAME_KEY]));var T,R,K,M;let A=(T=(e,t,i)=>{const s=i.value;s&&(i.value=async function(...e){return new Promise((t=>{(async()=>{const{debugManager:i,requestFieldCacheKey:n,...r}=e[3];if(!i)return void t(await s.apply(this,e));const c=i.now(),h=await s.apply(this,e),d=i.now(),o=d-c;t(h);const l={cacheType:e[0],context:r,options:e[2],requestHash:e[1],result:h,stats:{duration:o,endTime:d,startTime:c},...n?{decryptedCacheKey:n}:{}};i.log(a.CACHE_ENTRY_QUERIED,l)})()}))})},R=(e,t,i)=>{const s=i.value;s&&(i.value=async function(...e){return new Promise((t=>{(async()=>{const{debugManager:i,requestFieldCacheKey:n,...r}=e[5];if(!i)return await s.apply(this,e),void t();const c=i.now();await s.apply(this,e);const h=i.now(),d=h-c;t();const o={cacheType:e[0],cachemapOptions:e[3],context:r,options:e[4],requestHash:e[1],stats:{duration:d,endTime:h,startTime:c},value:e[2],...n?{decryptedCacheKey:n}:{}};i.log(a.CACHE_ENTRY_ADDED,o)})()}))})},K=(e,t,i)=>{const s=i.value;s&&(i.value=function(...e){const{debugManager:t,...i}=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(a.PARTIAL_QUERY_COMPILED,{context:i,options:e[2],requestHash:e[0],result:e[1],stats:{duration:c,endTime:r,startTime:n}})})},M=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=q(e,t);return i.isObjectLike(a)?structuredClone(a):a}static _getOperationCacheControl(e,t){const a="no-cache";if(!e)return a;const i=e.get(t);return i?i.printCacheControl():a}static _isNodeEntity(e){if(!e)return!1;const{isEntity:t,possibleTypes:a}=e;return t||a.some((e=>!!e.isEntity))}static _isNodeRequestFieldPath(e){return!!e&&(this._isNodeEntity(e)||e.hasArguments||e.hasDirectives)}static _isValid(e){return!r.get(e,["metadata","cacheControl",c],!1)&&e.checkTTL()}static _mergeResponseCacheMetadata(e,t){return t?new Map([...t.cacheMetadata,...e]):e}static _setCachedData(e,{data:t},a){const s=t=>{(i.isArray(e)&&r.isNumber(a)||i.isPlainObject(e))&&(e[a]=t)};i.isObjectLike(t)||r.isUndefined(t)?i.isArray(t)?s([]):i.isPlainObject(t)&&s({}):s(t)}static _setCachedResponseSlice(e,{cacheMetadata:a,data:i,fieldPathChecklist:s},{propNameOrIndex:n,requestFieldPath:r},c,h,{operation:d}){t._setCacheMetadata(a,e.cacheability,r,d),t._setFieldPathChecklist(s,e,r,c),t._setCachedData(i,e,n)}static _setCacheMetadata(e,t,a,i){if(!t)return;e.set(a,t);const s=e.get(i);(!s||s.metadata.ttl>t.metadata.ttl)&&e.set(i,t)}static _setFieldPathChecklist(e,{data:t},a,{dataTypename:i,fieldTypename:s,fragmentKind:c,fragmentName:h}){if(r.isUndefined(s)||c===n.Kind.FRAGMENT_SPREAD){if(e.has(a))return;return void e.set(a,[{fragmentKind:c,fragmentName:h,hasData:!r.isUndefined(t)}])}if(i!==s)return;const d=e.get(a)??[];d.some((({typeName:e})=>e===i))||e.set(a,[...d,{fragmentKind:c,fragmentName:h,hasData:!r.isUndefined(t),typeName:i}])}constructor(t){e(this,"_cache",void 0),e(this,"_cacheTiersEnabled",{entity:!0,queryResponse:!0,requestPath:!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 s=[];if("cache"in t||s.push(new i.ArgsError("@graphql-box/cache-manager expected cache to be in options.")),t.typeCacheDirectives&&!i.isPlainObject(t.typeCacheDirectives)){const e="@graphql-box/cache-manager expected options.typeCacheDirectives to be a plain object.";s.push(new i.ArgsError(e))}if(s.length>0)throw new i.GroupedError("@graphql-box/cache-manager argument validation errors.",s);this._cache=t.cache,this._cacheTiersEnabled={...this._cacheTiersEnabled,...t.cacheTiersEnabled},this._cascadeCacheControl=t.cascadeCacheControl??!1,this._fallbackOperationCacheability=t.fallbackOperationCacheability??c,this._typeCacheDirectives=t.typeCacheDirectives??{},this._typeIDKey=t.typeIDKey??a.DEFAULT_TYPE_ID_KEY}async analyzeQuery(e,t,a){if(!y(this._cacheTiersEnabled))return{updated:e};const{ast:s,hash:c}=e,h={...a,fragmentDefinitions:i.getFragmentDefinitions(s),typeIDKey:this._typeIDKey},o=await this._retrieveCachedResponseData(e,t,h),{cacheMetadata:l,data:p,fieldCount:_}=o;if(_.missing===_.total||((e,t)=>d(e,t))(p,this._typeIDKey))return{updated:e};if(!_.missing&&u(this._cacheTiersEnabled)){const e=this._setQueryResponseCacheEntry(c,{cacheMetadata:l,data:p},t,h);return t.awaitDataCaching&&await e,{response:{cacheMetadata:l,data:p}}}const f=b(e,o,h),g=n.print(f),{fragmentDefinitions:C,typeIDKey:m,...D}=h;return r.assign(a,{...D,filteredRequest:g}),u(this._cacheTiersEnabled)&&this._setPartialQueryResponse(c,{cacheMetadata:l,data:p},t,a),{updated:{ast:f,hash:i.hashRequest(g),request:g}}}get cache(){return this._cache}async cacheQuery(e,t,a,s,n){const r={...n,fragmentDefinitions:i.getFragmentDefinitions((t??e).ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,t,a,s,r)}async cacheResponse(e,t,a,s){const n={...s,fragmentDefinitions:i.getFragmentDefinitions(e.ast),typeIDKey:this._typeIDKey};return this._cacheResponse(e,void 0,t,a,n)}async checkCacheEntry(e,t,a,i){return!o(this._cacheTiersEnabled)&&this._checkCacheEntry(e,t,a,i)}async checkQueryResponseCacheEntry(e,t,s){if(!u(this._cacheTiersEnabled))return!1;const n=await this._checkCacheEntry(a.QUERY_RESPONSES,e,t,s);if(!n)return!1;const{cacheMetadata:r,data:c}=n.entry;return{cacheMetadata:i.rehydrateCacheMetadata(r),data:c}}deletePartialQueryResponse(e){u(this._cacheTiersEnabled)&&this._partialQueryResponses.delete(e)}async setQueryResponseCacheEntry(e,t,a,i){if(u(this._cacheTiersEnabled))return this._setQueryResponseCacheEntry(e.hash,t,a,i)}async _analyzeFieldNode(e,t,a,s,n){await(i.hasChildFields(e,{fragmentDefinitions:n.fragmentDefinitions})?this._analyzeParentFieldNode(e,t,a,s,n):this._analyzeLeafFieldNode(e,t,a,s,n))}async _analyzeLeafFieldNode(e,a,s,n,r){const c=i.buildFieldKeysAndPaths(e,a,r),{hashedRequestFieldCacheKey:h,propNameOrIndex:d,requestFieldCacheKey:o,requestFieldPath:l}=c,y=r.fieldTypeMap.get(l),{entityData:u,fragmentKind:_,fragmentName:f,requestFieldPathData:g,typeName:C}=a,m={dataTypename:N(u)?u.__typename:N(g)?g.__typename:void 0,fieldTypename:C,fragmentKind:_,fragmentName:f};if(t._isNodeRequestFieldPath(y)){if(p(this._cacheTiersEnabled)){const{cacheability:e,entry:a}=await this._retrieveCachedRequestFieldPathData(h,o,n,r);t._setCachedResponseSlice({cacheability:e,data:a},s,c,m,n,r)}}else{const e=t._getFieldDataFromAncestor(u,d)??t._getFieldDataFromAncestor(g,d);t._setFieldPathChecklist(s.fieldPathChecklist,{data:e},l,m),t._setCachedData(s.data,{data:e},d)}}async _analyzeParentFieldNode(e,s,n,c,h){const d=i.buildFieldKeysAndPaths(e,s,h),{propNameOrIndex:o,requestFieldCacheKey:l,requestFieldPath:y}=d,u=h.fieldTypeMap.get(y),{cacheability:p,data:_,entityData:f,requestFieldPathData:g}=await this._retrieveCachedParentNodeData(s,d,u,c,h),{fragmentKind:C,fragmentName:m,typeName:D}=s;if(t._setCachedResponseSlice({cacheability:p,data:_},n,d,{dataTypename:r.get(_,a.TYPE_NAME_KEY),fieldTypename:D,fragmentKind:C,fragmentName:m},c,h),!i.isObjectLike(_))return;const E=[];i.iterateChildFields(e,_,h.fragmentDefinitions,((e,t,a,i,s)=>{E.push(this._analyzeFieldNode(e,{cacheability:p,entityData:f,fragmentKind:a,fragmentName:i,index:s,requestFieldCacheKey:l,requestFieldPath:y,requestFieldPathData:g,typeName:t},{...n,data:q(n.data,o)},c,h))})),await Promise.all(E)}_buildCacheMetadata({ast:e},{data:t,...a},s,n){const r=this._createCacheMetadata({data:t,...a},n),c=i.getOperationDefinitions(e,n.operation)[0];if(!c)return r;const h=i.getChildFields(c);if(!h)return r;for(const{fieldNode:e}of h)this._setFieldCacheability(e,{requestFieldPath:n.operation},{cacheMetadata:r,data:t},s,n);return r}async _cacheResponse(e,a,i,s,c){const h=((e,t)=>{if(!t.normalizePatchResponseData)return e;const{data:a,paths:i,...s}=e;return i?.length&&r.isString(i[0])?{...s,data:r.set({},i[0],a),paths:i}:e})(i,c);let d=h;((e,t)=>t.hasDeferOrStream&&e.hasNext)(i,c)&&(this._setResponseChunksAwaitingCaching(h,c),d=void 0),((e,t)=>t.hasDeferOrStream&&!e.hasNext&&e.paths)(i,c)&&(d=this._retrieveResponseDataForCaching(h,c));const l=[];if(d&&(p=this._cacheTiersEnabled,!o(p))){const{data:i}=d,r=this._buildCacheMetadata(e,d,s,c);let o,p;if(y(this._cacheTiersEnabled)&&l.push(this._setEntityAndRequestFieldPathCacheEntries(e,{cacheMetadata:r,entityData:structuredClone(i),requestFieldPathData:structuredClone(i)},s,c)),c.operation===n.OperationTypeNode.QUERY&&u(this._cacheTiersEnabled)){let n;c.queryFiltered&&a&&(l.push(this._setQueryResponseCacheEntry(a.hash,{cacheMetadata:r,data:i},s,c)),n=this._getPartialQueryResponse(e.hash)),o=t._mergeResponseCacheMetadata(r,n),p=this._mergeResponseData(i,n),l.push(this._setQueryResponseCacheEntry(e.hash,{cacheMetadata:o,data:p},s,c))}if(s.awaitDataCaching&&await Promise.all(l),((e,t)=>!t.hasDeferOrStream&&!e.hasNext&&!e.paths)(h,c)&&o&&p)return{cacheMetadata:o,data:p}}var p;const{data:_,hasNext:f,paths:g}=h;return{cacheMetadata:this._buildCacheMetadata(e,h,s,c),data:_,hasNext:f,paths:g}}async _checkCacheEntry(e,a,i,s){try{const n=await this._hasCacheEntry(e,a);if(!n||!t._isValid(n))return!1;const c=await this._getCacheEntry(e,a,i,s);return!r.isUndefined(c)&&{cacheability:n,entry:c}}catch{return!1}}_createCacheMetadata({_cacheMetadata:e,headers:t},{operation:a}){const s=new Map,n=C({_cacheMetadata:e,fallback:this._fallbackOperationCacheability,headers:t});return s.set(a,n),e&&i.rehydrateCacheMetadata(e,s),s}async _getCacheEntry(e,t,a,i){return this._cache.get(`${e}::${t}`)}_getPartialQueryResponse(e){const t=this._partialQueryResponses.get(e);return this._partialQueryResponses.delete(e),t}async _hasCacheEntry(e,t){try{return await this._cache.has(`${e}::${t}`)}catch{return!1}}_mergeResponseData(e,t){return t?_(t.data,e,this._typeIDKey):e}async _parseEntityAndRequestFieldPathCacheEntryData(e,t,{cacheMetadata:s,entityData:c,requestFieldPathData:h},d,o){const y=i.buildFieldKeysAndPaths(e,t,o),{hashedRequestFieldCacheKey:u,requestFieldCacheKey:_,requestFieldPath:f,responseDataPath:C}=y,F=r.get(h,C),P=o.fieldTypeMap.get(f),b=s.get(f);if(!i.isObjectLike(F)&&!P?.hasDirectives)return;if(i.isObjectLike(F)){const t=[];i.iterateChildFields(e,F,o.fragmentDefinitions,((e,a,i,n,r)=>{t.push(this._parseEntityAndRequestFieldPathCacheEntryData(e,{index:r,requestFieldCacheKey:_,requestFieldPath:f,responseDataPath:C},{cacheMetadata:s,entityData:c,requestFieldPathData:h},d,o))})),await Promise.all(t)}if(r.isUndefined(F)||!P||!b)return;const q=m(F,P,this._typeIDKey),N=!!P.hasArguments||!!P.hasDirectives;o.operation===n.OperationTypeNode.QUERY&&(q||N)&&p(this._cacheTiersEnabled)&&(await this._setRequestFieldPathCacheEntry(y,{cacheability:b,fieldData:D(structuredClone(F),e,y,o),fieldTypeInfo:P},d,o),i.hasChildFields(e,{fragmentDefinitions:o.fragmentDefinitions})&&(q?r.set(h,C,{__cacheKey:`${a.REQUEST_FIELD_PATHS}::${u}`}):r.unset(h,C))),q&&l(this._cacheTiersEnabled)&&(await this._setEntityCacheEntry({cacheability:b,fieldData:E(structuredClone(r.get(c,C)),e,y,o),fieldTypeInfo:P},d,o),r.set(c,C,{__cacheKey:`${a.DATA_ENTITIES}::${g(F,P,o)}`}))}async _retrieveCachedEntityData(e,{possibleTypes:t,typeName:i},s,n){const r=[...t.map((e=>e.typeName)),i],c=(await Promise.all(r.map((t=>this._checkCacheEntry(a.DATA_ENTITIES,`${t}::${e}`,s,n))))).filter((e=>!!e));let h;return 1===c.length?h=c[0]:c.length>1&&(c.sort((({cacheability:e},{cacheability:t})=>e.metadata.ttl-t.metadata.ttl)),h={cacheability:c[0].cacheability,entry:c.reduce(((e,{entry:t})=>_(e,t,this._typeIDKey)),{})}),h??{}}async _retrieveCachedParentNodeData({entityData:e,requestFieldPathData:a},{hashedRequestFieldCacheKey:s,propNameOrIndex:n,requestFieldCacheKey:c},h,d,o){let y,u=t._getFieldDataFromAncestor(e,n),_=t._getFieldDataFromAncestor(a,n);if(t._isNodeRequestFieldPath(h)&&p(this._cacheTiersEnabled)){const{cacheability:e,entry:t}=await this._retrieveCachedRequestFieldPathData(s,c,d,o);_=f(_,t,this._typeIDKey),e&&(y=e)}const g=((e,{typeIDValue:t},a)=>t||(i.isPlainObject(e)?e[a]:void 0))(_,h,this._typeIDKey);if(t._isNodeEntity(h)&&g&&l(this._cacheTiersEnabled)){const{cacheability:e,entry:t}=await this._retrieveCachedEntityData(g,h,d,o);u=f(u,t,this._typeIDKey),e&&(!y||e.metadata.ttl>y.metadata.ttl)&&(y=e)}return{cacheability:y,data:r.isEqual(u,_)?u:f(u,_,this._typeIDKey),entityData:u,requestFieldPathData:_}}async _retrieveCachedRequestFieldPathData(e,t,i,s){return await this._checkCacheEntry(a.REQUEST_FIELD_PATHS,e,i,{...s,requestFieldCacheKey:t})||{}}async _retrieveCachedResponseData({ast:e},a,s){const n={cacheMetadata:new Map,data:{},fieldCount:{missing:0,total:0},fieldPathChecklist:new Map},r=i.getOperationDefinitions(e,s.operation)[0];if(!r)return n;const c=i.getChildFields(r);return c?(await Promise.all(c.map((({fieldNode:e})=>this._analyzeFieldNode(e,{requestFieldPath:s.operation},n,a,s)))),n.fieldCount=t._countFieldPathChecklist(n.fieldPathChecklist),n):n}_retrieveResponseDataForCaching(e,t){const a=this._responseChunksAwaitingCaching.get(t.requestID);return this._responseChunksAwaitingCaching.delete(t.requestID),(i=[...a,e]).reduce(((e,t,a)=>{const{_cacheMetadata:s,data:n,hasNext:c,headers:h,paths:d}=t;return s&&(e._cacheMetadata=e._cacheMetadata?{...e._cacheMetadata,...s}:s),e.data=r.merge(e.data,n),0===a&&(e.headers=h),a===i.length-1&&(e.hasNext=c),d&&(e.paths||(e.paths=[]),e.paths.push(...d)),e}),{data:{}});var i}async _setCacheEntry(e,t,a,i,s,n){try{await this._cache.set(`${e}::${t}`,structuredClone(a),i)}catch{}}async _setEntityAndRequestFieldPathCacheEntries(e,t,a,s){const n=i.getOperationDefinitions(e.ast,s.operation)[0];if(!n)return;const r=i.getChildFields(n);r&&await Promise.all(r.map((({fieldNode:e})=>this._parseEntityAndRequestFieldPathCacheEntryData(e,{requestFieldPath:s.operation},t,a,s))))}async _setEntityCacheEntry({cacheability:e,fieldData:t,fieldTypeInfo:i},s,n){const r=`${i.isEntity?i.typeName:t.__typename}::${String(t[this._typeIDKey])}`,c=await this._checkCacheEntry(a.DATA_ENTITIES,r,s,n);c&&(t=_(c.entry,t,this._typeIDKey)),await this._setCacheEntry(a.DATA_ENTITIES,r,t,{cacheHeaders:{cacheControl:e.printCacheControl()},tag:s.tag},s,n)}_setFieldCacheability(e,t,{cacheMetadata:a,data:s},n,c){const{requestFieldPath:h}=t,d=i.buildFieldKeysAndPaths(e,t,c),{requestFieldPath:o,responseDataPath:l}=d;if(!i.isObjectLike(s))return;const y=r.get(s,l),u=c.fieldTypeMap.get(o);(i.isObjectLike(y)||u?.hasDirectives)&&(this._setFieldTypeCacheDirective(a,{ancestorRequestFieldPath:h,requestFieldPath:o},c),i.isObjectLike(y)&&i.iterateChildFields(e,y,c.fragmentDefinitions,((e,t,i,r,h)=>{this._setFieldCacheability(e,{index:h,requestFieldPath:o,responseDataPath:l},{cacheMetadata:a,data:s},n,c)})))}_setFieldTypeCacheDirective(e,{ancestorRequestFieldPath:a,requestFieldPath:i},{fieldTypeMap:n,operation:r}){if(e.has(i))return;const c=n.get(i);if(c&&this._typeCacheDirectives[c.typeName]){const a=new s.Cacheability({cacheControl:this._typeCacheDirectives[c.typeName]});t._setCacheMetadata(e,a,i,r)}else this._cascadeCacheControl&&a&&t._setCacheMetadata(e,e.get(a),i,r)}_setPartialQueryResponse(e,t,a,i){this._partialQueryResponses.set(e,t)}async _setQueryResponseCacheEntry(e,{cacheMetadata:s,data:n},r,c){const h=i.dehydrateCacheMetadata(s),d=t._getOperationCacheControl(s,c.operation);await this._setCacheEntry(a.QUERY_RESPONSES,e,{cacheMetadata:h,data:n},{cacheHeaders:{cacheControl:d},tag:r.tag},r,c)}async _setRequestFieldPathCacheEntry(e,{cacheability:t,fieldData:s},n,r){const{hashedRequestFieldCacheKey:c,requestFieldCacheKey:h}=e,d=await this._checkCacheEntry(a.REQUEST_FIELD_PATHS,c,n,{...r,requestFieldCacheKey:h});d&&i.isObjectLike(d.entry)&&i.isObjectLike(s)&&(s=_(d.entry,s,this._typeIDKey)),this._setCacheEntry(a.REQUEST_FIELD_PATHS,c,s,{cacheHeaders:{cacheControl:t.printCacheControl()},tag:n.tag},n,{...r,requestFieldCacheKey:h})}_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(M.prototype,"_getCacheEntry",[T],Object.getOwnPropertyDescriptor(M.prototype,"_getCacheEntry"),M.prototype),t(M.prototype,"_setCacheEntry",[R],Object.getOwnPropertyDescriptor(M.prototype,"_setCacheEntry"),M.prototype),t(M.prototype,"_setPartialQueryResponse",[K],Object.getOwnPropertyDescriptor(M.prototype,"_setPartialQueryResponse"),M.prototype),M);exports.CacheManager=A;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|