UNPKG

@magnetarjs/plugin-vue3

Version:
36 lines (35 loc) 1.65 kB
import { objGetOrSet } from 'getorset-anything'; import { isPlainObject } from 'is-what'; import { merge } from 'merge-anything'; export function writeActionFactory(data, vue3StoreOptions, actionName, makeBackup) { return function ({ payload, collectionPath, docId, pluginModuleConfig, }) { // write actions cannot be executed on collections if (!docId) throw new Error('An non-existent action was triggered on a collection'); const collectionMap = objGetOrSet(data, collectionPath, () => new Map()); if (makeBackup) makeBackup(collectionPath, docId); // always start from an empty document on 'replace' or when the doc is non existent if (actionName === 'replace' || !collectionMap.get(docId)) collectionMap.set(docId, {}); const docDataToMutate = collectionMap.get(docId); if (!docDataToMutate) throw new Error(`Document data not found for id: ${collectionPath} ${docId}`); if (actionName === 'merge') { Object.entries(payload).forEach(([key, value]) => { const originalValue = docDataToMutate[key]; if (isPlainObject(originalValue) && isPlainObject(value)) { docDataToMutate[key] = merge(originalValue, value); } else { docDataToMutate[key] = value; } }); } if (actionName === 'assign' || actionName === 'replace') { Object.entries(payload).forEach(([key, value]) => { docDataToMutate[key] = value; }); } }; }