@gitwand/core 1.6.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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -0
  3. package/dist/__tests__/bench.bench.d.ts +14 -0
  4. package/dist/__tests__/bench.bench.d.ts.map +1 -0
  5. package/dist/__tests__/bench.bench.js +137 -0
  6. package/dist/__tests__/bench.bench.js.map +1 -0
  7. package/dist/__tests__/confidence-v14.test.d.ts +13 -0
  8. package/dist/__tests__/confidence-v14.test.d.ts.map +1 -0
  9. package/dist/__tests__/confidence-v14.test.js +284 -0
  10. package/dist/__tests__/confidence-v14.test.js.map +1 -0
  11. package/dist/__tests__/config.test.d.ts +2 -0
  12. package/dist/__tests__/config.test.d.ts.map +1 -0
  13. package/dist/__tests__/config.test.js +317 -0
  14. package/dist/__tests__/config.test.js.map +1 -0
  15. package/dist/__tests__/corpus.d.ts +36 -0
  16. package/dist/__tests__/corpus.d.ts.map +1 -0
  17. package/dist/__tests__/corpus.js +541 -0
  18. package/dist/__tests__/corpus.js.map +1 -0
  19. package/dist/__tests__/corpus.test.d.ts +17 -0
  20. package/dist/__tests__/corpus.test.d.ts.map +1 -0
  21. package/dist/__tests__/corpus.test.js +179 -0
  22. package/dist/__tests__/corpus.test.js.map +1 -0
  23. package/dist/__tests__/diff.test.d.ts +10 -0
  24. package/dist/__tests__/diff.test.d.ts.map +1 -0
  25. package/dist/__tests__/diff.test.js +178 -0
  26. package/dist/__tests__/diff.test.js.map +1 -0
  27. package/dist/__tests__/format-resolvers.test.d.ts +2 -0
  28. package/dist/__tests__/format-resolvers.test.d.ts.map +1 -0
  29. package/dist/__tests__/format-resolvers.test.js +577 -0
  30. package/dist/__tests__/format-resolvers.test.js.map +1 -0
  31. package/dist/__tests__/imports-extended.test.d.ts +2 -0
  32. package/dist/__tests__/imports-extended.test.d.ts.map +1 -0
  33. package/dist/__tests__/imports-extended.test.js +94 -0
  34. package/dist/__tests__/imports-extended.test.js.map +1 -0
  35. package/dist/__tests__/lockfile-resolvers.test.d.ts +2 -0
  36. package/dist/__tests__/lockfile-resolvers.test.d.ts.map +1 -0
  37. package/dist/__tests__/lockfile-resolvers.test.js +200 -0
  38. package/dist/__tests__/lockfile-resolvers.test.js.map +1 -0
  39. package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts +10 -0
  40. package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts.map +1 -0
  41. package/dist/__tests__/patterns/insertion-at-boundary.test.js +185 -0
  42. package/dist/__tests__/patterns/insertion-at-boundary.test.js.map +1 -0
  43. package/dist/__tests__/patterns/reorder-only.test.d.ts +10 -0
  44. package/dist/__tests__/patterns/reorder-only.test.d.ts.map +1 -0
  45. package/dist/__tests__/patterns/reorder-only.test.js +181 -0
  46. package/dist/__tests__/patterns/reorder-only.test.js.map +1 -0
  47. package/dist/__tests__/phase-7-2-3b.test.d.ts +6 -0
  48. package/dist/__tests__/phase-7-2-3b.test.d.ts.map +1 -0
  49. package/dist/__tests__/phase-7-2-3b.test.js +730 -0
  50. package/dist/__tests__/phase-7-2-3b.test.js.map +1 -0
  51. package/dist/__tests__/resolver.test.d.ts +2 -0
  52. package/dist/__tests__/resolver.test.d.ts.map +1 -0
  53. package/dist/__tests__/resolver.test.js +927 -0
  54. package/dist/__tests__/resolver.test.js.map +1 -0
  55. package/dist/__tests__/resolvers/cargo.test.d.ts +10 -0
  56. package/dist/__tests__/resolvers/cargo.test.d.ts.map +1 -0
  57. package/dist/__tests__/resolvers/cargo.test.js +158 -0
  58. package/dist/__tests__/resolvers/cargo.test.js.map +1 -0
  59. package/dist/__tests__/resolvers/dockerfile.test.d.ts +8 -0
  60. package/dist/__tests__/resolvers/dockerfile.test.d.ts.map +1 -0
  61. package/dist/__tests__/resolvers/dockerfile.test.js +120 -0
  62. package/dist/__tests__/resolvers/dockerfile.test.js.map +1 -0
  63. package/dist/__tests__/resolvers/dotenv.test.d.ts +9 -0
  64. package/dist/__tests__/resolvers/dotenv.test.d.ts.map +1 -0
  65. package/dist/__tests__/resolvers/dotenv.test.js +113 -0
  66. package/dist/__tests__/resolvers/dotenv.test.js.map +1 -0
  67. package/dist/__tests__/resolvers/improvements-v14.test.d.ts +8 -0
  68. package/dist/__tests__/resolvers/improvements-v14.test.d.ts.map +1 -0
  69. package/dist/__tests__/resolvers/improvements-v14.test.js +306 -0
  70. package/dist/__tests__/resolvers/improvements-v14.test.js.map +1 -0
  71. package/dist/__tests__/validation.test.d.ts +12 -0
  72. package/dist/__tests__/validation.test.d.ts.map +1 -0
  73. package/dist/__tests__/validation.test.js +136 -0
  74. package/dist/__tests__/validation.test.js.map +1 -0
  75. package/dist/classifier.d.ts +21 -0
  76. package/dist/classifier.d.ts.map +1 -0
  77. package/dist/classifier.js +127 -0
  78. package/dist/classifier.js.map +1 -0
  79. package/dist/config.d.ts +108 -0
  80. package/dist/config.d.ts.map +1 -0
  81. package/dist/config.js +200 -0
  82. package/dist/config.js.map +1 -0
  83. package/dist/diff.d.ts +69 -0
  84. package/dist/diff.d.ts.map +1 -0
  85. package/dist/diff.js +328 -0
  86. package/dist/diff.js.map +1 -0
  87. package/dist/index.d.ts +47 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +38 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/parser.d.ts +39 -0
  92. package/dist/parser.d.ts.map +1 -0
  93. package/dist/parser.js +164 -0
  94. package/dist/parser.js.map +1 -0
  95. package/dist/patterns/complex.d.ts +5 -0
  96. package/dist/patterns/complex.d.ts.map +1 -0
  97. package/dist/patterns/complex.js +27 -0
  98. package/dist/patterns/complex.js.map +1 -0
  99. package/dist/patterns/delete-no-change.d.ts +4 -0
  100. package/dist/patterns/delete-no-change.d.ts.map +1 -0
  101. package/dist/patterns/delete-no-change.js +75 -0
  102. package/dist/patterns/delete-no-change.js.map +1 -0
  103. package/dist/patterns/insertion-at-boundary.d.ts +22 -0
  104. package/dist/patterns/insertion-at-boundary.d.ts.map +1 -0
  105. package/dist/patterns/insertion-at-boundary.js +164 -0
  106. package/dist/patterns/insertion-at-boundary.js.map +1 -0
  107. package/dist/patterns/non-overlapping.d.ts +4 -0
  108. package/dist/patterns/non-overlapping.d.ts.map +1 -0
  109. package/dist/patterns/non-overlapping.js +28 -0
  110. package/dist/patterns/non-overlapping.js.map +1 -0
  111. package/dist/patterns/one-side-change.d.ts +4 -0
  112. package/dist/patterns/one-side-change.d.ts.map +1 -0
  113. package/dist/patterns/one-side-change.js +45 -0
  114. package/dist/patterns/one-side-change.js.map +1 -0
  115. package/dist/patterns/reorder-only.d.ts +14 -0
  116. package/dist/patterns/reorder-only.d.ts.map +1 -0
  117. package/dist/patterns/reorder-only.js +81 -0
  118. package/dist/patterns/reorder-only.js.map +1 -0
  119. package/dist/patterns/same-change.d.ts +4 -0
  120. package/dist/patterns/same-change.d.ts.map +1 -0
  121. package/dist/patterns/same-change.js +25 -0
  122. package/dist/patterns/same-change.js.map +1 -0
  123. package/dist/patterns/utils.d.ts +70 -0
  124. package/dist/patterns/utils.d.ts.map +1 -0
  125. package/dist/patterns/utils.js +206 -0
  126. package/dist/patterns/utils.js.map +1 -0
  127. package/dist/patterns/value-only-change.d.ts +4 -0
  128. package/dist/patterns/value-only-change.d.ts.map +1 -0
  129. package/dist/patterns/value-only-change.js +34 -0
  130. package/dist/patterns/value-only-change.js.map +1 -0
  131. package/dist/patterns/whitespace-only.d.ts +4 -0
  132. package/dist/patterns/whitespace-only.d.ts.map +1 -0
  133. package/dist/patterns/whitespace-only.js +32 -0
  134. package/dist/patterns/whitespace-only.js.map +1 -0
  135. package/dist/resolver/assemble.d.ts +25 -0
  136. package/dist/resolver/assemble.d.ts.map +1 -0
  137. package/dist/resolver/assemble.js +170 -0
  138. package/dist/resolver/assemble.js.map +1 -0
  139. package/dist/resolver/format-dispatch.d.ts +40 -0
  140. package/dist/resolver/format-dispatch.d.ts.map +1 -0
  141. package/dist/resolver/format-dispatch.js +51 -0
  142. package/dist/resolver/format-dispatch.js.map +1 -0
  143. package/dist/resolver/generated-detection.d.ts +48 -0
  144. package/dist/resolver/generated-detection.d.ts.map +1 -0
  145. package/dist/resolver/generated-detection.js +123 -0
  146. package/dist/resolver/generated-detection.js.map +1 -0
  147. package/dist/resolver/index.d.ts +26 -0
  148. package/dist/resolver/index.d.ts.map +1 -0
  149. package/dist/resolver/index.js +147 -0
  150. package/dist/resolver/index.js.map +1 -0
  151. package/dist/resolver/policy.d.ts +53 -0
  152. package/dist/resolver/policy.d.ts.map +1 -0
  153. package/dist/resolver/policy.js +99 -0
  154. package/dist/resolver/policy.js.map +1 -0
  155. package/dist/resolver/validation.d.ts +28 -0
  156. package/dist/resolver/validation.d.ts.map +1 -0
  157. package/dist/resolver/validation.js +96 -0
  158. package/dist/resolver/validation.js.map +1 -0
  159. package/dist/resolver.d.ts +18 -0
  160. package/dist/resolver.d.ts.map +1 -0
  161. package/dist/resolver.js +18 -0
  162. package/dist/resolver.js.map +1 -0
  163. package/dist/resolvers/cargo.d.ts +34 -0
  164. package/dist/resolvers/cargo.d.ts.map +1 -0
  165. package/dist/resolvers/cargo.js +262 -0
  166. package/dist/resolvers/cargo.js.map +1 -0
  167. package/dist/resolvers/css.d.ts +60 -0
  168. package/dist/resolvers/css.d.ts.map +1 -0
  169. package/dist/resolvers/css.js +531 -0
  170. package/dist/resolvers/css.js.map +1 -0
  171. package/dist/resolvers/dispatcher.d.ts +78 -0
  172. package/dist/resolvers/dispatcher.d.ts.map +1 -0
  173. package/dist/resolvers/dispatcher.js +290 -0
  174. package/dist/resolvers/dispatcher.js.map +1 -0
  175. package/dist/resolvers/dockerfile.d.ts +24 -0
  176. package/dist/resolvers/dockerfile.d.ts.map +1 -0
  177. package/dist/resolvers/dockerfile.js +221 -0
  178. package/dist/resolvers/dockerfile.js.map +1 -0
  179. package/dist/resolvers/dotenv.d.ts +27 -0
  180. package/dist/resolvers/dotenv.d.ts.map +1 -0
  181. package/dist/resolvers/dotenv.js +114 -0
  182. package/dist/resolvers/dotenv.js.map +1 -0
  183. package/dist/resolvers/imports.d.ts +63 -0
  184. package/dist/resolvers/imports.d.ts.map +1 -0
  185. package/dist/resolvers/imports.js +513 -0
  186. package/dist/resolvers/imports.js.map +1 -0
  187. package/dist/resolvers/json.d.ts +48 -0
  188. package/dist/resolvers/json.d.ts.map +1 -0
  189. package/dist/resolvers/json.js +363 -0
  190. package/dist/resolvers/json.js.map +1 -0
  191. package/dist/resolvers/lockfile-npm.d.ts +38 -0
  192. package/dist/resolvers/lockfile-npm.d.ts.map +1 -0
  193. package/dist/resolvers/lockfile-npm.js +267 -0
  194. package/dist/resolvers/lockfile-npm.js.map +1 -0
  195. package/dist/resolvers/lockfile-pnpm.d.ts +44 -0
  196. package/dist/resolvers/lockfile-pnpm.d.ts.map +1 -0
  197. package/dist/resolvers/lockfile-pnpm.js +277 -0
  198. package/dist/resolvers/lockfile-pnpm.js.map +1 -0
  199. package/dist/resolvers/lockfile-yarn.d.ts +40 -0
  200. package/dist/resolvers/lockfile-yarn.d.ts.map +1 -0
  201. package/dist/resolvers/lockfile-yarn.js +184 -0
  202. package/dist/resolvers/lockfile-yarn.js.map +1 -0
  203. package/dist/resolvers/markdown.d.ts +64 -0
  204. package/dist/resolvers/markdown.d.ts.map +1 -0
  205. package/dist/resolvers/markdown.js +335 -0
  206. package/dist/resolvers/markdown.js.map +1 -0
  207. package/dist/resolvers/vue.d.ts +65 -0
  208. package/dist/resolvers/vue.d.ts.map +1 -0
  209. package/dist/resolvers/vue.js +258 -0
  210. package/dist/resolvers/vue.js.map +1 -0
  211. package/dist/resolvers/yaml.d.ts +65 -0
  212. package/dist/resolvers/yaml.d.ts.map +1 -0
  213. package/dist/resolvers/yaml.js +405 -0
  214. package/dist/resolvers/yaml.js.map +1 -0
  215. package/dist/types.d.ts +256 -0
  216. package/dist/types.d.ts.map +1 -0
  217. package/dist/types.js +8 -0
  218. package/dist/types.js.map +1 -0
  219. package/package.json +57 -0
