@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,177 @@
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
+ import { describe, it, expect } from "vitest";
10
+ import { resolve } from "../../resolver.js";
11
+ // ─── Cas qui doivent matcher whitespace_only ─────────────────
12
+ describe("whitespace_only : indentation différente (diff2)", () => {
13
+ const input = [
14
+ `<<<<<<< ours`,
15
+ ` const x = 42;`,
16
+ ` return x;`,
17
+ `=======`,
18
+ ` const x = 42;`,
19
+ ` return x;`,
20
+ `>>>>>>> theirs`,
21
+ ].join("\n");
22
+ it("classifie en whitespace_only", () => {
23
+ const result = resolve(input, "src/utils.ts");
24
+ expect(result.hunks[0].type).toBe("whitespace_only");
25
+ });
26
+ it("auto-résout (autoResolved === 1)", () => {
27
+ const result = resolve(input, "src/utils.ts");
28
+ expect(result.stats.autoResolved).toBe(1);
29
+ });
30
+ });
31
+ describe("whitespace_only : tabs vs spaces (diff2)", () => {
32
+ const input = [
33
+ `<<<<<<< ours`,
34
+ `\tfunction hello() {`,
35
+ `\t\treturn "world";`,
36
+ `\t}`,
37
+ `=======`,
38
+ `function hello() {`,
39
+ ` return "world";`,
40
+ `}`,
41
+ `>>>>>>> theirs`,
42
+ ].join("\n");
43
+ it("classifie en whitespace_only", () => {
44
+ const result = resolve(input, "src/hello.ts");
45
+ expect(result.hunks[0].type).toBe("whitespace_only");
46
+ });
47
+ it("auto-résout", () => {
48
+ const result = resolve(input, "src/hello.ts");
49
+ expect(result.stats.autoResolved).toBe(1);
50
+ });
51
+ });
52
+ describe("whitespace_only : espaces de fin de ligne (diff2)", () => {
53
+ const input = [
54
+ `<<<<<<< ours`,
55
+ `const a = 1; `,
56
+ `const b = 2;`,
57
+ `=======`,
58
+ `const a = 1;`,
59
+ `const b = 2; `,
60
+ `>>>>>>> theirs`,
61
+ ].join("\n");
62
+ it("classifie en whitespace_only", () => {
63
+ const result = resolve(input, "src/vars.ts");
64
+ expect(result.hunks[0].type).toBe("whitespace_only");
65
+ });
66
+ it("auto-résout", () => {
67
+ const result = resolve(input, "src/vars.ts");
68
+ expect(result.stats.autoResolved).toBe(1);
69
+ });
70
+ });
71
+ describe("whitespace_only : indentation modifiée avec base (diff3)", () => {
72
+ const input = [
73
+ `<<<<<<< ours`,
74
+ ` if (condition) {`,
75
+ ` doSomething();`,
76
+ ` }`,
77
+ `||||||| base`,
78
+ ` if (condition) {`,
79
+ ` doSomething();`,
80
+ ` }`,
81
+ `=======`,
82
+ ` if (condition) {`,
83
+ ` doSomething();`,
84
+ ` }`,
85
+ `>>>>>>> theirs`,
86
+ ].join("\n");
87
+ it("classifie en whitespace_only", () => {
88
+ const result = resolve(input, "src/logic.ts");
89
+ expect(result.hunks[0].type).toBe("whitespace_only");
90
+ });
91
+ it("auto-résout", () => {
92
+ const result = resolve(input, "src/logic.ts");
93
+ expect(result.stats.autoResolved).toBe(1);
94
+ });
95
+ });
96
+ describe("whitespace_only : reformatage JSON (diff2)", () => {
97
+ const input = [
98
+ `<<<<<<< ours`,
99
+ ` "name": "gitwand",`,
100
+ ` "version": "1.0.0"`,
101
+ `=======`,
102
+ ` "name": "gitwand",`,
103
+ ` "version": "1.0.0"`,
104
+ `>>>>>>> theirs`,
105
+ ].join("\n");
106
+ it("classifie en whitespace_only", () => {
107
+ const result = resolve(input, "package.json");
108
+ expect(result.hunks[0].type).toBe("whitespace_only");
109
+ });
110
+ it("auto-résout", () => {
111
+ const result = resolve(input, "package.json");
112
+ expect(result.stats.autoResolved).toBe(1);
113
+ });
114
+ });
115
+ // ─── Cas qui ne doivent PAS matcher whitespace_only ──────────
116
+ describe("whitespace_only : cas qui ne doivent pas matcher", () => {
117
+ it("ne matche pas si les contenus diffèrent après trim", () => {
118
+ const input = [
119
+ `<<<<<<< ours`,
120
+ ` const x = 42;`,
121
+ `=======`,
122
+ ` const x = 99;`,
123
+ `>>>>>>> theirs`,
124
+ ].join("\n");
125
+ const result = resolve(input, "src/test.ts");
126
+ expect(result.hunks[0].type).not.toBe("whitespace_only");
127
+ });
128
+ it("ne matche pas si une ligne est ajoutée (nombre de lignes différent)", () => {
129
+ const input = [
130
+ `<<<<<<< ours`,
131
+ ` const a = 1;`,
132
+ ` const b = 2;`,
133
+ `=======`,
134
+ ` const a = 1;`,
135
+ `>>>>>>> theirs`,
136
+ ].join("\n");
137
+ const result = resolve(input, "src/test.ts");
138
+ expect(result.hunks[0].type).not.toBe("whitespace_only");
139
+ });
140
+ it("ne matche pas si les variables ont des noms différents", () => {
141
+ const input = [
142
+ `<<<<<<< ours`,
143
+ ` const foo = bar;`,
144
+ `=======`,
145
+ ` const baz = bar;`,
146
+ `>>>>>>> theirs`,
147
+ ].join("\n");
148
+ const result = resolve(input, "src/test.ts");
149
+ expect(result.hunks[0].type).not.toBe("whitespace_only");
150
+ });
151
+ it("ne matche pas si seul l'ordre des lignes change (reorder_only le capte)", () => {
152
+ const input = [
153
+ `<<<<<<< ours`,
154
+ `alpha`,
155
+ `beta`,
156
+ `=======`,
157
+ `beta`,
158
+ `alpha`,
159
+ `>>>>>>> theirs`,
160
+ ].join("\n");
161
+ const result = resolve(input, "src/test.ts");
162
+ expect(result.hunks[0].type).not.toBe("whitespace_only");
163
+ });
164
+ it("ne matche pas si les deux côtés sont identiques (same_change prioritaire)", () => {
165
+ const input = [
166
+ `<<<<<<< ours`,
167
+ ` const x = 1;`,
168
+ `=======`,
169
+ ` const x = 1;`,
170
+ `>>>>>>> theirs`,
171
+ ].join("\n");
172
+ // same_change (prio 10) prend la main
173
+ const result = resolve(input, "src/test.ts");
174
+ expect(result.hunks[0].type).toBe("same_change");
175
+ });
176
+ });
177
+ //# sourceMappingURL=whitespace-only.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whitespace-only.test.js","sourceRoot":"","sources":["../../../src/__tests__/patterns/whitespace-only.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests du resolver CSS/SCSS/Less (GitWand)
3
+ *
4
+ * Fixtures :
5
+ * F1 — règle ajoutée d'un seul côté
6
+ * F2 — même règle, propriétés différentes → conflit partiel
7
+ * F3 — CSS minimal (1 règle)
8
+ * F4 — conflit dans .btn avec couleurs différentes
9
+ * F5 — SCSS avec variable modifiée
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=css.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/css.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Tests du resolver CSS/SCSS/Less (GitWand)
3
+ *
4
+ * Fixtures :
5
+ * F1 — règle ajoutée d'un seul côté
6
+ * F2 — même règle, propriétés différentes → conflit partiel
7
+ * F3 — CSS minimal (1 règle)
8
+ * F4 — conflit dans .btn avec couleurs différentes
9
+ * F5 — SCSS avec variable modifiée
10
+ */
11
+ import { describe, it, expect } from "vitest";
12
+ import { resolve } from "../../resolver.js";
13
+ // ─── F1 — règle ajoutée d'un seul côté ───────────────────────────────────────
14
+ describe("F1 — CSS : règle ajoutée d'un seul côté (diff3)", () => {
15
+ const input = [
16
+ `<<<<<<< ours`,
17
+ `.container {`,
18
+ ` display: flex;`,
19
+ ` padding: 16px;`,
20
+ `}`,
21
+ ``,
22
+ `.header {`,
23
+ ` background-color: #fff;`,
24
+ ` height: 60px;`,
25
+ `}`,
26
+ `||||||| base`,
27
+ `.container {`,
28
+ ` display: flex;`,
29
+ ` padding: 16px;`,
30
+ `}`,
31
+ `=======`,
32
+ `.container {`,
33
+ ` display: flex;`,
34
+ ` padding: 16px;`,
35
+ `}`,
36
+ `>>>>>>> theirs`,
37
+ ].join("\n");
38
+ it("auto-résout via le resolver css", () => {
39
+ const result = resolve(input, "styles.css");
40
+ expect(result.stats.autoResolved).toBe(1);
41
+ });
42
+ it("le résultat contient la règle ajoutée", () => {
43
+ const result = resolve(input, "styles.css");
44
+ expect(result.mergedContent).toContain(".header");
45
+ });
46
+ it("la raison mentionne [css]", () => {
47
+ const result = resolve(input, "styles.css");
48
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[css\]/i);
49
+ });
50
+ });
51
+ // ─── F2 — même règle, propriétés différentes ─────────────────────────────────
52
+ describe("F2 — CSS : même règle, valeurs différentes des deux côtés (diff3)", () => {
53
+ const input = [
54
+ `<<<<<<< ours`,
55
+ `.container {`,
56
+ ` max-width: 1200px;`,
57
+ ` padding: 24px;`,
58
+ `}`,
59
+ `||||||| base`,
60
+ `.container {`,
61
+ ` max-width: 960px;`,
62
+ ` padding: 16px;`,
63
+ `}`,
64
+ `=======`,
65
+ `.container {`,
66
+ ` max-width: 1440px;`,
67
+ ` padding: 32px;`,
68
+ `}`,
69
+ `>>>>>>> theirs`,
70
+ ].join("\n");
71
+ it("ne lève pas d'exception", () => {
72
+ expect(() => resolve(input, "styles.css")).not.toThrow();
73
+ });
74
+ it("la raison mentionne [css]", () => {
75
+ const result = resolve(input, "styles.css");
76
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[css\]/i);
77
+ });
78
+ });
79
+ // ─── F3 — CSS minimal ────────────────────────────────────────────────────────
80
+ describe("F3 — CSS minimal : ne plante pas", () => {
81
+ const input = [
82
+ `<<<<<<< ours`,
83
+ `body { margin: 0; }`,
84
+ `||||||| base`,
85
+ `body { margin: 8px; }`,
86
+ `=======`,
87
+ `body { margin: 0; padding: 0; }`,
88
+ `>>>>>>> theirs`,
89
+ ].join("\n");
90
+ it("ne lève pas d'exception", () => {
91
+ expect(() => resolve(input, "minimal.css")).not.toThrow();
92
+ });
93
+ it("produit un résultat avec au moins un hunk", () => {
94
+ const result = resolve(input, "minimal.css");
95
+ expect(result.hunks.length).toBeGreaterThanOrEqual(1);
96
+ });
97
+ });
98
+ // ─── F4 — conflit dans .btn avec couleurs différentes ────────────────────────
99
+ describe("F4 — CSS : .btn avec ajout de règles indépendantes (diff3)", () => {
100
+ const input = [
101
+ `<<<<<<< ours`,
102
+ `.btn {`,
103
+ ` display: inline-flex;`,
104
+ ` padding: 8px 16px;`,
105
+ ` border-radius: 4px;`,
106
+ ` font-weight: 600;`,
107
+ `}`,
108
+ ``,
109
+ `.btn-primary {`,
110
+ ` background-color: #3b82f6;`,
111
+ ` color: #fff;`,
112
+ `}`,
113
+ `||||||| base`,
114
+ `.btn {`,
115
+ ` display: inline-flex;`,
116
+ ` padding: 8px 16px;`,
117
+ ` border-radius: 4px;`,
118
+ `}`,
119
+ `=======`,
120
+ `.btn {`,
121
+ ` display: inline-flex;`,
122
+ ` padding: 8px 16px;`,
123
+ ` border-radius: 4px;`,
124
+ `}`,
125
+ ``,
126
+ `.btn-danger {`,
127
+ ` background-color: #ef4444;`,
128
+ ` color: #fff;`,
129
+ `}`,
130
+ `>>>>>>> theirs`,
131
+ ].join("\n");
132
+ it("ne lève pas d'exception", () => {
133
+ expect(() => resolve(input, "buttons.css")).not.toThrow();
134
+ });
135
+ it("la raison mentionne [css]", () => {
136
+ const result = resolve(input, "buttons.css");
137
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[css\]/i);
138
+ });
139
+ });
140
+ // ─── F5 — SCSS avec variable modifiée ────────────────────────────────────────
141
+ describe("F5 — SCSS : variable ajoutée d'un seul côté (diff3)", () => {
142
+ const input = [
143
+ `<<<<<<< ours`,
144
+ `$primary-color: #3b82f6;`,
145
+ `$secondary-color: #6b7280;`,
146
+ `$font-size-base: 16px;`,
147
+ `$border-radius: 4px;`,
148
+ `||||||| base`,
149
+ `$primary-color: #3b82f6;`,
150
+ `$secondary-color: #6b7280;`,
151
+ `$font-size-base: 16px;`,
152
+ `=======`,
153
+ `$primary-color: #3b82f6;`,
154
+ `$secondary-color: #6b7280;`,
155
+ `$font-size-base: 16px;`,
156
+ `>>>>>>> theirs`,
157
+ ].join("\n");
158
+ it("auto-résout via le resolver css", () => {
159
+ const result = resolve(input, "app.scss");
160
+ expect(result.stats.autoResolved).toBe(1);
161
+ });
162
+ it("le résultat contient la variable ajoutée", () => {
163
+ const result = resolve(input, "app.scss");
164
+ expect(result.mergedContent).toContain("border-radius");
165
+ });
166
+ it("la raison mentionne [css]", () => {
167
+ const result = resolve(input, "app.scss");
168
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[css\]/i);
169
+ });
170
+ });
171
+ //# sourceMappingURL=css.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/css.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests du resolver imports ES/TS (GitWand)
3
+ *
4
+ * Fixtures :
5
+ * F1 — import ajouté d'un seul côté
6
+ * F2 — même module importé différemment des deux côtés → conflit non résolvable
7
+ * F3 — imports vides (bloc vide)
8
+ * F4 — TypeScript avec `import type`
9
+ * F5 — re-exports `export { X } from 'y'`
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=imports.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/imports.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Tests du resolver imports ES/TS (GitWand)
3
+ *
4
+ * Fixtures :
5
+ * F1 — import ajouté d'un seul côté
6
+ * F2 — même module importé différemment des deux côtés → conflit non résolvable
7
+ * F3 — imports vides (bloc vide)
8
+ * F4 — TypeScript avec `import type`
9
+ * F5 — re-exports `export { X } from 'y'`
10
+ */
11
+ import { describe, it, expect } from "vitest";
12
+ import { resolve } from "../../resolver.js";
13
+ // ─── F1 — import ajouté d'un seul côté ───────────────────────────────────────
14
+ describe("F1 — imports : import ajouté d'un seul côté (diff3)", () => {
15
+ const input = [
16
+ `<<<<<<< ours`,
17
+ `import { ref } from 'vue';`,
18
+ `import { computed } from 'vue';`,
19
+ `import { useRouter } from 'vue-router';`,
20
+ `||||||| base`,
21
+ `import { ref } from 'vue';`,
22
+ `import { computed } from 'vue';`,
23
+ `=======`,
24
+ `import { ref } from 'vue';`,
25
+ `import { computed } from 'vue';`,
26
+ `>>>>>>> theirs`,
27
+ ].join("\n");
28
+ it("auto-résout via le resolver imports", () => {
29
+ const result = resolve(input, "composable.ts");
30
+ expect(result.stats.autoResolved).toBe(1);
31
+ });
32
+ it("les deux imports sont présents dans le merge", () => {
33
+ const result = resolve(input, "composable.ts");
34
+ expect(result.mergedContent).toContain("useRouter");
35
+ expect(result.mergedContent).toContain("computed");
36
+ expect(result.mergedContent).toContain("ref");
37
+ });
38
+ it("la raison mentionne [imports]", () => {
39
+ const result = resolve(input, "composable.ts");
40
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[imports\]/i);
41
+ });
42
+ });
43
+ // ─── F2 — même module importé différemment des deux côtés ────────────────────
44
+ describe("F2 — imports : même module importé différemment des deux côtés (diff3)", () => {
45
+ const input = [
46
+ `<<<<<<< ours`,
47
+ `import { ref, computed, watch } from 'vue';`,
48
+ `||||||| base`,
49
+ `import { ref } from 'vue';`,
50
+ `=======`,
51
+ `import { ref, reactive, toRefs } from 'vue';`,
52
+ `>>>>>>> theirs`,
53
+ ].join("\n");
54
+ it("ne lève pas d'exception", () => {
55
+ expect(() => resolve(input, "store.ts")).not.toThrow();
56
+ });
57
+ it("la raison mentionne [imports]", () => {
58
+ const result = resolve(input, "store.ts");
59
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[imports\]/i);
60
+ });
61
+ });
62
+ // ─── F3 — imports vides ───────────────────────────────────────────────────────
63
+ describe("F3 — imports vides : ne plante pas", () => {
64
+ const input = [
65
+ `<<<<<<< ours`,
66
+ `import {} from 'vue';`,
67
+ `=======`,
68
+ `import {} from 'vue';`,
69
+ `>>>>>>> theirs`,
70
+ ].join("\n");
71
+ it("ne lève pas d'exception", () => {
72
+ expect(() => resolve(input, "empty.ts")).not.toThrow();
73
+ });
74
+ it("produit un résultat avec au moins un hunk", () => {
75
+ const result = resolve(input, "empty.ts");
76
+ expect(result.hunks.length).toBeGreaterThanOrEqual(1);
77
+ });
78
+ });
79
+ // ─── F4 — TypeScript avec import type ────────────────────────────────────────
80
+ describe("F4 — imports : TypeScript avec `import type` (diff3)", () => {
81
+ const input = [
82
+ `<<<<<<< ours`,
83
+ `import type { Ref } from 'vue';`,
84
+ `import type { Router } from 'vue-router';`,
85
+ `import type { GitWandOptions } from '@gitwand/core';`,
86
+ `||||||| base`,
87
+ `import type { Ref } from 'vue';`,
88
+ `import type { Router } from 'vue-router';`,
89
+ `=======`,
90
+ `import type { Ref } from 'vue';`,
91
+ `import type { Router } from 'vue-router';`,
92
+ `>>>>>>> theirs`,
93
+ ].join("\n");
94
+ it("auto-résout via le resolver imports", () => {
95
+ const result = resolve(input, "types.ts");
96
+ expect(result.stats.autoResolved).toBe(1);
97
+ });
98
+ it("le résultat contient l'import type ajouté", () => {
99
+ const result = resolve(input, "types.ts");
100
+ expect(result.mergedContent).toContain("GitWandOptions");
101
+ expect(result.mergedContent).toContain("import type");
102
+ });
103
+ it("la raison mentionne [imports]", () => {
104
+ const result = resolve(input, "types.ts");
105
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[imports\]/i);
106
+ });
107
+ });
108
+ // ─── F5 — re-exports ──────────────────────────────────────────────────────────
109
+ // F5 — imports de deux modules différents ajoutés des deux côtés (diff2)
110
+ // En diff2, insertion_at_boundary n'a pas accès à la base → le resolver imports
111
+ // est sollicité pour la fusion sémantique.
112
+ describe("F5 — imports : deux modules différents ajoutés (diff2)", () => {
113
+ const input = [
114
+ `<<<<<<< ours`,
115
+ `import { useRouter } from 'vue-router';`,
116
+ `import { ref } from 'vue';`,
117
+ `import { useI18n } from './composables/useI18n';`,
118
+ `=======`,
119
+ `import { useRouter } from 'vue-router';`,
120
+ `import { ref } from 'vue';`,
121
+ `import { useTheme } from './composables/useTheme';`,
122
+ `>>>>>>> theirs`,
123
+ ].join("\n");
124
+ it("auto-résout", () => {
125
+ const result = resolve(input, "src/App.ts");
126
+ expect(result.stats.autoResolved).toBe(1);
127
+ });
128
+ it("le résultat contient les imports des deux côtés", () => {
129
+ const result = resolve(input, "src/App.ts");
130
+ expect(result.mergedContent).toContain("useI18n");
131
+ expect(result.mergedContent).toContain("useTheme");
132
+ expect(result.mergedContent).toContain("useRouter");
133
+ });
134
+ });
135
+ //# sourceMappingURL=imports.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/imports.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests du resolver JSON/JSONC (GitWand)
3
+ *
4
+ * Fixtures :
5
+ * F1 — clé ajoutée d'un seul côté
6
+ * F2 — même clé modifiée des deux côtés → conflit non résolvable
7
+ * F3 — JSON vide/minimal {}
8
+ * F4 — conflit dans package.json scripts
9
+ * F5 — conflit dans tsconfig.json compilerOptions
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=json.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/json.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}