@flatfile/plugin-record-hook
Version:
A plugin for running custom logic on individual data records in Flatfile.
2 lines (1 loc) • 4.75 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@flatfile/util-common"),require("@flatfile/hooks")):"function"==typeof define&&define.amd?define(["exports","@flatfile/util-common","@flatfile/hooks"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).PluginRecordHook={},e.utilCommon,e.hooks)}(this,(function(e,t,o){"use strict";function r(e){let t,o=e[0],r=1;for(;r<e.length;){const c=e[r],n=e[r+1];if(r+=2,("optionalAccess"===c||"optionalCall"===c)&&null==o)return;"access"===c||"optionalAccess"===c?(t=o,o=n(o)):"call"!==c&&"optionalCall"!==c||(o=n(((...e)=>o.call(t,...e))),t=void 0)}return o}class c{constructor(e){this.records=e,c.prototype.__init.call(this),c.prototype.__init2.call(this),this.records=e}__init(){this.toFlatfileRecords=()=>{if(this.records instanceof o.FlatfileRecords)return this.records;{const e=this.records;return new o.FlatfileRecords(e.map((e=>{let t={};for(let[o,c]of Object.entries(e.values))if(r([c,"access",e=>e.links,"optionalAccess",e=>e.length])&&c.value){const e=c.links.map((e=>{let t={};for(let[o,r]of Object.entries(e.values))t[o]=r.value;return t}));t[o]={value:c.value,links:e}}else t[o]=c.value;const o=e.metadata;return{rowId:e.id,rawData:t,metadata:o}})))}}}__init2(){this.toXRecords=()=>{if(this.records[0]instanceof o.FlatfileRecord){return this.records.map((e=>{const t=e.toJSON();let o={};for(let[e,r]of Object.entries(t.row.rawData)){const c=t.info.filter((t=>t.field===e)).map((e=>({message:e.message,type:e.level,source:"custom-logic",path:e.path})));o[e]={value:null===r||"object"!=typeof r||Array.isArray(r)?r:r.value,messages:c}}const r=t.row.metadata,c=t.config;return{id:String(e.rowId),values:o,metadata:r,config:c}}))}return this.records}}}function n(e,t,o){if(e===t)return!0;if(!i(e)||!i(t))return!1;const r=Object.keys(e),c=Object.keys(t);return r.length===c.length&&r.every((o=>"values"===o?function(e,t){const o=e.values,r=t.values,c=Object.keys(o);let i=!1;const s=[];c.forEach((e=>{n(o[e],r[e])?s.push(e):i=!0})),s.forEach((e=>{delete o[e],delete r[e]})),0===Object.keys(o).length&&(delete e.values,delete t.values);return!i}(e,t):c.includes(o)&&n(e[o],t[o])))}function i(e){return"object"==typeof e&&null!==e}function s(e){e&&(Object.keys(e).includes("valid")&&delete e.valid,a(e.values,["updatedAt","valid"]))}function a(e,t){"object"==typeof e&&null!==e&&Object.keys(e).forEach((o=>{t.includes(o)?delete e[o]:"messages"===o?Array.isArray(e.messages)&&(e.messages=e.messages.filter((e=>"custom-logic"===e.source))):"object"==typeof e[o]&&null!==e[o]&&a(e[o],t)}))}async function l(e,o){const{commitId:r}=e.context,{trackChanges:c}=e.payload;if(c)try{await e.fetch(`v1/commits/${r}/complete`,{method:"POST"}),o&&t.logInfo("@flatfile/plugin-record-hook","Commit completed successfully")}catch(e){t.logError("@flatfile/plugin-record-hook",`Error completing commit ${r}`)}}function d(e,t){t&&console.time(`⏱️ ${e}`)}function f(e,t){t&&console.timeEnd(`⏱️ ${e}`)}const u=async(e,t,o={})=>{const{concurrency:r=10}=o;return h(e,(async(e,o)=>{const c=new Set;for(const n of e){const e=Promise.resolve(t(n,o)).finally((()=>c.delete(e)));c.add(e),c.size>=r&&await Promise.race(c)}return await Promise.all(c)}),o)},h=async(e,o,r={})=>{const{debug:i=!1}=r;try{d("fetch data",i);const a=await e.cache.init("data",(async()=>{try{const t=await e.data;return t.records&&t.records.length?t.records:void 0}catch(e){throw new Error("Error fetching records")}}));if(!a||0===a.length)return t.logInfo("@flatfile/plugin-record-hook","No records to process"),void await l(e,i);const u=await e.cache.init("records",(async()=>await async function(e){return new c(e).toFlatfileRecords()}(a)));f("fetch data",i),d("run handler",i),await t.asyncBatch(u.records,o,r,e),f("run handler",i),e.afterAll((async()=>{d("filter modified records",i);const{records:o}=e.cache.get("records"),r=await async function(e){return new c(e).toXRecords()}(o),a=await e.cache.get("data"),u=r.filter((e=>{const t=a.find((t=>t.id===e.id));s(t);return!n(e,t)}));if(!u||0===u.length)return t.logInfo("@flatfile/plugin-record-hook","No records modified"),void await l(e,i);f("filter modified records",i),t.logInfo("@flatfile/plugin-record-hook",`${u.length} modified records`);try{return d("update modified records",i),await e.update(u),void f("update modified records",i)}catch(e){throw new Error("Error updating records")}}))}catch(o){return t.logError("@flatfile/plugin-record-hook",o.message),void await l(e,i)}},m=(e,t,o={})=>r=>{r.on("commit:created",{sheetSlug:e},(e=>u(e,t,o)))},g=(e,t,o={})=>r=>{r.on("commit:created",{sheetSlug:e},(e=>h(e,t,o)))};e.BulkRecordHook=h,e.RecordHook=u,e.bulkRecordHook=g,e.bulkRecordHookPlugin=g,e.recordHook=m,e.recordHookPlugin=m}));