tedb
Version:
TypeScript Embedded Database
236 lines • 6.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
// All update operators
const tedb_utils_1 = require("tedb-utils");
/**
* Method used by all update operators except $rename
* to updated nested object values by use of a string - `"nested.doc.key"`
*
* Examples:
* ~~~
* let obj = {nested: {doc: {key: 1}}};
*
* operate(obj, "nested.doc.key", 2, "set");
* // obj = {nested: {doc: {key: 2}}}
*
* operate(obj, "nested.doc.key", -1, "inc");
* // obj = {nested: {doc: {key: 1}}}
*
* operate(obj, "nested.doc.key", 3, "mul");
* // obj = {nested: {doc: {key: 3}}}
*
* operate(obj, "nested.doc.key", "", "unset");
* // obj = {nested: {doc: {}}}
* ~~~
* @param obj - object to update
* @param is - "string.location"
* @param value - input
* @param type - operator type `string`
* @returns {any}
*/
const operate = (obj, is, value, type) => {
if (typeof is === "string") {
return operate(obj, is.split("."), value, type);
}
else if ((is.length === 1) && (value !== undefined)) {
switch (type) {
case "set":
return obj[is[0]] = value;
case "mul":
return obj[is[0]] = obj[is[0]] * value;
case "inc":
return obj[is[0]] = obj[is[0]] + value;
case "unset":
return delete obj[is[0]];
}
}
else if (is.length === 0) {
return obj;
}
else {
return operate(obj[is[0]], is.slice(1), value, type);
}
};
/**
* Replace a value
*
* Example:
* ~~~
* let obj = {nested: {layer1: {}}};
* $set(obj, {"nexted.layer1.newSet": "value"})
* .then((res) => console.log(res)) // {nested: {layer: {newSet: "value"}}}
* .catch();
* ~~~
* @param obj
* @param set
* @returns {Promise<T>}
*/
exports.$set = (obj, set) => {
return new Promise((resolve, reject) => {
if (tedb_utils_1.isEmpty(set)) {
return reject(new Error("Empty $set object"));
}
const returnObj = obj;
const setKeys = Object.keys(set);
try {
setKeys.forEach((path) => {
operate(returnObj, path, set[path], "set");
});
resolve(returnObj);
}
catch (e) {
return reject(e);
}
});
};
/**
* Multiply a value
*
* Example:
* ~~~
* let obj = {nested: {num: 2}};
* $mul(obj, {"nested.num": 3})
* .then((res) => console.log(res)) // {nested: {num: 6}}
* .catch();
* ~~~
* @param obj
* @param mul
* @returns {Promise<T>}
*/
exports.$mul = (obj, mul) => {
return new Promise((resolve, reject) => {
if (tedb_utils_1.isEmpty(mul)) {
return reject(new Error("Empty $mul object"));
}
const returnObj = obj;
const mulKeys = Object.keys(mul);
try {
mulKeys.forEach((path) => operate(returnObj, path, mul[path], "mul"));
resolve(returnObj);
}
catch (e) {
return reject(e);
}
});
};
/**
* Increment a value or subtract from a value.
*
* Example:
* ~~~
* let obj = {nested: {num: 1}};
* $inc(obj, {"nested.num": -1})
* .then((res) => console.log(res)) // {nested: {num: 0}}
* .catch();
* ~~~
* @param obj
* @param inc
* @returns {Promise<T>}
*/
exports.$inc = (obj, inc) => {
return new Promise((resolve, reject) => {
if (tedb_utils_1.isEmpty(inc)) {
return reject(new Error("Empty $inc object"));
}
const returnObj = obj;
const incKeys = Object.keys(inc);
try {
incKeys.forEach((path) => operate(returnObj, path, inc[path], "inc"));
resolve(returnObj);
}
catch (e) {
return reject(e);
}
});
};
/**
* Remove key/value
*
* Example:
* ~~~
* let obj = {nested: {v: "value}};
* $unset(obj, {"nested.v": ""})
* .then((res) => console.log(res)) // {nested: {}}
* .catch();
* ~~~
* @param obj
* @param unset
* @returns {Promise<T>}
*/
exports.$unset = (obj, unset) => {
return new Promise((resolve, reject) => {
if (tedb_utils_1.isEmpty(unset)) {
return reject(new Error("Empty $unset object"));
}
const returnObj = obj;
const unsetKeys = Object.keys(unset);
try {
unsetKeys.forEach((path) => operate(returnObj, path, unset[path], "unset"));
resolve(returnObj);
}
catch (e) {
return reject(e);
}
});
};
/**
* Rename a key
*
* Example:
* ~~~
* let obj = {nested: {v: "value"}};
* $rename(obj, {"nested.v": "key"})
* .then((res) => console.log(res)) // {nested: {key: "value"}}
* .catch();
* ~~~
* @param obj
* @param rename
* @returns {Promise<T>}
*/
exports.$rename = (obj, rename) => {
return new Promise((resolve, reject) => {
if (tedb_utils_1.isEmpty(rename)) {
return reject(new Error("Empty $rename object"));
}
const returnObj = obj;
const renameKeys = Object.keys(rename);
try {
renameKeys.forEach((path) => {
let keyValue;
// Delete the key but save the value
const del = (thisObject, is, value) => {
if (typeof is === "string") {
return del(thisObject, is.split("."), value);
}
else if ((is.length === 1) && (value !== undefined)) {
keyValue = thisObject[is[0]];
return delete thisObject[is[0]];
}
else if (is.length === 0) {
return thisObject;
}
else {
return del(thisObject[is[0]], is.slice(1), value);
}
};
del(returnObj, path, rename[path]);
if (keyValue) {
const splitPath = path.split(".");
splitPath.pop();
splitPath.push(rename[path]);
const newPath = splitPath.join(".").toString();
// then set new key/value
operate(returnObj, newPath, keyValue, "set");
}
else {
return reject(new Error("Value to rename was not found"));
}
});
resolve(returnObj);
}
catch (e) {
return reject(e);
}
});
};
//# sourceMappingURL=updateOperators.js.map