UNPKG

redux-state-utils

Version:

Library to help the creation of states in redux

136 lines (122 loc) 3.85 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; function createStateProxy(state) { let clone = null; let proxiesMap = {}; const manager = { createCloneProp: function createCloneProp(prop) { if (!clone) { clone = _extends({}, state); } return returnCloneProp(state, clone, prop); } }; const handler = { get: function get(obj, prop) { if (prop === 'getNewState') { return function () { return clone || state; }; } const target = clone || obj; return returnGet(target, prop, manager, proxiesMap); }, set: function set(obj, prop, value) { if (!clone) { clone = _extends({}, state); } if (value != null && value.__isProxy) { value = value.__object; } clone[prop] = value; return true; }, deleteProperty: function deleteProperty(target, prop) { if (prop in target) { if (!clone) { clone = _extends({}, state); } delete clone[prop]; return true; } } }; return new Proxy(state, handler); } function returnCloneProp(state, clone, prop) { let objectProp = clone[prop]; const objectOriginal = state[prop]; if (objectProp === objectOriginal) { if (Array.isArray(objectProp)) { objectProp = [...objectProp]; } else { objectProp = _extends({}, objectProp); } clone[prop] = objectProp; } return objectProp; } function createProxyObject(obj, objProp, parentManager) { let clone = null; let proxiesMap = {}; const manager = { createCloneProp: function createCloneProp(prop) { if (!clone) { clone = parentManager.createCloneProp(objProp); } return returnCloneProp(obj, clone, prop); } }; const handler = { get: function get(obj, prop) { const target = clone || obj; return returnGet(target, prop, manager, proxiesMap); }, set: function set(obj, prop, value) { if (!clone) { clone = parentManager.createCloneProp(objProp); } if (value != null && value.__isProxy) { value = value.__object; } clone[prop] = value; return true; }, deleteProperty: function deleteProperty(target, prop) { if (prop in target) { if (!clone) { clone = parentManager.createCloneProp(objProp); } delete clone[prop]; return true; } } }; return new Proxy(obj, handler); }; function returnGet(obj, prop, manager, proxiesMap) { if (prop === '__isProxy') { return true; } else if (prop === '__object') { return obj; } const value = obj[prop]; let proxy = proxiesMap[prop]; if (!value) { return value; } else if (value instanceof Function) { return value; } else if (value instanceof Object) { if (!proxy) { proxy = createProxyObject(value, prop, manager); proxiesMap[prop] = proxy; } return proxy; } else { return value; } } exports.default = createStateProxy;