@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,306 @@
1
+ /**
2
+ * Tests des améliorations v1.4 des résolveurs format-aware :
3
+ * - YAML : merge de séquences scalaires de premier niveau
4
+ * - Markdown : merge de listes à puces intra-section
5
+ * - CSS : merge de sélecteurs imbriqués SCSS (un niveau)
6
+ */
7
+ import { describe, it, expect } from "vitest";
8
+ import { resolve } from "../../resolver.js";
9
+ // ─── YAML — séquences scalaires ───────────────────────────────
10
+ describe("YAML v1.4 — merge de séquences scalaires de premier niveau", () => {
11
+ it("union de deux listes scalaires (ours + theirs ajoutent chacun un item)", () => {
12
+ const input = [
13
+ `<<<<<<< ours`,
14
+ `- item-a`,
15
+ `- item-b`,
16
+ `- item-c`,
17
+ `||||||| base`,
18
+ `- item-a`,
19
+ `- item-b`,
20
+ `=======`,
21
+ `- item-a`,
22
+ `- item-b`,
23
+ `- item-d`,
24
+ `>>>>>>> theirs`,
25
+ ].join("\n");
26
+ const result = resolve(input, "config.yaml");
27
+ expect(result.stats.autoResolved).toBe(1);
28
+ const content = result.mergedContent;
29
+ expect(content).toContain("item-c");
30
+ expect(content).toContain("item-d");
31
+ expect(content).toContain("item-a");
32
+ expect(content).toContain("item-b");
33
+ });
34
+ it("one_side_change sur une séquence (theirs = base → prendre ours)", () => {
35
+ const input = [
36
+ `<<<<<<< ours`,
37
+ `- alpha`,
38
+ `- beta`,
39
+ `- gamma`,
40
+ `||||||| base`,
41
+ `- alpha`,
42
+ `- beta`,
43
+ `=======`,
44
+ `- alpha`,
45
+ `- beta`,
46
+ `>>>>>>> theirs`,
47
+ ].join("\n");
48
+ const result = resolve(input, "tags.yml");
49
+ expect(result.stats.autoResolved).toBe(1);
50
+ expect(result.mergedContent).toContain("gamma");
51
+ });
52
+ it("résout les listes diff2 sans base (union heuristique)", () => {
53
+ const input = [
54
+ `<<<<<<< ours`,
55
+ `- red`,
56
+ `- green`,
57
+ `- blue`,
58
+ `=======`,
59
+ `- red`,
60
+ `- green`,
61
+ `- yellow`,
62
+ `>>>>>>> theirs`,
63
+ ].join("\n");
64
+ const result = resolve(input, "colors.yaml");
65
+ expect(result.stats.autoResolved).toBe(1);
66
+ expect(result.mergedContent).toContain("blue");
67
+ expect(result.mergedContent).toContain("yellow");
68
+ });
69
+ it("ne résout pas les listes avec items mappings imbriqués (fallback)", () => {
70
+ const input = [
71
+ `<<<<<<< ours`,
72
+ `- name: foo`,
73
+ ` value: 1`,
74
+ `=======`,
75
+ `- name: bar`,
76
+ ` value: 2`,
77
+ `>>>>>>> theirs`,
78
+ ].join("\n");
79
+ const result = resolve(input, "items.yaml");
80
+ // Nested mapping items → pas scalar → pas résolu par la séquence scalaire path
81
+ // Le résolveur YAML général tentera quand même quelque chose
82
+ // L'important : pas de crash
83
+ expect(result).toBeDefined();
84
+ });
85
+ it("la raison mentionne YAML séquence", () => {
86
+ const input = [
87
+ `<<<<<<< ours`,
88
+ `- a`,
89
+ `- b`,
90
+ `- c`,
91
+ `||||||| base`,
92
+ `- a`,
93
+ `- b`,
94
+ `=======`,
95
+ `- a`,
96
+ `- b`,
97
+ `- d`,
98
+ `>>>>>>> theirs`,
99
+ ].join("\n");
100
+ const result = resolve(input, "list.yaml");
101
+ expect(result.resolutions[0].resolutionReason).toMatch(/yaml/i);
102
+ });
103
+ });
104
+ // ─── Markdown — bullet list merge ────────────────────────────
105
+ describe("Markdown v1.4 — bullet list merge intra-section", () => {
106
+ it("résout quand theirs ajoute un item à une section liste", () => {
107
+ const input = [
108
+ `<<<<<<< ours`,
109
+ `# Features`,
110
+ ``,
111
+ `- feat A`,
112
+ `- feat B`,
113
+ `=======`,
114
+ `# Features`,
115
+ ``,
116
+ `- feat A`,
117
+ `- feat B`,
118
+ `- feat C`,
119
+ `>>>>>>> theirs`,
120
+ ].join("\n");
121
+ const result = resolve(input, "README.md");
122
+ expect(result.stats.autoResolved).toBe(1);
123
+ expect(result.mergedContent).toContain("feat A");
124
+ expect(result.mergedContent).toContain("feat B");
125
+ expect(result.mergedContent).toContain("feat C");
126
+ });
127
+ it("résout quand les deux côtés ajoutent des items distincts", () => {
128
+ const input = [
129
+ `<<<<<<< ours`,
130
+ `## Changelog`,
131
+ ``,
132
+ `- fix: bug A`,
133
+ `- feat: feature X`,
134
+ `=======`,
135
+ `## Changelog`,
136
+ ``,
137
+ `- fix: bug A`,
138
+ `- feat: feature Y`,
139
+ `>>>>>>> theirs`,
140
+ ].join("\n");
141
+ const result = resolve(input, "CHANGELOG.md");
142
+ expect(result.stats.autoResolved).toBe(1);
143
+ const content = result.mergedContent;
144
+ expect(content).toContain("feature X");
145
+ expect(content).toContain("feature Y");
146
+ expect(content).toContain("bug A");
147
+ });
148
+ it("résout le fixture corpus F16 (régression v1.4)", () => {
149
+ const input = [
150
+ `<<<<<<< ours`,
151
+ `# Changelog`,
152
+ ``,
153
+ `## [2.1.0] - 2025-01-15`,
154
+ ``,
155
+ `- feat: new authentication flow`,
156
+ ``,
157
+ `## [2.0.0] - 2024-12-01`,
158
+ ``,
159
+ `- Initial release`,
160
+ `=======`,
161
+ `# Changelog`,
162
+ ``,
163
+ `## [2.1.0] - 2025-01-15`,
164
+ ``,
165
+ `- feat: new authentication flow`,
166
+ `- fix: memory leak in session handler`,
167
+ ``,
168
+ `## [2.0.0] - 2024-12-01`,
169
+ ``,
170
+ `- Initial release`,
171
+ `>>>>>>> theirs`,
172
+ ].join("\n");
173
+ const result = resolve(input, "CHANGELOG.md");
174
+ expect(result.stats.autoResolved).toBe(1);
175
+ expect(result.mergedContent).toContain("new authentication flow");
176
+ expect(result.mergedContent).toContain("memory leak in session handler");
177
+ expect(result.mergedContent).toContain("Initial release");
178
+ });
179
+ it("ne résout pas quand le même item est modifié différemment", () => {
180
+ // Même item de base "- old text", ours le change en "- new text", theirs en "- different text"
181
+ // → pas un ajout pur → pas résolvable par bullet merge simple
182
+ const input = [
183
+ `<<<<<<< ours`,
184
+ `## Notes`,
185
+ ``,
186
+ `- new text`,
187
+ `=======`,
188
+ `## Notes`,
189
+ ``,
190
+ `- different text`,
191
+ `>>>>>>> theirs`,
192
+ ].join("\n");
193
+ // This is a simple bilateral change with no shared items → the bullet merge
194
+ // will still produce a union (one from ours, one from theirs), which is valid
195
+ const result = resolve(input, "notes.md");
196
+ // Either way, no crash
197
+ expect(result).toBeDefined();
198
+ });
199
+ });
200
+ // ─── CSS v1.4 — SCSS one-level nesting ───────────────────────
201
+ describe("CSS v1.4 — SCSS one-level nesting merge", () => {
202
+ it("merge quand ours ajoute un nested selector et theirs n'en ajoute pas", () => {
203
+ const input = [
204
+ `<<<<<<< ours`,
205
+ `.button {`,
206
+ ` color: blue;`,
207
+ ` .icon {`,
208
+ ` size: 16px;`,
209
+ ` }`,
210
+ `}`,
211
+ `||||||| base`,
212
+ `.button {`,
213
+ ` color: blue;`,
214
+ `}`,
215
+ `=======`,
216
+ `.button {`,
217
+ ` color: blue;`,
218
+ ` font-size: 14px;`,
219
+ `}`,
220
+ `>>>>>>> theirs`,
221
+ ].join("\n");
222
+ const result = resolve(input, "buttons.scss");
223
+ expect(result.stats.autoResolved).toBe(1);
224
+ const content = result.mergedContent;
225
+ expect(content).toContain(".icon");
226
+ expect(content).toContain("font-size: 14px");
227
+ expect(content).toContain("color: blue");
228
+ });
229
+ it("merge quand les deux côtés ajoutent des nested selectors distincts", () => {
230
+ const input = [
231
+ `<<<<<<< ours`,
232
+ `.card {`,
233
+ ` padding: 16px;`,
234
+ ` .title {`,
235
+ ` font-size: 20px;`,
236
+ ` }`,
237
+ `}`,
238
+ `=======`,
239
+ `.card {`,
240
+ ` padding: 16px;`,
241
+ ` .body {`,
242
+ ` line-height: 1.5;`,
243
+ ` }`,
244
+ `}`,
245
+ `>>>>>>> theirs`,
246
+ ].join("\n");
247
+ const result = resolve(input, "components.scss");
248
+ expect(result.stats.autoResolved).toBe(1);
249
+ const content = result.mergedContent;
250
+ expect(content).toContain(".title");
251
+ expect(content).toContain("font-size: 20px");
252
+ expect(content).toContain(".body");
253
+ expect(content).toContain("line-height: 1.5");
254
+ });
255
+ it("merge les propriétés du même nested selector si modifiées d'un seul côté", () => {
256
+ const input = [
257
+ `<<<<<<< ours`,
258
+ `.modal {`,
259
+ ` .overlay {`,
260
+ ` background: rgba(0,0,0,0.5);`,
261
+ ` z-index: 100;`,
262
+ ` }`,
263
+ `}`,
264
+ `||||||| base`,
265
+ `.modal {`,
266
+ ` .overlay {`,
267
+ ` background: rgba(0,0,0,0.5);`,
268
+ ` }`,
269
+ `}`,
270
+ `=======`,
271
+ `.modal {`,
272
+ ` .overlay {`,
273
+ ` background: rgba(0,0,0,0.5);`,
274
+ ` }`,
275
+ ` display: flex;`,
276
+ `}`,
277
+ `>>>>>>> theirs`,
278
+ ].join("\n");
279
+ const result = resolve(input, "modal.scss");
280
+ expect(result.stats.autoResolved).toBe(1);
281
+ const content = result.mergedContent;
282
+ expect(content).toContain("z-index: 100");
283
+ expect(content).toContain("display: flex");
284
+ });
285
+ it("ne résout pas si le même nested selector est modifié des deux côtés incompatiblement", () => {
286
+ const input = [
287
+ `<<<<<<< ours`,
288
+ `.nav {`,
289
+ ` .link {`,
290
+ ` color: blue;`,
291
+ ` }`,
292
+ `}`,
293
+ `=======`,
294
+ `.nav {`,
295
+ ` .link {`,
296
+ ` color: red;`,
297
+ ` }`,
298
+ `}`,
299
+ `>>>>>>> theirs`,
300
+ ].join("\n");
301
+ const result = resolve(input, "nav.scss");
302
+ // Both sides changed .link's color → conflict → unresolved
303
+ expect(result.stats.autoResolved).toBe(0);
304
+ });
305
+ });
306
+ //# sourceMappingURL=improvements-v14.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improvements-v14.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/improvements-v14.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests pour la validation post-merge (P2.5 — extension YAML + TOML).
3
+ *
4
+ * Vérifie que `validateMergedContent` applique la bonne stratégie selon
5
+ * l'extension du fichier :
6
+ * - JSON/JSONC → `JSON.parse`
7
+ * - YAML/YML → `yaml.parse`
8
+ * - TOML → `smol-toml.parse`
9
+ * - autres → pas de validation syntaxique
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Tests pour la validation post-merge (P2.5 — extension YAML + TOML).
3
+ *
4
+ * Vérifie que `validateMergedContent` applique la bonne stratégie selon
5
+ * l'extension du fichier :
6
+ * - JSON/JSONC → `JSON.parse`
7
+ * - YAML/YML → `yaml.parse`
8
+ * - TOML → `smol-toml.parse`
9
+ * - autres → pas de validation syntaxique
10
+ */
11
+ import { describe, it, expect } from "vitest";
12
+ import { validateMergedContent } from "../resolver/validation.js";
13
+ // ─── JSON (régression — comportement préexistant) ────────────
14
+ describe("validateMergedContent — JSON", () => {
15
+ it("accepte un JSON valide", () => {
16
+ const result = validateMergedContent('{"a": 1, "b": [1, 2, 3]}', "config.json");
17
+ expect(result.isValid).toBe(true);
18
+ expect(result.syntaxError).toBeNull();
19
+ });
20
+ it("détecte un JSON invalide (trailing comma)", () => {
21
+ const result = validateMergedContent('{"a": 1,}', "config.json");
22
+ expect(result.isValid).toBe(false);
23
+ expect(result.syntaxError).not.toBeNull();
24
+ expect(result.syntaxError).toMatch(/^JSON: /);
25
+ });
26
+ it("applique aussi la validation sur .jsonc", () => {
27
+ // JSON.parse est strict — pas de commentaires autorisés, même pour .jsonc.
28
+ // C'est le comportement préexistant ; P2.5 ne change pas ça.
29
+ const result = validateMergedContent('{\n // comment\n "a": 1\n}', "tsconfig.jsonc");
30
+ expect(result.isValid).toBe(false);
31
+ expect(result.syntaxError).toMatch(/^JSON: /);
32
+ });
33
+ });
34
+ // ─── YAML (P2.5) ───────────────────────────────────────────
35
+ describe("validateMergedContent — YAML", () => {
36
+ it("accepte un YAML valide (.yaml)", () => {
37
+ const yaml = `name: gitwand
38
+ version: 1.4.0
39
+ features:
40
+ - resolver
41
+ - validation
42
+ `;
43
+ const result = validateMergedContent(yaml, "config.yaml");
44
+ expect(result.isValid).toBe(true);
45
+ expect(result.syntaxError).toBeNull();
46
+ });
47
+ it("accepte un YAML valide (.yml)", () => {
48
+ const yaml = `key: value\nlist:\n - a\n - b\n`;
49
+ const result = validateMergedContent(yaml, "ci.yml");
50
+ expect(result.isValid).toBe(true);
51
+ expect(result.syntaxError).toBeNull();
52
+ });
53
+ it("détecte une erreur de syntaxe YAML (indentation incohérente dans un flow)", () => {
54
+ // Un mapping flow mal fermé — le parser échoue dur.
55
+ const broken = `key: { a: 1, b: 2`;
56
+ const result = validateMergedContent(broken, "bad.yaml");
57
+ expect(result.isValid).toBe(false);
58
+ expect(result.syntaxError).not.toBeNull();
59
+ expect(result.syntaxError).toMatch(/^YAML: /);
60
+ });
61
+ it("détecte une tab illégale dans l'indentation (interdit en YAML)", () => {
62
+ const broken = "root:\n\tchild: 1\n";
63
+ const result = validateMergedContent(broken, "tabs.yml");
64
+ expect(result.isValid).toBe(false);
65
+ expect(result.syntaxError).toMatch(/^YAML: /);
66
+ });
67
+ it("un YAML vide reste valide (c'est un document vide)", () => {
68
+ const result = validateMergedContent("", "empty.yaml");
69
+ expect(result.isValid).toBe(true);
70
+ expect(result.syntaxError).toBeNull();
71
+ });
72
+ });
73
+ // ─── TOML (P2.5) ───────────────────────────────────────────
74
+ describe("validateMergedContent — TOML", () => {
75
+ it("accepte un TOML valide", () => {
76
+ const toml = `
77
+ title = "GitWand"
78
+ version = "1.4.0"
79
+
80
+ [package]
81
+ name = "core"
82
+ authors = ["Laurent"]
83
+ `;
84
+ const result = validateMergedContent(toml, "Cargo.toml");
85
+ expect(result.isValid).toBe(true);
86
+ expect(result.syntaxError).toBeNull();
87
+ });
88
+ it("détecte une erreur de syntaxe TOML (table non fermée)", () => {
89
+ const broken = `[package\nname = "x"\n`;
90
+ const result = validateMergedContent(broken, "Cargo.toml");
91
+ expect(result.isValid).toBe(false);
92
+ expect(result.syntaxError).not.toBeNull();
93
+ expect(result.syntaxError).toMatch(/^TOML: /);
94
+ });
95
+ it("détecte une clé dupliquée (interdit par la spec TOML)", () => {
96
+ const broken = `a = 1\na = 2\n`;
97
+ const result = validateMergedContent(broken, "conf.toml");
98
+ expect(result.isValid).toBe(false);
99
+ expect(result.syntaxError).toMatch(/^TOML: /);
100
+ });
101
+ it("accepte un TOML vide", () => {
102
+ const result = validateMergedContent("", "empty.toml");
103
+ expect(result.isValid).toBe(true);
104
+ expect(result.syntaxError).toBeNull();
105
+ });
106
+ });
107
+ // ─── Fichiers non structurés ───────────────────────────────
108
+ describe("validateMergedContent — autres formats", () => {
109
+ it("ne valide rien pour .ts (contenu JS-like mais pas structuré)", () => {
110
+ const ts = `const x = { a: 1, };\nfunction foo() { return x; }\n`;
111
+ const result = validateMergedContent(ts, "utils.ts");
112
+ expect(result.isValid).toBe(true);
113
+ expect(result.syntaxError).toBeNull();
114
+ });
115
+ it("ne valide rien pour .md", () => {
116
+ const md = `# Title\n\n{ this is not json }\n`;
117
+ const result = validateMergedContent(md, "README.md");
118
+ expect(result.isValid).toBe(true);
119
+ expect(result.syntaxError).toBeNull();
120
+ });
121
+ it("détecte un marqueur résiduel quel que soit le format", () => {
122
+ const withMarker = `line 1\n<<<<<<< ours\nline 2\n`;
123
+ const result = validateMergedContent(withMarker, "any.ts");
124
+ expect(result.isValid).toBe(false);
125
+ expect(result.hasResidualMarkers).toBe(true);
126
+ expect(result.residualMarkerLines).toEqual([2]);
127
+ });
128
+ it("combine marqueur résiduel et erreur de syntaxe (les deux drapeaux levés)", () => {
129
+ const withMarkerAndBadJson = `{\n<<<<<<< ours\n"a": 1,\n}`;
130
+ const result = validateMergedContent(withMarkerAndBadJson, "data.json");
131
+ expect(result.isValid).toBe(false);
132
+ expect(result.hasResidualMarkers).toBe(true);
133
+ expect(result.syntaxError).toMatch(/^JSON: /);
134
+ });
135
+ });
136
+ //# sourceMappingURL=validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * GitWand — Classifier (Pattern Registry)
3
+ *
4
+ * Remplace l'implémentation monolithique de classifyConflict() dans parser.ts.
5
+ * Chaque pattern est un PatternPlugin isolé dans src/patterns/.
6
+ * Le classifier itère les patterns triés par priorité et retourne le premier match.
7
+ *
8
+ * v1.4 : registre pluggable — ajouter un pattern = créer un fichier + l'inscrire ici.
9
+ */
10
+ import type { ClassifyInput, ClassifyResult } from "./types.js";
11
+ /**
12
+ * Classifie un hunk de conflit en itérant sur le registre de patterns.
13
+ *
14
+ * Remplace l'implémentation monolithique de parser.ts (v1.3).
15
+ * Le comportement observable est identique — seule l'organisation interne change.
16
+ *
17
+ * @param hunk - Le hunk brut extrait par parseConflictMarkers()
18
+ * @returns ClassifyResult avec type, confidence, explanation et trace
19
+ */
20
+ export declare function classifyConflict(hunk: ClassifyInput): ClassifyResult;
21
+ //# sourceMappingURL=classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../src/classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAyD,MAAM,YAAY,CAAC;AAwGvH;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CA6BpE"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * GitWand — Classifier (Pattern Registry)
3
+ *
4
+ * Remplace l'implémentation monolithique de classifyConflict() dans parser.ts.
5
+ * Chaque pattern est un PatternPlugin isolé dans src/patterns/.
6
+ * Le classifier itère les patterns triés par priorité et retourne le premier match.
7
+ *
8
+ * v1.4 : registre pluggable — ajouter un pattern = créer un fichier + l'inscrire ici.
9
+ */
10
+ // ─── Imports des patterns ─────────────────────────────────────
11
+ import sameChange from "./patterns/same-change.js";
12
+ import deleteNoChange from "./patterns/delete-no-change.js";
13
+ import oneSideChange from "./patterns/one-side-change.js";
14
+ import nonOverlapping from "./patterns/non-overlapping.js";
15
+ import whitespaceOnly from "./patterns/whitespace-only.js";
16
+ import reorderOnly from "./patterns/reorder-only.js";
17
+ import insertionAtBoundary from "./patterns/insertion-at-boundary.js";
18
+ import valueOnlyChange from "./patterns/value-only-change.js";
19
+ import complex from "./patterns/complex.js";
20
+ // ─── Registre ────────────────────────────────────────────────
21
+ /**
22
+ * Registre ordonné des patterns.
23
+ * L'ordre dans ce tableau n'a pas d'importance — le tri se fait par `priority`.
24
+ * Pour ajouter un pattern : importer le plugin et l'ajouter ici.
25
+ */
26
+ const PATTERNS = [
27
+ sameChange, // priority 10
28
+ deleteNoChange, // priority 20
29
+ oneSideChange, // priority 30
30
+ nonOverlapping, // priority 40
31
+ whitespaceOnly, // priority 50
32
+ reorderOnly, // priority 55 ← v1.4
33
+ insertionAtBoundary, // priority 57 ← v1.4
34
+ valueOnlyChange, // priority 60
35
+ complex, // priority 999 (fallback — detect() always true)
36
+ ];
37
+ // ─── Trace builder ───────────────────────────────────────────
38
+ /**
39
+ * Construit la DecisionTrace en rejouant tous les patterns éligibles.
40
+ * Les patterns non éligibles (filtrés par `requires`) sont ajoutés
41
+ * avec une raison standard "requires diff3/diff2, sauté".
42
+ *
43
+ * @param h - Le hunk classifié
44
+ * @param eligible - Patterns éligibles (filtrés + triés)
45
+ * @param all - Tous les patterns du registre (triés)
46
+ * @param matched - Le pattern qui a matché
47
+ */
48
+ function buildTrace(h, eligible, all, matched) {
49
+ const hasBase = h.baseLines.length > 0;
50
+ const steps = [];
51
+ for (const pattern of all) {
52
+ const isEligible = eligible.includes(pattern);
53
+ if (!isEligible) {
54
+ // Pattern sauté à cause du filtre `requires`
55
+ const skipReason = pattern.requires === "diff3"
56
+ ? `Base (diff3) indisponible — ${pattern.type} requiert diff3, sauté.`
57
+ : `Base présente — ${pattern.type} requiert diff2 (sans base), sauté.`;
58
+ steps.push({ type: pattern.type, passed: false, reason: skipReason });
59
+ continue;
60
+ }
61
+ if (pattern === matched) {
62
+ steps.push({ type: pattern.type, passed: true, reason: pattern.passReason(h) });
63
+ break; // On s'arrête au premier match
64
+ }
65
+ steps.push({ type: pattern.type, passed: false, reason: pattern.failReason(h) });
66
+ }
67
+ return {
68
+ steps,
69
+ selected: matched.type,
70
+ summary: buildSummary(matched.type, h),
71
+ hasBase,
72
+ };
73
+ }
74
+ function buildSummary(type, h) {
75
+ const hasBase = h.baseLines.length > 0;
76
+ switch (type) {
77
+ case "same_change": return "Même modification des deux côtés → résolution triviale.";
78
+ case "delete_no_change": return hasBase
79
+ ? (h.oursLines.length === 0 ? "Ours a supprimé ce bloc, theirs est resté identique à la base." : "Theirs a supprimé ce bloc, ours est resté identique à la base.")
80
+ : (h.oursLines.length === 0 ? "Ours a supprimé ce bloc (diff2 — sans base, confiance moyenne)." : "Theirs a supprimé ce bloc (diff2 — sans base, confiance moyenne).");
81
+ case "one_side_change": return h.oursLines.join("\n") === h.baseLines.join("\n")
82
+ ? "Seul theirs a modifié ce bloc — résolution : accepter theirs."
83
+ : "Seul ours a modifié ce bloc — résolution : accepter ours.";
84
+ case "non_overlapping": return "Modifications non-overlapping — fusion automatique par LCS 3-way.";
85
+ case "whitespace_only": return "Même code, whitespace différent — résolution : préférer ours.";
86
+ case "reorder_only": return "Mêmes lignes, ordre différent — résolution : accepter l'ordre theirs.";
87
+ case "insertion_at_boundary": return "Insertions pures des deux côtés — résolution par union.";
88
+ case "value_only_change": return "Même structure, valeur(s) volatile(s) différente(s) — résolution : accepter theirs.";
89
+ case "complex": return "Conflit complexe — toutes les heuristiques automatiques ont échoué.";
90
+ default: return `Type détecté : ${type}.`;
91
+ }
92
+ }
93
+ // ─── classifyConflict ─────────────────────────────────────────
94
+ /**
95
+ * Classifie un hunk de conflit en itérant sur le registre de patterns.
96
+ *
97
+ * Remplace l'implémentation monolithique de parser.ts (v1.3).
98
+ * Le comportement observable est identique — seule l'organisation interne change.
99
+ *
100
+ * @param hunk - Le hunk brut extrait par parseConflictMarkers()
101
+ * @returns ClassifyResult avec type, confidence, explanation et trace
102
+ */
103
+ export function classifyConflict(hunk) {
104
+ const hasBase = hunk.baseLines.length > 0;
105
+ // Filtrer par `requires` + trier par priorité
106
+ const eligible = PATTERNS
107
+ .filter((p) => p.requires === "both" ||
108
+ (p.requires === "diff3" && hasBase) ||
109
+ (p.requires === "diff2" && !hasBase))
110
+ .sort((a, b) => a.priority - b.priority);
111
+ // Trier tous les patterns pour la trace (ordre global)
112
+ const allSorted = [...PATTERNS].sort((a, b) => a.priority - b.priority);
113
+ for (const pattern of eligible) {
114
+ if (pattern.detect(hunk)) {
115
+ const trace = buildTrace(hunk, eligible, allSorted, pattern);
116
+ return {
117
+ type: pattern.type,
118
+ confidence: pattern.confidence(hunk),
119
+ explanation: pattern.explanation(hunk),
120
+ trace,
121
+ };
122
+ }
123
+ }
124
+ // Unreachable — complex.detect() always returns true
125
+ throw new Error("[GitWand] classifyConflict: aucun pattern n'a matché (complex manquant ?)");
126
+ }
127
+ //# sourceMappingURL=classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../src/classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,iEAAiE;AAEjE,OAAO,UAAU,MAAe,2BAA2B,CAAC;AAC5D,OAAO,cAAc,MAAW,gCAAgC,CAAC;AACjE,OAAO,aAAa,MAAY,+BAA+B,CAAC;AAChE,OAAO,cAAc,MAAW,+BAA+B,CAAC;AAChE,OAAO,cAAc,MAAW,+BAA+B,CAAC;AAChE,OAAO,WAAW,MAAmB,4BAA4B,CAAC;AAClE,OAAO,mBAAmB,MAAW,qCAAqC,CAAC;AAC3E,OAAO,eAAe,MAAe,iCAAiC,CAAC;AACvE,OAAO,OAAO,MAAkB,uBAAuB,CAAC;AAExD,gEAAgE;AAEhE;;;;GAIG;AACH,MAAM,QAAQ,GAAoB;IAChC,UAAU,EAAY,cAAc;IACpC,cAAc,EAAQ,cAAc;IACpC,aAAa,EAAS,cAAc;IACpC,cAAc,EAAQ,cAAc;IACpC,cAAc,EAAQ,cAAc;IACpC,WAAW,EAAW,sBAAsB;IAC5C,mBAAmB,EAAG,sBAAsB;IAC5C,eAAe,EAAO,cAAc;IACpC,OAAO,EAAe,iDAAiD;CACxE,CAAC;AAEF,gEAAgE;AAEhE;;;;;;;;;GASG;AACH,SAAS,UAAU,CACjB,CAAgB,EAChB,QAAyB,EACzB,GAAoB,EACpB,OAAsB;IAEtB,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE9C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,6CAA6C;YAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC7C,CAAC,CAAC,+BAA+B,OAAO,CAAC,IAAI,yBAAyB;gBACtE,CAAC,CAAC,mBAAmB,OAAO,CAAC,IAAI,qCAAqC,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACtE,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChF,MAAM,CAAC,+BAA+B;QACxC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,IAAI;QACtB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAkB,EAAE,CAAgB;IACxD,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa,CAAC,CAAU,OAAO,yDAAyD,CAAC;QAC9F,KAAK,kBAAkB,CAAC,CAAK,OAAO,OAAO;YACzC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,gEAAgE,CAAC,CAAC,CAAC,gEAAgE,CAAC;YAClK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,mEAAmE,CAAC,CAAC;QACzK,KAAK,iBAAiB,CAAC,CAAM,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YACnF,CAAC,CAAC,+DAA+D;YACjE,CAAC,CAAC,2DAA2D,CAAC;QAChE,KAAK,iBAAiB,CAAC,CAAM,OAAO,mEAAmE,CAAC;QACxG,KAAK,iBAAiB,CAAC,CAAM,OAAO,+DAA+D,CAAC;QACpG,KAAK,cAAc,CAAC,CAAS,OAAO,uEAAuE,CAAC;QAC5G,KAAK,uBAAuB,CAAC,CAAC,OAAO,yDAAyD,CAAC;QAC/F,KAAK,mBAAmB,CAAC,CAAI,OAAO,qFAAqF,CAAC;QAC1H,KAAK,SAAS,CAAC,CAAc,OAAO,qEAAqE,CAAC;QAC1G,OAAO,CAAC,CAAqB,OAAO,kBAAkB,IAAI,GAAG,CAAC;IAChE,CAAC;AACH,CAAC;AAED,iEAAiE;AAEjE;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAmB;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAE1C,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,QAAQ;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACZ,CAAC,CAAC,QAAQ,KAAK,MAAM;QACrB,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC;QACnC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,CACrC;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE3C,uDAAuD;IACvD,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAExE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7D,OAAO;gBACL,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;gBACpC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACtC,KAAK;aACN,CAAC;QACJ,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;AAC/F,CAAC"}