datum-merge 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"merge-conf.d.ts","sourceRoot":"","sources":["../../src/merge-conf.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGlG,OAAO,EAAc,SAAS,EAAsC,MAAM,aAAa,CAAC;AAGxF,MAAM,MAAM,YAAY,GAAG;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACtB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;CACvD,CAAC;AAUF,wBAAgB,WAAW,CACvB,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC9B,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC9B,UAAU,EAAE,YAAY,GACzB,OAAO,CAgCT;AAMD,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,YAAY,GACzB,GAAG,CAIL;AAKD,wBAAgB,gBAAgB,CAC5B,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,YAAY,EACxB,WAAW,CAAC,EAAE,MAAM,EAAE,GACvB,MAAM,EAAE,CAaV;AAQD,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAC1C,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClB,SAAS,EAAE,WAAW,GAAG,SAAS,EAClC,WAAW,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAyBpB;AAMD,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,SAAS,EAAE,WAAW,EACtB,QAAQ,GAAE,OAAe,GAC1B,GAAG,CAOL;AAWD,eAAO,MAAM,eAAe,WAChB,GAAG,aACA,WAAW,GAAG,SAAS,eACtB,OAAO,gBACL,MAAM,EAAE,KACvB,YAmEF,CAAA"}
1
+ {"version":3,"file":"merge-conf.d.ts","sourceRoot":"","sources":["../../src/merge-conf.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGlG,OAAO,EAAc,SAAS,EAAsC,MAAM,aAAa,CAAC;AAGxF,MAAM,MAAM,YAAY,GAAG;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACtB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;CACvD,CAAC;AAUF,wBAAgB,WAAW,CACvB,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC9B,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC9B,UAAU,EAAE,YAAY,GACzB,OAAO,CAgCT;AAMD,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,YAAY,GACzB,GAAG,CAIL;AAKD,wBAAgB,gBAAgB,CAC5B,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,YAAY,EACxB,WAAW,CAAC,EAAE,MAAM,EAAE,GACvB,MAAM,EAAE,CAaV;AAQD,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAC1C,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClB,SAAS,EAAE,WAAW,GAAG,SAAS,EAClC,WAAW,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAyBpB;AAMD,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,SAAS,EAAE,WAAW,EACtB,QAAQ,GAAE,OAAe,GAC1B,GAAG,CAOL;AAWD,eAAO,MAAM,eAAe,WAChB,GAAG,aACA,WAAW,GAAG,SAAS,eACtB,OAAO,gBACL,MAAM,EAAE,KACvB,YAoEF,CAAA"}
@@ -94,17 +94,17 @@ function immutableCustomMerge(target, source, mergeConf, skipFill = false) {
94
94
  }
95
95
  exports.immutableCustomMerge = immutableCustomMerge;
96
96
  const fillUpdateCodes = (source, mergeConf, blockUnset = false, excludeKeys) => {
97
- var _a, _b, _c;
98
97
  if ((0, type_utils_1.isString)(mergeConf)) {
99
98
  mergeConf = { scalar: mergeConf };
100
99
  }
101
100
  const deepConf = {
102
- scalar: (_a = mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.scalar) !== null && _a !== void 0 ? _a : merge_low_1.UpdateCode.B,
103
- vector: (_b = mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.vector) !== null && _b !== void 0 ? _b : merge_low_1.UpdateCode.XS,
104
- nested: (_c = mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.nested) !== null && _c !== void 0 ? _c : merge_low_1.UpdateCode.N,
101
+ scalar: (mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.scalar) || merge_low_1.UpdateCode.B,
102
+ vector: (mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.vector) || merge_low_1.UpdateCode.XS,
103
+ nested: (mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.nested) || merge_low_1.UpdateCode.N,
105
104
  };
106
105
  const globKeys = (0, datum_utils_1.getObjectKeys)(mergeConf)
107
- .filter((s) => s.includes("*"));
106
+ .filter((s) => s.includes("*"))
107
+ .sort((s1, s2) => s2.length - s1.length);
108
108
  const globPats = globKeys.map((g) => (0, datum_utils_1.createGlobRegex)(g));
109
109
  const mergeCodes = {};
110
110
  const sourceKeys = (0, datum_utils_1.getObjectKeys)(source);
@@ -124,7 +124,7 @@ const fillUpdateCodes = (source, mergeConf, blockUnset = false, excludeKeys) =>
124
124
  continue;
125
125
  }
126
126
  if ((0, type_utils_1.isObject)(labelConf) && (0, type_utils_1.isObject)(srcValue)) {
127
- mergeCodes[srcLabel] = (0, exports.fillUpdateCodes)(srcValue, labelConf, blockUnset);
127
+ mergeCodes[srcLabel] = (0, exports.fillUpdateCodes)(srcValue, Object.assign(Object.assign({}, deepConf), labelConf), blockUnset);
128
128
  continue;
129
129
  }
130
130
  const globIndex = globPats.findIndex((r) => r.test(srcLabel));
@@ -135,7 +135,7 @@ const fillUpdateCodes = (source, mergeConf, blockUnset = false, excludeKeys) =>
135
135
  continue;
136
136
  }
