function applyOperation()

in traffic_portal/app/src/assets/js/fast-json-patch_v2.1.0.js [363:496]


		function applyOperation(document, operation, validateOperation, mutateDocument, banPrototypeModifications, index) {
			if (validateOperation === void 0) { validateOperation = false; }
			if (mutateDocument === void 0) { mutateDocument = true; }
			if (banPrototypeModifications === void 0) { banPrototypeModifications = true; }
			if (index === void 0) { index = 0; }
			if (validateOperation) {
				if (typeof validateOperation == 'function') {
					validateOperation(operation, 0, document, operation.path);
				}
				else {
					validator(operation, 0);
				}
			}
			/* ROOT OPERATIONS */
			if (operation.path === "") {
				var returnValue = { newDocument: document };
				if (operation.op === 'add') {
					returnValue.newDocument = operation.value;
					return returnValue;
				}
				else if (operation.op === 'replace') {
					returnValue.newDocument = operation.value;
					returnValue.removed = document; //document we removed
					return returnValue;
				}
				else if (operation.op === 'move' || operation.op === 'copy') {
					returnValue.newDocument = getValueByPointer(document, operation.from); // get the value by json-pointer in `from` field
					if (operation.op === 'move') {
						returnValue.removed = document;
					}
					return returnValue;
				}
				else if (operation.op === 'test') {
					returnValue.test = areEquals(document, operation.value);
					if (returnValue.test === false) {
						throw new exports.JsonPatchError("Test operation failed", 'TEST_OPERATION_FAILED', index, operation, document);
					}
					returnValue.newDocument = document;
					return returnValue;
				}
				else if (operation.op === 'remove') {
					returnValue.removed = document;
					returnValue.newDocument = null;
					return returnValue;
				}
				else if (operation.op === '_get') {
					operation.value = document;
					return returnValue;
				}
				else {
					if (validateOperation) {
						throw new exports.JsonPatchError('Operation `op` property is not one of operations defined in RFC-6902', 'OPERATION_OP_INVALID', index, operation, document);
					}
					else {
						return returnValue;
					}
				}
			} /* END ROOT OPERATIONS */
			else {
				if (!mutateDocument) {
					document = helpers_1._deepClone(document);
				}
				var path = operation.path || "";
				var keys = path.split('/');
				var obj = document;
				var t = 1; //skip empty element - http://jsperf.com/to-shift-or-not-to-shift
				var len = keys.length;
				var existingPathFragment = undefined;
				var key = void 0;
				var validateFunction = void 0;
				if (typeof validateOperation == 'function') {
					validateFunction = validateOperation;
				}
				else {
					validateFunction = validator;
				}
				while (true) {
					key = keys[t];
					if (banPrototypeModifications && key == '__proto__') {
						throw new TypeError('JSON-Patch: modifying `__proto__` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README');
					}
					if (validateOperation) {
						if (existingPathFragment === undefined) {
							if (obj[key] === undefined) {
								existingPathFragment = keys.slice(0, t).join('/');
							}
							else if (t == len - 1) {
								existingPathFragment = operation.path;
							}
							if (existingPathFragment !== undefined) {
								validateFunction(operation, 0, document, existingPathFragment);
							}
						}
					}
					t++;
					if (Array.isArray(obj)) {
						if (key === '-') {
							key = obj.length;
						}
						else {
							if (validateOperation && !helpers_1.isInteger(key)) {
								throw new exports.JsonPatchError("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index", "OPERATION_PATH_ILLEGAL_ARRAY_INDEX", index, operation, document);
							} // only parse key when it's an integer for `arr.prop` to work
							else if (helpers_1.isInteger(key)) {
								key = ~~key;
							}
						}
						if (t >= len) {
							if (validateOperation && operation.op === "add" && key > obj.length) {
								throw new exports.JsonPatchError("The specified index MUST NOT be greater than the number of elements in the array", "OPERATION_VALUE_OUT_OF_BOUNDS", index, operation, document);
							}
							var returnValue = arrOps[operation.op].call(operation, obj, key, document); // Apply patch
							if (returnValue.test === false) {
								throw new exports.JsonPatchError("Test operation failed", 'TEST_OPERATION_FAILED', index, operation, document);
							}
							return returnValue;
						}
					}
					else {
						if (key && key.indexOf('~') != -1) {
							key = helpers_1.unescapePathComponent(key);
						}
						if (t >= len) {
							var returnValue = objOps[operation.op].call(operation, obj, key, document); // Apply patch
							if (returnValue.test === false) {
								throw new exports.JsonPatchError("Test operation failed", 'TEST_OPERATION_FAILED', index, operation, document);
							}
							return returnValue;
						}
					}
					obj = obj[key];
				}
			}
		}