@tac0de/flutter-mcp 0.1.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 +132 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +226 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/dependencies.d.ts +27 -0
- package/dist/tools/dependencies.d.ts.map +1 -0
- package/dist/tools/dependencies.js +172 -0
- package/dist/tools/dependencies.js.map +1 -0
- package/dist/tools/validate.d.ts +33 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +231 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tools/widgets.d.ts +21 -0
- package/dist/tools/widgets.d.ts.map +1 -0
- package/dist/tools/widgets.js +164 -0
- package/dist/tools/widgets.js.map +1 -0
- package/dist/utils/flutter.d.ts +117 -0
- package/dist/utils/flutter.d.ts.map +1 -0
- package/dist/utils/flutter.js +316 -0
- package/dist/utils/flutter.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate Dart/Flutter code before execution
|
|
3
|
+
* Performs syntax checks, import validation, and common issue detection
|
|
4
|
+
*/
|
|
5
|
+
export async function validateDartCode(code, filePath) {
|
|
6
|
+
const result = {
|
|
7
|
+
valid: true,
|
|
8
|
+
errors: [],
|
|
9
|
+
warnings: [],
|
|
10
|
+
suggestions: [],
|
|
11
|
+
metadata: {
|
|
12
|
+
lineCount: 0,
|
|
13
|
+
hasImports: false,
|
|
14
|
+
hasMainFunction: false,
|
|
15
|
+
hasWidgetClass: false,
|
|
16
|
+
estimatedComplexity: "low",
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
const lines = code.split("\n");
|
|
20
|
+
result.metadata.lineCount = lines.length;
|
|
21
|
+
// Basic structure validation
|
|
22
|
+
let braceCount = 0;
|
|
23
|
+
let parenCount = 0;
|
|
24
|
+
let inString = false;
|
|
25
|
+
let stringChar = "";
|
|
26
|
+
for (let i = 0; i < lines.length; i++) {
|
|
27
|
+
const line = lines[i];
|
|
28
|
+
const trimmed = line.trim();
|
|
29
|
+
const lineNumber = i + 1;
|
|
30
|
+
// Check for imports
|
|
31
|
+
if (trimmed.startsWith("import ")) {
|
|
32
|
+
result.metadata.hasImports = true;
|
|
33
|
+
// Validate import syntax
|
|
34
|
+
const importMatch = trimmed.match(/import\s+['"]([^'"]+)['"]/);
|
|
35
|
+
if (!importMatch) {
|
|
36
|
+
result.errors.push({
|
|
37
|
+
line: lineNumber,
|
|
38
|
+
column: trimmed.indexOf("import") + 1,
|
|
39
|
+
message: "Invalid import syntax",
|
|
40
|
+
severity: "error",
|
|
41
|
+
code: "INVALID_IMPORT",
|
|
42
|
+
});
|
|
43
|
+
result.valid = false;
|
|
44
|
+
}
|
|
45
|
+
// Check for unused imports warning
|
|
46
|
+
if (trimmed.endsWith(" as")) {
|
|
47
|
+
result.warnings.push({
|
|
48
|
+
line: lineNumber,
|
|
49
|
+
column: trimmed.length,
|
|
50
|
+
message: "Import alias appears incomplete",
|
|
51
|
+
severity: "warning",
|
|
52
|
+
code: "INCOMPLETE_IMPORT_ALIAS",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Check for main function
|
|
57
|
+
if (trimmed.includes("void main(") || trimmed.includes("main()")) {
|
|
58
|
+
result.metadata.hasMainFunction = true;
|
|
59
|
+
}
|
|
60
|
+
// Check for widget classes
|
|
61
|
+
if (trimmed.includes("extends StatelessWidget") ||
|
|
62
|
+
trimmed.includes("extends StatefulWidget")) {
|
|
63
|
+
result.metadata.hasWidgetClass = true;
|
|
64
|
+
}
|
|
65
|
+
// Check for class declarations without proper naming
|
|
66
|
+
const classMatch = trimmed.match(/^class\s+(\w+)\s+/);
|
|
67
|
+
if (classMatch) {
|
|
68
|
+
const className = classMatch[1];
|
|
69
|
+
if (!/^[A-Z][a-zA-Z0-9]*$/.test(className)) {
|
|
70
|
+
result.warnings.push({
|
|
71
|
+
line: lineNumber,
|
|
72
|
+
column: trimmed.indexOf(className) + 1,
|
|
73
|
+
message: `Class name '${className}' should start with uppercase letter (PascalCase)`,
|
|
74
|
+
severity: "warning",
|
|
75
|
+
code: "CLASS_NAMING",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Check for common issues
|
|
80
|
+
// Missing semicolon (basic check)
|
|
81
|
+
if (trimmed.length > 0 &&
|
|
82
|
+
!trimmed.startsWith("//") &&
|
|
83
|
+
!trimmed.startsWith("/*") &&
|
|
84
|
+
!trimmed.startsWith("*") &&
|
|
85
|
+
!trimmed.endsWith("{") &&
|
|
86
|
+
!trimmed.endsWith("}") &&
|
|
87
|
+
!trimmed.endsWith(";") &&
|
|
88
|
+
!trimmed.includes(" if ") &&
|
|
89
|
+
!trimmed.includes(" for ") &&
|
|
90
|
+
!trimmed.includes(" while ") &&
|
|
91
|
+
!trimmed.includes(" else ") &&
|
|
92
|
+
!trimmed.startsWith("import ") &&
|
|
93
|
+
!trimmed.startsWith("export ") &&
|
|
94
|
+
!trimmed.startsWith("class ") &&
|
|
95
|
+
!trimmed.startsWith("@") &&
|
|
96
|
+
!trimmed.startsWith("return ") &&
|
|
97
|
+
!trimmed.includes("=>") &&
|
|
98
|
+
!trimmed.endsWith(",")) {
|
|
99
|
+
// This is a simple heuristic - may have false positives
|
|
100
|
+
result.warnings.push({
|
|
101
|
+
line: lineNumber,
|
|
102
|
+
column: trimmed.length,
|
|
103
|
+
message: "Statement may be missing a semicolon",
|
|
104
|
+
severity: "info",
|
|
105
|
+
code: "MISSING_SEMICOLON",
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Check for print statements (should use logging in production)
|
|
109
|
+
if (trimmed.includes("print(") && !trimmed.startsWith("//")) {
|
|
110
|
+
result.suggestions.push(`Consider replacing 'print()' with proper logging on line ${lineNumber}`);
|
|
111
|
+
}
|
|
112
|
+
// Count braces and parentheses for balanced check
|
|
113
|
+
for (const char of line) {
|
|
114
|
+
if (char === '"' || char === "'") {
|
|
115
|
+
if (!inString) {
|
|
116
|
+
inString = true;
|
|
117
|
+
stringChar = char;
|
|
118
|
+
}
|
|
119
|
+
else if (char === stringChar) {
|
|
120
|
+
inString = false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (!inString) {
|
|
124
|
+
if (char === "{")
|
|
125
|
+
braceCount++;
|
|
126
|
+
if (char === "}")
|
|
127
|
+
braceCount--;
|
|
128
|
+
if (char === "(")
|
|
129
|
+
parenCount++;
|
|
130
|
+
if (char === ")")
|
|
131
|
+
parenCount--;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Check for unbalanced braces/parentheses
|
|
136
|
+
if (braceCount !== 0) {
|
|
137
|
+
result.errors.push({
|
|
138
|
+
line: 0,
|
|
139
|
+
column: 0,
|
|
140
|
+
message: `Unbalanced braces: ${braceCount > 0 ? "opening" : "closing"} braces not matched`,
|
|
141
|
+
severity: "error",
|
|
142
|
+
code: "UNBALANCED_BRACES",
|
|
143
|
+
});
|
|
144
|
+
result.valid = false;
|
|
145
|
+
}
|
|
146
|
+
if (parenCount !== 0) {
|
|
147
|
+
result.errors.push({
|
|
148
|
+
line: 0,
|
|
149
|
+
column: 0,
|
|
150
|
+
message: `Unbalanced parentheses: ${parenCount > 0 ? "opening" : "closing"} parentheses not matched`,
|
|
151
|
+
severity: "error",
|
|
152
|
+
code: "UNBALANCED_PARENS",
|
|
153
|
+
});
|
|
154
|
+
result.valid = false;
|
|
155
|
+
}
|
|
156
|
+
// Estimate complexity
|
|
157
|
+
const complexityScore = calculateComplexity(code);
|
|
158
|
+
result.metadata.estimatedComplexity = complexityScore;
|
|
159
|
+
// Complexity-based suggestions
|
|
160
|
+
if (complexityScore === "high") {
|
|
161
|
+
result.suggestions.push("Code has high complexity. Consider breaking it into smaller functions or widgets.");
|
|
162
|
+
}
|
|
163
|
+
// File-specific checks
|
|
164
|
+
if (filePath) {
|
|
165
|
+
if (filePath.endsWith("_test.dart") && !result.metadata.hasMainFunction) {
|
|
166
|
+
result.warnings.push({
|
|
167
|
+
line: 0,
|
|
168
|
+
column: 0,
|
|
169
|
+
message: "Test file should contain test functions (using 'test()' or 'group()')",
|
|
170
|
+
severity: "warning",
|
|
171
|
+
code: "NO_TESTS_FOUND",
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
if (filePath.endsWith(".dart") && filePath.includes("/lib/") &&
|
|
175
|
+
code.trim().length > 0 && !result.metadata.hasImports) {
|
|
176
|
+
result.suggestions.push("Consider adding imports for better code organization");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Empty file check
|
|
180
|
+
if (code.trim().length === 0) {
|
|
181
|
+
result.warnings.push({
|
|
182
|
+
line: 0,
|
|
183
|
+
column: 0,
|
|
184
|
+
message: "File is empty",
|
|
185
|
+
severity: "warning",
|
|
186
|
+
code: "EMPTY_FILE",
|
|
187
|
+
});
|
|
188
|
+
result.valid = false;
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Calculate code complexity based on various metrics
|
|
194
|
+
*/
|
|
195
|
+
function calculateComplexity(code) {
|
|
196
|
+
let score = 0;
|
|
197
|
+
// Count control structures
|
|
198
|
+
const controlStructures = [
|
|
199
|
+
/\bif\s*\(/g,
|
|
200
|
+
/\bfor\s*\(/g,
|
|
201
|
+
/\bwhile\s*\(/g,
|
|
202
|
+
/\bswitch\s*\(/g,
|
|
203
|
+
/\btry\s*{/g,
|
|
204
|
+
/\?\s*[^:]+:/g, // ternary
|
|
205
|
+
];
|
|
206
|
+
for (const pattern of controlStructures) {
|
|
207
|
+
const matches = code.match(pattern);
|
|
208
|
+
if (matches)
|
|
209
|
+
score += matches.length * 2;
|
|
210
|
+
}
|
|
211
|
+
// Count nested blocks (approximate)
|
|
212
|
+
const maxNesting = code.split("\n").reduce((max, line) => {
|
|
213
|
+
const indent = line.search(/\S|$/);
|
|
214
|
+
const nesting = Math.floor(indent / 2);
|
|
215
|
+
return Math.max(max, nesting);
|
|
216
|
+
}, 0);
|
|
217
|
+
score += maxNesting * 3;
|
|
218
|
+
// Count function declarations
|
|
219
|
+
const functionMatches = code.match(/\b\w+\s*\(/g);
|
|
220
|
+
if (functionMatches)
|
|
221
|
+
score += functionMatches.length;
|
|
222
|
+
// Count lines
|
|
223
|
+
const lineCount = code.split("\n").length;
|
|
224
|
+
score += Math.floor(lineCount / 50);
|
|
225
|
+
if (score < 10)
|
|
226
|
+
return "low";
|
|
227
|
+
if (score < 25)
|
|
228
|
+
return "medium";
|
|
229
|
+
return "high";
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,QAAiB;IAcjB,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,EAAuB;QAC/B,QAAQ,EAAE,EAAyB;QACnC,WAAW,EAAE,EAAc;QAC3B,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,KAAK;YACjB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,KAAkC;SACxD;KACF,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IAEzC,6BAA6B;IAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,oBAAoB;QACpB,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC;YAElC,yBAAyB;YACzB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;oBACrC,OAAO,EAAE,uBAAuB;oBAChC,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,gBAAgB;iBACvB,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YACvB,CAAC;YAED,mCAAmC;YACnC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACnB,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,OAAO,EAAE,iCAAiC;oBAC1C,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,yBAAyB;iBAChC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC;QACzC,CAAC;QAED,2BAA2B;QAC3B,IAAI,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC3C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC;QACxC,CAAC;QAED,qDAAqD;QACrD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACnB,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;oBACtC,OAAO,EAAE,eAAe,SAAS,mDAAmD;oBACpF,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,cAAc;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,0BAA0B;QAE1B,kCAAkC;QAClC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAClB,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YACzB,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YACzB,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YACxB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YACtB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YACtB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YACtB,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC1B,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;YAC9B,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;YAC9B,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC7B,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YACxB,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;YAC9B,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,wDAAwD;YACxD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,sCAAsC;gBAC/C,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,mBAAmB;aAC1B,CAAC,CAAC;QACL,CAAC;QAED,gEAAgE;QAChE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,WAAW,CAAC,IAAI,CACrB,4DAA4D,UAAU,EAAE,CACzE,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,QAAQ,GAAG,IAAI,CAAC;oBAChB,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;qBAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC/B,QAAQ,GAAG,KAAK,CAAC;gBACnB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,IAAI,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;gBAC/B,IAAI,IAAI,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;gBAC/B,IAAI,IAAI,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;gBAC/B,IAAI,IAAI,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,sBAAsB,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,qBAAqB;YAC1F,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,2BAA2B,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,0BAA0B;YACpG,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,sBAAsB;IACtB,MAAM,eAAe,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,QAAQ,CAAC,mBAAmB,GAAG,eAAe,CAAC;IAEtD,+BAA+B;IAC/B,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,CAAC,WAAW,CAAC,IAAI,CACrB,mFAAmF,CACpF,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;YACxE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,uEAAuE;gBAChF,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,gBAAgB;aACvB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YACxD,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,IAAI,CACrB,sDAAsD,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,2BAA2B;IAC3B,MAAM,iBAAiB,GAAG;QACxB,YAAY;QACZ,aAAa;QACb,eAAe;QACf,gBAAgB;QAChB,YAAY;QACZ,cAAc,EAAE,UAAU;KAC3B,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO;YAAE,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,oCAAoC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,KAAK,IAAI,UAAU,GAAG,CAAC,CAAC;IAExB,8BAA8B;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,eAAe;QAAE,KAAK,IAAI,eAAe,CAAC,MAAM,CAAC;IAErD,cAAc;IACd,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAEpC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List all Flutter widgets in the project
|
|
3
|
+
*/
|
|
4
|
+
export declare function listWidgets(projectPath: string, includeFullPath?: boolean): Promise<{
|
|
5
|
+
widgets: WidgetInfo[];
|
|
6
|
+
summary: {
|
|
7
|
+
statelessCount: number;
|
|
8
|
+
statefulCount: number;
|
|
9
|
+
totalCount: number;
|
|
10
|
+
};
|
|
11
|
+
errors: string[];
|
|
12
|
+
}>;
|
|
13
|
+
interface WidgetInfo {
|
|
14
|
+
name: string;
|
|
15
|
+
type: "StatelessWidget" | "StatefulWidget" | "FunctionalWidget";
|
|
16
|
+
file: string;
|
|
17
|
+
line: number;
|
|
18
|
+
hasBuildMethod: boolean;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=widgets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgets.d.ts","sourceRoot":"","sources":["../../src/tools/widgets.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,eAAe,UAAQ,GACtB,OAAO,CAAC;IACT,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CA6CD;AAwKD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;CACzB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import * as fs from "fs/promises";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
/**
|
|
5
|
+
* List all Flutter widgets in the project
|
|
6
|
+
*/
|
|
7
|
+
export async function listWidgets(projectPath, includeFullPath = false) {
|
|
8
|
+
const result = {
|
|
9
|
+
widgets: [],
|
|
10
|
+
summary: {
|
|
11
|
+
statelessCount: 0,
|
|
12
|
+
statefulCount: 0,
|
|
13
|
+
totalCount: 0,
|
|
14
|
+
},
|
|
15
|
+
errors: [],
|
|
16
|
+
};
|
|
17
|
+
try {
|
|
18
|
+
const libPath = path.join(projectPath, "lib");
|
|
19
|
+
if (!existsSync(libPath)) {
|
|
20
|
+
result.errors.push("lib directory not found");
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
await scanDirectoryForWidgets(libPath, result, projectPath, includeFullPath);
|
|
24
|
+
// Calculate summary
|
|
25
|
+
result.summary.statelessCount = result.widgets.filter((w) => w.type === "StatelessWidget").length;
|
|
26
|
+
result.summary.statefulCount = result.widgets.filter((w) => w.type === "StatefulWidget").length;
|
|
27
|
+
result.summary.totalCount = result.widgets.length;
|
|
28
|
+
// Sort by file path and line number
|
|
29
|
+
result.widgets.sort((a, b) => {
|
|
30
|
+
if (a.file !== b.file) {
|
|
31
|
+
return a.file.localeCompare(b.file);
|
|
32
|
+
}
|
|
33
|
+
return a.line - b.line;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Recursively scan directory for widget definitions
|
|
43
|
+
*/
|
|
44
|
+
async function scanDirectoryForWidgets(dirPath, result, projectPath, includeFullPath) {
|
|
45
|
+
try {
|
|
46
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
49
|
+
if (entry.isDirectory()) {
|
|
50
|
+
// Skip build and generated directories
|
|
51
|
+
if (entry.name === "build" ||
|
|
52
|
+
entry.name === ".dart_tool" ||
|
|
53
|
+
entry.name === "generated") {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
await scanDirectoryForWidgets(fullPath, result, projectPath, includeFullPath);
|
|
57
|
+
}
|
|
58
|
+
else if (entry.isFile() && entry.name.endsWith(".dart")) {
|
|
59
|
+
await scanFileForWidgets(fullPath, result, projectPath, includeFullPath);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
// Skip directories we can't read
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Scan a single Dart file for widget definitions
|
|
69
|
+
*/
|
|
70
|
+
async function scanFileForWidgets(filePath, result, projectPath, includeFullPath) {
|
|
71
|
+
try {
|
|
72
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
73
|
+
const lines = content.split("\n");
|
|
74
|
+
let relativePath = path.relative(projectPath, filePath);
|
|
75
|
+
if (!includeFullPath) {
|
|
76
|
+
relativePath = relativePath.split(path.sep).join("/");
|
|
77
|
+
}
|
|
78
|
+
let currentClass = null;
|
|
79
|
+
for (let i = 0; i < lines.length; i++) {
|
|
80
|
+
const line = lines[i];
|
|
81
|
+
const trimmed = line.trim();
|
|
82
|
+
const lineNumber = i + 1;
|
|
83
|
+
// Check for class declarations
|
|
84
|
+
const classMatch = trimmed.match(/^class\s+(\w+)\s+extends\s+(StatelessWidget|StatefulWidget)/);
|
|
85
|
+
if (classMatch) {
|
|
86
|
+
const className = classMatch[1];
|
|
87
|
+
const widgetType = classMatch[2];
|
|
88
|
+
// Save previous class if exists
|
|
89
|
+
if (currentClass && currentClass.type) {
|
|
90
|
+
result.widgets.push({
|
|
91
|
+
name: currentClass.name,
|
|
92
|
+
type: currentClass.type,
|
|
93
|
+
file: relativePath,
|
|
94
|
+
line: currentClass.line,
|
|
95
|
+
hasBuildMethod: currentClass.hasBuild,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
currentClass = {
|
|
99
|
+
name: className,
|
|
100
|
+
line: lineNumber,
|
|
101
|
+
type: widgetType,
|
|
102
|
+
hasBuild: false,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Check for build method within current class
|
|
106
|
+
if (currentClass && trimmed.includes("@override") &&
|
|
107
|
+
lines[i + 1]?.trim().startsWith("Widget build(")) {
|
|
108
|
+
currentClass.hasBuild = true;
|
|
109
|
+
}
|
|
110
|
+
// Check for mixin with widgets
|
|
111
|
+
const mixinMatch = trimmed.match(/^class\s+(\w+)\s+with\s+([\w\s,]+)\s*\{/);
|
|
112
|
+
if (mixinMatch) {
|
|
113
|
+
const mixins = mixinMatch[2].split(",").map((m) => m.trim());
|
|
114
|
+
for (const mixin of mixins) {
|
|
115
|
+
if (mixin === "StatelessWidget" || mixin === "StatefulWidget") {
|
|
116
|
+
result.widgets.push({
|
|
117
|
+
name: mixinMatch[1],
|
|
118
|
+
type: mixin,
|
|
119
|
+
file: relativePath,
|
|
120
|
+
line: lineNumber,
|
|
121
|
+
hasBuildMethod: false, // Can't determine without more analysis
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Save last class
|
|
128
|
+
if (currentClass && currentClass.type) {
|
|
129
|
+
result.widgets.push({
|
|
130
|
+
name: currentClass.name,
|
|
131
|
+
type: currentClass.type,
|
|
132
|
+
file: relativePath,
|
|
133
|
+
line: currentClass.line,
|
|
134
|
+
hasBuildMethod: currentClass.hasBuild,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Also check for standalone build functions (functional widgets)
|
|
138
|
+
for (let i = 0; i < lines.length; i++) {
|
|
139
|
+
const line = lines[i];
|
|
140
|
+
const trimmed = line.trim();
|
|
141
|
+
// Look for Widget function returns (functional widgets)
|
|
142
|
+
const funcMatch = trimmed.match(/^Widget\s+(\w+)\s*\([^)]*\)\s*(?:=>|\{)/);
|
|
143
|
+
if (funcMatch) {
|
|
144
|
+
const functionName = funcMatch[1];
|
|
145
|
+
// Skip common non-widget functions
|
|
146
|
+
if (functionName !== "build" &&
|
|
147
|
+
!functionName.startsWith("_") &&
|
|
148
|
+
functionName[0] !== functionName[0].toLowerCase()) {
|
|
149
|
+
result.widgets.push({
|
|
150
|
+
name: functionName,
|
|
151
|
+
type: "FunctionalWidget",
|
|
152
|
+
file: relativePath,
|
|
153
|
+
line: i + 1,
|
|
154
|
+
hasBuildMethod: false,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
result.errors.push(`Failed to read file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=widgets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../src/tools/widgets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const PubspecSchema: z.ZodObject<{
|
|
3
|
+
name: z.ZodString;
|
|
4
|
+
description: z.ZodOptional<z.ZodString>;
|
|
5
|
+
version: z.ZodOptional<z.ZodString>;
|
|
6
|
+
publish_to: z.ZodOptional<z.ZodString>;
|
|
7
|
+
environment: z.ZodOptional<z.ZodObject<{
|
|
8
|
+
sdk: z.ZodString;
|
|
9
|
+
flutter: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
sdk: string;
|
|
12
|
+
flutter?: string | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
sdk: string;
|
|
15
|
+
flutter?: string | undefined;
|
|
16
|
+
}>>;
|
|
17
|
+
dependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
18
|
+
dev_dependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
19
|
+
flutter: z.ZodOptional<z.ZodObject<{
|
|
20
|
+
"uses-material-design": z.ZodOptional<z.ZodBoolean>;
|
|
21
|
+
assets: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
22
|
+
fonts: z.ZodOptional<z.ZodArray<z.ZodAny, "many">>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
"uses-material-design"?: boolean | undefined;
|
|
25
|
+
assets?: string[] | undefined;
|
|
26
|
+
fonts?: any[] | undefined;
|
|
27
|
+
}, {
|
|
28
|
+
"uses-material-design"?: boolean | undefined;
|
|
29
|
+
assets?: string[] | undefined;
|
|
30
|
+
fonts?: any[] | undefined;
|
|
31
|
+
}>>;
|
|
32
|
+
}, "strip", z.ZodTypeAny, {
|
|
33
|
+
name: string;
|
|
34
|
+
description?: string | undefined;
|
|
35
|
+
version?: string | undefined;
|
|
36
|
+
publish_to?: string | undefined;
|
|
37
|
+
flutter?: {
|
|
38
|
+
"uses-material-design"?: boolean | undefined;
|
|
39
|
+
assets?: string[] | undefined;
|
|
40
|
+
fonts?: any[] | undefined;
|
|
41
|
+
} | undefined;
|
|
42
|
+
environment?: {
|
|
43
|
+
sdk: string;
|
|
44
|
+
flutter?: string | undefined;
|
|
45
|
+
} | undefined;
|
|
46
|
+
dependencies?: Record<string, string> | undefined;
|
|
47
|
+
dev_dependencies?: Record<string, string> | undefined;
|
|
48
|
+
}, {
|
|
49
|
+
name: string;
|
|
50
|
+
description?: string | undefined;
|
|
51
|
+
version?: string | undefined;
|
|
52
|
+
publish_to?: string | undefined;
|
|
53
|
+
flutter?: {
|
|
54
|
+
"uses-material-design"?: boolean | undefined;
|
|
55
|
+
assets?: string[] | undefined;
|
|
56
|
+
fonts?: any[] | undefined;
|
|
57
|
+
} | undefined;
|
|
58
|
+
environment?: {
|
|
59
|
+
sdk: string;
|
|
60
|
+
flutter?: string | undefined;
|
|
61
|
+
} | undefined;
|
|
62
|
+
dependencies?: Record<string, string> | undefined;
|
|
63
|
+
dev_dependencies?: Record<string, string> | undefined;
|
|
64
|
+
}>;
|
|
65
|
+
export type PubspecYaml = z.infer<typeof PubspecSchema>;
|
|
66
|
+
/**
|
|
67
|
+
* Read and parse pubspec.yaml
|
|
68
|
+
*/
|
|
69
|
+
export declare function readPubspecYaml(projectPath: string): Promise<PubspecYaml | null>;
|
|
70
|
+
/**
|
|
71
|
+
* Detect if directory is a Flutter project
|
|
72
|
+
*/
|
|
73
|
+
export declare function detectFlutterProject(projectPath: string): Promise<{
|
|
74
|
+
isFlutterProject: boolean;
|
|
75
|
+
projectType: "app" | "package" | "module" | null;
|
|
76
|
+
flutterVersion: string | null;
|
|
77
|
+
hasPubspec: boolean;
|
|
78
|
+
errors: string[];
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* Analyze Flutter project structure
|
|
82
|
+
*/
|
|
83
|
+
export declare function analyzeFlutterProject(projectPath: string): Promise<{
|
|
84
|
+
projectPath: string;
|
|
85
|
+
projectName: string | null;
|
|
86
|
+
projectType: string;
|
|
87
|
+
structure: {
|
|
88
|
+
hasLib: boolean;
|
|
89
|
+
hasAndroid: boolean;
|
|
90
|
+
hasIOS: boolean;
|
|
91
|
+
hasWeb: boolean;
|
|
92
|
+
hasLinux: boolean;
|
|
93
|
+
hasWindows: boolean;
|
|
94
|
+
hasMacOS: boolean;
|
|
95
|
+
hasTest: boolean;
|
|
96
|
+
hasIntegrationTest: boolean;
|
|
97
|
+
};
|
|
98
|
+
fileCount: number;
|
|
99
|
+
dartFileCount: number;
|
|
100
|
+
errors: string[];
|
|
101
|
+
}>;
|
|
102
|
+
/**
|
|
103
|
+
* Get Flutter project information
|
|
104
|
+
*/
|
|
105
|
+
export declare function getFlutterProjectInfo(projectPath: string): Promise<{
|
|
106
|
+
name: string | null;
|
|
107
|
+
description: string | null;
|
|
108
|
+
version: string | null;
|
|
109
|
+
sdkVersion: string | null;
|
|
110
|
+
flutterVersion: string | null;
|
|
111
|
+
dependencies: Record<string, string>;
|
|
112
|
+
devDependencies: Record<string, string>;
|
|
113
|
+
usesMaterialDesign: boolean;
|
|
114
|
+
assets: string[];
|
|
115
|
+
errors: string[];
|
|
116
|
+
}>;
|
|
117
|
+
//# sourceMappingURL=flutter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flutter.d.ts","sourceRoot":"","sources":["../../src/utils/flutter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcxB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AA6GxD;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAe7B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC;IACjD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CAuDD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QACT,MAAM,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,OAAO,CAAC;QACpB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,OAAO,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,kBAAkB,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CA+DD;AAoCD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CAuCD"}
|