137
137
  if ((0, type_utils_1.isObject)(globConf) && (0, type_utils_1.isObject)(srcValue)) {
138
- mergeCodes[srcLabel] = (0, exports.fillUpdateCodes)(srcValue, globConf, blockUnset);
138
+ mergeCodes[srcLabel] = (0, exports.fillUpdateCodes)(srcValue, Object.assign(Object.assign({}, deepConf), globConf), blockUnset);
139
139
  continue;
140
140
  }
141
141
  }
@@ -1 +1 @@
1
- {"version":3,"file":"merge-low.d.ts","sourceRoot":"","sources":["../../src/merge-low.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;CAkBb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEnE,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,GACrB,OAAO,CAuDT;AAED,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,GACrB,OAAO,CA0DT"}
1
+ {"version":3,"file":"merge-low.d.ts","sourceRoot":"","sources":["../../src/merge-low.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;CAkBb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEnE,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,GACrB,OAAO,CAyDT;AAED,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,GACrB,OAAO,CA4DT"}
@@ -23,7 +23,8 @@ exports.UpdateCode = {
23
23
  };
24
24
  function mergeScalarField(target, source, label, mergeCode) {
25
25
  const sourceHas = !(0, type_utils_1.isNullish)(source[label]);
26
- const targetHas = target.hasOwnProperty(label);
26
+ const targetKey = target.hasOwnProperty(label);
27
+ const targetHas = targetKey && !(0, type_utils_1.isNullish)(target[label]);
27
28
  if (!targetHas && !sourceHas) {
28
29
  return false;
29
30
  }
@@ -40,7 +41,7 @@ function mergeScalarField(target, source, label, mergeCode) {
40
41
  case exports.UpdateCode.N:
41
42
  return false;
42
43
  case exports.UpdateCode.Y:
43
- target[label] = source[label];
44
+ target[label] = (0, datum_utils_1.deepClone)(source[label]);
44
45
  return true;
45
46
  case exports.UpdateCode.B:
46
47
  if (sourceHas)
@@ -73,10 +74,12 @@ function mergeScalarField(target, source, label, mergeCode) {
73
74
  if (!migrateVal) {
74
75
  return false;
75
76
  }
76
- target[label] = (0, datum_utils_1.deepClone)(source[label]);
77
+ target[label] = !sourceHas || (0, type_utils_1.isPrimitive)(source[label])
78
+ ? source[label]
79
+ : (0, datum_utils_1.deepClone)(source[label]);
77
80
  if ((0, type_utils_1.emptyValue)(target[label])) {
78
81
  delete target[label];
79
- return targetHas;
82
+ return targetKey;
80
83
  }
81
84
  return true;
82
85
  }
@@ -89,7 +92,8 @@ function mergeVectorField(target, source, label, mergeCode) {
89
92
  return false;
90
93
  }
91
94
  let sourceVec = (0, type_utils_1.isArrayOfAny)(sourceVals);
92
- const targetHas = target.hasOwnProperty(label);
95
+ const targetKey = target.hasOwnProperty(label);
96
+ const targetHas = targetKey && !(0, type_utils_1.isNullish)(target[label]);
93
97
  const targetVec = (0, type_utils_1.isArrayOfAny)(target[label]);
94
98
  if (targetHas && !targetVec) {
95
99
  throw new TypeError("type change to vector for " + label);
@@ -103,9 +107,11 @@ function mergeVectorField(target, source, label, mergeCode) {
103
107
  case exports.UpdateCode.N:
104
108
  return false;
105
109
  case exports.UpdateCode.Y:
106
- case exports.UpdateCode.XR:
107
110
  target[label] = (0, datum_utils_1.deepClone)(sourceVals);
108
111
  return true;
112
+ case exports.UpdateCode.XR:
113
+ targetVals = sourceVals;
114
+ break;
109
115
  case exports.UpdateCode.XS:
110
116
  targetVals = (0, lodash_es_1.concat)((_a = target[label]) !== null && _a !== void 0 ? _a : [], sourceVals);
111
117
  break;
@@ -127,10 +133,10 @@ function mergeVectorField(target, source, label, mergeCode) {
127
133
  }
128
134
  if (!(targetVals === null || targetVals === void 0 ? void 0 : targetVals.length)) {
129
135
  delete target[label];
130
- return targetHas;
136
+ return targetKey;
131
137
  }
132
138
  const changed = !(0, datum_utils_1.areArraysEqual)(targetVals, target[label]);
133
- target[label] = targetVals;
139
+ target[label] = !changed ? targetVals : (0, datum_utils_1.deepClone)(targetVals);
134
140
  return changed;
135
141
  }
136
142
  exports.mergeVectorField = mergeVectorField;
@@ -1,13 +1,12 @@
1
1
  export type PrimitiveType = "string" | "number" | "boolean";
2
2
  export type Primitive = string | number | boolean;
3
3
  export type PrimitiveArray = string[] | number[] | boolean[];
4
- export type VectorArray = string[] | number[];
5
4
  export type ObjectKeys<T> = keyof T;
6
5
  export type ObjectVals<T> = T[keyof T];
7
6
  export type Prettify<T> = {
8
7
  [K in keyof T]: T[K];
9
8
  } & {};
10
- export type SafeTypes = Primitive | VectorArray;
9
+ export type SafeTypes = Primitive | PrimitiveArray;
11
10
  export type SafeTupleObj = {
12
11
  [label: string]: SafeTypes;
13
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../src/type-utils.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC5D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AAE9C,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACpC,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACvC,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC;AAEzD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAChD,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAC1D,MAAM,MAAM,QAAQ,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAEhD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,OAAO,CAEtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,SAAS,CAE1D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIlD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAIpD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,EAAE,CAEvD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,CAAC,EACvB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,GACpC,GAAG,IAAI,CAAC,EAAE,CAIZ;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,KAAK,CAItD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAK9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAS9C"}
1
+ {"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../src/type-utils.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC5D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;AAE7D,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACpC,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACvC,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC;AAEzD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;AACnD,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAC1D,MAAM,MAAM,QAAQ,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAEhD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,OAAO,CAEtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,SAAS,CAE1D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIlD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAIpD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,EAAE,CAEvD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,CAAC,EACvB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,GACpC,GAAG,IAAI,CAAC,EAAE,CAIZ;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,KAAK,CAItD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAK9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAS9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"merge-conf.d.ts","sourceRoot":"","sources":["../../src/merge-conf.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGlG,OAAO,EAAc,SAAS,EAAsC,MAAM,aAAa,CAAC;AAGxF,MAAM,MAAM,YAAY,GAAG;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACtB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;CACvD,CAAC;AAUF,wBAAgB,WAAW,CACvB,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC9B,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC9B,UAAU,EAAE,YAAY,GACzB,OAAO,CAgCT;AAMD,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,YAAY,GACzB,GAAG,CAIL;AAKD,wBAAgB,gBAAgB,CAC5B,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,YAAY,EACxB,WAAW,CAAC,EAAE,MAAM,EAAE,GACvB,MAAM,EAAE,CAaV;AAQD,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAC1C,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClB,SAAS,EAAE,WAAW,GAAG,SAAS,EAClC,WAAW,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAyBpB;AAMD,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,SAAS,EAAE,WAAW,EACtB,QAAQ,GAAE,OAAe,GAC1B,GAAG,CAOL;AAWD,eAAO,MAAM,eAAe,WAChB,GAAG,aACA,WAAW,GAAG,SAAS,eACtB,OAAO,gBACL,MAAM,EAAE,KACvB,YAmEF,CAAA"}
1
+ {"version":3,"file":"merge-conf.d.ts","sourceRoot":"","sources":["../../src/merge-conf.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGlG,OAAO,EAAc,SAAS,EAAsC,MAAM,aAAa,CAAC;AAGxF,MAAM,MAAM,YAAY,GAAG;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACtB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;CACvD,CAAC;AAUF,wBAAgB,WAAW,CACvB,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC9B,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC9B,UAAU,EAAE,YAAY,GACzB,OAAO,CAgCT;AAMD,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,YAAY,GACzB,GAAG,CAIL;AAKD,wBAAgB,gBAAgB,CAC5B,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,YAAY,EACxB,WAAW,CAAC,EAAE,MAAM,EAAE,GACvB,MAAM,EAAE,CAaV;AAQD,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAC1C,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClB,SAAS,EAAE,WAAW,GAAG,SAAS,EAClC,WAAW,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAyBpB;AAMD,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,SAAS,EAAE,WAAW,EACtB,QAAQ,GAAE,OAAe,GAC1B,GAAG,CAOL;AAWD,eAAO,MAAM,eAAe,WAChB,GAAG,aACA,WAAW,GAAG,SAAS,eACtB,OAAO,gBACL,MAAM,EAAE,KACvB,YAoEF,CAAA"}
@@ -86,17 +86,17 @@ export function immutableCustomMerge(target, source, mergeConf, skipFill = false
86
86
  return targetCopy;
87
87
  }
88
88
  export const fillUpdateCodes = (source, mergeConf, blockUnset = false, excludeKeys) => {
89
- var _a, _b, _c;
90
89
  if (isString(mergeConf)) {
91
90
  mergeConf = { scalar: mergeConf };
92
91
  }
93
92
  const deepConf = {
94
- scalar: (_a = mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.scalar) !== null && _a !== void 0 ? _a : UpdateCode.B,
95
- vector: (_b = mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.vector) !== null && _b !== void 0 ? _b : UpdateCode.XS,
96
- nested: (_c = mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.nested) !== null && _c !== void 0 ? _c : UpdateCode.N,
93
+ scalar: (mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.scalar) || UpdateCode.B,
94
+ vector: (mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.vector) || UpdateCode.XS,
95
+ nested: (mergeConf === null || mergeConf === void 0 ? void 0 : mergeConf.nested) || UpdateCode.N,
97
96
  };
98
97
  const globKeys = getObjectKeys(mergeConf)
99
- .filter((s) => s.includes("*"));
98
+ .filter((s) => s.includes("*"))
99
+ .sort((s1, s2) => s2.length - s1.length);
100
100
  const globPats = globKeys.map((g) => createGlobRegex(g));
101
101
  const mergeCodes = {};
102
102
  const sourceKeys = getObjectKeys(source);
@@ -116,7 +116,7 @@ export const fillUpdateCodes = (source, mergeConf, blockUnset = false, excludeKe
116
116
  continue;
117
117
  }
118
118
  if (isObject(labelConf) && isObject(srcValue)) {
119
- mergeCodes[srcLabel] = fillUpdateCodes(srcValue, labelConf, blockUnset);
119
+ mergeCodes[srcLabel] = fillUpdateCodes(srcValue, Object.assign(Object.assign({}, deepConf), labelConf), blockUnset);
120
120
  continue;
121
121
  }
122
122
  const globIndex = globPats.findIndex((r) => r.test(srcLabel));
@@ -127,7 +127,7 @@ export const fillUpdateCodes = (source, mergeConf, blockUnset = false, excludeKe
127
127
  continue;
128
128
  }
129
129
  if (isObject(globConf) && isObject(srcValue)) {
130
- mergeCodes[srcLabel] = fillUpdateCodes(srcValue, globConf, blockUnset);
130
+ mergeCodes[srcLabel] = fillUpdateCodes(srcValue, Object.assign(Object.assign({}, deepConf), globConf), blockUnset);
131
131
  continue;
132
132
  }
133
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"merge-low.d.ts","sourceRoot":"","sources":["../../src/merge-low.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;CAkBb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEnE,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,GACrB,OAAO,CAuDT;AAED,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,GACrB,OAAO,CA0DT"}
1
+ {"version":3,"file":"merge-low.d.ts","sourceRoot":"","sources":["../../src/merge-low.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;CAkBb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEnE,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,GACrB,OAAO,CAyDT;AAED,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,GACrB,OAAO,CA4DT"}
@@ -1,5 +1,5 @@
1
1
  import { concat, differenceWith, intersectionWith, unionWith, isEqual } from "lodash-es";
2
- import { emptyValue, isArrayOfAny, isNullish, typeOfValue } from "./type-utils";
2
+ import { emptyValue, isArrayOfAny, isNullish, isPrimitive, typeOfValue } from "./type-utils";
3
3
  import { areArraysEqual, deepClone } from "./datum-utils";
4
4
  export const UpdateCode = {
5
5
  T: "T",
@@ -20,7 +20,8 @@ export const UpdateCode = {
20
20
  };
21
21
  export function mergeScalarField(target, source, label, mergeCode) {
22
22
  const sourceHas = !isNullish(source[label]);
23
- const targetHas = target.hasOwnProperty(label);
23
+ const targetKey = target.hasOwnProperty(label);
24
+ const targetHas = targetKey && !isNullish(target[label]);
24
25
  if (!targetHas && !sourceHas) {
25
26
  return false;
26
27
  }
@@ -37,7 +38,7 @@ export function mergeScalarField(target, source, label, mergeCode) {
37
38
  case UpdateCode.N:
38
39
  return false;
39
40
  case UpdateCode.Y:
40
- target[label] = source[label];
41
+ target[label] = deepClone(source[label]);
41
42
  return true;
42
43
  case UpdateCode.B:
43
44
  if (sourceHas)
@@ -70,10 +71,12 @@ export function mergeScalarField(target, source, label, mergeCode) {
70
71
  if (!migrateVal) {
71
72
  return false;
72
73
  }
73
- target[label] = deepClone(source[label]);
74
+ target[label] = !sourceHas || isPrimitive(source[label])
75
+ ? source[label]
76
+ : deepClone(source[label]);
74
77
  if (emptyValue(target[label])) {
75
78
  delete target[label];
76
- return targetHas;
79
+ return targetKey;
77
80
  }
78
81
  return true;
79
82
  }
@@ -85,7 +88,8 @@ export function mergeVectorField(target, source, label, mergeCode) {
85
88
  return false;
86
89
  }
87
90
  let sourceVec = isArrayOfAny(sourceVals);
88
- const targetHas = target.hasOwnProperty(label);
91
+ const targetKey = target.hasOwnProperty(label);
92
+ const targetHas = targetKey && !isNullish(target[label]);
89
93
  const targetVec = isArrayOfAny(target[label]);
90
94
  if (targetHas && !targetVec) {
91
95
  throw new TypeError("type change to vector for " + label);
@@ -99,9 +103,11 @@ export function mergeVectorField(target, source, label, mergeCode) {
99
103
  case UpdateCode.N:
100
104
  return false;
101
105
  case UpdateCode.Y:
102
- case UpdateCode.XR:
103
106
  target[label] = deepClone(sourceVals);
104
107
  return true;
108
+ case UpdateCode.XR:
109
+ targetVals = sourceVals;
110
+ break;
105
111
  case UpdateCode.XS:
106
112
  targetVals = concat((_a = target[label]) !== null && _a !== void 0 ? _a : [], sourceVals);
107
113
  break;
@@ -123,10 +129,10 @@ export function mergeVectorField(target, source, label, mergeCode) {
123
129
  }
124
130
  if (!(targetVals === null || targetVals === void 0 ? void 0 : targetVals.length)) {
125
131
  delete target[label];
126
- return targetHas;
132
+ return targetKey;
127
133
  }
128
134
  const changed = !areArraysEqual(targetVals, target[label]);
129
- target[label] = targetVals;
135
+ target[label] = !changed ? targetVals : deepClone(targetVals);
130
136
  return changed;
131
137
  }
132
138
  ;
@@ -1,13 +1,12 @@
1
1
  export type PrimitiveType = "string" | "number" | "boolean";
2
2
  export type Primitive = string | number | boolean;
3
3
  export type PrimitiveArray = string[] | number[] | boolean[];
4
- export type VectorArray = string[] | number[];
5
4
  export type ObjectKeys<T> = keyof T;
6
5
  export type ObjectVals<T> = T[keyof T];
7
6
  export type Prettify<T> = {
8
7
  [K in keyof T]: T[K];
9
8
  } & {};
10
- export type SafeTypes = Primitive | VectorArray;
9
+ export type SafeTypes = Primitive | PrimitiveArray;
11
10
  export type SafeTupleObj = {
12
11
  [label: string]: SafeTypes;
13
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../src/type-utils.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC5D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AAE9C,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACpC,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACvC,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC;AAEzD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAChD,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAC1D,MAAM,MAAM,QAAQ,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAEhD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,OAAO,CAEtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,SAAS,CAE1D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIlD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAIpD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,EAAE,CAEvD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,CAAC,EACvB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,GACpC,GAAG,IAAI,CAAC,EAAE,CAIZ;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,KAAK,CAItD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAK9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAS9C"}
1
+ {"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../src/type-utils.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC5D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;AAE7D,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACpC,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACvC,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC;AAEzD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;AACnD,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAC1D,MAAM,MAAM,QAAQ,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAEhD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,OAAO,CAEtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,SAAS,CAE1D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIlD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAIpD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,EAAE,CAEvD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,CAAC,EACvB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,GACpC,GAAG,IAAI,CAAC,EAAE,CAIZ;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,KAAK,CAItD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAK9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAS9C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datum-merge",
3
- "version": "0.9.5",
3
+ "version": "0.9.7",
4
4
  "author": "Rohit Kulkarni <rohk@live.com>",
5
5
  "license": "MIT",
6
6
  "description": "Simplified diff and merging for deeply nested objects.",
package/src/merge-conf.ts CHANGED
@@ -9,10 +9,10 @@ export type DetailConfig = {
9
9
  };
10
10
 
11
11
  export type MergeConfig = {
12
- scalar?: MergeCode, //default
13
- vector?: MergeCode, //array types
14
- nested?: MergeCode, //object types
15
- [glob: string]: MergeCode | MergeConfig | undefined,
12
+ scalar?: MergeCode; //default
13
+ vector?: MergeCode; //array types
14
+ nested?: MergeCode; //object types
15
+ [glob: string]: MergeCode | MergeConfig | undefined;
16
16
  };
17
17
 
18
18
  //-----------------------------------------------------------------------------
@@ -172,12 +172,13 @@ export const fillUpdateCodes = (
172
172
  mergeConf = { scalar: mergeConf };
173
173
  }
174
174
  const deepConf = {
175
- scalar: mergeConf?.scalar ?? UpdateCode.B,
176
- vector: mergeConf?.vector ?? UpdateCode.XS,
177
- nested: mergeConf?.nested ?? UpdateCode.N,
175
+ scalar: mergeConf?.scalar || UpdateCode.B,
176
+ vector: mergeConf?.vector || UpdateCode.XS,
177
+ nested: mergeConf?.nested || UpdateCode.N,
178
178
  };
179
179
  const globKeys: string[] = getObjectKeys(mergeConf)
180
- .filter((s) => s.includes("*"));
180
+ .filter((s) => s.includes("*"))
181
+ .sort((s1, s2) => s2.length - s1.length); //prefer longest
181
182
  const globPats: RegExp[] = globKeys.map((g) => createGlobRegex(g));
182
183
 
183
184
  //iterate keys in source
@@ -203,7 +204,7 @@ export const fillUpdateCodes = (
203
204
  }
204
205
  //handle nesting
205
206
  if (isObject(labelConf) && isObject(srcValue)) {
206
- mergeCodes[srcLabel] = fillUpdateCodes(srcValue, labelConf, blockUnset);
207
+ mergeCodes[srcLabel] = fillUpdateCodes(srcValue, { ...deepConf, ...labelConf }, blockUnset);
207
208
  //todo nested deletes ignored
208
209
  continue;
209
210
  }
@@ -216,7 +217,7 @@ export const fillUpdateCodes = (
216
217
  continue;
217
218
  }
218
219
  if (isObject(globConf) && isObject(srcValue)) {
219
- mergeCodes[srcLabel] = fillUpdateCodes(srcValue, globConf!, blockUnset);
220
+ mergeCodes[srcLabel] = fillUpdateCodes(srcValue, { ...deepConf, ...globConf! }, blockUnset);
220
221
  continue;
221
222
  }
222
223
  }
package/src/merge-low.ts CHANGED
@@ -1,6 +1,5 @@
1
- // import { get, has, set, unset } from "lodash-es";
2
1
  import { concat, differenceWith, intersectionWith, unionWith, isEqual } from "lodash-es";
3
- import { emptyValue, isArrayOfAny, isNullish, typeOfValue } from "./type-utils";
2
+ import { emptyValue, isArrayOfAny, isNullish, isPrimitive, typeOfValue } from "./type-utils";
4
3
  import { areArraysEqual, deepClone } from "./datum-utils";
5
4
 
6
5
  export const UpdateCode = {
@@ -32,7 +31,8 @@ export function mergeScalarField(
32
31
  mergeCode: MergeCode,
33
32
  ): boolean {
34
33
  const sourceHas = !isNullish(source[label]);
35
- const targetHas = target.hasOwnProperty(label); //!isNullish(target[label]);
34
+ const targetKey = target.hasOwnProperty(label);
35
+ const targetHas = targetKey && !isNullish(target[label]);
36
36
  if (!targetHas && !sourceHas) {
37
37
  return false;
38
38
  }
@@ -50,8 +50,8 @@ export function mergeScalarField(
50
50
  case UpdateCode.N:
51
51
  return false;
52
52
  case UpdateCode.Y:
53
- target[label] = source[label];
54
- return true;
53
+ target[label] = deepClone(source[label]);
54
+ return true; //should bypass
55
55
  case UpdateCode.B:
56
56
  if (sourceHas) migrateVal = true;
57
57
  break;
@@ -78,11 +78,12 @@ export function mergeScalarField(
78
78
  if (!migrateVal) {
79
79
  return false;
80
80
  }
81
- // isPrimitive(source[label]); //avoid cloning
82
- target[label] = deepClone(source[label]);
81
+ target[label] = !sourceHas || isPrimitive(source[label])
82
+ ? source[label]
83
+ : deepClone(source[label]);
83
84
  if (emptyValue(target[label])) {
84
85
  delete target[label];
85
- return targetHas;
86
+ return targetKey;
86
87
  }
87
88
  return true;
88
89
  };
@@ -98,7 +99,8 @@ export function mergeVectorField(
98
99
  return false; //sourceHas
99
100
  }
100
101
  let sourceVec = isArrayOfAny(sourceVals);
101
- const targetHas = target.hasOwnProperty(label);
102
+ const targetKey = target.hasOwnProperty(label);
103
+ const targetHas = targetKey && !isNullish(target[label]);
102
104
  const targetVec = isArrayOfAny(target[label]);
103
105
  if (targetHas && !targetVec) {
104
106
  //should T => T[] change be allowed
@@ -115,9 +117,11 @@ export function mergeVectorField(
115
117
  case UpdateCode.N:
116
118
  return false;
117
119
  case UpdateCode.Y:
118
- case UpdateCode.XR:
119
120
  target[label] = deepClone(sourceVals);
120
- return true;
121
+ return true; //should bypass
122
+ case UpdateCode.XR:
123
+ targetVals = sourceVals;
124
+ break;
121
125
  // case UpdateCode.C:
122
126
  case UpdateCode.XS:
123
127
  targetVals = concat(target[label] ?? [], sourceVals);
@@ -142,12 +146,11 @@ export function mergeVectorField(
142
146
  }
143
147
  if (!targetVals?.length) {
144
148
  delete target[label];
145
- return targetHas;
149
+ return targetKey;
146
150
  }
147
-
151
+ //array replaced
148
152
  const changed = !areArraysEqual(targetVals, target[label]);
149
153
  // && !deepEquals(targetVals, target[label]);
150
- //always clone source objects?
151
- target[label] = targetVals; //array replaced
154
+ target[label] = !changed ? targetVals : deepClone(targetVals);
152
155
  return changed;
153
156
  };
package/src/type-utils.ts CHANGED
@@ -2,13 +2,12 @@
2
2
  export type PrimitiveType = "string" | "number" | "boolean";
3
3
  export type Primitive = string | number | boolean;
4
4
  export type PrimitiveArray = string[] | number[] | boolean[];
5
- export type VectorArray = string[] | number[];
6
5
 
7
6
  export type ObjectKeys<T> = keyof T;
8
7
  export type ObjectVals<T> = T[keyof T];
9
8
  export type Prettify<T> = { [K in keyof T]: T[K]; } & {};
10
9
 
11
- export type SafeTypes = Primitive | VectorArray;
10
+ export type SafeTypes = Primitive | PrimitiveArray;
12
11
  export type SafeTupleObj = { [label: string]: SafeTypes };
13
12
  export type TupleObj = { [label: string]: any };
14
13