sf-git-merge-driver 1.4.0-dev-159.21317248282-1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +6 -30
  2. package/lib/commands/git/merge/driver/run.js +5 -3
  3. package/lib/commands/git/merge/driver/run.js.map +1 -1
  4. package/lib/constant/conflictConstant.d.ts +3 -3
  5. package/lib/constant/conflictConstant.js +3 -3
  6. package/lib/constant/conflictConstant.js.map +1 -1
  7. package/lib/constant/parserConstant.d.ts +0 -6
  8. package/lib/constant/parserConstant.js +0 -6
  9. package/lib/constant/parserConstant.js.map +1 -1
  10. package/lib/driver/MergeDriver.d.ts +0 -3
  11. package/lib/driver/MergeDriver.js +1 -5
  12. package/lib/driver/MergeDriver.js.map +1 -1
  13. package/lib/merger/JsonMerger.d.ts +0 -3
  14. package/lib/merger/JsonMerger.js +212 -20
  15. package/lib/merger/JsonMerger.js.map +1 -1
  16. package/lib/merger/XmlMerger.d.ts +0 -5
  17. package/lib/merger/XmlMerger.js +16 -19
  18. package/lib/merger/XmlMerger.js.map +1 -1
  19. package/lib/merger/conflictMarker.d.ts +12 -0
  20. package/lib/merger/conflictMarker.js +48 -0
  21. package/lib/merger/conflictMarker.js.map +1 -0
  22. package/lib/merger/textAttribute.d.ts +3 -0
  23. package/lib/merger/textAttribute.js +56 -0
  24. package/lib/merger/textAttribute.js.map +1 -0
  25. package/lib/service/NamespaceHandler.js +2 -1
  26. package/lib/service/NamespaceHandler.js.map +1 -1
  27. package/lib/types/conflictTypes.d.ts +1 -1
  28. package/lib/types/mergeScenario.d.ts +1 -0
  29. package/lib/types/mergeScenario.js +20 -0
  30. package/lib/types/mergeScenario.js.map +1 -1
  31. package/lib/utils/mergeUtils.d.ts +5 -0
  32. package/lib/utils/mergeUtils.js +14 -0
  33. package/lib/utils/mergeUtils.js.map +1 -1
  34. package/npm-shrinkwrap.json +2 -2
  35. package/oclif.manifest.json +4 -4
  36. package/package.json +2 -2
  37. package/lib/merger/ConflictMarkerBuilder.d.ts +0 -3
  38. package/lib/merger/ConflictMarkerBuilder.js +0 -33
  39. package/lib/merger/ConflictMarkerBuilder.js.map +0 -1
  40. package/lib/merger/ConflictMarkerFormatter.d.ts +0 -14
  41. package/lib/merger/ConflictMarkerFormatter.js +0 -43
  42. package/lib/merger/ConflictMarkerFormatter.js.map +0 -1
  43. package/lib/merger/MergeContext.d.ts +0 -17
  44. package/lib/merger/MergeContext.js +0 -2
  45. package/lib/merger/MergeContext.js.map +0 -1
  46. package/lib/merger/MergeOrchestrator.d.ts +0 -13
  47. package/lib/merger/MergeOrchestrator.js +0 -46
  48. package/lib/merger/MergeOrchestrator.js.map +0 -1
  49. package/lib/merger/MergeScenarioFactory.d.ts +0 -2
  50. package/lib/merger/MergeScenarioFactory.js +0 -22
  51. package/lib/merger/MergeScenarioFactory.js.map +0 -1
  52. package/lib/merger/nodes/KeyedArrayMergeNode.d.ts +0 -12
  53. package/lib/merger/nodes/KeyedArrayMergeNode.js +0 -67
  54. package/lib/merger/nodes/KeyedArrayMergeNode.js.map +0 -1
  55. package/lib/merger/nodes/MergeNode.d.ts +0 -5
  56. package/lib/merger/nodes/MergeNode.js +0 -2
  57. package/lib/merger/nodes/MergeNode.js.map +0 -1
  58. package/lib/merger/nodes/MergeNodeFactory.d.ts +0 -9
  59. package/lib/merger/nodes/MergeNodeFactory.js +0 -21
  60. package/lib/merger/nodes/MergeNodeFactory.js.map +0 -1
  61. package/lib/merger/nodes/ObjectMergeNode.d.ts +0 -20
  62. package/lib/merger/nodes/ObjectMergeNode.js +0 -49
  63. package/lib/merger/nodes/ObjectMergeNode.js.map +0 -1
  64. package/lib/merger/nodes/TextArrayMergeNode.d.ts +0 -12
  65. package/lib/merger/nodes/TextArrayMergeNode.js +0 -66
  66. package/lib/merger/nodes/TextArrayMergeNode.js.map +0 -1
  67. package/lib/merger/nodes/TextMergeNode.d.ts +0 -12
  68. package/lib/merger/nodes/TextMergeNode.js +0 -36
  69. package/lib/merger/nodes/TextMergeNode.js.map +0 -1
  70. package/lib/merger/nodes/nodeUtils.d.ts +0 -5
  71. package/lib/merger/nodes/nodeUtils.js +0 -20
  72. package/lib/merger/nodes/nodeUtils.js.map +0 -1
  73. package/lib/merger/strategies/AllPresentStrategy.d.ts +0 -7
  74. package/lib/merger/strategies/AllPresentStrategy.js +0 -36
  75. package/lib/merger/strategies/AllPresentStrategy.js.map +0 -1
  76. package/lib/merger/strategies/AncestorAndLocalStrategy.d.ts +0 -8
  77. package/lib/merger/strategies/AncestorAndLocalStrategy.js +0 -64
  78. package/lib/merger/strategies/AncestorAndLocalStrategy.js.map +0 -1
  79. package/lib/merger/strategies/AncestorAndOtherStrategy.d.ts +0 -8
  80. package/lib/merger/strategies/AncestorAndOtherStrategy.js +0 -64
  81. package/lib/merger/strategies/AncestorAndOtherStrategy.js.map +0 -1
  82. package/lib/merger/strategies/AncestorOnlyStrategy.d.ts +0 -6
  83. package/lib/merger/strategies/AncestorOnlyStrategy.js +0 -19
  84. package/lib/merger/strategies/AncestorOnlyStrategy.js.map +0 -1
  85. package/lib/merger/strategies/LocalAndOtherStrategy.d.ts +0 -7
  86. package/lib/merger/strategies/LocalAndOtherStrategy.js +0 -45
  87. package/lib/merger/strategies/LocalAndOtherStrategy.js.map +0 -1
  88. package/lib/merger/strategies/LocalOnlyStrategy.d.ts +0 -6
  89. package/lib/merger/strategies/LocalOnlyStrategy.js +0 -14
  90. package/lib/merger/strategies/LocalOnlyStrategy.js.map +0 -1
  91. package/lib/merger/strategies/NoneStrategy.d.ts +0 -6
  92. package/lib/merger/strategies/NoneStrategy.js +0 -8
  93. package/lib/merger/strategies/NoneStrategy.js.map +0 -1
  94. package/lib/merger/strategies/OtherOnlyStrategy.d.ts +0 -6
  95. package/lib/merger/strategies/OtherOnlyStrategy.js +0 -14
  96. package/lib/merger/strategies/OtherOnlyStrategy.js.map +0 -1
  97. package/lib/merger/strategies/ScenarioStrategy.d.ts +0 -5
  98. package/lib/merger/strategies/ScenarioStrategy.js +0 -2
  99. package/lib/merger/strategies/ScenarioStrategy.js.map +0 -1
  100. package/lib/merger/strategies/ScenarioStrategyFactory.d.ts +0 -3
  101. package/lib/merger/strategies/ScenarioStrategyFactory.js +0 -23
  102. package/lib/merger/strategies/ScenarioStrategyFactory.js.map +0 -1
  103. package/lib/merger/strategies/TextMergeStrategy.d.ts +0 -32
  104. package/lib/merger/strategies/TextMergeStrategy.js +0 -80
  105. package/lib/merger/strategies/TextMergeStrategy.js.map +0 -1
  106. package/lib/types/mergeResult.d.ts +0 -8
  107. package/lib/types/mergeResult.js +0 -33
  108. package/lib/types/mergeResult.js.map +0 -1
