sf-git-merge-driver 1.4.0-dev-156.21254415558-1 → 1.4.0-dev-159.21317248282-1
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 +30 -6
- package/lib/commands/git/merge/driver/run.js +3 -5
- 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 +6 -0
- package/lib/constant/parserConstant.js +6 -0
- package/lib/constant/parserConstant.js.map +1 -1
- package/lib/driver/MergeDriver.d.ts +3 -0
- package/lib/driver/MergeDriver.js +5 -1
- package/lib/driver/MergeDriver.js.map +1 -1
- package/lib/merger/ConflictMarkerBuilder.d.ts +3 -0
- package/lib/merger/ConflictMarkerBuilder.js +33 -0
- package/lib/merger/ConflictMarkerBuilder.js.map +1 -0
- package/lib/merger/ConflictMarkerFormatter.d.ts +14 -0
- package/lib/merger/ConflictMarkerFormatter.js +43 -0
- package/lib/merger/ConflictMarkerFormatter.js.map +1 -0
- package/lib/merger/JsonMerger.d.ts +3 -0
- package/lib/merger/JsonMerger.js +20 -212
- package/lib/merger/JsonMerger.js.map +1 -1
- package/lib/merger/MergeContext.d.ts +17 -0
- package/lib/merger/MergeContext.js +2 -0
- package/lib/merger/MergeContext.js.map +1 -0
- package/lib/merger/MergeOrchestrator.d.ts +13 -0
- package/lib/merger/MergeOrchestrator.js +46 -0
- package/lib/merger/MergeOrchestrator.js.map +1 -0
- package/lib/merger/MergeScenarioFactory.d.ts +2 -0
- package/lib/merger/MergeScenarioFactory.js +22 -0
- package/lib/merger/MergeScenarioFactory.js.map +1 -0
- package/lib/merger/XmlMerger.d.ts +5 -0
- package/lib/merger/XmlMerger.js +19 -16
- package/lib/merger/XmlMerger.js.map +1 -1
- package/lib/merger/nodes/KeyedArrayMergeNode.d.ts +12 -0
- package/lib/merger/nodes/KeyedArrayMergeNode.js +67 -0
- package/lib/merger/nodes/KeyedArrayMergeNode.js.map +1 -0
- package/lib/merger/nodes/MergeNode.d.ts +5 -0
- package/lib/merger/nodes/MergeNode.js +2 -0
- package/lib/merger/nodes/MergeNode.js.map +1 -0
- package/lib/merger/nodes/MergeNodeFactory.d.ts +9 -0
- package/lib/merger/nodes/MergeNodeFactory.js +21 -0
- package/lib/merger/nodes/MergeNodeFactory.js.map +1 -0
- package/lib/merger/nodes/ObjectMergeNode.d.ts +20 -0
- package/lib/merger/nodes/ObjectMergeNode.js +49 -0
- package/lib/merger/nodes/ObjectMergeNode.js.map +1 -0
- package/lib/merger/nodes/TextArrayMergeNode.d.ts +12 -0
- package/lib/merger/nodes/TextArrayMergeNode.js +66 -0
- package/lib/merger/nodes/TextArrayMergeNode.js.map +1 -0
- package/lib/merger/nodes/TextMergeNode.d.ts +12 -0
- package/lib/merger/nodes/TextMergeNode.js +36 -0
- package/lib/merger/nodes/TextMergeNode.js.map +1 -0
- package/lib/merger/nodes/nodeUtils.d.ts +5 -0
- package/lib/merger/nodes/nodeUtils.js +20 -0
- package/lib/merger/nodes/nodeUtils.js.map +1 -0
- package/lib/merger/strategies/AllPresentStrategy.d.ts +7 -0
- package/lib/merger/strategies/AllPresentStrategy.js +36 -0
- package/lib/merger/strategies/AllPresentStrategy.js.map +1 -0
- package/lib/merger/strategies/AncestorAndLocalStrategy.d.ts +8 -0
- package/lib/merger/strategies/AncestorAndLocalStrategy.js +64 -0
- package/lib/merger/strategies/AncestorAndLocalStrategy.js.map +1 -0
- package/lib/merger/strategies/AncestorAndOtherStrategy.d.ts +8 -0
- package/lib/merger/strategies/AncestorAndOtherStrategy.js +64 -0
- package/lib/merger/strategies/AncestorAndOtherStrategy.js.map +1 -0
- package/lib/merger/strategies/AncestorOnlyStrategy.d.ts +6 -0
- package/lib/merger/strategies/AncestorOnlyStrategy.js +19 -0
- package/lib/merger/strategies/AncestorOnlyStrategy.js.map +1 -0
- package/lib/merger/strategies/LocalAndOtherStrategy.d.ts +7 -0
- package/lib/merger/strategies/LocalAndOtherStrategy.js +45 -0
- package/lib/merger/strategies/LocalAndOtherStrategy.js.map +1 -0
- package/lib/merger/strategies/LocalOnlyStrategy.d.ts +6 -0
- package/lib/merger/strategies/LocalOnlyStrategy.js +14 -0
- package/lib/merger/strategies/LocalOnlyStrategy.js.map +1 -0
- package/lib/merger/strategies/NoneStrategy.d.ts +6 -0
- package/lib/merger/strategies/NoneStrategy.js +8 -0
- package/lib/merger/strategies/NoneStrategy.js.map +1 -0
- package/lib/merger/strategies/OtherOnlyStrategy.d.ts +6 -0
- package/lib/merger/strategies/OtherOnlyStrategy.js +14 -0
- package/lib/merger/strategies/OtherOnlyStrategy.js.map +1 -0
- package/lib/merger/strategies/ScenarioStrategy.d.ts +5 -0
- package/lib/merger/strategies/ScenarioStrategy.js +2 -0
- package/lib/merger/strategies/ScenarioStrategy.js.map +1 -0
- package/lib/merger/strategies/ScenarioStrategyFactory.d.ts +3 -0
- package/lib/merger/strategies/ScenarioStrategyFactory.js +23 -0
- package/lib/merger/strategies/ScenarioStrategyFactory.js.map +1 -0
- package/lib/merger/strategies/TextMergeStrategy.d.ts +32 -0
- package/lib/merger/strategies/TextMergeStrategy.js +80 -0
- package/lib/merger/strategies/TextMergeStrategy.js.map +1 -0
- package/lib/service/NamespaceHandler.js +1 -2
- package/lib/service/NamespaceHandler.js.map +1 -1
- package/lib/types/conflictTypes.d.ts +1 -1
- package/lib/types/mergeResult.d.ts +8 -0
- package/lib/types/mergeResult.js +33 -0
- package/lib/types/mergeResult.js.map +1 -0
- package/lib/types/mergeScenario.d.ts +0 -1
- package/lib/types/mergeScenario.js +0 -20
- package/lib/types/mergeScenario.js.map +1 -1
- package/lib/utils/mergeUtils.d.ts +0 -5
- package/lib/utils/mergeUtils.js +0 -14
- 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/conflictMarker.d.ts +0 -12
- package/lib/merger/conflictMarker.js +0 -48
- package/lib/merger/conflictMarker.js.map +0 -1
- package/lib/merger/textAttribute.d.ts +0 -3
- package/lib/merger/textAttribute.js +0 -56
- package/lib/merger/textAttribute.js.map +0 -1
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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,6 +1,11 @@
|
|
|
1
|
+
import type { MergeConfig } from '../types/conflictTypes.js';
|
|
1
2
|
export declare class XmlMerger {
|
|
3
|
+
private readonly config;
|
|
4
|
+
private readonly formatter;
|
|
5
|
+
constructor(config: MergeConfig);
|
|
2
6
|
mergeThreeWay(ancestorContent: string, ourContent: string, theirContent: string): {
|
|
3
7
|
output: string;
|
|
4
8
|
hasConflict: boolean;
|
|
5
9
|
};
|
|
10
|
+
private formatXmlOutput;
|
|
6
11
|
}
|
package/lib/merger/XmlMerger.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import { XMLBuilder, XMLParser } from 'fast-xml-parser';
|
|
3
|
+
import { CDATA_PROP_NAME, XML_COMMENT_PROP_NAME, XML_DECL, XML_INDENT, } from '../constant/parserConstant.js';
|
|
3
4
|
import { log } from '../utils/LoggingDecorator.js';
|
|
5
|
+
import { ConflictMarkerFormatter } from './ConflictMarkerFormatter.js';
|
|
4
6
|
import { JsonMerger } from './JsonMerger.js';
|
|
5
|
-
const XML_DECL = '<?xml version="1.0" encoding="UTF-8"?>\n';
|
|
6
|
-
const XML_COMMENT_PROP_NAME = '#xml__comment';
|
|
7
7
|
const baseOptions = {
|
|
8
|
-
cdataPropName:
|
|
8
|
+
cdataPropName: CDATA_PROP_NAME,
|
|
9
9
|
commentPropName: XML_COMMENT_PROP_NAME,
|
|
10
10
|
ignoreAttributes: false,
|
|
11
11
|
processEntities: false,
|
|
@@ -16,41 +16,44 @@ const parserOptions = {
|
|
|
16
16
|
numberParseOptions: { leadingZeros: false, hex: false },
|
|
17
17
|
parseAttributeValue: false,
|
|
18
18
|
parseTagValue: false,
|
|
19
|
-
// preserveOrder: true,
|
|
20
19
|
};
|
|
21
20
|
const builderOptions = {
|
|
22
21
|
...baseOptions,
|
|
23
22
|
format: true,
|
|
24
|
-
indentBy:
|
|
23
|
+
indentBy: XML_INDENT,
|
|
25
24
|
preserveOrder: true,
|
|
26
25
|
};
|
|
27
26
|
const correctComments = (xml) => xml.includes('<!--') ? xml.replace(/\s+<!--(.*?)-->\s+/g, '<!--$1-->') : xml;
|
|
28
|
-
const correctConflictIndent = (xml) => xml
|
|
29
|
-
.replace(/[ \t]+(<<<<<<<|\|\|\|\|\|\|\||=======|>>>>>>>)/g, '$1')
|
|
30
|
-
.replace(/^[ \t]*[\n\r]+/gm, '');
|
|
31
|
-
const handleSpecialEntities = (xml) => xml
|
|
32
|
-
.replaceAll('&#160;', ' ')
|
|
33
|
-
.replaceAll('<<<<<<<', '<<<<<<<')
|
|
34
|
-
.replaceAll('>>>>>>>', '>>>>>>>');
|
|
35
27
|
export class XmlMerger {
|
|
28
|
+
config;
|
|
29
|
+
formatter;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.config = config;
|
|
32
|
+
this.formatter = new ConflictMarkerFormatter(config);
|
|
33
|
+
}
|
|
36
34
|
mergeThreeWay(ancestorContent, ourContent, theirContent) {
|
|
37
35
|
const parser = new XMLParser(parserOptions);
|
|
38
36
|
const ancestorObj = parser.parse(ancestorContent);
|
|
39
37
|
const ourObj = parser.parse(ourContent);
|
|
40
38
|
const theirObj = parser.parse(theirContent);
|
|
41
39
|
// Perform deep merge of XML objects
|
|
42
|
-
const jsonMerger = new JsonMerger();
|
|
40
|
+
const jsonMerger = new JsonMerger(this.config);
|
|
43
41
|
const mergedResult = jsonMerger.mergeThreeWay(ancestorObj, ourObj, theirObj);
|
|
44
42
|
// Convert back to XML and format
|
|
45
43
|
const builder = new XMLBuilder(builderOptions);
|
|
46
44
|
const mergedXml = builder.build(mergedResult.output);
|
|
47
45
|
return {
|
|
48
|
-
output: mergedXml.length
|
|
49
|
-
? correctConflictIndent(correctComments(XML_DECL.concat(handleSpecialEntities(mergedXml))))
|
|
50
|
-
: '',
|
|
46
|
+
output: mergedXml.length ? this.formatXmlOutput(mergedXml) : '',
|
|
51
47
|
hasConflict: mergedResult.hasConflict,
|
|
52
48
|
};
|
|
53
49
|
}
|
|
50
|
+
formatXmlOutput(xml) {
|
|
51
|
+
let result = XML_DECL.concat(xml);
|
|
52
|
+
result = this.formatter.handleSpecialEntities(result);
|
|
53
|
+
result = correctComments(result);
|
|
54
|
+
result = this.formatter.correctConflictIndent(result);
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
54
57
|
}
|
|
55
58
|
__decorate([
|
|
56
59
|
log
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XmlMerger.js","sourceRoot":"","sources":["../../src/merger/XmlMerger.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"XmlMerger.js","sourceRoot":"","sources":["../../src/merger/XmlMerger.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,QAAQ,EACR,UAAU,GACX,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,WAAW,GAAG;IAClB,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,KAAK;IACvB,eAAe,EAAE,KAAK;CACvB,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,GAAG,WAAW;IACd,iBAAiB,EAAE,IAAI;IACvB,kBAAkB,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;IACvD,mBAAmB,EAAE,KAAK;IAC1B,aAAa,EAAE,KAAK;CACrB,CAAA;AAED,MAAM,cAAc,GAAG;IACrB,GAAG,WAAW;IACd,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,IAAI;CACpB,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,GAAW,EAAU,EAAE,CAC9C,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAE9E,MAAM,OAAO,SAAS;IAGS;IAFZ,SAAS,CAAyB;IAEnD,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;QAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAA;IACtD,CAAC;IAGD,aAAa,CACX,eAAuB,EACvB,UAAkB,EAClB,YAAoB;QAEpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAA;QAE3C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAE3C,oCAAoC;QACpC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9C,MAAM,YAAY,GAAG,UAAU,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE5E,iCAAiC;QACjC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;QAC9C,MAAM,SAAS,GAAW,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC5D,OAAO;YACL,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;YAC/D,WAAW,EAAE,YAAY,CAAC,WAAW;SACtC,CAAA;IACH,CAAC;IAEO,eAAe,CAAC,GAAW;QACjC,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACjC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QACrD,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;QAChC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QACrD,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AA/BC;IADC,GAAG;8CAuBH"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyedArrayMergeNode.js","sourceRoot":"","sources":["../../../src/merger/nodes/KeyedArrayMergeNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MergeNode.js","sourceRoot":"","sources":["../../../src/merger/nodes/MergeNode.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { JsonValue } from '../../types/jsonTypes.js';
|
|
2
|
+
import type { MergeNode } from './MergeNode.js';
|
|
3
|
+
export interface MergeNodeFactory {
|
|
4
|
+
createNode(ancestor: JsonValue, local: JsonValue, other: JsonValue, attribute: string): MergeNode;
|
|
5
|
+
}
|
|
6
|
+
export declare class DefaultMergeNodeFactory implements MergeNodeFactory {
|
|
7
|
+
createNode(ancestor: JsonValue, local: JsonValue, other: JsonValue, attribute: string): MergeNode;
|
|
8
|
+
}
|
|
9
|
+
export declare const defaultNodeFactory: DefaultMergeNodeFactory;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { every, isArray, isString, isObject as lodashIsObject, some, } from 'lodash-es';
|
|
2
|
+
import { KeyedArrayMergeNode } from './KeyedArrayMergeNode.js';
|
|
3
|
+
import { ensureArray } from './nodeUtils.js';
|
|
4
|
+
import { TextArrayMergeNode } from './TextArrayMergeNode.js';
|
|
5
|
+
import { TextMergeNode } from './TextMergeNode.js';
|
|
6
|
+
const hasObject = (...values) => some(values, lodashIsObject);
|
|
7
|
+
const hasStringArray = (...values) => some(values, value => isArray(value) && every(value, isString));
|
|
8
|
+
export class DefaultMergeNodeFactory {
|
|
9
|
+
createNode(ancestor, local, other, attribute) {
|
|
10
|
+
const [ancestorArr, localArr, otherArr] = [ancestor, local, other].map(ensureArray);
|
|
11
|
+
if (hasStringArray(ancestor, local, other)) {
|
|
12
|
+
return new TextArrayMergeNode(ancestorArr, localArr, otherArr, attribute);
|
|
13
|
+
}
|
|
14
|
+
if (hasObject(ancestor, local, other)) {
|
|
15
|
+
return new KeyedArrayMergeNode(ancestorArr, localArr, otherArr, attribute);
|
|
16
|
+
}
|
|
17
|
+
return new TextMergeNode(ancestor, local, other, attribute);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export const defaultNodeFactory = new DefaultMergeNodeFactory();
|
|
21
|
+
//# sourceMappingURL=MergeNodeFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MergeNodeFactory.js","sourceRoot":"","sources":["../../../src/merger/nodes/MergeNodeFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,IAAI,cAAc,EAC1B,IAAI,GACL,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,SAAS,GAAG,CAAC,GAAG,MAAwC,EAAW,EAAE,CACzE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAE9B,MAAM,cAAc,GAAG,CAAC,GAAG,MAAwC,EAAW,EAAE,CAC9E,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;AAWjE,MAAM,OAAO,uBAAuB;IAClC,UAAU,CACR,QAAmB,EACnB,KAAgB,EAChB,KAAgB,EAChB,SAAiB;QAEjB,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,CACpE,WAAW,CACZ,CAAA;QAED,IAAI,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,kBAAkB,CAC3B,WAAwB,EACxB,QAAqB,EACrB,QAAqB,EACrB,SAAS,CACV,CAAA;QACH,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,mBAAmB,CAC5B,WAAwB,EACxB,QAAqB,EACrB,QAAqB,EACrB,SAAS,CACV,CAAA;QACH,CAAC;QAED,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IAC7D,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,uBAAuB,EAAE,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MergeConfig } from '../../types/conflictTypes.js';
|
|
2
|
+
import type { JsonArray, JsonObject } from '../../types/jsonTypes.js';
|
|
3
|
+
import type { MergeResult } from '../../types/mergeResult.js';
|
|
4
|
+
import type { MergeContext } from '../MergeContext.js';
|
|
5
|
+
import type { MergeNode } from './MergeNode.js';
|
|
6
|
+
export declare class ObjectMergeNode implements MergeNode {
|
|
7
|
+
private readonly ancestor;
|
|
8
|
+
private readonly local;
|
|
9
|
+
private readonly other;
|
|
10
|
+
constructor(ancestor: JsonObject | JsonArray, local: JsonObject | JsonArray, other: JsonObject | JsonArray);
|
|
11
|
+
merge(config: MergeConfig): MergeResult;
|
|
12
|
+
}
|
|
13
|
+
export declare class NestedObjectMergeNode implements MergeNode {
|
|
14
|
+
private readonly ancestor;
|
|
15
|
+
private readonly local;
|
|
16
|
+
private readonly other;
|
|
17
|
+
constructor(ancestor: JsonObject | JsonArray, local: JsonObject | JsonArray, other: JsonObject | JsonArray);
|
|
18
|
+
merge(config: MergeConfig): MergeResult;
|
|
19
|
+
mergeWithContext(context: MergeContext): MergeResult;
|
|
20
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { combineResults } from '../../types/mergeResult.js';
|
|
2
|
+
import { MergeOrchestrator } from '../MergeOrchestrator.js';
|
|
3
|
+
import { defaultNodeFactory } from './MergeNodeFactory.js';
|
|
4
|
+
import { getUniqueSortedProps } from './nodeUtils.js';
|
|
5
|
+
export class ObjectMergeNode {
|
|
6
|
+
ancestor;
|
|
7
|
+
local;
|
|
8
|
+
other;
|
|
9
|
+
constructor(ancestor, local, other) {
|
|
10
|
+
this.ancestor = ancestor;
|
|
11
|
+
this.local = local;
|
|
12
|
+
this.other = other;
|
|
13
|
+
}
|
|
14
|
+
merge(config) {
|
|
15
|
+
const props = getUniqueSortedProps(this.ancestor, this.local, this.other);
|
|
16
|
+
const results = [];
|
|
17
|
+
for (const key of props) {
|
|
18
|
+
const ancestorOfKey = this.ancestor[key];
|
|
19
|
+
const localOfKey = this.local[key];
|
|
20
|
+
const otherOfKey = this.other[key];
|
|
21
|
+
const childNode = defaultNodeFactory.createNode(ancestorOfKey, localOfKey, otherOfKey, key);
|
|
22
|
+
const childResult = childNode.merge(config);
|
|
23
|
+
results.push({
|
|
24
|
+
output: childResult.output.map(item => ({ [key]: item })),
|
|
25
|
+
hasConflict: childResult.hasConflict,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return combineResults(results);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class NestedObjectMergeNode {
|
|
32
|
+
ancestor;
|
|
33
|
+
local;
|
|
34
|
+
other;
|
|
35
|
+
constructor(ancestor, local, other) {
|
|
36
|
+
this.ancestor = ancestor;
|
|
37
|
+
this.local = local;
|
|
38
|
+
this.other = other;
|
|
39
|
+
}
|
|
40
|
+
merge(config) {
|
|
41
|
+
const orchestrator = new MergeOrchestrator(config, defaultNodeFactory);
|
|
42
|
+
return orchestrator.mergeObject(this.ancestor, this.local, this.other);
|
|
43
|
+
}
|
|
44
|
+
mergeWithContext(context) {
|
|
45
|
+
const orchestrator = new MergeOrchestrator(context.config, context.nodeFactory);
|
|
46
|
+
return orchestrator.mergeObject(this.ancestor, this.local, this.other);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=ObjectMergeNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectMergeNode.js","sourceRoot":"","sources":["../../../src/merger/nodes/ObjectMergeNode.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAErD,MAAM,OAAO,eAAe;IAEP;IACA;IACA;IAHnB,YACmB,QAAgC,EAChC,KAA6B,EAC7B,KAA6B;QAF7B,aAAQ,GAAR,QAAQ,CAAwB;QAChC,UAAK,GAAL,KAAK,CAAwB;QAC7B,UAAK,GAAL,KAAK,CAAwB;IAC7C,CAAC;IAEJ,KAAK,CAAC,MAAmB;QACvB,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACzE,MAAM,OAAO,GAAkB,EAAE,CAAA;QAEjC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAElC,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAC7C,aAAa,EACb,UAAU,EACV,UAAU,EACV,GAAG,CACJ,CAAA;YACD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAE3C,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzD,WAAW,EAAE,WAAW,CAAC,WAAW;aACrC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,cAAc,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;CACF;AAED,MAAM,OAAO,qBAAqB;IAEb;IACA;IACA;IAHnB,YACmB,QAAgC,EAChC,KAA6B,EAC7B,KAA6B;QAF7B,aAAQ,GAAR,QAAQ,CAAwB;QAChC,UAAK,GAAL,KAAK,CAAwB;QAC7B,UAAK,GAAL,KAAK,CAAwB;IAC7C,CAAC;IAEJ,KAAK,CAAC,MAAmB;QACvB,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;QACtE,OAAO,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACxE,CAAC;IAED,gBAAgB,CAAC,OAAqB;QACpC,MAAM,YAAY,GAAG,IAAI,iBAAiB,CACxC,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,WAAW,CACpB,CAAA;QACD,OAAO,YAAY,CAAC,WAAW,CAC7B,IAAI,CAAC,QAAkC,EACvC,IAAI,CAAC,KAA+B,EACpC,IAAI,CAAC,KAA+B,CACrC,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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 TextArrayMergeNode 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
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { isNil } from 'lodash-es';
|
|
2
|
+
import { TEXT_TAG } from '../../constant/parserConstant.js';
|
|
3
|
+
import { noConflict } from '../../types/mergeResult.js';
|
|
4
|
+
const generateObj = (value, attrib) => {
|
|
5
|
+
return isNil(value) ? {} : { [attrib]: [{ [TEXT_TAG]: value }] };
|
|
6
|
+
};
|
|
7
|
+
// Comparator for sorting - handles null/undefined by converting to string
|
|
8
|
+
const compareItems = (a, b) => {
|
|
9
|
+
const strA = String(a);
|
|
10
|
+
const strB = String(b);
|
|
11
|
+
if (strA < strB)
|
|
12
|
+
return -1;
|
|
13
|
+
if (strA > strB)
|
|
14
|
+
return 1;
|
|
15
|
+
return 0;
|
|
16
|
+
};
|
|
17
|
+
export class TextArrayMergeNode {
|
|
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 localSet = new Set(this.local);
|
|
30
|
+
const otherSet = new Set(this.other);
|
|
31
|
+
// Single pass: collect items that should be in result
|
|
32
|
+
// An item is included if:
|
|
33
|
+
// - It exists in local or other (union)
|
|
34
|
+
// - AND it wasn't removed (existed in ancestor but not in local/other)
|
|
35
|
+
const resultItems = [];
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (const item of this.ancestor) {
|
|
38
|
+
if (seen.has(item))
|
|
39
|
+
continue;
|
|
40
|
+
seen.add(item);
|
|
41
|
+
// Keep if present in both local and other (not removed by either)
|
|
42
|
+
if (localSet.has(item) && otherSet.has(item)) {
|
|
43
|
+
resultItems.push(item);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Items from local not yet seen are new additions (not in ancestor)
|
|
47
|
+
for (const item of this.local) {
|
|
48
|
+
if (seen.has(item))
|
|
49
|
+
continue;
|
|
50
|
+
seen.add(item);
|
|
51
|
+
resultItems.push(item);
|
|
52
|
+
}
|
|
53
|
+
// Items from other not yet seen are new additions (not in ancestor)
|
|
54
|
+
for (const item of this.other) {
|
|
55
|
+
if (seen.has(item))
|
|
56
|
+
continue;
|
|
57
|
+
seen.add(item);
|
|
58
|
+
resultItems.push(item);
|
|
59
|
+
}
|
|
60
|
+
// Sort and transform in single pass using reduce
|
|
61
|
+
resultItems.sort(compareItems);
|
|
62
|
+
const merged = resultItems.map(item => generateObj(item, this.attribute));
|
|
63
|
+
return noConflict(merged);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=TextArrayMergeNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextArrayMergeNode.js","sourceRoot":"","sources":["../../../src/merger/nodes/TextArrayMergeNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MergeConfig } from '../../types/conflictTypes.js';
|
|
2
|
+
import type { JsonValue } from '../../types/jsonTypes.js';
|
|
3
|
+
import type { MergeResult } from '../../types/mergeResult.js';
|
|
4
|
+
import type { MergeNode } from './MergeNode.js';
|
|
5
|
+
export declare class TextMergeNode implements MergeNode {
|
|
6
|
+
private readonly ancestor;
|
|
7
|
+
private readonly local;
|
|
8
|
+
private readonly other;
|
|
9
|
+
private readonly attribute;
|
|
10
|
+
constructor(ancestor: JsonValue | null, local: JsonValue | null, other: JsonValue | null, attribute: string);
|
|
11
|
+
merge(config: MergeConfig): MergeResult;
|
|
12
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isNil } from 'lodash-es';
|
|
2
|
+
import { TEXT_TAG } from '../../constant/parserConstant.js';
|
|
3
|
+
import { noConflict } from '../../types/mergeResult.js';
|
|
4
|
+
import { MergeScenario } from '../../types/mergeScenario.js';
|
|
5
|
+
import { getScenario } from '../MergeScenarioFactory.js';
|
|
6
|
+
import { getTextMergeStrategy } from '../strategies/TextMergeStrategy.js';
|
|
7
|
+
const generateObj = (value, attrib) => {
|
|
8
|
+
return isNil(value) ? {} : { [attrib]: [{ [TEXT_TAG]: value }] };
|
|
9
|
+
};
|
|
10
|
+
export class TextMergeNode {
|
|
11
|
+
ancestor;
|
|
12
|
+
local;
|
|
13
|
+
other;
|
|
14
|
+
attribute;
|
|
15
|
+
constructor(ancestor, local, other, attribute) {
|
|
16
|
+
this.ancestor = ancestor;
|
|
17
|
+
this.local = local;
|
|
18
|
+
this.other = other;
|
|
19
|
+
this.attribute = attribute;
|
|
20
|
+
}
|
|
21
|
+
merge(config) {
|
|
22
|
+
const objAncestor = generateObj(this.ancestor, this.attribute);
|
|
23
|
+
const objLocal = generateObj(this.local, this.attribute);
|
|
24
|
+
const objOther = generateObj(this.other, this.attribute);
|
|
25
|
+
const scenario = getScenario(objAncestor, objLocal, objOther);
|
|
26
|
+
// Early return for identical values - use strict equality for primitives
|
|
27
|
+
if (this.local === this.other &&
|
|
28
|
+
(scenario === MergeScenario.LOCAL_AND_OTHER ||
|
|
29
|
+
scenario === MergeScenario.ALL)) {
|
|
30
|
+
return noConflict([objLocal]);
|
|
31
|
+
}
|
|
32
|
+
const strategy = getTextMergeStrategy(scenario);
|
|
33
|
+
return strategy.handle(config, objAncestor, objLocal, objOther, this.ancestor, this.local, this.other);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=TextMergeNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextMergeNode.js","sourceRoot":"","sources":["../../../src/merger/nodes/TextMergeNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAI3D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAGzE,MAAM,WAAW,GAAG,CAAC,KAAuB,EAAE,MAAc,EAAc,EAAE;IAC1E,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,OAAO,aAAa;IAEL;IACA;IACA;IACA;IAJnB,YACmB,QAA0B,EAC1B,KAAuB,EACvB,KAAuB,EACvB,SAAiB;QAHjB,aAAQ,GAAR,QAAQ,CAAkB;QAC1B,UAAK,GAAL,KAAK,CAAkB;QACvB,UAAK,GAAL,KAAK,CAAkB;QACvB,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEJ,KAAK,CAAC,MAAmB;QACvB,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAC9D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAExD,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAE7D,yEAAyE;QACzE,IACE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;YACzB,CAAC,QAAQ,KAAK,aAAa,CAAC,eAAe;gBACzC,QAAQ,KAAK,aAAa,CAAC,GAAG,CAAC,EACjC,CAAC;YACD,OAAO,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QAC/C,OAAO,QAAQ,CAAC,MAAM,CACpB,MAAM,EACN,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,KAAK,CACX,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { JsonArray, JsonObject, JsonValue } from '../../types/jsonTypes.js';
|
|
2
|
+
export declare const ensureArray: (value: JsonValue) => JsonArray;
|
|
3
|
+
export declare const getUniqueSortedProps: (...objects: (JsonObject | JsonArray)[]) => string[];
|
|
4
|
+
export declare const generateObj: (value: JsonValue | null, attrib: string) => JsonObject;
|
|
5
|
+
export declare const toJsonArray: (inputObj: JsonObject | JsonArray) => JsonArray;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { castArray, flatMap, flow, isNil, isObject, reject, sortBy, uniq, } from 'lodash-es';
|
|
2
|
+
import { TEXT_TAG } from '../../constant/parserConstant.js';
|
|
3
|
+
export const ensureArray = (value) => isNil(value) ? [] : castArray(value);
|
|
4
|
+
const extractSortedKeys = flow((objects) => reject(objects, isNil), objects => flatMap(objects, Object.keys), uniq, sortBy);
|
|
5
|
+
export const getUniqueSortedProps = (...objects) => extractSortedKeys(objects);
|
|
6
|
+
export const generateObj = (value, attrib) => (isNil(value) ? {} : { [attrib]: [{ [TEXT_TAG]: value }] });
|
|
7
|
+
export const toJsonArray = (inputObj) => flatMap(getUniqueSortedProps(inputObj), attribute => {
|
|
8
|
+
const inputObjOfAttr = inputObj[attribute];
|
|
9
|
+
if (isObject(inputObjOfAttr)) {
|
|
10
|
+
const inputObjArr = ensureArray(inputObjOfAttr);
|
|
11
|
+
return flatMap(getUniqueSortedProps(inputObjArr), key => {
|
|
12
|
+
const value = inputObjArr[key];
|
|
13
|
+
return isObject(value)
|
|
14
|
+
? { [attribute]: toJsonArray(value) }
|
|
15
|
+
: generateObj(value, attribute);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return generateObj(inputObjOfAttr, attribute);
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=nodeUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeUtils.js","sourceRoot":"","sources":["../../../src/merger/nodes/nodeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,OAAO,EACP,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,IAAI,GACL,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAA;AAG3D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAa,EAAE,CACzD,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,SAAS,CAAC,KAAK,CAAe,CAAA;AAErD,MAAM,iBAAiB,GAAG,IAAI,CAC5B,CAAC,OAAmC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAC/D,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EACxC,IAAI,EACJ,MAAM,CACP,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,GAAG,OAAmC,EAC5B,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAEzC,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAuB,EACvB,MAAc,EACF,EAAE,CAAC,CAAC,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,CAAC,CAAA;AAE5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgC,EAAa,EAAE,CACzE,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,EAAE;IAClD,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;IAE1C,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,CAAA;QAC/C,OAAO,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,EAAE;YACtD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;YAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC;gBACpB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,KAA+B,CAAC,EAAE;gBAC/D,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,WAAW,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MergeResult } from '../../types/mergeResult.js';
|
|
2
|
+
import type { MergeContext } from '../MergeContext.js';
|
|
3
|
+
import type { ScenarioStrategy } from './ScenarioStrategy.js';
|
|
4
|
+
export declare class AllPresentStrategy implements ScenarioStrategy {
|
|
5
|
+
execute(context: MergeContext): MergeResult;
|
|
6
|
+
private mergeChildren;
|
|
7
|
+
}
|