sf-git-merge-driver 1.4.0-dev-156.21254415558-1 → 1.4.0-dev-159.21317297551-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 (108) hide show
  1. package/README.md +30 -6
  2. package/lib/commands/git/merge/driver/run.js +3 -5
  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 +6 -0
  8. package/lib/constant/parserConstant.js +6 -0
  9. package/lib/constant/parserConstant.js.map +1 -1
  10. package/lib/driver/MergeDriver.d.ts +3 -0
  11. package/lib/driver/MergeDriver.js +5 -1
  12. package/lib/driver/MergeDriver.js.map +1 -1
  13. package/lib/merger/ConflictMarkerBuilder.d.ts +3 -0
  14. package/lib/merger/ConflictMarkerBuilder.js +33 -0
  15. package/lib/merger/ConflictMarkerBuilder.js.map +1 -0
  16. package/lib/merger/ConflictMarkerFormatter.d.ts +14 -0
  17. package/lib/merger/ConflictMarkerFormatter.js +43 -0
  18. package/lib/merger/ConflictMarkerFormatter.js.map +1 -0
  19. package/lib/merger/JsonMerger.d.ts +3 -0
  20. package/lib/merger/JsonMerger.js +20 -212
  21. package/lib/merger/JsonMerger.js.map +1 -1
  22. package/lib/merger/MergeContext.d.ts +17 -0
  23. package/lib/merger/MergeContext.js +2 -0
  24. package/lib/merger/MergeContext.js.map +1 -0
  25. package/lib/merger/MergeOrchestrator.d.ts +13 -0
  26. package/lib/merger/MergeOrchestrator.js +46 -0
  27. package/lib/merger/MergeOrchestrator.js.map +1 -0
  28. package/lib/merger/MergeScenarioFactory.d.ts +2 -0
  29. package/lib/merger/MergeScenarioFactory.js +22 -0
  30. package/lib/merger/MergeScenarioFactory.js.map +1 -0
  31. package/lib/merger/XmlMerger.d.ts +5 -0
  32. package/lib/merger/XmlMerger.js +19 -16
  33. package/lib/merger/XmlMerger.js.map +1 -1
  34. package/lib/merger/nodes/KeyedArrayMergeNode.d.ts +12 -0
  35. package/lib/merger/nodes/KeyedArrayMergeNode.js +67 -0
  36. package/lib/merger/nodes/KeyedArrayMergeNode.js.map +1 -0
  37. package/lib/merger/nodes/MergeNode.d.ts +5 -0
  38. package/lib/merger/nodes/MergeNode.js +2 -0
  39. package/lib/merger/nodes/MergeNode.js.map +1 -0
  40. package/lib/merger/nodes/MergeNodeFactory.d.ts +9 -0
  41. package/lib/merger/nodes/MergeNodeFactory.js +21 -0
  42. package/lib/merger/nodes/MergeNodeFactory.js.map +1 -0
  43. package/lib/merger/nodes/ObjectMergeNode.d.ts +20 -0
  44. package/lib/merger/nodes/ObjectMergeNode.js +49 -0
  45. package/lib/merger/nodes/ObjectMergeNode.js.map +1 -0
  46. package/lib/merger/nodes/TextArrayMergeNode.d.ts +12 -0
  47. package/lib/merger/nodes/TextArrayMergeNode.js +66 -0
  48. package/lib/merger/nodes/TextArrayMergeNode.js.map +1 -0
  49. package/lib/merger/nodes/TextMergeNode.d.ts +12 -0
  50. package/lib/merger/nodes/TextMergeNode.js +36 -0
  51. package/lib/merger/nodes/TextMergeNode.js.map +1 -0
  52. package/lib/merger/nodes/nodeUtils.d.ts +5 -0
  53. package/lib/merger/nodes/nodeUtils.js +20 -0
  54. package/lib/merger/nodes/nodeUtils.js.map +1 -0
  55. package/lib/merger/strategies/AllPresentStrategy.d.ts +7 -0
  56. package/lib/merger/strategies/AllPresentStrategy.js +36 -0
  57. package/lib/merger/strategies/AllPresentStrategy.js.map +1 -0
  58. package/lib/merger/strategies/AncestorAndLocalStrategy.d.ts +8 -0
  59. package/lib/merger/strategies/AncestorAndLocalStrategy.js +64 -0
  60. package/lib/merger/strategies/AncestorAndLocalStrategy.js.map +1 -0
  61. package/lib/merger/strategies/AncestorAndOtherStrategy.d.ts +8 -0
  62. package/lib/merger/strategies/AncestorAndOtherStrategy.js +64 -0
  63. package/lib/merger/strategies/AncestorAndOtherStrategy.js.map +1 -0
  64. package/lib/merger/strategies/AncestorOnlyStrategy.d.ts +6 -0
  65. package/lib/merger/strategies/AncestorOnlyStrategy.js +19 -0
  66. package/lib/merger/strategies/AncestorOnlyStrategy.js.map +1 -0
  67. package/lib/merger/strategies/LocalAndOtherStrategy.d.ts +7 -0
  68. package/lib/merger/strategies/LocalAndOtherStrategy.js +45 -0
  69. package/lib/merger/strategies/LocalAndOtherStrategy.js.map +1 -0
  70. package/lib/merger/strategies/LocalOnlyStrategy.d.ts +6 -0
  71. package/lib/merger/strategies/LocalOnlyStrategy.js +14 -0
  72. package/lib/merger/strategies/LocalOnlyStrategy.js.map +1 -0
  73. package/lib/merger/strategies/NoneStrategy.d.ts +6 -0
  74. package/lib/merger/strategies/NoneStrategy.js +8 -0
  75. package/lib/merger/strategies/NoneStrategy.js.map +1 -0
  76. package/lib/merger/strategies/OtherOnlyStrategy.d.ts +6 -0
  77. package/lib/merger/strategies/OtherOnlyStrategy.js +14 -0
  78. package/lib/merger/strategies/OtherOnlyStrategy.js.map +1 -0
  79. package/lib/merger/strategies/ScenarioStrategy.d.ts +5 -0
  80. package/lib/merger/strategies/ScenarioStrategy.js +2 -0
  81. package/lib/merger/strategies/ScenarioStrategy.js.map +1 -0
  82. package/lib/merger/strategies/ScenarioStrategyFactory.d.ts +3 -0
  83. package/lib/merger/strategies/ScenarioStrategyFactory.js +23 -0
  84. package/lib/merger/strategies/ScenarioStrategyFactory.js.map +1 -0
  85. package/lib/merger/strategies/TextMergeStrategy.d.ts +32 -0
  86. package/lib/merger/strategies/TextMergeStrategy.js +80 -0
  87. package/lib/merger/strategies/TextMergeStrategy.js.map +1 -0
  88. package/lib/service/NamespaceHandler.js +1 -2
  89. package/lib/service/NamespaceHandler.js.map +1 -1
  90. package/lib/types/conflictTypes.d.ts +1 -1
  91. package/lib/types/mergeResult.d.ts +8 -0
  92. package/lib/types/mergeResult.js +33 -0
  93. package/lib/types/mergeResult.js.map +1 -0
  94. package/lib/types/mergeScenario.d.ts +0 -1
  95. package/lib/types/mergeScenario.js +0 -20
  96. package/lib/types/mergeScenario.js.map +1 -1
  97. package/lib/utils/mergeUtils.d.ts +0 -5
  98. package/lib/utils/mergeUtils.js +0 -14
  99. package/lib/utils/mergeUtils.js.map +1 -1
  100. package/npm-shrinkwrap.json +2 -2
  101. package/oclif.manifest.json +4 -4
  102. package/package.json +2 -2
  103. package/lib/merger/conflictMarker.d.ts +0 -12
  104. package/lib/merger/conflictMarker.js +0 -48
  105. package/lib/merger/conflictMarker.js.map +0 -1
  106. package/lib/merger/textAttribute.d.ts +0 -3
  107. package/lib/merger/textAttribute.js +0 -56
  108. package/lib/merger/textAttribute.js.map +0 -1
