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.
Files changed (72) hide show
  1. package/README.md +4 -3
  2. package/lib/adapter/FlxXmlParser.d.ts +5 -0
  3. package/lib/adapter/FlxXmlParser.js +47 -0
  4. package/lib/adapter/FlxXmlParser.js.map +1 -0
  5. package/lib/adapter/FxpXmlSerializer.d.ts +10 -0
  6. package/lib/adapter/FxpXmlSerializer.js +106 -0
  7. package/lib/adapter/FxpXmlSerializer.js.map +1 -0
  8. package/lib/adapter/XmlParser.d.ts +8 -0
  9. package/lib/adapter/XmlParser.js +2 -0
  10. package/lib/adapter/XmlParser.js.map +1 -0
  11. package/lib/adapter/XmlSerializer.d.ts +4 -0
  12. package/lib/adapter/XmlSerializer.js +2 -0
  13. package/lib/adapter/XmlSerializer.js.map +1 -0
  14. package/lib/merger/ConflictMarkerBuilder.d.ts +2 -2
  15. package/lib/merger/ConflictMarkerBuilder.js +7 -31
  16. package/lib/merger/ConflictMarkerBuilder.js.map +1 -1
  17. package/lib/merger/JsonMerger.js +1 -5
  18. package/lib/merger/JsonMerger.js.map +1 -1
  19. package/lib/merger/MergeScenarioFactory.js +17 -7
  20. package/lib/merger/MergeScenarioFactory.js.map +1 -1
  21. package/lib/merger/XmlMerger.d.ts +3 -3
  22. package/lib/merger/XmlMerger.js +17 -43
  23. package/lib/merger/XmlMerger.js.map +1 -1
  24. package/lib/merger/mergePropertyKeys.d.ts +2 -0
  25. package/lib/merger/mergePropertyKeys.js +11 -0
  26. package/lib/merger/mergePropertyKeys.js.map +1 -0
  27. package/lib/merger/nodes/KeyedArrayIndex.d.ts +3 -0
  28. package/lib/merger/nodes/KeyedArrayIndex.js +9 -0
  29. package/lib/merger/nodes/KeyedArrayIndex.js.map +1 -0
  30. package/lib/merger/nodes/KeyedArrayMergeNode.d.ts +4 -1
  31. package/lib/merger/nodes/KeyedArrayMergeNode.js +15 -20
  32. package/lib/merger/nodes/KeyedArrayMergeNode.js.map +1 -1
  33. package/lib/merger/nodes/KeyedArrayMergeStrategy.d.ts +5 -0
  34. package/lib/merger/nodes/KeyedArrayMergeStrategy.js +2 -0
  35. package/lib/merger/nodes/KeyedArrayMergeStrategy.js.map +1 -0
  36. package/lib/merger/nodes/MergeNodeFactory.js +14 -21
  37. package/lib/merger/nodes/MergeNodeFactory.js.map +1 -1
  38. package/lib/merger/nodes/OrderedKeyedArrayMergeStrategy.d.ts +2 -5
  39. package/lib/merger/nodes/OrderedKeyedArrayMergeStrategy.js +34 -68
  40. package/lib/merger/nodes/OrderedKeyedArrayMergeStrategy.js.map +1 -1
  41. package/lib/merger/nodes/PropertyMergeNode.js +5 -5
  42. package/lib/merger/nodes/PropertyMergeNode.js.map +1 -1
  43. package/lib/merger/nodes/TextArrayMergeNode.js +15 -16
  44. package/lib/merger/nodes/TextArrayMergeNode.js.map +1 -1
  45. package/lib/merger/nodes/TextMergeNode.js +4 -11
  46. package/lib/merger/nodes/TextMergeNode.js.map +1 -1
  47. package/lib/merger/strategies/ScenarioStrategy.js +53 -62
  48. package/lib/merger/strategies/ScenarioStrategy.js.map +1 -1
  49. package/lib/merger/strategies/TextMergeStrategy.js +8 -8
  50. package/lib/merger/strategies/TextMergeStrategy.js.map +1 -1
  51. package/lib/service/InstallService.js +1 -1
  52. package/lib/service/InstallService.js.map +1 -1
  53. package/lib/types/conflictBlock.d.ts +9 -0
  54. package/lib/types/conflictBlock.js +12 -0
  55. package/lib/types/conflictBlock.js.map +1 -0
  56. package/lib/types/mergeResult.d.ts +3 -1
  57. package/lib/types/mergeResult.js +29 -10
  58. package/lib/types/mergeResult.js.map +1 -1
  59. package/lib/types/mergeScenario.d.ts +13 -12
  60. package/lib/types/mergeScenario.js +11 -10
  61. package/lib/types/mergeScenario.js.map +1 -1
  62. package/lib/utils/arrayUtils.js +12 -4
  63. package/lib/utils/arrayUtils.js.map +1 -1
  64. package/npm-shrinkwrap.json +7159 -8226
  65. package/oclif.manifest.json +1 -1
  66. package/package.json +88 -23
  67. package/lib/merger/nodes/nodeUtils.d.ts +0 -13
  68. package/lib/merger/nodes/nodeUtils.js +0 -53
  69. package/lib/merger/nodes/nodeUtils.js.map +0 -1
  70. package/lib/service/NamespaceHandler.d.ts +0 -5
  71. package/lib/service/NamespaceHandler.js +0 -43
  72. package/lib/service/NamespaceHandler.js.map +0 -1
