@magnetarjs/plugin-vue3
Version:
Magnetar plugin vue3
36 lines (35 loc) • 1.65 kB
JavaScript
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;
});
}
};
}