UNPKG

@platform/state

Version:

A small, simple, strongly typed, [rx/observable] state-machine.

88 lines (87 loc) 3.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Patch = void 0; var tslib_1 = require("tslib"); var immer_1 = require("immer"); if (typeof immer_1.enablePatches === 'function') { (0, immer_1.enablePatches)(); } exports.Patch = { toPatchSet: function (forward, backward) { return { prev: backward ? toPatches(backward) : [], next: forward ? toPatches(forward) : [], }; }, isEmpty: function (input) { return input === null || typeof input !== 'object' ? true : isEmptyArray(input.prev) && isEmptyArray(input.next); }, change: function (from, fn) { if (typeof fn === 'function') { var _a = (0, immer_1.produceWithPatches)(from, function (draft) { fn(draft); return undefined; }), to = _a[0], forward = _a[1], backward = _a[2]; var patches = exports.Patch.toPatchSet(forward, backward); var op = 'update'; return { op: op, to: to, patches: patches }; } else { var _b = (0, immer_1.produceWithPatches)(from, function () { return fn; }), to = _b[0], forward = _b[1], backward = _b[2]; var patches = exports.Patch.toPatchSet(forward, backward); var op = 'replace'; return { op: op, to: to, patches: patches }; } }, changeAsync: function (from, fn) { return tslib_1.__awaiter(this, void 0, void 0, function () { var draft, patches, to, op; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: draft = (0, immer_1.createDraft)(from); return [4, fn(draft)]; case 1: _a.sent(); patches = { prev: [], next: [] }; to = (0, immer_1.finishDraft)(draft, function (next, prev) { return (patches = exports.Patch.toPatchSet(next, prev)); }); op = 'update'; return [2, { op: op, to: to, patches: patches }]; } }); }); }, apply: function (from, patches) { var changes = (Array.isArray(patches) ? patches : patches.next).map(toArrayPatch); return (0, immer_1.applyPatches)(from, changes); }, }; var isEmptyArray = function (input) { return (Array.isArray(input) ? input.length === 0 : true); }; var toArrayPatch = function (input) { var path = input.path.split('/').map(function (part) { var number = parseFloat(part); return isNaN(number) ? part : number; }); var op = input.op; var value = input.value; return { op: op, path: path, value: value }; }; var toPatch = function (input) { var hasForwardSlash = input.path.some(function (part) { return typeof part === 'string' ? part.includes('/') : false; }); if (hasForwardSlash) { var path = input.path .map(function (part) { return (typeof part === 'string' ? "'".concat(part, "'") : part); }) .join(','); var err = "Property names cannot contain the \"/\" character. op: '".concat(input.op, "' path: [").concat(path, "]"); throw new Error(err); } return tslib_1.__assign(tslib_1.__assign({}, input), { path: input.path.join('/') }); }; var toPatches = function (input) { var patches = Array.isArray(input) ? input : [input]; return patches.filter(function (p) { return Boolean(p); }).map(function (p) { return toPatch(p); }); };