sf-git-merge-driver 1.5.4 → 1.6.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 +4 -3
- package/lib/adapter/FlxXmlParser.d.ts +5 -0
- package/lib/adapter/FlxXmlParser.js +47 -0
- package/lib/adapter/FlxXmlParser.js.map +1 -0
- package/lib/adapter/FxpXmlSerializer.d.ts +10 -0
- package/lib/adapter/FxpXmlSerializer.js +106 -0
- package/lib/adapter/FxpXmlSerializer.js.map +1 -0
- package/lib/adapter/XmlParser.d.ts +8 -0
- package/lib/adapter/XmlParser.js +2 -0
- package/lib/adapter/XmlParser.js.map +1 -0
- package/lib/adapter/XmlSerializer.d.ts +4 -0
- package/lib/adapter/XmlSerializer.js +2 -0
- package/lib/adapter/XmlSerializer.js.map +1 -0
- package/lib/merger/ConflictMarkerBuilder.d.ts +2 -2
- package/lib/merger/ConflictMarkerBuilder.js +7 -31
- package/lib/merger/ConflictMarkerBuilder.js.map +1 -1
- package/lib/merger/JsonMerger.js +1 -5
- package/lib/merger/JsonMerger.js.map +1 -1
- package/lib/merger/MergeScenarioFactory.js +17 -7
- package/lib/merger/MergeScenarioFactory.js.map +1 -1
- package/lib/merger/XmlMerger.d.ts +3 -3
- package/lib/merger/XmlMerger.js +17 -43
- package/lib/merger/XmlMerger.js.map +1 -1
- package/lib/merger/mergePropertyKeys.d.ts +2 -0
- package/lib/merger/mergePropertyKeys.js +11 -0
- package/lib/merger/mergePropertyKeys.js.map +1 -0
- package/lib/merger/nodes/KeyedArrayIndex.d.ts +3 -0
- package/lib/merger/nodes/KeyedArrayIndex.js +9 -0
- package/lib/merger/nodes/KeyedArrayIndex.js.map +1 -0
- package/lib/merger/nodes/KeyedArrayMergeNode.d.ts +4 -1
- package/lib/merger/nodes/KeyedArrayMergeNode.js +15 -20
- package/lib/merger/nodes/KeyedArrayMergeNode.js.map +1 -1
- package/lib/merger/nodes/KeyedArrayMergeStrategy.d.ts +5 -0
- package/lib/merger/nodes/KeyedArrayMergeStrategy.js +2 -0
- package/lib/merger/nodes/KeyedArrayMergeStrategy.js.map +1 -0
- package/lib/merger/nodes/MergeNodeFactory.js +14 -21
- package/lib/merger/nodes/MergeNodeFactory.js.map +1 -1
- package/lib/merger/nodes/OrderedKeyedArrayMergeStrategy.d.ts +2 -5
- package/lib/merger/nodes/OrderedKeyedArrayMergeStrategy.js +34 -68
- package/lib/merger/nodes/OrderedKeyedArrayMergeStrategy.js.map +1 -1
- package/lib/merger/nodes/PropertyMergeNode.js +5 -5
- package/lib/merger/nodes/PropertyMergeNode.js.map +1 -1
- package/lib/merger/nodes/TextArrayMergeNode.js +15 -16
- package/lib/merger/nodes/TextArrayMergeNode.js.map +1 -1
- package/lib/merger/nodes/TextMergeNode.js +4 -11
- package/lib/merger/nodes/TextMergeNode.js.map +1 -1
- package/lib/merger/strategies/ScenarioStrategy.js +53 -62
- package/lib/merger/strategies/ScenarioStrategy.js.map +1 -1
- package/lib/merger/strategies/TextMergeStrategy.js +8 -8
- package/lib/merger/strategies/TextMergeStrategy.js.map +1 -1
- package/lib/service/InstallService.js +1 -1
- package/lib/service/InstallService.js.map +1 -1
- package/lib/types/conflictBlock.d.ts +9 -0
- package/lib/types/conflictBlock.js +12 -0
- package/lib/types/conflictBlock.js.map +1 -0
- package/lib/types/mergeResult.d.ts +3 -1
- package/lib/types/mergeResult.js +29 -10
- package/lib/types/mergeResult.js.map +1 -1
- package/lib/types/mergeScenario.d.ts +13 -12
- package/lib/types/mergeScenario.js +11 -10
- package/lib/types/mergeScenario.js.map +1 -1
- package/lib/utils/arrayUtils.js +12 -4
- package/lib/utils/arrayUtils.js.map +1 -1
- package/npm-shrinkwrap.json +7159 -8226
- package/oclif.manifest.json +1 -1
- package/package.json +88 -23
- package/lib/merger/nodes/nodeUtils.d.ts +0 -13
- package/lib/merger/nodes/nodeUtils.js +0 -53
- package/lib/merger/nodes/nodeUtils.js.map +0 -1
- package/lib/service/NamespaceHandler.d.ts +0 -5
- package/lib/service/NamespaceHandler.js +0 -43
- package/lib/service/NamespaceHandler.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[]()
|
|
4
4
|
[]()
|
|
5
|
+
[](https://scolladon.github.io/sf-git-merge-driver/dev/bench/runtime/)
|
|
5
6
|
|
|
6
7
|
An intelligent Git merge driver specifically designed for Salesforce metadata files. **Eliminates hours** of manual merge conflicts resolution.
|
|
7
8
|
|
|
@@ -330,7 +331,7 @@ EXAMPLES
|
|
|
330
331
|
$ sf git merge driver install
|
|
331
332
|
```
|
|
332
333
|
|
|
333
|
-
_See code: [src/commands/git/merge/driver/install.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.
|
|
334
|
+
_See code: [src/commands/git/merge/driver/install.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.6.1/src/commands/git/merge/driver/install.ts)_
|
|
334
335
|
|
|
335
336
|
## `sf git merge driver run`
|
|
336
337
|
|
|
@@ -374,7 +375,7 @@ EXAMPLES
|
|
|
374
375
|
- output-file is the path to the file where the merged content will be written
|
|
375
376
|
```
|
|
376
377
|
|
|
377
|
-
_See code: [src/commands/git/merge/driver/run.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.
|
|
378
|
+
_See code: [src/commands/git/merge/driver/run.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.6.1/src/commands/git/merge/driver/run.ts)_
|
|
378
379
|
|
|
379
380
|
## `sf git merge driver uninstall`
|
|
380
381
|
|
|
@@ -404,7 +405,7 @@ EXAMPLES
|
|
|
404
405
|
$ sf git merge driver uninstall
|
|
405
406
|
```
|
|
406
407
|
|
|
407
|
-
_See code: [src/commands/git/merge/driver/uninstall.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.
|
|
408
|
+
_See code: [src/commands/git/merge/driver/uninstall.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.6.1/src/commands/git/merge/driver/uninstall.ts)_
|
|
408
409
|
<!-- commandsstop -->
|
|
409
410
|
|
|
410
411
|
## Changelog
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import FlxParser from '@nodable/flexible-xml-parser';
|
|
2
|
+
import { CDATA_PROP_NAME, NAMESPACE_PREFIX, XML_COMMENT_PROP_NAME, } from '../constant/parserConstant.js';
|
|
3
|
+
// valueParsers works at runtime but is missing from the type definitions
|
|
4
|
+
const flxOptions = {
|
|
5
|
+
skip: { attributes: false, declaration: true },
|
|
6
|
+
tags: { valueParsers: [] },
|
|
7
|
+
attributes: { valueParsers: [] },
|
|
8
|
+
nameFor: { cdata: CDATA_PROP_NAME, comment: XML_COMMENT_PROP_NAME },
|
|
9
|
+
entityParseOptions: { default: false },
|
|
10
|
+
};
|
|
11
|
+
const cleanParserBugs = (record) => {
|
|
12
|
+
for (const key of Object.keys(record)) {
|
|
13
|
+
const val = record[key];
|
|
14
|
+
if (typeof val !== 'object' || val === null)
|
|
15
|
+
continue;
|
|
16
|
+
const child = val;
|
|
17
|
+
delete child['@_version'];
|
|
18
|
+
delete child['@_encoding'];
|
|
19
|
+
if (CDATA_PROP_NAME in child && '#text' in child && child['#text'] === '') {
|
|
20
|
+
delete child['#text'];
|
|
21
|
+
}
|
|
22
|
+
cleanParserBugs(child);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const extractNamespaces = (parsed) => {
|
|
26
|
+
const namespaces = {};
|
|
27
|
+
for (const key of Object.keys(parsed)) {
|
|
28
|
+
const childObj = parsed[key];
|
|
29
|
+
for (const childKey of Object.keys(childObj)) {
|
|
30
|
+
if (childKey.startsWith(NAMESPACE_PREFIX)) {
|
|
31
|
+
namespaces[childKey] = childObj[childKey];
|
|
32
|
+
delete childObj[childKey];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return namespaces;
|
|
37
|
+
};
|
|
38
|
+
export class FlxXmlParser {
|
|
39
|
+
parser = new FlxParser(flxOptions);
|
|
40
|
+
parse(xml) {
|
|
41
|
+
const raw = this.parser.parse(xml);
|
|
42
|
+
cleanParserBugs(raw);
|
|
43
|
+
const namespaces = extractNamespaces(raw);
|
|
44
|
+
return { content: raw, namespaces };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=FlxXmlParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlxXmlParser.js","sourceRoot":"","sources":["../../src/adapter/FlxXmlParser.ts"],"names":[],"mappings":"AAAA,OAAO,SAA8B,MAAM,8BAA8B,CAAA;AACzE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,+BAA+B,CAAA;AAItC,yEAAyE;AACzE,MAAM,UAAU,GAAG;IACjB,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE;IAC9C,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;IAC1B,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;IAChC,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,qBAAqB,EAAE;IACnE,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;CACzB,CAAA;AAEf,MAAM,eAAe,GAAG,CAAC,MAA+B,EAAQ,EAAE;IAChE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,SAAQ;QACrD,MAAM,KAAK,GAAG,GAA8B,CAAA;QAC5C,OAAO,KAAK,CAAC,WAAW,CAAC,CAAA;QACzB,OAAO,KAAK,CAAC,YAAY,CAAC,CAAA;QAC1B,IAAI,eAAe,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1E,OAAO,KAAK,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC;QACD,eAAe,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,CAAC,MAAkB,EAAc,EAAE;IAC3D,MAAM,UAAU,GAAe,EAAE,CAAA;IACjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAe,CAAA;QAC1C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC1C,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAED,MAAM,OAAO,YAAY;IACN,MAAM,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAA;IAEnD,KAAK,CAAC,GAAW;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAe,CAAA;QAChD,eAAe,CAAC,GAA8B,CAAC,CAAA;QAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;QACzC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAA;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MergeConfig } from '../types/conflictTypes.js';
|
|
2
|
+
import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
|
|
3
|
+
import type { XmlSerializer } from './XmlSerializer.js';
|
|
4
|
+
export declare class FxpXmlSerializer implements XmlSerializer {
|
|
5
|
+
private readonly formatter;
|
|
6
|
+
private readonly convert;
|
|
7
|
+
private readonly builder;
|
|
8
|
+
constructor(config: MergeConfig);
|
|
9
|
+
serialize(mergedOutput: JsonArray, namespaces: JsonObject): string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { XMLBuilder } from 'fast-xml-parser';
|
|
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 { CDATA_PROP_NAME, NAMESPACE_ROOT, TEXT_TAG, XML_COMMENT_PROP_NAME, XML_DECL, XML_INDENT, } from '../constant/parserConstant.js';
|
|
5
|
+
import { ConflictMarkerFormatter } from '../merger/ConflictMarkerFormatter.js';
|
|
6
|
+
import { isConflictBlock } from '../types/conflictBlock.js';
|
|
7
|
+
const builderOptions = {
|
|
8
|
+
cdataPropName: CDATA_PROP_NAME,
|
|
9
|
+
commentPropName: XML_COMMENT_PROP_NAME,
|
|
10
|
+
ignoreAttributes: false,
|
|
11
|
+
processEntities: false,
|
|
12
|
+
format: true,
|
|
13
|
+
indentBy: XML_INDENT,
|
|
14
|
+
preserveOrder: true,
|
|
15
|
+
};
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Compact → Ordered Format Converter (created per-serialization with config)
|
|
18
|
+
// ============================================================================
|
|
19
|
+
const isObj = (x) => typeof x === 'object' && x !== null;
|
|
20
|
+
const createConverter = (config) => {
|
|
21
|
+
const wrapText = (value, attribute) => value == null ? {} : { [attribute]: [{ [TEXT_TAG]: value }] };
|
|
22
|
+
const expandConflictContent = (content) => {
|
|
23
|
+
if (content.length === 0)
|
|
24
|
+
return [{ [TEXT_TAG]: SALESFORCE_EOL }];
|
|
25
|
+
return content.flatMap((item) => {
|
|
26
|
+
if (isConflictBlock(item))
|
|
27
|
+
return expandConflict(item);
|
|
28
|
+
if (isObj(item))
|
|
29
|
+
return compactToOrdered(item);
|
|
30
|
+
return { [TEXT_TAG]: item };
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
const expandConflict = (block) => {
|
|
34
|
+
const localMarker = `${SALESFORCE_EOL}${LOCAL_CONFLICT_MARKER.repeat(config.conflictMarkerSize)} ${config.localConflictTag}`;
|
|
35
|
+
const baseMarker = `${ANCESTOR_CONFLICT_MARKER.repeat(config.conflictMarkerSize)} ${config.ancestorConflictTag}`;
|
|
36
|
+
const separator = SEPARATOR.repeat(config.conflictMarkerSize);
|
|
37
|
+
const otherMarker = `${OTHER_CONFLICT_MARKER.repeat(config.conflictMarkerSize)} ${config.otherConflictTag}`;
|
|
38
|
+
return [
|
|
39
|
+
{ [TEXT_TAG]: localMarker },
|
|
40
|
+
...expandConflictContent(block.local),
|
|
41
|
+
{ [TEXT_TAG]: baseMarker },
|
|
42
|
+
...expandConflictContent(block.ancestor),
|
|
43
|
+
{ [TEXT_TAG]: separator },
|
|
44
|
+
...expandConflictContent(block.other),
|
|
45
|
+
{ [TEXT_TAG]: otherMarker },
|
|
46
|
+
];
|
|
47
|
+
};
|
|
48
|
+
const convertItem = (item) => {
|
|
49
|
+
if (isConflictBlock(item))
|
|
50
|
+
return expandConflict(item);
|
|
51
|
+
if (isObj(item))
|
|
52
|
+
return compactToOrdered(item);
|
|
53
|
+
return [{ [TEXT_TAG]: item }];
|
|
54
|
+
};
|
|
55
|
+
const compactToOrdered = (input) => {
|
|
56
|
+
const keys = Object.keys(input).sort();
|
|
57
|
+
return keys.flatMap(attribute => {
|
|
58
|
+
const value = input[attribute];
|
|
59
|
+
if (Array.isArray(value)) {
|
|
60
|
+
const children = value.flatMap(convertItem);
|
|
61
|
+
return { [attribute]: children };
|
|
62
|
+
}
|
|
63
|
+
if (isObj(value)) {
|
|
64
|
+
if (isConflictBlock(value))
|
|
65
|
+
return expandConflict(value);
|
|
66
|
+
return { [attribute]: compactToOrdered(value) };
|
|
67
|
+
}
|
|
68
|
+
return wrapText(value, attribute);
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
return compactToOrdered;
|
|
72
|
+
};
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// Namespace + Post-processing
|
|
75
|
+
// ============================================================================
|
|
76
|
+
const insertNamespaces = (output, namespaces) => {
|
|
77
|
+
if (Object.keys(namespaces).length === 0 || output.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
const root = output[0];
|
|
80
|
+
root[NAMESPACE_ROOT] = { ...namespaces };
|
|
81
|
+
};
|
|
82
|
+
const correctComments = (xml) => xml.includes('<!--') ? xml.replace(/\s+<!--(.*?)-->\s+/g, '<!--$1-->') : xml;
|
|
83
|
+
// ============================================================================
|
|
84
|
+
// Serializer
|
|
85
|
+
// ============================================================================
|
|
86
|
+
export class FxpXmlSerializer {
|
|
87
|
+
formatter;
|
|
88
|
+
convert;
|
|
89
|
+
builder;
|
|
90
|
+
constructor(config) {
|
|
91
|
+
this.formatter = new ConflictMarkerFormatter(config);
|
|
92
|
+
this.convert = createConverter(config);
|
|
93
|
+
this.builder = new XMLBuilder(builderOptions);
|
|
94
|
+
}
|
|
95
|
+
serialize(mergedOutput, namespaces) {
|
|
96
|
+
const ordered = mergedOutput.flatMap((item) => isObj(item) ? this.convert(item) : [{ [TEXT_TAG]: item }]);
|
|
97
|
+
insertNamespaces(ordered, namespaces);
|
|
98
|
+
const xml = this.builder.build(ordered);
|
|
99
|
+
let result = XML_DECL.concat(xml);
|
|
100
|
+
result = this.formatter.handleSpecialEntities(result);
|
|
101
|
+
result = correctComments(result);
|
|
102
|
+
result = this.formatter.correctConflictIndent(result);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=FxpXmlSerializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FxpXmlSerializer.js","sourceRoot":"","sources":["../../src/adapter/FxpXmlSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,SAAS,GACV,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EACL,eAAe,EACf,cAAc,EACd,QAAQ,EACR,qBAAqB,EACrB,QAAQ,EACR,UAAU,GACX,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,OAAO,EAAsB,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAK/E,MAAM,cAAc,GAAG;IACrB,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,KAAK;IACvB,eAAe,EAAE,KAAK;IACtB,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,IAAI;CACpB,CAAA;AAED,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAE/E,MAAM,KAAK,GAAG,CAAC,CAAU,EAAmB,EAAE,CAC5C,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAA;AAErC,MAAM,eAAe,GAAG,CAAC,MAAmB,EAAE,EAAE;IAC9C,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAE,SAAiB,EAAc,EAAE,CACnE,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IAE/D,MAAM,qBAAqB,GAAG,CAAC,OAAkB,EAAa,EAAE;QAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC,CAAA;QACjE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,IAAe,EAAE,EAAE;YACzC,IAAI,eAAe,CAAC,IAAI,CAAC;gBAAE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAA;YACtD,IAAI,KAAK,CAAC,IAAI,CAAC;gBAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAA;YAC9C,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAA;QAC7B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,CAAC,KAAoB,EAAa,EAAE;QACzD,MAAM,WAAW,GAAG,GAAG,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAA;QAC5H,MAAM,UAAU,GAAG,GAAG,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAA;QAChH,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;QAC7D,MAAM,WAAW,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAA;QAE3G,OAAO;YACL,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE;YAC3B,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAkB,CAAC;YAClD,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE;YAC1B,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAqB,CAAC;YACrD,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE;YACzB,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAkB,CAAC;YAClD,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE;SAC5B,CAAA;IACH,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,IAAe,EAAa,EAAE;QACjD,IAAI,eAAe,CAAC,IAAI,CAAC;YAAE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAA;QACtD,IAAI,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAA;QAC9C,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/B,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,CAAC,KAA6B,EAAa,EAAE;QACpE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAA;YAE9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;gBAC3C,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;YAClC,CAAC;YAED,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjB,IAAI,eAAe,CAAC,KAAK,CAAC;oBAAE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAA;gBACxD,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAA;YACjD,CAAC;YAED,OAAO,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,OAAO,gBAAgB,CAAA;AACzB,CAAC,CAAA;AAED,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,MAAM,gBAAgB,GAAG,CAAC,MAAiB,EAAE,UAAsB,EAAQ,EAAE;IAC3E,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAe,CAAA;IACpC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,CAAA;AAC1C,CAAC,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,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,MAAM,OAAO,gBAAgB;IACV,SAAS,CAAyB;IAClC,OAAO,CAA8C;IACrD,OAAO,CAAY;IAEpC,YAAY,MAAmB;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAA;QACpD,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;IAC/C,CAAC;IAED,SAAS,CAAC,YAAuB,EAAE,UAAsB;QACvD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,IAAe,EAAE,EAAE,CACvD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAC1D,CAAA;QACD,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAErC,MAAM,GAAG,GAAW,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAE/C,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XmlParser.js","sourceRoot":"","sources":["../../src/adapter/XmlParser.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XmlSerializer.js","sourceRoot":"","sources":["../../src/adapter/XmlSerializer.ts"],"names":[],"mappings":""}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ConflictBlock } from '../types/conflictBlock.js';
|
|
2
2
|
import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
|
|
3
|
-
export declare const buildConflictMarkers: (
|
|
3
|
+
export declare const buildConflictMarkers: (local: JsonObject | JsonArray, ancestor: JsonObject | JsonArray, other: JsonObject | JsonArray) => ConflictBlock;
|
|
@@ -1,33 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
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
|
-
];
|
|
1
|
+
import { buildConflictBlock, } from '../types/conflictBlock.js';
|
|
2
|
+
const hasNoContent = (x) => Array.isArray(x) ? x.length === 0 : Object.keys(x).length === 0;
|
|
3
|
+
export const buildConflictMarkers = (local, ancestor, other) => {
|
|
4
|
+
const localValue = hasNoContent(local) ? {} : local;
|
|
5
|
+
const ancestorValue = hasNoContent(ancestor) ? {} : ancestor;
|
|
6
|
+
const otherValue = hasNoContent(other) ? {} : other;
|
|
7
|
+
return buildConflictBlock(localValue, ancestorValue, otherValue);
|
|
32
8
|
};
|
|
33
9
|
//# sourceMappingURL=ConflictMarkerBuilder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConflictMarkerBuilder.js","sourceRoot":"","sources":["../../src/merger/ConflictMarkerBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ConflictMarkerBuilder.js","sourceRoot":"","sources":["../../src/merger/ConflictMarkerBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAEnB,MAAM,2BAA2B,CAAA;AAGlC,MAAM,YAAY,GAAG,CAAC,CAAyB,EAAW,EAAE,CAC1D,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,KAA6B,EAC7B,QAAgC,EAChC,KAA6B,EACd,EAAE;IACjB,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IACnD,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC5D,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAEnD,OAAO,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,UAAU,CAAC,CAAA;AAClE,CAAC,CAAA"}
|
package/lib/merger/JsonMerger.js
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { NamespaceHandler } from '../service/NamespaceHandler.js';
|
|
3
2
|
import { combineResults } from '../types/mergeResult.js';
|
|
4
3
|
import { log } from '../utils/LoggingDecorator.js';
|
|
5
4
|
import { MergeOrchestrator } from './MergeOrchestrator.js';
|
|
5
|
+
import { getUniqueSortedProps } from './mergePropertyKeys.js';
|
|
6
6
|
import { defaultNodeFactory } from './nodes/MergeNodeFactory.js';
|
|
7
|
-
import { getUniqueSortedProps } from './nodes/nodeUtils.js';
|
|
8
7
|
export class JsonMerger {
|
|
9
8
|
orchestrator;
|
|
10
9
|
constructor(config) {
|
|
11
10
|
this.orchestrator = new MergeOrchestrator(config, defaultNodeFactory);
|
|
12
11
|
}
|
|
13
12
|
mergeThreeWay(ancestor, local, other) {
|
|
14
|
-
const namespaceHandler = new NamespaceHandler();
|
|
15
|
-
const namespaces = namespaceHandler.processNamespaces(ancestor, local, other);
|
|
16
13
|
const results = [];
|
|
17
14
|
const props = getUniqueSortedProps(ancestor, local, other);
|
|
18
15
|
for (const key of props) {
|
|
@@ -24,7 +21,6 @@ export class JsonMerger {
|
|
|
24
21
|
results.push(result);
|
|
25
22
|
}
|
|
26
23
|
const combined = combineResults(results);
|
|
27
|
-
namespaceHandler.addNamespacesToResult(combined.output, namespaces);
|
|
28
24
|
return {
|
|
29
25
|
output: combined.output,
|
|
30
26
|
hasConflict: combined.hasConflict,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonMerger.js","sourceRoot":"","sources":["../../src/merger/JsonMerger.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"JsonMerger.js","sourceRoot":"","sources":["../../src/merger/JsonMerger.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAEhE,MAAM,OAAO,UAAU;IACJ,YAAY,CAAmB;IAEhD,YAAY,MAAmB;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IACvE,CAAC;IAGM,aAAa,CAClB,QAAgC,EAChC,KAA6B,EAC7B,KAA6B;QAE7B,MAAM,OAAO,GAAkB,EAAE,CAAA;QACjC,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAE1D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CACpC,QAAQ,CAAC,GAAG,CAAC,EACb,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,GAAG,CAAC,EACV,SAAS,EACT;gBACE,IAAI,EAAE,GAAG;gBACT,aAAa,EAAE,GAAG,IAAI,KAAK;gBAC3B,aAAa,EAAE,GAAG,IAAI,KAAK;aAC5B,CACF,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACtB,CAAC;QAED,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QACxC,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAA;IACH,CAAC;CACF;AA7BQ;IADN,GAAG;+CA6BH"}
|
|
@@ -1,15 +1,25 @@
|
|
|
1
|
-
import { isEmpty } from 'lodash-es';
|
|
2
1
|
import { MergeScenario } from '../types/mergeScenario.js';
|
|
2
|
+
const isPresent = (value) => {
|
|
3
|
+
if (value == null)
|
|
4
|
+
return false;
|
|
5
|
+
if (typeof value === 'string')
|
|
6
|
+
return value.length > 0;
|
|
7
|
+
if (Array.isArray(value))
|
|
8
|
+
return value.length > 0;
|
|
9
|
+
if (typeof value === 'object')
|
|
10
|
+
return Object.keys(value).length > 0;
|
|
11
|
+
return true;
|
|
12
|
+
};
|
|
3
13
|
export const getScenario = (ancestor, local, other) => {
|
|
4
14
|
let scenario = MergeScenario.NONE;
|
|
5
|
-
if (
|
|
6
|
-
scenario
|
|
15
|
+
if (isPresent(ancestor)) {
|
|
16
|
+
scenario |= MergeScenario.ANCESTOR_ONLY;
|
|
7
17
|
}
|
|
8
|
-
if (
|
|
9
|
-
scenario
|
|
18
|
+
if (isPresent(local)) {
|
|
19
|
+
scenario |= MergeScenario.LOCAL_ONLY;
|
|
10
20
|
}
|
|
11
|
-
if (
|
|
12
|
-
scenario
|
|
21
|
+
if (isPresent(other)) {
|
|
22
|
+
scenario |= MergeScenario.OTHER_ONLY;
|
|
13
23
|
}
|
|
14
24
|
return scenario;
|
|
15
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeScenarioFactory.js","sourceRoot":"","sources":["../../src/merger/MergeScenarioFactory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MergeScenarioFactory.js","sourceRoot":"","sources":["../../src/merger/MergeScenarioFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD,MAAM,SAAS,GAAG,CAAC,KAAgB,EAAW,EAAE;IAC9C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAA;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IACtD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IACnE,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,QAAmB,EACnB,KAAgB,EAChB,KAAgB,EACD,EAAE;IACjB,IAAI,QAAQ,GAAG,aAAa,CAAC,IAAc,CAAA;IAC3C,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,QAAQ,IAAI,aAAa,CAAC,aAAa,CAAA;IACzC,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,QAAQ,IAAI,aAAa,CAAC,UAAU,CAAA;IACtC,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,QAAQ,IAAI,aAAa,CAAC,UAAU,CAAA;IACtC,CAAC;IACD,OAAO,QAAyB,CAAA;AAClC,CAAC,CAAA"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { MergeConfig } from '../types/conflictTypes.js';
|
|
2
2
|
export declare class XmlMerger {
|
|
3
|
-
private readonly
|
|
4
|
-
private readonly
|
|
3
|
+
private readonly parser;
|
|
4
|
+
private readonly serializer;
|
|
5
|
+
private readonly jsonMerger;
|
|
5
6
|
constructor(config: MergeConfig);
|
|
6
7
|
mergeThreeWay(ancestorContent: string, ourContent: string, theirContent: string): {
|
|
7
8
|
output: string;
|
|
8
9
|
hasConflict: boolean;
|
|
9
10
|
};
|
|
10
|
-
private formatXmlOutput;
|
|
11
11
|
}
|
package/lib/merger/XmlMerger.js
CHANGED
|
@@ -1,57 +1,31 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { FlxXmlParser } from '../adapter/FlxXmlParser.js';
|
|
3
|
+
import { FxpXmlSerializer } from '../adapter/FxpXmlSerializer.js';
|
|
4
4
|
import { log } from '../utils/LoggingDecorator.js';
|
|
5
|
-
import { ConflictMarkerFormatter } from './ConflictMarkerFormatter.js';
|
|
6
5
|
import { JsonMerger } from './JsonMerger.js';
|
|
7
|
-
const
|
|
8
|
-
cdataPropName: CDATA_PROP_NAME,
|
|
9
|
-
commentPropName: XML_COMMENT_PROP_NAME,
|
|
10
|
-
ignoreAttributes: false,
|
|
11
|
-
processEntities: false,
|
|
12
|
-
};
|
|
13
|
-
const parserOptions = {
|
|
14
|
-
...baseOptions,
|
|
15
|
-
ignoreDeclaration: true,
|
|
16
|
-
numberParseOptions: { leadingZeros: false, hex: false },
|
|
17
|
-
parseAttributeValue: false,
|
|
18
|
-
parseTagValue: false,
|
|
19
|
-
};
|
|
20
|
-
const builderOptions = {
|
|
21
|
-
...baseOptions,
|
|
22
|
-
format: true,
|
|
23
|
-
indentBy: XML_INDENT,
|
|
24
|
-
preserveOrder: true,
|
|
25
|
-
};
|
|
26
|
-
const correctComments = (xml) => xml.includes('<!--') ? xml.replace(/\s+<!--(.*?)-->\s+/g, '<!--$1-->') : xml;
|
|
6
|
+
const mergeNamespaces = (...maps) => Object.assign({}, ...maps);
|
|
27
7
|
export class XmlMerger {
|
|
28
|
-
|
|
29
|
-
|
|
8
|
+
parser;
|
|
9
|
+
serializer;
|
|
10
|
+
jsonMerger;
|
|
30
11
|
constructor(config) {
|
|
31
|
-
this.
|
|
32
|
-
this.
|
|
12
|
+
this.parser = new FlxXmlParser();
|
|
13
|
+
this.serializer = new FxpXmlSerializer(config);
|
|
14
|
+
this.jsonMerger = new JsonMerger(config);
|
|
33
15
|
}
|
|
34
16
|
mergeThreeWay(ancestorContent, ourContent, theirContent) {
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const mergedResult = jsonMerger.mergeThreeWay(ancestorObj, ourObj, theirObj);
|
|
41
|
-
const builder = new XMLBuilder(builderOptions);
|
|
42
|
-
const mergedXml = builder.build(mergedResult.output);
|
|
17
|
+
const ancestor = this.parser.parse(ancestorContent);
|
|
18
|
+
const local = this.parser.parse(ourContent);
|
|
19
|
+
const other = this.parser.parse(theirContent);
|
|
20
|
+
const namespaces = mergeNamespaces(ancestor.namespaces, local.namespaces, other.namespaces);
|
|
21
|
+
const mergedResult = this.jsonMerger.mergeThreeWay(ancestor.content, local.content, other.content);
|
|
43
22
|
return {
|
|
44
|
-
output:
|
|
23
|
+
output: mergedResult.output.length
|
|
24
|
+
? this.serializer.serialize(mergedResult.output, namespaces)
|
|
25
|
+
: '',
|
|
45
26
|
hasConflict: mergedResult.hasConflict,
|
|
46
27
|
};
|
|
47
28
|
}
|
|
48
|
-
formatXmlOutput(xml) {
|
|
49
|
-
let result = XML_DECL.concat(xml);
|
|
50
|
-
result = this.formatter.handleSpecialEntities(result);
|
|
51
|
-
result = correctComments(result);
|
|
52
|
-
result = this.formatter.correctConflictIndent(result);
|
|
53
|
-
return result;
|
|
54
|
-
}
|
|
55
29
|
}
|
|
56
30
|
__decorate([
|
|
57
31
|
log
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XmlMerger.js","sourceRoot":"","sources":["../../src/merger/XmlMerger.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"XmlMerger.js","sourceRoot":"","sources":["../../src/merger/XmlMerger.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAKjE,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,eAAe,GAAG,CAAC,GAAG,IAAkB,EAAc,EAAE,CAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;AAE5B,MAAM,OAAO,SAAS;IACH,MAAM,CAAW;IACjB,UAAU,CAAe;IACzB,UAAU,CAAY;IAEvC,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,EAAE,CAAA;QAChC,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAGD,aAAa,CACX,eAAuB,EACvB,UAAkB,EAClB,YAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAE7C,MAAM,UAAU,GAAG,eAAe,CAChC,QAAQ,CAAC,UAAU,EACnB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,UAAU,CACjB,CAAA;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAChD,QAAQ,CAAC,OAAO,EAChB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAAO,CACd,CAAA;QAED,OAAO;YACL,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM;gBAChC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC;gBAC5D,CAAC,CAAC,EAAE;YACN,WAAW,EAAE,YAAY,CAAC,WAAW;SACtC,CAAA;IACH,CAAC;CACF;AA5BC;IADC,GAAG;8CA4BH"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const getUniqueSortedProps = (...objects) => {
|
|
2
|
+
const keys = new Set();
|
|
3
|
+
for (const obj of objects) {
|
|
4
|
+
if (obj != null) {
|
|
5
|
+
for (const key of Object.keys(obj))
|
|
6
|
+
keys.add(key);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return [...keys].sort();
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=mergePropertyKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergePropertyKeys.js","sourceRoot":"","sources":["../../src/merger/mergePropertyKeys.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,GAAG,OAAmC,EAC5B,EAAE;IACZ,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;AACzB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyedArrayIndex.js","sourceRoot":"","sources":["../../../src/merger/nodes/KeyedArrayIndex.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,GAAc,EACd,QAAsB,EACG,EAAE;IAC3B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAsB,CAAA;IACzC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAkB,CAAC,CAAA;QACxC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAkB,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import type { MergeConfig } from '../../types/conflictTypes.js';
|
|
2
2
|
import type { JsonArray } from '../../types/jsonTypes.js';
|
|
3
3
|
import type { MergeResult } from '../../types/mergeResult.js';
|
|
4
|
+
import type { KeyExtractor } from './KeyedArrayIndex.js';
|
|
4
5
|
import type { MergeNode } from './MergeNode.js';
|
|
5
6
|
export declare class KeyedArrayMergeNode implements MergeNode {
|
|
6
7
|
private readonly ancestor;
|
|
7
8
|
private readonly local;
|
|
8
9
|
private readonly other;
|
|
9
10
|
private readonly attribute;
|
|
10
|
-
|
|
11
|
+
private readonly keyField;
|
|
12
|
+
private readonly isOrdered;
|
|
13
|
+
constructor(ancestor: JsonArray, local: JsonArray, other: JsonArray, attribute: string, keyField: KeyExtractor | undefined, isOrdered: boolean);
|
|
11
14
|
merge(config: MergeConfig): MergeResult;
|
|
12
15
|
}
|