172 lines
5.2 KiB
JavaScript
172 lines
5.2 KiB
JavaScript
/*!
|
|
* https://github.com/Starcounter-Jack/JSON-Patch
|
|
* (c) 2017-2022 Joachim Wester
|
|
* MIT licensed
|
|
*/
|
|
var __extends = (this && this.__extends) || (function () {
|
|
var extendStatics = function (d, b) {
|
|
extendStatics = Object.setPrototypeOf ||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
return extendStatics(d, b);
|
|
};
|
|
return function (d, b) {
|
|
extendStatics(d, b);
|
|
function __() { this.constructor = d; }
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
};
|
|
})();
|
|
var _hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
export function hasOwnProperty(obj, key) {
|
|
return _hasOwnProperty.call(obj, key);
|
|
}
|
|
export function _objectKeys(obj) {
|
|
if (Array.isArray(obj)) {
|
|
var keys_1 = new Array(obj.length);
|
|
for (var k = 0; k < keys_1.length; k++) {
|
|
keys_1[k] = "" + k;
|
|
}
|
|
return keys_1;
|
|
}
|
|
if (Object.keys) {
|
|
return Object.keys(obj);
|
|
}
|
|
var keys = [];
|
|
for (var i in obj) {
|
|
if (hasOwnProperty(obj, i)) {
|
|
keys.push(i);
|
|
}
|
|
}
|
|
return keys;
|
|
}
|
|
;
|
|
/**
|
|
* Deeply clone the object.
|
|
* https://jsperf.com/deep-copy-vs-json-stringify-json-parse/25 (recursiveDeepCopy)
|
|
* @param {any} obj value to clone
|
|
* @return {any} cloned obj
|
|
*/
|
|
export function _deepClone(obj) {
|
|
switch (typeof obj) {
|
|
case "object":
|
|
return JSON.parse(JSON.stringify(obj)); //Faster than ES5 clone - http://jsperf.com/deep-cloning-of-objects/5
|
|
case "undefined":
|
|
return null; //this is how JSON.stringify behaves for array items
|
|
default:
|
|
return obj; //no need to clone primitives
|
|
}
|
|
}
|
|
//3x faster than cached /^\d+$/.test(str)
|
|
export function isInteger(str) {
|
|
var i = 0;
|
|
var len = str.length;
|
|
var charCode;
|
|
while (i < len) {
|
|
charCode = str.charCodeAt(i);
|
|
if (charCode >= 48 && charCode <= 57) {
|
|
i++;
|
|
continue;
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* Escapes a json pointer path
|
|
* @param path The raw pointer
|
|
* @return the Escaped path
|
|
*/
|
|
export function escapePathComponent(path) {
|
|
if (path.indexOf('/') === -1 && path.indexOf('~') === -1)
|
|
return path;
|
|
return path.replace(/~/g, '~0').replace(/\//g, '~1');
|
|
}
|
|
/**
|
|
* Unescapes a json pointer path
|
|
* @param path The escaped pointer
|
|
* @return The unescaped path
|
|
*/
|
|
export function unescapePathComponent(path) {
|
|
return path.replace(/~1/g, '/').replace(/~0/g, '~');
|
|
}
|
|
export function _getPathRecursive(root, obj) {
|
|
var found;
|
|
for (var key in root) {
|
|
if (hasOwnProperty(root, key)) {
|
|
if (root[key] === obj) {
|
|
return escapePathComponent(key) + '/';
|
|
}
|
|
else if (typeof root[key] === 'object') {
|
|
found = _getPathRecursive(root[key], obj);
|
|
if (found != '') {
|
|
return escapePathComponent(key) + '/' + found;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
export function getPath(root, obj) {
|
|
if (root === obj) {
|
|
return '/';
|
|
}
|
|
var path = _getPathRecursive(root, obj);
|
|
if (path === '') {
|
|
throw new Error("Object not found in root");
|
|
}
|
|
return "/" + path;
|
|
}
|
|
/**
|
|
* Recursively checks whether an object has any undefined values inside.
|
|
*/
|
|
export function hasUndefined(obj) {
|
|
if (obj === undefined) {
|
|
return true;
|
|
}
|
|
if (obj) {
|
|
if (Array.isArray(obj)) {
|
|
for (var i_1 = 0, len = obj.length; i_1 < len; i_1++) {
|
|
if (hasUndefined(obj[i_1])) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
else if (typeof obj === "object") {
|
|
var objKeys = _objectKeys(obj);
|
|
var objKeysLength = objKeys.length;
|
|
for (var i = 0; i < objKeysLength; i++) {
|
|
if (hasUndefined(obj[objKeys[i]])) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function patchErrorMessageFormatter(message, args) {
|
|
var messageParts = [message];
|
|
for (var key in args) {
|
|
var value = typeof args[key] === 'object' ? JSON.stringify(args[key], null, 2) : args[key]; // pretty print
|
|
if (typeof value !== 'undefined') {
|
|
messageParts.push(key + ": " + value);
|
|
}
|
|
}
|
|
return messageParts.join('\n');
|
|
}
|
|
var PatchError = /** @class */ (function (_super) {
|
|
__extends(PatchError, _super);
|
|
function PatchError(message, name, index, operation, tree) {
|
|
var _newTarget = this.constructor;
|
|
var _this = _super.call(this, patchErrorMessageFormatter(message, { name: name, index: index, operation: operation, tree: tree })) || this;
|
|
_this.name = name;
|
|
_this.index = index;
|
|
_this.operation = operation;
|
|
_this.tree = tree;
|
|
Object.setPrototypeOf(_this, _newTarget.prototype); // restore prototype chain, see https://stackoverflow.com/a/48342359
|
|
_this.message = patchErrorMessageFormatter(message, { name: name, index: index, operation: operation, tree: tree });
|
|
return _this;
|
|
}
|
|
return PatchError;
|
|
}(Error));
|
|
export { PatchError };
|