@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.
- package/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/__tests__/bench.bench.d.ts +14 -0
- package/dist/__tests__/bench.bench.d.ts.map +1 -0
- package/dist/__tests__/bench.bench.js +137 -0
- package/dist/__tests__/bench.bench.js.map +1 -0
- package/dist/__tests__/confidence-v14.test.d.ts +13 -0
- package/dist/__tests__/confidence-v14.test.d.ts.map +1 -0
- package/dist/__tests__/confidence-v14.test.js +284 -0
- package/dist/__tests__/confidence-v14.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +317 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/corpus.d.ts +36 -0
- package/dist/__tests__/corpus.d.ts.map +1 -0
- package/dist/__tests__/corpus.js +541 -0
- package/dist/__tests__/corpus.js.map +1 -0
- package/dist/__tests__/corpus.test.d.ts +17 -0
- package/dist/__tests__/corpus.test.d.ts.map +1 -0
- package/dist/__tests__/corpus.test.js +179 -0
- package/dist/__tests__/corpus.test.js.map +1 -0
- package/dist/__tests__/diff.test.d.ts +10 -0
- package/dist/__tests__/diff.test.d.ts.map +1 -0
- package/dist/__tests__/diff.test.js +178 -0
- package/dist/__tests__/diff.test.js.map +1 -0
- package/dist/__tests__/format-resolvers.test.d.ts +2 -0
- package/dist/__tests__/format-resolvers.test.d.ts.map +1 -0
- package/dist/__tests__/format-resolvers.test.js +577 -0
- package/dist/__tests__/format-resolvers.test.js.map +1 -0
- package/dist/__tests__/imports-extended.test.d.ts +2 -0
- package/dist/__tests__/imports-extended.test.d.ts.map +1 -0
- package/dist/__tests__/imports-extended.test.js +94 -0
- package/dist/__tests__/imports-extended.test.js.map +1 -0
- package/dist/__tests__/lockfile-resolvers.test.d.ts +2 -0
- package/dist/__tests__/lockfile-resolvers.test.d.ts.map +1 -0
- package/dist/__tests__/lockfile-resolvers.test.js +200 -0
- package/dist/__tests__/lockfile-resolvers.test.js.map +1 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts +10 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.js +185 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.js.map +1 -0
- package/dist/__tests__/patterns/reorder-only.test.d.ts +10 -0
- package/dist/__tests__/patterns/reorder-only.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/reorder-only.test.js +181 -0
- package/dist/__tests__/patterns/reorder-only.test.js.map +1 -0
- package/dist/__tests__/phase-7-2-3b.test.d.ts +6 -0
- package/dist/__tests__/phase-7-2-3b.test.d.ts.map +1 -0
- package/dist/__tests__/phase-7-2-3b.test.js +730 -0
- package/dist/__tests__/phase-7-2-3b.test.js.map +1 -0
- package/dist/__tests__/resolver.test.d.ts +2 -0
- package/dist/__tests__/resolver.test.d.ts.map +1 -0
- package/dist/__tests__/resolver.test.js +927 -0
- package/dist/__tests__/resolver.test.js.map +1 -0
- package/dist/__tests__/resolvers/cargo.test.d.ts +10 -0
- package/dist/__tests__/resolvers/cargo.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/cargo.test.js +158 -0
- package/dist/__tests__/resolvers/cargo.test.js.map +1 -0
- package/dist/__tests__/resolvers/dockerfile.test.d.ts +8 -0
- package/dist/__tests__/resolvers/dockerfile.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/dockerfile.test.js +120 -0
- package/dist/__tests__/resolvers/dockerfile.test.js.map +1 -0
- package/dist/__tests__/resolvers/dotenv.test.d.ts +9 -0
- package/dist/__tests__/resolvers/dotenv.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/dotenv.test.js +113 -0
- package/dist/__tests__/resolvers/dotenv.test.js.map +1 -0
- package/dist/__tests__/resolvers/improvements-v14.test.d.ts +8 -0
- package/dist/__tests__/resolvers/improvements-v14.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/improvements-v14.test.js +306 -0
- package/dist/__tests__/resolvers/improvements-v14.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +12 -0
- package/dist/__tests__/validation.test.d.ts.map +1 -0
- package/dist/__tests__/validation.test.js +136 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/classifier.d.ts +21 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +127 -0
- package/dist/classifier.js.map +1 -0
- package/dist/config.d.ts +108 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +200 -0
- package/dist/config.js.map +1 -0
- package/dist/diff.d.ts +69 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +328 -0
- package/dist/diff.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +39 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +164 -0
- package/dist/parser.js.map +1 -0
- package/dist/patterns/complex.d.ts +5 -0
- package/dist/patterns/complex.d.ts.map +1 -0
- package/dist/patterns/complex.js +27 -0
- package/dist/patterns/complex.js.map +1 -0
- package/dist/patterns/delete-no-change.d.ts +4 -0
- package/dist/patterns/delete-no-change.d.ts.map +1 -0
- package/dist/patterns/delete-no-change.js +75 -0
- package/dist/patterns/delete-no-change.js.map +1 -0
- package/dist/patterns/insertion-at-boundary.d.ts +22 -0
- package/dist/patterns/insertion-at-boundary.d.ts.map +1 -0
- package/dist/patterns/insertion-at-boundary.js +164 -0
- package/dist/patterns/insertion-at-boundary.js.map +1 -0
- package/dist/patterns/non-overlapping.d.ts +4 -0
- package/dist/patterns/non-overlapping.d.ts.map +1 -0
- package/dist/patterns/non-overlapping.js +28 -0
- package/dist/patterns/non-overlapping.js.map +1 -0
- package/dist/patterns/one-side-change.d.ts +4 -0
- package/dist/patterns/one-side-change.d.ts.map +1 -0
- package/dist/patterns/one-side-change.js +45 -0
- package/dist/patterns/one-side-change.js.map +1 -0
- package/dist/patterns/reorder-only.d.ts +14 -0
- package/dist/patterns/reorder-only.d.ts.map +1 -0
- package/dist/patterns/reorder-only.js +81 -0
- package/dist/patterns/reorder-only.js.map +1 -0
- package/dist/patterns/same-change.d.ts +4 -0
- package/dist/patterns/same-change.d.ts.map +1 -0
- package/dist/patterns/same-change.js +25 -0
- package/dist/patterns/same-change.js.map +1 -0
- package/dist/patterns/utils.d.ts +70 -0
- package/dist/patterns/utils.d.ts.map +1 -0
- package/dist/patterns/utils.js +206 -0
- package/dist/patterns/utils.js.map +1 -0
- package/dist/patterns/value-only-change.d.ts +4 -0
- package/dist/patterns/value-only-change.d.ts.map +1 -0
- package/dist/patterns/value-only-change.js +34 -0
- package/dist/patterns/value-only-change.js.map +1 -0
- package/dist/patterns/whitespace-only.d.ts +4 -0
- package/dist/patterns/whitespace-only.d.ts.map +1 -0
- package/dist/patterns/whitespace-only.js +32 -0
- package/dist/patterns/whitespace-only.js.map +1 -0
- package/dist/resolver/assemble.d.ts +25 -0
- package/dist/resolver/assemble.d.ts.map +1 -0
- package/dist/resolver/assemble.js +170 -0
- package/dist/resolver/assemble.js.map +1 -0
- package/dist/resolver/format-dispatch.d.ts +40 -0
- package/dist/resolver/format-dispatch.d.ts.map +1 -0
- package/dist/resolver/format-dispatch.js +51 -0
- package/dist/resolver/format-dispatch.js.map +1 -0
- package/dist/resolver/generated-detection.d.ts +48 -0
- package/dist/resolver/generated-detection.d.ts.map +1 -0
- package/dist/resolver/generated-detection.js +123 -0
- package/dist/resolver/generated-detection.js.map +1 -0
- package/dist/resolver/index.d.ts +26 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +147 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/policy.d.ts +53 -0
- package/dist/resolver/policy.d.ts.map +1 -0
- package/dist/resolver/policy.js +99 -0
- package/dist/resolver/policy.js.map +1 -0
- package/dist/resolver/validation.d.ts +28 -0
- package/dist/resolver/validation.d.ts.map +1 -0
- package/dist/resolver/validation.js +96 -0
- package/dist/resolver/validation.js.map +1 -0
- package/dist/resolver.d.ts +18 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +18 -0
- package/dist/resolver.js.map +1 -0
- package/dist/resolvers/cargo.d.ts +34 -0
- package/dist/resolvers/cargo.d.ts.map +1 -0
- package/dist/resolvers/cargo.js +262 -0
- package/dist/resolvers/cargo.js.map +1 -0
- package/dist/resolvers/css.d.ts +60 -0
- package/dist/resolvers/css.d.ts.map +1 -0
- package/dist/resolvers/css.js +531 -0
- package/dist/resolvers/css.js.map +1 -0
- package/dist/resolvers/dispatcher.d.ts +78 -0
- package/dist/resolvers/dispatcher.d.ts.map +1 -0
- package/dist/resolvers/dispatcher.js +290 -0
- package/dist/resolvers/dispatcher.js.map +1 -0
- package/dist/resolvers/dockerfile.d.ts +24 -0
- package/dist/resolvers/dockerfile.d.ts.map +1 -0
- package/dist/resolvers/dockerfile.js +221 -0
- package/dist/resolvers/dockerfile.js.map +1 -0
- package/dist/resolvers/dotenv.d.ts +27 -0
- package/dist/resolvers/dotenv.d.ts.map +1 -0
- package/dist/resolvers/dotenv.js +114 -0
- package/dist/resolvers/dotenv.js.map +1 -0
- package/dist/resolvers/imports.d.ts +63 -0
- package/dist/resolvers/imports.d.ts.map +1 -0
- package/dist/resolvers/imports.js +513 -0
- package/dist/resolvers/imports.js.map +1 -0
- package/dist/resolvers/json.d.ts +48 -0
- package/dist/resolvers/json.d.ts.map +1 -0
- package/dist/resolvers/json.js +363 -0
- package/dist/resolvers/json.js.map +1 -0
- package/dist/resolvers/lockfile-npm.d.ts +38 -0
- package/dist/resolvers/lockfile-npm.d.ts.map +1 -0
- package/dist/resolvers/lockfile-npm.js +267 -0
- package/dist/resolvers/lockfile-npm.js.map +1 -0
- package/dist/resolvers/lockfile-pnpm.d.ts +44 -0
- package/dist/resolvers/lockfile-pnpm.d.ts.map +1 -0
- package/dist/resolvers/lockfile-pnpm.js +277 -0
- package/dist/resolvers/lockfile-pnpm.js.map +1 -0
- package/dist/resolvers/lockfile-yarn.d.ts +40 -0
- package/dist/resolvers/lockfile-yarn.d.ts.map +1 -0
- package/dist/resolvers/lockfile-yarn.js +184 -0
- package/dist/resolvers/lockfile-yarn.js.map +1 -0
- package/dist/resolvers/markdown.d.ts +64 -0
- package/dist/resolvers/markdown.d.ts.map +1 -0
- package/dist/resolvers/markdown.js +335 -0
- package/dist/resolvers/markdown.js.map +1 -0
- package/dist/resolvers/vue.d.ts +65 -0
- package/dist/resolvers/vue.d.ts.map +1 -0
- package/dist/resolvers/vue.js +258 -0
- package/dist/resolvers/vue.js.map +1 -0
- package/dist/resolvers/yaml.d.ts +65 -0
- package/dist/resolvers/yaml.d.ts.map +1 -0
- package/dist/resolvers/yaml.js +405 -0
- package/dist/resolvers/yaml.js.map +1 -0
- package/dist/types.d.ts +256 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,531 @@
|
|
|
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
|
+
// ─── Parser CSS ───────────────────────────────────────────
|
|
25
|
+
const RE_SELECTOR_OPEN = /^([^{]+)\{$/;
|
|
26
|
+
const RE_AT_IMPORT = /^@import\s+/;
|
|
27
|
+
const RE_CLOSE_BRACE = /^\}\s*$/;
|
|
28
|
+
const RE_PROPERTY = /^[\w$\-\-]+[^:]*:\s*.+;?\s*$/;
|
|
29
|
+
const RE_COMMENT_LINE = /^\s*\/[*/]/;
|
|
30
|
+
const RE_BLANK = /^\s*$/;
|
|
31
|
+
/**
|
|
32
|
+
* Parse un tableau de lignes CSS en règles structurées.
|
|
33
|
+
*/
|
|
34
|
+
export function parseCssRules(lines) {
|
|
35
|
+
const rules = [];
|
|
36
|
+
let i = 0;
|
|
37
|
+
while (i < lines.length) {
|
|
38
|
+
const line = lines[i].trim();
|
|
39
|
+
// Lignes vides
|
|
40
|
+
if (RE_BLANK.test(line)) {
|
|
41
|
+
rules.push({
|
|
42
|
+
selector: "",
|
|
43
|
+
properties: [],
|
|
44
|
+
rawLines: [lines[i]],
|
|
45
|
+
leadingComments: [],
|
|
46
|
+
kind: "blank",
|
|
47
|
+
});
|
|
48
|
+
i++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Commentaires sur une ligne (// ou /* ... */)
|
|
52
|
+
if (RE_COMMENT_LINE.test(line)) {
|
|
53
|
+
const commentLines = [];
|
|
54
|
+
// Absorber les lignes de commentaire consécutives
|
|
55
|
+
while (i < lines.length && (RE_COMMENT_LINE.test(lines[i].trim()) || RE_BLANK.test(lines[i].trim()))) {
|
|
56
|
+
commentLines.push(lines[i]);
|
|
57
|
+
i++;
|
|
58
|
+
}
|
|
59
|
+
rules.push({
|
|
60
|
+
selector: "",
|
|
61
|
+
properties: [],
|
|
62
|
+
rawLines: commentLines,
|
|
63
|
+
leadingComments: commentLines,
|
|
64
|
+
kind: "comment",
|
|
65
|
+
});
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// @import (inline, pas de bloc)
|
|
69
|
+
if (RE_AT_IMPORT.test(line)) {
|
|
70
|
+
rules.push({
|
|
71
|
+
selector: line,
|
|
72
|
+
properties: [],
|
|
73
|
+
rawLines: [lines[i]],
|
|
74
|
+
leadingComments: [],
|
|
75
|
+
kind: "import",
|
|
76
|
+
});
|
|
77
|
+
i++;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// Règle avec bloc { }
|
|
81
|
+
const openMatch = line.match(RE_SELECTOR_OPEN);
|
|
82
|
+
if (openMatch) {
|
|
83
|
+
const selector = openMatch[1].trim();
|
|
84
|
+
const rawLines = [lines[i]];
|
|
85
|
+
const properties = [];
|
|
86
|
+
i++;
|
|
87
|
+
let depth = 1;
|
|
88
|
+
while (i < lines.length && depth > 0) {
|
|
89
|
+
const inner = lines[i];
|
|
90
|
+
const trimmed = inner.trim();
|
|
91
|
+
rawLines.push(inner);
|
|
92
|
+
if (trimmed.endsWith("{"))
|
|
93
|
+
depth++;
|
|
94
|
+
else if (RE_CLOSE_BRACE.test(trimmed))
|
|
95
|
+
depth--;
|
|
96
|
+
if (depth > 0)
|
|
97
|
+
properties.push(inner);
|
|
98
|
+
i++;
|
|
99
|
+
}
|
|
100
|
+
const isAtRule = selector.startsWith("@");
|
|
101
|
+
rules.push({
|
|
102
|
+
selector,
|
|
103
|
+
properties,
|
|
104
|
+
rawLines,
|
|
105
|
+
leadingComments: [],
|
|
106
|
+
kind: isAtRule ? "at-rule" : "rule",
|
|
107
|
+
});
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
// Ligne orpheline (propriété hors bloc, variable, etc.)
|
|
111
|
+
rules.push({
|
|
112
|
+
selector: line,
|
|
113
|
+
properties: [],
|
|
114
|
+
rawLines: [lines[i]],
|
|
115
|
+
leadingComments: [],
|
|
116
|
+
kind: "rule",
|
|
117
|
+
});
|
|
118
|
+
i++;
|
|
119
|
+
}
|
|
120
|
+
return rules;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Compare deux tableaux de strings pour égalité.
|
|
124
|
+
*/
|
|
125
|
+
function linesEqual(a, b) {
|
|
126
|
+
return a.length === b.length && a.every((l, i) => l === b[i]);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Vérifie qu'un tableau de lignes de propriétés contient uniquement des
|
|
130
|
+
* déclarations CSS valides (prop: value) ou des commentaires/blancs/règles imbriquées.
|
|
131
|
+
* Retourne false uniquement si une ligne n'est ni une déclaration, ni un commentaire,
|
|
132
|
+
* ni une règle imbriquée (un bloc SCSS `selector { ... }`).
|
|
133
|
+
*/
|
|
134
|
+
function hasValidCssProperties(propLines) {
|
|
135
|
+
let depth = 0;
|
|
136
|
+
for (const line of propLines) {
|
|
137
|
+
const t = line.trim();
|
|
138
|
+
if (!t || RE_COMMENT_LINE.test(t) || RE_BLANK.test(t))
|
|
139
|
+
continue;
|
|
140
|
+
if (t.endsWith("{")) {
|
|
141
|
+
depth++;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (t === "}") {
|
|
145
|
+
depth--;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (depth > 0)
|
|
149
|
+
continue; // Inside a nested block — accepted
|
|
150
|
+
if (!t.includes(":"))
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Vérifie si un bloc de propriétés contient des sélecteurs imbriqués (SCSS).
|
|
157
|
+
*/
|
|
158
|
+
function hasNestedSelectors(propLines) {
|
|
159
|
+
return propLines.some((l) => {
|
|
160
|
+
const t = l.trim();
|
|
161
|
+
return t.endsWith("{") && !t.startsWith("@") && !t.includes(":");
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Découpe les lignes de propriétés en déclarations plates et blocs imbriqués.
|
|
166
|
+
* Supporte un seul niveau de nesting.
|
|
167
|
+
*/
|
|
168
|
+
function splitProperties(propLines) {
|
|
169
|
+
const flatDecls = [];
|
|
170
|
+
const nested = new Map();
|
|
171
|
+
let i = 0;
|
|
172
|
+
while (i < propLines.length) {
|
|
173
|
+
const line = propLines[i];
|
|
174
|
+
const t = line.trim();
|
|
175
|
+
const indent = line.match(/^(\s*)/)?.[1] ?? "";
|
|
176
|
+
// Nested selector block: ` .child {`
|
|
177
|
+
if (t.endsWith("{") && !t.startsWith("@") && !t.includes(":")) {
|
|
178
|
+
const selector = t.slice(0, -1).trim();
|
|
179
|
+
const rawLines = [line];
|
|
180
|
+
const innerLines = [];
|
|
181
|
+
i++;
|
|
182
|
+
let depth = 1;
|
|
183
|
+
while (i < propLines.length && depth > 0) {
|
|
184
|
+
const inner = propLines[i];
|
|
185
|
+
rawLines.push(inner);
|
|
186
|
+
const it = inner.trim();
|
|
187
|
+
if (it.endsWith("{"))
|
|
188
|
+
depth++;
|
|
189
|
+
else if (it === "}") {
|
|
190
|
+
depth--;
|
|
191
|
+
if (depth === 0) {
|
|
192
|
+
i++;
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (depth > 0)
|
|
197
|
+
innerLines.push(inner);
|
|
198
|
+
i++;
|
|
199
|
+
}
|
|
200
|
+
nested.set(selector, { selector, innerLines, rawLines, indent });
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (t)
|
|
204
|
+
flatDecls.push(line);
|
|
205
|
+
i++;
|
|
206
|
+
}
|
|
207
|
+
return { flatDecls, nested };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Fusionne les propriétés CSS avec support pour les sélecteurs imbriqués SCSS (un niveau).
|
|
211
|
+
* Si aucun sélecteur imbriqué n'est détecté, délègue à `mergeCssProperties`.
|
|
212
|
+
*/
|
|
213
|
+
function mergeWithNestedSelectors(base, ours, theirs) {
|
|
214
|
+
if (!hasNestedSelectors(ours) && !hasNestedSelectors(theirs)) {
|
|
215
|
+
return mergeCssProperties(base, ours, theirs);
|
|
216
|
+
}
|
|
217
|
+
const { flatDecls: baseFlat, nested: baseNested } = splitProperties(base);
|
|
218
|
+
const { flatDecls: oursFlat, nested: oursNested } = splitProperties(ours);
|
|
219
|
+
const { flatDecls: theirsFlat, nested: theirsNested } = splitProperties(theirs);
|
|
220
|
+
// Merge flat declarations
|
|
221
|
+
const mergedFlat = mergeCssProperties(baseFlat, oursFlat, theirsFlat);
|
|
222
|
+
if (mergedFlat === null)
|
|
223
|
+
return null;
|
|
224
|
+
// Merge nested blocks by selector (union)
|
|
225
|
+
const mergedNested = [];
|
|
226
|
+
const seen = new Set();
|
|
227
|
+
for (const [sel, oursBlock] of oursNested) {
|
|
228
|
+
seen.add(sel);
|
|
229
|
+
const theirsBlock = theirsNested.get(sel);
|
|
230
|
+
const baseBlock = baseNested.get(sel);
|
|
231
|
+
if (!theirsBlock) {
|
|
232
|
+
mergedNested.push(...oursBlock.rawLines);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
// Both sides have this nested selector
|
|
236
|
+
if (linesEqual(oursBlock.innerLines, theirsBlock.innerLines)) {
|
|
237
|
+
mergedNested.push(...oursBlock.rawLines);
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
// Try to merge the nested block's properties
|
|
241
|
+
const mergedInner = mergeCssProperties(baseBlock?.innerLines ?? [], oursBlock.innerLines, theirsBlock.innerLines);
|
|
242
|
+
if (mergedInner === null)
|
|
243
|
+
return null;
|
|
244
|
+
const ind = oursBlock.indent;
|
|
245
|
+
mergedNested.push(`${ind}${sel} {`);
|
|
246
|
+
mergedNested.push(...mergedInner);
|
|
247
|
+
mergedNested.push(`${ind}}`);
|
|
248
|
+
}
|
|
249
|
+
// Nested selectors only in theirs
|
|
250
|
+
for (const [sel, theirsBlock] of theirsNested) {
|
|
251
|
+
if (!seen.has(sel)) {
|
|
252
|
+
mergedNested.push(...theirsBlock.rawLines);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return [...mergedFlat, ...mergedNested];
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Fusionne deux blocs de propriétés CSS du même sélecteur.
|
|
259
|
+
* Stratégie : union des propriétés. Si une propriété est modifiée des deux côtés
|
|
260
|
+
* avec des valeurs différentes → conflit non résolvable.
|
|
261
|
+
*
|
|
262
|
+
* Retourne null si les propriétés ne sont pas du CSS valide (pas de `:` dans les lignes).
|
|
263
|
+
*/
|
|
264
|
+
function mergeCssProperties(base, ours, theirs) {
|
|
265
|
+
// Validation : rejeter si les propriétés ne ressemblent pas à du CSS
|
|
266
|
+
if (!hasValidCssProperties(ours) || !hasValidCssProperties(theirs)) {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
// Parser les propriétés en Map { prop -> value }
|
|
270
|
+
function parseProps(propLines) {
|
|
271
|
+
const map = new Map();
|
|
272
|
+
for (const line of propLines) {
|
|
273
|
+
const t = line.trim();
|
|
274
|
+
if (!t || RE_COMMENT_LINE.test(t) || RE_BLANK.test(t))
|
|
275
|
+
continue;
|
|
276
|
+
const colon = t.indexOf(":");
|
|
277
|
+
if (colon === -1)
|
|
278
|
+
continue;
|
|
279
|
+
const prop = t.slice(0, colon).trim();
|
|
280
|
+
const val = t.slice(colon + 1).trim().replace(/;$/, "").trim();
|
|
281
|
+
map.set(prop, val);
|
|
282
|
+
}
|
|
283
|
+
return map;
|
|
284
|
+
}
|
|
285
|
+
// Détecter l'indentation du bloc
|
|
286
|
+
const indent = (ours.find((l) => l.trim() && !RE_COMMENT_LINE.test(l.trim())) ?? " ").match(/^(\s*)/)?.[1] ?? " ";
|
|
287
|
+
const baseMap = parseProps(base);
|
|
288
|
+
const oursMap = parseProps(ours);
|
|
289
|
+
const theirsMap = parseProps(theirs);
|
|
290
|
+
// Toutes les propriétés
|
|
291
|
+
const allProps = new Set([...baseMap.keys(), ...oursMap.keys(), ...theirsMap.keys()]);
|
|
292
|
+
const result = [];
|
|
293
|
+
for (const prop of allProps) {
|
|
294
|
+
const baseVal = baseMap.get(prop);
|
|
295
|
+
const oursVal = oursMap.get(prop);
|
|
296
|
+
const theirsVal = theirsMap.get(prop);
|
|
297
|
+
// Absent de base → ajout
|
|
298
|
+
if (baseVal === undefined) {
|
|
299
|
+
if (oursVal !== undefined && theirsVal !== undefined) {
|
|
300
|
+
if (oursVal === theirsVal) {
|
|
301
|
+
result.push(`${indent}${prop}: ${oursVal};`);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
return null; // Conflit
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else if (oursVal !== undefined) {
|
|
308
|
+
result.push(`${indent}${prop}: ${oursVal};`);
|
|
309
|
+
}
|
|
310
|
+
else if (theirsVal !== undefined) {
|
|
311
|
+
result.push(`${indent}${prop}: ${theirsVal};`);
|
|
312
|
+
}
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
// Présent dans base
|
|
316
|
+
const oursChanged = oursVal !== undefined ? oursVal !== baseVal : true;
|
|
317
|
+
const theirsChanged = theirsVal !== undefined ? theirsVal !== baseVal : true;
|
|
318
|
+
if (!oursChanged && !theirsChanged) {
|
|
319
|
+
result.push(`${indent}${prop}: ${baseVal};`);
|
|
320
|
+
}
|
|
321
|
+
else if (oursVal === theirsVal) {
|
|
322
|
+
result.push(`${indent}${prop}: ${oursVal};`);
|
|
323
|
+
}
|
|
324
|
+
else if (!oursChanged) {
|
|
325
|
+
result.push(`${indent}${prop}: ${theirsVal};`);
|
|
326
|
+
}
|
|
327
|
+
else if (!theirsChanged) {
|
|
328
|
+
result.push(`${indent}${prop}: ${oursVal};`);
|
|
329
|
+
}
|
|
330
|
+
else if (oursVal === undefined) {
|
|
331
|
+
if (!theirsChanged) {
|
|
332
|
+
// Ours supprimé, theirs inchangé → supprimer
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
return null; // Ours supprimé, theirs modifié
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else if (theirsVal === undefined) {
|
|
339
|
+
if (!oursChanged) {
|
|
340
|
+
// Theirs supprimé, ours inchangé → supprimer
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
return null; // Theirs supprimé, ours modifié
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
return null; // Valeurs différentes des deux côtés
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return result;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Tente de résoudre un conflit CSS/SCSS en fusionnant règle par règle.
|
|
354
|
+
*
|
|
355
|
+
* @param baseLines - Lignes de la version base
|
|
356
|
+
* @param oursLines - Lignes de la version ours
|
|
357
|
+
* @param theirsLines - Lignes de la version theirs
|
|
358
|
+
*/
|
|
359
|
+
export function tryResolveCssConflict(baseLines, oursLines, theirsLines) {
|
|
360
|
+
const baseRules = parseCssRules(baseLines);
|
|
361
|
+
const oursRules = parseCssRules(oursLines);
|
|
362
|
+
const theirsRules = parseCssRules(theirsLines);
|
|
363
|
+
// Filtrer les règles significatives (pas blank/comment) pour l'index
|
|
364
|
+
const baseMap = new Map();
|
|
365
|
+
const oursMap = new Map();
|
|
366
|
+
const theirsMap = new Map();
|
|
367
|
+
for (const r of baseRules)
|
|
368
|
+
if (r.selector)
|
|
369
|
+
baseMap.set(r.selector, r);
|
|
370
|
+
for (const r of oursRules)
|
|
371
|
+
if (r.selector)
|
|
372
|
+
oursMap.set(r.selector, r);
|
|
373
|
+
for (const r of theirsRules)
|
|
374
|
+
if (r.selector)
|
|
375
|
+
theirsMap.set(r.selector, r);
|
|
376
|
+
// Ordre : ours d'abord, puis nouvelles règles de theirs
|
|
377
|
+
const oursOrder = oursRules.map((r) => r.selector).filter(Boolean);
|
|
378
|
+
const theirsOrder = theirsRules.map((r) => r.selector).filter(Boolean);
|
|
379
|
+
const allKeys = [...oursOrder];
|
|
380
|
+
for (const k of theirsOrder) {
|
|
381
|
+
if (!allKeys.includes(k))
|
|
382
|
+
allKeys.push(k);
|
|
383
|
+
}
|
|
384
|
+
// Inclure aussi les blancs et commentaires de ours dans le résultat
|
|
385
|
+
const resultLines = [];
|
|
386
|
+
let resolvedRules = 0;
|
|
387
|
+
let unresolvedRules = 0;
|
|
388
|
+
// Ajouter les blancs/commentaires de ours qui précèdent les règles
|
|
389
|
+
for (const rule of oursRules) {
|
|
390
|
+
if (rule.kind === "blank" || rule.kind === "comment") {
|
|
391
|
+
resultLines.push(...rule.rawLines);
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
for (const selector of allKeys) {
|
|
398
|
+
if (!selector)
|
|
399
|
+
continue;
|
|
400
|
+
const base = baseMap.get(selector);
|
|
401
|
+
const ours = oursMap.get(selector);
|
|
402
|
+
const theirs = theirsMap.get(selector);
|
|
403
|
+
if (!ours && !theirs)
|
|
404
|
+
continue;
|
|
405
|
+
// Absent de base → ajout
|
|
406
|
+
if (!base) {
|
|
407
|
+
if (ours && theirs) {
|
|
408
|
+
if (linesEqual(ours.rawLines, theirs.rawLines)) {
|
|
409
|
+
resultLines.push(...ours.rawLines);
|
|
410
|
+
resolvedRules++;
|
|
411
|
+
}
|
|
412
|
+
else if (ours.kind === "rule" && theirs.kind === "rule") {
|
|
413
|
+
// Tenter fusion des propriétés (avec support SCSS one-level nesting)
|
|
414
|
+
const merged = mergeWithNestedSelectors([], ours.properties, theirs.properties);
|
|
415
|
+
if (merged !== null) {
|
|
416
|
+
const indent = ours.rawLines[0].match(/^(\s*)/)?.[1] ?? "";
|
|
417
|
+
resultLines.push(`${indent}${selector} {`);
|
|
418
|
+
resultLines.push(...merged);
|
|
419
|
+
resultLines.push(`${indent}}`);
|
|
420
|
+
resolvedRules++;
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
unresolvedRules++;
|
|
424
|
+
return {
|
|
425
|
+
mergedLines: null,
|
|
426
|
+
reason: `Conflit CSS sur le sélecteur '${selector}' — propriétés incompatibles.`,
|
|
427
|
+
resolvedRules,
|
|
428
|
+
unresolvedRules,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
unresolvedRules++;
|
|
434
|
+
return {
|
|
435
|
+
mergedLines: null,
|
|
436
|
+
reason: `Conflit CSS sur '${selector}' — ajouté différemment des deux côtés.`,
|
|
437
|
+
resolvedRules,
|
|
438
|
+
unresolvedRules,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else if (ours) {
|
|
443
|
+
resultLines.push(...ours.rawLines);
|
|
444
|
+
resolvedRules++;
|
|
445
|
+
}
|
|
446
|
+
else if (theirs) {
|
|
447
|
+
resultLines.push(...theirs.rawLines);
|
|
448
|
+
resolvedRules++;
|
|
449
|
+
}
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
const oursChanged = ours ? !linesEqual(base.rawLines, ours.rawLines) : true;
|
|
453
|
+
const theirsChanged = theirs ? !linesEqual(base.rawLines, theirs.rawLines) : true;
|
|
454
|
+
if (!ours && !theirs) {
|
|
455
|
+
resolvedRules++;
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
if (!ours) {
|
|
459
|
+
if (!theirsChanged) {
|
|
460
|
+
resolvedRules++;
|
|
461
|
+
}
|
|
462
|
+
else {
|
|
463
|
+
unresolvedRules++;
|
|
464
|
+
return { mergedLines: null, reason: `Conflit CSS sur '${selector}' — ours supprimé, theirs modifié.`, resolvedRules, unresolvedRules };
|
|
465
|
+
}
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
if (!theirs) {
|
|
469
|
+
if (!oursChanged) {
|
|
470
|
+
resolvedRules++;
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
unresolvedRules++;
|
|
474
|
+
return { mergedLines: null, reason: `Conflit CSS sur '${selector}' — theirs supprimé, ours modifié.`, resolvedRules, unresolvedRules };
|
|
475
|
+
}
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
if (!oursChanged && !theirsChanged) {
|
|
479
|
+
resultLines.push(...base.rawLines);
|
|
480
|
+
resolvedRules++;
|
|
481
|
+
}
|
|
482
|
+
else if (linesEqual(ours.rawLines, theirs.rawLines)) {
|
|
483
|
+
resultLines.push(...ours.rawLines);
|
|
484
|
+
resolvedRules++;
|
|
485
|
+
}
|
|
486
|
+
else if (!oursChanged) {
|
|
487
|
+
resultLines.push(...theirs.rawLines);
|
|
488
|
+
resolvedRules++;
|
|
489
|
+
}
|
|
490
|
+
else if (!theirsChanged) {
|
|
491
|
+
resultLines.push(...ours.rawLines);
|
|
492
|
+
resolvedRules++;
|
|
493
|
+
}
|
|
494
|
+
else if (ours.kind === "rule" && theirs.kind === "rule") {
|
|
495
|
+
// Les deux ont modifié le même sélecteur → fusion des propriétés (avec SCSS one-level nesting)
|
|
496
|
+
const merged = mergeWithNestedSelectors(base.properties, ours.properties, theirs.properties);
|
|
497
|
+
if (merged !== null) {
|
|
498
|
+
const indent = ours.rawLines[0].match(/^(\s*)/)?.[1] ?? "";
|
|
499
|
+
resultLines.push(`${indent}${selector} {`);
|
|
500
|
+
resultLines.push(...merged);
|
|
501
|
+
resultLines.push(`${indent}}`);
|
|
502
|
+
resolvedRules++;
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
unresolvedRules++;
|
|
506
|
+
return {
|
|
507
|
+
mergedLines: null,
|
|
508
|
+
reason: `Conflit CSS sur le sélecteur '${selector}' — propriétés modifiées incompatibles.`,
|
|
509
|
+
resolvedRules,
|
|
510
|
+
unresolvedRules,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
unresolvedRules++;
|
|
516
|
+
return {
|
|
517
|
+
mergedLines: null,
|
|
518
|
+
reason: `Conflit CSS sur '${selector}' — at-rules modifiées des deux côtés.`,
|
|
519
|
+
resolvedRules,
|
|
520
|
+
unresolvedRules,
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
return {
|
|
525
|
+
mergedLines: resultLines,
|
|
526
|
+
reason: `Fusion CSS réussie : ${resolvedRules} règle(s) fusionnée(s).`,
|
|
527
|
+
resolvedRules,
|
|
528
|
+
unresolvedRules,
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
//# sourceMappingURL=css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/resolvers/css.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand — Dispatcher de résolveurs par format
|
|
3
|
+
*
|
|
4
|
+
* Point d'entrée pour la résolution format-aware.
|
|
5
|
+
* Détecte le type de fichier à partir de son chemin et tente une
|
|
6
|
+
* résolution spécialisée avant de tomber en fallback sur le moteur textuel.
|
|
7
|
+
*
|
|
8
|
+
* Architecture :
|
|
9
|
+
*
|
|
10
|
+
* resolver.ts
|
|
11
|
+
* └─ tryFormatAwareResolve(hunk, filePath)
|
|
12
|
+
* ├─ isJsonFile(filePath) → tryResolveJsonConflict()
|
|
13
|
+
* ├─ isMarkdownFile(filePath) → tryResolveMarkdownConflict()
|
|
14
|
+
* ├─ isYamlFile(filePath) → tryResolveYamlConflict()
|
|
15
|
+
* ├─ isImportFile(filePath) → tryResolveImportConflict() (si bloc d'imports)
|
|
16
|
+
* ├─ isVueFile(filePath) → tryResolveVueConflict()
|
|
17
|
+
* ├─ isCssFile(filePath) → tryResolveCssConflict()
|
|
18
|
+
* └─ null → moteur textuel standard (resolver.ts switch)
|
|
19
|
+
*
|
|
20
|
+
* Chaque résolveur spécialisé retourne des lignes résolues ou null
|
|
21
|
+
* (null = le résolveur ne sait pas → fallback).
|
|
22
|
+
*
|
|
23
|
+
* Phase 7.3b — Nouveaux résolveurs :
|
|
24
|
+
* - YAML (.yaml / .yml)
|
|
25
|
+
* - TS/JS imports (.ts / .js / .tsx / .jsx / .mjs / .cjs)
|
|
26
|
+
* - Vue SFC (.vue)
|
|
27
|
+
* - CSS/SCSS/Less (.css / .scss / .less)
|
|
28
|
+
*/
|
|
29
|
+
import type { ConflictHunk } from "../types.js";
|
|
30
|
+
/** Vérifie si le fichier est JSON ou JSONC */
|
|
31
|
+
export declare function isJsonFile(filePath: string): boolean;
|
|
32
|
+
/** Vérifie si le fichier est Markdown */
|
|
33
|
+
export declare function isMarkdownFile(filePath: string): boolean;
|
|
34
|
+
/** Vérifie si le fichier est YAML */
|
|
35
|
+
export declare function isYamlFile(filePath: string): boolean;
|
|
36
|
+
/** Vérifie si le fichier est un module TS/JS/JSX/TSX */
|
|
37
|
+
export declare function isJsFile(filePath: string): boolean;
|
|
38
|
+
/** Vérifie si le fichier est un composant Vue SFC */
|
|
39
|
+
export declare function isVueFile(filePath: string): boolean;
|
|
40
|
+
/** Vérifie si le fichier est CSS, SCSS ou Less */
|
|
41
|
+
export declare function isCssFile(filePath: string): boolean;
|
|
42
|
+
/** Vérifie si le fichier est un lockfile npm (package-lock.json) */
|
|
43
|
+
export declare function isNpmLockfile(filePath: string): boolean;
|
|
44
|
+
/** Vérifie si le fichier est un lockfile yarn (yarn.lock) */
|
|
45
|
+
export declare function isYarnLockfile(filePath: string): boolean;
|
|
46
|
+
/** Vérifie si le fichier est un lockfile pnpm (pnpm-lock.yaml) */
|
|
47
|
+
export declare function isPnpmLockfile(filePath: string): boolean;
|
|
48
|
+
/** Vérifie si le fichier est un lockfile quelconque */
|
|
49
|
+
export declare function isLockfile(filePath: string): boolean;
|
|
50
|
+
/** Vérifie si le fichier est un Cargo.toml ou Cargo.lock */
|
|
51
|
+
export declare function isCargoFile(filePath: string): boolean;
|
|
52
|
+
/** Vérifie si le fichier est un .env, .env.*, ou *.env */
|
|
53
|
+
export declare function isDotenvFile(filePath: string): boolean;
|
|
54
|
+
/** Vérifie si le fichier est un Dockerfile */
|
|
55
|
+
export declare function isDockerfile(filePath: string): boolean;
|
|
56
|
+
export interface FormatResolveResult {
|
|
57
|
+
/** Lignes résolues, ou null si le résolveur n'a pas pu résoudre */
|
|
58
|
+
lines: string[] | null;
|
|
59
|
+
/**
|
|
60
|
+
* Raison de la résolution (ou de l'échec).
|
|
61
|
+
* Inclut le nom du résolveur et le détail.
|
|
62
|
+
*/
|
|
63
|
+
reason: string;
|
|
64
|
+
/** Résolveur utilisé (pour la trace) */
|
|
65
|
+
resolverUsed: "json" | "markdown" | "yaml" | "imports" | "vue" | "css" | "lockfile-npm" | "lockfile-yarn" | "lockfile-pnpm" | "cargo" | "dotenv" | "dockerfile" | "none";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Tente de résoudre un hunk de conflit avec le résolveur approprié
|
|
69
|
+
* selon le type de fichier.
|
|
70
|
+
*
|
|
71
|
+
* Retourne `lines !== null` si le résolveur a réussi, `null` sinon.
|
|
72
|
+
* Dans tous les cas, `reason` décrit ce qui s'est passé.
|
|
73
|
+
*
|
|
74
|
+
* @param hunk - Le hunk de conflit à résoudre
|
|
75
|
+
* @param filePath - Le chemin du fichier (pour déterminer le résolveur)
|
|
76
|
+
*/
|
|
77
|
+
export declare function tryFormatAwareResolve(hunk: ConflictHunk, filePath: string): FormatResolveResult;
|
|
78
|
+
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/resolvers/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgBhD,8CAA8C;AAC9C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,yCAAyC;AACzC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wDAAwD;AACxD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAID,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAC;CAC1K;AAID;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,GACf,mBAAmB,CA8QrB"}
|