UNPKG

dash-renderer

Version:

render dash components in react

270 lines (269 loc) 8.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PatchBuilder = void 0; exports.handlePatch = handlePatch; exports.isPatch = isPatch; exports.parsePatchProps = parsePatchProps; var _ramda = require("ramda"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function isPatch(obj) { return (0, _ramda.has)('__dash_patch_update', obj); } function getLocationIndex(value, previous) { if ((0, _ramda.is)(Number, value) && value < 0) { return previous.length + value; } return value; } function getLocationPath(location, obj) { var current = []; for (var i = 0; i < location.length; i++) { var value = getLocationIndex(location[i], (0, _ramda.path)(current, obj)); current.push(value); } return current; } class PatchBuilder { constructor() { _defineProperty(this, "operations", []); } assign(location, value) { this.operations.push({ operation: 'Assign', location, params: { value } }); return this; } merge(location, value) { this.operations.push({ operation: 'Merge', location, params: { value } }); return this; } extend(location, value) { this.operations.push({ operation: 'Extend', location, params: { value } }); return this; } delete(location) { this.operations.push({ operation: 'Delete', location, params: {} }); return this; } insert(location, index, value) { this.operations.push({ operation: 'Insert', location, params: { index, value } }); return this; } append(location, value) { this.operations.push({ operation: 'Append', location, params: { value } }); return this; } prepend(location, value) { this.operations.push({ operation: 'Prepend', location, params: { value } }); return this; } add(location, value) { this.operations.push({ operation: 'Add', location, params: { value } }); return this; } sub(location, value) { this.operations.push({ operation: 'Sub', location, params: { value } }); return this; } mul(location, value) { this.operations.push({ operation: 'Mul', location, params: { value } }); return this; } div(location, value) { this.operations.push({ operation: 'Div', location, params: { value } }); return this; } clear(location) { this.operations.push({ operation: 'Clear', location, params: {} }); return this; } reverse(location) { this.operations.push({ operation: 'Reverse', location, params: {} }); return this; } remove(location, value) { this.operations.push({ operation: 'Remove', location, params: { value } }); return this; } build() { return { __dash_patch_update: '__dash_patch_update', operations: this.operations }; } } exports.PatchBuilder = PatchBuilder; var patchHandlers = { Assign: (previous, patchOperation) => { var params = patchOperation.params, location = patchOperation.location; return (0, _ramda.assocPath)(location, params.value, previous); }, Merge: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, _objectSpread(_objectSpread({}, prev), patchOperation.params.value), previous); }, Extend: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, (0, _ramda.concat)(prev, patchOperation.params.value), previous); }, Delete: (previous, patchOperation) => { return (0, _ramda.dissocPath)(patchOperation.location, previous); }, Insert: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, (0, _ramda.insert)(getLocationIndex(patchOperation.params.index, prev), patchOperation.params.value, prev), previous); }, Append: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, (0, _ramda.append)(patchOperation.params.value, prev), previous); }, Prepend: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, (0, _ramda.prepend)(patchOperation.params.value, prev), previous); }, Add: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, prev + patchOperation.params.value, previous); }, Sub: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, prev - patchOperation.params.value, previous); }, Mul: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, prev * patchOperation.params.value, previous); }, Div: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, prev / patchOperation.params.value, previous); }, Clear: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, (0, _ramda.empty)(prev), previous); }, Reverse: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, (0, _ramda.reverse)(prev), previous); }, Remove: (previous, patchOperation) => { var prev = (0, _ramda.path)(patchOperation.location, previous); return (0, _ramda.assocPath)(patchOperation.location, prev.filter(item => !(0, _ramda.equals)(item, patchOperation.params.value)), previous); } }; function handlePatch(previousValue, patchValue) { var reducedValue = previousValue; for (var i = 0; i < patchValue.operations.length; i++) { var patch = patchValue.operations[i]; patch.location = getLocationPath(patch.location, reducedValue); var handler = patchHandlers[patch.operation]; if (!handler) { throw new Error("Invalid Operation ".concat(patch.operation)); } reducedValue = handler(reducedValue, patch); } return reducedValue; } function parsePatchProps(props, previousProps) { if (!(0, _ramda.is)(Object, props)) { return props; } var patchedProps = {}; for (var _i = 0, _Object$keys = Object.keys(props); _i < _Object$keys.length; _i++) { var key = _Object$keys[_i]; var val = props[key]; if (isPatch(val)) { var previousValue = previousProps[key]; if (previousValue === undefined) { throw new Error('Cannot patch undefined'); } patchedProps[key] = handlePatch(previousValue, val); } else { patchedProps[key] = val; } } return patchedProps; }