jsoniq
Version:
JSONiq implementation for JavaScript
107 lines (105 loc) • 16.2 kB
JavaScript
"use strict";
/// <reference path="../../../typings/lodash/lodash.d.ts" />
var _ = require("lodash");
class IndexedDBCollection {
constructor(store, pul) {
if (store["autoIncrement"] === true) {
throw new Error("Auto-generated keys are not supported.");
}
this.name = store.name;
this.keyPath = store.keyPath;
this.pul = pul;
}
keyMustBeProvided() {
return !this.keyPath;
}
keyCannotBeProvided() {
return this.keyPath !== undefined;
}
//http://www.w3.org/TR/IndexedDB/#dfn-steps-for-extracting-a-key-from-a-value-using-a-key-path
//TODO: string[] type for keypath is not supported yet.
getKey(value, keyPath) {
if (!keyPath) {
keyPath = this.keyPath.split(".");
}
if (keyPath.length === 0) {
return value;
}
var current = keyPath[0];
var remaining = keyPath.slice(1);
if (current === "") {
return value;
}
if (!_.isObject(value)) {
return undefined;
}
return this.getKey(value[current], remaining);
}
getId(id, value) {
if (id && value && this.keyCannotBeProvided()) {
throw new Error("Key cannot be provided");
}
else if (!id && this.keyMustBeProvided()) {
throw new Error("Key must be provided");
}
if (!id && value) {
id = this.getKey(value);
if (id === undefined) {
throw new Error("Not key found for keyPath " + this.keyPath + " and object " + JSON.stringify(value));
}
}
if (!id && !value) {
throw new Error("At least the key or the value must be provided.");
}
return this.name + ":" + id;
}
insert(document, id) {
this.pul.insert(this.getId(id, document), document);
return this;
}
remove(id) {
this.pul.remove(this.getId(id));
return this;
}
insertIntoObject(id, ordPath, pairs) {
this.pul.insertIntoObject(this.getId(id), ordPath, pairs);
return this;
}
insertIntoArray(id, ordPath, position, items) {
this.pul.insertIntoArray(this.getId(id), ordPath, position, items);
return this;
}
deleteFromObject(id, ordPath, keys) {
this.pul.deleteFromObject(this.getId(id), ordPath, keys);
return this;
}
deleteFromArray(id, ordPath, position) {
this.pul.deleteFromArray(this.getId(id), ordPath, position);
return this;
}
replaceInArray(id, ordPath, position, item) {
this.pul.replaceInArray(this.getId(id), ordPath, position, item);
return this;
}
replaceInObject(id, ordPath, key, item) {
this.pul.renameInObject(this.getId(id), ordPath, key, item);
return this;
}
renameInObject(id, ordPath, key, newKey) {
this.pul.renameInObject(this.getId(id), ordPath, key, newKey);
return this;
}
reset() {
this.pul.udps.forEach((udp, udps, index) => {
if (index === 0) {
_.remove(udps, udp => {
var prefix = this.name + ":";
return udp.id.substring(0, prefix.length) === prefix;
});
}
});
return this;
}
}
exports.default = IndexedDBCollection;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zdG9yZXMvaW5kZXhlZGRiL0luZGV4ZWREQkNvbGxlY3Rpb24udHMiXSwibmFtZXMiOlsiSW5kZXhlZERCQ29sbGVjdGlvbiIsIkluZGV4ZWREQkNvbGxlY3Rpb24uY29uc3RydWN0b3IiLCJJbmRleGVkREJDb2xsZWN0aW9uLmtleU11c3RCZVByb3ZpZGVkIiwiSW5kZXhlZERCQ29sbGVjdGlvbi5rZXlDYW5ub3RCZVByb3ZpZGVkIiwiSW5kZXhlZERCQ29sbGVjdGlvbi5nZXRLZXkiLCJJbmRleGVkREJDb2xsZWN0aW9uLmdldElkIiwiSW5kZXhlZERCQ29sbGVjdGlvbi5pbnNlcnQiLCJJbmRleGVkREJDb2xsZWN0aW9uLnJlbW92ZSIsIkluZGV4ZWREQkNvbGxlY3Rpb24uaW5zZXJ0SW50b09iamVjdCIsIkluZGV4ZWREQkNvbGxlY3Rpb24uaW5zZXJ0SW50b0FycmF5IiwiSW5kZXhlZERCQ29sbGVjdGlvbi5kZWxldGVGcm9tT2JqZWN0IiwiSW5kZXhlZERCQ29sbGVjdGlvbi5kZWxldGVGcm9tQXJyYXkiLCJJbmRleGVkREJDb2xsZWN0aW9uLnJlcGxhY2VJbkFycmF5IiwiSW5kZXhlZERCQ29sbGVjdGlvbi5yZXBsYWNlSW5PYmplY3QiLCJJbmRleGVkREJDb2xsZWN0aW9uLnJlbmFtZUluT2JqZWN0IiwiSW5kZXhlZERCQ29sbGVjdGlvbi5yZXNldCJdLCJtYXBwaW5ncyI6IjtBQUFBLDREQUE0RDtBQUM1RCxJQUFZLENBQUMsV0FBTSxRQUFRLENBQUMsQ0FBQTtBQUs1QjtJQW9ESUEsWUFBWUEsS0FBcUJBLEVBQUVBLEdBQVFBO1FBQ3ZDQyxFQUFFQSxDQUFBQSxDQUFDQSxLQUFLQSxDQUFDQSxlQUFlQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUNqQ0EsTUFBTUEsSUFBSUEsS0FBS0EsQ0FBQ0Esd0NBQXdDQSxDQUFDQSxDQUFDQTtRQUM5REEsQ0FBQ0E7UUFDREEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0Es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QSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtRQUM1REEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7SUFDaEJBLENBQUNBO0lBRURiLGNBQWNBLENBQUNBLEVBQVVBLEVBQUVBLE9BQWlCQSxFQUFFQSxHQUFXQSxFQUFFQSxNQUFjQTtRQUNyRWMsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsT0FBT0EsRUFBRUEsR0FBR0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7UUFDOURBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0lBQ2hCQSxDQUFDQTtJQUVEZCxLQUFLQTtRQUNEZSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxJQUFJQSxFQUFFQSxLQUFLQTtZQUNuQ0EsRUFBRUEsQ0FBQUEsQ0FBQ0EsS0FBS0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7Z0JBQ2JBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLEVBQUVBLEdBQUdBO29CQUNkQSxJQUFJQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxHQUFHQSxDQUFDQTtvQkFDN0JBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLEVBQUVBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLE1BQU1BLENBQUNBO2dCQUN6REEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDUEEsQ0FBQ0E7UUFDTEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDSEEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7SUFDaEJBLENBQUNBO0FBQ0xmLENBQUNBO3NDQUFBIiwiZmlsZSI6ImxpYi9zdG9yZXMvaW5kZXhlZGRiL0luZGV4ZWREQkNvbGxlY3Rpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vdHlwaW5ncy9sb2Rhc2gvbG9kYXNoLmQudHNcIiAvPlxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XG5cbmltcG9ydCB7IElDb2xsZWN0aW9uIH0gZnJvbSBcIi4uL0lDb2xsZWN0aW9uXCI7XG5pbXBvcnQgUFVMIGZyb20gXCIuLi8uLi91cGRhdGVzL1BVTFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmRleGVkREJDb2xsZWN0aW9uIGltcGxlbWVudHMgSUNvbGxlY3Rpb24ge1xuXG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBrZXlQYXRoOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwdWw6IFBVTDtcblxuICAgIHByaXZhdGUga2V5TXVzdEJlUHJvdmlkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5rZXlQYXRoO1xuICAgIH1cblxuICAgIHByaXZhdGUga2V5Q2Fubm90QmVQcm92aWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5UGF0aCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vaHR0cDovL3d3dy53My5vcmcvVFIvSW5kZXhlZERCLyNkZm4tc3RlcHMtZm9yLWV4dHJhY3RpbmctYS1rZXktZnJvbS1hLXZhbHVlLXVzaW5nLWEta2V5LXBhdGhcbiAgICAvL1RPRE86IHN0cmluZ1tdIHR5cGUgZm9yIGtleXBhdGggaXMgbm90IHN1cHBvcnRlZCB5ZXQuXG4gICAgcHJpdmF0ZSBnZXRLZXkodmFsdWU6IGFueSwga2V5UGF0aD86IHN0cmluZ1tdKTogYW55IHtcbiAgICAgICAgaWYoIWtleVBhdGgpIHtcbiAgICAgICAgICAgIGtleVBhdGggPSB0aGlzLmtleVBhdGguc3BsaXQoXCIuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGtleVBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGN1cnJlbnQgPSBrZXlQYXRoWzBdO1xuICAgICAgICB2YXIgcmVtYWluaW5nID0ga2V5UGF0aC5zbGljZSgxKTtcbiAgICAgICAgaWYoY3VycmVudCA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmKCFfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRLZXkodmFsdWVbY3VycmVudF0sIHJlbWFpbmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJZChpZD86IHN0cmluZywgdmFsdWU/OiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBpZihpZCAmJiB2YWx1ZSAmJiB0aGlzLmtleUNhbm5vdEJlUHJvdmlkZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiS2V5IGNhbm5vdCBiZSBwcm92aWRlZFwiKTtcbiAgICAgICAgfSBlbHNlIGlmKCFpZCAmJiB0aGlzLmtleU11c3RCZVByb3ZpZGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIktleSBtdXN0IGJlIHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmKCFpZCAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgaWQgPSB0aGlzLmdldEtleSh2YWx1ZSk7XG4gICAgICAgICAgICBpZihpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGtleSBmb3VuZCBmb3Iga2V5UGF0aCBcIiArIHRoaXMua2V5UGF0aCArIFwiIGFuZCBvYmplY3QgXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKCFpZCAmJiAhdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IHRoZSBrZXkgb3IgdGhlIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyBcIjpcIiArIGlkO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHN0b3JlOiBJREJPYmplY3RTdG9yZSwgcHVsOiBQVUwpIHtcbiAgICAgICAgaWYoc3RvcmVbXCJhdXRvSW5jcmVtZW50XCJdID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvLWdlbmVyYXRlZCBrZXlzIGFyZSBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5hbWUgPSBzdG9yZS5uYW1lO1xuICAgICAgICB0aGlzLmtleVBhdGggPSBzdG9yZS5rZXlQYXRoO1xuICAgICAgICB0aGlzLnB1bCA9IHB1bDtcbiAgICB9XG5cbiAgICBpbnNlcnQoZG9jdW1lbnQ6IGFueSwgaWQ/OiBzdHJpbmcpOiBJQ29sbGVjdGlvbiB7XG4gICAgICAgIHRoaXMucHVsLmluc2VydCh0aGlzLmdldElkKGlkLCBkb2N1bWVudCksIGRvY3VtZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVtb3ZlKGlkOiBzdHJpbmcpOiBJQ29sbGVjdGlvbiB7XG4gICAgICAgIHRoaXMucHVsLnJlbW92ZSh0aGlzLmdldElkKGlkKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGluc2VydEludG9PYmplY3QoaWQ6IHN0cmluZywgb3JkUGF0aDogc3RyaW5nW10sIHBhaXJzOiB7fSk6IElDb2xsZWN0aW9uIHtcbiAgICAgICAgdGhpcy5wdWwuaW5zZXJ0SW50b09iamVjdCh0aGlzLmdldElkKGlkKSwgb3JkUGF0aCwgcGFpcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpbnNlcnRJbnRvQXJyYXkoaWQ6IHN0cmluZywgb3JkUGF0aDogc3RyaW5nW10sIHBvc2l0aW9uOiBudW1iZXIsIGl0ZW1zOiBhbnlbXSk6IElDb2xsZWN0aW9uIHtcbiAgICAgICAgdGhpcy5wdWwuaW5zZXJ0SW50b0FycmF5KHRoaXMuZ2V0SWQoaWQpLCBvcmRQYXRoLCBwb3NpdGlvbiwgaXRlbXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBkZWxldGVGcm9tT2JqZWN0KGlkOiBzdHJpbmcsIG9yZFBhdGg6IHN0cmluZ1tdLCBrZXlzOiBBcnJheTxzdHJpbmc+KTogSUNvbGxlY3Rpb24ge1xuICAgICAgICB0aGlzLnB1bC5kZWxldGVGcm9tT2JqZWN0KHRoaXMuZ2V0SWQoaWQpLCBvcmRQYXRoLCBrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZGVsZXRlRnJvbUFycmF5KGlkOiBzdHJpbmcsIG9yZFBhdGg6IHN0cmluZ1tdLCBwb3NpdGlvbjogbnVtYmVyKTogSUNvbGxlY3Rpb24ge1xuICAgICAgICB0aGlzLnB1bC5kZWxldGVGcm9tQXJyYXkodGhpcy5nZXRJZChpZCksIG9yZFBhdGgsIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVwbGFjZUluQXJyYXkoaWQ6IHN0cmluZywgb3JkUGF0aDogc3RyaW5nW10sIHBvc2l0aW9uOiBudW1iZXIsIGl0ZW06IGFueSk6IElDb2xsZWN0aW9uIHtcbiAgICAgICAgdGhpcy5wdWwucmVwbGFjZUluQXJyYXkodGhpcy5nZXRJZChpZCksIG9yZFBhdGgsIHBvc2l0aW9uLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVwbGFjZUluT2JqZWN0KGlkOiBzdHJpbmcsIG9yZFBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbTogYW55KTogSUNvbGxlY3Rpb24ge1xuICAgICAgICB0aGlzLnB1bC5yZW5hbWVJbk9iamVjdCh0aGlzLmdldElkKGlkKSwgb3JkUGF0aCwga2V5LCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVuYW1lSW5PYmplY3QoaWQ6IHN0cmluZywgb3JkUGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBuZXdLZXk6IHN0cmluZyk6IElDb2xsZWN0aW9uIHtcbiAgICAgICAgdGhpcy5wdWwucmVuYW1lSW5PYmplY3QodGhpcy5nZXRJZChpZCksIG9yZFBhdGgsIGtleSwgbmV3S2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVzZXQoKTogSUNvbGxlY3Rpb24ge1xuICAgICAgICB0aGlzLnB1bC51ZHBzLmZvckVhY2goKHVkcCwgdWRwcywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgXy5yZW1vdmUodWRwcywgdWRwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMubmFtZSArIFwiOlwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWRwLmlkLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9