@@ -0,0 +1,290 @@
1
+ /**
2
+ * GitWand — Dispatcher de résolveurs par format
3
+ *
4
+ * Point d'entrée pour la résolution format-aware.
5
+ * Détecte le type de fichier à partir de son chemin et tente une
6
+ * résolution spécialisée avant de tomber en fallback sur le moteur textuel.
7
+ *
8
+ * Architecture :
9
+ *
10
+ * resolver.ts
11
+ * └─ tryFormatAwareResolve(hunk, filePath)
12
+ * ├─ isJsonFile(filePath) → tryResolveJsonConflict()
13
+ * ├─ isMarkdownFile(filePath) → tryResolveMarkdownConflict()
14
+ * ├─ isYamlFile(filePath) → tryResolveYamlConflict()
15
+ * ├─ isImportFile(filePath) → tryResolveImportConflict() (si bloc d'imports)
16
+ * ├─ isVueFile(filePath) → tryResolveVueConflict()
17
+ * ├─ isCssFile(filePath) → tryResolveCssConflict()
18
+ * └─ null → moteur textuel standard (resolver.ts switch)
19
+ *
20
+ * Chaque résolveur spécialisé retourne des lignes résolues ou null
21
+ * (null = le résolveur ne sait pas → fallback).
22
+ *
23
+ * Phase 7.3b — Nouveaux résolveurs :
24
+ * - YAML (.yaml / .yml)
25
+ * - TS/JS imports (.ts / .js / .tsx / .jsx / .mjs / .cjs)
26
+ * - Vue SFC (.vue)
27
+ * - CSS/SCSS/Less (.css / .scss / .less)
28
+ */
29
+ import { tryResolveJsonConflict } from "./json.js";
30
+ import { tryResolveMarkdownConflict } from "./markdown.js";
31
+ import { tryResolveYamlConflict } from "./yaml.js";
32
+ import { tryResolveImportConflict, isImportBlock } from "./imports.js";
33
+ import { tryResolveVueConflict } from "./vue.js";
34
+ import { tryResolveCssConflict } from "./css.js";
35
+ import { tryResolveLockfileNpmConflict } from "./lockfile-npm.js";
36
+ import { tryResolveYarnLockConflict } from "./lockfile-yarn.js";
37
+ import { tryResolvePnpmLockConflict } from "./lockfile-pnpm.js";
38
+ import { tryResolveCargoConflict } from "./cargo.js";
39
+ import { tryResolveDotenvConflict } from "./dotenv.js";
40
+ import { tryResolveDockerfileConflict } from "./dockerfile.js";
41
+ // ─── Type detection ───────────────────────────────────────
42
+ /** Vérifie si le fichier est JSON ou JSONC */
43
+ export function isJsonFile(filePath) {
44
+ return /\.(json|jsonc)$/i.test(filePath);
45
+ }
46
+ /** Vérifie si le fichier est Markdown */
47
+ export function isMarkdownFile(filePath) {
48
+ return /\.(md|mdx|markdown)$/i.test(filePath);
49
+ }
50
+ /** Vérifie si le fichier est YAML */
51
+ export function isYamlFile(filePath) {
52
+ return /\.(ya?ml)$/i.test(filePath);
53
+ }
54
+ /** Vérifie si le fichier est un module TS/JS/JSX/TSX */
55
+ export function isJsFile(filePath) {
56
+ return /\.(ts|tsx|js|jsx|mjs|cjs)$/i.test(filePath);
57
+ }
58
+ /** Vérifie si le fichier est un composant Vue SFC */
59
+ export function isVueFile(filePath) {
60
+ return /\.vue$/i.test(filePath);
61
+ }
62
+ /** Vérifie si le fichier est CSS, SCSS ou Less */
63
+ export function isCssFile(filePath) {
64
+ return /\.(css|scss|less|sass)$/i.test(filePath);
65
+ }
66
+ /** Vérifie si le fichier est un lockfile npm (package-lock.json) */
67
+ export function isNpmLockfile(filePath) {
68
+ return /package-lock\.json$/i.test(filePath);
69
+ }
70
+ /** Vérifie si le fichier est un lockfile yarn (yarn.lock) */
71
+ export function isYarnLockfile(filePath) {
72
+ return /yarn\.lock$/i.test(filePath);
73
+ }
74
+ /** Vérifie si le fichier est un lockfile pnpm (pnpm-lock.yaml) */
75
+ export function isPnpmLockfile(filePath) {
76
+ return /pnpm-lock\.ya?ml$/i.test(filePath);
77
+ }
78
+ /** Vérifie si le fichier est un lockfile quelconque */
79
+ export function isLockfile(filePath) {
80
+ return isNpmLockfile(filePath) || isYarnLockfile(filePath) || isPnpmLockfile(filePath);
81
+ }
82
+ /** Vérifie si le fichier est un Cargo.toml ou Cargo.lock */
83
+ export function isCargoFile(filePath) {
84
+ return /Cargo\.(toml|lock)$/i.test(filePath);
85
+ }
86
+ /** Vérifie si le fichier est un .env, .env.*, ou *.env */
87
+ export function isDotenvFile(filePath) {
88
+ return /(?:^|[\\/])\.env(?:\.|$)|\.env$/i.test(filePath);
89
+ }
90
+ /** Vérifie si le fichier est un Dockerfile */
91
+ export function isDockerfile(filePath) {
92
+ return /(?:^|[\\/])Dockerfile(?:\.|$)|\.dockerfile$/i.test(filePath);
93
+ }
94
+ // ─── Main dispatcher ──────────────────────────────────────
95
+ /**
96
+ * Tente de résoudre un hunk de conflit avec le résolveur approprié
97
+ * selon le type de fichier.
98
+ *
99
+ * Retourne `lines !== null` si le résolveur a réussi, `null` sinon.
100
+ * Dans tous les cas, `reason` décrit ce qui s'est passé.
101
+ *
102
+ * @param hunk - Le hunk de conflit à résoudre
103
+ * @param filePath - Le chemin du fichier (pour déterminer le résolveur)
104
+ */
105
+ export function tryFormatAwareResolve(hunk, filePath) {
106
+ // ── Cargo.toml / Cargo.lock (avant JSON) ──────────────────
107
+ if (isCargoFile(filePath)) {
108
+ const result = tryResolveCargoConflict(filePath, hunk.baseLines, hunk.oursLines, hunk.theirsLines);
109
+ if (result.lines !== null) {
110
+ return { lines: result.lines, reason: `[cargo] ${result.reason}`, resolverUsed: "cargo" };
111
+ }
112
+ return { lines: null, reason: `[cargo] ${result.reason}`, resolverUsed: "cargo" };
113
+ }
114
+ // ── .env / .env.* ─────────────────────────────────────────
115
+ if (isDotenvFile(filePath)) {
116
+ const result = tryResolveDotenvConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
117
+ if (result.lines !== null) {
118
+ return { lines: result.lines, reason: `[dotenv] ${result.reason}`, resolverUsed: "dotenv" };
119
+ }
120
+ return { lines: null, reason: `[dotenv] ${result.reason}`, resolverUsed: "dotenv" };
121
+ }
122
+ // ── Dockerfile ────────────────────────────────────────────
123
+ if (isDockerfile(filePath)) {
124
+ const result = tryResolveDockerfileConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
125
+ if (result.lines !== null) {
126
+ return { lines: result.lines, reason: `[dockerfile] ${result.reason}`, resolverUsed: "dockerfile" };
127
+ }
128
+ return { lines: null, reason: `[dockerfile] ${result.reason}`, resolverUsed: "dockerfile" };
129
+ }
130
+ // ── Lockfiles (avant JSON car package-lock.json est un .json) ──
131
+ if (isNpmLockfile(filePath)) {
132
+ const result = tryResolveLockfileNpmConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
133
+ if (result.merged !== null) {
134
+ return {
135
+ lines: result.merged.split("\n"),
136
+ reason: `[lockfile-npm] ${result.reason}`,
137
+ resolverUsed: "lockfile-npm",
138
+ };
139
+ }
140
+ return {
141
+ lines: null,
142
+ reason: `[lockfile-npm] ${result.reason}`,
143
+ resolverUsed: "lockfile-npm",
144
+ };
145
+ }
146
+ if (isYarnLockfile(filePath)) {
147
+ const result = tryResolveYarnLockConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
148
+ if (result.merged !== null) {
149
+ return {
150
+ lines: result.merged.split("\n"),
151
+ reason: `[lockfile-yarn] ${result.reason}`,
152
+ resolverUsed: "lockfile-yarn",
153
+ };
154
+ }
155
+ return {
156
+ lines: null,
157
+ reason: `[lockfile-yarn] ${result.reason}`,
158
+ resolverUsed: "lockfile-yarn",
159
+ };
160
+ }
161
+ if (isPnpmLockfile(filePath)) {
162
+ const result = tryResolvePnpmLockConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
163
+ if (result.merged !== null) {
164
+ return {
165
+ lines: result.merged.split("\n"),
166
+ reason: `[lockfile-pnpm] ${result.reason}`,
167
+ resolverUsed: "lockfile-pnpm",
168
+ };
169
+ }
170
+ return {
171
+ lines: null,
172
+ reason: `[lockfile-pnpm] ${result.reason}`,
173
+ resolverUsed: "lockfile-pnpm",
174
+ };
175
+ }
176
+ // ── JSON / JSONC ──────────────────────────────────────
177
+ if (isJsonFile(filePath)) {
178
+ const result = tryResolveJsonConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
179
+ if (result.merged !== null) {
180
+ const mergedText = typeof result.merged === "string"
181
+ ? result.merged
182
+ : JSON.stringify(result.merged, null, 2);
183
+ return {
184
+ lines: mergedText.split("\n"),
185
+ reason: `[json] ${result.reason}`,
186
+ resolverUsed: "json",
187
+ };
188
+ }
189
+ return {
190
+ lines: null,
191
+ reason: `[json] ${result.reason}`,
192
+ resolverUsed: "json",
193
+ };
194
+ }
195
+ // ── Markdown ──────────────────────────────────────────
196
+ if (isMarkdownFile(filePath)) {
197
+ const result = tryResolveMarkdownConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
198
+ if (result.mergedLines !== null) {
199
+ return {
200
+ lines: result.mergedLines,
201
+ reason: `[markdown] ${result.reason}`,
202
+ resolverUsed: "markdown",
203
+ };
204
+ }
205
+ return {
206
+ lines: null,
207
+ reason: `[markdown] ${result.reason}`,
208
+ resolverUsed: "markdown",
209
+ };
210
+ }
211
+ // ── YAML ──────────────────────────────────────────────
212
+ if (isYamlFile(filePath)) {
213
+ const result = tryResolveYamlConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
214
+ if (result.mergedLines !== null) {
215
+ return {
216
+ lines: result.mergedLines,
217
+ reason: `[yaml] ${result.reason}`,
218
+ resolverUsed: "yaml",
219
+ };
220
+ }
221
+ return {
222
+ lines: null,
223
+ reason: `[yaml] ${result.reason}`,
224
+ resolverUsed: "yaml",
225
+ };
226
+ }
227
+ // ── Vue SFC ───────────────────────────────────────────
228
+ if (isVueFile(filePath)) {
229
+ const result = tryResolveVueConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
230
+ if (result.mergedLines !== null) {
231
+ return {
232
+ lines: result.mergedLines,
233
+ reason: `[vue] ${result.reason}`,
234
+ resolverUsed: "vue",
235
+ };
236
+ }
237
+ return {
238
+ lines: null,
239
+ reason: `[vue] ${result.reason}`,
240
+ resolverUsed: "vue",
241
+ };
242
+ }
243
+ // ── CSS / SCSS / Less ─────────────────────────────────
244
+ if (isCssFile(filePath)) {
245
+ const result = tryResolveCssConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
246
+ if (result.mergedLines !== null) {
247
+ return {
248
+ lines: result.mergedLines,
249
+ reason: `[css] ${result.reason}`,
250
+ resolverUsed: "css",
251
+ };
252
+ }
253
+ return {
254
+ lines: null,
255
+ reason: `[css] ${result.reason}`,
256
+ resolverUsed: "css",
257
+ };
258
+ }
259
+ // ── TS/JS/TSX/JSX — résolveur d'imports ──────────────
260
+ // Uniquement si le bloc entier est composé d'import statements,
261
+ // et uniquement si les deux côtés sont différents (si ours === theirs,
262
+ // le moteur same_change gère la résolution sans réordonner les imports).
263
+ if (isJsFile(filePath)) {
264
+ if (isImportBlock(hunk.oursLines) &&
265
+ isImportBlock(hunk.theirsLines) &&
266
+ hunk.oursLines.join("\n") !== hunk.theirsLines.join("\n")) {
267
+ const result = tryResolveImportConflict(hunk.baseLines, hunk.oursLines, hunk.theirsLines);
268
+ if (result.mergedLines !== null) {
269
+ return {
270
+ lines: result.mergedLines,
271
+ reason: `[imports] ${result.reason}`,
272
+ resolverUsed: "imports",
273
+ };
274
+ }
275
+ return {
276
+ lines: null,
277
+ reason: `[imports] ${result.reason}`,
278
+ resolverUsed: "imports",
279
+ };
280
+ }
281
+ // Bloc non-import → pas de résolveur spécialisé pour TS/JS (fallback textuel)
282
+ }
283
+ // ── Pas de résolveur spécialisé ───────────────────────
284
+ return {
285
+ lines: null,
286
+ reason: "Aucun résolveur spécialisé pour ce type de fichier.",
287
+ resolverUsed: "none",
288
+ };
289
+ }
290
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/resolvers/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * GitWand — Resolver Dockerfile (v1.4)
3
+ *
4
+ * Merge sémantique de Dockerfiles, avec support multi-stage.
5
+ * Zéro dépendance externe.
6
+ *
7
+ * Stratégies par instruction :
8
+ * - FROM : prefer theirs (image de base plus récente)
9
+ * - ENV/ARG : merge par clé (union, prefer theirs)
10
+ * - COPY/ADD : merge si destinations distinctes ; conflit si même dest
11
+ * - RUN : conservatif — fallback si conflit
12
+ * - WORKDIR, EXPOSE, USER : prefer theirs si conflit
13
+ * - COMMENT, BLANK : préserver depuis theirs
14
+ */
15
+ type FormatResult = {
16
+ lines: string[] | null;
17
+ reason: string;
18
+ };
19
+ /**
20
+ * Tente de résoudre un conflit dans un Dockerfile.
21
+ */
22
+ export declare function tryResolveDockerfileConflict(_baseLines: string[], oursLines: string[], theirsLines: string[]): FormatResult;
23
+ export {};
24
+ //# sourceMappingURL=dockerfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dockerfile.d.ts","sourceRoot":"","sources":["../../src/resolvers/dockerfile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA4BH,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAuK/D;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,YAAY,CAoEd"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * GitWand — Resolver Dockerfile (v1.4)
3
+ *
4
+ * Merge sémantique de Dockerfiles, avec support multi-stage.
5
+ * Zéro dépendance externe.
6
+ *
7
+ * Stratégies par instruction :
8
+ * - FROM : prefer theirs (image de base plus récente)
9
+ * - ENV/ARG : merge par clé (union, prefer theirs)
10
+ * - COPY/ADD : merge si destinations distinctes ; conflit si même dest
11
+ * - RUN : conservatif — fallback si conflit
12
+ * - WORKDIR, EXPOSE, USER : prefer theirs si conflit
13
+ * - COMMENT, BLANK : préserver depuis theirs
14
+ */
15
+ // ─── Parser ──────────────────────────────────────────────────
16
+ const DOCKERFILE_INSTRUCTIONS = new Set([
17
+ "FROM", "RUN", "CMD", "LABEL", "EXPOSE", "ENV", "ADD", "COPY",
18
+ "ENTRYPOINT", "VOLUME", "USER", "WORKDIR", "ARG", "ONBUILD",
19
+ "STOPSIGNAL", "HEALTHCHECK", "SHELL",
20
+ ]);
21
+ function parseDockerfileInstructions(lines) {
22
+ const instructions = [];
23
+ let i = 0;
24
+ while (i < lines.length) {
25
+ const line = lines[i];
26
+ const trimmed = line.trim();
27
+ // Ligne vide
28
+ if (!trimmed) {
29
+ instructions.push({ kind: "BLANK", raw: [line] });
30
+ i++;
31
+ continue;
32
+ }
33
+ // Commentaire
34
+ if (trimmed.startsWith("#")) {
35
+ instructions.push({ kind: "COMMENT", raw: [line] });
36
+ i++;
37
+ continue;
38
+ }
39
+ // Instruction Dockerfile
40
+ const firstWord = trimmed.split(/\s+/)[0].toUpperCase();
41
+ if (DOCKERFILE_INSTRUCTIONS.has(firstWord)) {
42
+ // Collecter les lignes de continuation (\)
43
+ const rawLines = [line];
44
+ while (lines[i]?.endsWith("\\") && i + 1 < lines.length) {
45
+ i++;
46
+ rawLines.push(lines[i]);
47
+ }
48
+ i++;
49
+ const fullLine = rawLines.map((l) => l.replace(/\\\s*$/, "").trim()).join(" ");
50
+ const rest = fullLine.slice(firstWord.length).trim();
51
+ let instr = { kind: firstWord, raw: rawLines };
52
+ if (firstWord === "FROM") {
53
+ const asPart = rest.match(/\bAS\s+(\S+)/i);
54
+ instr.key = asPart?.[1]; // alias
55
+ instr.value = rest.replace(/\s+AS\s+\S+/i, "").trim();
56
+ }
57
+ else if (firstWord === "ENV" || firstWord === "ARG") {
58
+ const eqIdx = rest.indexOf("=");
59
+ if (eqIdx > 0) {
60
+ instr.key = rest.slice(0, eqIdx).trim();
61
+ instr.value = rest.slice(eqIdx + 1).trim();
62
+ }
63
+ else {
64
+ instr.key = rest.split(/\s+/)[0];
65
+ instr.value = rest.slice(instr.key.length).trim();
66
+ }
67
+ }
68
+ else if (firstWord === "COPY" || firstWord === "ADD") {
69
+ // Dernier token est la destination
70
+ const parts = rest.split(/\s+/);
71
+ instr.key = parts[parts.length - 1]; // dest
72
+ }
73
+ else if (firstWord === "WORKDIR") {
74
+ instr.key = rest;
75
+ }
76
+ instructions.push(instr);
77
+ }
78
+ else {
79
+ instructions.push({ kind: "OTHER", raw: [line] });
80
+ i++;
81
+ }
82
+ }
83
+ return instructions;
84
+ }
85
+ // ─── Merge d'un stage ─────────────────────────────────────────
86
+ /**
87
+ * Fusionne deux listes d'instructions d'un même stage Dockerfile.
88
+ * Retourne les lignes fusionnées ou null si un conflit irréductible est détecté.
89
+ */
90
+ function mergeStage(oursInstructions, theirsInstructions) {
91
+ // Indexer theirs par (kind, key)
92
+ const theirsMap = new Map();
93
+ for (const instr of theirsInstructions) {
94
+ const mapKey = instr.key ? `${instr.kind}:${instr.key}` : instr.kind;
95
+ theirsMap.set(mapKey, instr);
96
+ }
97
+ const result = [];
98
+ const seen = new Set();
99
+ for (const oursInstr of oursInstructions) {
100
+ const mapKey = oursInstr.key ? `${oursInstr.kind}:${oursInstr.key}` : oursInstr.kind;
101
+ const theirsInstr = theirsMap.get(mapKey);
102
+ if (!theirsInstr) {
103
+ // Instruction seulement dans ours → inclure
104
+ result.push(...oursInstr.raw);
105
+ seen.add(mapKey);
106
+ continue;
107
+ }
108
+ seen.add(mapKey);
109
+ const oursRaw = oursInstr.raw.join("\n");
110
+ const theirsRaw = theirsInstr.raw.join("\n");
111
+ if (oursRaw === theirsRaw) {
112
+ // Identiques → inclure une fois
113
+ result.push(...oursInstr.raw);
114
+ continue;
115
+ }
116
+ // Conflit : stratégie par instruction
117
+ switch (oursInstr.kind) {
118
+ case "FROM":
119
+ // prefer theirs (image de base plus récente)
120
+ result.push(...theirsInstr.raw);
121
+ break;
122
+ case "ENV":
123
+ case "ARG":
124
+ // prefer theirs (valeur entrante)
125
+ result.push(...theirsInstr.raw);
126
+ break;
127
+ case "WORKDIR":
128
+ case "EXPOSE":
129
+ case "USER":
130
+ // prefer theirs
131
+ result.push(...theirsInstr.raw);
132
+ break;
133
+ case "COPY":
134
+ case "ADD":
135
+ // Même destination → conflit irréductible
136
+ return null;
137
+ case "RUN":
138
+ case "CMD":
139
+ case "ENTRYPOINT":
140
+ // Conservatif → fallback
141
+ return null;
142
+ default:
143
+ // prefer theirs
144
+ result.push(...theirsInstr.raw);
145
+ }
146
+ }
147
+ // Instructions seulement dans theirs
148
+ for (const [mapKey, instr] of theirsMap) {
149
+ if (!seen.has(mapKey)) {
150
+ result.push(...instr.raw);
151
+ }
152
+ }
153
+ return result;
154
+ }
155
+ // ─── Résolution ──────────────────────────────────────────────
156
+ /**
157
+ * Tente de résoudre un conflit dans un Dockerfile.
158
+ */
159
+ export function tryResolveDockerfileConflict(_baseLines, oursLines, theirsLines) {
160
+ const oursInstructions = parseDockerfileInstructions(oursLines);
161
+ const theirsInstructions = parseDockerfileInstructions(theirsLines);
162
+ // Détecter les stages FROM…AS
163
+ const splitByStage = (instructions) => {
164
+ const stages = [];
165
+ let current = [];
166
+ for (const instr of instructions) {
167
+ if (instr.kind === "FROM" && current.length > 0) {
168
+ stages.push(current);
169
+ current = [];
170
+ }
171
+ current.push(instr);
172
+ }
173
+ if (current.length > 0)
174
+ stages.push(current);
175
+ return stages;
176
+ };
177
+ const oursStages = splitByStage(oursInstructions);
178
+ const theirsStages = splitByStage(theirsInstructions);
179
+ // Indexer les stages theirs par alias FROM
180
+ const getStageKey = (stage) => {
181
+ const from = stage.find((i) => i.kind === "FROM");
182
+ return from?.key ?? from?.value ?? `__stage_${Math.random()}`;
183
+ };
184
+ const theirsStageMap = new Map();
185
+ for (const stage of theirsStages) {
186
+ theirsStageMap.set(getStageKey(stage), stage);
187
+ }
188
+ const resultLines = [];
189
+ const seenStages = new Set();
190
+ for (const oursStage of oursStages) {
191
+ const key = getStageKey(oursStage);
192
+ const theirsStage = theirsStageMap.get(key);
193
+ seenStages.add(key);
194
+ if (!theirsStage) {
195
+ // Stage seulement dans ours → inclure
196
+ for (const instr of oursStage)
197
+ resultLines.push(...instr.raw);
198
+ continue;
199
+ }
200
+ const merged = mergeStage(oursStage, theirsStage);
201
+ if (!merged) {
202
+ return {
203
+ lines: null,
204
+ reason: "[dockerfile] Conflit irréductible dans un stage — fallback textuel.",
205
+ };
206
+ }
207
+ resultLines.push(...merged);
208
+ }
209
+ // Stages seulement dans theirs → les ajouter
210
+ for (const [key, stage] of theirsStageMap) {
211
+ if (!seenStages.has(key)) {
212
+ for (const instr of stage)
213
+ resultLines.push(...instr.raw);
214
+ }
215
+ }
216
+ return {
217
+ lines: resultLines,
218
+ reason: "Dockerfile — merge par stage et instruction (FROM prefer-theirs, ENV/ARG par clé, RUN conservatif).",
219
+ };
220
+ }
221
+ //# sourceMappingURL=dockerfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dockerfile.js","sourceRoot":"","sources":["../../src/resolvers/dockerfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * GitWand — Resolver .env (v1.4)
3
+ *
4
+ * Merge de fichiers .env, .env.*, *.env par clé.
5
+ * Zéro dépendance externe.
6
+ *
7
+ * Grammaire supportée :
8
+ * LINE = COMMENT | BLANK | EXPORT? KEY '=' VALUE
9
+ * COMMENT = '#' ...
10
+ * EXPORT = 'export '
11
+ * KEY = [A-Z_][A-Z0-9_]* (insensible à la casse pour la détection)
12
+ * VALUE = QUOTED | UNQUOTED
13
+ *
14
+ * Limitations :
15
+ * - Valeurs multilignes (backslash continuation) → fallback textuel
16
+ * - Nested quotes complexes → fallback textuel
17
+ */
18
+ type FormatResult = {
19
+ lines: string[] | null;
20
+ reason: string;
21
+ };
22
+ /**
23
+ * Tente de résoudre un conflit dans un fichier .env.
24
+ */
25
+ export declare function tryResolveDotenvConflict(_baseLines: string[], oursLines: string[], theirsLines: string[]): FormatResult;
26
+ export {};
27
+ //# sourceMappingURL=dotenv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotenv.d.ts","sourceRoot":"","sources":["../../src/resolvers/dotenv.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA2D/D;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,YAAY,CAiDd"}