UNPKG

@stewartmcgown/apollo-response-cache

Version:

Caching and invalidation mechanisms (plugins, directives) of Apollo GraphQL

50 lines (49 loc) 2.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PurgeCacheDirective = void 0; const graphql_1 = require("graphql"); const graphql_tools_1 = require("graphql-tools"); const lodash_1 = require("lodash"); const utils_1 = require("../utils"); exports.PurgeCacheDirective = ({ extraNodesPath, typeResolver, idResolver, }) => { class BasePurgeCacheDirective extends graphql_tools_1.SchemaDirectiveVisitor { visitFieldDefinition(field) { const { resolve = graphql_1.defaultFieldResolver } = field; field.resolve = async (...args) => { const { type, identifier } = this.args; const [root, _, { __redis }] = args; const result = await resolve.apply(this, args); if (!__redis) { return result; } // parse results const results = Array.isArray(result) ? [...result] : [result]; const parsedResults = []; results.map((node) => { const nodeType = typeResolver ? typeResolver(type, node) : type; const nodeId = idResolver ? idResolver(type, node) : lodash_1.get(node, identifier) || lodash_1.get(node, 'id') || lodash_1.get(node, '_id'); if (!nodeType || !nodeId) { return; } parsedResults.push({ type: nodeType, id: nodeId }); }); // merge results and extras const extraNodes = extraNodesPath ? lodash_1.get(result, extraNodesPath, []) : []; const nodes = [...extraNodes, ...parsedResults]; // invalidate nodes.forEach((node) => { utils_1.invalidateFQC({ node, redis: __redis, }); }); return result; }; } } return BasePurgeCacheDirective; };