@gitwand/core 2.3.0 → 2.5.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 (136) hide show
  1. package/dist/__tests__/corpus.d.ts.map +1 -1
  2. package/dist/__tests__/corpus.js +377 -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/llm-proposed.test.d.ts +10 -0
  13. package/dist/__tests__/patterns/llm-proposed.test.d.ts.map +1 -0
  14. package/dist/__tests__/patterns/llm-proposed.test.js +306 -0
  15. package/dist/__tests__/patterns/llm-proposed.test.js.map +1 -0
  16. package/dist/__tests__/patterns/non-overlapping.test.d.ts +11 -0
  17. package/dist/__tests__/patterns/non-overlapping.test.d.ts.map +1 -0
  18. package/dist/__tests__/patterns/non-overlapping.test.js +240 -0
  19. package/dist/__tests__/patterns/non-overlapping.test.js.map +1 -0
  20. package/dist/__tests__/patterns/one-side-change.test.d.ts +10 -0
  21. package/dist/__tests__/patterns/one-side-change.test.d.ts.map +1 -0
  22. package/dist/__tests__/patterns/one-side-change.test.js +191 -0
  23. package/dist/__tests__/patterns/one-side-change.test.js.map +1 -0
  24. package/dist/__tests__/patterns/same-change.test.d.ts +9 -0
  25. package/dist/__tests__/patterns/same-change.test.d.ts.map +1 -0
  26. package/dist/__tests__/patterns/same-change.test.js +173 -0
  27. package/dist/__tests__/patterns/same-change.test.js.map +1 -0
  28. package/dist/__tests__/patterns/value-only-change.test.d.ts +11 -0
  29. package/dist/__tests__/patterns/value-only-change.test.d.ts.map +1 -0
  30. package/dist/__tests__/patterns/value-only-change.test.js +159 -0
  31. package/dist/__tests__/patterns/value-only-change.test.js.map +1 -0
  32. package/dist/__tests__/patterns/whitespace-only.test.d.ts +10 -0
  33. package/dist/__tests__/patterns/whitespace-only.test.d.ts.map +1 -0
  34. package/dist/__tests__/patterns/whitespace-only.test.js +177 -0
  35. package/dist/__tests__/patterns/whitespace-only.test.js.map +1 -0
  36. package/dist/__tests__/resolvers/css.test.d.ts +12 -0
  37. package/dist/__tests__/resolvers/css.test.d.ts.map +1 -0
  38. package/dist/__tests__/resolvers/css.test.js +171 -0
  39. package/dist/__tests__/resolvers/css.test.js.map +1 -0
  40. package/dist/__tests__/resolvers/imports.test.d.ts +12 -0
  41. package/dist/__tests__/resolvers/imports.test.d.ts.map +1 -0
  42. package/dist/__tests__/resolvers/imports.test.js +135 -0
  43. package/dist/__tests__/resolvers/imports.test.js.map +1 -0
  44. package/dist/__tests__/resolvers/json.test.d.ts +12 -0
  45. package/dist/__tests__/resolvers/json.test.d.ts.map +1 -0
  46. package/dist/__tests__/resolvers/json.test.js +184 -0
  47. package/dist/__tests__/resolvers/json.test.js.map +1 -0
  48. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts +12 -0
  49. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts.map +1 -0
  50. package/dist/__tests__/resolvers/lockfile-npm.test.js +187 -0
  51. package/dist/__tests__/resolvers/lockfile-npm.test.js.map +1 -0
  52. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts +12 -0
  53. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts.map +1 -0
  54. package/dist/__tests__/resolvers/lockfile-pnpm.test.js +175 -0
  55. package/dist/__tests__/resolvers/lockfile-pnpm.test.js.map +1 -0
  56. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts +12 -0
  57. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts.map +1 -0
  58. package/dist/__tests__/resolvers/lockfile-yarn.test.js +165 -0
  59. package/dist/__tests__/resolvers/lockfile-yarn.test.js.map +1 -0
  60. package/dist/__tests__/resolvers/markdown.test.d.ts +12 -0
  61. package/dist/__tests__/resolvers/markdown.test.d.ts.map +1 -0
  62. package/dist/__tests__/resolvers/markdown.test.js +188 -0
  63. package/dist/__tests__/resolvers/markdown.test.js.map +1 -0
  64. package/dist/__tests__/resolvers/vue.test.d.ts +12 -0
  65. package/dist/__tests__/resolvers/vue.test.d.ts.map +1 -0
  66. package/dist/__tests__/resolvers/vue.test.js +225 -0
  67. package/dist/__tests__/resolvers/vue.test.js.map +1 -0
  68. package/dist/__tests__/resolvers/yaml.test.d.ts +12 -0
  69. package/dist/__tests__/resolvers/yaml.test.d.ts.map +1 -0
  70. package/dist/__tests__/resolvers/yaml.test.js +203 -0
  71. package/dist/__tests__/resolvers/yaml.test.js.map +1 -0
  72. package/dist/__tests__/v2-core-scenarios.test.d.ts +35 -0
  73. package/dist/__tests__/v2-core-scenarios.test.d.ts.map +1 -0
  74. package/dist/__tests__/v2-core-scenarios.test.js +692 -0
  75. package/dist/__tests__/v2-core-scenarios.test.js.map +1 -0
  76. package/dist/__tests__/validation-parse-tree.test.d.ts +15 -0
  77. package/dist/__tests__/validation-parse-tree.test.d.ts.map +1 -0
  78. package/dist/__tests__/validation-parse-tree.test.js +243 -0
  79. package/dist/__tests__/validation-parse-tree.test.js.map +1 -0
  80. package/dist/classifier.d.ts.map +1 -1
  81. package/dist/classifier.js +3 -0
  82. package/dist/classifier.js.map +1 -1
  83. package/dist/config.d.ts +54 -0
  84. package/dist/config.d.ts.map +1 -1
  85. package/dist/config.js +42 -0
  86. package/dist/config.js.map +1 -1
  87. package/dist/diff/index.d.ts.map +1 -1
  88. package/dist/diff/index.js +1 -3
  89. package/dist/diff/index.js.map +1 -1
  90. package/dist/index.d.ts +3 -1
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +2 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/patterns/llm-proposed.d.ts +8 -0
  95. package/dist/patterns/llm-proposed.d.ts.map +1 -0
  96. package/dist/patterns/llm-proposed.js +66 -0
  97. package/dist/patterns/llm-proposed.js.map +1 -0
  98. package/dist/patterns/utils.d.ts +8 -7
  99. package/dist/patterns/utils.d.ts.map +1 -1
  100. package/dist/patterns/utils.js +13 -12
  101. package/dist/patterns/utils.js.map +1 -1
  102. package/dist/resolver/adapters/strict-node.d.ts +32 -0
  103. package/dist/resolver/adapters/strict-node.d.ts.map +1 -0
  104. package/dist/resolver/adapters/strict-node.js +117 -0
  105. package/dist/resolver/adapters/strict-node.js.map +1 -0
  106. package/dist/resolver/index.d.ts +20 -1
  107. package/dist/resolver/index.d.ts.map +1 -1
  108. package/dist/resolver/index.js +106 -5
  109. package/dist/resolver/index.js.map +1 -1
  110. package/dist/resolver/llm-pipeline.d.ts +33 -0
  111. package/dist/resolver/llm-pipeline.d.ts.map +1 -0
  112. package/dist/resolver/llm-pipeline.js +218 -0
  113. package/dist/resolver/llm-pipeline.js.map +1 -0
  114. package/dist/resolver/policy.d.ts.map +1 -1
  115. package/dist/resolver/policy.js +5 -0
  116. package/dist/resolver/policy.js.map +1 -1
  117. package/dist/resolver/validate-parse-tree.d.ts +52 -0
  118. package/dist/resolver/validate-parse-tree.d.ts.map +1 -0
  119. package/dist/resolver/validate-parse-tree.js +87 -0
  120. package/dist/resolver/validate-parse-tree.js.map +1 -0
  121. package/dist/resolver/validate-strict.d.ts +27 -0
  122. package/dist/resolver/validate-strict.d.ts.map +1 -0
  123. package/dist/resolver/validate-strict.js +41 -0
  124. package/dist/resolver/validate-strict.js.map +1 -0
  125. package/dist/resolver/validation.d.ts.map +1 -1
  126. package/dist/resolver/validation.js +15 -1
  127. package/dist/resolver/validation.js.map +1 -1
  128. package/dist/resolvers/dispatcher.d.ts.map +1 -1
  129. package/dist/resolvers/dispatcher.js.map +1 -1
  130. package/dist/resolvers/llm-fallback.d.ts +41 -0
  131. package/dist/resolvers/llm-fallback.d.ts.map +1 -0
  132. package/dist/resolvers/llm-fallback.js +231 -0
  133. package/dist/resolvers/llm-fallback.js.map +1 -0
  134. package/dist/types.d.ts +183 -4
  135. package/dist/types.d.ts.map +1 -1
  136. package/package.json +1 -1