package/README.md CHANGED
@@ -36,30 +36,6 @@ sequenceDiagram
36
36
  Git->>Dev: Clean commit (no conflicts)
37
37
  ```
38
38
 
39
- ## Conflict Style
40
-
41
- This merge driver follows the **zdiff3** conflict style philosophy:
42
-
43
- - **Shows the most compact diff possible**: Only the specific conflicting elements are marked, not entire file sections
44
- - **Includes ancestor context**: Conflicts display the base (ancestor) version alongside local and remote changes
45
- - **Respects Git configuration**: Conflict marker size and labels are configurable via Git's standard parameters (`-L`, `-S`, `-X`, `-Y` flags)
46
-
47
- Example conflict output:
48
- ```xml
49
- <<<<<<< ours
50
- <field>localValue</field>
51
- ||||||| base
52
- <field>originalValue</field>
53
- =======
54
- <field>remoteValue</field>
55
- >>>>>>> theirs
56
- ```
57
-
58
- This approach helps you understand:
59
- 1. What the original value was (`base`)
60
- 2. What your branch changed it to (`ours`)
61
- 3. What the other branch changed it to (`theirs`)
62
-
63
39
  ## Installation (30 seconds)
64
40
 
65
41
  ```bash
@@ -279,7 +255,7 @@ EXAMPLES
279
255
  $ sf git merge driver install
