@gitwand/core 2.2.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 (186) 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__/structural/grandeur-nature.test.d.ts +31 -0
  69. package/dist/__tests__/structural/grandeur-nature.test.d.ts.map +1 -0
  70. package/dist/__tests__/structural/grandeur-nature.test.js +264 -0
  71. package/dist/__tests__/structural/grandeur-nature.test.js.map +1 -0
  72. package/dist/__tests__/structural/languages.test.d.ts +5 -0
  73. package/dist/__tests__/structural/languages.test.d.ts.map +1 -0
  74. package/dist/__tests__/structural/languages.test.js +74 -0
  75. package/dist/__tests__/structural/languages.test.js.map +1 -0
  76. package/dist/__tests__/structural/matching.test.d.ts +6 -0
  77. package/dist/__tests__/structural/matching.test.d.ts.map +1 -0
  78. package/dist/__tests__/structural/matching.test.js +113 -0
  79. package/dist/__tests__/structural/matching.test.js.map +1 -0
  80. package/dist/__tests__/structural/merge.test.d.ts +6 -0
  81. package/dist/__tests__/structural/merge.test.d.ts.map +1 -0
  82. package/dist/__tests__/structural/merge.test.js +117 -0
  83. package/dist/__tests__/structural/merge.test.js.map +1 -0
  84. package/dist/__tests__/structural/reconstruct.test.d.ts +6 -0
  85. package/dist/__tests__/structural/reconstruct.test.d.ts.map +1 -0
  86. package/dist/__tests__/structural/reconstruct.test.js +104 -0
  87. package/dist/__tests__/structural/reconstruct.test.js.map +1 -0
  88. package/dist/__tests__/structural/structural-index.test.d.ts +14 -0
  89. package/dist/__tests__/structural/structural-index.test.d.ts.map +1 -0
  90. package/dist/__tests__/structural/structural-index.test.js +108 -0
  91. package/dist/__tests__/structural/structural-index.test.js.map +1 -0
  92. package/dist/__tests__/v2-core-scenarios.test.d.ts +35 -0
  93. package/dist/__tests__/v2-core-scenarios.test.d.ts.map +1 -0
  94. package/dist/__tests__/v2-core-scenarios.test.js +692 -0
  95. package/dist/__tests__/v2-core-scenarios.test.js.map +1 -0
  96. package/dist/__tests__/validation-parse-tree.test.d.ts +15 -0
  97. package/dist/__tests__/validation-parse-tree.test.d.ts.map +1 -0
  98. package/dist/__tests__/validation-parse-tree.test.js +243 -0
  99. package/dist/__tests__/validation-parse-tree.test.js.map +1 -0
  100. package/dist/config.d.ts +25 -0
  101. package/dist/config.d.ts.map +1 -1
  102. package/dist/config.js +17 -0
  103. package/dist/config.js.map +1 -1
  104. package/dist/diff/index.d.ts.map +1 -1
  105. package/dist/diff/index.js +1 -3
  106. package/dist/diff/index.js.map +1 -1
  107. package/dist/index.d.ts +5 -1
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +5 -1
  110. package/dist/index.js.map +1 -1
  111. package/dist/patterns/utils.d.ts +8 -7
  112. package/dist/patterns/utils.d.ts.map +1 -1
  113. package/dist/patterns/utils.js +13 -12
  114. package/dist/patterns/utils.js.map +1 -1
  115. package/dist/resolver/adapters/strict-node.d.ts +32 -0
  116. package/dist/resolver/adapters/strict-node.d.ts.map +1 -0
  117. package/dist/resolver/adapters/strict-node.js +117 -0
  118. package/dist/resolver/adapters/strict-node.js.map +1 -0
  119. package/dist/resolver/index.d.ts +33 -0
  120. package/dist/resolver/index.d.ts.map +1 -1
  121. package/dist/resolver/index.js +113 -0
  122. package/dist/resolver/index.js.map +1 -1
  123. package/dist/resolver/policy.d.ts.map +1 -1
  124. package/dist/resolver/policy.js +3 -0
  125. package/dist/resolver/policy.js.map +1 -1
  126. package/dist/resolver/validate-parse-tree.d.ts +52 -0
  127. package/dist/resolver/validate-parse-tree.d.ts.map +1 -0
  128. package/dist/resolver/validate-parse-tree.js +87 -0
  129. package/dist/resolver/validate-parse-tree.js.map +1 -0
  130. package/dist/resolver/validate-strict.d.ts +27 -0
  131. package/dist/resolver/validate-strict.d.ts.map +1 -0
  132. package/dist/resolver/validate-strict.js +41 -0
  133. package/dist/resolver/validate-strict.js.map +1 -0
  134. package/dist/resolver/validation.d.ts.map +1 -1
  135. package/dist/resolver/validation.js +15 -1
  136. package/dist/resolver/validation.js.map +1 -1
  137. package/dist/resolvers/dispatcher.d.ts +17 -1
  138. package/dist/resolvers/dispatcher.d.ts.map +1 -1
  139. package/dist/resolvers/dispatcher.js.map +1 -1
  140. package/dist/structural/entities.d.ts +44 -0
  141. package/dist/structural/entities.d.ts.map +1 -0
  142. package/dist/structural/entities.js +315 -0
  143. package/dist/structural/entities.js.map +1 -0
  144. package/dist/structural/index.d.ts +48 -0
  145. package/dist/structural/index.d.ts.map +1 -0
  146. package/dist/structural/index.js +177 -0
  147. package/dist/structural/index.js.map +1 -0
  148. package/dist/structural/matching.d.ts +46 -0
  149. package/dist/structural/matching.d.ts.map +1 -0
  150. package/dist/structural/matching.js +83 -0
  151. package/dist/structural/matching.js.map +1 -0
  152. package/dist/structural/merge.d.ts +45 -0
  153. package/dist/structural/merge.d.ts.map +1 -0
  154. package/dist/structural/merge.js +127 -0
  155. package/dist/structural/merge.js.map +1 -0
  156. package/dist/structural/parsers/adapters/browser.d.ts +22 -0
  157. package/dist/structural/parsers/adapters/browser.d.ts.map +1 -0
  158. package/dist/structural/parsers/adapters/browser.js +27 -0
  159. package/dist/structural/parsers/adapters/browser.js.map +1 -0
  160. package/dist/structural/parsers/adapters/node.d.ts +18 -0
  161. package/dist/structural/parsers/adapters/node.d.ts.map +1 -0
  162. package/dist/structural/parsers/adapters/node.js +42 -0
  163. package/dist/structural/parsers/adapters/node.js.map +1 -0
  164. package/dist/structural/parsers/adapters/tauri.d.ts +26 -0
  165. package/dist/structural/parsers/adapters/tauri.d.ts.map +1 -0
  166. package/dist/structural/parsers/adapters/tauri.js +34 -0
  167. package/dist/structural/parsers/adapters/tauri.js.map +1 -0
  168. package/dist/structural/parsers/grammars/languages.d.ts +32 -0
  169. package/dist/structural/parsers/grammars/languages.d.ts.map +1 -0
  170. package/dist/structural/parsers/grammars/languages.js +73 -0
  171. package/dist/structural/parsers/grammars/languages.js.map +1 -0
  172. package/dist/structural/parsers/grammars/ts.d.ts +26 -0
  173. package/dist/structural/parsers/grammars/ts.d.ts.map +1 -0
  174. package/dist/structural/parsers/grammars/ts.js +46 -0
  175. package/dist/structural/parsers/grammars/ts.js.map +1 -0
  176. package/dist/structural/parsers/loader.d.ts +74 -0
  177. package/dist/structural/parsers/loader.d.ts.map +1 -0
  178. package/dist/structural/parsers/loader.js +181 -0
  179. package/dist/structural/parsers/loader.js.map +1 -0
  180. package/dist/structural/reconstruct.d.ts +28 -0
  181. package/dist/structural/reconstruct.d.ts.map +1 -0
  182. package/dist/structural/reconstruct.js +63 -0
  183. package/dist/structural/reconstruct.js.map +1 -0
  184. package/dist/types.d.ts +60 -3
  185. package/dist/types.d.ts.map +1 -1
  186. package/package.json +16 -2