@@ -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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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tests du pattern value_only_change (priority 60)
3
+ *
4
+ * Nécessite diff2 (sans base).
5
+ * Détection : même nombre de lignes ET detectValueOnlyChange() réussit —
6
+ * les lignes diffèrent uniquement sur des valeurs scalaires volatiles
7
+ * (version, hash, checksum, timestamp, UUID, integrity hash, etc.).
8
+ * Auto-résolu (prend theirs ou ours selon la politique).
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=value-only-change.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-only-change.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/patterns/value-only-change.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Tests du pattern value_only_change (priority 60)
3
+ *
4
+ * Nécessite diff2 (sans base).
5
+ * Détection : même nombre de lignes ET detectValueOnlyChange() réussit —
6
+ * les lignes diffèrent uniquement sur des valeurs scalaires volatiles
7
+ * (version, hash, checksum, timestamp, UUID, integrity hash, etc.).
8
+ * Auto-résolu (prend theirs ou ours selon la politique).
9
+ */
10
+ import { describe, it, expect } from "vitest";
11
+ import { resolve } from "../../resolver.js";
12
+ // ─── Cas qui doivent matcher value_only_change ───────────────
13
+ describe("value_only_change : numéros de version (diff2)", () => {
14
+ const input = [
15
+ `<<<<<<< ours`,
16
+ ` "version": "1.0.0"`,
17
+ `=======`,
18
+ ` "version": "2.0.0"`,
19
+ `>>>>>>> theirs`,
20
+ ].join("\n");
21
+ it("classifie en value_only_change", () => {
22
+ const result = resolve(input, "package.json");
23
+ expect(result.hunks[0].type).toBe("value_only_change");
24
+ });
25
+ it("auto-résout (autoResolved === 1)", () => {
26
+ const result = resolve(input, "package.json");
27
+ expect(result.stats.autoResolved).toBe(1);
28
+ });
29
+ });
30
+ describe("value_only_change : checksums différents (diff2)", () => {
31
+ const input = [
32
+ `<<<<<<< ours`,
33
+ `checksum = "abc123def456"`,
34
+ `=======`,
35
+ `checksum = "def456abc123"`,
36
+ `>>>>>>> theirs`,
37
+ ].join("\n");
38
+ it("classifie en value_only_change", () => {
39
+ const result = resolve(input, "Cargo.lock");
40
+ expect(result.hunks[0].type).toBe("value_only_change");
41
+ });
42
+ it("auto-résout", () => {
43
+ const result = resolve(input, "Cargo.lock");
44
+ expect(result.stats.autoResolved).toBe(1);
45
+ });
46
+ });
47
+ describe("value_only_change : integrity hash npm (diff2)", () => {
48
+ const input = [
49
+ `<<<<<<< ours`,
50
+ ` "integrity": "sha512-aaaaaaaaaaaaaaaa=="`,
51
+ `=======`,
52
+ ` "integrity": "sha512-bbbbbbbbbbbbbbbb=="`,
53
+ `>>>>>>> theirs`,
54
+ ].join("\n");
55
+ it("classifie en value_only_change", () => {
56
+ const result = resolve(input, "package-lock.json");
57
+ expect(result.hunks[0].type).toBe("value_only_change");
58
+ });
59
+ it("auto-résout", () => {
60
+ const result = resolve(input, "package-lock.json");
61
+ expect(result.stats.autoResolved).toBe(1);
62
+ });
63
+ });
64
+ describe("value_only_change : multiple lignes avec valeurs scalaires (diff2)", () => {
65
+ const input = [
66
+ `<<<<<<< ours`,
67
+ ` "version": "1.2.3",`,
68
+ ` "resolved": "https://registry.npmjs.org/pkg/-/pkg-1.2.3.tgz"`,
69
+ `=======`,
70
+ ` "version": "1.2.4",`,
71
+ ` "resolved": "https://registry.npmjs.org/pkg/-/pkg-1.2.4.tgz"`,
72
+ `>>>>>>> theirs`,
73
+ ].join("\n");
74
+ it("classifie en value_only_change", () => {
75
+ const result = resolve(input, "package-lock.json");
76
+ expect(result.hunks[0].type).toBe("value_only_change");
77
+ });
78
+ it("auto-résout", () => {
79
+ const result = resolve(input, "package-lock.json");
80
+ expect(result.stats.autoResolved).toBe(1);
81
+ });
82
+ });
83
+ describe("value_only_change : hash de commit (diff2)", () => {
84
+ const input = [
85
+ `<<<<<<< ours`,
86
+ ` source = "git+https://github.com/org/repo?rev=aabbccdd11223344"`,
87
+ `=======`,
88
+ ` source = "git+https://github.com/org/repo?rev=99887766aabbccdd"`,
89
+ `>>>>>>> theirs`,
90
+ ].join("\n");
91
+ it("classifie en value_only_change", () => {
92
+ const result = resolve(input, "Cargo.lock");
93
+ expect(result.hunks[0].type).toBe("value_only_change");
94
+ });
95
+ it("auto-résout", () => {
96
+ const result = resolve(input, "Cargo.lock");
97
+ expect(result.stats.autoResolved).toBe(1);
98
+ });
99
+ });
100
+ // ─── Cas qui ne doivent PAS matcher value_only_change ────────
101
+ describe("value_only_change : cas qui ne doivent pas matcher", () => {
102
+ it("ne matche pas si les noms de clés changent (pas seulement des valeurs)", () => {
103
+ const input = [
104
+ `<<<<<<< ours`,
105
+ ` "oldKey": "value",`,
106
+ `=======`,
107
+ ` "newKey": "value",`,
108
+ `>>>>>>> theirs`,
109
+ ].join("\n");
110
+ const result = resolve(input, "package.json");
111
+ expect(result.hunks[0].type).not.toBe("value_only_change");
112
+ });
113
+ it("ne matche pas si le nombre de lignes diffère", () => {
114
+ const input = [
115
+ `<<<<<<< ours`,
116
+ ` "version": "1.0.0",`,
117
+ ` "extra": "line",`,
118
+ `=======`,
119
+ ` "version": "2.0.0",`,
120
+ `>>>>>>> theirs`,
121
+ ].join("\n");
122
+ const result = resolve(input, "package.json");
123
+ expect(result.hunks[0].type).not.toBe("value_only_change");
124
+ });
125
+ it("ne matche pas si la structure du code change (pas juste des valeurs)", () => {
126
+ const input = [
127
+ `<<<<<<< ours`,
128
+ `const x = computeValue();`,
129
+ `=======`,
130
+ `const x = 42;`,
131
+ `>>>>>>> theirs`,
132
+ ].join("\n");
133
+ const result = resolve(input, "src/test.ts");
134
+ expect(result.hunks[0].type).not.toBe("value_only_change");
135
+ });
136
+ it("ne matche pas si les deux côtés sont identiques (same_change prioritaire)", () => {
137
+ const input = [
138
+ `<<<<<<< ours`,
139
+ ` "version": "1.0.0"`,
140
+ `=======`,
141
+ ` "version": "1.0.0"`,
142
+ `>>>>>>> theirs`,
143
+ ].join("\n");
144
+ const result = resolve(input, "package.json");
145
+ expect(result.hunks[0].type).toBe("same_change");
146
+ });
147
+ it("ne matche pas si les noms de fonctions changent", () => {
148
+ const input = [
149
+ `<<<<<<< ours`,
150
+ `function handleLogin() {`,
151
+ `=======`,
152
+ `function handleSignIn() {`,
153
+ `>>>>>>> theirs`,
154
+ ].join("\n");
155
+ const result = resolve(input, "src/auth.ts");
156
+ expect(result.hunks[0].type).not.toBe("value_only_change");
157
+ });
158
+ });
159
+ //# sourceMappingURL=value-only-change.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-only-change.test.js","sourceRoot":"","sources":["../../../src/__tests__/patterns/value-only-change.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tests du pattern whitespace_only (priority 50)
3
+ *
4
+ * Compatible diff2 et diff3.
5
+ * Détection : après normalisation (trim de chaque ligne), ours et theirs
6
+ * sont identiques — même code mais indentation ou espacement différent.
7
+ * Auto-résolu (prend ours ou theirs selon la politique).
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=whitespace-only.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whitespace-only.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/patterns/whitespace-only.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}