package/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![License](https://img.shields.io/badge/License-MIT-blue)]()
4
4
  [![Compatibility](https://img.shields.io/badge/Windows%20%7C%20Mac%20%7C%20Linux-Supported-success)]()
5
+ [![Performance](https://img.shields.io/badge/Performance-Dashboard-58a6ff)](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.5.4/src/commands/git/merge/driver/install.ts)_
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.5.4/src/commands/git/merge/driver/run.ts)_
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.5.4/src/commands/git/merge/driver/uninstall.ts)_
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,5 @@
1
+ import type { ParsedXml, XmlParser } from './XmlParser.js';
2
+ export declare class FlxXmlParser implements XmlParser {
3
+ private readonly parser;
4
+ parse(xml: string): ParsedXml;
5
+ }
@@ -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":"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"}
@@ -0,0 +1,8 @@
1
+ import type { JsonObject } from '../types/jsonTypes.js';
2
+ export interface ParsedXml {
3
+ readonly content: JsonObject;
4
+ readonly namespaces: JsonObject;
5
+ }
6
+ export interface XmlParser {
7
+ parse(xml: string): ParsedXml;
8
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=XmlParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlParser.js","sourceRoot":"","sources":["../../src/adapter/XmlParser.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
2
+ export interface XmlSerializer {
3
+ serialize(mergedOutput: JsonArray, namespaces: JsonObject): string;
4
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=XmlSerializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlSerializer.js","sourceRoot":"","sources":["../../src/adapter/XmlSerializer.ts"],"names":[],"mappings":""}
@@ -1,3 +1,3 @@
1
- import type { MergeConfig } from '../types/conflictTypes.js';
1
+ import { type ConflictBlock } from '../types/conflictBlock.js';
2
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;
3
+ export declare const buildConflictMarkers: (local: JsonObject | JsonArray, ancestor: JsonObject | JsonArray, other: JsonObject | JsonArray) => ConflictBlock;
@@ -1,33 +1,9 @@
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
- ];
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,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
+ {"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"}
@@ -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":";AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAIjE,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,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAE3D,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,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAA;QAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAC,iBAAiB,CACnD,QAAQ,EACR,KAAK,EACL,KAAK,CACN,CAAA;QAED,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,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QAEnE,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAA;IACH,CAAC;CACF;AAtCQ;IADN,GAAG;+CAsCH"}
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 (!isEmpty(ancestor)) {
6
- scenario += 100;
15
+ if (isPresent(ancestor)) {
16
+ scenario |= MergeScenario.ANCESTOR_ONLY;
7
17
  }
8
- if (!isEmpty(local)) {
9
- scenario += 10;
18
+ if (isPresent(local)) {
19
+ scenario |= MergeScenario.LOCAL_ONLY;
10
20
  }
11
- if (!isEmpty(other)) {
12
- scenario += 1;
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,QAAmB,EACnB,KAAgB,EAChB,KAAgB,EACD,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
+ {"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 config;
4
- private readonly formatter;
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
  }
@@ -1,57 +1,31 @@
1
1
  import { __decorate } from "tslib";
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';
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 baseOptions = {
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
- config;
29
- formatter;
8
+ parser;
9
+ serializer;
10
+ jsonMerger;
30
11
  constructor(config) {
31
- this.config = config;
32
- this.formatter = new ConflictMarkerFormatter(config);
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 parser = new XMLParser(parserOptions);
36
- const ancestorObj = parser.parse(ancestorContent);
37
- const ourObj = parser.parse(ourContent);
38
- const theirObj = parser.parse(theirContent);
39
- const jsonMerger = new JsonMerger(this.config);
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: mergedXml.length ? this.formatXmlOutput(mergedXml) : '',
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,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,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,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;AA7BC;IADC,GAAG;8CAqBH"}
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,2 @@
1
+ import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
2
+ export declare const getUniqueSortedProps: (...objects: (JsonObject | JsonArray)[]) => string[];
@@ -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,3 @@
1
+ import type { JsonArray, JsonObject } from '../../types/jsonTypes.js';
2
+ export type KeyExtractor = (item: JsonObject) => string;
3
+ export declare const buildKeyedMap: (arr: JsonArray, keyField: KeyExtractor) => Map<string, JsonObject>;
@@ -0,0 +1,9 @@
1
+ export const buildKeyedMap = (arr, keyField) => {
2
+ const map = new Map();
3
+ for (const item of arr) {
4
+ const key = keyField(item);
5
+ map.set(key, item);
6
+ }
7
+ return map;
8
+ };
9
+ //# sourceMappingURL=KeyedArrayIndex.js.map
@@ -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
- constructor(ancestor: JsonArray, local: JsonArray, other: JsonArray, attribute: string);
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
  }