@gitwand/core 2.3.0 → 2.4.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 (113) hide show
  1. package/dist/__tests__/corpus.d.ts.map +1 -1
  2. package/dist/__tests__/corpus.js +115 -0
  3. package/dist/__tests__/corpus.js.map +1 -1
  4. package/dist/__tests__/patterns/complex.test.d.ts +9 -0
  5. package/dist/__tests__/patterns/complex.test.d.ts.map +1 -0
  6. package/dist/__tests__/patterns/complex.test.js +198 -0
  7. package/dist/__tests__/patterns/complex.test.js.map +1 -0
  8. package/dist/__tests__/patterns/delete-no-change.test.d.ts +11 -0
  9. package/dist/__tests__/patterns/delete-no-change.test.d.ts.map +1 -0
  10. package/dist/__tests__/patterns/delete-no-change.test.js +178 -0
  11. package/dist/__tests__/patterns/delete-no-change.test.js.map +1 -0
  12. package/dist/__tests__/patterns/non-overlapping.test.d.ts +11 -0
  13. package/dist/__tests__/patterns/non-overlapping.test.d.ts.map +1 -0
  14. package/dist/__tests__/patterns/non-overlapping.test.js +240 -0
  15. package/dist/__tests__/patterns/non-overlapping.test.js.map +1 -0
  16. package/dist/__tests__/patterns/one-side-change.test.d.ts +10 -0
  17. package/dist/__tests__/patterns/one-side-change.test.d.ts.map +1 -0
  18. package/dist/__tests__/patterns/one-side-change.test.js +191 -0
  19. package/dist/__tests__/patterns/one-side-change.test.js.map +1 -0
  20. package/dist/__tests__/patterns/same-change.test.d.ts +9 -0
  21. package/dist/__tests__/patterns/same-change.test.d.ts.map +1 -0
  22. package/dist/__tests__/patterns/same-change.test.js +173 -0
  23. package/dist/__tests__/patterns/same-change.test.js.map +1 -0
  24. package/dist/__tests__/patterns/value-only-change.test.d.ts +11 -0
  25. package/dist/__tests__/patterns/value-only-change.test.d.ts.map +1 -0
  26. package/dist/__tests__/patterns/value-only-change.test.js +159 -0
  27. package/dist/__tests__/patterns/value-only-change.test.js.map +1 -0
  28. package/dist/__tests__/patterns/whitespace-only.test.d.ts +10 -0
  29. package/dist/__tests__/patterns/whitespace-only.test.d.ts.map +1 -0
  30. package/dist/__tests__/patterns/whitespace-only.test.js +177 -0
  31. package/dist/__tests__/patterns/whitespace-only.test.js.map +1 -0
  32. package/dist/__tests__/resolvers/css.test.d.ts +12 -0
  33. package/dist/__tests__/resolvers/css.test.d.ts.map +1 -0
  34. package/dist/__tests__/resolvers/css.test.js +171 -0
  35. package/dist/__tests__/resolvers/css.test.js.map +1 -0
  36. package/dist/__tests__/resolvers/imports.test.d.ts +12 -0
  37. package/dist/__tests__/resolvers/imports.test.d.ts.map +1 -0
  38. package/dist/__tests__/resolvers/imports.test.js +135 -0
  39. package/dist/__tests__/resolvers/imports.test.js.map +1 -0
  40. package/dist/__tests__/resolvers/json.test.d.ts +12 -0
  41. package/dist/__tests__/resolvers/json.test.d.ts.map +1 -0
  42. package/dist/__tests__/resolvers/json.test.js +184 -0
  43. package/dist/__tests__/resolvers/json.test.js.map +1 -0
  44. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts +12 -0
  45. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts.map +1 -0
  46. package/dist/__tests__/resolvers/lockfile-npm.test.js +187 -0
  47. package/dist/__tests__/resolvers/lockfile-npm.test.js.map +1 -0
  48. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts +12 -0
  49. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts.map +1 -0
  50. package/dist/__tests__/resolvers/lockfile-pnpm.test.js +175 -0
  51. package/dist/__tests__/resolvers/lockfile-pnpm.test.js.map +1 -0
  52. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts +12 -0
  53. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts.map +1 -0
  54. package/dist/__tests__/resolvers/lockfile-yarn.test.js +165 -0
  55. package/dist/__tests__/resolvers/lockfile-yarn.test.js.map +1 -0
  56. package/dist/__tests__/resolvers/markdown.test.d.ts +12 -0
  57. package/dist/__tests__/resolvers/markdown.test.d.ts.map +1 -0
  58. package/dist/__tests__/resolvers/markdown.test.js +188 -0
  59. package/dist/__tests__/resolvers/markdown.test.js.map +1 -0
  60. package/dist/__tests__/resolvers/vue.test.d.ts +12 -0
  61. package/dist/__tests__/resolvers/vue.test.d.ts.map +1 -0
  62. package/dist/__tests__/resolvers/vue.test.js +225 -0
  63. package/dist/__tests__/resolvers/vue.test.js.map +1 -0
  64. package/dist/__tests__/resolvers/yaml.test.d.ts +12 -0
  65. package/dist/__tests__/resolvers/yaml.test.d.ts.map +1 -0
  66. package/dist/__tests__/resolvers/yaml.test.js +203 -0
  67. package/dist/__tests__/resolvers/yaml.test.js.map +1 -0
  68. package/dist/__tests__/v2-core-scenarios.test.d.ts +35 -0
  69. package/dist/__tests__/v2-core-scenarios.test.d.ts.map +1 -0
  70. package/dist/__tests__/v2-core-scenarios.test.js +692 -0
  71. package/dist/__tests__/v2-core-scenarios.test.js.map +1 -0
  72. package/dist/__tests__/validation-parse-tree.test.d.ts +15 -0
  73. package/dist/__tests__/validation-parse-tree.test.d.ts.map +1 -0
  74. package/dist/__tests__/validation-parse-tree.test.js +243 -0
  75. package/dist/__tests__/validation-parse-tree.test.js.map +1 -0
  76. package/dist/config.d.ts +25 -0
  77. package/dist/config.d.ts.map +1 -1
  78. package/dist/config.js +17 -0
  79. package/dist/config.js.map +1 -1
  80. package/dist/diff/index.d.ts.map +1 -1
  81. package/dist/diff/index.js +1 -3
  82. package/dist/diff/index.js.map +1 -1
  83. package/dist/patterns/utils.d.ts +8 -7
  84. package/dist/patterns/utils.d.ts.map +1 -1
  85. package/dist/patterns/utils.js +13 -12
  86. package/dist/patterns/utils.js.map +1 -1
  87. package/dist/resolver/adapters/strict-node.d.ts +32 -0
  88. package/dist/resolver/adapters/strict-node.d.ts.map +1 -0
  89. package/dist/resolver/adapters/strict-node.js +117 -0
  90. package/dist/resolver/adapters/strict-node.js.map +1 -0
  91. package/dist/resolver/index.d.ts +20 -1
  92. package/dist/resolver/index.d.ts.map +1 -1
  93. package/dist/resolver/index.js +89 -5
  94. package/dist/resolver/index.js.map +1 -1
  95. package/dist/resolver/policy.d.ts.map +1 -1
  96. package/dist/resolver/policy.js +3 -0
  97. package/dist/resolver/policy.js.map +1 -1
  98. package/dist/resolver/validate-parse-tree.d.ts +52 -0
  99. package/dist/resolver/validate-parse-tree.d.ts.map +1 -0
  100. package/dist/resolver/validate-parse-tree.js +87 -0
  101. package/dist/resolver/validate-parse-tree.js.map +1 -0
  102. package/dist/resolver/validate-strict.d.ts +27 -0
  103. package/dist/resolver/validate-strict.d.ts.map +1 -0
  104. package/dist/resolver/validate-strict.js +41 -0
  105. package/dist/resolver/validate-strict.js.map +1 -0
  106. package/dist/resolver/validation.d.ts.map +1 -1
  107. package/dist/resolver/validation.js +15 -1
  108. package/dist/resolver/validation.js.map +1 -1
  109. package/dist/resolvers/dispatcher.d.ts.map +1 -1
  110. package/dist/resolvers/dispatcher.js.map +1 -1
  111. package/dist/types.d.ts +60 -3
  112. package/dist/types.d.ts.map +1 -1
  113. package/package.json +1 -1
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Tests du pattern non_overlapping (priority 40)
3
+ *
4
+ * Nécessite diff3 (base obligatoire).
5
+ * Détection : l'algorithme mergeNonOverlapping() interne réussit —
6
+ * les zones modifiées par ours et theirs ne se chevauchent pas.
7
+ * Cas typique : ours ajoute des lignes en haut, theirs ajoute en bas.
8
+ * Auto-résolu en combinant les deux ensembles de changements.
9
+ */
10
+ import { describe, it, expect } from "vitest";
11
+ import { resolve } from "../../resolver.js";
12
+ // ─── Cas qui doivent matcher non_overlapping ─────────────────
13
+ describe("non_overlapping : ours insère en haut, theirs insère en bas (diff3)", () => {
14
+ const input = [
15
+ `<<<<<<< ours`,
16
+ ` INSERTED_BY_OURS,`,
17
+ ` alpha,`,
18
+ ` beta,`,
19
+ `||||||| base`,
20
+ ` alpha,`,
21
+ ` beta,`,
22
+ `=======`,
23
+ ` alpha,`,
24
+ ` beta,`,
25
+ ` INSERTED_BY_THEIRS,`,
26
+ `>>>>>>> theirs`,
27
+ ].join("\n");
28
+ it("classifie en non_overlapping", () => {
29
+ const result = resolve(input, "src/list.ts");
30
+ expect(result.hunks[0].type).toBe("non_overlapping");
31
+ });
32
+ it("auto-résout (autoResolved === 1)", () => {
33
+ const result = resolve(input, "src/list.ts");
34
+ expect(result.stats.autoResolved).toBe(1);
35
+ });
36
+ it("le résultat contient les insertions des deux côtés", () => {
37
+ const result = resolve(input, "src/list.ts");
38
+ const merged = result.mergedContent;
39
+ expect(merged).toContain("INSERTED_BY_OURS");
40
+ expect(merged).toContain("INSERTED_BY_THEIRS");
41
+ expect(merged).toContain("alpha");
42
+ expect(merged).toContain("beta");
43
+ });
44
+ });
45
+ describe("non_overlapping : ours modifie première ligne, theirs modifie dernière ligne (diff3)", () => {
46
+ const input = [
47
+ `<<<<<<< ours`,
48
+ ` host: "prod.example.com",`,
49
+ ` port: 5432,`,
50
+ ` name: "mydb",`,
51
+ `||||||| base`,
52
+ ` host: "localhost",`,
53
+ ` port: 5432,`,
54
+ ` name: "mydb",`,
55
+ `=======`,
56
+ ` host: "localhost",`,
57
+ ` port: 5432,`,
58
+ ` name: "production_db",`,
59
+ `>>>>>>> theirs`,
60
+ ].join("\n");
61
+ it("classifie en non_overlapping", () => {
62
+ const result = resolve(input, "src/db-config.ts");
63
+ expect(result.hunks[0].type).toBe("non_overlapping");
64
+ });
65
+ it("auto-résout", () => {
66
+ const result = resolve(input, "src/db-config.ts");
67
+ expect(result.stats.autoResolved).toBe(1);
68
+ });
69
+ it("le résultat combine les deux modifications", () => {
70
+ const result = resolve(input, "src/db-config.ts");
71
+ const merged = result.mergedContent;
72
+ expect(merged).toContain("prod.example.com");
73
+ expect(merged).toContain("production_db");
74
+ });
75
+ });
76
+ describe("non_overlapping : ours ajoute avant, theirs ajoute au milieu (diff3)", () => {
77
+ const input = [
78
+ `<<<<<<< ours`,
79
+ ` alpha,`,
80
+ ` INSERTED_BY_OURS,`,
81
+ ` beta,`,
82
+ ` gamma,`,
83
+ `||||||| base`,
84
+ ` alpha,`,
85
+ ` beta,`,
86
+ ` gamma,`,
87
+ `=======`,
88
+ ` alpha,`,
89
+ ` beta,`,
90
+ ` INSERTED_BY_THEIRS,`,
91
+ ` gamma,`,
92
+ `>>>>>>> theirs`,
93
+ ].join("\n");
94
+ it("classifie en non_overlapping", () => {
95
+ const result = resolve(input, "src/items.ts");
96
+ expect(result.hunks[0].type).toBe("non_overlapping");
97
+ });
98
+ it("auto-résout", () => {
99
+ const result = resolve(input, "src/items.ts");
100
+ expect(result.stats.autoResolved).toBe(1);
101
+ });
102
+ });
103
+ describe("non_overlapping : modifications sur lignes distinctes (diff3)", () => {
104
+ const input = [
105
+ `<<<<<<< ours`,
106
+ ` firstName: "John",`,
107
+ ` age: 30,`,
108
+ ` city: "Paris",`,
109
+ `||||||| base`,
110
+ ` firstName: "John",`,
111
+ ` age: 25,`,
112
+ ` city: "Paris",`,
113
+ `=======`,
114
+ ` firstName: "Jane",`,
115
+ ` age: 25,`,
116
+ ` city: "Paris",`,
117
+ `>>>>>>> theirs`,
118
+ ].join("\n");
119
+ it("classifie en non_overlapping", () => {
120
+ const result = resolve(input, "src/user.ts");
121
+ expect(result.hunks[0].type).toBe("non_overlapping");
122
+ });
123
+ it("auto-résout", () => {
124
+ const result = resolve(input, "src/user.ts");
125
+ expect(result.stats.autoResolved).toBe(1);
126
+ });
127
+ });
128
+ describe("non_overlapping : ajout d'imports dans des branches (diff3)", () => {
129
+ const input = [
130
+ `<<<<<<< ours`,
131
+ `import { ComponentA } from "./a";`,
132
+ `import { NewFromOurs } from "./ours";`,
133
+ `import { ComponentB } from "./b";`,
134
+ `||||||| base`,
135
+ `import { ComponentA } from "./a";`,
136
+ `import { ComponentB } from "./b";`,
137
+ `=======`,
138
+ `import { ComponentA } from "./a";`,
139
+ `import { ComponentB } from "./b";`,
140
+ `import { NewFromTheirs } from "./theirs";`,
141
+ `>>>>>>> theirs`,
142
+ ].join("\n");
143
+ it("classifie en non_overlapping", () => {
144
+ const result = resolve(input, "src/imports.ts");
145
+ expect(result.hunks[0].type).toBe("non_overlapping");
146
+ });
147
+ it("auto-résout", () => {
148
+ const result = resolve(input, "src/imports.ts");
149
+ expect(result.stats.autoResolved).toBe(1);
150
+ });
151
+ it("le résultat contient les imports des deux branches", () => {
152
+ const result = resolve(input, "src/imports.ts");
153
+ const merged = result.mergedContent;
154
+ expect(merged).toContain("NewFromOurs");
155
+ expect(merged).toContain("NewFromTheirs");
156
+ });
157
+ });
158
+ // ─── Cas qui ne doivent PAS matcher non_overlapping ──────────
159
+ describe("non_overlapping : cas qui ne doivent pas matcher", () => {
160
+ it("ne matche pas si les deux côtés modifient la même ligne", () => {
161
+ const input = [
162
+ `<<<<<<< ours`,
163
+ ` value: "ours",`,
164
+ `||||||| base`,
165
+ ` value: "base",`,
166
+ `=======`,
167
+ ` value: "theirs",`,
168
+ `>>>>>>> theirs`,
169
+ ].join("\n");
170
+ // Les deux modifient la même ligne → pas non_overlapping
171
+ const result = resolve(input, "src/test.ts");
172
+ expect(result.hunks[0].type).not.toBe("non_overlapping");
173
+ });
174
+ it("ne matche pas si les deux insèrent la même ligne (same_change prioritaire)", () => {
175
+ const input = [
176
+ `<<<<<<< ours`,
177
+ ` foo,`,
178
+ ` SAME_INSERTION,`,
179
+ `||||||| base`,
180
+ ` foo,`,
181
+ `=======`,
182
+ ` foo,`,
183
+ ` SAME_INSERTION,`,
184
+ `>>>>>>> theirs`,
185
+ ].join("\n");
186
+ // same_change (prio 10) prend la main
187
+ const result = resolve(input, "src/test.ts");
188
+ expect(result.hunks[0].type).toBe("same_change");
189
+ });
190
+ it("ne matche pas sans base (diff2)", () => {
191
+ const input = [
192
+ `<<<<<<< ours`,
193
+ ` alpha,`,
194
+ ` OURS,`,
195
+ ` beta,`,
196
+ `=======`,
197
+ ` alpha,`,
198
+ ` beta,`,
199
+ ` THEIRS,`,
200
+ `>>>>>>> theirs`,
201
+ ].join("\n");
202
+ // Sans base on ne peut pas appliquer non_overlapping
203
+ const result = resolve(input, "src/test.ts");
204
+ expect(result.hunks[0].type).not.toBe("non_overlapping");
205
+ });
206
+ it("ne matche pas si les deux côtés modifient des zones adjacentes qui se chevauchent", () => {
207
+ const input = [
208
+ `<<<<<<< ours`,
209
+ ` a: 1,`,
210
+ ` b: 20,`,
211
+ ` c: 30,`,
212
+ `||||||| base`,
213
+ ` a: 1,`,
214
+ ` b: 2,`,
215
+ ` c: 3,`,
216
+ `=======`,
217
+ ` a: 1,`,
218
+ ` b: 200,`,
219
+ ` c: 300,`,
220
+ `>>>>>>> theirs`,
221
+ ].join("\n");
222
+ // Les deux modifient b et c → chevauchement
223
+ const result = resolve(input, "src/test.ts");
224
+ expect(result.hunks[0].type).not.toBe("non_overlapping");
225
+ });
226
+ it("ne matche pas si ours === theirs (same_change prioritaire)", () => {
227
+ const input = [
228
+ `<<<<<<< ours`,
229
+ ` x: 42,`,
230
+ `||||||| base`,
231
+ ` x: 1,`,
232
+ `=======`,
233
+ ` x: 42,`,
234
+ `>>>>>>> theirs`,
235
+ ].join("\n");
236
+ const result = resolve(input, "src/test.ts");
237
+ expect(result.hunks[0].type).toBe("same_change");
238
+ });
239
+ });
240
+ //# sourceMappingURL=non-overlapping.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"non-overlapping.test.js","sourceRoot":"","sources":["../../../src/__tests__/patterns/non-overlapping.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tests du pattern one_side_change (priority 30)
3
+ *
4
+ * Nécessite diff3 (base obligatoire).
5
+ * Détection : (ours === base ET theirs ≠ base) OU (ours ≠ base ET theirs === base).
6
+ * Un seul côté a modifié par rapport à la base — l'autre est resté identique.
7
+ * Auto-résolu en prenant le côté qui a changé.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=one-side-change.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"one-side-change.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/patterns/one-side-change.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Tests du pattern one_side_change (priority 30)
3
+ *
4
+ * Nécessite diff3 (base obligatoire).
5
+ * Détection : (ours === base ET theirs ≠ base) OU (ours ≠ base ET theirs === base).
6
+ * Un seul côté a modifié par rapport à la base — l'autre est resté identique.
7
+ * Auto-résolu en prenant le côté qui a changé.
8
+ */
9
+ import { describe, it, expect } from "vitest";
10
+ import { resolve } from "../../resolver.js";
11
+ // ─── Cas qui doivent matcher one_side_change ─────────────────
12
+ describe("one_side_change : theirs modifie, ours inchangé (diff3)", () => {
13
+ const input = [
14
+ `<<<<<<< ours`,
15
+ ` retries: 3,`,
16
+ `||||||| base`,
17
+ ` retries: 3,`,
18
+ `=======`,
19
+ ` retries: 5,`,
20
+ `>>>>>>> theirs`,
21
+ ].join("\n");
22
+ it("classifie en one_side_change", () => {
23
+ const result = resolve(input, "src/config.ts");
24
+ expect(result.hunks[0].type).toBe("one_side_change");
25
+ });
26
+ it("auto-résout (autoResolved === 1)", () => {
27
+ const result = resolve(input, "src/config.ts");
28
+ expect(result.stats.autoResolved).toBe(1);
29
+ });
30
+ it("le résultat prend la valeur de theirs", () => {
31
+ const result = resolve(input, "src/config.ts");
32
+ expect(result.mergedContent).toContain("retries: 5");
33
+ });
34
+ });
35
+ describe("one_side_change : ours modifie, theirs inchangé (diff3)", () => {
36
+ const input = [
37
+ `<<<<<<< ours`,
38
+ ` maxConnections: 100,`,
39
+ `||||||| base`,
40
+ ` maxConnections: 10,`,
41
+ `=======`,
42
+ ` maxConnections: 10,`,
43
+ `>>>>>>> theirs`,
44
+ ].join("\n");
45
+ it("classifie en one_side_change", () => {
46
+ const result = resolve(input, "src/db.ts");
47
+ expect(result.hunks[0].type).toBe("one_side_change");
48
+ });
49
+ it("auto-résout", () => {
50
+ const result = resolve(input, "src/db.ts");
51
+ expect(result.stats.autoResolved).toBe(1);
52
+ });
53
+ it("le résultat prend la valeur de ours", () => {
54
+ const result = resolve(input, "src/db.ts");
55
+ expect(result.mergedContent).toContain("maxConnections: 100");
56
+ });
57
+ });
58
+ describe("one_side_change : theirs modifie un bloc multi-lignes (diff3)", () => {
59
+ const input = [
60
+ `<<<<<<< ours`,
61
+ ` function oldImpl() {`,
62
+ ` return 42;`,
63
+ ` }`,
64
+ `||||||| base`,
65
+ ` function oldImpl() {`,
66
+ ` return 42;`,
67
+ ` }`,
68
+ `=======`,
69
+ ` function newImpl() {`,
70
+ ` return 100;`,
71
+ ` }`,
72
+ `>>>>>>> theirs`,
73
+ ].join("\n");
74
+ it("classifie en one_side_change", () => {
75
+ const result = resolve(input, "src/utils.ts");
76
+ expect(result.hunks[0].type).toBe("one_side_change");
77
+ });
78
+ it("auto-résout", () => {
79
+ const result = resolve(input, "src/utils.ts");
80
+ expect(result.stats.autoResolved).toBe(1);
81
+ });
82
+ });
83
+ describe("one_side_change : ours modifie une chaîne (diff3)", () => {
84
+ const input = [
85
+ `<<<<<<< ours`,
86
+ `const API_URL = "https://api.v2.example.com";`,
87
+ `||||||| base`,
88
+ `const API_URL = "https://api.example.com";`,
89
+ `=======`,
90
+ `const API_URL = "https://api.example.com";`,
91
+ `>>>>>>> theirs`,
92
+ ].join("\n");
93
+ it("classifie en one_side_change", () => {
94
+ const result = resolve(input, "src/constants.ts");
95
+ expect(result.hunks[0].type).toBe("one_side_change");
96
+ });
97
+ it("auto-résout", () => {
98
+ const result = resolve(input, "src/constants.ts");
99
+ expect(result.stats.autoResolved).toBe(1);
100
+ });
101
+ });
102
+ describe("one_side_change : theirs supprime, ours inchangé — delete_no_change prioritaire (prio 20)", () => {
103
+ // delete_no_change est prioritaire sur one_side_change pour les suppressions
104
+ it("delete_no_change (prio 20) prend la main quand theirs supprime et ours === base", () => {
105
+ const input = [
106
+ `<<<<<<< ours`,
107
+ ` debug: true,`,
108
+ `||||||| base`,
109
+ ` debug: true,`,
110
+ `=======`,
111
+ `>>>>>>> theirs`,
112
+ ].join("\n");
113
+ const result = resolve(input, "src/test.ts");
114
+ // delete_no_change est prioritaire (prio 20 < 30)
115
+ expect(result.hunks[0].type).toBe("delete_no_change");
116
+ });
117
+ });
118
+ // ─── Cas qui ne doivent PAS matcher one_side_change ──────────
119
+ describe("one_side_change : cas qui ne doivent pas matcher", () => {
120
+ it("ne matche pas si les deux côtés diffèrent de la base", () => {
121
+ const input = [
122
+ `<<<<<<< ours`,
123
+ ` level: "warn",`,
124
+ `||||||| base`,
125
+ ` level: "info",`,
126
+ `=======`,
127
+ ` level: "error",`,
128
+ `>>>>>>> theirs`,
129
+ ].join("\n");
130
+ const result = resolve(input, "src/test.ts");
131
+ expect(result.hunks[0].type).not.toBe("one_side_change");
132
+ });
133
+ it("ne matche pas si ours === theirs (same_change prioritaire)", () => {
134
+ const input = [
135
+ `<<<<<<< ours`,
136
+ ` timeout: 3000,`,
137
+ `||||||| base`,
138
+ ` timeout: 5000,`,
139
+ `=======`,
140
+ ` timeout: 3000,`,
141
+ `>>>>>>> theirs`,
142
+ ].join("\n");
143
+ // Les deux ont fait le même changement → same_change (prio 10)
144
+ const result = resolve(input, "src/test.ts");
145
+ expect(result.hunks[0].type).toBe("same_change");
146
+ });
147
+ it("ne matche pas sans base (diff2 uniquement)", () => {
148
+ // diff2 ne fournit pas de base → one_side_change ne peut pas s'appliquer
149
+ const input = [
150
+ `<<<<<<< ours`,
151
+ ` value: 1,`,
152
+ `=======`,
153
+ ` value: 1,`,
154
+ `>>>>>>> theirs`,
155
+ ].join("\n");
156
+ // same_change (prio 10) prend la main car ours === theirs
157
+ const result = resolve(input, "src/test.ts");
158
+ expect(result.hunks[0].type).toBe("same_change");
159
+ });
160
+ it("ne matche pas si les deux côtés ajoutent des lignes différentes (diff3)", () => {
161
+ const input = [
162
+ `<<<<<<< ours`,
163
+ ` foo,`,
164
+ ` bar,`,
165
+ ` addedByOurs,`,
166
+ `||||||| base`,
167
+ ` foo,`,
168
+ ` bar,`,
169
+ `=======`,
170
+ ` foo,`,
171
+ ` bar,`,
172
+ ` addedByTheirs,`,
173
+ `>>>>>>> theirs`,
174
+ ].join("\n");
175
+ const result = resolve(input, "src/test.ts");
176
+ expect(result.hunks[0].type).not.toBe("one_side_change");
177
+ });
178
+ it("ne matche pas si ours supprime et theirs modifie (les deux diffèrent de la base)", () => {
179
+ const input = [
180
+ `<<<<<<< ours`,
181
+ `||||||| base`,
182
+ ` oldValue: 42,`,
183
+ `=======`,
184
+ ` newValue: 99,`,
185
+ `>>>>>>> theirs`,
186
+ ].join("\n");
187
+ const result = resolve(input, "src/test.ts");
188
+ expect(result.hunks[0].type).not.toBe("one_side_change");
189
+ });
190
+ });
191
+ //# sourceMappingURL=one-side-change.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"one-side-change.test.js","sourceRoot":"","sources":["../../../src/__tests__/patterns/one-side-change.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tests du pattern same_change (priority 10)
3
+ *
4
+ * Détection : les deux côtés (ours et theirs) sont identiques.
5
+ * Compatible diff2 et diff3.
6
+ * Auto-résolu car les deux branches ont fait le même changement.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=same-change.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"same-change.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/patterns/same-change.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Tests du pattern same_change (priority 10)
3
+ *
4
+ * Détection : les deux côtés (ours et theirs) sont identiques.
5
+ * Compatible diff2 et diff3.
6
+ * Auto-résolu car les deux branches ont fait le même changement.
7
+ */
8
+ import { describe, it, expect } from "vitest";
9
+ import { resolve } from "../../resolver.js";
10
+ // ─── Cas qui doivent matcher same_change ─────────────────────
11
+ describe("same_change : les deux côtés sont identiques (diff2)", () => {
12
+ const input = [
13
+ `<<<<<<< ours`,
14
+ `const version = "2.0.0";`,
15
+ `=======`,
16
+ `const version = "2.0.0";`,
17
+ `>>>>>>> theirs`,
18
+ ].join("\n");
19
+ it("classifie en same_change", () => {
20
+ const result = resolve(input, "src/version.ts");
21
+ expect(result.hunks[0].type).toBe("same_change");
22
+ });
23
+ it("auto-résout (autoResolved === 1)", () => {
24
+ const result = resolve(input, "src/version.ts");
25
+ expect(result.stats.autoResolved).toBe(1);
26
+ });
27
+ it("le contenu résolu contient la ligne commune", () => {
28
+ const result = resolve(input, "src/version.ts");
29
+ expect(result.mergedContent).toContain('const version = "2.0.0"');
30
+ });
31
+ });
32
+ describe("same_change : les deux côtés sont identiques (diff3)", () => {
33
+ const input = [
34
+ `<<<<<<< ours`,
35
+ ` timeout: 3000,`,
36
+ `||||||| base`,
37
+ ` timeout: 5000,`,
38
+ `=======`,
39
+ ` timeout: 3000,`,
40
+ `>>>>>>> theirs`,
41
+ ].join("\n");
42
+ it("classifie en same_change", () => {
43
+ const result = resolve(input, "src/config.ts");
44
+ expect(result.hunks[0].type).toBe("same_change");
45
+ });
46
+ it("auto-résout", () => {
47
+ const result = resolve(input, "src/config.ts");
48
+ expect(result.stats.autoResolved).toBe(1);
49
+ });
50
+ });
51
+ describe("same_change : multi-lignes identiques des deux côtés (diff2)", () => {
52
+ const input = [
53
+ `<<<<<<< ours`,
54
+ `function greet(name: string) {`,
55
+ ` return \`Hello, \${name}!\`;`,
56
+ `}`,
57
+ `=======`,
58
+ `function greet(name: string) {`,
59
+ ` return \`Hello, \${name}!\`;`,
60
+ `}`,
61
+ `>>>>>>> theirs`,
62
+ ].join("\n");
63
+ it("classifie en same_change", () => {
64
+ const result = resolve(input, "src/utils.ts");
65
+ expect(result.hunks[0].type).toBe("same_change");
66
+ });
67
+ it("auto-résout", () => {
68
+ const result = resolve(input, "src/utils.ts");
69
+ expect(result.stats.autoResolved).toBe(1);
70
+ });
71
+ });
72
+ describe("same_change : suppression identique des deux côtés (diff2)", () => {
73
+ // Les deux côtés ont supprimé toutes les lignes (résultat vide)
74
+ const input = [
75
+ `<<<<<<< ours`,
76
+ `=======`,
77
+ `>>>>>>> theirs`,
78
+ ].join("\n");
79
+ it("classifie en same_change (suppression totale des deux côtés)", () => {
80
+ const result = resolve(input, "src/test.ts");
81
+ expect(result.hunks[0].type).toBe("same_change");
82
+ });
83
+ it("auto-résout", () => {
84
+ const result = resolve(input, "src/test.ts");
85
+ expect(result.stats.autoResolved).toBe(1);
86
+ });
87
+ });
88
+ describe("same_change : commentaire identique ajouté (diff3)", () => {
89
+ const input = [
90
+ `<<<<<<< ours`,
91
+ `// TODO: refactor this`,
92
+ `const x = 42;`,
93
+ `||||||| base`,
94
+ `const x = 42;`,
95
+ `=======`,
96
+ `// TODO: refactor this`,
97
+ `const x = 42;`,
98
+ `>>>>>>> theirs`,
99
+ ].join("\n");
100
+ it("classifie en same_change", () => {
101
+ const result = resolve(input, "src/test.ts");
102
+ expect(result.hunks[0].type).toBe("same_change");
103
+ });
104
+ it("auto-résout", () => {
105
+ const result = resolve(input, "src/test.ts");
106
+ expect(result.stats.autoResolved).toBe(1);
107
+ });
108
+ });
109
+ // ─── Cas qui ne doivent PAS matcher same_change ───────────────
110
+ describe("same_change : cas qui ne doivent pas matcher", () => {
111
+ it("ne matche pas si ours ≠ theirs (valeurs différentes)", () => {
112
+ const input = [
113
+ `<<<<<<< ours`,
114
+ `const x = 1;`,
115
+ `=======`,
116
+ `const x = 2;`,
117
+ `>>>>>>> theirs`,
118
+ ].join("\n");
119
+ const result = resolve(input, "src/test.ts");
120
+ expect(result.hunks[0].type).not.toBe("same_change");
121
+ });
122
+ it("ne matche pas si ours a une ligne supplémentaire", () => {
123
+ const input = [
124
+ `<<<<<<< ours`,
125
+ `const x = 1;`,
126
+ `const y = 2;`,
127
+ `=======`,
128
+ `const x = 1;`,
129
+ `>>>>>>> theirs`,
130
+ ].join("\n");
131
+ const result = resolve(input, "src/test.ts");
132
+ expect(result.hunks[0].type).not.toBe("same_change");
133
+ });
134
+ it("ne matche pas si theirs a une ligne supplémentaire", () => {
135
+ const input = [
136
+ `<<<<<<< ours`,
137
+ `foo`,
138
+ `=======`,
139
+ `foo`,
140
+ `bar`,
141
+ `>>>>>>> theirs`,
142
+ ].join("\n");
143
+ const result = resolve(input, "src/test.ts");
144
+ expect(result.hunks[0].type).not.toBe("same_change");
145
+ });
146
+ it("ne matche pas si un seul côté modifie (one_side_change)", () => {
147
+ const input = [
148
+ `<<<<<<< ours`,
149
+ ` retries: 3,`,
150
+ `||||||| base`,
151
+ ` retries: 3,`,
152
+ `=======`,
153
+ ` retries: 5,`,
154
+ `>>>>>>> theirs`,
155
+ ].join("\n");
156
+ const result = resolve(input, "src/test.ts");
157
+ expect(result.hunks[0].type).not.toBe("same_change");
158
+ });
159
+ it("ne matche pas si les lignes sont dans un ordre différent", () => {
160
+ const input = [
161
+ `<<<<<<< ours`,
162
+ `alpha`,
163
+ `beta`,
164
+ `=======`,
165
+ `beta`,
166
+ `alpha`,
167
+ `>>>>>>> theirs`,
168
+ ].join("\n");
169
+ const result = resolve(input, "src/test.ts");
170
+ expect(result.hunks[0].type).not.toBe("same_change");
171
+ });
172
+ });
173
+ //# sourceMappingURL=same-change.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"same-change.test.js","sourceRoot":"","sources":["../../../src/__tests__/patterns/same-change.test.ts"],"names":[],"mappings":"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"}