UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

120 lines 16.4 kB
// Declare the TypeScript for Declaration Merging // https://www.typescriptlang.org/docs/handbook/declaration-merging.html // Start the javascript type patching if (Array.prototype.diff == null) { Array.prototype.diff = function (a) { return this.filter(function (i) { return !(a.indexOf(i) > -1); }); }; } if (Array.prototype.intersect == null) { Array.prototype.intersect = function (a) { return this.filter(function (i) { return (a.indexOf(i) > -1); }); }; } if (Array.prototype.remove == null) { Array.prototype.remove = function (objectOrArray) { if (objectOrArray == null) return this; if (objectOrArray instanceof Array) { return this.diff(objectOrArray); } else { let index = this.indexOf(objectOrArray); if (index !== -1) this.splice(index, 1); return this; } }; } if (Array.prototype.add == null) { Array.prototype.add = function (objectOrArray) { if (objectOrArray == null) return this; // If for some reasons they are trying to add us to our self, throw an exception. if (objectOrArray === this) throw new Error("Array.add, I was passed myself, i can't add my self to myself."); if (objectOrArray instanceof Array) { for (let i = 0; i < objectOrArray.length; ++i) this.push(objectOrArray[i]); return this; } this.push(objectOrArray); return this; }; } if (Array.prototype.equals == null) { Array.prototype.equals = function (array) { // if the other array is a false value, return if (array == null) return false; // compare object instances if (this === array) return true; // compare lengths - can save a lot of time if (this.length !== array.length) return false; for (let i = 0; i < this.length; i++) { // Check if we have nested arrays if (this[i] instanceof Array && array[i] instanceof Array) { // recurse into the nested arrays if (!this[i].compare(array[i])) return false; } else if (this[i] !== array[i]) { // Warning - two different object instances will never be equal: {x:20} != // {x:20} return false; } } return true; }; } if (Array.prototype.bubbleSort == null) { Array.prototype.bubbleSort = function (compFunc) { let self = this; function merge(left, right) { let result = []; while (left.length && right.length) { if (compFunc(left[0], right[0]) <= 0) { result.push(left.shift()); } else { result.push(right.shift()); } } while (left.length) result.push(left.shift()); while (right.length) result.push(right.shift()); return result; } if (self.length < 2) return self.slice(0, self.length); let middle = parseInt((self.length / 2).toString()); let left = self.slice(0, middle); let right = self.slice(middle, self.length); return merge(left.bubbleSort(compFunc), right.bubbleSort(compFunc)); }; } // ============================================================================ // Array.indexOf prptotype function // Add if this browser (STUPID IE) doesn't support it if (Array.prototype.indexOf == null) { Array.prototype.indexOf = function (item) { let len = this.length >>> 0; let from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (from in this && this[from] === item) return from; } return -1; }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbEFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZvcnRleC9VdGlsQXJyYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaURBQWlEO0FBQ2pELHdFQUF3RTtBQWV4RSxxQ0FBcUM7QUFFckMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7SUFDOUIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFhO1FBQzFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQU07WUFDL0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQy9CLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFBO0NBQ0o7QUFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtJQUNuQyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQWE7UUFDL0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUMxQixPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFBO0NBQ0o7QUFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtJQUNoQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLGFBQStCO1FBQzlELElBQUksYUFBYSxJQUFJLElBQUk7WUFDckIsT0FBTyxJQUFJLENBQUE7UUFFZixJQUFJLGFBQWEsWUFBWSxLQUFLLEVBQUU7WUFDaEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1NBRWxDO2FBQ0k7WUFD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TUFBTSxLQUFLLENBQUMsQ0FBQTtRQUUzQixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3BDLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0RCxJQUFJLElBQUksR0FBRyxDQUFDO1lBQ1IsSUFBSSxJQUFJLEdBQUcsQ0FBQTtRQUVmLE9BQU8sSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN2QixJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUk7Z0JBQ25DLE9BQU8sSUFBSSxDQUFBO1NBQ2xCO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUNiLENBQUMsQ0FBQTtDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRGVjbGFyZSB0aGUgVHlwZVNjcmlwdCBmb3IgRGVjbGFyYXRpb24gTWVyZ2luZ1xuLy8gaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svZGVjbGFyYXRpb24tbWVyZ2luZy5odG1sXG5cbmludGVyZmFjZSBBcnJheTxUPiB7XG4gICAgZGlmZihhOiBBcnJheTxUPik6IEFycmF5PFQ+O1xuICAgIGludGVyc2VjdChhOiBBcnJheTxUPik6IEFycmF5PFQ+O1xuICAgIHJlbW92ZShhOiBBcnJheTxUPiB8IFQpOiBBcnJheTxUPjtcbiAgICBhZGQoYTogQXJyYXk8VD4gfCBUKTogQXJyYXk8VD47XG4gICAgZXF1YWxzKGFycmF5OiBBcnJheTxUPiB8IG51bGwpOiBib29sZWFuO1xuICAgIGJ1YmJsZVNvcnQoY29tcEZ1bmM6IChcbiAgICAgICAgbGVmdDogVCxcbiAgICAgICAgcmlnaHQ6IFRcbiAgICApID0+IG51bWJlcik6IEFycmF5PFQ+O1xuICAgIGluZGV4T2YoaXRlbTogVCk6IG51bWJlcjtcbn1cblxuLy8gU3RhcnQgdGhlIGphdmFzY3JpcHQgdHlwZSBwYXRjaGluZ1xuXG5pZiAoQXJyYXkucHJvdG90eXBlLmRpZmYgPT0gbnVsbCkge1xuICAgIEFycmF5LnByb3RvdHlwZS5kaWZmID0gZnVuY3Rpb24gKGE6IEFycmF5PGFueT4pOiBBcnJheTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChpOiBhbnkpIHtcbiAgICAgICAgICAgIHJldHVybiAhKGEuaW5kZXhPZihpKSA+IC0xKVxuICAgICAgICB9KVxuICAgIH1cbn1cblxuaWYgKEFycmF5LnByb3RvdHlwZS5pbnRlcnNlY3QgPT0gbnVsbCkge1xuICAgIEFycmF5LnByb3RvdHlwZS5pbnRlcnNlY3QgPSBmdW5jdGlvbiAoYTogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiAoYS5pbmRleE9mKGkpID4gLTEpXG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5pZiAoQXJyYXkucHJvdG90eXBlLnJlbW92ZSA9PSBudWxsKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmplY3RPckFycmF5OiBBcnJheTxhbnk+IHwgYW55KTogQXJyYXk8YW55PiB7XG4gICAgICAgIGlmIChvYmplY3RPckFycmF5ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICBcbiAgICAgICAgaWYgKG9iamVjdE9yQXJyYXkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlmZihvYmplY3RPckFycmF5KVxuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmluZGV4T2Yob2JqZWN0T3JBcnJheSlcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG4gICAgfVxufVxuXG5pZiAoQXJyYXkucHJvdG90eXBlLmFkZCA9PSBudWxsKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChvYmplY3RPckFycmF5OiBBcnJheTxhbnk+IHwgYW55KTogQXJyYXk8YW55PiB7XG4gICAgICAgIGlmIChvYmplY3RPckFycmF5ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgZm9yIHNvbWUgcmVhc29ucyB0aGV5IGFyZSB0cnlpbmcgdG8gYWRkIHVzIHRvIG91ciBzZWxmLCB0aHJvdyBhbiBleGNlcHRpb24uXG4gICAgICAgIGlmIChvYmplY3RPckFycmF5ID09PSB0aGlzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJyYXkuYWRkLCBJIHdhcyBwYXNzZWQgbXlzZWxmLCBpIGNhbid0IGFkZCBteSBzZWxmIHRvIG15c2VsZi5cIilcbiAgICAgICAgXG4gICAgICAgIGlmIChvYmplY3RPckFycmF5IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0T3JBcnJheS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2gob2JqZWN0T3JBcnJheVtpXSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMucHVzaChvYmplY3RPckFycmF5KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cblxuaWYgKEFycmF5LnByb3RvdHlwZS5lcXVhbHMgPT0gbnVsbCkge1xuICAgIEFycmF5LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAoYXJyYXk6IEFycmF5PGFueT4gfCBudWxsKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIHRoZSBvdGhlciBhcnJheSBpcyBhIGZhbHNlIHZhbHVlLCByZXR1cm5cbiAgICAgICAgaWYgKGFycmF5ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgXG4gICAgICAgIC8vIGNvbXBhcmUgb2JqZWN0IGluc3RhbmNlc1xuICAgICAgICBpZiAodGhpcyA9PT0gYXJyYXkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICBcbiAgICAgICAgLy8gY29tcGFyZSBsZW5ndGhzIC0gY2FuIHNhdmUgYSBsb3Qgb2YgdGltZVxuICAgICAgICBpZiAodGhpcy5sZW5ndGggIT09IGFycmF5Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICBcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICAgIGlmICh0aGlzW2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgYXJyYXlbaV0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgICAgICAgIGlmICghdGhpc1tpXS5jb21wYXJlKGFycmF5W2ldKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzW2ldICE9PSBhcnJheVtpXSkge1xuICAgICAgICAgICAgICAgIC8vIFdhcm5pbmcgLSB0d28gZGlmZmVyZW50IG9iamVjdCBpbnN0YW5jZXMgd2lsbCBuZXZlciBiZSBlcXVhbDoge3g6MjB9ICE9XG4gICAgICAgICAgICAgICAgLy8ge3g6MjB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG59XG5cbmlmIChBcnJheS5wcm90b3R5cGUuYnViYmxlU29ydCA9PSBudWxsKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmJ1YmJsZVNvcnQgPSBmdW5jdGlvbiAoY29tcEZ1bmM6IChcbiAgICAgICAgbGVmdDogYW55LFxuICAgICAgICByaWdodDogYW55XG4gICAgKSA9PiBudW1iZXIpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzXG4gICAgICAgIFxuICAgICAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBbXVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB3aGlsZSAobGVmdC5sZW5ndGggJiYgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBGdW5jKGxlZnRbMF0sIHJpZ2h0WzBdKSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB3aGlsZSAobGVmdC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGVmdC5zaGlmdCgpKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB3aGlsZSAocmlnaHQubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHNlbGYubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnNsaWNlKDAsIHNlbGYubGVuZ3RoKVxuICAgICAgICBcbiAgICAgICAgbGV0IG1pZGRsZSA9IHBhcnNlSW50KChzZWxmLmxlbmd0aCAvIDIpLnRvU3RyaW5nKCkpXG4gICAgICAgIGxldCBsZWZ0ID0gc2VsZi5zbGljZSgwLCBtaWRkbGUpXG4gICAgICAgIGxldCByaWdodCA9IHNlbGYuc2xpY2UobWlkZGxlLCBzZWxmLmxlbmd0aClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBtZXJnZShsZWZ0LmJ1YmJsZVNvcnQoY29tcEZ1bmMpLCByaWdodC5idWJibGVTb3J0KGNvbXBGdW5jKSlcbiAgICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFycmF5LmluZGV4T2YgcHJwdG90eXBlIGZ1bmN0aW9uXG4vLyBBZGQgaWYgdGhpcyBicm93c2VyIChTVFVQSUQgSUUpIGRvZXNuJ3Qgc3VwcG9ydCBpdFxuXG5pZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT0gbnVsbCkge1xuICAgIEFycmF5LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gKGl0ZW06IGFueSk6IG51bWJlciB7XG4gICAgICAgIGxldCBsZW4gPSB0aGlzLmxlbmd0aCA+Pj4gMFxuICAgICAgICBcbiAgICAgICAgbGV0IGZyb20gPSBOdW1iZXIoYXJndW1lbnRzWzFdKSB8fCAwXG4gICAgICAgIGZyb20gPSAoZnJvbSA8IDApID8gTWF0aC5jZWlsKGZyb20pIDogTWF0aC5mbG9vcihmcm9tKVxuICAgICAgICBpZiAoZnJvbSA8IDApXG4gICAgICAgICAgICBmcm9tICs9IGxlblxuICAgICAgICBcbiAgICAgICAgZm9yICg7IGZyb20gPCBsZW47IGZyb20rKykge1xuICAgICAgICAgICAgaWYgKGZyb20gaW4gdGhpcyAmJiB0aGlzW2Zyb21dID09PSBpdGVtKVxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xXG4gICAgfVxufVxuIl19