280
256
  ```
281
257
 
282
- _See code: [src/commands/git/merge/driver/install.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.4.0-dev-159.21317248282-1/src/commands/git/merge/driver/install.ts)_
258
+ _See code: [src/commands/git/merge/driver/install.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.4.0/src/commands/git/merge/driver/install.ts)_
283
259
 
284
260
  ## `sf git merge driver run`
285
261
 
@@ -296,9 +272,9 @@ FLAGS
296
272
  -L, --conflict-marker-size=<value> [default: 7] number of characters to show for conflict markers
297
273
  -O, --ancestor-file=<value> (required) path to the common ancestor version of the file
298
274
  -P, --output-file=<value> (required) path to the file where the merged content will be written
299
- -S, --ancestor-conflict-tag=<value> [default: base] string used to tag ancestor version in conflicts
300
- -X, --local-conflict-tag=<value> [default: ours] string used to tag local version in conflicts
301
- -Y, --other-conflict-tag=<value> [default: theirs] string used to tag other version in conflicts
275
+ -S, --ancestor-conflict-tag=<value> [default: BASE] string used to tag ancestor version in conflicts
276
+ -X, --local-conflict-tag=<value> [default: LOCAL] string used to tag local version in conflicts
277
+ -Y, --other-conflict-tag=<value> [default: REMOTE] string used to tag other version in conflicts
302
278
 
303
279
  GLOBAL FLAGS
304
280
  --flags-dir=<value> Import flag values from a directory.
@@ -323,7 +299,7 @@ EXAMPLES
323
299
  - output-file is the path to the file where the merged content will be written
324
300
  ```
325
301
 
326
- _See code: [src/commands/git/merge/driver/run.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.4.0-dev-159.21317248282-1/src/commands/git/merge/driver/run.ts)_
302
+ _See code: [src/commands/git/merge/driver/run.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.4.0/src/commands/git/merge/driver/run.ts)_
327
303
 
328
304
  ## `sf git merge driver uninstall`
329
305
 
@@ -353,7 +329,7 @@ EXAMPLES
353
329
  $ sf git merge driver uninstall
