@platform/state
Version:
A small, simple, strongly typed, [rx/observable] state-machine.
88 lines (87 loc) • 3.64 kB
JavaScript
;
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); });
};