test-gen-js 0.1.1
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/CHANGELOG.md +71 -0
- package/LICENSE +22 -0
- package/README.md +538 -0
- package/bin/cli.js +4 -0
- package/dist/analyzer/componentAnalyzer.d.ts +12 -0
- package/dist/analyzer/componentAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/componentAnalyzer.js +223 -0
- package/dist/analyzer/componentAnalyzer.js.map +1 -0
- package/dist/analyzer/fileAnalyzer.d.ts +17 -0
- package/dist/analyzer/fileAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/fileAnalyzer.js +201 -0
- package/dist/analyzer/fileAnalyzer.js.map +1 -0
- package/dist/analyzer/functionAnalyzer.d.ts +12 -0
- package/dist/analyzer/functionAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/functionAnalyzer.js +184 -0
- package/dist/analyzer/functionAnalyzer.js.map +1 -0
- package/dist/analyzer/index.d.ts +7 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +14 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +113 -0
- package/dist/cli.js.map +1 -0
- package/dist/generator/index.d.ts +6 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +12 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/mockGenerator.d.ts +14 -0
- package/dist/generator/mockGenerator.d.ts.map +1 -0
- package/dist/generator/mockGenerator.js +123 -0
- package/dist/generator/mockGenerator.js.map +1 -0
- package/dist/generator/testGenerator.d.ts +14 -0
- package/dist/generator/testGenerator.d.ts.map +1 -0
- package/dist/generator/testGenerator.js +301 -0
- package/dist/generator/testGenerator.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/astParser.d.ts +15 -0
- package/dist/parser/astParser.d.ts.map +1 -0
- package/dist/parser/astParser.js +100 -0
- package/dist/parser/astParser.js.map +1 -0
- package/dist/parser/index.d.ts +6 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +12 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/typeExtractor.d.ts +14 -0
- package/dist/parser/typeExtractor.d.ts.map +1 -0
- package/dist/parser/typeExtractor.js +165 -0
- package/dist/parser/typeExtractor.js.map +1 -0
- package/dist/templates/component.ejs +67 -0
- package/dist/templates/function.ejs +59 -0
- package/dist/templates/snapshot.ejs +48 -0
- package/dist/types.d.ts +95 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fileUtils.d.ts +43 -0
- package/dist/utils/fileUtils.d.ts.map +1 -0
- package/dist/utils/fileUtils.js +109 -0
- package/dist/utils/fileUtils.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/naming.d.ts +37 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +73 -0
- package/dist/utils/naming.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Component Analyzer
|
|
4
|
+
* Extracts information from React/React Native components
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.analyzeComponent = analyzeComponent;
|
|
44
|
+
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
45
|
+
const t = __importStar(require("@babel/types"));
|
|
46
|
+
const typeExtractor_1 = require("../parser/typeExtractor");
|
|
47
|
+
/**
|
|
48
|
+
* Analyze a component and extract its information
|
|
49
|
+
*/
|
|
50
|
+
function analyzeComponent(nodePath, filePath) {
|
|
51
|
+
let name;
|
|
52
|
+
let funcNode;
|
|
53
|
+
if (t.isFunctionDeclaration(nodePath.node)) {
|
|
54
|
+
if (!nodePath.node.id)
|
|
55
|
+
return null;
|
|
56
|
+
name = nodePath.node.id.name;
|
|
57
|
+
funcNode = nodePath.node;
|
|
58
|
+
}
|
|
59
|
+
else if (t.isVariableDeclarator(nodePath.node)) {
|
|
60
|
+
if (!t.isIdentifier(nodePath.node.id))
|
|
61
|
+
return null;
|
|
62
|
+
if (!t.isArrowFunctionExpression(nodePath.node.init) &&
|
|
63
|
+
!t.isFunctionExpression(nodePath.node.init)) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
name = nodePath.node.id.name;
|
|
67
|
+
funcNode = nodePath.node.init;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
// Extract props
|
|
73
|
+
const props = extractProps(funcNode);
|
|
74
|
+
// Extract hooks
|
|
75
|
+
const hooks = extractHooks(funcNode);
|
|
76
|
+
// Extract event handlers
|
|
77
|
+
const events = extractEvents(funcNode);
|
|
78
|
+
// Check if component accepts children
|
|
79
|
+
const children = props.some((p) => p.name === 'children');
|
|
80
|
+
return {
|
|
81
|
+
name,
|
|
82
|
+
type: t.isFunctionDeclaration(funcNode)
|
|
83
|
+
? 'function'
|
|
84
|
+
: t.isArrowFunctionExpression(funcNode)
|
|
85
|
+
? 'arrow'
|
|
86
|
+
: 'function',
|
|
87
|
+
props,
|
|
88
|
+
hooks,
|
|
89
|
+
events,
|
|
90
|
+
children,
|
|
91
|
+
imports: [], // Filled by file analyzer
|
|
92
|
+
filePath,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Extract props from a function component
|
|
97
|
+
*/
|
|
98
|
+
function extractProps(node) {
|
|
99
|
+
const props = [];
|
|
100
|
+
const firstParam = node.params[0];
|
|
101
|
+
if (!firstParam)
|
|
102
|
+
return props;
|
|
103
|
+
// Destructured props: ({ title, onPress })
|
|
104
|
+
if (t.isObjectPattern(firstParam)) {
|
|
105
|
+
for (const prop of firstParam.properties) {
|
|
106
|
+
if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {
|
|
107
|
+
const propInfo = {
|
|
108
|
+
name: prop.key.name,
|
|
109
|
+
type: 'any',
|
|
110
|
+
required: true,
|
|
111
|
+
};
|
|
112
|
+
// Check for default value
|
|
113
|
+
if (t.isAssignmentPattern(prop.value)) {
|
|
114
|
+
propInfo.required = false;
|
|
115
|
+
propInfo.defaultValue = getDefaultValueString(prop.value.right);
|
|
116
|
+
}
|
|
117
|
+
// Check for type annotation
|
|
118
|
+
if (t.isIdentifier(prop.value) && prop.value.typeAnnotation) {
|
|
119
|
+
propInfo.type = (0, typeExtractor_1.extractTypes)(prop.value.typeAnnotation);
|
|
120
|
+
}
|
|
121
|
+
props.push(propInfo);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Check for TypeScript type annotation on the parameter
|
|
125
|
+
if (firstParam.typeAnnotation && t.isTSTypeAnnotation(firstParam.typeAnnotation)) {
|
|
126
|
+
const typeNode = firstParam.typeAnnotation.typeAnnotation;
|
|
127
|
+
if (t.isTSTypeLiteral(typeNode)) {
|
|
128
|
+
for (const member of typeNode.members) {
|
|
129
|
+
if (t.isTSPropertySignature(member)) {
|
|
130
|
+
const key = member.key;
|
|
131
|
+
if (t.isIdentifier(key)) {
|
|
132
|
+
const existingProp = props.find((p) => p.name === key.name);
|
|
133
|
+
if (existingProp && member.typeAnnotation) {
|
|
134
|
+
existingProp.type = (0, typeExtractor_1.extractTypes)(member.typeAnnotation);
|
|
135
|
+
existingProp.required = !member.optional;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Props as identifier: (props)
|
|
144
|
+
if (t.isIdentifier(firstParam)) {
|
|
145
|
+
// Can't extract individual props without type info
|
|
146
|
+
// Check for TypeScript type annotation
|
|
147
|
+
if (firstParam.typeAnnotation && t.isTSTypeAnnotation(firstParam.typeAnnotation)) {
|
|
148
|
+
const typeNode = firstParam.typeAnnotation.typeAnnotation;
|
|
149
|
+
if (t.isTSTypeLiteral(typeNode)) {
|
|
150
|
+
for (const member of typeNode.members) {
|
|
151
|
+
if (t.isTSPropertySignature(member)) {
|
|
152
|
+
const key = member.key;
|
|
153
|
+
if (t.isIdentifier(key)) {
|
|
154
|
+
props.push({
|
|
155
|
+
name: key.name,
|
|
156
|
+
type: (0, typeExtractor_1.extractTypes)(member.typeAnnotation),
|
|
157
|
+
required: !member.optional,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return props;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Extract hooks used in the component
|
|
169
|
+
*/
|
|
170
|
+
function extractHooks(node) {
|
|
171
|
+
const hooks = new Set();
|
|
172
|
+
const body = t.isBlockStatement(node.body) ? node.body : null;
|
|
173
|
+
if (!body)
|
|
174
|
+
return [];
|
|
175
|
+
(0, traverse_1.default)(body, {
|
|
176
|
+
CallExpression(path) {
|
|
177
|
+
if (t.isIdentifier(path.node.callee)) {
|
|
178
|
+
const name = path.node.callee.name;
|
|
179
|
+
if (name.startsWith('use')) {
|
|
180
|
+
hooks.add(name);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
}, undefined, { node: body });
|
|
185
|
+
return Array.from(hooks);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Extract event handler props (onPress, onClick, etc.)
|
|
189
|
+
*/
|
|
190
|
+
function extractEvents(node) {
|
|
191
|
+
const events = new Set();
|
|
192
|
+
const props = extractProps(node);
|
|
193
|
+
// Check props for event handlers
|
|
194
|
+
for (const prop of props) {
|
|
195
|
+
if (prop.name.startsWith('on') &&
|
|
196
|
+
prop.name.length > 2 &&
|
|
197
|
+
prop.name[2] === prop.name[2].toUpperCase()) {
|
|
198
|
+
events.add(prop.name);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return Array.from(events);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get string representation of a default value
|
|
205
|
+
*/
|
|
206
|
+
function getDefaultValueString(node) {
|
|
207
|
+
if (t.isStringLiteral(node))
|
|
208
|
+
return `'${node.value}'`;
|
|
209
|
+
if (t.isNumericLiteral(node))
|
|
210
|
+
return String(node.value);
|
|
211
|
+
if (t.isBooleanLiteral(node))
|
|
212
|
+
return String(node.value);
|
|
213
|
+
if (t.isNullLiteral(node))
|
|
214
|
+
return 'null';
|
|
215
|
+
if (t.isIdentifier(node) && node.name === 'undefined')
|
|
216
|
+
return 'undefined';
|
|
217
|
+
if (t.isArrayExpression(node))
|
|
218
|
+
return '[]';
|
|
219
|
+
if (t.isObjectExpression(node))
|
|
220
|
+
return '{}';
|
|
221
|
+
return 'undefined';
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=componentAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentAnalyzer.js","sourceRoot":"","sources":["../../src/analyzer/componentAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Analyzer
|
|
3
|
+
* Analyzes a file to extract components, functions, and their information
|
|
4
|
+
*/
|
|
5
|
+
import type { FileAnalysis } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* Analyze a single file
|
|
8
|
+
*/
|
|
9
|
+
export declare function analyzeFile(filePath: string): Promise<FileAnalysis>;
|
|
10
|
+
/**
|
|
11
|
+
* Analyze all files in a directory
|
|
12
|
+
*/
|
|
13
|
+
export declare function analyzeDirectory(_dirPath: string, _options?: {
|
|
14
|
+
pattern?: string;
|
|
15
|
+
exclude?: string[];
|
|
16
|
+
}): Promise<FileAnalysis[]>;
|
|
17
|
+
//# sourceMappingURL=fileAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/fileAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoGzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAClD,OAAO,CAAC,YAAY,EAAE,CAAC,CAGzB"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* File Analyzer
|
|
4
|
+
* Analyzes a file to extract components, functions, and their information
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.analyzeFile = analyzeFile;
|
|
44
|
+
exports.analyzeDirectory = analyzeDirectory;
|
|
45
|
+
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
46
|
+
const t = __importStar(require("@babel/types"));
|
|
47
|
+
const path_1 = __importDefault(require("path"));
|
|
48
|
+
const parser_1 = require("../parser");
|
|
49
|
+
const componentAnalyzer_1 = require("./componentAnalyzer");
|
|
50
|
+
const functionAnalyzer_1 = require("./functionAnalyzer");
|
|
51
|
+
/**
|
|
52
|
+
* Analyze a single file
|
|
53
|
+
*/
|
|
54
|
+
async function analyzeFile(filePath) {
|
|
55
|
+
const absolutePath = path_1.default.resolve(filePath);
|
|
56
|
+
const ast = await (0, parser_1.parseFile)(absolutePath);
|
|
57
|
+
const components = [];
|
|
58
|
+
const functions = [];
|
|
59
|
+
const imports = [];
|
|
60
|
+
// Extract imports
|
|
61
|
+
(0, traverse_1.default)(ast, {
|
|
62
|
+
ImportDeclaration(nodePath) {
|
|
63
|
+
const source = nodePath.node.source.value;
|
|
64
|
+
const specifiers = nodePath.node.specifiers.map((spec) => {
|
|
65
|
+
if (t.isImportDefaultSpecifier(spec)) {
|
|
66
|
+
return spec.local.name;
|
|
67
|
+
}
|
|
68
|
+
if (t.isImportSpecifier(spec)) {
|
|
69
|
+
return t.isIdentifier(spec.imported) ? spec.imported.name : spec.local.name;
|
|
70
|
+
}
|
|
71
|
+
if (t.isImportNamespaceSpecifier(spec)) {
|
|
72
|
+
return `* as ${spec.local.name}`;
|
|
73
|
+
}
|
|
74
|
+
return '';
|
|
75
|
+
});
|
|
76
|
+
imports.push({
|
|
77
|
+
source,
|
|
78
|
+
specifiers,
|
|
79
|
+
isDefault: nodePath.node.specifiers.some((s) => t.isImportDefaultSpecifier(s)),
|
|
80
|
+
});
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
// Analyze components and functions
|
|
84
|
+
(0, traverse_1.default)(ast, {
|
|
85
|
+
// Function declarations
|
|
86
|
+
FunctionDeclaration(nodePath) {
|
|
87
|
+
if (!nodePath.node.id)
|
|
88
|
+
return;
|
|
89
|
+
const name = nodePath.node.id.name;
|
|
90
|
+
const isExported = t.isExportNamedDeclaration(nodePath.parent) ||
|
|
91
|
+
t.isExportDefaultDeclaration(nodePath.parent);
|
|
92
|
+
if (isReactComponent(nodePath.node)) {
|
|
93
|
+
const componentInfo = (0, componentAnalyzer_1.analyzeComponent)(nodePath, absolutePath);
|
|
94
|
+
if (componentInfo) {
|
|
95
|
+
components.push(componentInfo);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (isExported) {
|
|
99
|
+
const functionInfo = (0, functionAnalyzer_1.analyzeFunction)(nodePath, absolutePath);
|
|
100
|
+
if (functionInfo) {
|
|
101
|
+
functions.push(functionInfo);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
// Arrow function expressions (const MyComponent = () => {})
|
|
106
|
+
VariableDeclarator(nodePath) {
|
|
107
|
+
if (!t.isIdentifier(nodePath.node.id))
|
|
108
|
+
return;
|
|
109
|
+
if (!t.isArrowFunctionExpression(nodePath.node.init) && !t.isFunctionExpression(nodePath.node.init)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const name = nodePath.node.id.name;
|
|
113
|
+
const funcNode = nodePath.node.init;
|
|
114
|
+
// Check if exported
|
|
115
|
+
const variableDeclaration = nodePath.parentPath;
|
|
116
|
+
const isExported = variableDeclaration &&
|
|
117
|
+
(t.isExportNamedDeclaration(variableDeclaration.parent) ||
|
|
118
|
+
t.isExportDefaultDeclaration(variableDeclaration.parent));
|
|
119
|
+
if (isReactComponent(funcNode)) {
|
|
120
|
+
const componentInfo = (0, componentAnalyzer_1.analyzeComponent)(nodePath, absolutePath);
|
|
121
|
+
if (componentInfo) {
|
|
122
|
+
components.push(componentInfo);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else if (isExported) {
|
|
126
|
+
const functionInfo = (0, functionAnalyzer_1.analyzeFunction)(nodePath, absolutePath);
|
|
127
|
+
if (functionInfo) {
|
|
128
|
+
functions.push(functionInfo);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
// Determine framework and file type
|
|
134
|
+
const framework = detectFramework(imports);
|
|
135
|
+
const fileType = determineFileType(components, functions);
|
|
136
|
+
return {
|
|
137
|
+
filePath: absolutePath,
|
|
138
|
+
fileType,
|
|
139
|
+
framework,
|
|
140
|
+
components,
|
|
141
|
+
functions,
|
|
142
|
+
imports,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Analyze all files in a directory
|
|
147
|
+
*/
|
|
148
|
+
async function analyzeDirectory(_dirPath, _options) {
|
|
149
|
+
// TODO: Implement directory scanning
|
|
150
|
+
throw new Error('Directory scanning is not yet implemented');
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check if a function/arrow function is a React component
|
|
154
|
+
*/
|
|
155
|
+
function isReactComponent(node) {
|
|
156
|
+
let hasJSX = false;
|
|
157
|
+
// Check if the function body contains JSX
|
|
158
|
+
if (t.isBlockStatement(node.body)) {
|
|
159
|
+
// Function with block body
|
|
160
|
+
(0, traverse_1.default)(node.body, {
|
|
161
|
+
JSXElement() {
|
|
162
|
+
hasJSX = true;
|
|
163
|
+
},
|
|
164
|
+
JSXFragment() {
|
|
165
|
+
hasJSX = true;
|
|
166
|
+
},
|
|
167
|
+
}, undefined, { node });
|
|
168
|
+
}
|
|
169
|
+
else if (t.isJSXElement(node.body) || t.isJSXFragment(node.body)) {
|
|
170
|
+
// Arrow function with direct JSX return
|
|
171
|
+
hasJSX = true;
|
|
172
|
+
}
|
|
173
|
+
return hasJSX;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Detect the framework based on imports
|
|
177
|
+
*/
|
|
178
|
+
function detectFramework(imports) {
|
|
179
|
+
for (const imp of imports) {
|
|
180
|
+
if (imp.source === 'react-native' || imp.source.startsWith('react-native')) {
|
|
181
|
+
return 'react-native';
|
|
182
|
+
}
|
|
183
|
+
if (imp.source === 'react' || imp.source.startsWith('react')) {
|
|
184
|
+
return 'react';
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return 'vanilla';
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Determine the file type based on contents
|
|
191
|
+
*/
|
|
192
|
+
function determineFileType(components, functions) {
|
|
193
|
+
if (components.length > 0) {
|
|
194
|
+
return 'component';
|
|
195
|
+
}
|
|
196
|
+
if (functions.length > 0) {
|
|
197
|
+
return 'function';
|
|
198
|
+
}
|
|
199
|
+
return 'unknown';
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=fileAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileAnalyzer.js","sourceRoot":"","sources":["../../src/analyzer/fileAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Function Analyzer
|
|
3
|
+
* Extracts information from JavaScript/TypeScript functions
|
|
4
|
+
*/
|
|
5
|
+
import type { NodePath } from '@babel/traverse';
|
|
6
|
+
import * as t from '@babel/types';
|
|
7
|
+
import type { FunctionInfo } from '../types';
|
|
8
|
+
/**
|
|
9
|
+
* Analyze a function and extract its information
|
|
10
|
+
*/
|
|
11
|
+
export declare function analyzeFunction(nodePath: NodePath<t.FunctionDeclaration | t.VariableDeclarator>, filePath: string): FunctionInfo | null;
|
|
12
|
+
//# sourceMappingURL=functionAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functionAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/functionAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,UAAU,CAAC;AAExD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAC,kBAAkB,CAAC,EAChE,QAAQ,EAAE,MAAM,GACf,YAAY,GAAG,IAAI,CAkDrB"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Function Analyzer
|
|
4
|
+
* Extracts information from JavaScript/TypeScript functions
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.analyzeFunction = analyzeFunction;
|
|
41
|
+
const t = __importStar(require("@babel/types"));
|
|
42
|
+
const typeExtractor_1 = require("../parser/typeExtractor");
|
|
43
|
+
/**
|
|
44
|
+
* Analyze a function and extract its information
|
|
45
|
+
*/
|
|
46
|
+
function analyzeFunction(nodePath, filePath) {
|
|
47
|
+
let name;
|
|
48
|
+
let funcNode;
|
|
49
|
+
if (t.isFunctionDeclaration(nodePath.node)) {
|
|
50
|
+
if (!nodePath.node.id)
|
|
51
|
+
return null;
|
|
52
|
+
name = nodePath.node.id.name;
|
|
53
|
+
funcNode = nodePath.node;
|
|
54
|
+
}
|
|
55
|
+
else if (t.isVariableDeclarator(nodePath.node)) {
|
|
56
|
+
if (!t.isIdentifier(nodePath.node.id))
|
|
57
|
+
return null;
|
|
58
|
+
if (!t.isArrowFunctionExpression(nodePath.node.init) &&
|
|
59
|
+
!t.isFunctionExpression(nodePath.node.init)) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
name = nodePath.node.id.name;
|
|
63
|
+
funcNode = nodePath.node.init;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
// Extract parameters
|
|
69
|
+
const params = extractParams(funcNode);
|
|
70
|
+
// Extract return type
|
|
71
|
+
const returnType = extractReturnType(funcNode);
|
|
72
|
+
// Check if async
|
|
73
|
+
const isAsync = funcNode.async || false;
|
|
74
|
+
// Check if exported
|
|
75
|
+
const parent = nodePath.parent;
|
|
76
|
+
const isExported = t.isExportNamedDeclaration(parent) ||
|
|
77
|
+
t.isExportDefaultDeclaration(parent) ||
|
|
78
|
+
(t.isVariableDeclaration(parent) &&
|
|
79
|
+
nodePath.parentPath &&
|
|
80
|
+
(t.isExportNamedDeclaration(nodePath.parentPath.parent) ||
|
|
81
|
+
t.isExportDefaultDeclaration(nodePath.parentPath.parent)));
|
|
82
|
+
return {
|
|
83
|
+
name,
|
|
84
|
+
params,
|
|
85
|
+
returnType,
|
|
86
|
+
isAsync,
|
|
87
|
+
isExported,
|
|
88
|
+
imports: [], // Filled by file analyzer
|
|
89
|
+
filePath,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extract function parameters
|
|
94
|
+
*/
|
|
95
|
+
function extractParams(node) {
|
|
96
|
+
const params = [];
|
|
97
|
+
for (const param of node.params) {
|
|
98
|
+
// Simple identifier: (name)
|
|
99
|
+
if (t.isIdentifier(param)) {
|
|
100
|
+
params.push({
|
|
101
|
+
name: param.name,
|
|
102
|
+
type: (0, typeExtractor_1.extractTypes)(param.typeAnnotation),
|
|
103
|
+
optional: false,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// Assignment pattern with default: (name = 'default')
|
|
107
|
+
if (t.isAssignmentPattern(param)) {
|
|
108
|
+
if (t.isIdentifier(param.left)) {
|
|
109
|
+
params.push({
|
|
110
|
+
name: param.left.name,
|
|
111
|
+
type: (0, typeExtractor_1.extractTypes)(param.left.typeAnnotation),
|
|
112
|
+
optional: true,
|
|
113
|
+
defaultValue: getDefaultValueString(param.right),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Rest parameter: (...args)
|
|
118
|
+
if (t.isRestElement(param)) {
|
|
119
|
+
if (t.isIdentifier(param.argument)) {
|
|
120
|
+
params.push({
|
|
121
|
+
name: `...${param.argument.name}`,
|
|
122
|
+
type: (0, typeExtractor_1.extractTypes)(param.typeAnnotation) || 'any[]',
|
|
123
|
+
optional: true,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Object pattern: ({ a, b })
|
|
128
|
+
if (t.isObjectPattern(param)) {
|
|
129
|
+
const propNames = param.properties
|
|
130
|
+
.filter((p) => t.isObjectProperty(p))
|
|
131
|
+
.map((p) => (t.isIdentifier(p.key) ? p.key.name : ''))
|
|
132
|
+
.filter(Boolean)
|
|
133
|
+
.join(', ');
|
|
134
|
+
params.push({
|
|
135
|
+
name: `{ ${propNames} }`,
|
|
136
|
+
type: (0, typeExtractor_1.extractTypes)(param.typeAnnotation),
|
|
137
|
+
optional: false,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// Array pattern: ([a, b])
|
|
141
|
+
if (t.isArrayPattern(param)) {
|
|
142
|
+
params.push({
|
|
143
|
+
name: '[...]',
|
|
144
|
+
type: (0, typeExtractor_1.extractTypes)(param.typeAnnotation),
|
|
145
|
+
optional: false,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return params;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Extract return type from function
|
|
153
|
+
*/
|
|
154
|
+
function extractReturnType(node) {
|
|
155
|
+
if (node.returnType) {
|
|
156
|
+
return (0, typeExtractor_1.extractTypes)(node.returnType);
|
|
157
|
+
}
|
|
158
|
+
// For async functions, wrap in Promise
|
|
159
|
+
if (node.async) {
|
|
160
|
+
return 'Promise<any>';
|
|
161
|
+
}
|
|
162
|
+
return 'any';
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get string representation of a default value
|
|
166
|
+
*/
|
|
167
|
+
function getDefaultValueString(node) {
|
|
168
|
+
if (t.isStringLiteral(node))
|
|
169
|
+
return `'${node.value}'`;
|
|
170
|
+
if (t.isNumericLiteral(node))
|
|
171
|
+
return String(node.value);
|
|
172
|
+
if (t.isBooleanLiteral(node))
|
|
173
|
+
return String(node.value);
|
|
174
|
+
if (t.isNullLiteral(node))
|
|
175
|
+
return 'null';
|
|
176
|
+
if (t.isIdentifier(node) && node.name === 'undefined')
|
|
177
|
+
return 'undefined';
|
|
178
|
+
if (t.isArrayExpression(node))
|
|
179
|
+
return '[]';
|
|
180
|
+
if (t.isObjectExpression(node))
|
|
181
|
+
return '{}';
|
|
182
|
+
return 'undefined';
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=functionAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functionAnalyzer.js","sourceRoot":"","sources":["../../src/analyzer/functionAnalyzer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUH,0CAqDC;AA5DD,gDAAkC;AAClC,2DAAuD;AAGvD;;GAEG;AACH,SAAgB,eAAe,CAC7B,QAAgE,EAChE,QAAgB;IAEhB,IAAI,IAAY,CAAC;IACjB,IAAI,QAAkF,CAAC;IAEvF,IAAI,CAAC,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;QAC7B,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,CAAC;SAAM,IAAI,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,IACE,CAAC,CAAC,CAAC,yBAAyB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAChD,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAC3C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;QAC7B,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEvC,sBAAsB;IACtB,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE/C,iBAAiB;IACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC;IAExC,oBAAoB;IACpB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,MAAM,UAAU,GACd,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC;QAClC,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC;QACpC,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC;YAC9B,QAAQ,CAAC,UAAU;YACnB,CAAC,CAAC,CAAC,wBAAwB,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;gBACrD,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEjE,OAAO;QACL,IAAI;QACJ,MAAM;QACN,UAAU;QACV,OAAO;QACP,UAAU;QACV,OAAO,EAAE,EAAE,EAAE,0BAA0B;QACvC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACpB,IAA8E;IAE9E,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,4BAA4B;QAC5B,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,IAAA,4BAAY,EAAC,KAAK,CAAC,cAAc,CAAC;gBACxC,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;oBACrB,IAAI,EAAE,IAAA,4BAAY,EAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;oBAC7C,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;oBACjC,IAAI,EAAE,IAAA,4BAAY,EAAC,KAAK,CAAC,cAAc,CAAC,IAAI,OAAO;oBACnD,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU;iBAC/B,MAAM,CAAC,CAAC,CAAC,EAAyB,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;iBAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBACrD,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,KAAK,SAAS,IAAI;gBACxB,IAAI,EAAE,IAAA,4BAAY,EAAC,KAAK,CAAC,cAAc,CAAC;gBACxC,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,IAAA,4BAAY,EAAC,KAAK,CAAC,cAAc,CAAC;gBACxC,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,IAA8E;IAE9E,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,IAAA,4BAAY,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,uCAAuC;IACvC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,IAAkB;IAC/C,IAAI,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;IACtD,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAC1E,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,WAAW,CAAC;AACrB,CAAC"}
|