@crystaldesign/product-handler 26.10.0-beta.30 → 26.10.0-beta.32
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.
- package/build/cjs/index.js +54 -7
- package/build/esm/index.js +53 -8
- package/build/types/product-handler/src/applyProductHeaderOverrides.d.ts +13 -0
- package/build/types/product-handler/src/applyProductHeaderOverrides.d.ts.map +1 -1
- package/build/types/product-handler/src/applyProductHeaderOverrides.test.d.ts +2 -0
- package/build/types/product-handler/src/applyProductHeaderOverrides.test.d.ts.map +1 -0
- package/build/types/product-handler/src/productMergeFieldRegistry.d.ts +5 -2
- package/build/types/product-handler/src/productMergeFieldRegistry.d.ts.map +1 -1
- package/package.json +2 -2
package/build/cjs/index.js
CHANGED
|
@@ -47,6 +47,17 @@ function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymb
|
|
|
47
47
|
function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
48
48
|
/** Root paths that are materialized from `headerValues` + `overrideValues`. Extend when adding merge rules. */
|
|
49
49
|
var PRODUCT_MERGE_FIELD_KEYS = ['customData'];
|
|
50
|
+
/**
|
|
51
|
+
* `customData` keys that identify a single article and must never be inherited from the header product.
|
|
52
|
+
* They are unique per article — the SM article id keys the flat article in API2, `SAP_MARA_MATNR` has a
|
|
53
|
+
* unique index there and `SAP_POSITION` is uniqueness-checked per supplier/purchasing group. Inheriting
|
|
54
|
+
* them made an article indistinguishable from its header article, so downstream syncs overwrote the
|
|
55
|
+
* header's records instead of the article's.
|
|
56
|
+
*
|
|
57
|
+
* Applied to the top level of `customData` and inside the nested `customData.SAP` block, since SAP fields
|
|
58
|
+
* exist in both shapes (`customData.SAP.SAP_MARA_MATNR` and the legacy `customData.SAP_MARA_MATNR.value`).
|
|
59
|
+
*/
|
|
60
|
+
var NON_INHERITABLE_CUSTOM_DATA_KEYS = ['sourceArticleId', 'SMArticleId', 'SAP_MARA_MATNR', 'SAP_POSITION'];
|
|
50
61
|
function isPlainObject(value) {
|
|
51
62
|
return value !== null && _typeof__default["default"](value) === 'object' && !Array.isArray(value);
|
|
52
63
|
}
|
|
@@ -66,9 +77,43 @@ function deepMergeRecords(base, override) {
|
|
|
66
77
|
}
|
|
67
78
|
return out;
|
|
68
79
|
}
|
|
80
|
+
|
|
81
|
+
/** Removes the per-article identity keys from the header side, at the top level and inside `SAP`. */
|
|
82
|
+
function stripNonInheritableCustomData(base) {
|
|
83
|
+
var out = _objectSpread$1({}, base);
|
|
84
|
+
var _iterator = _createForOfIteratorHelper(NON_INHERITABLE_CUSTOM_DATA_KEYS),
|
|
85
|
+
_step;
|
|
86
|
+
try {
|
|
87
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
88
|
+
var _key = _step.value;
|
|
89
|
+
delete out[_key];
|
|
90
|
+
}
|
|
91
|
+
} catch (err) {
|
|
92
|
+
_iterator.e(err);
|
|
93
|
+
} finally {
|
|
94
|
+
_iterator.f();
|
|
95
|
+
}
|
|
96
|
+
if (isPlainObject(out.SAP)) {
|
|
97
|
+
var sap = _objectSpread$1({}, out.SAP);
|
|
98
|
+
var _iterator2 = _createForOfIteratorHelper(NON_INHERITABLE_CUSTOM_DATA_KEYS),
|
|
99
|
+
_step2;
|
|
100
|
+
try {
|
|
101
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
102
|
+
var key = _step2.value;
|
|
103
|
+
delete sap[key];
|
|
104
|
+
}
|
|
105
|
+
} catch (err) {
|
|
106
|
+
_iterator2.e(err);
|
|
107
|
+
} finally {
|
|
108
|
+
_iterator2.f();
|
|
109
|
+
}
|
|
110
|
+
out.SAP = sap;
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
69
114
|
function mergeCustomDataMaterialized(product) {
|
|
70
115
|
var _product$headerValues, _product$headerValues2, _product$overrideValu, _product$overrideValu2;
|
|
71
|
-
var base = (_product$headerValues = (_product$headerValues2 = product.headerValues) === null || _product$headerValues2 === void 0 ? void 0 : _product$headerValues2.customData) !== null && _product$headerValues !== void 0 ? _product$headerValues : {};
|
|
116
|
+
var base = stripNonInheritableCustomData((_product$headerValues = (_product$headerValues2 = product.headerValues) === null || _product$headerValues2 === void 0 ? void 0 : _product$headerValues2.customData) !== null && _product$headerValues !== void 0 ? _product$headerValues : {});
|
|
72
117
|
var ov = (_product$overrideValu = (_product$overrideValu2 = product.overrideValues) === null || _product$overrideValu2 === void 0 ? void 0 : _product$overrideValu2.customData) !== null && _product$overrideValu !== void 0 ? _product$overrideValu : {};
|
|
73
118
|
var merged = deepMergeRecords(base, ov);
|
|
74
119
|
return _objectSpread$1(_objectSpread$1({}, product), {}, {
|
|
@@ -88,17 +133,17 @@ function applyProductHeaderOverrides(product) {
|
|
|
88
133
|
return product;
|
|
89
134
|
}
|
|
90
135
|
var next = _objectSpread$1({}, product);
|
|
91
|
-
var
|
|
92
|
-
|
|
136
|
+
var _iterator3 = _createForOfIteratorHelper(PRODUCT_MERGE_FIELD_KEYS),
|
|
137
|
+
_step3;
|
|
93
138
|
try {
|
|
94
|
-
for (
|
|
95
|
-
var field =
|
|
139
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
140
|
+
var field = _step3.value;
|
|
96
141
|
next = mergeStrategies[field](next);
|
|
97
142
|
}
|
|
98
143
|
} catch (err) {
|
|
99
|
-
|
|
144
|
+
_iterator3.e(err);
|
|
100
145
|
} finally {
|
|
101
|
-
|
|
146
|
+
_iterator3.f();
|
|
102
147
|
}
|
|
103
148
|
return next;
|
|
104
149
|
}
|
|
@@ -3028,6 +3073,7 @@ _defineProperty__default["default"](ProductHandlerAbstract, "standardBaseDataFie
|
|
|
3028
3073
|
}]);
|
|
3029
3074
|
_defineProperty__default["default"](ProductHandlerAbstract, "baseDataFields", _ProductHandlerAbstract.standardBaseDataFields.concat(_ProductHandlerAbstract.generalBaseDataFields));
|
|
3030
3075
|
|
|
3076
|
+
exports.NON_INHERITABLE_CUSTOM_DATA_KEYS = NON_INHERITABLE_CUSTOM_DATA_KEYS;
|
|
3031
3077
|
exports.PRODUCT_MERGE_FIELD_KEYS = PRODUCT_MERGE_FIELD_KEYS;
|
|
3032
3078
|
exports.ProductHandlerAbstract = ProductHandlerAbstract;
|
|
3033
3079
|
exports.TRANSLATED_FILEDS = TRANSLATED_FILEDS;
|
|
@@ -3035,3 +3081,4 @@ exports.applyProductHeaderOverrides = applyProductHeaderOverrides;
|
|
|
3035
3081
|
exports.deepMergeRecords = deepMergeRecords;
|
|
3036
3082
|
exports.getMergeableRootJsonPatchPrefixes = getMergeableRootJsonPatchPrefixes;
|
|
3037
3083
|
exports.mergeFieldKeyToOverrideValuesPath = mergeFieldKeyToOverrideValuesPath;
|
|
3084
|
+
exports.stripNonInheritableCustomData = stripNonInheritableCustomData;
|
package/build/esm/index.js
CHANGED
|
@@ -29,6 +29,17 @@ function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymb
|
|
|
29
29
|
function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
30
30
|
/** Root paths that are materialized from `headerValues` + `overrideValues`. Extend when adding merge rules. */
|
|
31
31
|
var PRODUCT_MERGE_FIELD_KEYS = ['customData'];
|
|
32
|
+
/**
|
|
33
|
+
* `customData` keys that identify a single article and must never be inherited from the header product.
|
|
34
|
+
* They are unique per article — the SM article id keys the flat article in API2, `SAP_MARA_MATNR` has a
|
|
35
|
+
* unique index there and `SAP_POSITION` is uniqueness-checked per supplier/purchasing group. Inheriting
|
|
36
|
+
* them made an article indistinguishable from its header article, so downstream syncs overwrote the
|
|
37
|
+
* header's records instead of the article's.
|
|
38
|
+
*
|
|
39
|
+
* Applied to the top level of `customData` and inside the nested `customData.SAP` block, since SAP fields
|
|
40
|
+
* exist in both shapes (`customData.SAP.SAP_MARA_MATNR` and the legacy `customData.SAP_MARA_MATNR.value`).
|
|
41
|
+
*/
|
|
42
|
+
var NON_INHERITABLE_CUSTOM_DATA_KEYS = ['sourceArticleId', 'SMArticleId', 'SAP_MARA_MATNR', 'SAP_POSITION'];
|
|
32
43
|
function isPlainObject(value) {
|
|
33
44
|
return value !== null && _typeof(value) === 'object' && !Array.isArray(value);
|
|
34
45
|
}
|
|
@@ -48,9 +59,43 @@ function deepMergeRecords(base, override) {
|
|
|
48
59
|
}
|
|
49
60
|
return out;
|
|
50
61
|
}
|
|
62
|
+
|
|
63
|
+
/** Removes the per-article identity keys from the header side, at the top level and inside `SAP`. */
|
|
64
|
+
function stripNonInheritableCustomData(base) {
|
|
65
|
+
var out = _objectSpread$1({}, base);
|
|
66
|
+
var _iterator = _createForOfIteratorHelper(NON_INHERITABLE_CUSTOM_DATA_KEYS),
|
|
67
|
+
_step;
|
|
68
|
+
try {
|
|
69
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
70
|
+
var _key = _step.value;
|
|
71
|
+
delete out[_key];
|
|
72
|
+
}
|
|
73
|
+
} catch (err) {
|
|
74
|
+
_iterator.e(err);
|
|
75
|
+
} finally {
|
|
76
|
+
_iterator.f();
|
|
77
|
+
}
|
|
78
|
+
if (isPlainObject(out.SAP)) {
|
|
79
|
+
var sap = _objectSpread$1({}, out.SAP);
|
|
80
|
+
var _iterator2 = _createForOfIteratorHelper(NON_INHERITABLE_CUSTOM_DATA_KEYS),
|
|
81
|
+
_step2;
|
|
82
|
+
try {
|
|
83
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
84
|
+
var key = _step2.value;
|
|
85
|
+
delete sap[key];
|
|
86
|
+
}
|
|
87
|
+
} catch (err) {
|
|
88
|
+
_iterator2.e(err);
|
|
89
|
+
} finally {
|
|
90
|
+
_iterator2.f();
|
|
91
|
+
}
|
|
92
|
+
out.SAP = sap;
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
51
96
|
function mergeCustomDataMaterialized(product) {
|
|
52
97
|
var _product$headerValues, _product$headerValues2, _product$overrideValu, _product$overrideValu2;
|
|
53
|
-
var base = (_product$headerValues = (_product$headerValues2 = product.headerValues) === null || _product$headerValues2 === void 0 ? void 0 : _product$headerValues2.customData) !== null && _product$headerValues !== void 0 ? _product$headerValues : {};
|
|
98
|
+
var base = stripNonInheritableCustomData((_product$headerValues = (_product$headerValues2 = product.headerValues) === null || _product$headerValues2 === void 0 ? void 0 : _product$headerValues2.customData) !== null && _product$headerValues !== void 0 ? _product$headerValues : {});
|
|
54
99
|
var ov = (_product$overrideValu = (_product$overrideValu2 = product.overrideValues) === null || _product$overrideValu2 === void 0 ? void 0 : _product$overrideValu2.customData) !== null && _product$overrideValu !== void 0 ? _product$overrideValu : {};
|
|
55
100
|
var merged = deepMergeRecords(base, ov);
|
|
56
101
|
return _objectSpread$1(_objectSpread$1({}, product), {}, {
|
|
@@ -70,17 +115,17 @@ function applyProductHeaderOverrides(product) {
|
|
|
70
115
|
return product;
|
|
71
116
|
}
|
|
72
117
|
var next = _objectSpread$1({}, product);
|
|
73
|
-
var
|
|
74
|
-
|
|
118
|
+
var _iterator3 = _createForOfIteratorHelper(PRODUCT_MERGE_FIELD_KEYS),
|
|
119
|
+
_step3;
|
|
75
120
|
try {
|
|
76
|
-
for (
|
|
77
|
-
var field =
|
|
121
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
122
|
+
var field = _step3.value;
|
|
78
123
|
next = mergeStrategies[field](next);
|
|
79
124
|
}
|
|
80
125
|
} catch (err) {
|
|
81
|
-
|
|
126
|
+
_iterator3.e(err);
|
|
82
127
|
} finally {
|
|
83
|
-
|
|
128
|
+
_iterator3.f();
|
|
84
129
|
}
|
|
85
130
|
return next;
|
|
86
131
|
}
|
|
@@ -3010,4 +3055,4 @@ _defineProperty(ProductHandlerAbstract, "standardBaseDataFields", [{
|
|
|
3010
3055
|
}]);
|
|
3011
3056
|
_defineProperty(ProductHandlerAbstract, "baseDataFields", _ProductHandlerAbstract.standardBaseDataFields.concat(_ProductHandlerAbstract.generalBaseDataFields));
|
|
3012
3057
|
|
|
3013
|
-
export { PRODUCT_MERGE_FIELD_KEYS, ProductHandlerAbstract, TRANSLATED_FILEDS, applyProductHeaderOverrides, deepMergeRecords, getMergeableRootJsonPatchPrefixes, mergeFieldKeyToOverrideValuesPath };
|
|
3058
|
+
export { NON_INHERITABLE_CUSTOM_DATA_KEYS, PRODUCT_MERGE_FIELD_KEYS, ProductHandlerAbstract, TRANSLATED_FILEDS, applyProductHeaderOverrides, deepMergeRecords, getMergeableRootJsonPatchPrefixes, mergeFieldKeyToOverrideValuesPath, stripNonInheritableCustomData };
|
|
@@ -2,8 +2,21 @@ import type { ProductDataAbstract } from './types';
|
|
|
2
2
|
/** Root paths that are materialized from `headerValues` + `overrideValues`. Extend when adding merge rules. */
|
|
3
3
|
export declare const PRODUCT_MERGE_FIELD_KEYS: readonly ["customData"];
|
|
4
4
|
export type ProductMergeFieldKey = (typeof PRODUCT_MERGE_FIELD_KEYS)[number];
|
|
5
|
+
/**
|
|
6
|
+
* `customData` keys that identify a single article and must never be inherited from the header product.
|
|
7
|
+
* They are unique per article — the SM article id keys the flat article in API2, `SAP_MARA_MATNR` has a
|
|
8
|
+
* unique index there and `SAP_POSITION` is uniqueness-checked per supplier/purchasing group. Inheriting
|
|
9
|
+
* them made an article indistinguishable from its header article, so downstream syncs overwrote the
|
|
10
|
+
* header's records instead of the article's.
|
|
11
|
+
*
|
|
12
|
+
* Applied to the top level of `customData` and inside the nested `customData.SAP` block, since SAP fields
|
|
13
|
+
* exist in both shapes (`customData.SAP.SAP_MARA_MATNR` and the legacy `customData.SAP_MARA_MATNR.value`).
|
|
14
|
+
*/
|
|
15
|
+
export declare const NON_INHERITABLE_CUSTOM_DATA_KEYS: readonly ["sourceArticleId", "SMArticleId", "SAP_MARA_MATNR", "SAP_POSITION"];
|
|
5
16
|
/** Deep-merge plain objects; nested plain objects merge, scalars and arrays are replaced by the override branch. */
|
|
6
17
|
export declare function deepMergeRecords(base: Record<string, any>, override: Record<string, any>): Record<string, any>;
|
|
18
|
+
/** Removes the per-article identity keys from the header side, at the top level and inside `SAP`. */
|
|
19
|
+
export declare function stripNonInheritableCustomData(base: Record<string, any>): Record<string, any>;
|
|
7
20
|
/**
|
|
8
21
|
* Materializes merge-fähige Root-Felder from `headerValues` (Basis) and `overrideValues` (Overrides).
|
|
9
22
|
* When neither `headerValues` nor `overrideValues` is set, returns the product unchanged (legacy documents).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applyProductHeaderOverrides.d.ts","sourceRoot":"","sources":["../../../../src/applyProductHeaderOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,+GAA+G;AAC/G,eAAO,MAAM,wBAAwB,yBAA0B,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"applyProductHeaderOverrides.d.ts","sourceRoot":"","sources":["../../../../src/applyProductHeaderOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,+GAA+G;AAC/G,eAAO,MAAM,wBAAwB,yBAA0B,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7E;;;;;;;;;GASG;AACH,eAAO,MAAM,gCAAgC,+EAAgF,CAAC;AAM9H,oHAAoH;AACpH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAY9G;AAED,qGAAqG;AACrG,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAU5F;AAeD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,mBAAmB,GAAG,mBAAmB,CAU7F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyProductHeaderOverrides.test.d.ts","sourceRoot":"","sources":["../../../../src/applyProductHeaderOverrides.test.ts"],"names":[],"mappings":""}
|
|
@@ -9,9 +9,12 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Neues Feld: Eintrag in {@link PRODUCT_MERGE_FIELD_KEYS} und Merge-Strategie in `applyProductHeaderOverrides`;
|
|
11
11
|
* in Catalog die Pfad-Umleitung in `rewriteMergeFieldPatchesToOverrides` ergänzen.
|
|
12
|
+
*
|
|
13
|
+
* Pro Artikel eindeutige Felder (Identität, Artikelnummer, Position) dürfen NICHT vom Header geerbt werden —
|
|
14
|
+
* siehe {@link NON_INHERITABLE_CUSTOM_DATA_KEYS}; dort erweitern, nicht in der Merge-Strategie.
|
|
12
15
|
*/
|
|
13
|
-
import { PRODUCT_MERGE_FIELD_KEYS } from './applyProductHeaderOverrides';
|
|
14
|
-
export { PRODUCT_MERGE_FIELD_KEYS };
|
|
16
|
+
import { NON_INHERITABLE_CUSTOM_DATA_KEYS, PRODUCT_MERGE_FIELD_KEYS } from './applyProductHeaderOverrides';
|
|
17
|
+
export { NON_INHERITABLE_CUSTOM_DATA_KEYS, PRODUCT_MERGE_FIELD_KEYS };
|
|
15
18
|
/** Root-JSON-Patch-Prefixe (mit `/`), die auf `overrideValues` umgebogen werden. */
|
|
16
19
|
export declare function getMergeableRootJsonPatchPrefixes(): string[];
|
|
17
20
|
/** JSON-Patch-Ziel unter `overrideValues` für ein merge-fähiges Feld (z. B. `customData` → `/overrideValues/customData`). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"productMergeFieldRegistry.d.ts","sourceRoot":"","sources":["../../../../src/productMergeFieldRegistry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"productMergeFieldRegistry.d.ts","sourceRoot":"","sources":["../../../../src/productMergeFieldRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE3G,OAAO,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,CAAC;AAEtE,oFAAoF;AACpF,wBAAgB,iCAAiC,IAAI,MAAM,EAAE,CAE5D;AAED,6HAA6H;AAC7H,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAE7G"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crystaldesign/product-handler",
|
|
3
|
-
"version": "26.10.0-beta.
|
|
3
|
+
"version": "26.10.0-beta.32",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@crystaldesign/basket-model": "*",
|
|
6
6
|
"@crystaldesign/diva-utils": "*"
|
|
@@ -13,5 +13,5 @@
|
|
|
13
13
|
"axios": "^1.7.7",
|
|
14
14
|
"classnames": "^2.5.1"
|
|
15
15
|
},
|
|
16
|
-
"gitHead": "
|
|
16
|
+
"gitHead": "481546765f1421db3c3f1ec381d73a0a57eb70df"
|
|
17
17
|
}
|