UNPKG

@r1tsu/payload

Version:

190 lines (189 loc) 6.85 kB
/* eslint-disable no-param-reassign */ import { fieldAffectsData, tabHasName } from '../../config/types.js'; import { traverseFields } from './traverseFields.js'; // This function is responsible for the following actions, in order: // - Execute field hooks export const promise = async ({ collection, context, data, doc, field, global, operation, previousDoc, previousSiblingDoc, req, siblingData, siblingDoc })=>{ if (fieldAffectsData(field)) { // Execute hooks if (field.hooks?.afterChange) { await field.hooks.afterChange.reduce(async (priorHook, currentHook)=>{ await priorHook; const hookedValue = await currentHook({ collection, context, data, field, global, operation, originalDoc: doc, previousDoc, previousSiblingDoc, previousValue: previousDoc[field.name], req, siblingData, value: siblingData[field.name] }); if (hookedValue !== undefined) { siblingDoc[field.name] = hookedValue; } }, Promise.resolve()); } } // Traverse subfields switch(field.type){ case 'group': { await traverseFields({ collection, context, data, doc, fields: field.fields, global, operation, previousDoc, previousSiblingDoc: previousDoc[field.name], req, siblingData: siblingData?.[field.name] || {}, siblingDoc: siblingDoc[field.name] }); break; } case 'array': { const rows = siblingDoc[field.name]; if (Array.isArray(rows)) { const promises = []; rows.forEach((row, i)=>{ promises.push(traverseFields({ collection, context, data, doc, fields: field.fields, global, operation, previousDoc, previousSiblingDoc: previousDoc?.[field.name]?.[i] || {}, req, siblingData: siblingData?.[field.name]?.[i] || {}, siblingDoc: { ...row } || {} })); }); await Promise.all(promises); } break; } case 'blocks': { const rows = siblingDoc[field.name]; if (Array.isArray(rows)) { const promises = []; rows.forEach((row, i)=>{ const block = field.blocks.find((blockType)=>blockType.slug === row.blockType); if (block) { promises.push(traverseFields({ collection, context, data, doc, fields: block.fields, global, operation, previousDoc, previousSiblingDoc: previousDoc?.[field.name]?.[i] || {}, req, siblingData: siblingData?.[field.name]?.[i] || {}, siblingDoc: { ...row } || {} })); } }); await Promise.all(promises); } break; } case 'row': case 'collapsible': { await traverseFields({ collection, context, data, doc, fields: field.fields, global, operation, previousDoc, previousSiblingDoc: { ...previousSiblingDoc }, req, siblingData: siblingData || {}, siblingDoc: { ...siblingDoc } }); break; } case 'tab': { let tabSiblingData = siblingData; let tabSiblingDoc = siblingDoc; let tabPreviousSiblingDoc = siblingDoc; if (tabHasName(field)) { tabSiblingData = siblingData[field.name]; tabSiblingDoc = siblingDoc[field.name]; tabPreviousSiblingDoc = previousDoc[field.name]; } await traverseFields({ collection, context, data, doc, fields: field.fields, global, operation, previousDoc, previousSiblingDoc: tabPreviousSiblingDoc, req, siblingData: tabSiblingData, siblingDoc: tabSiblingDoc }); break; } case 'tabs': { await traverseFields({ collection, context, data, doc, fields: field.tabs.map((tab)=>({ ...tab, type: 'tab' })), global, operation, previousDoc, previousSiblingDoc: { ...previousSiblingDoc }, req, siblingData: siblingData || {}, siblingDoc: { ...siblingDoc } }); break; } default: { break; } } }; //# sourceMappingURL=promise.js.map