@@ -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"}
@@ -0,0 +1,184 @@
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
+ import { describe, it, expect } from "vitest";
12
+ import { resolve } from "../../resolver.js";
13
+ // ─── F1 — clé ajoutée d'un seul côté ─────────────────────────────────────────
14
+ describe("F1 — JSON : clé ajoutée d'un seul côté (diff3)", () => {
15
+ const input = [
16
+ `<<<<<<< ours`,
17
+ `{`,
18
+ ` "name": "my-app",`,
19
+ ` "version": "1.0.0",`,
20
+ ` "description": "A test app"`,
21
+ `}`,
22
+ `||||||| base`,
23
+ `{`,
24
+ ` "name": "my-app",`,
25
+ ` "version": "1.0.0"`,
26
+ `}`,
27
+ `=======`,
28
+ `{`,
29
+ ` "name": "my-app",`,
30
+ ` "version": "1.0.0"`,
31
+ `}`,
32
+ `>>>>>>> theirs`,
33
+ ].join("\n");
34
+ it("auto-résout via le resolver json", () => {
35
+ const result = resolve(input, "package.json");
36
+ expect(result.stats.autoResolved).toBe(1);
37
+ });
38
+ it("le résultat contient la clé ajoutée", () => {
39
+ const result = resolve(input, "package.json");
40
+ expect(result.mergedContent).toContain("description");
41
+ });
42
+ it("la raison mentionne [json]", () => {
43
+ const result = resolve(input, "package.json");
44
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[json\]/i);
45
+ });
46
+ });
47
+ // ─── F2 — même clé modifiée des deux côtés ────────────────────────────────────
48
+ describe("F2 — JSON : même clé modifiée des deux côtés → conflit non résolvable", () => {
49
+ const input = [
50
+ `<<<<<<< ours`,
51
+ `{`,
52
+ ` "name": "my-app",`,
53
+ ` "version": "2.0.0"`,
54
+ `}`,
55
+ `||||||| base`,
56
+ `{`,
57
+ ` "name": "my-app",`,
58
+ ` "version": "1.0.0"`,
59
+ `}`,
60
+ `=======`,
61
+ `{`,
62
+ ` "name": "my-app",`,
63
+ ` "version": "3.0.0"`,
64
+ `}`,
65
+ `>>>>>>> theirs`,
66
+ ].join("\n");
67
+ it("ne lève pas d'exception", () => {
68
+ expect(() => resolve(input, "package.json")).not.toThrow();
69
+ });
70
+ it("la raison mentionne [json]", () => {
71
+ const result = resolve(input, "package.json");
72
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[json\]/i);
73
+ });
74
+ });
75
+ // ─── F3 — JSON vide / minimal ─────────────────────────────────────────────────
76
+ describe("F3 — JSON minimal {} : ne plante pas", () => {
77
+ const input = [
78
+ `<<<<<<< ours`,
79
+ `{}`,
80
+ `||||||| base`,
81
+ `{}`,
82
+ `=======`,
83
+ `{}`,
84
+ `>>>>>>> theirs`,
85
+ ].join("\n");
86
+ it("ne lève pas d'exception", () => {
87
+ expect(() => resolve(input, "empty.json")).not.toThrow();
88
+ });
89
+ it("produit un résultat avec au moins un hunk", () => {
90
+ const result = resolve(input, "empty.json");
91
+ expect(result.hunks.length).toBeGreaterThanOrEqual(1);
92
+ });
93
+ });
94
+ // ─── F4 — conflit dans package.json scripts ───────────────────────────────────
95
+ describe("F4 — package.json : merge des scripts (diff3)", () => {
96
+ const input = [
97
+ `<<<<<<< ours`,
98
+ `{`,
99
+ ` "scripts": {`,
100
+ ` "build": "tsc",`,
101
+ ` "test": "vitest",`,
102
+ ` "lint": "eslint ."`,
103
+ ` }`,
104
+ `}`,
105
+ `||||||| base`,
106
+ `{`,
107
+ ` "scripts": {`,
108
+ ` "build": "tsc",`,
109
+ ` "test": "vitest"`,
110
+ ` }`,
111
+ `}`,
112
+ `=======`,
113
+ `{`,
114
+ ` "scripts": {`,
115
+ ` "build": "tsc",`,
116
+ ` "test": "vitest",`,
117
+ ` "format": "prettier --write ."`,
118
+ ` }`,
119
+ `}`,
120
+ `>>>>>>> theirs`,
121
+ ].join("\n");
122
+ it("auto-résout via le resolver json", () => {
123
+ const result = resolve(input, "package.json");
124
+ expect(result.stats.autoResolved).toBe(1);
125
+ });
126
+ it("le résultat contient les scripts des deux côtés", () => {
127
+ const result = resolve(input, "package.json");
128
+ expect(result.mergedContent).toContain("lint");
129
+ expect(result.mergedContent).toContain("format");
130
+ expect(result.mergedContent).toContain("build");
131
+ expect(result.mergedContent).toContain("test");
132
+ });
133
+ it("la raison mentionne [json]", () => {
134
+ const result = resolve(input, "package.json");
135
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[json\]/i);
136
+ });
137
+ });
138
+ // ─── F5 — conflit dans tsconfig.json compilerOptions ─────────────────────────
139
+ describe("F5 — tsconfig.json : merge des compilerOptions (diff3)", () => {
140
+ const input = [
141
+ `<<<<<<< ours`,
142
+ `{`,
143
+ ` "compilerOptions": {`,
144
+ ` "target": "ES2022",`,
145
+ ` "module": "ESNext",`,
146
+ ` "strict": true,`,
147
+ ` "noUncheckedIndexedAccess": true`,
148
+ ` }`,
149
+ `}`,
150
+ `||||||| base`,
151
+ `{`,
152
+ ` "compilerOptions": {`,
153
+ ` "target": "ES2022",`,
154
+ ` "module": "ESNext",`,
155
+ ` "strict": true`,
156
+ ` }`,
157
+ `}`,
158
+ `=======`,
159
+ `{`,
160
+ ` "compilerOptions": {`,
161
+ ` "target": "ES2022",`,
162
+ ` "module": "ESNext",`,
163
+ ` "strict": true,`,
164
+ ` "exactOptionalPropertyTypes": true`,
165
+ ` }`,
166
+ `}`,
167
+ `>>>>>>> theirs`,
168
+ ].join("\n");
169
+ it("auto-résout via le resolver json", () => {
170
+ const result = resolve(input, "tsconfig.json");
171
+ expect(result.stats.autoResolved).toBe(1);
172
+ });
173
+ it("le résultat contient les options des deux côtés", () => {
174
+ const result = resolve(input, "tsconfig.json");
175
+ expect(result.mergedContent).toContain("noUncheckedIndexedAccess");
176
+ expect(result.mergedContent).toContain("exactOptionalPropertyTypes");
177
+ expect(result.mergedContent).toContain("strict");
178
+ });
179
+ it("la raison mentionne [json]", () => {
180
+ const result = resolve(input, "tsconfig.json");
181
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[json\]/i);
182
+ });
183
+ });
184
+ //# sourceMappingURL=json.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/json.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests du resolver lockfile-npm (package-lock.json) — GitWand
3
+ *
4
+ * Fixtures :
5
+ * F1 — package ajouté d'un seul côté
6
+ * F2 — même package, version différente → prefer theirs ou conflit
7
+ * F3 — lockfile minimal (structure vide)
8
+ * F4 — dépendances directes ajoutées des deux côtés (différents packages)
9
+ * F5 — détection du nom `package-lock.json` → bon resolver utilisé
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=lockfile-npm.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile-npm.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/lockfile-npm.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Tests du resolver lockfile-npm (package-lock.json) — GitWand
3
+ *
4
+ * Fixtures :
5
+ * F1 — package ajouté d'un seul côté
6
+ * F2 — même package, version différente → prefer theirs ou conflit
7
+ * F3 — lockfile minimal (structure vide)
8
+ * F4 — dépendances directes ajoutées des deux côtés (différents packages)
9
+ * F5 — détection du nom `package-lock.json` → bon resolver utilisé
10
+ */
11
+ import { describe, it, expect } from "vitest";
12
+ import { resolve } from "../../resolver.js";
13
+ // ─── helpers ──────────────────────────────────────────────────────────────────
14
+ function makeLock(extra = {}) {
15
+ return JSON.stringify({
16
+ name: "my-app",
17
+ version: "1.0.0",
18
+ lockfileVersion: 3,
19
+ requires: true,
20
+ packages: {
21
+ "": { name: "my-app", version: "1.0.0" },
22
+ "node_modules/react": {
23
+ version: "18.2.0",
24
+ resolved: "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
25
+ integrity: "sha512-react",
26
+ },
27
+ ...extra,
28
+ },
29
+ }, null, 2);
30
+ }
31
+ // ─── F1 — package ajouté d'un seul côté ───────────────────────────────────────
32
+ describe("F1 — package-lock.json : package ajouté d'un seul côté (diff3)", () => {
33
+ const base = makeLock();
34
+ const ours = makeLock({
35
+ "node_modules/lodash": {
36
+ version: "4.17.21",
37
+ resolved: "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
38
+ integrity: "sha512-lodash",
39
+ },
40
+ });
41
+ const input = [
42
+ `<<<<<<< ours`,
43
+ ...ours.split("\n"),
44
+ `||||||| base`,
45
+ ...base.split("\n"),
46
+ `=======`,
47
+ ...base.split("\n"),
48
+ `>>>>>>> theirs`,
49
+ ].join("\n");
50
+ it("auto-résout via le resolver lockfile-npm", () => {
51
+ const result = resolve(input, "package-lock.json");
52
+ expect(result.stats.autoResolved).toBe(1);
53
+ });
54
+ it("le résultat contient le package ajouté", () => {
55
+ const result = resolve(input, "package-lock.json");
56
+ expect(result.mergedContent).toContain("lodash");
57
+ expect(result.mergedContent).toContain("react");
58
+ });
59
+ it("la raison mentionne [lockfile-npm]", () => {
60
+ const result = resolve(input, "package-lock.json");
61
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
62
+ });
63
+ });
64
+ // ─── F2 — même package, version différente ────────────────────────────────────
65
+ describe("F2 — package-lock.json : même package, version différente (diff3)", () => {
66
+ const base = makeLock();
67
+ const ours = makeLock({
68
+ "node_modules/lodash": {
69
+ version: "4.17.20",
70
+ resolved: "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
71
+ integrity: "sha512-old",
72
+ },
73
+ });
74
+ const theirs = makeLock({
75
+ "node_modules/lodash": {
76
+ version: "4.17.21",
77
+ resolved: "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
78
+ integrity: "sha512-new",
79
+ },
80
+ });
81
+ const input = [
82
+ `<<<<<<< ours`,
83
+ ...ours.split("\n"),
84
+ `||||||| base`,
85
+ ...base.split("\n"),
86
+ `=======`,
87
+ ...theirs.split("\n"),
88
+ `>>>>>>> theirs`,
89
+ ].join("\n");
90
+ it("ne lève pas d'exception", () => {
91
+ expect(() => resolve(input, "package-lock.json")).not.toThrow();
92
+ });
93
+ it("la raison mentionne [lockfile-npm]", () => {
94
+ const result = resolve(input, "package-lock.json");
95
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
96
+ });
97
+ });
98
+ // ─── F3 — lockfile minimal ────────────────────────────────────────────────────
99
+ describe("F3 — package-lock.json minimal : ne plante pas", () => {
100
+ const minimal = JSON.stringify({ name: "test", version: "1.0.0", lockfileVersion: 3, packages: {} }, null, 2);
101
+ const input = [
102
+ `<<<<<<< ours`,
103
+ ...minimal.split("\n"),
104
+ `||||||| base`,
105
+ ...minimal.split("\n"),
106
+ `=======`,
107
+ ...minimal.split("\n"),
108
+ `>>>>>>> theirs`,
109
+ ].join("\n");
110
+ it("ne lève pas d'exception", () => {
111
+ expect(() => resolve(input, "package-lock.json")).not.toThrow();
112
+ });
113
+ it("produit un résultat avec au moins un hunk", () => {
114
+ const result = resolve(input, "package-lock.json");
115
+ expect(result.hunks.length).toBeGreaterThanOrEqual(1);
116
+ });
117
+ });
118
+ // ─── F4 — dépendances différentes ajoutées des deux côtés ────────────────────
119
+ describe("F4 — package-lock.json : packages différents ajoutés des deux côtés (diff3)", () => {
120
+ const base = makeLock();
121
+ const ours = makeLock({
122
+ "node_modules/axios": {
123
+ version: "1.6.0",
124
+ resolved: "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
125
+ integrity: "sha512-axios",
126
+ },
127
+ });
128
+ const theirs = makeLock({
129
+ "node_modules/date-fns": {
130
+ version: "3.0.0",
131
+ resolved: "https://registry.npmjs.org/date-fns/-/date-fns-3.0.0.tgz",
132
+ integrity: "sha512-datefns",
133
+ },
134
+ });
135
+ const input = [
136
+ `<<<<<<< ours`,
137
+ ...ours.split("\n"),
138
+ `||||||| base`,
139
+ ...base.split("\n"),
140
+ `=======`,
141
+ ...theirs.split("\n"),
142
+ `>>>>>>> theirs`,
143
+ ].join("\n");
144
+ it("auto-résout via le resolver lockfile-npm", () => {
145
+ const result = resolve(input, "package-lock.json");
146
+ expect(result.stats.autoResolved).toBe(1);
147
+ });
148
+ it("le résultat contient les deux packages", () => {
149
+ const result = resolve(input, "package-lock.json");
150
+ expect(result.mergedContent).toContain("axios");
151
+ expect(result.mergedContent).toContain("date-fns");
152
+ expect(result.mergedContent).toContain("react");
153
+ });
154
+ it("la raison mentionne [lockfile-npm]", () => {
155
+ const result = resolve(input, "package-lock.json");
156
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
157
+ });
158
+ });
159
+ // ─── F5 — détection du nom de fichier ────────────────────────────────────────
160
+ describe("F5 — package-lock.json : détection du nom de fichier", () => {
161
+ const base = makeLock();
162
+ const ours = makeLock({
163
+ "node_modules/vue": {
164
+ version: "3.4.0",
165
+ resolved: "https://registry.npmjs.org/vue/-/vue-3.4.0.tgz",
166
+ integrity: "sha512-vue",
167
+ },
168
+ });
169
+ const input = [
170
+ `<<<<<<< ours`,
171
+ ...ours.split("\n"),
172
+ `||||||| base`,
173
+ ...base.split("\n"),
174
+ `=======`,
175
+ ...base.split("\n"),
176
+ `>>>>>>> theirs`,
177
+ ].join("\n");
178
+ it("le nom package-lock.json active le bon resolver", () => {
179
+ const result = resolve(input, "package-lock.json");
180
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
181
+ });
182
+ it("le nom dans un sous-dossier est aussi détecté", () => {
183
+ const result = resolve(input, "apps/frontend/package-lock.json");
184
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
185
+ });
186
+ });
187
+ //# sourceMappingURL=lockfile-npm.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile-npm.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/lockfile-npm.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests du resolver lockfile-pnpm (pnpm-lock.yaml) — GitWand
3
+ *
4
+ * Fixtures :
5
+ * F1 — package ajouté dans `packages:` d'un seul côté
6
+ * F2 — même package, version différente → prefer theirs ou conflit
7
+ * F3 — lockfile minimal
8
+ * F4 — ajout dans `importers:` d'un seul côté
9
+ * F5 — détection du nom `pnpm-lock.yaml` → bon resolver utilisé
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=lockfile-pnpm.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile-pnpm.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/lockfile-pnpm.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}