{"ScriptPreparationCode":" const newerValue = \u0027newer-value\u0027;\r\n const olderValue = \u0027older-value\u0027;\r\n const unchangedValue = \u0027unchanged-value\u0027;\r\n const newerTimestamp = \u0027200000000000000:00000:my-client:v01\u0027;\r\n const olderTimestamp = \u002710000000000000:00000:my-client:v01\u0027;\r\n const unchangedTimestamp = \u002700000000000000:00000:my-client:v01\u0027;\r\n\r\n var newPatch = {\r\n inspection: {\r\n name: newerValue,\r\n note: olderValue,\r\n timestamps: {\r\n name: newerTimestamp,\r\n note: olderTimestamp,\r\n },\r\n areas: [{\r\n id: \u00271234\u0027,\r\n name: newerValue,\r\n note: olderValue,\r\n timestamps: {\r\n name: newerTimestamp,\r\n note: olderTimestamp,\r\n },\r\n items: [{\r\n id: \u00271234\u0027,\r\n name: newerValue,\r\n note: olderValue,\r\n timestamps: {\r\n name: newerTimestamp,\r\n note: olderTimestamp,\r\n },\r\n }, ],\r\n }, ],\r\n },\r\n };\r\n\r\n var existingPatch = {\r\n inspection: {\r\n name: olderValue,\r\n note: newerValue,\r\n other: unchangedValue,\r\n timestamps: {\r\n name: olderTimestamp,\r\n note: newerTimestamp,\r\n other: unchangedTimestamp,\r\n },\r\n areas: [{\r\n id: \u00271234\u0027,\r\n name: olderValue,\r\n note: newerValue,\r\n other: unchangedValue,\r\n timestamps: {\r\n name: olderTimestamp,\r\n note: newerTimestamp,\r\n other: unchangedTimestamp,\r\n },\r\n items: [{\r\n id: \u00271234\u0027,\r\n name: olderValue,\r\n note: newerValue,\r\n other: unchangedValue,\r\n timestamps: {\r\n name: olderTimestamp,\r\n note: newerTimestamp,\r\n other: unchangedTimestamp,\r\n },\r\n },\r\n {\r\n id: \u0027unchanged-item\u0027,\r\n name: unchangedValue,\r\n note: unchangedValue,\r\n other: unchangedValue,\r\n timestamps: {\r\n name: unchangedValue,\r\n note: unchangedValue,\r\n other: unchangedTimestamp,\r\n },\r\n },\r\n ],\r\n }, ],\r\n },\r\n };\r\n\r\n var compareTs = (ts1, ts2, value1, value2) =\u003E {\r\n if (!ts1 \u0026\u0026 !ts2) {\r\n return undefined;\r\n }\r\n if (!ts1) {\r\n return value2;\r\n }\r\n if (!ts2) {\r\n return value1;\r\n }\r\n const compareRes = ts1.localeCompare(ts2);\r\n if (compareRes \u003C= 0) {\r\n return value2;\r\n }\r\n return value1;\r\n };","TestCases":[{"Name":"New object","Code":"var mergeWithTimestampsCustomizer = (\r\n targetValue,\r\n srcValue,\r\n key,\r\n target,\r\n source,\r\n) =\u003E {\r\n // TODO: way to standardize uuid key\r\n if (_.isArray(targetValue)) {\r\n return _.values(\r\n _.mergeWith(_.keyBy(targetValue, \u0027id\u0027), _.keyBy(srcValue, \u0027id\u0027), mergeWithTimestampsCustomizer),\r\n );\r\n }\r\n\r\n if (target?.timestamps?.[key] || source?.timestamps?.[key]) {\r\n return compareTs(target?.timestamps?.[key], source?.timestamps?.[key], targetValue, srcValue);\r\n }\r\n\r\n // TODO: way to standardize timestamps key\r\n if (key === \u0027timestamps\u0027) {\r\n return _.mergeWith({}, targetValue, srcValue, (v, srcV) =\u003E {\r\n return compareTs(v, srcV, v, srcV);\r\n });\r\n }\r\n\r\n return undefined; // Fallback to lodash\u0027s merge\r\n};\r\n \r\nconst mergeWithTimestamps = (existing, newValues) =\u003E {\r\n return _.mergeWith({}, existing, newValues, mergeWithTimestampsCustomizer);\r\n};\r\n \r\nmergeWithTimestamps(newPatch, existingPatch);","IsDeferred":false},{"Name":"Mutating object","Code":"var mergeWithTimestampsCustomizer = (\r\n targetValue,\r\n srcValue,\r\n key,\r\n target,\r\n source,\r\n) =\u003E {\r\n // TODO: way to standardize uuid key\r\n if (_.isArray(targetValue)) {\r\n return _.values(\r\n _.mergeWith(_.keyBy(targetValue, \u0027id\u0027), _.keyBy(srcValue, \u0027id\u0027), mergeWithTimestampsCustomizer),\r\n );\r\n }\r\n\r\n if (target?.timestamps?.[key] || source?.timestamps?.[key]) {\r\n return compareTs(target?.timestamps?.[key], source?.timestamps?.[key], targetValue, srcValue);\r\n }\r\n\r\n // TODO: way to standardize timestamps key\r\n if (key === \u0027timestamps\u0027) {\r\n return _.mergeWith(targetValue, srcValue, (v, srcV) =\u003E {\r\n return compareTs(v, srcV, v, srcV);\r\n });\r\n }\r\n\r\n return undefined; // Fallback to lodash\u0027s merge\r\n};\r\n \r\nconst mergeWithTimestamps = (existing, newValues) =\u003E {\r\n return _.mergeWith(existing, newValues, mergeWithTimestampsCustomizer);\r\n};\r\n \r\nmergeWithTimestamps(newPatch, existingPatch);","IsDeferred":false}]}