@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,96 @@
1
+ /**
2
+ * Post-merge validation (Phase 7.2).
3
+ *
4
+ * Vérifie que le contenu fusionné ne laisse pas de marqueurs de conflit
5
+ * résiduels et, pour les formats structurés (JSON/JSONC, YAML, TOML),
6
+ * qu'il reste syntaxiquement valide. Extrait de `resolver.ts` lors du
7
+ * split P1.1, puis étendu YAML/TOML en P2.5.
8
+ */
9
+ import * as YAML from "yaml";
10
+ import { parse as parseToml } from "smol-toml";
11
+ /** Patterns de marqueurs de conflit résiduels. */
12
+ export const RESIDUAL_MARKER_PATTERNS = [
13
+ /^<{7}\s/, // <<<<<<< ours
14
+ /^>{7}\s/, // >>>>>>> theirs
15
+ /^\|{7}\s/, // ||||||| base
16
+ /^={7}$/, // =======
17
+ ];
18
+ /** Détecte le format structuré à partir de l'extension du fichier. */
19
+ function detectFormat(filePath) {
20
+ if (/\.json(c)?$/i.test(filePath))
21
+ return "json";
22
+ if (/\.ya?ml$/i.test(filePath))
23
+ return "yaml";
24
+ if (/\.toml$/i.test(filePath))
25
+ return "toml";
26
+ return null;
27
+ }
28
+ /**
29
+ * Parse le contenu selon le format détecté. Retourne `null` si OK,
30
+ * sinon un message d'erreur préfixé par le format (ex: "YAML: ...").
31
+ *
32
+ * Le préfixe permet de savoir quel parser a échoué sans avoir à
33
+ * enrichir le type `ValidationResult` — `syntaxError: string | null`
34
+ * reste le contrat public.
35
+ */
36
+ function tryParse(content, format) {
37
+ if (format === null)
38
+ return null;
39
+ try {
40
+ switch (format) {
41
+ case "json":
42
+ JSON.parse(content);
43
+ return null;
44
+ case "yaml":
45
+ // `yaml.parse` échoue dur sur les erreurs de syntaxe (vs `parseDocument`
46
+ // qui les accumule). On veut un fail-fast équivalent à JSON.parse.
47
+ YAML.parse(content);
48
+ return null;
49
+ case "toml":
50
+ parseToml(content);
51
+ return null;
52
+ }
53
+ }
54
+ catch (err) {
55
+ const msg = err instanceof Error ? err.message : String(err);
56
+ return `${format.toUpperCase()}: ${msg}`;
57
+ }
58
+ }
59
+ /**
60
+ * Valide le contenu fusionné pour détecter les problèmes résiduels.
61
+ *
62
+ * Vérifie :
63
+ * 1. Marqueurs de conflit résiduels (indique une résolution incomplète)
64
+ * 2. Erreurs de syntaxe pour les formats structurés :
65
+ * - JSON/JSONC (`.json`, `.jsonc`)
66
+ * - YAML (`.yaml`, `.yml`)
67
+ * - TOML (`.toml`)
68
+ *
69
+ * @param content - Contenu fusionné à valider
70
+ * @param filePath - Chemin du fichier (pour détecter le type)
71
+ */
72
+ export function validateMergedContent(content, filePath) {
73
+ // 1. Détection de marqueurs résiduels
74
+ const lines = content.split("\n");
75
+ const residualMarkerLines = [];
76
+ for (let i = 0; i < lines.length; i++) {
77
+ const line = lines[i];
78
+ if (RESIDUAL_MARKER_PATTERNS.some((p) => p.test(line))) {
79
+ residualMarkerLines.push(i + 1); // 1-indexed
80
+ }
81
+ }
82
+ const hasResidualMarkers = residualMarkerLines.length > 0;
83
+ // 2. Validation syntaxique pour formats structurés
84
+ const format = detectFormat(filePath);
85
+ const syntaxError = tryParse(content, format);
86
+ const isValid = !hasResidualMarkers && syntaxError === null;
87
+ return { hasResidualMarkers, residualMarkerLines, syntaxError, isValid };
88
+ }
89
+ /** Validation vide (pour les cas où le contenu n'est pas encore fusionné). */
90
+ export const EMPTY_VALIDATION = {
91
+ hasResidualMarkers: false,
92
+ residualMarkerLines: [],
93
+ syntaxError: null,
94
+ isValid: true,
95
+ };
96
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/resolver/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * GitWand Conflict Resolver — re-export shim.
3
+ *
4
+ * L'implémentation a été éclatée (P1.1) dans le dossier `resolver/` :
5
+ *
6
+ * - `resolver/validation.ts` — Phase 7.2 : marqueurs résiduels + JSON
7
+ * - `resolver/generated-detection.ts` — lockfiles/bundles + stripVolatileValues
8
+ * - `resolver/policy.ts` — DEFAULT_OPTIONS, politique effective,
9
+ * seuil de confiance, pénalité v1.4
10
+ * - `resolver/format-dispatch.ts` — Phase 7.3 : résolveurs spécialisés
11
+ * - `resolver/assemble.ts` — moteur textuel (switch par ConflictType)
12
+ * - `resolver/index.ts` — orchestration + `resolve()` public
13
+ *
14
+ * Ce shim existe pour ne rien casser côté consommateurs : de nombreux
15
+ * tests et modules importent `resolve` depuis `../resolver.js`.
16
+ */
17
+ export { resolve } from "./resolver/index.js";
18
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * GitWand Conflict Resolver — re-export shim.
3
+ *
4
+ * L'implémentation a été éclatée (P1.1) dans le dossier `resolver/` :
5
+ *
6
+ * - `resolver/validation.ts` — Phase 7.2 : marqueurs résiduels + JSON
7
+ * - `resolver/generated-detection.ts` — lockfiles/bundles + stripVolatileValues
8
+ * - `resolver/policy.ts` — DEFAULT_OPTIONS, politique effective,
9
+ * seuil de confiance, pénalité v1.4
10
+ * - `resolver/format-dispatch.ts` — Phase 7.3 : résolveurs spécialisés
11
+ * - `resolver/assemble.ts` — moteur textuel (switch par ConflictType)
12
+ * - `resolver/index.ts` — orchestration + `resolve()` public
13
+ *
14
+ * Ce shim existe pour ne rien casser côté consommateurs : de nombreux
15
+ * tests et modules importent `resolve` depuis `../resolver.js`.
16
+ */
17
+ export { resolve } from "./resolver/index.js";
18
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * GitWand — Resolver Cargo.toml / Cargo.lock (v1.4)
3
+ *
4
+ * Parser TOML maison limité aux sections pertinentes pour la résolution
5
+ * de conflits. Zéro dépendance externe.
6
+ *
7
+ * ## Cargo.toml
8
+ * Stratégie par section :
9
+ * - [dependencies], [dev-dependencies], [build-dependencies] → merge par crate name (union)
10
+ * - [package] → clé par clé, `version` délègue à value_only_change
11
+ * - [features] → merge des listes de features comme des sets (union)
12
+ * - [workspace.members/dependencies] → même que dependencies
13
+ * - Autres sections → fallback si les deux côtés les ont modifiées
14
+ *
15
+ * ## Cargo.lock
16
+ * - Parse les blocs `[[package]]` par clé `name@version`
17
+ * - Union par clé ; en cas de conflit sur la même clé → prefer theirs
18
+ */
19
+ type FormatResult = {
20
+ lines: string[] | null;
21
+ reason: string;
22
+ };
23
+ /**
24
+ * Tente de résoudre un conflit dans un fichier Cargo.toml.
25
+ * Retourne les lignes fusionnées ou null si fallback nécessaire.
26
+ */
27
+ export declare function tryResolveCargoTomlConflict(_baseLines: string[], oursLines: string[], theirsLines: string[]): FormatResult;
28
+ /**
29
+ * Tente de résoudre un conflit dans un fichier Cargo.lock.
30
+ */
31
+ export declare function tryResolveCargoLockConflict(_baseLines: string[], oursLines: string[], theirsLines: string[]): FormatResult;
32
+ export declare function tryResolveCargoConflict(filePath: string, baseLines: string[], oursLines: string[], theirsLines: string[]): FormatResult;
33
+ export {};
34
+ //# sourceMappingURL=cargo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cargo.d.ts","sourceRoot":"","sources":["../../src/resolvers/cargo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAiBH,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoF/D;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,YAAY,CAiFd;AAyDD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,YAAY,CAmCd;AAID,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,YAAY,CAKd"}
@@ -0,0 +1,262 @@
1
+ /**
2
+ * GitWand — Resolver Cargo.toml / Cargo.lock (v1.4)
3
+ *
4
+ * Parser TOML maison limité aux sections pertinentes pour la résolution
5
+ * de conflits. Zéro dépendance externe.
6
+ *
7
+ * ## Cargo.toml
8
+ * Stratégie par section :
9
+ * - [dependencies], [dev-dependencies], [build-dependencies] → merge par crate name (union)
10
+ * - [package] → clé par clé, `version` délègue à value_only_change
11
+ * - [features] → merge des listes de features comme des sets (union)
12
+ * - [workspace.members/dependencies] → même que dependencies
13
+ * - Autres sections → fallback si les deux côtés les ont modifiées
14
+ *
15
+ * ## Cargo.lock
16
+ * - Parse les blocs `[[package]]` par clé `name@version`
17
+ * - Union par clé ; en cas de conflit sur la même clé → prefer theirs
18
+ */
19
+ // ─── Parser TOML minimal ──────────────────────────────────────
20
+ /** Détermine si une ligne est un header de section TOML */
21
+ function isSectionHeader(line) {
22
+ return /^\[/.test(line.trim());
23
+ }
24
+ /** Parse un bloc de lignes TOML en sections */
25
+ function parseTomlSections(lines) {
26
+ const sections = [];
27
+ let current = null;
28
+ for (const line of lines) {
29
+ const trimmed = line.trim();
30
+ if (isSectionHeader(trimmed)) {
31
+ if (current)
32
+ sections.push(current);
33
+ current = { header: trimmed, headerLine: line, entries: [], raw: [line] };
34
+ }
35
+ else if (current) {
36
+ current.raw.push(line);
37
+ if (trimmed && !trimmed.startsWith("#")) {
38
+ const eqIdx = line.indexOf("=");
39
+ if (eqIdx > 0) {
40
+ const key = line.slice(0, eqIdx).trim();
41
+ const value = line.slice(eqIdx + 1).trim();
42
+ current.entries.push({ key, value, raw: line });
43
+ }
44
+ }
45
+ }
46
+ else {
47
+ // Lignes avant la première section (commentaires, etc.)
48
+ if (!current) {
49
+ current = { header: "", headerLine: "", entries: [], raw: [line] };
50
+ }
51
+ }
52
+ }
53
+ if (current)
54
+ sections.push(current);
55
+ return sections;
56
+ }
57
+ // ─── Cargo.toml resolver ──────────────────────────────────────
58
+ /** Sections de dépendances Cargo connues */
59
+ const DEP_SECTIONS = new Set([
60
+ "[dependencies]",
61
+ "[dev-dependencies]",
62
+ "[build-dependencies]",
63
+ "[workspace.dependencies]",
64
+ ]);
65
+ const FEATURE_SECTIONS = new Set([
66
+ "[features]",
67
+ ]);
68
+ const PACKAGE_SECTIONS = new Set([
69
+ "[package]",
70
+ ]);
71
+ const WORKSPACE_SECTIONS = new Set([
72
+ "[workspace]",
73
+ "[workspace.members]",
74
+ ]);
75
+ /**
76
+ * Fusionne deux sections de dépendances : union par nom de crate.
77
+ * Si un crate apparaît des deux côtés avec des versions différentes → prefer theirs.
78
+ */
79
+ function mergeDependencySections(oursEntries, theirsEntries) {
80
+ const merged = new Map();
81
+ // ours d'abord
82
+ for (const e of oursEntries) {
83
+ merged.set(e.key, e);
84
+ }
85
+ // theirs : écrase en cas de conflit (prefer theirs)
86
+ for (const e of theirsEntries) {
87
+ merged.set(e.key, e);
88
+ }
89
+ return [...merged.values()];
90
+ }
91
+ /**
92
+ * Tente de résoudre un conflit dans un fichier Cargo.toml.
93
+ * Retourne les lignes fusionnées ou null si fallback nécessaire.
94
+ */
95
+ export function tryResolveCargoTomlConflict(_baseLines, oursLines, theirsLines) {
96
+ const oursSections = parseTomlSections(oursLines);
97
+ const theirsSections = parseTomlSections(theirsLines);
98
+ // Indexer les sections de theirs par header
99
+ const theirsIndex = new Map();
100
+ for (const s of theirsSections) {
101
+ theirsIndex.set(s.header, s);
102
+ }
103
+ const result = [];
104
+ for (const oursSection of oursSections) {
105
+ const theirsSection = theirsIndex.get(oursSection.header);
106
+ if (!theirsSection) {
107
+ // Section seulement dans ours → l'inclure
108
+ result.push(...oursSection.raw);
109
+ continue;
110
+ }
111
+ const header = oursSection.header;
112
+ if (DEP_SECTIONS.has(header)) {
113
+ // Merge par clé (union, prefer theirs en cas de conflit)
114
+ if (oursSection.headerLine)
115
+ result.push(oursSection.headerLine);
116
+ const merged = mergeDependencySections(oursSection.entries, theirsSection.entries);
117
+ for (const e of merged)
118
+ result.push(e.raw);
119
+ theirsIndex.delete(header);
120
+ continue;
121
+ }
122
+ if (FEATURE_SECTIONS.has(header)) {
123
+ // Merge feature lists par clé (union des valeurs)
124
+ if (oursSection.headerLine)
125
+ result.push(oursSection.headerLine);
126
+ const merged = mergeDependencySections(oursSection.entries, theirsSection.entries);
127
+ for (const e of merged)
128
+ result.push(e.raw);
129
+ theirsIndex.delete(header);
130
+ continue;
131
+ }
132
+ if (PACKAGE_SECTIONS.has(header)) {
133
+ // Clé par clé : prefer theirs
134
+ if (oursSection.headerLine)
135
+ result.push(oursSection.headerLine);
136
+ const merged = mergeDependencySections(oursSection.entries, theirsSection.entries);
137
+ for (const e of merged)
138
+ result.push(e.raw);
139
+ theirsIndex.delete(header);
140
+ continue;
141
+ }
142
+ if (WORKSPACE_SECTIONS.has(header)) {
143
+ // Merge comme dependencies
144
+ if (oursSection.headerLine)
145
+ result.push(oursSection.headerLine);
146
+ const merged = mergeDependencySections(oursSection.entries, theirsSection.entries);
147
+ for (const e of merged)
148
+ result.push(e.raw);
149
+ theirsIndex.delete(header);
150
+ continue;
151
+ }
152
+ // Section inconnue : si les contenus sont identiques → inclure ours
153
+ if (oursSection.raw.join("\n") === theirsSection.raw.join("\n")) {
154
+ result.push(...oursSection.raw);
155
+ theirsIndex.delete(header);
156
+ }
157
+ else {
158
+ // Conflit sur une section non reconnue → fallback
159
+ return {
160
+ lines: null,
161
+ reason: `[cargo] Section "${header}" modifiée des deux côtés — fallback textuel.`,
162
+ };
163
+ }
164
+ }
165
+ // Sections uniquement dans theirs → les ajouter
166
+ for (const [, s] of theirsIndex) {
167
+ result.push(...s.raw);
168
+ }
169
+ return {
170
+ lines: result,
171
+ reason: "Cargo.toml — merge par nom de crate (union des dépendances, prefer-theirs en cas de conflit de version).",
172
+ };
173
+ }
174
+ // ─── Cargo.lock resolver ──────────────────────────────────────
175
+ /**
176
+ * Parse les blocs [[package]] d'un Cargo.lock.
177
+ * Chaque bloc est indexé par "name@version".
178
+ */
179
+ function parseCargoLockPackages(lines) {
180
+ const packages = new Map();
181
+ let currentBlock = null;
182
+ let currentKey = null;
183
+ for (const line of lines) {
184
+ if (line.trim() === "[[package]]") {
185
+ if (currentKey && currentBlock) {
186
+ packages.set(currentKey, currentBlock);
187
+ }
188
+ currentBlock = [line];
189
+ currentKey = null;
190
+ continue;
191
+ }
192
+ if (currentBlock !== null) {
193
+ currentBlock.push(line);
194
+ // Extraire name + version pour construire la clé
195
+ if (!currentKey) {
196
+ const nameMatch = line.match(/^name\s*=\s*"([^"]+)"/);
197
+ if (nameMatch) {
198
+ const prevVersion = currentBlock.find((l) => /^version\s*=/.test(l));
199
+ if (prevVersion) {
200
+ const v = prevVersion.match(/"([^"]+)"/)?.[1] ?? "?";
201
+ currentKey = `${nameMatch[1]}@${v}`;
202
+ }
203
+ else {
204
+ // Version pas encore vue — on la cherchera à la prochaine ligne
205
+ }
206
+ }
207
+ const versionMatch = line.match(/^version\s*=\s*"([^"]+)"/);
208
+ if (versionMatch) {
209
+ const prevName = currentBlock.find((l) => /^name\s*=/.test(l));
210
+ if (prevName) {
211
+ const n = prevName.match(/"([^"]+)"/)?.[1] ?? "?";
212
+ currentKey = `${n}@${versionMatch[1]}`;
213
+ }
214
+ }
215
+ }
216
+ }
217
+ }
218
+ if (currentKey && currentBlock) {
219
+ packages.set(currentKey, currentBlock);
220
+ }
221
+ return packages;
222
+ }
223
+ /**
224
+ * Tente de résoudre un conflit dans un fichier Cargo.lock.
225
+ */
226
+ export function tryResolveCargoLockConflict(_baseLines, oursLines, theirsLines) {
227
+ // Header (lignes avant le premier [[package]])
228
+ const extractHeader = (lines) => {
229
+ const idx = lines.findIndex((l) => l.trim() === "[[package]]");
230
+ return idx > 0 ? lines.slice(0, idx) : [];
231
+ };
232
+ const oursHeader = extractHeader(oursLines);
233
+ const theirsHeader = extractHeader(theirsLines);
234
+ // On garde le header de theirs (version de lockfile plus récente)
235
+ const header = theirsHeader.length > 0 ? theirsHeader : oursHeader;
236
+ const oursPackages = parseCargoLockPackages(oursLines);
237
+ const theirsPackages = parseCargoLockPackages(theirsLines);
238
+ // Union par clé, prefer theirs en cas de conflit
239
+ const merged = new Map(oursPackages);
240
+ for (const [key, block] of theirsPackages) {
241
+ merged.set(key, block); // theirs wins
242
+ }
243
+ // Trier les packages par clé (nom alphabétique) pour la stabilité
244
+ const sortedKeys = [...merged.keys()].sort();
245
+ const result = [...header];
246
+ for (const key of sortedKeys) {
247
+ result.push(...merged.get(key));
248
+ result.push(""); // blank line between packages
249
+ }
250
+ return {
251
+ lines: result,
252
+ reason: "Cargo.lock — merge par crate name+version (union, prefer-theirs). Vérification recommandée : `cargo check`.",
253
+ };
254
+ }
255
+ // ─── Dispatcher ──────────────────────────────────────────────
256
+ export function tryResolveCargoConflict(filePath, baseLines, oursLines, theirsLines) {
257
+ if (/Cargo\.lock$/i.test(filePath)) {
258
+ return tryResolveCargoLockConflict(baseLines, oursLines, theirsLines);
259
+ }
260
+ return tryResolveCargoTomlConflict(baseLines, oursLines, theirsLines);
261
+ }
262
+ //# sourceMappingURL=cargo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cargo.js","sourceRoot":"","sources":["../../src/resolvers/cargo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * GitWand — Résolveur CSS/SCSS/Less
3
+ *
4
+ * Résout les conflits dans les fichiers CSS, SCSS et Less en analysant
5
+ * la structure des règles (sélecteur + bloc de propriétés) et en fusionnant
6
+ * règle par règle.
7
+ *
8
+ * Stratégie :
9
+ * 1. Parser les trois versions en "règles" CSS : sélecteur + propriétés
10
+ * 2. Pour chaque règle :
11
+ * - Absente de base → ajout (accepter)
12
+ * - Modifiée d'un seul côté → accepter la modification
13
+ * - Same change → accepter
14
+ * - Modifiée des deux côtés → tenter une fusion propriété par propriété
15
+ * - Conflit réel → fallback textuel (null)
16
+ * 3. Reconnaître aussi les at-rules (@media, @keyframes, @import, etc.)
17
+ *
18
+ * Limites :
19
+ * - Les sélecteurs imbriqués SCSS (`.parent { .child { } }`) ne sont pas
20
+ * récursivement fusionnés (traités comme blocs opaques)
21
+ * - Les at-rules avec blocs (@media) : fusion conservative sur le bloc complet
22
+ * - Les variables CSS (--var: value) et SCSS ($var: value) : traitées comme propriétés
23
+ */
24
+ /** Une règle CSS parsée */
25
+ export interface CssRule {
26
+ /** Sélecteur ou at-rule (ex: `.btn`, `@media (max-width: 768px)`) */
27
+ selector: string;
28
+ /** Propriétés : tableau de lignes brutes entre `{` et `}` */
29
+ properties: string[];
30
+ /** Lignes brutes constituant la règle complète */
31
+ rawLines: string[];
32
+ /** Commentaires/blancs précédant la règle */
33
+ leadingComments: string[];
34
+ /** Type de règle */
35
+ kind: "rule" | "at-rule" | "comment" | "blank" | "import";
36
+ }
37
+ /**
38
+ * Parse un tableau de lignes CSS en règles structurées.
39
+ */
40
+ export declare function parseCssRules(lines: string[]): CssRule[];
41
+ /** Résultat du merge CSS */
42
+ export interface CssMergeResult {
43
+ /** Lignes fusionnées (null = conflit non résolvable) */
44
+ mergedLines: string[] | null;
45
+ /** Description de la fusion */
46
+ reason: string;
47
+ /** Règles résolues automatiquement */
48
+ resolvedRules: number;
49
+ /** Règles en conflit */
50
+ unresolvedRules: number;
51
+ }
52
+ /**
53
+ * Tente de résoudre un conflit CSS/SCSS en fusionnant règle par règle.
54
+ *
55
+ * @param baseLines - Lignes de la version base
56
+ * @param oursLines - Lignes de la version ours
57
+ * @param theirsLines - Lignes de la version theirs
58
+ */
59
+ export declare function tryResolveCssConflict(baseLines: string[], oursLines: string[], theirsLines: string[]): CssMergeResult;
60
+ //# sourceMappingURL=css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/resolvers/css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,2BAA2B;AAC3B,MAAM,WAAW,OAAO;IACtB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6CAA6C;IAC7C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB;IACpB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;CAC3D;AAWD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CA+FxD;AAID,4BAA4B;AAC5B,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AA+PD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,cAAc,CAmKhB"}