354
330
  ```
355
331
 
356
- _See code: [src/commands/git/merge/driver/uninstall.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.4.0-dev-159.21317248282-1/src/commands/git/merge/driver/uninstall.ts)_
332
+ _See code: [src/commands/git/merge/driver/uninstall.ts](https://github.com/scolladon/sf-git-merge-driver/blob/v1.4.0/src/commands/git/merge/driver/uninstall.ts)_
357
333
  <!-- commandsstop -->
358
334
  ## Changelog
359
335
 
@@ -4,6 +4,7 @@ import { Flags, SfCommand } from '@salesforce/sf-plugins-core';
4
4
  import { DEFAULT_ANCESTOR_CONFLICT_TAG, DEFAULT_CONFLICT_MARKER_SIZE, DEFAULT_LOCAL_CONFLICT_TAG, DEFAULT_OTHER_CONFLICT_TAG, } from '../../../../constant/conflictConstant.js';
5
5
  import { PLUGIN_NAME } from '../../../../constant/pluginConstant.js';
6
6
  import { MergeDriver } from '../../../../driver/MergeDriver.js';
7
+ import { ConflictMarker } from '../../../../merger/conflictMarker.js';
7
8
  import { log } from '../../../../utils/LoggingDecorator.js';
8
9
  import { Logger } from '../../../../utils/LoggingService.js';
9
10
  Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
@@ -64,15 +65,16 @@ export default class Run extends SfCommand {
64
65
  async run() {
65
66
  Logger.info('Merge starting');
66
67
  const { flags } = await this.parse(Run);
67
- const config = {
68
+ const conflicConfig = {
68
69
  conflictMarkerSize: flags['conflict-marker-size'],
69
70
  ancestorConflictTag: flags['ancestor-conflict-tag'],
70
71
  localConflictTag: flags['local-conflict-tag'],
71
72
  otherConflictTag: flags['other-conflict-tag'],
72
73
  };
74
+ ConflictMarker.setConflictConfig(conflicConfig);
73
75
  Logger.debug(`flags: ${JSON.stringify(flags)}`);
74
- Logger.debug(`config: ${JSON.stringify(config)}`);
75
- const mergeDriver = new MergeDriver(config);
76
+ Logger.debug(`conflicConfig: ${JSON.stringify(conflicConfig)}`);
77
+ const mergeDriver = new MergeDriver();
76
78
  const hasConflict = await mergeDriver.mergeFiles(flags['ancestor-file'], flags['local-file'], flags['other-file']);
77
79
  Logger.info(`Merge completed with ${hasConflict ? 'conflicts' : 'no conflicts'}`);
78
80
  process.exitCode = hasConflict ? ERROR_EXIT_CODE : SUCCESS_EXIT_CODE;
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/commands/git/merge/driver/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/commands/git/merge/driver/run.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ export declare const DEFAULT_CONFLICT_MARKER_SIZE = 7;
2
2
  export declare const ANCESTOR_CONFLICT_MARKER = "|";
3
3
  export declare const LOCAL_CONFLICT_MARKER = "<";
4
4
  export declare const OTHER_CONFLICT_MARKER = ">";
5
- export declare const DEFAULT_ANCESTOR_CONFLICT_TAG = "base";
6
- export declare const DEFAULT_LOCAL_CONFLICT_TAG = "ours";
7
- export declare const DEFAULT_OTHER_CONFLICT_TAG = "theirs";
5
+ export declare const DEFAULT_ANCESTOR_CONFLICT_TAG = "BASE";
6
+ export declare const DEFAULT_LOCAL_CONFLICT_TAG = "LOCAL";
7
+ export declare const DEFAULT_OTHER_CONFLICT_TAG = "REMOTE";
8
8
  export declare const SEPARATOR = "=";
@@ -2,8 +2,8 @@ export const DEFAULT_CONFLICT_MARKER_SIZE = 7;
2
2
  export const ANCESTOR_CONFLICT_MARKER = '|';
3
3
  export const LOCAL_CONFLICT_MARKER = '<';
4
4
  export const OTHER_CONFLICT_MARKER = '>';
5
- export const DEFAULT_ANCESTOR_CONFLICT_TAG = 'base';
6
- export const DEFAULT_LOCAL_CONFLICT_TAG = 'ours';
7
- export const DEFAULT_OTHER_CONFLICT_TAG = 'theirs';
5
+ export const DEFAULT_ANCESTOR_CONFLICT_TAG = 'BASE';
6
+ export const DEFAULT_LOCAL_CONFLICT_TAG = 'LOCAL';
7
+ export const DEFAULT_OTHER_CONFLICT_TAG = 'REMOTE';
8
8
  export const SEPARATOR = '=';
9
9
  //# sourceMappingURL=conflictConstant.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conflictConstant.js","sourceRoot":"","sources":["../../src/constant/conflictConstant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAA;AAC7C,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAA;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAA;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAA;AACxC,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAA;AACnD,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAA;AAChD,MAAM,CAAC,MAAM,0BAA0B,GAAG,QAAQ,CAAA;AAClD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAA"}
1
+ {"version":3,"file":"conflictConstant.js","sourceRoot":"","sources":["../../src/constant/conflictConstant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAA;AAC7C,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAA;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAA;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAA;AACxC,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAA;AACnD,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAA;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAG,QAAQ,CAAA;AAClD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAA"}
@@ -1,7 +1 @@
1
1
  export declare const TEXT_TAG = "#text";
2
- export declare const XML_DECL = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
3
- export declare const XML_COMMENT_PROP_NAME = "#xml__comment";
4
- export declare const CDATA_PROP_NAME = "__cdata";
5
- export declare const XML_INDENT = " ";
6
- export declare const NAMESPACE_PREFIX = "@_";
7
- export declare const NAMESPACE_ROOT = ":@";
@@ -1,8 +1,2 @@
1
1
  export const TEXT_TAG = '#text';
2
- export const XML_DECL = '<?xml version="1.0" encoding="UTF-8"?>\n';
3
- export const XML_COMMENT_PROP_NAME = '#xml__comment';
4
- export const CDATA_PROP_NAME = '__cdata';
5
- export const XML_INDENT = ' ';
6
- export const NAMESPACE_PREFIX = '@_';
7
- export const NAMESPACE_ROOT = ':@';
8
2
  //# sourceMappingURL=parserConstant.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parserConstant.js","sourceRoot":"","sources":["../../src/constant/parserConstant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAA;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,0CAA0C,CAAA;AAClE,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAA;AACpD,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAA;AACxC,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAA;AAChC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAA;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAA"}
1
+ {"version":3,"file":"parserConstant.js","sourceRoot":"","sources":["../../src/constant/parserConstant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAA"}
@@ -1,6 +1,3 @@
1
- import type { MergeConfig } from '../types/conflictTypes.js';
2
1
  export declare class MergeDriver {
3
- private readonly config;
4
- constructor(config: MergeConfig);
5
2
  mergeFiles(ancestorFile: string, ourFile: string, theirFile: string): Promise<boolean>;
6
3
  }
@@ -6,16 +6,12 @@ import { log } from '../utils/LoggingDecorator.js';
6
6
  import { Logger } from '../utils/LoggingService.js';
7
7
  import { detectEol, normalizeEol } from '../utils/mergeUtils.js';
8
8
  export class MergeDriver {
9
- config;
10
- constructor(config) {
11
- this.config = config;
12
- }
13
9
  async mergeFiles(ancestorFile, ourFile, theirFile) {
14
10
  // Read all three versions
15
11
  const [ancestorContent, ourContent, theirContent] = await Promise.all([ancestorFile, ourFile, theirFile]
16
12
  .map(normalize)
17
13
  .map(path => readFile(path, 'utf8')));
18
- const xmlMerger = new XmlMerger(this.config);
14
+ const xmlMerger = new XmlMerger();
19
15
  try {
20
16
  const mergedContent = xmlMerger.mergeThreeWay(ancestorContent, ourContent, theirContent);
21
17
  const targetEol = detectEol(ourContent);
@@ -1 +1 @@
1
- {"version":3,"file":"MergeDriver.js","sourceRoot":"","sources":["../../src/driver/MergeDriver.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAEhE,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAG9C,AAAN,KAAK,CAAC,UAAU,CACd,YAAoB,EACpB,OAAe,EACf,SAAiB;QAEjB,0BAA0B;QAC1B,MAAM,CAAC,eAAe,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CACnE,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC;aAC/B,GAAG,CAAC,SAAS,CAAC;aACd,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CACvC,CAAA;QAED,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE5C,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAC3C,eAAe,EACf,UAAU,EACV,YAAY,CACb,CAAA;YAED,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;YACvC,MAAM,eAAe,GAAG,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YACrE,MAAM,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAA;YAEpD,OAAO,aAAa,CAAC,WAAW,CAAA;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;YACnC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YAC/B,MAAM,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAA;YAC/C,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF;AAjCO;IADL,GAAG;6CAiCH"}
1
+ {"version":3,"file":"MergeDriver.js","sourceRoot":"","sources":["../../src/driver/MergeDriver.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAEhE,MAAM,OAAO,WAAW;IAEhB,AAAN,KAAK,CAAC,UAAU,CACd,YAAoB,EACpB,OAAe,EACf,SAAiB;QAEjB,0BAA0B;QAC1B,MAAM,CAAC,eAAe,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CACnE,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC;aAC/B,GAAG,CAAC,SAAS,CAAC;aACd,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CACvC,CAAA;QAED,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAA;QAEjC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAC3C,eAAe,EACf,UAAU,EACV,YAAY,CACb,CAAA;YAED,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;YACvC,MAAM,eAAe,GAAG,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YACrE,MAAM,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAA;YAEpD,OAAO,aAAa,CAAC,WAAW,CAAA;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;YACnC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YAC/B,MAAM,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAA;YAC/C,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF;AAjCO;IADL,GAAG;6CAiCH"}
@@ -1,8 +1,5 @@
1
- import type { MergeConfig } from '../types/conflictTypes.js';
2
1
  import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
3
2
  export declare class JsonMerger {
4
- private readonly orchestrator;
5
- constructor(config: MergeConfig);
6
3
  mergeThreeWay(ancestor: JsonObject | JsonArray, local: JsonObject | JsonArray, other: JsonObject | JsonArray): {
7
4
  output: JsonArray;
8
5
  hasConflict: boolean;
@@ -1,37 +1,229 @@
1
1
  import { __decorate } from "tslib";
2
+ import { deepEqual } from 'fast-equals';
3
+ import { isEmpty, keyBy } from 'lodash-es';
4
+ import { MetadataService } from '../service/MetadataService.js';
2
5
  import { NamespaceHandler } from '../service/NamespaceHandler.js';
3
- import { combineResults } from '../types/mergeResult.js';
6
+ import { getScenario, MergeScenario } from '../types/mergeScenario.js';
4
7
  import { log } from '../utils/LoggingDecorator.js';
5
- import { MergeOrchestrator } from './MergeOrchestrator.js';
6
- import { defaultNodeFactory } from './nodes/MergeNodeFactory.js';
7
- import { getUniqueSortedProps } from './nodes/nodeUtils.js';
8
+ import { ensureArray, getUniqueSortedProps, isObject, isStringArray, } from '../utils/mergeUtils.js';
9
+ import { ConflictMarker } from './conflictMarker.js';
10
+ import { generateObj, mergeTextAttribute } from './textAttribute.js';
8
11
  export class JsonMerger {
9
- orchestrator;
10
- constructor(config) {
11
- this.orchestrator = new MergeOrchestrator(config, defaultNodeFactory);
12
- }
13
12
  mergeThreeWay(ancestor, local, other) {
14
13
  const namespaceHandler = new NamespaceHandler();
15
14
  const namespaces = namespaceHandler.processNamespaces(ancestor, local, other);
16
- const results = [];
15
+ const scenario = getScenario(ancestor, local, other);
16
+ const acc = [];
17
17
  const props = getUniqueSortedProps(ancestor, local, other);
18
18
  for (const key of props) {
19
- const result = this.orchestrator.merge(ancestor[key], local[key], other[key], undefined, {
20
- name: key,
21
- existsInLocal: key in local,
22
- existsInOther: key in other,
23
- });
24
- results.push(result);
25
- }
26
- const combined = combineResults(results);
27
- namespaceHandler.addNamespacesToResult(combined.output, namespaces);
19
+ switch (scenario) {
20
+ case MergeScenario.ANCESTOR_ONLY:
21
+ break;
22
+ case MergeScenario.LOCAL_AND_OTHER:
23
+ acc.push(handlelocalAndother(key, local, other));
24
+ break;
25
+ case MergeScenario.ANCESTOR_AND_OTHER:
26
+ acc.push(handleAncestorAndother(key, ancestor, other));
27
+ break;
28
+ case MergeScenario.ANCESTOR_AND_LOCAL:
29
+ acc.push(handleAncestorAndlocal(key, ancestor, local));
30
+ break;
31
+ default: {
32
+ const obj = {
33
+ [key]: merge(ancestor[key], local[key], other[key]),
34
+ };
35
+ acc.push([obj]);
36
+ break;
37
+ }
38
+ }
39
+ }
40
+ const result = acc.flat();
41
+ namespaceHandler.addNamespacesToResult(result, namespaces);
28
42
  return {
29
- output: combined.output,
30
- hasConflict: combined.hasConflict,
43
+ output: result,
44
+ hasConflict: ConflictMarker.hasConflictMarker(),
31
45
  };
32
46
  }
33
47
  }
34
48
  __decorate([
35
49
  log
36
50
  ], JsonMerger.prototype, "mergeThreeWay", null);
51
+ function merge(ancestor, local, other) {
52
+ const acc = [];
53
+ const props = getUniqueSortedProps(ancestor, local, other);
54
+ for (const key of props) {
55
+ let values = [];
56
+ const ancestorOfKey = ancestor[key];
57
+ const localOfKey = local[key];
58
+ const otherOfKey = other[key];
59
+ const [ancestorkey, ourkey, theirkey] = [
60
+ ancestorOfKey,
61
+ localOfKey,
62
+ otherOfKey,
63
+ ].map(ensureArray);
64
+ if (isStringArray(ancestorOfKey, localOfKey, otherOfKey)) {
65
+ values = mergeTextArrays(ancestorkey, ourkey, theirkey, key);
66
+ }
67
+ else if (isObject(ancestorOfKey, localOfKey, otherOfKey)) {
68
+ values = mergeArrays(ancestorkey, ourkey, theirkey, key);
69
+ }
70
+ else {
71
+ values = mergeTextAttribute(ancestorOfKey, localOfKey, otherOfKey, key);
72
+ }
73
+ acc.push(values);
74
+ }
75
+ return acc.flat();
76
+ }
77
+ function toJsonArray(inputObj) {
78
+ const acc = [];
79
+ for (const attribute of getUniqueSortedProps(inputObj)) {
80
+ const values = [];
81
+ const inputObjOfAttr = inputObj[attribute];
82
+ if (typeof inputObjOfAttr === 'object') {
83
+ const inputObjAtt = ensureArray(inputObjOfAttr);
84
+ for (const key of getUniqueSortedProps(inputObjAtt)) {
85
+ const inputObjKeyOfKey = inputObjAtt[key];
86
+ values.push({ [attribute]: toJsonArray(inputObjKeyOfKey) });
87
+ }
88
+ }
89
+ else {
90
+ values.push(generateObj(inputObjOfAttr, attribute));
91
+ }
92
+ acc.push(values);
93
+ }
94
+ return acc.flat();
95
+ }
96
+ const handlelocalAndother = (key, local, other) => {
97
+ const obj = {};
98
+ obj[key] = merge({}, local[key], other[key]);
99
+ const acc = [];
100
+ // Functional choice: Don't use deepEqual because it would tax performence when the ancestor is empty at a too high level of the metadata tree
101
+ // merge will functionally do the same itself while perfoming its normal function
102
+ acc.push(obj);
103
+ return acc;
104
+ };
105
+ const handleAncestorAndother = (key, ancestor, other) => {
106
+ const acc = [];
107
+ if (!deepEqual(ancestor, other)) {
108
+ const ancestorProp = {
109
+ [key]: toJsonArray(ancestor[key]),
110
+ };
111
+ const otherProp = {
112
+ [key]: toJsonArray(other[key]),
113
+ };
114
+ ConflictMarker.addConflictMarkers(acc, {}, ancestorProp, otherProp);
115
+ }
116
+ return acc;
117
+ };
118
+ const handleAncestorAndlocal = (key, ancestor, local) => {
119
+ const acc = [];
120
+ if (!deepEqual(ancestor, local)) {
121
+ const localProp = {
122
+ [key]: toJsonArray(local[key]),
123
+ };
124
+ const ancestorProp = {
125
+ [key]: toJsonArray(ancestor[key]),
126
+ };
127
+ ConflictMarker.addConflictMarkers(acc, localProp, ancestorProp, {});
128
+ }
129
+ return acc;
130
+ };
131
+ const mergeArrays = (ancestor, local, other, attribute) => {
132
+ const keyField = MetadataService.getKeyFieldExtractor(attribute);
133
+ if (!keyField) {
134
+ // const scenario: MergeScenario = getScenario(ancestor, local, other)
135
+ const arr = [];
136
+ // obj[attribute] = unionWith(local, other, deepEqual)
137
+ // obj[attribute] = mergeTextAttribute(local, other, deepEqual, attribute)
138
+ // obj[attribute] = []
139
+ ConflictMarker.addConflictMarkers(arr, toJsonArray({ [attribute]: local }), toJsonArray({ [attribute]: ancestor }), toJsonArray({ [attribute]: other }));
140
+ return arr.flat();
141
+ // return mergeTextAttribute(ancestor, local, other, attribute).flat()
142
+ }
143
+ const [keyedAnc, keyedlocal, keyedother] = [ancestor, local, other].map(arr => keyBy(arr, keyField));
144
+ return mergeByKeyField(keyedAnc, keyedlocal, keyedother, attribute);
145
+ };
146
+ const mergeTextArrays = (ancestor, local, other, attribute) => {
147
+ const localSet = new Set(local);
148
+ const otherSet = new Set(other);
149
+ // Simplest way to merge without removed elements
150
+ const removedInLocal = ancestor.filter(item => !localSet.has(item));
151
+ const removedInOther = ancestor.filter(item => !otherSet.has(item));
152
+ const removedSet = new Set([...removedInLocal, ...removedInOther]);
153
+ const merged = [...new Set([...ancestor, ...local, ...other])]
154
+ .filter(item => !removedSet.has(item))
155
+ .sort()
156
+ .map(item => generateObj(item, attribute));
157
+ const obj = [{ [attribute]: merged }];
158
+ return isEmpty(merged) ? [] : obj;
159
+ };
160
+ const mergeByKeyField = (ancestor, local, other, attribute) => {
161
+ const acc = [];
162
+ const props = getUniqueSortedProps(ancestor, local, other);
163
+ for (const key of props) {
164
+ const ancestorOfKey = ancestor[key];
165
+ const localOfKey = local[key];
166
+ const otherOfKey = other[key];
167
+ const scenario = getScenario(ancestorOfKey, localOfKey, otherOfKey);
168
+ const obj = {};
169
+ switch (scenario) {
170
+ case MergeScenario.OTHER_ONLY:
171
+ obj[attribute] = merge({}, {}, otherOfKey);
172
+ break;
173
+ case MergeScenario.LOCAL_ONLY:
174
+ obj[attribute] = merge({}, localOfKey, {});
175
+ break;
176
+ case MergeScenario.ANCESTOR_ONLY:
177
+ break;
178
+ case MergeScenario.LOCAL_AND_OTHER:
179
+ if (deepEqual(localOfKey, otherOfKey)) {
180
+ obj[attribute] = merge({}, {}, otherOfKey);
181
+ }
182
+ else {
183
+ obj[attribute] = merge({}, localOfKey, otherOfKey);
184
+ }
185
+ break;
186
+ case MergeScenario.ANCESTOR_AND_OTHER:
187
+ if (!deepEqual(ancestorOfKey, otherOfKey)) {
188
+ const ancestorProp = {
189
+ [attribute]: merge({}, ancestorOfKey, {}),
190
+ };
191
+ const otherProp = {
192
+ [attribute]: merge({}, {}, otherOfKey),
193
+ };
194
+ ConflictMarker.addConflictMarkers(acc, {}, ancestorProp, otherProp);
195
+ }
196
+ break;
197
+ case MergeScenario.ANCESTOR_AND_LOCAL:
198
+ if (!deepEqual(ancestorOfKey, localOfKey)) {
199
+ const localProp = {
200
+ [attribute]: merge({}, localOfKey, {}),
201
+ };
202
+ const ancestorProp = {
203
+ [attribute]: merge({}, ancestorOfKey, {}),
204
+ };
205
+ ConflictMarker.addConflictMarkers(acc, localProp, ancestorProp, {});
206
+ }
207
+ break;
208
+ case MergeScenario.ALL:
209
+ if (deepEqual(localOfKey, otherOfKey)) {
210
+ obj[attribute] = merge({}, {}, otherOfKey);
211
+ }
212
+ else if (deepEqual(ancestorOfKey, localOfKey)) {
213
+ obj[attribute] = merge({}, {}, otherOfKey);
214
+ }
215
+ else if (deepEqual(ancestorOfKey, otherOfKey)) {
216
+ obj[attribute] = merge({}, localOfKey, {});
217
+ }
218
+ else {
219
+ obj[attribute] = merge(ancestorOfKey, localOfKey, otherOfKey);
220
+ }
221
+ break;
222
+ }
223
+ if (!isEmpty(obj)) {
224
+ acc.push(obj);
225
+ }
226
+ }
227
+ return acc;
228
+ };
37
229
  //# sourceMappingURL=JsonMerger.js.map
@@ -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":"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"}
@@ -1,11 +1,6 @@
1
- import type { MergeConfig } from '../types/conflictTypes.js';
2
1
  export declare class XmlMerger {
3
- private readonly config;
4
- private readonly formatter;
5
- constructor(config: MergeConfig);
6
2
  mergeThreeWay(ancestorContent: string, ourContent: string, theirContent: string): {
7
3
  output: string;
8
4
  hasConflict: boolean;
9
5
  };
10
- private formatXmlOutput;
11
6
  }
@@ -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';
4
3
  import { log } from '../utils/LoggingDecorator.js';
5
- import { ConflictMarkerFormatter } from './ConflictMarkerFormatter.js';
6
4
  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: CDATA_PROP_NAME,
8
+ cdataPropName: '__cdata',
9
9
  commentPropName: XML_COMMENT_PROP_NAME,
10
10
  ignoreAttributes: false,
11
11
  processEntities: false,
@@ -16,44 +16,41 @@ const parserOptions = {
16
16
  numberParseOptions: { leadingZeros: false, hex: false },
17
17
  parseAttributeValue: false,
18
18
  parseTagValue: false,
19
+ // preserveOrder: true,
19
20
  };
20
21
  const builderOptions = {
21
22
  ...baseOptions,
22
23
  format: true,
23
- indentBy: XML_INDENT,
24
+ indentBy: ' ',
24
25
  preserveOrder: true,
25
26
  };
26
27
  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('&amp;#160;', '&#160;')
33
+ .replaceAll('&lt;&lt;&lt;&lt;&lt;&lt;&lt;', '<<<<<<<')
34
+ .replaceAll('&gt;&gt;&gt;&gt;&gt;&gt;&gt;', '>>>>>>>');
27
35
  export class XmlMerger {
28
- config;
29
- formatter;
30
- constructor(config) {
31
- this.config = config;
32
- this.formatter = new ConflictMarkerFormatter(config);
33
- }
34
36
  mergeThreeWay(ancestorContent, ourContent, theirContent) {
35
37
  const parser = new XMLParser(parserOptions);
36
38
  const ancestorObj = parser.parse(ancestorContent);
37
39
  const ourObj = parser.parse(ourContent);
38
40
  const theirObj = parser.parse(theirContent);
39
41
  // Perform deep merge of XML objects
40
- const jsonMerger = new JsonMerger(this.config);
42
+ const jsonMerger = new JsonMerger();
41
43
  const mergedResult = jsonMerger.mergeThreeWay(ancestorObj, ourObj, theirObj);
42
44
  // Convert back to XML and format
43
45
  const builder = new XMLBuilder(builderOptions);
44
46
  const mergedXml = builder.build(mergedResult.output);
45
47
  return {
46
- output: mergedXml.length ? this.formatXmlOutput(mergedXml) : '',
48
+ output: mergedXml.length
49
+ ? correctConflictIndent(correctComments(XML_DECL.concat(handleSpecialEntities(mergedXml))))
50
+ : '',
47
51
  hasConflict: mergedResult.hasConflict,
48
52
  };
49
53
  }
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
- }
57
54
  }
58
55
  __decorate([
59
56
  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,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"}
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,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,QAAQ,GAAG,0CAA0C,CAAA;AAC3D,MAAM,qBAAqB,GAAG,eAAe,CAAA;AAE7C,MAAM,WAAW,GAAG;IAClB,aAAa,EAAE,SAAS;IACxB,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;IACpB,uBAAuB;CACxB,CAAA;AAED,MAAM,cAAc,GAAG;IACrB,GAAG,WAAW;IACd,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,MAAM;IAChB,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,qBAAqB,GAAG,CAAC,GAAW,EAAU,EAAE,CACpD,GAAG;KACA,OAAO,CAAC,iDAAiD,EAAE,IAAI,CAAC;KAChE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;AAEpC,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAU,EAAE,CACpD,GAAG;KACA,UAAU,CAAC,YAAY,EAAE,QAAQ,CAAC;KAClC,UAAU,CAAC,8BAA8B,EAAE,SAAS,CAAC;KACrD,UAAU,CAAC,8BAA8B,EAAE,SAAS,CAAC,CAAA;AAE1D,MAAM,OAAO,SAAS;IAEpB,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,EAAE,CAAA;QACnC,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;gBACtB,CAAC,CAAC,qBAAqB,CACnB,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,CACnE;gBACH,CAAC,CAAC,EAAE;YACN,WAAW,EAAE,YAAY,CAAC,WAAW;SACtC,CAAA;IACH,CAAC;CACF;AA3BC;IADC,GAAG;8CA2BH"}
@@ -0,0 +1,12 @@
1
+ import { conflicConfig } from '../types/conflictTypes.js';
2
+ import type { JsonArray, JsonObject } from '../types/jsonTypes.js';
3
+ export declare class ConflictMarker {
4
+ private static hasConflict;
5
+ private static baseMarker;
6
+ private static localMarker;
7
+ private static otherMarker;
8
+ private static separatorMarker;
9
+ static hasConflictMarker(): boolean;
10
+ static addConflictMarkers(acc: JsonArray, local: JsonObject | JsonArray, ancestor: JsonObject | JsonArray, other: JsonObject | JsonArray): void;
11
+ static setConflictConfig(conflictConfig: conflicConfig): void;
12
+ }