@c11/engine.db
Version:
The engine db
265 lines • 20.6 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var isEqual_1 = __importDefault(require("lodash/isEqual"));
var flatten_1 = __importDefault(require("lodash/flatten"));
var isNumber_1 = __importDefault(require("lodash/isNumber"));
var isArray_1 = __importDefault(require("lodash/isArray"));
var isPlainObject_1 = __importDefault(require("lodash/isPlainObject"));
var merge_1 = __importDefault(require("lodash/merge"));
var splitPath_1 = __importDefault(require("./splitPath"));
var clone_1 = __importDefault(require("../fn/clone"));
var triggerListener_1 = require("./triggerListener");
var pathTriggers_1 = __importDefault(require("./pathTriggers"));
var engine_types_1 = require("@c11/engine.types");
var isWildcardPath_1 = require("./isWildcardPath");
var triggerWildcardFn_1 = require("./triggerWildcardFn");
function clearDynamic(cachePaths, cacheDynamic, decomposed, staticDeps, path) {
var staticDepList = staticDeps[path];
if (staticDepList) {
var cacheDynamicList = void 0;
var decomposedList = void 0;
var k = void 0;
var p = void 0;
var dep = void 0;
k = staticDepList.length;
while (k--) {
dep = staticDepList[k];
cacheDynamicList = cacheDynamic[dep];
if (cacheDynamicList) {
p = cacheDynamicList.length;
while (p--) {
delete cachePaths[cacheDynamicList[p]];
}
}
decomposedList = decomposed[dep];
p = decomposedList.length;
while (p--) {
delete cachePaths[decomposedList[p]];
}
}
}
}
function clearCacheRecursive(cachePaths, cacheDynamic, decomposed, staticDeps, path, obj) {
var k = Object.keys(cachePaths);
var i = k.length;
var len = path.length;
var prop;
var str;
while (i--) {
prop = k[i];
str = prop.slice(0, len);
if (str === path) {
delete cachePaths[prop];
clearDynamic(cachePaths, cacheDynamic, decomposed, staticDeps, prop);
}
}
}
function applyPatch(db, patch, shouldClone) {
var i, x, parts, len, j, lenj, obj, part, last, to, found, temp, from, lastFrom;
var revert;
var changed = {
full: [],
partial: [],
};
var isTest;
var fullPath;
var cachePaths = db.cache.paths;
var decomposed = db.dynamic.decomposed;
var cacheDynamic = db.cache.dynamic;
var staticDeps = db.dynamic.staticDeps;
root: for (i = 0, len = patch.length; i < len; i += 1) {
var path = "";
var xPath = void 0;
var xValue = void 0;
var objIsArray = false;
var fromIsArray = false;
x = patch[i];
xPath = x.path;
xValue = x.value;
// @TODO: Add test/move/copy cases for deleting cache
delete cachePaths[xPath];
clearCacheRecursive(cachePaths, cacheDynamic, decomposed, staticDeps, xPath, xValue);
clearDynamic(cachePaths, cacheDynamic, decomposed, staticDeps, xPath);
// @TODO: Implement both path && from in a function
parts = (0, splitPath_1.default)(xPath);
obj = db.static;
var prevState = void 0;
var prevPart = void 0;
for (j = 0, lenj = parts.length - 1; j < lenj; j += 1) {
part = parts[j];
path += "/" + part;
var initialState = obj;
if (!obj[part] && x.op === "add") {
if (!(0, isPlainObject_1.default)(obj)) {
prevState[prevPart] = {};
obj = prevState[prevPart];
}
obj[part] = {};
obj = obj[part];
}
else {
obj = obj[part];
if (!obj && x.op === "remove") {
continue root;
}
else if (!obj) {
revert = i;
break root;
}
}
prevState = initialState;
prevPart = part;
delete cachePaths[path];
clearDynamic(cachePaths, cacheDynamic, decomposed, staticDeps, path);
}
last = parts[parts.length - 1];
if (x.op === "move" || x.op === "copy") {
parts = (0, splitPath_1.default)(x.from);
from = db.static;
for (j = 0, lenj = parts.length - 1; j < lenj; j += 1) {
if (from[parts[j]]) {
from = from[parts[j]];
}
else {
revert = i;
break;
}
}
lastFrom = parts[parts.length - 1];
}
if ((0, isArray_1.default)(obj)) {
objIsArray = true;
if (last === "-") {
last = obj.length;
}
else if (!(0, isNumber_1.default)(last)) {
// Must be a number, else what's the point in
// trying to cast it to one?
var initial = last;
last = parseInt(last, 10);
if (isNaN(last) || initial.toString() !== last.toString()) {
revert = i;
break root;
}
}
if (last > obj.length || last < 0) {
revert = i;
break root;
}
}
if ((0, isArray_1.default)(from)) {
fromIsArray = true;
if (lastFrom === "-") {
lastFrom = from.length - 1;
}
else if (!(0, isNumber_1.default)(lastFrom)) {
// Must be a number, else what's the point in
// trying to cast it to one?
var initial = lastFrom;
lastFrom = parseInt(lastFrom, 10);
if (isNaN(lastFrom) || initial.toString() !== lastFrom.toString()) {
revert = i;
break root;
}
}
if (lastFrom > from.length || lastFrom < 0) {
revert = i;
break root;
}
}
switch (x.op) {
case "add":
case "replace":
if (objIsArray) {
obj.splice(last, 0, shouldClone ? (0, clone_1.default)(xValue) : xValue);
}
else if ((0, isPlainObject_1.default)(obj)) {
obj[last] = shouldClone ? (0, clone_1.default)(xValue) : xValue;
}
else {
prevState[prevPart] = {};
obj = prevState[prevPart];
obj[last] = shouldClone ? (0, clone_1.default)(xValue) : xValue;
}
break;
case "remove":
if (objIsArray) {
obj.splice(last, 1);
}
else if (obj) {
delete obj[last];
}
break;
case "copy":
case "move":
temp = from[lastFrom];
if (x.op === "move") {
delete from[lastFrom];
}
else if ((0, isPlainObject_1.default)(temp)) {
temp = (0, clone_1.default)(temp);
}
obj[last] = temp;
break;
case "test":
if (!(0, isEqual_1.default)(obj[last], xValue)) {
revert = i;
break root;
}
break;
case "merge":
if (!(0, isPlainObject_1.default)(obj[last])) {
revert = i;
break root;
}
if (last === "__proto__" || last === "constructor") {
console.error("Possible prototype pollution during a merge operation. Found: ".concat(last, ". Merge not applied."));
}
else {
obj[last] = (0, merge_1.default)(obj[last], xValue);
}
break;
}
}
if (revert !== undefined) {
// @TODO: Revert all changes done up until revertIndex
}
var trigger = [];
patch.forEach(function (x) {
//@ts-ignore
trigger = trigger.concat((0, pathTriggers_1.default)(db, x.path, x.value));
});
trigger = (0, flatten_1.default)(trigger);
var fns = trigger.reduce(function (acc, x) {
var fns = db.updates.fns[x];
if (fns) {
Object.keys(fns).forEach(function (y) {
var _a, _b;
if (!acc[y] && ((_b = (_a = fns[y]) === null || _a === void 0 ? void 0 : _a.refinee) === null || _b === void 0 ? void 0 : _b.type) !== engine_types_1.AccessMethods.isObserved) {
acc[y] = {
path: x,
fn: fns[y],
};
}
});
}
return acc;
}, {});
Object.keys(fns).forEach(function (x) {
if ((0, isWildcardPath_1.isWildcardPath)(fns[x].path)) {
(0, triggerWildcardFn_1.triggerWildcardFn)(db, fns[x].path, x, patch);
}
else {
(0, triggerListener_1.triggerListenerFn)(db, fns[x].path, x, patch);
}
});
return {
revert: revert,
changed: changed,
};
}
exports.default = applyPatch;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHlQYXRjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mbi9hcHBseVBhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMkRBQXFDO0FBQ3JDLDJEQUFxQztBQUNyQyw2REFBdUM7QUFDdkMsMkRBQXFDO0FBQ3JDLHVFQUFpRDtBQUNqRCx1REFBaUM7QUFDakMsMERBQW9DO0FBRXBDLHNEQUFnQztBQUNoQyxxREFBc0Q7QUFDdEQsZ0VBQTBDO0FBQzFDLGtEQUFrRDtBQUNsRCxtREFBa0Q7QUFDbEQseURBQXdEO0FBRXhELFNBQVMsWUFBWSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJO0lBQzFFLElBQUksYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxJQUFJLGFBQWEsRUFBRTtRQUNqQixJQUFJLGdCQUFnQixTQUFBLENBQUM7UUFDckIsSUFBSSxjQUFjLFNBQUEsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBQSxDQUFDO1FBQ04sSUFBSSxDQUFDLFNBQUEsQ0FBQztRQUNOLElBQUksR0FBRyxTQUFBLENBQUM7UUFDUixDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUV6QixPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ1YsR0FBRyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV2QixnQkFBZ0IsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDcEIsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztnQkFDNUIsT0FBTyxDQUFDLEVBQUUsRUFBRTtvQkFDVixPQUFPLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4QzthQUNGO1lBRUQsY0FBYyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxDQUFD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
;