@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,513 @@
1
+ /**
2
+ * GitWand — Résolveur d'imports TS/JS/TSX/JSX
3
+ *
4
+ * Résout les conflits dans les blocs d'imports ES/CommonJS/dynamic.
5
+ * C'est l'un des types de conflits les plus courants en pratique : deux branches
6
+ * ajoutent des imports différents en tête de fichier.
7
+ *
8
+ * Stratégie :
9
+ * 1. Vérifier que le bloc de conflit est entièrement composé d'imports
10
+ * (+ lignes vides et commentaires — tolérés)
11
+ * 2. Parser les imports des trois versions en statements normalisés
12
+ * 3. Calculer l'union : imports de base + delta ours + delta theirs
13
+ * 4. Si les deltas sont non-conflictuels → produire le bloc fusionné, trié
14
+ * 5. Si conflit (même module importé différemment des deux côtés) → null (fallback)
15
+ *
16
+ * Formats supportés :
17
+ * - `import X from 'y'`
18
+ * - `import { X, Y } from 'y'`
19
+ * - `import * as X from 'y'`
20
+ * - `import 'y'` (side-effect import)
21
+ * - `import type { X } from 'y'` (TypeScript)
22
+ * - `const X = require('y')` (CommonJS — détecté mais pas déstructuré)
23
+ * - `export { X } from 'y'` (re-exports)
24
+ */
25
+ // ─── Patterns de détection ────────────────────────────────
26
+ // import ... from 'module' ou "module"
27
+ const RE_IMPORT_FROM = /^import\s+(type\s+)?(.+?)\s+from\s+['"](.+?)['"]\s*;?\s*$/;
28
+ // import 'module' (side-effect)
29
+ const RE_IMPORT_SIDE = /^import\s+['"](.+?)['"]\s*;?\s*$/;
30
+ // const X = require('module')
31
+ const RE_REQUIRE = /^(?:const|let|var)\s+\S.+?=\s*require\s*\(['"](.+?)['"]\)/;
32
+ // export { X } from 'module'
33
+ const RE_EXPORT_FROM = /^export\s+(?:type\s+)?(?:[\w{*,\s]+)\s+from\s+['"](.+?)['"]\s*;?\s*$/;
34
+ // import * as X from 'module'
35
+ const RE_NAMESPACE = /^\*\s+as\s+\w+$/;
36
+ // { X, Y } or { X as Y }
37
+ const RE_NAMED_BLOCK = /^\{([^}]*)\}$/;
38
+ /**
39
+ * Vérifie si une ligne est un import (ou commentaire/blanc tolérés dans un bloc d'imports).
40
+ */
41
+ function isImportLike(line) {
42
+ const t = line.trim();
43
+ return (t === "" ||
44
+ t.startsWith("//") ||
45
+ t.startsWith("/*") ||
46
+ t.startsWith("*") ||
47
+ t.startsWith("*/") ||
48
+ /^import\s/.test(t) ||
49
+ /^export\s+(?:type\s+)?(?:\{|\*|[\w]+)\s+from\s/.test(t) ||
50
+ /^(?:const|let|var)\s+\S.+?=\s*require\s*\(/.test(t));
51
+ }
52
+ /**
53
+ * Vérifie que toutes les lignes d'un bloc sont des imports/commentaires.
54
+ */
55
+ export function isImportBlock(lines) {
56
+ return lines.every(isImportLike);
57
+ }
58
+ /**
59
+ * Parse une ligne d'import en `ImportStatement`.
60
+ */
61
+ function parseImport(line) {
62
+ const t = line.trim();
63
+ // Side-effect import
64
+ const sideMatch = t.match(RE_IMPORT_SIDE);
65
+ if (sideMatch) {
66
+ return { raw: t, source: sideMatch[1], kind: "side-effect", names: [], isType: false };
67
+ }
68
+ // Named / default / namespace import
69
+ const fromMatch = t.match(RE_IMPORT_FROM);
70
+ if (fromMatch) {
71
+ const isType = Boolean(fromMatch[1]);
72
+ const specifier = fromMatch[2].trim();
73
+ const source = fromMatch[3];
74
+ if (RE_NAMESPACE.test(specifier)) {
75
+ const alias = specifier.replace(/^\*\s+as\s+/, "");
76
+ return { raw: t, source, kind: "namespace", names: [alias], isType };
77
+ }
78
+ const namedMatch = specifier.match(RE_NAMED_BLOCK);
79
+ if (namedMatch) {
80
+ const names = namedMatch[1]
81
+ .split(",")
82
+ .map((s) => s.trim())
83
+ .filter(Boolean);
84
+ return { raw: t, source, kind: "named", names, isType };
85
+ }
86
+ // Default import (possibly with named: `import X, { Y }`)
87
+ return { raw: t, source, kind: "default", names: [specifier], isType };
88
+ }
89
+ // Re-export
90
+ const exportMatch = t.match(RE_EXPORT_FROM);
91
+ if (exportMatch) {
92
+ return { raw: t, source: exportMatch[1], kind: "export", names: [], isType: false };
93
+ }
94
+ // CommonJS require
95
+ const requireMatch = t.match(RE_REQUIRE);
96
+ if (requireMatch) {
97
+ return { raw: t, source: requireMatch[1], kind: "require", names: [], isType: false };
98
+ }
99
+ // Fallback : inconnu (commentaire, blank, multi-line…)
100
+ return { raw: t, source: "", kind: "unknown", names: [], isType: false };
101
+ }
102
+ /**
103
+ * Clé d'identification d'un import : source + kind + isType.
104
+ * Deux imports avec la même clé portent sur le même module de la même façon.
105
+ */
106
+ function importKey(stmt) {
107
+ return `${stmt.kind}:${stmt.source}:${stmt.isType ? "type" : "value"}`;
108
+ }
109
+ /**
110
+ * Agrège les imports named multiples du même module en un seul import combiné.
111
+ * Ex : [`import { useState } from 'react'`, `import { useEffect } from 'react'`]
112
+ * → [`import { useEffect, useState } from 'react'`]
113
+ *
114
+ * Cela résout le problème des Map keys en double quand plusieurs imports
115
+ * du même module existent dans une version.
116
+ */
117
+ function aggregateNamedImports(stmts) {
118
+ const result = [];
119
+ const namedBySource = new Map();
120
+ for (const stmt of stmts) {
121
+ if (stmt.kind !== "named") {
122
+ result.push(stmt);
123
+ continue;
124
+ }
125
+ const key = `${stmt.source}:${stmt.isType ? "type" : "value"}`;
126
+ const existing = namedBySource.get(key);
127
+ if (existing) {
128
+ // Fusionner les noms
129
+ const merged = new Set([...existing.names, ...stmt.names]);
130
+ const sortedNames = [...merged].sort();
131
+ const indent = existing.raw.match(/^(\s*)/)?.[1] ?? "";
132
+ const semi = existing.raw.endsWith(";") ? ";" : "";
133
+ const typePrefix = existing.isType ? "type " : "";
134
+ const newRaw = `${indent}import ${typePrefix}{ ${sortedNames.join(", ")} } from '${stmt.source}'${semi}`;
135
+ namedBySource.set(key, {
136
+ raw: newRaw,
137
+ source: existing.source,
138
+ kind: "named",
139
+ names: sortedNames,
140
+ isType: existing.isType,
141
+ });
142
+ }
143
+ else {
144
+ namedBySource.set(key, stmt);
145
+ result.push(stmt); // placeholder — sera remplacé plus bas
146
+ }
147
+ }
148
+ // Reconstruire la liste en remplaçant les placeholders
149
+ return result.map((stmt) => {
150
+ if (stmt.kind !== "named")
151
+ return stmt;
152
+ const key = `${stmt.source}:${stmt.isType ? "type" : "value"}`;
153
+ return namedBySource.get(key) ?? stmt;
154
+ });
155
+ }
156
+ /**
157
+ * Fusionne deux ensembles d'imports named du même module.
158
+ * Ex : base={useState}, ours={useState,useEffect}, theirs={useState,useCallback}
159
+ * → merged={useState,useEffect,useCallback}
160
+ *
161
+ * Retourne null si les imports ont des structures incompatibles (conflit sur des noms).
162
+ */
163
+ function mergeNamedImports(base, ours, theirs) {
164
+ if (ours.kind !== "named" || theirs.kind !== "named")
165
+ return null;
166
+ const baseNames = new Set(base?.names ?? []);
167
+ const oursNames = new Set(ours.names);
168
+ const theirsNames = new Set(theirs.names);
169
+ // Calculer les deltas
170
+ const oursAdded = [...oursNames].filter((n) => !baseNames.has(n));
171
+ const theirsAdded = [...theirsNames].filter((n) => !baseNames.has(n));
172
+ const oursRemoved = [...baseNames].filter((n) => !oursNames.has(n));
173
+ const theirsRemoved = [...baseNames].filter((n) => !theirsNames.has(n));
174
+ // Conflit : un côté a supprimé un nom que l'autre a gardé (ou modifié autrement)
175
+ for (const n of oursRemoved) {
176
+ if (!theirsRemoved.includes(n)) {
177
+ // Ours supprime n mais theirs garde n → conflict (can't auto-resolve)
178
+ return null;
179
+ }
180
+ }
181
+ for (const n of theirsRemoved) {
182
+ if (!oursRemoved.includes(n)) {
183
+ // Theirs supprime n mais ours garde n → conflict
184
+ return null;
185
+ }
186
+ }
187
+ // Pas de conflit : union des noms
188
+ const merged = new Set([
189
+ ...[...baseNames].filter((n) => !oursRemoved.includes(n)),
190
+ ...oursAdded,
191
+ ...theirsAdded,
192
+ ]);
193
+ const sortedNames = [...merged].sort();
194
+ const typePrefix = ours.isType ? "type " : "";
195
+ const indent = ours.raw.match(/^(\s*)/)?.[1] ?? "";
196
+ const semi = ours.raw.endsWith(";") ? ";" : "";
197
+ if (sortedNames.length === 0)
198
+ return null; // tous les noms supprimés
199
+ const oneLiner = `${indent}import ${typePrefix}{ ${sortedNames.join(", ")} } from '${ours.source}'${semi}`;
200
+ if (oneLiner.length <= 100 || sortedNames.length <= 3)
201
+ return oneLiner;
202
+ const lines = [
203
+ `${indent}import ${typePrefix}{`,
204
+ ...sortedNames.map((n) => `${indent} ${n},`),
205
+ `${indent}} from '${ours.source}'${semi}`,
206
+ ];
207
+ return lines.join("\n");
208
+ }
209
+ /**
210
+ * Fusionne deux blocs d'imports.
211
+ *
212
+ * @param baseLines - Lignes de la version base (peut être vide pour diff2)
213
+ * @param oursLines - Lignes de la version ours
214
+ * @param theirsLines - Lignes de la version theirs
215
+ */
216
+ export function tryResolveImportConflict(baseLines, oursLines, theirsLines) {
217
+ // Vérifier que les trois blocs sont bien des imports
218
+ if (!isImportBlock(oursLines) || !isImportBlock(theirsLines)) {
219
+ return {
220
+ mergedLines: null,
221
+ reason: "Le bloc contient des lignes qui ne sont pas des imports — fallback textuel.",
222
+ resolvedImports: 0,
223
+ unresolvedImports: 1,
224
+ };
225
+ }
226
+ // Parser les imports de chaque version
227
+ // aggregateNamedImports combine les imports named multiples du même module en un seul,
228
+ // ce qui évite les collisions de Map keys (ex: deux `import { X } from 'react'` séparés).
229
+ const baseImports = aggregateNamedImports(baseLines.map(parseImport).filter((s) => s.kind !== "unknown"));
230
+ const oursImports = aggregateNamedImports(oursLines.map(parseImport).filter((s) => s.kind !== "unknown"));
231
+ const theirsImports = aggregateNamedImports(theirsLines.map(parseImport).filter((s) => s.kind !== "unknown"));
232
+ // Indexer par clé
233
+ const baseMap = new Map(baseImports.map((s) => [importKey(s), s]));
234
+ const oursMap = new Map(oursImports.map((s) => [importKey(s), s]));
235
+ const theirsMap = new Map(theirsImports.map((s) => [importKey(s), s]));
236
+ // Indexer par source (pour détecter les conflits cross-kind : namespace vs default, même source)
237
+ const oursBySource = new Map(oursImports.map((s) => [s.source, s]));
238
+ const theirsBySource = new Map(theirsImports.map((s) => [s.source, s]));
239
+ // Ensemble de toutes les clés
240
+ const allKeys = new Set([...baseMap.keys(), ...oursMap.keys(), ...theirsMap.keys()]);
241
+ const resultLines = [];
242
+ let resolvedImports = 0;
243
+ let unresolvedImports = 0;
244
+ for (const key of allKeys) {
245
+ const base = baseMap.get(key);
246
+ const ours = oursMap.get(key);
247
+ const theirs = theirsMap.get(key);
248
+ // Absent de base → ajout
249
+ if (!base) {
250
+ if (ours && theirs) {
251
+ if (ours.raw === theirs.raw) {
252
+ // Même ajout → garder une fois
253
+ resultLines.push(ours.raw);
254
+ resolvedImports++;
255
+ }
256
+ else if (ours.kind === "named" && theirs.kind === "named") {
257
+ // Named imports du même module ajoutés des deux côtés → merger les noms
258
+ const merged = mergeNamedImports(undefined, ours, theirs);
259
+ if (merged) {
260
+ resultLines.push(...merged.split("\n"));
261
+ resolvedImports++;
262
+ }
263
+ else {
264
+ unresolvedImports++;
265
+ return {
266
+ mergedLines: null,
267
+ reason: `Conflit sur l'import named '${ours.source}' — impossible de fusionner les noms.`,
268
+ resolvedImports,
269
+ unresolvedImports,
270
+ };
271
+ }
272
+ }
273
+ else {
274
+ // Structures incompatibles (ex: default vs namespace) → conflit
275
+ unresolvedImports++;
276
+ return {
277
+ mergedLines: null,
278
+ reason: `Conflit sur l'import '${ours.source}' — types incompatibles (${ours.kind} vs ${theirs.kind}).`,
279
+ resolvedImports,
280
+ unresolvedImports,
281
+ };
282
+ }
283
+ }
284
+ else if (ours) {
285
+ // Vérifier si theirs a un import du même module avec un kind incompatible
286
+ const theirsSameSource = theirsBySource.get(ours.source);
287
+ if (theirsSameSource && theirsSameSource.kind !== ours.kind && ours.kind !== "named") {
288
+ unresolvedImports++;
289
+ return {
290
+ mergedLines: null,
291
+ reason: `Conflit sur l'import '${ours.source}' — types incompatibles (${ours.kind} vs ${theirsSameSource.kind}).`,
292
+ resolvedImports,
293
+ unresolvedImports,
294
+ };
295
+ }
296
+ resultLines.push(ours.raw);
297
+ resolvedImports++;
298
+ }
299
+ else if (theirs) {
300
+ // Vérifier si ours a un import du même module avec un kind incompatible
301
+ const oursSameSource = oursBySource.get(theirs.source);
302
+ if (oursSameSource && oursSameSource.kind !== theirs.kind && theirs.kind !== "named") {
303
+ unresolvedImports++;
304
+ return {
305
+ mergedLines: null,
306
+ reason: `Conflit sur l'import '${theirs.source}' — types incompatibles (${oursSameSource.kind} vs ${theirs.kind}).`,
307
+ resolvedImports,
308
+ unresolvedImports,
309
+ };
310
+ }
311
+ resultLines.push(theirs.raw);
312
+ resolvedImports++;
313
+ }
314
+ continue;
315
+ }
316
+ // Présent dans base
317
+ const oursChanged = ours ? ours.raw !== base.raw : true;
318
+ const theirsChanged = theirs ? theirs.raw !== base.raw : true;
319
+ if (!ours && !theirs) {
320
+ // Supprimé des deux côtés
321
+ resolvedImports++;
322
+ continue;
323
+ }
324
+ if (!ours) {
325
+ if (!theirsChanged) {
326
+ resolvedImports++; // theirs = base, ours supprimé → supprimer
327
+ }
328
+ else {
329
+ unresolvedImports++;
330
+ return {
331
+ mergedLines: null,
332
+ reason: `Conflit sur l'import '${base.source}' — ours l'a supprimé, theirs l'a modifié.`,
333
+ resolvedImports,
334
+ unresolvedImports,
335
+ };
336
+ }
337
+ continue;
338
+ }
339
+ if (!theirs) {
340
+ if (!oursChanged) {
341
+ resolvedImports++; // ours = base, theirs supprimé → supprimer
342
+ }
343
+ else {
344
+ unresolvedImports++;
345
+ return {
346
+ mergedLines: null,
347
+ reason: `Conflit sur l'import '${base.source}' — theirs l'a supprimé, ours l'a modifié.`,
348
+ resolvedImports,
349
+ unresolvedImports,
350
+ };
351
+ }
352
+ continue;
353
+ }
354
+ // Les deux présents
355
+ if (!oursChanged && !theirsChanged) {
356
+ resultLines.push(base.raw);
357
+ resolvedImports++;
358
+ }
359
+ else if (ours.raw === theirs.raw) {
360
+ resultLines.push(ours.raw);
361
+ resolvedImports++;
362
+ }
363
+ else if (!oursChanged) {
364
+ resultLines.push(theirs.raw);
365
+ resolvedImports++;
366
+ }
367
+ else if (!theirsChanged) {
368
+ resultLines.push(ours.raw);
369
+ resolvedImports++;
370
+ }
371
+ else if (ours.kind === "named" && theirs.kind === "named") {
372
+ // Named imports du même module modifiés des deux côtés → merger les noms
373
+ const merged = mergeNamedImports(base, ours, theirs);
374
+ if (merged) {
375
+ resultLines.push(...merged.split("\n"));
376
+ resolvedImports++;
377
+ }
378
+ else {
379
+ unresolvedImports++;
380
+ return {
381
+ mergedLines: null,
382
+ reason: `Conflit sur les named imports '${ours.source}'.`,
383
+ resolvedImports,
384
+ unresolvedImports,
385
+ };
386
+ }
387
+ }
388
+ else {
389
+ unresolvedImports++;
390
+ return {
391
+ mergedLines: null,
392
+ reason: `Conflit sur l'import '${ours.source}' — modifications incompatibles.`,
393
+ resolvedImports,
394
+ unresolvedImports,
395
+ };
396
+ }
397
+ }
398
+ // Trier les imports dans le résultat (ordre source : types first, puis alphabétique)
399
+ const sortedResult = sortImportLines(resultLines);
400
+ return {
401
+ mergedLines: sortedResult,
402
+ reason: `Fusion d'imports réussie : ${resolvedImports} import(s) fusionné(s).`,
403
+ resolvedImports,
404
+ unresolvedImports,
405
+ };
406
+ }
407
+ // ─── Tri des imports ──────────────────────────────────────
408
+ /** Node.js built-in modules (sans le préfixe `node:`) */
409
+ const NODE_BUILTINS = new Set([
410
+ "assert", "async_hooks", "buffer", "child_process", "cluster",
411
+ "console", "constants", "crypto", "dgram", "diagnostics_channel",
412
+ "dns", "domain", "events", "fs", "http", "http2", "https",
413
+ "inspector", "module", "net", "os", "path", "perf_hooks",
414
+ "process", "punycode", "querystring", "readline", "repl",
415
+ "stream", "string_decoder", "sys", "timers", "tls", "trace_events",
416
+ "tty", "url", "util", "v8", "vm", "wasi", "worker_threads", "zlib",
417
+ ]);
418
+ /**
419
+ * Groupes d'imports pour le tri.
420
+ *
421
+ * Groupe 0 : Node built-ins et `node:` prefix
422
+ * Groupe 1 : Packages npm standard (non-scoped)
423
+ * Groupe 2 : Packages npm scoped (@...)
424
+ * Groupe 3 : Alias internes (ex: @/, ~/, #/)
425
+ * Groupe 4 : Chemins relatifs parents (../)
426
+ * Groupe 5 : Chemins relatifs siblings (./)
427
+ * Groupe 6 : Index imports (.)
428
+ */
429
+ function importGroup(source, strategy = "default") {
430
+ if (!source)
431
+ return 7;
432
+ if (strategy === "eslint-import") {
433
+ // Node built-ins
434
+ if (source.startsWith("node:") || NODE_BUILTINS.has(source))
435
+ return 0;
436
+ // External packages
437
+ if (!source.startsWith(".") && !source.startsWith("@/") && !source.startsWith("~/") && !source.startsWith("#/"))
438
+ return 1;
439
+ // Internal aliases
440
+ if (source.startsWith("@/") || source.startsWith("~/") || source.startsWith("#/"))
441
+ return 2;
442
+ // Parent imports
443
+ if (source.startsWith(".."))
444
+ return 3;
445
+ // Sibling imports
446
+ if (source.startsWith("./"))
447
+ return 4;
448
+ // Index
449
+ if (source === ".")
450
+ return 5;
451
+ return 1;
452
+ }
453
+ // Default strategy
454
+ if (source.startsWith("node:") || NODE_BUILTINS.has(source))
455
+ return 0;
456
+ if (source.startsWith("."))
457
+ return 3;
458
+ if (source.startsWith("@/") || source.startsWith("~/") || source.startsWith("#/"))
459
+ return 2;
460
+ if (source.startsWith("@"))
461
+ return 1;
462
+ return 1;
463
+ }
464
+ /**
465
+ * Trie un bloc d'imports selon la stratégie choisie.
466
+ *
467
+ * Supporte l'insertion de lignes vides entre les groupes pour
468
+ * respecter les conventions eslint-plugin-import.
469
+ *
470
+ * @param lines - Lignes d'imports à trier
471
+ * @param strategy - Stratégie de tri (default: "default")
472
+ * @param insertGroupSeparators - Insérer des lignes vides entre groupes (default: false)
473
+ */
474
+ function sortImportLines(lines, strategy = "default", insertGroupSeparators = false) {
475
+ // Séparer les commentaires / blancs des imports réels
476
+ const parsed = lines.map((l) => ({
477
+ line: l,
478
+ stmt: parseImport(l),
479
+ }));
480
+ const comments = parsed.filter((p) => p.stmt.kind === "unknown");
481
+ const imports = parsed.filter((p) => p.stmt.kind !== "unknown");
482
+ // Trier
483
+ imports.sort((a, b) => {
484
+ const ga = importGroup(a.stmt.source, strategy);
485
+ const gb = importGroup(b.stmt.source, strategy);
486
+ if (ga !== gb)
487
+ return ga - gb;
488
+ // type-last : dans un même groupe, les `import type` vont à la fin
489
+ if (strategy === "type-last") {
490
+ if (a.stmt.isType !== b.stmt.isType)
491
+ return a.stmt.isType ? 1 : -1;
492
+ }
493
+ return a.stmt.source.localeCompare(b.stmt.source);
494
+ });
495
+ // Recombiner
496
+ const result = [...comments.map((p) => p.line)];
497
+ if (insertGroupSeparators && imports.length > 0) {
498
+ let lastGroup = importGroup(imports[0].stmt.source, strategy);
499
+ for (const imp of imports) {
500
+ const g = importGroup(imp.stmt.source, strategy);
501
+ if (g !== lastGroup) {
502
+ result.push(""); // ligne vide entre groupes
503
+ lastGroup = g;
504
+ }
505
+ result.push(imp.line);
506
+ }
507
+ }
508
+ else {
509
+ result.push(...imports.map((p) => p.line));
510
+ }
511
+ return result;
512
+ }
513
+ //# sourceMappingURL=imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/resolvers/imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAkBH,6DAA6D;AAE7D,uCAAuC;AACvC,MAAM,cAAc,GAAM,2DAA2D,CAAC;AACtF,gCAAgC;AAChC,MAAM,cAAc,GAAM,kCAAkC,CAAC;AAC7D,8BAA8B;AAC9B,MAAM,UAAU,GAAU,2DAA2D,CAAC;AACtF,6BAA6B;AAC7B,MAAM,cAAc,GAAM,sEAAsE,CAAC;AACjG,8BAA8B;AAC9B,MAAM,YAAY,GAAQ,iBAAiB,CAAC;AAC5C,yBAAyB;AACzB,MAAM,cAAc,GAAM,eAAe,CAAC;AAE1C;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,CACL,CAAC,KAAK,EAAE;QACR,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAClB,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAClB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QACjB,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAClB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACnB,gDAAgD,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,4CAA4C,CAAC,IAAI,CAAC,CAAC,CAAC,CACrD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAe;IAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEtB,qBAAqB;IACrB,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACzF,CAAC;IAED,qCAAqC;IACrC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAE5B,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACnD,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACvE,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;iBACxB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC1D,CAAC;QAED,0DAA0D;QAC1D,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACzE,CAAC;IAED,YAAY;IACZ,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACtF,CAAC;IAED,mBAAmB;IACnB,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACxF,CAAC;IAED,uDAAuD;IACvD,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3E,CAAC;AAgBD;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAqB;IACtC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACzE,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAAC,KAAwB;IACrD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,qBAAqB;YACrB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3D,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,GAAG,MAAM,UAAU,UAAU,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YACzG,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE;gBACrB,GAAG,EAAE,MAAM;gBACX,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,uCAAuC;QAC5D,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/D,OAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CACxB,IAAiC,EACjC,IAAqB,EACrB,MAAuB;IAEvB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAElE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1C,sBAAsB;IACtB,MAAM,SAAS,GAAM,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,WAAW,GAAI,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,WAAW,GAAI,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAExE,iFAAiF;IACjF,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,sEAAsE;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,iDAAiD;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;QACrB,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzD,GAAG,SAAS;QACZ,GAAG,WAAW;KACf,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,0BAA0B;IAErE,MAAM,QAAQ,GAAG,GAAG,MAAM,UAAU,UAAU,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;IAC3G,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEvE,MAAM,KAAK,GAAG;QACZ,GAAG,MAAM,UAAU,UAAU,GAAG;QAChC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC;QAC7C,GAAG,MAAM,WAAW,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;KAC1C,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAmB,EACnB,SAAmB,EACnB,WAAqB;IAErB,qDAAqD;IACrD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7D,OAAO;YACL,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,6EAA6E;YACrF,eAAe,EAAE,CAAC;YAClB,iBAAiB,EAAE,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,uFAAuF;IACvF,0FAA0F;IAC1F,MAAM,WAAW,GAAK,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC;IAC5G,MAAM,WAAW,GAAK,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC;IAC5G,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC;IAE9G,kBAAkB;IAClB,MAAM,OAAO,GAAK,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,OAAO,GAAK,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvE,iGAAiG;IACjG,MAAM,YAAY,GAAK,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAExE,8BAA8B;IAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAErF,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,yBAAyB;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;gBACnB,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;oBAC5B,+BAA+B;oBAC/B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC3B,eAAe,EAAE,CAAC;gBACpB,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC5D,wEAAwE;oBACxE,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC1D,IAAI,MAAM,EAAE,CAAC;wBACX,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACxC,eAAe,EAAE,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACN,iBAAiB,EAAE,CAAC;wBACpB,OAAO;4BACL,WAAW,EAAE,IAAI;4BACjB,MAAM,EAAE,+BAA+B,IAAI,CAAC,MAAM,uCAAuC;4BACzF,eAAe;4BACf,iBAAiB;yBAClB,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,gEAAgE;oBAChE,iBAAiB,EAAE,CAAC;oBACpB,OAAO;wBACL,WAAW,EAAE,IAAI;wBACjB,MAAM,EAAE,yBAAyB,IAAI,CAAC,MAAM,4BAA4B,IAAI,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,IAAI;wBACvG,eAAe;wBACf,iBAAiB;qBAClB,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,EAAE,CAAC;gBAChB,0EAA0E;gBAC1E,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzD,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACrF,iBAAiB,EAAE,CAAC;oBACpB,OAAO;wBACL,WAAW,EAAE,IAAI;wBACjB,MAAM,EAAE,yBAAyB,IAAI,CAAC,MAAM,4BAA4B,IAAI,CAAC,IAAI,OAAO,gBAAgB,CAAC,IAAI,IAAI;wBACjH,eAAe;wBACf,iBAAiB;qBAClB,CAAC;gBACJ,CAAC;gBACD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3B,eAAe,EAAE,CAAC;YACpB,CAAC;iBAAM,IAAI,MAAM,EAAE,CAAC;gBAClB,wEAAwE;gBACxE,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACvD,IAAI,cAAc,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACrF,iBAAiB,EAAE,CAAC;oBACpB,OAAO;wBACL,WAAW,EAAE,IAAI;wBACjB,MAAM,EAAE,yBAAyB,MAAM,CAAC,MAAM,4BAA4B,cAAc,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,IAAI;wBACnH,eAAe;wBACf,iBAAiB;qBAClB,CAAC;gBACJ,CAAC;gBACD,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7B,eAAe,EAAE,CAAC;YACpB,CAAC;YACD,SAAS;QACX,CAAC;QAED,oBAAoB;QACpB,MAAM,WAAW,GAAK,IAAI,CAAG,CAAC,CAAC,IAAI,CAAC,GAAG,KAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAE9D,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,0BAA0B;YAC1B,eAAe,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,eAAe,EAAE,CAAC,CAAC,2CAA2C;YAChE,CAAC;iBAAM,CAAC;gBACN,iBAAiB,EAAE,CAAC;gBACpB,OAAO;oBACL,WAAW,EAAE,IAAI;oBACjB,MAAM,EAAE,yBAAyB,IAAI,CAAC,MAAM,4CAA4C;oBACxF,eAAe;oBACf,iBAAiB;iBAClB,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,eAAe,EAAE,CAAC,CAAC,2CAA2C;YAChE,CAAC;iBAAM,CAAC;gBACN,iBAAiB,EAAE,CAAC;gBACpB,OAAO;oBACL,WAAW,EAAE,IAAI;oBACjB,MAAM,EAAE,yBAAyB,IAAI,CAAC,MAAM,4CAA4C;oBACxF,eAAe;oBACf,iBAAiB;iBAClB,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,eAAe,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;YACnC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,eAAe,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACxB,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,eAAe,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,eAAe,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5D,yEAAyE;YACzE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,MAAM,EAAE,CAAC;gBACX,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACxC,eAAe,EAAE,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,iBAAiB,EAAE,CAAC;gBACpB,OAAO;oBACL,WAAW,EAAE,IAAI;oBACjB,MAAM,EAAE,kCAAkC,IAAI,CAAC,MAAM,IAAI;oBACzD,eAAe;oBACf,iBAAiB;iBAClB,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,iBAAiB,EAAE,CAAC;YACpB,OAAO;gBACL,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,yBAAyB,IAAI,CAAC,MAAM,kCAAkC;gBAC9E,eAAe;gBACf,iBAAiB;aAClB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAElD,OAAO;QACL,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,8BAA8B,eAAe,yBAAyB;QAC9E,eAAe;QACf,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED,6DAA6D;AAE7D,yDAAyD;AACzD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS;IAC7D,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB;IAChE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IACzD,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY;IACxD,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM;IACxD,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc;IAClE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;CACnE,CAAC,CAAC;AAQH;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CAAC,MAAc,EAAE,WAA+B,SAAS;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAEtB,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;QACjC,iBAAiB;QACjB,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,CAAC;QACtE,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QAC1H,mBAAmB;QACnB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QAC5F,iBAAiB;QACjB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QACtC,kBAAkB;QAClB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QACtC,QAAQ;QACR,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,mBAAmB;IACnB,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5F,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CACtB,KAAe,EACf,WAA+B,SAAS,EACxC,wBAAiC,KAAK;IAEtC,sDAAsD;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;KACrB,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACjE,MAAM,OAAO,GAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAEjE,QAAQ;IACR,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAE9B,mEAAmE;QACnE,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,aAAa;IACb,MAAM,MAAM,GAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1D,IAAI,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B;gBAC5C,SAAS,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * GitWand — Résolveur JSON/JSONC sémantique
3
+ *
4
+ * Résout les conflits dans les fichiers JSON et JSONC en parsant
5
+ * les trois versions (base, ours, theirs) et en effectuant une
6
+ * fusion au niveau des clés plutôt que des lignes.
7
+ *
8
+ * Stratégie :
9
+ * 1. Tenter de parser les trois versions comme JSON (strip de commentaires JSONC)
10
+ * 2. Calculer les deltas clé-par-clé (récursif sur les objets)
11
+ * 3. Si tous les conflits de clés sont trivialement résolvables → merge
12
+ * 4. Sinon → retourner null (fallback textuel dans resolver.ts)
13
+ *
14
+ * Cas gérés :
15
+ * - Clé ajoutée des deux côtés avec valeurs différentes → conflit non résolvable
16
+ * - Clé ajoutée d'un seul côté → accepter l'ajout
17
+ * - Clé supprimée d'un seul côté, pas modifiée de l'autre → supprimer
18
+ * - Clé modifiée des deux côtés de la même façon → prendre la valeur
19
+ * - Clé modifiée des deux côtés différemment → conflit non résolvable
20
+ * - Merge récursif pour les objets imbriqués
21
+ */
22
+ /** Résultat d'une fusion JSON */
23
+ export interface JsonMergeResult {
24
+ /** Valeur fusionnée (null = conflit non résolvable) */
25
+ merged: unknown | null;
26
+ /** Description de la fusion effectuée */
27
+ reason: string;
28
+ /** Nombre de conflits résolus automatiquement */
29
+ resolvedKeys: number;
30
+ /** Nombre de conflits non résolvables */
31
+ unresolvedKeys: number;
32
+ }
33
+ /**
34
+ * Supprime les commentaires // et /* *\/ d'un fichier JSONC.
35
+ * Assez robuste pour les cas courants (config files).
36
+ */
37
+ export declare function stripJsoncComments(text: string): string;
38
+ /**
39
+ * Tente de résoudre un conflit JSON en fusionnant sémantiquement
40
+ * les trois versions.
41
+ *
42
+ * @param baseLines - Lignes de la version base
43
+ * @param oursLines - Lignes de la version ours
44
+ * @param theirsLines - Lignes de la version theirs
45
+ * @returns `JsonMergeResult` avec `merged !== null` si résolu, `null` sinon
46
+ */
47
+ export declare function tryResolveJsonConflict(baseLines: string[], oursLines: string[], theirsLines: string[]): JsonMergeResult;
48
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/resolvers/json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsDvD;AA4MD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,eAAe,CAiGjB"}