diff options
Diffstat (limited to 'src/utils/DiffUtil.js')
-rw-r--r-- | src/utils/DiffUtil.js | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/utils/DiffUtil.js b/src/utils/DiffUtil.js new file mode 100644 index 0000000..5e69162 --- /dev/null +++ b/src/utils/DiffUtil.js @@ -0,0 +1,98 @@ +/* + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2021 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + + +var deepDiffMapper = function() { + return { + VALUE_CREATED: 'created', + VALUE_UPDATED: 'updated', + VALUE_DELETED: 'deleted', + VALUE_UNCHANGED: 'unchanged', + map: function(obj1, obj2) { + if (this.isFunction(obj1) || this.isFunction(obj2)) { + throw 'Invalid argument. Function given, object expected.'; + } + if (this.isValue(obj1) || this.isValue(obj2)) { + return { + type: this.compareValues(obj1, obj2), + data: (obj1 === undefined) ? obj2 : obj1 + }; + } + + var diff = {}; + for (var key in obj1) { + if (this.isFunction(obj1[key])) { + continue; + } + + var value2 = undefined; + if ('undefined' != typeof(obj2[key])) { + value2 = obj2[key]; + } + + diff[key] = this.map(obj1[key], value2); + } + for (var key in obj2) { + if (this.isFunction(obj2[key]) || ('undefined' != typeof(diff[key]))) { + continue; + } + + diff[key] = this.map(undefined, obj2[key]); + } + + return diff; + + }, + compareValues: function(value1, value2) { + if (value1 === value2) { + return this.VALUE_UNCHANGED; + } + if (this.isDate(value1) && this.isDate(value2) && value1.getTime() === value2.getTime()) { + return this.VALUE_UNCHANGED; + } + if ('undefined' == typeof(value1)) { + return this.VALUE_CREATED; + } + if ('undefined' == typeof(value2)) { + return this.VALUE_DELETED; + } + + return this.VALUE_UPDATED; + }, + isFunction: function(obj) { + return {}.toString.apply(obj) === '[object Function]'; + }, + isArray: function(obj) { + return {}.toString.apply(obj) === '[object Array]'; + }, + isObject: function(obj) { + return {}.toString.apply(obj) === '[object Object]'; + }, + isDate: function(obj) { + return {}.toString.apply(obj) === '[object Date]'; + }, + isValue: function(obj) { + return !this.isObject(obj) && !this.isArray(obj); + } + } +}(); + + +export default deepDiffMapper; |