@@ -0,0 +1,36 @@
1
+ import { combineResults } from '../../types/mergeResult.js';
2
+ import { getUniqueSortedProps } from '../nodes/nodeUtils.js';
3
+ export class AllPresentStrategy {
4
+ execute(context) {
5
+ const result = this.mergeChildren(context);
6
+ // Root level: wrap result with key
7
+ if (context.rootKey) {
8
+ if (result.output.length > 0) {
9
+ return {
10
+ output: [{ [context.rootKey.name]: result.output }],
11
+ hasConflict: result.hasConflict,
12
+ };
13
+ }
14
+ // Empty result but key exists - preserve empty key
15
+ return {
16
+ output: [{ [context.rootKey.name]: [] }],
17
+ hasConflict: result.hasConflict,
18
+ };
19
+ }
20
+ return result;
21
+ }
22
+ mergeChildren(context) {
23
+ const ancestor = context.ancestor;
24
+ const local = context.local;
25
+ const other = context.other;
26
+ const props = getUniqueSortedProps(ancestor, local, other);
27
+ const results = [];
28
+ for (const key of props) {
29
+ const childNode = context.nodeFactory.createNode(ancestor[key], local[key], other[key], key);
30
+ const childResult = childNode.merge(context.config);
31
+ results.push(childResult);
32
+ }
33
+ return combineResults(results);
34
+ }
35
+ }
36
+ //# sourceMappingURL=AllPresentStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AllPresentStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/AllPresentStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAG5D,MAAM,OAAO,kBAAkB;IAC7B,OAAO,CAAC,OAAqB;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAE1C,mCAAmC;QACnC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO;oBACL,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnD,WAAW,EAAE,MAAM,CAAC,WAAW;iBAChC,CAAA;YACH,CAAC;YACD,mDAAmD;YACnD,OAAO;gBACL,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;gBACxC,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAA;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,aAAa,CAAC,OAAqB;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAkC,CAAA;QAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAA+B,CAAA;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAA+B,CAAA;QACrD,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAC1D,MAAM,OAAO,GAAkB,EAAE,CAAA;QAEjC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAC9C,QAAQ,CAAC,GAAG,CAAC,EACb,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,GAAG,CAAC,EACV,GAAG,CACJ,CAAA;YACD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACnD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,cAAc,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { MergeResult } from '../../types/mergeResult.js';
2
+ import type { MergeContext } from '../MergeContext.js';
3
+ import type { ScenarioStrategy } from './ScenarioStrategy.js';
4
+ export declare class AncestorAndLocalStrategy implements ScenarioStrategy {
5
+ execute(context: MergeContext): MergeResult;
6
+ private executeNested;
7
+ private executeWithAttribute;
8
+ }
@@ -0,0 +1,64 @@
1
+ import { deepEqual } from 'fast-equals';
2
+ import { noConflict, withConflict } from '../../types/mergeResult.js';
3
+ import { buildConflictMarkers } from '../ConflictMarkerBuilder.js';
4
+ import { MergeOrchestrator } from '../MergeOrchestrator.js';
5
+ import { toJsonArray } from '../nodes/nodeUtils.js';
6
+ const extractContent = (arr) => {
7
+ return (arr.length === 1 ? arr[0] : arr);
8
+ };
9
+ export class AncestorAndLocalStrategy {
10
+ execute(context) {
11
+ const localUnchanged = deepEqual(context.ancestor, context.local);
12
+ // Root level handling
13
+ if (context.rootKey) {
14
+ const { name, existsInOther } = context.rootKey;
15
+ // Other key missing and local unchanged = other deletion wins
16
+ if (!existsInOther && localUnchanged) {
17
+ return noConflict([]);
18
+ }
19
+ // Other key missing and local changed = conflict at root level
20
+ if (!existsInOther && !localUnchanged) {
21
+ const localObj = {
22
+ [name]: toJsonArray(context.local),
23
+ };
24
+ const ancestorObj = {
25
+ [name]: toJsonArray(context.ancestor),
26
+ };
27
+ return withConflict(buildConflictMarkers(context.config, localObj, ancestorObj, {}));
28
+ }
29
+ // Other key exists with empty value - delegate to nested merge, wrap result
30
+ const result = this.executeNested(context);
31
+ if (result.output.length > 0) {
32
+ return {
33
+ output: [{ [name]: result.output }],
34
+ hasConflict: result.hasConflict,
35
+ };
36
+ }
37
+ // Empty result but key exists - preserve empty key
38
+ return noConflict([{ [name]: [] }]);
39
+ }
40
+ // Nested level: local unchanged means return empty (other deleted)
41
+ if (localUnchanged) {
42
+ return noConflict([]);
43
+ }
44
+ // Nested level with attribute (keyed array element)
45
+ if (context.attribute) {
46
+ return this.executeWithAttribute(context);
47
+ }
48
+ // Nested level conflict
49
+ return withConflict(buildConflictMarkers(context.config, extractContent(toJsonArray(context.local)), extractContent(toJsonArray(context.ancestor)), {}));
50
+ }
51
+ executeNested(context) {
52
+ const orchestrator = new MergeOrchestrator(context.config, context.nodeFactory);
53
+ return orchestrator.merge(context.ancestor, context.local, context.other);
54
+ }
55
+ executeWithAttribute(context) {
56
+ const orchestrator = new MergeOrchestrator(context.config, context.nodeFactory);
57
+ const localResult = orchestrator.merge({}, context.local, {}, undefined);
58
+ const ancestorResult = orchestrator.merge({}, context.ancestor, {}, undefined);
59
+ const localProp = { [context.attribute]: localResult.output };
60
+ const ancestorProp = { [context.attribute]: ancestorResult.output };
61
+ return withConflict(buildConflictMarkers(context.config, localProp, ancestorProp, {}));
62
+ }
63
+ }
64
+ //# sourceMappingURL=AncestorAndLocalStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AncestorAndLocalStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/AncestorAndLocalStrategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { MergeResult } from '../../types/mergeResult.js';
2
+ import type { MergeContext } from '../MergeContext.js';
3
+ import type { ScenarioStrategy } from './ScenarioStrategy.js';
4
+ export declare class AncestorAndOtherStrategy implements ScenarioStrategy {
5
+ execute(context: MergeContext): MergeResult;
6
+ private executeNested;
7
+ private executeWithAttribute;
8
+ }
@@ -0,0 +1,64 @@
1
+ import { deepEqual } from 'fast-equals';
2
+ import { noConflict, withConflict } from '../../types/mergeResult.js';
3
+ import { buildConflictMarkers } from '../ConflictMarkerBuilder.js';
4
+ import { MergeOrchestrator } from '../MergeOrchestrator.js';
5
+ import { toJsonArray } from '../nodes/nodeUtils.js';
6
+ const extractContent = (arr) => {
7
+ return (arr.length === 1 ? arr[0] : arr);
8
+ };
9
+ export class AncestorAndOtherStrategy {
10
+ execute(context) {
11
+ const otherUnchanged = deepEqual(context.ancestor, context.other);
12
+ // Root level handling
13
+ if (context.rootKey) {
14
+ const { name, existsInLocal } = context.rootKey;
15
+ // Local key missing and other unchanged = local deletion wins
16
+ if (!existsInLocal && otherUnchanged) {
17
+ return noConflict([]);
18
+ }
19
+ // Local key missing and other changed = conflict at root level
20
+ if (!existsInLocal && !otherUnchanged) {
21
+ const ancestorObj = {
22
+ [name]: toJsonArray(context.ancestor),
23
+ };
24
+ const otherObj = {
25
+ [name]: toJsonArray(context.other),
26
+ };
27
+ return withConflict(buildConflictMarkers(context.config, {}, ancestorObj, otherObj));
28
+ }
29
+ // Local key exists with empty value - delegate to nested merge, wrap result
30
+ const result = this.executeNested(context);
31
+ if (result.output.length > 0) {
32
+ return {
33
+ output: [{ [name]: result.output }],
34
+ hasConflict: result.hasConflict,
35
+ };
36
+ }
37
+ // Empty result but key exists - preserve empty key
38
+ return noConflict([{ [name]: [] }]);
39
+ }
40
+ // Nested level: other unchanged means return empty (local deleted)
41
+ if (otherUnchanged) {
42
+ return noConflict([]);
43
+ }
44
+ // Nested level with attribute (keyed array element)
45
+ if (context.attribute) {
46
+ return this.executeWithAttribute(context);
47
+ }
48
+ // Nested level conflict
49
+ return withConflict(buildConflictMarkers(context.config, {}, extractContent(toJsonArray(context.ancestor)), extractContent(toJsonArray(context.other))));
50
+ }
51
+ executeNested(context) {
52
+ const orchestrator = new MergeOrchestrator(context.config, context.nodeFactory);
53
+ return orchestrator.merge(context.ancestor, context.local, context.other);
54
+ }
55
+ executeWithAttribute(context) {
56
+ const orchestrator = new MergeOrchestrator(context.config, context.nodeFactory);
57
+ const ancestorResult = orchestrator.merge({}, context.ancestor, {}, undefined);
58
+ const otherResult = orchestrator.merge({}, {}, context.other, undefined);
59
+ const ancestorProp = { [context.attribute]: ancestorResult.output };
60
+ const otherProp = { [context.attribute]: otherResult.output };
61
+ return withConflict(buildConflictMarkers(context.config, {}, ancestorProp, otherProp));
62
+ }
63
+ }
64
+ //# sourceMappingURL=AncestorAndOtherStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AncestorAndOtherStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/AncestorAndOtherStrategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { MergeResult } from '../../types/mergeResult.js';
2
+ import type { MergeContext } from '../MergeContext.js';
3
+ import type { ScenarioStrategy } from './ScenarioStrategy.js';
4
+ export declare class AncestorOnlyStrategy implements ScenarioStrategy {
5
+ execute(context: MergeContext): MergeResult;
6
+ }
@@ -0,0 +1,19 @@
1
+ import { noConflict } from '../../types/mergeResult.js';
2
+ export class AncestorOnlyStrategy {
3
+ execute(context) {
4
+ // ANCESTOR_ONLY: deleted in both local and other
5
+ // Root level: check if key should exist in result
6
+ if (context.rootKey) {
7
+ const { name, existsInLocal, existsInOther } = context.rootKey;
8
+ if (existsInLocal || existsInOther) {
9
+ // Key exists with empty value - preserve empty key
10
+ return noConflict([{ [name]: [] }]);
11
+ }
12
+ // Key completely deleted - return nothing
13
+ return noConflict([]);
14
+ }
15
+ // Nested level: return empty (deleted)
16
+ return noConflict([]);
17
+ }
18
+ }
19
+ //# sourceMappingURL=AncestorOnlyStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AncestorOnlyStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/AncestorOnlyStrategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAIvD,MAAM,OAAO,oBAAoB;IAC/B,OAAO,CAAC,OAAqB;QAC3B,iDAAiD;QAEjD,kDAAkD;QAClD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;YAC9D,IAAI,aAAa,IAAI,aAAa,EAAE,CAAC;gBACnC,mDAAmD;gBACnD,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YACrC,CAAC;YACD,0CAA0C;YAC1C,OAAO,UAAU,CAAC,EAAE,CAAC,CAAA;QACvB,CAAC;QAED,uCAAuC;QACvC,OAAO,UAAU,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { MergeResult } from '../../types/mergeResult.js';
2
+ import type { MergeContext } from '../MergeContext.js';
3
+ import type { ScenarioStrategy } from './ScenarioStrategy.js';
4
+ export declare class LocalAndOtherStrategy implements ScenarioStrategy {
5
+ execute(context: MergeContext): MergeResult;
6
+ private mergeChildren;
7
+ }
@@ -0,0 +1,45 @@
1
+ import { deepEqual } from 'fast-equals';
2
+ import { combineResults, noConflict } from '../../types/mergeResult.js';
3
+ import { getUniqueSortedProps, toJsonArray } from '../nodes/nodeUtils.js';
4
+ export class LocalAndOtherStrategy {
5
+ execute(context) {
6
+ const local = context.local;
7
+ const other = context.other;
8
+ // If identical, return other
9
+ if (deepEqual(local, other)) {
10
+ const content = toJsonArray(other);
11
+ // Root level: wrap with key
12
+ if (context.rootKey) {
13
+ return noConflict([{ [context.rootKey.name]: content }]);
14
+ }
15
+ return noConflict(content);
16
+ }
17
+ // Different - merge children
18
+ const result = this.mergeChildren(context);
19
+ // Root level: wrap result with key
20
+ if (context.rootKey) {
21
+ if (result.output.length > 0) {
22
+ return {
23
+ output: [{ [context.rootKey.name]: result.output }],
24
+ hasConflict: result.hasConflict,
25
+ };
26
+ }
27
+ // Empty result but keys exist - preserve empty key
28
+ return noConflict([{ [context.rootKey.name]: [] }]);
29
+ }
30
+ return result;
31
+ }
32
+ mergeChildren(context) {
33
+ const local = context.local;
34
+ const other = context.other;
35
+ const props = getUniqueSortedProps({}, local, other);
36
+ const results = [];
37
+ for (const key of props) {
38
+ const childNode = context.nodeFactory.createNode(undefined, local[key], other[key], key);
39
+ const childResult = childNode.merge(context.config);
40
+ results.push(childResult);
41
+ }
42
+ return combineResults(results);
43
+ }
44
+ }
45
+ //# sourceMappingURL=LocalAndOtherStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalAndOtherStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/LocalAndOtherStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGvC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAEvE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGzE,MAAM,OAAO,qBAAqB;IAChC,OAAO,CAAC,OAAqB;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAA+B,CAAA;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAA+B,CAAA;QAErD,6BAA6B;QAC7B,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;YAElC,4BAA4B;YAC5B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,CAAC;YAED,OAAO,UAAU,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;QAED,6BAA6B;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAE1C,mCAAmC;QACnC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO;oBACL,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnD,WAAW,EAAE,MAAM,CAAC,WAAW;iBAChC,CAAA;YACH,CAAC;YACD,mDAAmD;YACnD,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,aAAa,CAAC,OAAqB;QACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAA+B,CAAA;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAA+B,CAAA;QACrD,MAAM,KAAK,GAAG,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QACpD,MAAM,OAAO,GAAkB,EAAE,CAAA;QAEjC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAC9C,SAAkB,EAClB,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,GAAG,CAAC,EACV,GAAG,CACJ,CAAA;YACD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACnD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,cAAc,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { MergeResult } from '../../types/mergeResult.js';
2
+ import type { MergeContext } from '../MergeContext.js';
3
+ import type { ScenarioStrategy } from './ScenarioStrategy.js';
4
+ export declare class LocalOnlyStrategy implements ScenarioStrategy {
5
+ execute(context: MergeContext): MergeResult;
6
+ }
@@ -0,0 +1,14 @@
1
+ import { noConflict } from '../../types/mergeResult.js';
2
+ import { toJsonArray } from '../nodes/nodeUtils.js';
3
+ export class LocalOnlyStrategy {
4
+ execute(context) {
5
+ const content = toJsonArray(context.local);
6
+ // Root level: wrap with key
7
+ if (context.rootKey) {
8
+ return noConflict([{ [context.rootKey.name]: content }]);
9
+ }
10
+ // Nested level: return content for parent to wrap
11
+ return noConflict(content);
12
+ }
13
+ }
14
+ //# sourceMappingURL=LocalOnlyStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalOnlyStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/LocalOnlyStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,MAAM,OAAO,iBAAiB;IAC5B,OAAO,CAAC,OAAqB;QAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,KAA+B,CAAC,CAAA;QAEpE,4BAA4B;QAC5B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QAC1D,CAAC;QAED,kDAAkD;QAClD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { MergeResult } from '../../types/mergeResult.js';
2
+ import type { MergeContext } from '../MergeContext.js';
3
+ import type { ScenarioStrategy } from './ScenarioStrategy.js';
4
+ export declare class NoneStrategy implements ScenarioStrategy {
5
+ execute(_context: MergeContext): MergeResult;
6
+ }
@@ -0,0 +1,8 @@
1
+ import { noConflict } from '../../types/mergeResult.js';
2
+ export class NoneStrategy {
3
+ execute(_context) {
4
+ // NONE scenario: nothing exists anywhere, return empty
5
+ return noConflict([]);
6
+ }
7
+ }
8
+ //# sourceMappingURL=NoneStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoneStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/NoneStrategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAIvD,MAAM,OAAO,YAAY;IACvB,OAAO,CAAC,QAAsB;QAC5B,uDAAuD;QACvD,OAAO,UAAU,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { MergeResult } from '../../types/mergeResult.js';
2
+ import type { MergeContext } from '../MergeContext.js';
3
+ import type { ScenarioStrategy } from './ScenarioStrategy.js';
4
+ export declare class OtherOnlyStrategy implements ScenarioStrategy {
5
+ execute(context: MergeContext): MergeResult;
6
+ }
@@ -0,0 +1,14 @@
1
+ import { noConflict } from '../../types/mergeResult.js';
2
+ import { toJsonArray } from '../nodes/nodeUtils.js';
3
+ export class OtherOnlyStrategy {
4
+ execute(context) {
5
+ const content = toJsonArray(context.other);
6
+ // Root level: wrap with key
7
+ if (context.rootKey) {
8
+ return noConflict([{ [context.rootKey.name]: content }]);
9
+ }
10
+ // Nested level: return content for parent to wrap
11
+ return noConflict(content);
12
+ }
13
+ }
14
+ //# sourceMappingURL=OtherOnlyStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtherOnlyStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/OtherOnlyStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,MAAM,OAAO,iBAAiB;IAC5B,OAAO,CAAC,OAAqB;QAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,KAA+B,CAAC,CAAA;QAEpE,4BAA4B;QAC5B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QAC1D,CAAC;QAED,kDAAkD;QAClD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { MergeResult } from '../../types/mergeResult.js';
2
+ import type { MergeContext } from '../MergeContext.js';
3
+ export interface ScenarioStrategy {
4
+ execute(context: MergeContext): MergeResult;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ScenarioStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScenarioStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/ScenarioStrategy.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { MergeScenario } from '../../types/mergeScenario.js';
2
+ import type { ScenarioStrategy } from './ScenarioStrategy.js';
3
+ export declare const getScenarioStrategy: (scenario: MergeScenario) => ScenarioStrategy;
@@ -0,0 +1,23 @@
1
+ import { MergeScenario } from '../../types/mergeScenario.js';
2
+ import { AllPresentStrategy } from './AllPresentStrategy.js';
3
+ import { AncestorAndLocalStrategy } from './AncestorAndLocalStrategy.js';
4
+ import { AncestorAndOtherStrategy } from './AncestorAndOtherStrategy.js';
5
+ import { AncestorOnlyStrategy } from './AncestorOnlyStrategy.js';
6
+ import { LocalAndOtherStrategy } from './LocalAndOtherStrategy.js';
7
+ import { LocalOnlyStrategy } from './LocalOnlyStrategy.js';
8
+ import { NoneStrategy } from './NoneStrategy.js';
9
+ import { OtherOnlyStrategy } from './OtherOnlyStrategy.js';
10
+ const strategies = {
11
+ [MergeScenario.NONE]: new NoneStrategy(),
12
+ [MergeScenario.OTHER_ONLY]: new OtherOnlyStrategy(),
13
+ [MergeScenario.LOCAL_ONLY]: new LocalOnlyStrategy(),
14
+ [MergeScenario.LOCAL_AND_OTHER]: new LocalAndOtherStrategy(),
15
+ [MergeScenario.ANCESTOR_ONLY]: new AncestorOnlyStrategy(),
16
+ [MergeScenario.ANCESTOR_AND_OTHER]: new AncestorAndOtherStrategy(),
17
+ [MergeScenario.ANCESTOR_AND_LOCAL]: new AncestorAndLocalStrategy(),
18
+ [MergeScenario.ALL]: new AllPresentStrategy(),
19
+ };
20
+ export const getScenarioStrategy = (scenario) => {
21
+ return strategies[scenario];
22
+ };
23
+ //# sourceMappingURL=ScenarioStrategyFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScenarioStrategyFactory.js","sourceRoot":"","sources":["../../../src/merger/strategies/ScenarioStrategyFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG1D,MAAM,UAAU,GAA4C;IAC1D,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,YAAY,EAAE;IACxC,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,IAAI,iBAAiB,EAAE;IACnD,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,IAAI,iBAAiB,EAAE;IACnD,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,IAAI,qBAAqB,EAAE;IAC5D,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,IAAI,oBAAoB,EAAE;IACzD,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,IAAI,wBAAwB,EAAE;IAClE,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,IAAI,wBAAwB,EAAE;IAClE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,IAAI,kBAAkB,EAAE;CAC9C,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAAuB,EACL,EAAE;IACpB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAA;AAC7B,CAAC,CAAA"}
@@ -0,0 +1,32 @@
1
+ import type { MergeConfig } from '../../types/conflictTypes.js';
2
+ import type { JsonObject } from '../../types/jsonTypes.js';
3
+ import type { MergeResult } from '../../types/mergeResult.js';
4
+ import { MergeScenario } from '../../types/mergeScenario.js';
5
+ export interface TextMergeStrategy {
6
+ handle(config: MergeConfig, objAncestor: JsonObject, objLocal: JsonObject, objOther: JsonObject, ancestor: unknown, local: unknown, other: unknown): MergeResult;
7
+ }
8
+ export declare class OtherOnlyStrategy implements TextMergeStrategy {
9
+ handle(_config: MergeConfig, _objAncestor: JsonObject, _objLocal: JsonObject, objOther: JsonObject): MergeResult;
10
+ }
11
+ export declare class LocalOnlyStrategy implements TextMergeStrategy {
12
+ handle(_config: MergeConfig, _objAncestor: JsonObject, objLocal: JsonObject): MergeResult;
13
+ }
14
+ export declare class LocalAndOtherStrategy implements TextMergeStrategy {
15
+ handle(config: MergeConfig, _objAncestor: JsonObject, objLocal: JsonObject, objOther: JsonObject, _ancestor: unknown, local: unknown, other: unknown): MergeResult;
16
+ }
17
+ export declare class AncestorAndOtherStrategy implements TextMergeStrategy {
18
+ handle(config: MergeConfig, objAncestor: JsonObject, _objLocal: JsonObject, objOther: JsonObject, ancestor: unknown, _local: unknown, other: unknown): MergeResult;
19
+ }
20
+ export declare class AncestorAndLocalStrategy implements TextMergeStrategy {
21
+ handle(config: MergeConfig, objAncestor: JsonObject, objLocal: JsonObject, _objOther: JsonObject, ancestor: unknown, local: unknown): MergeResult;
22
+ }
23
+ export declare class AllPresentStrategy implements TextMergeStrategy {
24
+ handle(config: MergeConfig, objAncestor: JsonObject, objLocal: JsonObject, objOther: JsonObject, ancestor: unknown, local: unknown, other: unknown): MergeResult;
25
+ }
26
+ export declare class AncestorOnlyStrategy implements TextMergeStrategy {
27
+ handle(): MergeResult;
28
+ }
29
+ export declare class NoneStrategy implements TextMergeStrategy {
30
+ handle(): MergeResult;
31
+ }
32
+ export declare const getTextMergeStrategy: (scenario: MergeScenario) => TextMergeStrategy;
@@ -0,0 +1,80 @@
1
+ import { noConflict, withConflict } from '../../types/mergeResult.js';
2
+ import { MergeScenario } from '../../types/mergeScenario.js';
3
+ import { buildConflictMarkers } from '../ConflictMarkerBuilder.js';
4
+ export class OtherOnlyStrategy {
5
+ handle(_config, _objAncestor, _objLocal, objOther) {
6
+ return noConflict([objOther]);
7
+ }
8
+ }
9
+ export class LocalOnlyStrategy {
10
+ handle(_config, _objAncestor, objLocal) {
11
+ return noConflict([objLocal]);
12
+ }
13
+ }
14
+ export class LocalAndOtherStrategy {
15
+ handle(config, _objAncestor, objLocal, objOther, _ancestor, local, other) {
16
+ // If both sides added the same value, no conflict
17
+ if (local === other) {
18
+ return noConflict([objLocal]);
19
+ }
20
+ return withConflict(buildConflictMarkers(config, objLocal, {}, objOther));
21
+ }
22
+ }
23
+ export class AncestorAndOtherStrategy {
24
+ handle(config, objAncestor, _objLocal, objOther, ancestor, _local, other) {
25
+ if (ancestor !== other) {
26
+ return withConflict(buildConflictMarkers(config, {}, objAncestor, objOther));
27
+ }
28
+ return noConflict([]);
29
+ }
30
+ }
31
+ export class AncestorAndLocalStrategy {
32
+ handle(config, objAncestor, objLocal, _objOther, ancestor, local) {
33
+ if (ancestor !== local) {
34
+ return withConflict(buildConflictMarkers(config, objLocal, objAncestor, {}));
35
+ }
36
+ return noConflict([]);
37
+ }
38
+ }
39
+ export class AllPresentStrategy {
40
+ handle(config, objAncestor, objLocal, objOther, ancestor, local, other) {
41
+ // No change in local - take other's value
42
+ if (ancestor === local) {
43
+ return noConflict([objOther]);
44
+ }
45
+ // No change in other - take local's value
46
+ if (ancestor === other) {
47
+ return noConflict([objLocal]);
48
+ }
49
+ // Both changed to same value - no conflict
50
+ if (local === other) {
51
+ return noConflict([objLocal]);
52
+ }
53
+ // Real conflict - build markers
54
+ return withConflict(buildConflictMarkers(config, objLocal, objAncestor, objOther));
55
+ }
56
+ }
57
+ export class AncestorOnlyStrategy {
58
+ handle() {
59
+ return noConflict([]);
60
+ }
61
+ }
62
+ export class NoneStrategy {
63
+ handle() {
64
+ return noConflict([]);
65
+ }
66
+ }
67
+ const strategies = {
68
+ [MergeScenario.NONE]: new NoneStrategy(),
69
+ [MergeScenario.OTHER_ONLY]: new OtherOnlyStrategy(),
70
+ [MergeScenario.LOCAL_ONLY]: new LocalOnlyStrategy(),
71
+ [MergeScenario.LOCAL_AND_OTHER]: new LocalAndOtherStrategy(),
72
+ [MergeScenario.ANCESTOR_AND_OTHER]: new AncestorAndOtherStrategy(),
73
+ [MergeScenario.ANCESTOR_AND_LOCAL]: new AncestorAndLocalStrategy(),
74
+ [MergeScenario.ALL]: new AllPresentStrategy(),
75
+ [MergeScenario.ANCESTOR_ONLY]: new AncestorOnlyStrategy(),
76
+ };
77
+ export const getTextMergeStrategy = (scenario) => {
78
+ return strategies[scenario];
79
+ };
80
+ //# sourceMappingURL=TextMergeStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextMergeStrategy.js","sourceRoot":"","sources":["../../../src/merger/strategies/TextMergeStrategy.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { __decorate } from "tslib";
2
+ import { NAMESPACE_PREFIX, NAMESPACE_ROOT } from '../constant/parserConstant.js';
2
3
  import { log } from '../utils/LoggingDecorator.js';
3
- const NAMESPACE_PREFIX = '@_';
4
- const NAMESPACE_ROOT = ':@';
5
4
  export class NamespaceHandler {
6
5
  processNamespaces(ancestor, local, other) {
7
6
  const namespaces = {};
@@ -1 +1 @@
1
- {"version":3,"file":"NamespaceHandler.js","sourceRoot":"","sources":["../../src/service/NamespaceHandler.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAElD,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAC7B,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,MAAM,OAAO,gBAAgB;IAEpB,iBAAiB,CACtB,QAAgC,EAChC,KAA6B,EAC7B,KAA6B;QAE7B,MAAM,UAAU,GAAe,EAAE,CAAA;QAEjC,2DAA2D;QAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,iEAAiE;gBACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAe,CAAA;gBACvC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAC1C,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;wBACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA,CAAC,8CAA8C;oBAC1E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAGM,qBAAqB,CAAC,GAAc,EAAE,UAAsB;QACjE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,iCAAiC;YACjC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,CAAe,CAAA;YAEvC,yDAAyD;YACzD,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAA;YAE/B,0DAA0D;YAC1D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,CAAC;gBAAC,UAAU,CAAC,cAAc,CAAgB,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;YACpE,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAvCQ;IADN,GAAG;yDAuBH;AAGM;IADN,GAAG;6DAcH"}
1
+ {"version":3,"file":"NamespaceHandler.js","sourceRoot":"","sources":["../../src/service/NamespaceHandler.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAEhF,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAElD,MAAM,OAAO,gBAAgB;IAEpB,iBAAiB,CACtB,QAAgC,EAChC,KAA6B,EAC7B,KAA6B;QAE7B,MAAM,UAAU,GAAe,EAAE,CAAA;QAEjC,2DAA2D;QAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,iEAAiE;gBACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAe,CAAA;gBACvC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAC1C,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;wBACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA,CAAC,8CAA8C;oBAC1E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAGM,qBAAqB,CAAC,GAAc,EAAE,UAAsB;QACjE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,iCAAiC;YACjC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,CAAe,CAAA;YAEvC,yDAAyD;YACzD,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAA;YAE/B,0DAA0D;YAC1D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,CAAC;gBAAC,UAAU,CAAC,cAAc,CAAgB,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;YACpE,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAvCQ;IADN,GAAG;yDAuBH;AAGM;IADN,GAAG;6DAcH"}
@@ -1,4 +1,4 @@
1
- export interface conflicConfig {
1
+ export interface MergeConfig {
2
2
  conflictMarkerSize: number;
3
3
  ancestorConflictTag: string;
4
4
  localConflictTag: string;
@@ -0,0 +1,8 @@
1
+ import type { JsonArray } from './jsonTypes.js';
2
+ export interface MergeResult {
3
+ output: JsonArray;
4
+ hasConflict: boolean;
5
+ }
6
+ export declare const combineResults: (results: MergeResult[]) => MergeResult;
7
+ export declare const noConflict: (output: JsonArray) => MergeResult;
8
+ export declare const withConflict: (output: JsonArray) => MergeResult;
@@ -0,0 +1,33 @@
1
+ // Pre-allocated constant for the common empty no-conflict case
2
+ // Used by NoneStrategy, AncestorOnlyStrategy, and equality-based early returns
3
+ const EMPTY_ARRAY = [];
4
+ const EMPTY_NO_CONFLICT = {
5
+ output: EMPTY_ARRAY,
6
+ hasConflict: false,
7
+ };
8
+ export const combineResults = (results) => {
9
+ // Fast path: no results
10
+ if (results.length === 0) {
11
+ return EMPTY_NO_CONFLICT;
12
+ }
13
+ // Fast path: single result
14
+ if (results.length === 1) {
15
+ return results[0];
16
+ }
17
+ return {
18
+ output: results.flatMap(r => r.output),
19
+ hasConflict: results.some(r => r.hasConflict),
20
+ };
21
+ };
22
+ export const noConflict = (output) => {
23
+ // Reuse constant for empty arrays
24
+ if (output.length === 0) {
25
+ return EMPTY_NO_CONFLICT;
26
+ }
27
+ return { output, hasConflict: false };
28
+ };
29
+ export const withConflict = (output) => ({
30
+ output,
31
+ hasConflict: true,
32
+ });
33
+ //# sourceMappingURL=mergeResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeResult.js","sourceRoot":"","sources":["../../src/types/mergeResult.ts"],"names":[],"mappings":"AAOA,+DAA+D;AAC/D,+EAA+E;AAC/E,MAAM,WAAW,GAAc,EAAE,CAAA;AACjC,MAAM,iBAAiB,GAAgB;IACrC,MAAM,EAAE,WAAW;IACnB,WAAW,EAAE,KAAK;CACnB,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAsB,EAAe,EAAE;IACpE,wBAAwB;IACxB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,iBAAiB,CAAA;IAC1B,CAAC;IACD,2BAA2B;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACtC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;KAC9C,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAiB,EAAe,EAAE;IAC3D,kCAAkC;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,iBAAiB,CAAA;IAC1B,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAiB,EAAe,EAAE,CAAC,CAAC;IAC/D,MAAM;IACN,WAAW,EAAE,IAAI;CAClB,CAAC,CAAA"}