sf-git-merge-driver 1.4.0-dev-159.21317248282-1 → 1.4.0
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/README.md +6 -30
- package/lib/commands/git/merge/driver/run.js +5 -3
- package/lib/commands/git/merge/driver/run.js.map +1 -1
- package/lib/constant/conflictConstant.d.ts +3 -3
- package/lib/constant/conflictConstant.js +3 -3
- package/lib/constant/conflictConstant.js.map +1 -1
- package/lib/constant/parserConstant.d.ts +0 -6
- package/lib/constant/parserConstant.js +0 -6
- package/lib/constant/parserConstant.js.map +1 -1
- package/lib/driver/MergeDriver.d.ts +0 -3
- package/lib/driver/MergeDriver.js +1 -5
- package/lib/driver/MergeDriver.js.map +1 -1
- package/lib/merger/JsonMerger.d.ts +0 -3
- package/lib/merger/JsonMerger.js +212 -20
- package/lib/merger/JsonMerger.js.map +1 -1
- package/lib/merger/XmlMerger.d.ts +0 -5
- package/lib/merger/XmlMerger.js +16 -19
- package/lib/merger/XmlMerger.js.map +1 -1
- package/lib/merger/conflictMarker.d.ts +12 -0
- package/lib/merger/conflictMarker.js +48 -0
- package/lib/merger/conflictMarker.js.map +1 -0
- package/lib/merger/textAttribute.d.ts +3 -0
- package/lib/merger/textAttribute.js +56 -0
- package/lib/merger/textAttribute.js.map +1 -0
- package/lib/service/NamespaceHandler.js +2 -1
- package/lib/service/NamespaceHandler.js.map +1 -1
- package/lib/types/conflictTypes.d.ts +1 -1
- package/lib/types/mergeScenario.d.ts +1 -0
- package/lib/types/mergeScenario.js +20 -0
- package/lib/types/mergeScenario.js.map +1 -1
- package/lib/utils/mergeUtils.d.ts +5 -0
- package/lib/utils/mergeUtils.js +14 -0
- package/lib/utils/mergeUtils.js.map +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/oclif.manifest.json +4 -4
- package/package.json +2 -2
- package/lib/merger/ConflictMarkerBuilder.d.ts +0 -3
- package/lib/merger/ConflictMarkerBuilder.js +0 -33
- package/lib/merger/ConflictMarkerBuilder.js.map +0 -1
- package/lib/merger/ConflictMarkerFormatter.d.ts +0 -14
- package/lib/merger/ConflictMarkerFormatter.js +0 -43
- package/lib/merger/ConflictMarkerFormatter.js.map +0 -1
- package/lib/merger/MergeContext.d.ts +0 -17
- package/lib/merger/MergeContext.js +0 -2
- package/lib/merger/MergeContext.js.map +0 -1
- package/lib/merger/MergeOrchestrator.d.ts +0 -13
- package/lib/merger/MergeOrchestrator.js +0 -46
- package/lib/merger/MergeOrchestrator.js.map +0 -1
- package/lib/merger/MergeScenarioFactory.d.ts +0 -2
- package/lib/merger/MergeScenarioFactory.js +0 -22
- package/lib/merger/MergeScenarioFactory.js.map +0 -1
- package/lib/merger/nodes/KeyedArrayMergeNode.d.ts +0 -12
- package/lib/merger/nodes/KeyedArrayMergeNode.js +0 -67
- package/lib/merger/nodes/KeyedArrayMergeNode.js.map +0 -1
- package/lib/merger/nodes/MergeNode.d.ts +0 -5
- package/lib/merger/nodes/MergeNode.js +0 -2
- package/lib/merger/nodes/MergeNode.js.map +0 -1
- package/lib/merger/nodes/MergeNodeFactory.d.ts +0 -9
- package/lib/merger/nodes/MergeNodeFactory.js +0 -21
- package/lib/merger/nodes/MergeNodeFactory.js.map +0 -1
- package/lib/merger/nodes/ObjectMergeNode.d.ts +0 -20
- package/lib/merger/nodes/ObjectMergeNode.js +0 -49
- package/lib/merger/nodes/ObjectMergeNode.js.map +0 -1
- package/lib/merger/nodes/TextArrayMergeNode.d.ts +0 -12
- package/lib/merger/nodes/TextArrayMergeNode.js +0 -66
- package/lib/merger/nodes/TextArrayMergeNode.js.map +0 -1
- package/lib/merger/nodes/TextMergeNode.d.ts +0 -12
- package/lib/merger/nodes/TextMergeNode.js +0 -36
- package/lib/merger/nodes/TextMergeNode.js.map +0 -1
- package/lib/merger/nodes/nodeUtils.d.ts +0 -5
- package/lib/merger/nodes/nodeUtils.js +0 -20
- package/lib/merger/nodes/nodeUtils.js.map +0 -1
- package/lib/merger/strategies/AllPresentStrategy.d.ts +0 -7
- package/lib/merger/strategies/AllPresentStrategy.js +0 -36
- package/lib/merger/strategies/AllPresentStrategy.js.map +0 -1
- package/lib/merger/strategies/AncestorAndLocalStrategy.d.ts +0 -8
- package/lib/merger/strategies/AncestorAndLocalStrategy.js +0 -64
- package/lib/merger/strategies/AncestorAndLocalStrategy.js.map +0 -1
- package/lib/merger/strategies/AncestorAndOtherStrategy.d.ts +0 -8
- package/lib/merger/strategies/AncestorAndOtherStrategy.js +0 -64
- package/lib/merger/strategies/AncestorAndOtherStrategy.js.map +0 -1
- package/lib/merger/strategies/AncestorOnlyStrategy.d.ts +0 -6
- package/lib/merger/strategies/AncestorOnlyStrategy.js +0 -19
- package/lib/merger/strategies/AncestorOnlyStrategy.js.map +0 -1
- package/lib/merger/strategies/LocalAndOtherStrategy.d.ts +0 -7
- package/lib/merger/strategies/LocalAndOtherStrategy.js +0 -45
- package/lib/merger/strategies/LocalAndOtherStrategy.js.map +0 -1
- package/lib/merger/strategies/LocalOnlyStrategy.d.ts +0 -6
- package/lib/merger/strategies/LocalOnlyStrategy.js +0 -14
- package/lib/merger/strategies/LocalOnlyStrategy.js.map +0 -1
- package/lib/merger/strategies/NoneStrategy.d.ts +0 -6
- package/lib/merger/strategies/NoneStrategy.js +0 -8
- package/lib/merger/strategies/NoneStrategy.js.map +0 -1
- package/lib/merger/strategies/OtherOnlyStrategy.d.ts +0 -6
- package/lib/merger/strategies/OtherOnlyStrategy.js +0 -14
- package/lib/merger/strategies/OtherOnlyStrategy.js.map +0 -1
- package/lib/merger/strategies/ScenarioStrategy.d.ts +0 -5
- package/lib/merger/strategies/ScenarioStrategy.js +0 -2
- package/lib/merger/strategies/ScenarioStrategy.js.map +0 -1
- package/lib/merger/strategies/ScenarioStrategyFactory.d.ts +0 -3
- package/lib/merger/strategies/ScenarioStrategyFactory.js +0 -23
- package/lib/merger/strategies/ScenarioStrategyFactory.js.map +0 -1
- package/lib/merger/strategies/TextMergeStrategy.d.ts +0 -32
- package/lib/merger/strategies/TextMergeStrategy.js +0 -80
- package/lib/merger/strategies/TextMergeStrategy.js.map +0 -1
- package/lib/types/mergeResult.d.ts +0 -8
- package/lib/types/mergeResult.js +0 -33
- package/lib/types/mergeResult.js.map +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { isEmpty } from 'lodash-es';
|
|
2
|
+
import { ANCESTOR_CONFLICT_MARKER, LOCAL_CONFLICT_MARKER, OTHER_CONFLICT_MARKER, SEPARATOR, } from '../constant/conflictConstant.js';
|
|
3
|
+
import { SALESFORCE_EOL } from '../constant/metadataConstant.js';
|
|
4
|
+
import { TEXT_TAG } from '../constant/parserConstant.js';
|
|
5
|
+
const buildMarker = (marker, size, tag) => {
|
|
6
|
+
return `${marker.repeat(size)} ${tag}`;
|
|
7
|
+
};
|
|
8
|
+
const buildSeparator = (size) => {
|
|
9
|
+
return `${SEPARATOR.repeat(size)}`;
|
|
10
|
+
};
|
|
11
|
+
const getEmptyValue = () => {
|
|
12
|
+
return { [TEXT_TAG]: SALESFORCE_EOL };
|
|
13
|
+
};
|
|
14
|
+
const getMarkerValue = (marker, withEol = false) => {
|
|
15
|
+
return { [TEXT_TAG]: `${withEol ? SALESFORCE_EOL : ''}${marker}` };
|
|
16
|
+
};
|
|
17
|
+
export class ConflictMarker {
|
|
18
|
+
static hasConflict = false;
|
|
19
|
+
static baseMarker;
|
|
20
|
+
static localMarker;
|
|
21
|
+
static otherMarker;
|
|
22
|
+
static separatorMarker;
|
|
23
|
+
static hasConflictMarker() {
|
|
24
|
+
return ConflictMarker.hasConflict;
|
|
25
|
+
}
|
|
26
|
+
static addConflictMarkers(acc, local, ancestor, other) {
|
|
27
|
+
ConflictMarker.hasConflict = true;
|
|
28
|
+
const [localValue, ancestorValue, otherValue] = [
|
|
29
|
+
local,
|
|
30
|
+
ancestor,
|
|
31
|
+
other,
|
|
32
|
+
].map(value => (isEmpty(value) ? getEmptyValue() : value));
|
|
33
|
+
acc.push(getMarkerValue(ConflictMarker.localMarker, true));
|
|
34
|
+
acc.push(localValue);
|
|
35
|
+
acc.push(getMarkerValue(ConflictMarker.baseMarker));
|
|
36
|
+
acc.push(ancestorValue);
|
|
37
|
+
acc.push(getMarkerValue(ConflictMarker.separatorMarker));
|
|
38
|
+
acc.push(otherValue);
|
|
39
|
+
acc.push(getMarkerValue(ConflictMarker.otherMarker));
|
|
40
|
+
}
|
|
41
|
+
static setConflictConfig(conflictConfig) {
|
|
42
|
+
ConflictMarker.baseMarker = buildMarker(ANCESTOR_CONFLICT_MARKER, conflictConfig.conflictMarkerSize, conflictConfig.ancestorConflictTag);
|
|
43
|
+
ConflictMarker.localMarker = buildMarker(LOCAL_CONFLICT_MARKER, conflictConfig.conflictMarkerSize, conflictConfig.localConflictTag);
|
|
44
|
+
ConflictMarker.otherMarker = buildMarker(OTHER_CONFLICT_MARKER, conflictConfig.conflictMarkerSize, conflictConfig.otherConflictTag);
|
|
45
|
+
ConflictMarker.separatorMarker = buildSeparator(conflictConfig.conflictMarkerSize);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=conflictMarker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflictMarker.js","sourceRoot":"","sources":["../../src/merger/conflictMarker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { JsonArray, JsonObject, JsonValue } from '../types/jsonTypes.js';
|
|
2
|
+
export declare const generateObj: (value: JsonValue | null, attrib: string) => JsonObject;
|
|
3
|
+
export declare const mergeTextAttribute: (ancestor: JsonValue | null, local: JsonValue | null, other: JsonValue | null, attrib: string) => JsonArray;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { deepEqual } from 'fast-equals';
|
|
2
|
+
import { isNil } from 'lodash-es';
|
|
3
|
+
import { TEXT_TAG } from '../constant/parserConstant.js';
|
|
4
|
+
import { getScenario, MergeScenario } from '../types/mergeScenario.js';
|
|
5
|
+
import { ConflictMarker } from './conflictMarker.js';
|
|
6
|
+
export const generateObj = (value, attrib) => {
|
|
7
|
+
return isNil(value) ? {} : { [attrib]: [{ [TEXT_TAG]: value }] };
|
|
8
|
+
};
|
|
9
|
+
export const mergeTextAttribute = (ancestor, local, other, attrib) => {
|
|
10
|
+
const objAnc = generateObj(ancestor, attrib);
|
|
11
|
+
const objlocal = generateObj(local, attrib);
|
|
12
|
+
const objother = generateObj(other, attrib);
|
|
13
|
+
const scenario = getScenario(objAnc, objlocal, objother);
|
|
14
|
+
const acc = [];
|
|
15
|
+
// Early return for identical values
|
|
16
|
+
if (deepEqual(local, other) &&
|
|
17
|
+
(scenario === MergeScenario.LOCAL_AND_OTHER ||
|
|
18
|
+
scenario === MergeScenario.ALL)) {
|
|
19
|
+
return [objlocal];
|
|
20
|
+
}
|
|
21
|
+
// Handle specific merge scenarios
|
|
22
|
+
switch (scenario) {
|
|
23
|
+
case MergeScenario.OTHER_ONLY:
|
|
24
|
+
acc.push(objother);
|
|
25
|
+
break;
|
|
26
|
+
case MergeScenario.LOCAL_ONLY:
|
|
27
|
+
acc.push(objlocal);
|
|
28
|
+
break;
|
|
29
|
+
case MergeScenario.LOCAL_AND_OTHER:
|
|
30
|
+
ConflictMarker.addConflictMarkers(acc, objlocal, {}, objother);
|
|
31
|
+
break;
|
|
32
|
+
case MergeScenario.ANCESTOR_AND_OTHER:
|
|
33
|
+
if (ancestor !== other) {
|
|
34
|
+
ConflictMarker.addConflictMarkers(acc, {}, objAnc, objother);
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
case MergeScenario.ANCESTOR_AND_LOCAL:
|
|
38
|
+
if (ancestor !== local) {
|
|
39
|
+
ConflictMarker.addConflictMarkers(acc, objlocal, objAnc, {});
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
case MergeScenario.ALL:
|
|
43
|
+
if (ancestor === local) {
|
|
44
|
+
acc.push(objother);
|
|
45
|
+
}
|
|
46
|
+
else if (ancestor === other) {
|
|
47
|
+
acc.push(objlocal);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
ConflictMarker.addConflictMarkers(acc, objlocal, objAnc, objother);
|
|
51
|
+
}
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
return acc;
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=textAttribute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textAttribute.js","sourceRoot":"","sources":["../../src/merger/textAttribute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAExD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAuB,EACvB,MAAc,EACF,EAAE;IACd,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,QAA0B,EAC1B,KAAuB,EACvB,KAAuB,EACvB,MAAc,EACH,EAAE;IACb,MAAM,MAAM,GAAe,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACxD,MAAM,QAAQ,GAAe,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAe,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAkB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACvE,MAAM,GAAG,GAAc,EAAE,CAAA;IAEzB,oCAAoC;IACpC,IACE,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;QACvB,CAAC,QAAQ,KAAK,aAAa,CAAC,eAAe;YACzC,QAAQ,KAAK,aAAa,CAAC,GAAG,CAAC,EACjC,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnB,CAAC;IAED,kCAAkC;IAClC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClB,MAAK;QAEP,KAAK,aAAa,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClB,MAAK;QAEP,KAAK,aAAa,CAAC,eAAe;YAChC,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC9D,MAAK;QAEP,KAAK,aAAa,CAAC,kBAAkB;YACnC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACvB,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC9D,CAAC;YACD,MAAK;QAEP,KAAK,aAAa,CAAC,kBAAkB;YACnC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACvB,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;YAC9D,CAAC;YACD,MAAK;QAEP,KAAK,aAAa,CAAC,GAAG;YACpB,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACpB,CAAC;iBAAM,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;YACpE,CAAC;YACD,MAAK;IACT,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { NAMESPACE_PREFIX, NAMESPACE_ROOT } from '../constant/parserConstant.js';
|
|
3
2
|
import { log } from '../utils/LoggingDecorator.js';
|
|
3
|
+
const NAMESPACE_PREFIX = '@_';
|
|
4
|
+
const NAMESPACE_ROOT = ':@';
|
|
4
5
|
export class NamespaceHandler {
|
|
5
6
|
processNamespaces(ancestor, local, other) {
|
|
6
7
|
const namespaces = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NamespaceHandler.js","sourceRoot":"","sources":["../../src/service/NamespaceHandler.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"NamespaceHandler.js","sourceRoot":"","sources":["../../src/service/NamespaceHandler.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAElD,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAC7B,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,MAAM,OAAO,gBAAgB;IAEpB,iBAAiB,CACtB,QAAgC,EAChC,KAA6B,EAC7B,KAA6B;QAE7B,MAAM,UAAU,GAAe,EAAE,CAAA;QAEjC,2DAA2D;QAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,iEAAiE;gBACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAe,CAAA;gBACvC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAC1C,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;wBACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA,CAAC,8CAA8C;oBAC1E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAGM,qBAAqB,CAAC,GAAc,EAAE,UAAsB;QACjE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,iCAAiC;YACjC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,CAAe,CAAA;YAEvC,yDAAyD;YACzD,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAA;YAE/B,0DAA0D;YAC1D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,CAAC;gBAAC,UAAU,CAAC,cAAc,CAAgB,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;YACpE,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAvCQ;IADN,GAAG;yDAuBH;AAGM;IADN,GAAG;6DAcH"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isEmpty } from 'lodash-es';
|
|
1
2
|
/**
|
|
2
3
|
* Enum representing different merge scenarios based on content presence:
|
|
3
4
|
* - First position: Ancestor content present (1) or absent (0)
|
|
@@ -15,4 +16,23 @@ export var MergeScenario;
|
|
|
15
16
|
MergeScenario[MergeScenario["ANCESTOR_AND_LOCAL"] = 110] = "ANCESTOR_AND_LOCAL";
|
|
16
17
|
MergeScenario[MergeScenario["ALL"] = 111] = "ALL";
|
|
17
18
|
})(MergeScenario || (MergeScenario = {}));
|
|
19
|
+
export const getScenario = (
|
|
20
|
+
// biome-ignore lint/suspicious/noExplicitAny: can be any metadata in json format
|
|
21
|
+
ancestor,
|
|
22
|
+
// biome-ignore lint/suspicious/noExplicitAny: can be any metadata in json format
|
|
23
|
+
local,
|
|
24
|
+
// biome-ignore lint/suspicious/noExplicitAny: can be any metadata in json format
|
|
25
|
+
other) => {
|
|
26
|
+
let scenario = MergeScenario.NONE;
|
|
27
|
+
if (!isEmpty(ancestor)) {
|
|
28
|
+
scenario += 100;
|
|
29
|
+
}
|
|
30
|
+
if (!isEmpty(local)) {
|
|
31
|
+
scenario += 10;
|
|
32
|
+
}
|
|
33
|
+
if (!isEmpty(other)) {
|
|
34
|
+
scenario += 1;
|
|
35
|
+
}
|
|
36
|
+
return scenario;
|
|
37
|
+
};
|
|
18
38
|
//# sourceMappingURL=mergeScenario.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeScenario.js","sourceRoot":"","sources":["../../src/types/mergeScenario.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAN,IAAY,aASX;AATD,WAAY,aAAa;IACvB,iDAAQ,CAAA;IACR,6DAAc,CAAA;IACd,8DAAe,CAAA;IACf,wEAAoB,CAAA;IACpB,qEAAmB,CAAA;IACnB,+EAAwB,CAAA;IACxB,+EAAwB,CAAA;IACxB,iDAAS,CAAA;AACX,CAAC,EATW,aAAa,KAAb,aAAa,QASxB"}
|
|
1
|
+
{"version":3,"file":"mergeScenario.js","sourceRoot":"","sources":["../../src/types/mergeScenario.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC;;;;;GAKG;AACH,MAAM,CAAN,IAAY,aASX;AATD,WAAY,aAAa;IACvB,iDAAQ,CAAA;IACR,6DAAc,CAAA;IACd,8DAAe,CAAA;IACf,wEAAoB,CAAA;IACpB,qEAAmB,CAAA;IACnB,+EAAwB,CAAA;IACxB,+EAAwB,CAAA;IACxB,iDAAS,CAAA;AACX,CAAC,EATW,aAAa,KAAb,aAAa,QASxB;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;AACzB,iFAAiF;AACjF,QAAa;AACb,iFAAiF;AACjF,KAAU;AACV,iFAAiF;AACjF,KAAU,EACK,EAAE;IACjB,IAAI,QAAQ,GAAkB,aAAa,CAAC,IAAI,CAAA;IAChD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,QAAQ,IAAI,GAAG,CAAA;IACjB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,QAAQ,IAAI,EAAE,CAAA;IAChB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,QAAQ,IAAI,CAAC,CAAA;IACf,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
import type { JsonArray, JsonObject, JsonValue } from '../types/jsonTypes.js';
|
|
2
|
+
export declare const isObject: (ancestor: JsonValue | undefined | null, local: JsonValue | undefined | null, other: JsonValue | undefined | null) => boolean;
|
|
3
|
+
export declare const isStringArray: (ancestor: JsonValue | undefined | null, local: JsonValue | undefined | null, other: JsonValue | undefined | null) => boolean;
|
|
4
|
+
export declare const ensureArray: (value: JsonValue) => JsonArray;
|
|
5
|
+
export declare const getUniqueSortedProps: (...objects: (JsonObject | JsonArray)[]) => string[];
|
|
1
6
|
export declare const detectEol: (text: string) => string;
|
|
2
7
|
export declare const normalizeEol: (text: string, eol?: string) => string;
|
package/lib/utils/mergeUtils.js
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
|
+
import { castArray, isNil } from 'lodash-es';
|
|
1
2
|
import { EOL } from 'os';
|
|
2
3
|
const CR = '\r';
|
|
3
4
|
const LF = '\n';
|
|
4
5
|
const CRLF = `${CR}${LF}`;
|
|
5
6
|
const RE_CRLF = /\r\n/g;
|
|
6
7
|
const RE_LF_OR_CRLF = /\r\n|\n/g;
|
|
8
|
+
export const isObject = (ancestor, local, other) =>
|
|
9
|
+
// typeof [ancestor, other, local].find(ele => !isNil(ele)) === 'object'
|
|
10
|
+
[ancestor, local, other].some(ele => !isNil(ele) && typeof ele === 'object');
|
|
11
|
+
export const isStringArray = (ancestor, local, other) =>
|
|
12
|
+
// typeof [ancestor, other, local].find(ele => !isNil(ele)) === 'object'
|
|
13
|
+
[ancestor, local, other].some(ele => !isNil(ele) &&
|
|
14
|
+
Array.isArray(ele) &&
|
|
15
|
+
ele.every(item => typeof item === 'string' || item instanceof String));
|
|
16
|
+
export const ensureArray = (value) => isNil(value) ? [] : castArray(value);
|
|
17
|
+
export const getUniqueSortedProps = (...objects) => Array.from(new Set([...objects]
|
|
18
|
+
.filter(jsonElement => ![undefined, null].includes(jsonElement))
|
|
19
|
+
.map(Object.keys)
|
|
20
|
+
.flat())).sort();
|
|
7
21
|
export const detectEol = (text) => {
|
|
8
22
|
if (!text) {
|
|
9
23
|
return EOL;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeUtils.js","sourceRoot":"","sources":["../../src/utils/mergeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"mergeUtils.js","sourceRoot":"","sources":["../../src/utils/mergeUtils.ts"],"names":[],"mappings":"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"}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sf-git-merge-driver",
|
|
3
|
-
"version": "1.4.0
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "sf-git-merge-driver",
|
|
9
|
-
"version": "1.4.0
|
|
9
|
+
"version": "1.4.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@oclif/core": "^4.8.0",
|
package/oclif.manifest.json
CHANGED
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
"char": "S",
|
|
171
171
|
"name": "ancestor-conflict-tag",
|
|
172
172
|
"summary": "string used to tag ancestor version in conflicts",
|
|
173
|
-
"default": "
|
|
173
|
+
"default": "BASE",
|
|
174
174
|
"hasDynamicHelp": false,
|
|
175
175
|
"multiple": false,
|
|
176
176
|
"type": "option"
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
"char": "X",
|
|
180
180
|
"name": "local-conflict-tag",
|
|
181
181
|
"summary": "string used to tag local version in conflicts",
|
|
182
|
-
"default": "
|
|
182
|
+
"default": "LOCAL",
|
|
183
183
|
"hasDynamicHelp": false,
|
|
184
184
|
"multiple": false,
|
|
185
185
|
"type": "option"
|
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
"char": "Y",
|
|
189
189
|
"name": "other-conflict-tag",
|
|
190
190
|
"summary": "string used to tag other version in conflicts",
|
|
191
|
-
"default": "
|
|
191
|
+
"default": "REMOTE",
|
|
192
192
|
"hasDynamicHelp": false,
|
|
193
193
|
"multiple": false,
|
|
194
194
|
"type": "option"
|
|
@@ -338,5 +338,5 @@
|
|
|
338
338
|
]
|
|
339
339
|
}
|
|
340
340
|
},
|
|
341
|
-
"version": "1.4.0
|
|
341
|
+
"version": "1.4.0"
|
|
342
342
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sf-git-merge-driver",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "1.4.0
|
|
3
|
+
"description": "git remote add origin git@github.com:scolladon/sf-git-merge-driver.git",
|
|
4
|
+
"version": "1.4.0",
|
|
5
5
|
"exports": "./lib/driver/MergeDriver.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"author": "Sébastien Colladon (colladonsebastien@gmail.com)",
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import type { MergeConfig } from '../types/conflictTypes.js';
|
|
2
|
-
import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
|
|
3
|
-
export declare const buildConflictMarkers: (config: MergeConfig, local: JsonObject | JsonArray, ancestor: JsonObject | JsonArray, other: JsonObject | JsonArray) => JsonArray;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { isEmpty } from 'lodash-es';
|
|
2
|
-
import { ANCESTOR_CONFLICT_MARKER, LOCAL_CONFLICT_MARKER, OTHER_CONFLICT_MARKER, SEPARATOR, } from '../constant/conflictConstant.js';
|
|
3
|
-
import { SALESFORCE_EOL } from '../constant/metadataConstant.js';
|
|
4
|
-
import { TEXT_TAG } from '../constant/parserConstant.js';
|
|
5
|
-
const buildMarker = (marker, size, tag) => {
|
|
6
|
-
return `${marker.repeat(size)} ${tag}`;
|
|
7
|
-
};
|
|
8
|
-
const buildSeparator = (size) => {
|
|
9
|
-
return `${SEPARATOR.repeat(size)}`;
|
|
10
|
-
};
|
|
11
|
-
const getEmptyValue = () => {
|
|
12
|
-
return { [TEXT_TAG]: SALESFORCE_EOL };
|
|
13
|
-
};
|
|
14
|
-
const getMarkerValue = (marker, withEol = false) => {
|
|
15
|
-
return { [TEXT_TAG]: `${withEol ? SALESFORCE_EOL : ''}${marker}` };
|
|
16
|
-
};
|
|
17
|
-
export const buildConflictMarkers = (config, local, ancestor, other) => {
|
|
18
|
-
const localMarker = buildMarker(LOCAL_CONFLICT_MARKER, config.conflictMarkerSize, config.localConflictTag);
|
|
19
|
-
const baseMarker = buildMarker(ANCESTOR_CONFLICT_MARKER, config.conflictMarkerSize, config.ancestorConflictTag);
|
|
20
|
-
const otherMarker = buildMarker(OTHER_CONFLICT_MARKER, config.conflictMarkerSize, config.otherConflictTag);
|
|
21
|
-
const separatorMarker = buildSeparator(config.conflictMarkerSize);
|
|
22
|
-
const [localValue, ancestorValue, otherValue] = [local, ancestor, other].map(value => (isEmpty(value) ? getEmptyValue() : value));
|
|
23
|
-
return [
|
|
24
|
-
getMarkerValue(localMarker, true),
|
|
25
|
-
localValue,
|
|
26
|
-
getMarkerValue(baseMarker),
|
|
27
|
-
ancestorValue,
|
|
28
|
-
getMarkerValue(separatorMarker),
|
|
29
|
-
otherValue,
|
|
30
|
-
getMarkerValue(otherMarker),
|
|
31
|
-
];
|
|
32
|
-
};
|
|
33
|
-
//# sourceMappingURL=ConflictMarkerBuilder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConflictMarkerBuilder.js","sourceRoot":"","sources":["../../src/merger/ConflictMarkerBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,SAAS,GACV,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAIxD,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,GAAW,EAAU,EAAE;IACxE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAA;AACxC,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;IAC9C,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;AACpC,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,GAAe,EAAE;IACrC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CACrB,MAAc,EACd,UAAmB,KAAK,EACZ,EAAE;IACd,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,CAAA;AACpE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,MAAmB,EACnB,KAA6B,EAC7B,QAAgC,EAChC,KAA6B,EAClB,EAAE;IACb,MAAM,WAAW,GAAG,WAAW,CAC7B,qBAAqB,EACrB,MAAM,CAAC,kBAAkB,EACzB,MAAM,CAAC,gBAAgB,CACxB,CAAA;IACD,MAAM,UAAU,GAAG,WAAW,CAC5B,wBAAwB,EACxB,MAAM,CAAC,kBAAkB,EACzB,MAAM,CAAC,mBAAmB,CAC3B,CAAA;IACD,MAAM,WAAW,GAAG,WAAW,CAC7B,qBAAqB,EACrB,MAAM,CAAC,kBAAkB,EACzB,MAAM,CAAC,gBAAgB,CACxB,CAAA;IACD,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;IAEjE,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,CAC1E,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CACpD,CAAA;IAED,OAAO;QACL,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC;QACjC,UAAU;QACV,cAAc,CAAC,UAAU,CAAC;QAC1B,aAAa;QACb,cAAc,CAAC,eAAe,CAAC;QAC/B,UAAU;QACV,cAAc,CAAC,WAAW,CAAC;KAC5B,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { MergeConfig } from '../types/conflictTypes.js';
|
|
2
|
-
export declare class ConflictMarkerFormatter {
|
|
3
|
-
private readonly localMarker;
|
|
4
|
-
private readonly ancestorMarker;
|
|
5
|
-
private readonly separator;
|
|
6
|
-
private readonly otherMarker;
|
|
7
|
-
private readonly localEntity;
|
|
8
|
-
private readonly otherEntity;
|
|
9
|
-
private readonly indentRegex;
|
|
10
|
-
constructor(config: MergeConfig);
|
|
11
|
-
correctConflictIndent(xml: string): string;
|
|
12
|
-
handleSpecialEntities(xml: string): string;
|
|
13
|
-
private escapeRegex;
|
|
14
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { ANCESTOR_CONFLICT_MARKER, LOCAL_CONFLICT_MARKER, OTHER_CONFLICT_MARKER, SEPARATOR, } from '../constant/conflictConstant.js';
|
|
2
|
-
export class ConflictMarkerFormatter {
|
|
3
|
-
localMarker;
|
|
4
|
-
ancestorMarker;
|
|
5
|
-
separator;
|
|
6
|
-
otherMarker;
|
|
7
|
-
localEntity;
|
|
8
|
-
otherEntity;
|
|
9
|
-
indentRegex;
|
|
10
|
-
constructor(config) {
|
|
11
|
-
const size = config.conflictMarkerSize;
|
|
12
|
-
// Build marker strings from config size
|
|
13
|
-
this.localMarker = LOCAL_CONFLICT_MARKER.repeat(size);
|
|
14
|
-
this.ancestorMarker = ANCESTOR_CONFLICT_MARKER.repeat(size);
|
|
15
|
-
this.separator = SEPARATOR.repeat(size);
|
|
16
|
-
this.otherMarker = OTHER_CONFLICT_MARKER.repeat(size);
|
|
17
|
-
// Build entity-escaped versions for XML processing
|
|
18
|
-
this.localEntity = '<'.repeat(size);
|
|
19
|
-
this.otherEntity = '>'.repeat(size);
|
|
20
|
-
// Build regex pattern for indent correction
|
|
21
|
-
// Matches any of the conflict markers at start of content
|
|
22
|
-
const escapedMarkers = [
|
|
23
|
-
this.escapeRegex(this.localMarker),
|
|
24
|
-
this.escapeRegex(this.ancestorMarker),
|
|
25
|
-
this.escapeRegex(this.separator),
|
|
26
|
-
this.escapeRegex(this.otherMarker),
|
|
27
|
-
].join('|');
|
|
28
|
-
this.indentRegex = new RegExp(`[ \\t]+(${escapedMarkers})`, 'g');
|
|
29
|
-
}
|
|
30
|
-
correctConflictIndent(xml) {
|
|
31
|
-
return xml.replace(this.indentRegex, '$1').replace(/^[ \t]*[\n\r]+/gm, '');
|
|
32
|
-
}
|
|
33
|
-
handleSpecialEntities(xml) {
|
|
34
|
-
return xml
|
|
35
|
-
.replaceAll('&#160;', ' ')
|
|
36
|
-
.replaceAll(this.localEntity, this.localMarker)
|
|
37
|
-
.replaceAll(this.otherEntity, this.otherMarker);
|
|
38
|
-
}
|
|
39
|
-
escapeRegex(str) {
|
|
40
|
-
return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=ConflictMarkerFormatter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConflictMarkerFormatter.js","sourceRoot":"","sources":["../../src/merger/ConflictMarkerFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,SAAS,GACV,MAAM,iCAAiC,CAAA;AAGxC,MAAM,OAAO,uBAAuB;IACjB,WAAW,CAAQ;IACnB,cAAc,CAAQ;IACtB,SAAS,CAAQ;IACjB,WAAW,CAAQ;IACnB,WAAW,CAAQ;IACnB,WAAW,CAAQ;IACnB,WAAW,CAAQ;IAEpC,YAAY,MAAmB;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,kBAAkB,CAAA;QAEtC,wCAAwC;QACxC,IAAI,CAAC,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACrD,IAAI,CAAC,cAAc,GAAG,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,CAAC,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAErD,mDAAmD;QACnD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAEtC,4CAA4C;QAC5C,0DAA0D;QAC1D,MAAM,cAAc,GAAG;YACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;SACnC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,IAAI,CAAC,WAAW,GAAG,IAAI,MAAM,CAAC,WAAW,cAAc,GAAG,EAAE,GAAG,CAAC,CAAA;IAClE,CAAC;IAED,qBAAqB,CAAC,GAAW;QAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;IAC5E,CAAC;IAED,qBAAqB,CAAC,GAAW;QAC/B,OAAO,GAAG;aACP,UAAU,CAAC,YAAY,EAAE,QAAQ,CAAC;aAClC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;aAC9C,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IACnD,CAAC;IAEO,WAAW,CAAC,GAAW;QAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;IACnD,CAAC;CACF"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { MergeConfig } from '../types/conflictTypes.js';
|
|
2
|
-
import type { JsonValue } from '../types/jsonTypes.js';
|
|
3
|
-
import type { MergeNodeFactory } from './nodes/MergeNodeFactory.js';
|
|
4
|
-
export interface RootKeyInfo {
|
|
5
|
-
readonly name: string;
|
|
6
|
-
readonly existsInLocal: boolean;
|
|
7
|
-
readonly existsInOther: boolean;
|
|
8
|
-
}
|
|
9
|
-
export interface MergeContext {
|
|
10
|
-
readonly config: MergeConfig;
|
|
11
|
-
readonly ancestor: JsonValue;
|
|
12
|
-
readonly local: JsonValue;
|
|
13
|
-
readonly other: JsonValue;
|
|
14
|
-
readonly attribute: string | undefined;
|
|
15
|
-
readonly nodeFactory: MergeNodeFactory;
|
|
16
|
-
readonly rootKey: RootKeyInfo | undefined;
|
|
17
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MergeContext.js","sourceRoot":"","sources":["../../src/merger/MergeContext.ts"],"names":[],"mappings":""}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { MergeConfig } from '../types/conflictTypes.js';
|
|
2
|
-
import type { JsonArray, JsonObject, JsonValue } from '../types/jsonTypes.js';
|
|
3
|
-
import type { MergeResult } from '../types/mergeResult.js';
|
|
4
|
-
import type { RootKeyInfo } from './MergeContext.js';
|
|
5
|
-
import { type MergeNodeFactory } from './nodes/MergeNodeFactory.js';
|
|
6
|
-
export declare class MergeOrchestrator {
|
|
7
|
-
private readonly config;
|
|
8
|
-
private readonly nodeFactory;
|
|
9
|
-
constructor(config: MergeConfig, nodeFactory?: MergeNodeFactory);
|
|
10
|
-
merge(ancestor: JsonValue, local: JsonValue, other: JsonValue, attribute?: string, rootKey?: RootKeyInfo): MergeResult;
|
|
11
|
-
private buildEarlyResult;
|
|
12
|
-
mergeObject(ancestor: JsonObject | JsonArray, local: JsonObject | JsonArray, other: JsonObject | JsonArray): MergeResult;
|
|
13
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { deepEqual } from 'fast-equals';
|
|
2
|
-
import { noConflict } from '../types/mergeResult.js';
|
|
3
|
-
import { MergeScenario } from '../types/mergeScenario.js';
|
|
4
|
-
import { getScenario } from './MergeScenarioFactory.js';
|
|
5
|
-
import { defaultNodeFactory, } from './nodes/MergeNodeFactory.js';
|
|
6
|
-
import { toJsonArray } from './nodes/nodeUtils.js';
|
|
7
|
-
import { getScenarioStrategy } from './strategies/ScenarioStrategyFactory.js';
|
|
8
|
-
export class MergeOrchestrator {
|
|
9
|
-
config;
|
|
10
|
-
nodeFactory;
|
|
11
|
-
constructor(config, nodeFactory = defaultNodeFactory) {
|
|
12
|
-
this.config = config;
|
|
13
|
-
this.nodeFactory = nodeFactory;
|
|
14
|
-
}
|
|
15
|
-
merge(ancestor, local, other, attribute, rootKey) {
|
|
16
|
-
const scenario = getScenario(ancestor, local, other);
|
|
17
|
-
// Early termination: if all three are equal, skip merge
|
|
18
|
-
if (scenario === MergeScenario.ALL) {
|
|
19
|
-
if (deepEqual(ancestor, local) && deepEqual(local, other)) {
|
|
20
|
-
return this.buildEarlyResult(local, rootKey);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
const strategy = getScenarioStrategy(scenario);
|
|
24
|
-
const context = {
|
|
25
|
-
config: this.config,
|
|
26
|
-
ancestor,
|
|
27
|
-
local,
|
|
28
|
-
other,
|
|
29
|
-
attribute,
|
|
30
|
-
nodeFactory: this.nodeFactory,
|
|
31
|
-
rootKey,
|
|
32
|
-
};
|
|
33
|
-
return strategy.execute(context);
|
|
34
|
-
}
|
|
35
|
-
buildEarlyResult(value, rootKey) {
|
|
36
|
-
const content = toJsonArray(value);
|
|
37
|
-
if (rootKey) {
|
|
38
|
-
return noConflict([{ [rootKey.name]: content }]);
|
|
39
|
-
}
|
|
40
|
-
return noConflict(content);
|
|
41
|
-
}
|
|
42
|
-
mergeObject(ancestor, local, other) {
|
|
43
|
-
return this.merge(ancestor, local, other);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=MergeOrchestrator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MergeOrchestrator.js","sourceRoot":"","sources":["../../src/merger/MergeOrchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAIvC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EACL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAE7E,MAAM,OAAO,iBAAiB;IAET;IACA;IAFnB,YACmB,MAAmB,EACnB,cAAgC,kBAAkB;QADlD,WAAM,GAAN,MAAM,CAAa;QACnB,gBAAW,GAAX,WAAW,CAAuC;IAClE,CAAC;IAEJ,KAAK,CACH,QAAmB,EACnB,KAAgB,EAChB,KAAgB,EAChB,SAAkB,EAClB,OAAqB;QAErB,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAEpD,wDAAwD;QACxD,IAAI,QAAQ,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;QAE9C,MAAM,OAAO,GAAiB;YAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ;YACR,KAAK;YACL,KAAK;YACL,SAAS;YACT,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO;SACR,CAAA;QAED,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAEO,gBAAgB,CACtB,KAAgB,EAChB,OAAqB;QAErB,MAAM,OAAO,GAAG,WAAW,CAAC,KAA+B,CAAC,CAAA;QAC5D,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QAClD,CAAC;QACD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED,WAAW,CACT,QAAgC,EAChC,KAA6B,EAC7B,KAA6B;QAE7B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC3C,CAAC;CACF"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { isEmpty } from 'lodash-es';
|
|
2
|
-
import { MergeScenario } from '../types/mergeScenario.js';
|
|
3
|
-
export const getScenario = (
|
|
4
|
-
// biome-ignore lint/suspicious/noExplicitAny: can be any metadata in json format
|
|
5
|
-
ancestor,
|
|
6
|
-
// biome-ignore lint/suspicious/noExplicitAny: can be any metadata in json format
|
|
7
|
-
local,
|
|
8
|
-
// biome-ignore lint/suspicious/noExplicitAny: can be any metadata in json format
|
|
9
|
-
other) => {
|
|
10
|
-
let scenario = MergeScenario.NONE;
|
|
11
|
-
if (!isEmpty(ancestor)) {
|
|
12
|
-
scenario += 100;
|
|
13
|
-
}
|
|
14
|
-
if (!isEmpty(local)) {
|
|
15
|
-
scenario += 10;
|
|
16
|
-
}
|
|
17
|
-
if (!isEmpty(other)) {
|
|
18
|
-
scenario += 1;
|
|
19
|
-
}
|
|
20
|
-
return scenario;
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=MergeScenarioFactory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MergeScenarioFactory.js","sourceRoot":"","sources":["../../src/merger/MergeScenarioFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD,MAAM,CAAC,MAAM,WAAW,GAAG;AACzB,iFAAiF;AACjF,QAAa;AACb,iFAAiF;AACjF,KAAU;AACV,iFAAiF;AACjF,KAAU,EACK,EAAE;IACjB,IAAI,QAAQ,GAAkB,aAAa,CAAC,IAAI,CAAA;IAChD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,QAAQ,IAAI,GAAG,CAAA;IACjB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,QAAQ,IAAI,EAAE,CAAA;IAChB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,QAAQ,IAAI,CAAC,CAAA;IACf,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { MergeConfig } from '../../types/conflictTypes.js';
|
|
2
|
-
import type { JsonArray } from '../../types/jsonTypes.js';
|
|
3
|
-
import type { MergeResult } from '../../types/mergeResult.js';
|
|
4
|
-
import type { MergeNode } from './MergeNode.js';
|
|
5
|
-
export declare class KeyedArrayMergeNode implements MergeNode {
|
|
6
|
-
private readonly ancestor;
|
|
7
|
-
private readonly local;
|
|
8
|
-
private readonly other;
|
|
9
|
-
private readonly attribute;
|
|
10
|
-
constructor(ancestor: JsonArray, local: JsonArray, other: JsonArray, attribute: string);
|
|
11
|
-
merge(config: MergeConfig): MergeResult;
|
|
12
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { MetadataService } from '../../service/MetadataService.js';
|
|
2
|
-
import { combineResults, withConflict } from '../../types/mergeResult.js';
|
|
3
|
-
import { buildConflictMarkers } from '../ConflictMarkerBuilder.js';
|
|
4
|
-
import { MergeOrchestrator } from '../MergeOrchestrator.js';
|
|
5
|
-
import { defaultNodeFactory } from './MergeNodeFactory.js';
|
|
6
|
-
import { toJsonArray } from './nodeUtils.js';
|
|
7
|
-
// Build a Map from array using key extractor, collecting keys into provided Set
|
|
8
|
-
const buildKeyedMap = (arr, keyField, keysSet) => {
|
|
9
|
-
const map = new Map();
|
|
10
|
-
for (const item of arr) {
|
|
11
|
-
const key = keyField(item);
|
|
12
|
-
map.set(key, item);
|
|
13
|
-
keysSet.add(key);
|
|
14
|
-
}
|
|
15
|
-
return map;
|
|
16
|
-
};
|
|
17
|
-
export class KeyedArrayMergeNode {
|
|
18
|
-
ancestor;
|
|
19
|
-
local;
|
|
20
|
-
other;
|
|
21
|
-
attribute;
|
|
22
|
-
constructor(ancestor, local, other, attribute) {
|
|
23
|
-
this.ancestor = ancestor;
|
|
24
|
-
this.local = local;
|
|
25
|
-
this.other = other;
|
|
26
|
-
this.attribute = attribute;
|
|
27
|
-
}
|
|
28
|
-
merge(config) {
|
|
29
|
-
const keyField = MetadataService.getKeyFieldExtractor(this.attribute);
|
|
30
|
-
if (!keyField) {
|
|
31
|
-
const localContent = toJsonArray({ [this.attribute]: this.local });
|
|
32
|
-
const ancestorContent = toJsonArray({ [this.attribute]: this.ancestor });
|
|
33
|
-
const otherContent = toJsonArray({ [this.attribute]: this.other });
|
|
34
|
-
const localObj = (localContent.length === 1 ? localContent[0] : localContent);
|
|
35
|
-
const ancestorObj = (ancestorContent.length === 1 ? ancestorContent[0] : ancestorContent);
|
|
36
|
-
const otherObj = (otherContent.length === 1 ? otherContent[0] : otherContent);
|
|
37
|
-
return withConflict(buildConflictMarkers(config, localObj, ancestorObj, otherObj));
|
|
38
|
-
}
|
|
39
|
-
// Build maps and collect unique keys in a single pass per array
|
|
40
|
-
const allKeys = new Set();
|
|
41
|
-
const keyedAncestor = buildKeyedMap(this.ancestor, keyField, allKeys);
|
|
42
|
-
const keyedLocal = buildKeyedMap(this.local, keyField, allKeys);
|
|
43
|
-
const keyedOther = buildKeyedMap(this.other, keyField, allKeys);
|
|
44
|
-
// Sort keys once
|
|
45
|
-
const sortedKeys = Array.from(allKeys).sort();
|
|
46
|
-
const results = [];
|
|
47
|
-
const orchestrator = new MergeOrchestrator(config, defaultNodeFactory);
|
|
48
|
-
for (const key of sortedKeys) {
|
|
49
|
-
const ancestorOfKey = keyedAncestor.get(key);
|
|
50
|
-
const localOfKey = keyedLocal.get(key);
|
|
51
|
-
const otherOfKey = keyedOther.get(key);
|
|
52
|
-
const result = orchestrator.merge(ancestorOfKey ?? {}, localOfKey ?? {}, otherOfKey ?? {}, this.attribute);
|
|
53
|
-
// istanbul ignore else -- defensive: all current conflict strategies return non-empty output
|
|
54
|
-
if (result.output.length > 0) {
|
|
55
|
-
results.push({
|
|
56
|
-
output: [{ [this.attribute]: result.output }],
|
|
57
|
-
hasConflict: result.hasConflict,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
else if (result.hasConflict) {
|
|
61
|
-
results.push(result);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return combineResults(results);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=KeyedArrayMergeNode.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"KeyedArrayMergeNode.js","sourceRoot":"","sources":["../../../src/merger/nodes/KeyedArrayMergeNode.ts"],"names":[],"mappings":"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"}
|