logicstamp-context 0.2.3 → 0.2.5
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/LLM_CONTEXT.md +2 -2
- package/README.md +96 -585
- package/dist/cli/commands/compare.d.ts.map +1 -1
- package/dist/cli/commands/compare.js +120 -13
- package/dist/cli/commands/compare.js.map +1 -1
- package/dist/cli/commands/context/fileWriter.d.ts.map +1 -1
- package/dist/cli/commands/context/fileWriter.js +68 -6
- package/dist/cli/commands/context/fileWriter.js.map +1 -1
- package/dist/cli/commands/context/tokenEstimator.d.ts.map +1 -1
- package/dist/cli/commands/context/tokenEstimator.js +12 -4
- package/dist/cli/commands/context/tokenEstimator.js.map +1 -1
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +71 -2
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +84 -8
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/handlers/compareHandler.d.ts.map +1 -1
- package/dist/cli/handlers/compareHandler.js +123 -9
- package/dist/cli/handlers/compareHandler.js.map +1 -1
- package/dist/core/astParser/detectors.d.ts.map +1 -1
- package/dist/core/astParser/detectors.js +130 -57
- package/dist/core/astParser/detectors.js.map +1 -1
- package/dist/core/astParser/extractors/componentExtractor.d.ts.map +1 -1
- package/dist/core/astParser/extractors/componentExtractor.js +89 -20
- package/dist/core/astParser/extractors/componentExtractor.js.map +1 -1
- package/dist/core/astParser/extractors/eventExtractor.d.ts.map +1 -1
- package/dist/core/astParser/extractors/eventExtractor.js +83 -28
- package/dist/core/astParser/extractors/eventExtractor.js.map +1 -1
- package/dist/core/astParser/extractors/propExtractor.d.ts.map +1 -1
- package/dist/core/astParser/extractors/propExtractor.js +130 -51
- package/dist/core/astParser/extractors/propExtractor.js.map +1 -1
- package/dist/core/astParser/extractors/stateExtractor.d.ts.map +1 -1
- package/dist/core/astParser/extractors/stateExtractor.js +95 -44
- package/dist/core/astParser/extractors/stateExtractor.js.map +1 -1
- package/dist/core/astParser.d.ts +1 -0
- package/dist/core/astParser.d.ts.map +1 -1
- package/dist/core/astParser.js +74 -26
- package/dist/core/astParser.js.map +1 -1
- package/dist/core/manifest.d.ts.map +1 -1
- package/dist/core/manifest.js +28 -1
- package/dist/core/manifest.js.map +1 -1
- package/dist/core/pack/loader.d.ts.map +1 -1
- package/dist/core/pack/loader.js +22 -2
- package/dist/core/pack/loader.js.map +1 -1
- package/dist/core/styleExtractor/index.d.ts +2 -0
- package/dist/core/styleExtractor/index.d.ts.map +1 -1
- package/dist/core/styleExtractor/index.js +2 -0
- package/dist/core/styleExtractor/index.js.map +1 -1
- package/dist/core/styleExtractor/layout.d.ts +13 -2
- package/dist/core/styleExtractor/layout.d.ts.map +1 -1
- package/dist/core/styleExtractor/layout.js +135 -65
- package/dist/core/styleExtractor/layout.js.map +1 -1
- package/dist/core/styleExtractor/material.d.ts +19 -0
- package/dist/core/styleExtractor/material.d.ts.map +1 -0
- package/dist/core/styleExtractor/material.js +328 -0
- package/dist/core/styleExtractor/material.js.map +1 -0
- package/dist/core/styleExtractor/motion.d.ts +2 -2
- package/dist/core/styleExtractor/motion.d.ts.map +1 -1
- package/dist/core/styleExtractor/motion.js +425 -56
- package/dist/core/styleExtractor/motion.js.map +1 -1
- package/dist/core/styleExtractor/radix.d.ts +29 -0
- package/dist/core/styleExtractor/radix.d.ts.map +1 -0
- package/dist/core/styleExtractor/radix.js +315 -0
- package/dist/core/styleExtractor/radix.js.map +1 -0
- package/dist/core/styleExtractor/scss.d.ts.map +1 -1
- package/dist/core/styleExtractor/scss.js +37 -23
- package/dist/core/styleExtractor/scss.js.map +1 -1
- package/dist/core/styleExtractor/shadcn.d.ts +20 -0
- package/dist/core/styleExtractor/shadcn.d.ts.map +1 -0
- package/dist/core/styleExtractor/shadcn.js +345 -0
- package/dist/core/styleExtractor/shadcn.js.map +1 -0
- package/dist/core/styleExtractor/styleExtractor.d.ts.map +1 -1
- package/dist/core/styleExtractor/styleExtractor.js +270 -78
- package/dist/core/styleExtractor/styleExtractor.js.map +1 -1
- package/dist/core/styleExtractor/styled.d.ts +1 -1
- package/dist/core/styleExtractor/styled.d.ts.map +1 -1
- package/dist/core/styleExtractor/styled.js +308 -23
- package/dist/core/styleExtractor/styled.js.map +1 -1
- package/dist/core/styleExtractor/tailwind.d.ts +21 -3
- package/dist/core/styleExtractor/tailwind.d.ts.map +1 -1
- package/dist/core/styleExtractor/tailwind.js +279 -46
- package/dist/core/styleExtractor/tailwind.js.map +1 -1
- package/dist/types/UIFContract.d.ts +45 -0
- package/dist/types/UIFContract.d.ts.map +1 -1
- package/dist/types/UIFContract.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +41 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/debug.d.ts +12 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +16 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/fsx.d.ts +2 -1
- package/dist/utils/fsx.d.ts.map +1 -1
- package/dist/utils/fsx.js +99 -28
- package/dist/utils/fsx.js.map +1 -1
- package/dist/utils/gitignore.d.ts.map +1 -1
- package/dist/utils/gitignore.js +28 -1
- package/dist/utils/gitignore.js.map +1 -1
- package/package.json +1 -1
- package/schema/logicstamp.context.schema.json +48 -1
|
@@ -1,74 +1,443 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Framer Motion extractor - Extracts animation configurations
|
|
3
3
|
*/
|
|
4
|
+
import { SyntaxKind } from 'ts-morph';
|
|
5
|
+
import { debugError } from '../../utils/debug.js';
|
|
4
6
|
/**
|
|
5
|
-
* Extract Framer Motion animation configurations
|
|
7
|
+
* Extract Framer Motion animation configurations using AST
|
|
6
8
|
*/
|
|
7
9
|
export function extractMotionConfig(source) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
try {
|
|
11
|
+
const components = new Set();
|
|
12
|
+
const variants = new Set();
|
|
13
|
+
let hasGestures = false;
|
|
14
|
+
let hasLayout = false;
|
|
15
|
+
let hasViewport = false;
|
|
16
|
+
// Cache import declarations for reuse
|
|
17
|
+
let importDeclarations = [];
|
|
18
|
+
try {
|
|
19
|
+
importDeclarations = source.getImportDeclarations();
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
debugError('motion', 'extractMotionConfig', {
|
|
23
|
+
error: error instanceof Error ? error.message : String(error),
|
|
24
|
+
context: 'getImportDeclarations',
|
|
25
|
+
});
|
|
26
|
+
// Continue with empty array
|
|
27
|
+
}
|
|
28
|
+
// Check if Framer Motion is actually being used
|
|
29
|
+
let hasFramerMotionImport = false;
|
|
30
|
+
try {
|
|
31
|
+
hasFramerMotionImport = importDeclarations.some(imp => {
|
|
32
|
+
const mod = imp.getModuleSpecifierValue();
|
|
33
|
+
return mod === 'framer-motion' || mod.startsWith('framer-motion/');
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
debugError('motion', 'extractMotionConfig', {
|
|
38
|
+
error: error instanceof Error ? error.message : String(error),
|
|
39
|
+
context: 'checkFramerMotionImports',
|
|
40
|
+
});
|
|
41
|
+
// Default to false on error
|
|
42
|
+
}
|
|
43
|
+
// Extract motion components (motion.div, motion.button, etc.) using AST
|
|
44
|
+
let propertyAccessExpressions = [];
|
|
45
|
+
try {
|
|
46
|
+
propertyAccessExpressions = source.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
debugError('motion', 'extractMotionConfig', {
|
|
50
|
+
error: error instanceof Error ? error.message : String(error),
|
|
51
|
+
context: 'getPropertyAccessExpressions',
|
|
52
|
+
});
|
|
53
|
+
// Continue with empty array
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
for (const propAccess of propertyAccessExpressions) {
|
|
57
|
+
const expression = propAccess.getExpression();
|
|
58
|
+
if (expression.getKind() === SyntaxKind.Identifier && expression.getText() === 'motion') {
|
|
59
|
+
const name = propAccess.getNameNode().getText();
|
|
60
|
+
components.add(name);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
debugError('motion', 'extractMotionConfig', {
|
|
66
|
+
error: error instanceof Error ? error.message : String(error),
|
|
67
|
+
context: 'processPropertyAccessExpressions',
|
|
68
|
+
});
|
|
69
|
+
// Continue - component detection may be incomplete but not fatal
|
|
70
|
+
}
|
|
71
|
+
// Only check for gestures/layout/viewport if Framer Motion is actually being used
|
|
72
|
+
const usesMotion = hasFramerMotionImport || components.size > 0;
|
|
73
|
+
// Extract variant names from JSX attributes using AST
|
|
74
|
+
let jsxAttributes = [];
|
|
75
|
+
try {
|
|
76
|
+
jsxAttributes = source.getDescendantsOfKind(SyntaxKind.JsxAttribute);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
debugError('motion', 'extractMotionConfig', {
|
|
80
|
+
error: error instanceof Error ? error.message : String(error),
|
|
81
|
+
context: 'getJsxAttributes',
|
|
82
|
+
});
|
|
83
|
+
// Continue with empty array
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
for (const attr of jsxAttributes) {
|
|
87
|
+
const jsxAttr = attr;
|
|
88
|
+
const attrName = jsxAttr.getNameNode().getText();
|
|
89
|
+
if (attrName === 'variants') {
|
|
90
|
+
const initializer = jsxAttr.getInitializer();
|
|
91
|
+
if (initializer && initializer.getKind() === SyntaxKind.JsxExpression) {
|
|
92
|
+
const expr = initializer.getExpression();
|
|
93
|
+
if (expr && expr.getKind() === SyntaxKind.ObjectLiteralExpression) {
|
|
94
|
+
// Extract property names from inline object literal
|
|
95
|
+
const objLiteral = expr.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);
|
|
96
|
+
const properties = objLiteral.getProperties();
|
|
97
|
+
for (const prop of properties) {
|
|
98
|
+
if (prop.getKind() === SyntaxKind.PropertyAssignment) {
|
|
99
|
+
const name = prop.getNameNode();
|
|
100
|
+
if (name.getKind() === SyntaxKind.Identifier) {
|
|
101
|
+
variants.add(name.getText());
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (expr && expr.getKind() === SyntaxKind.Identifier) {
|
|
107
|
+
// Handle variants passed as variable reference (e.g., variants={variants})
|
|
108
|
+
// Find the variable declaration and extract from it
|
|
109
|
+
try {
|
|
110
|
+
const varName = expr.getText();
|
|
111
|
+
const variableDeclarations = source.getDescendantsOfKind(SyntaxKind.VariableDeclaration);
|
|
112
|
+
for (const varDecl of variableDeclarations) {
|
|
113
|
+
const nameNode = varDecl.getNameNode();
|
|
114
|
+
if (nameNode.getKind() === SyntaxKind.Identifier && nameNode.getText() === varName) {
|
|
115
|
+
const initializer = varDecl.getInitializer();
|
|
116
|
+
if (initializer && initializer.getKind() === SyntaxKind.ObjectLiteralExpression) {
|
|
117
|
+
const objLiteral = initializer.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);
|
|
118
|
+
const properties = objLiteral.getProperties();
|
|
119
|
+
for (const prop of properties) {
|
|
120
|
+
if (prop.getKind() === SyntaxKind.PropertyAssignment) {
|
|
121
|
+
const propAssignment = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);
|
|
122
|
+
const propName = propAssignment.getNameNode();
|
|
123
|
+
if (propName.getKind() === SyntaxKind.Identifier) {
|
|
124
|
+
variants.add(propName.getText());
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
debugError('motion', 'extractMotionConfig', {
|
|
135
|
+
error: error instanceof Error ? error.message : String(error),
|
|
136
|
+
context: 'extractVariantsFromVariableDeclarations',
|
|
137
|
+
});
|
|
138
|
+
// Continue - variant detection may be incomplete but not fatal
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
debugError('motion', 'extractMotionConfig', {
|
|
147
|
+
error: error instanceof Error ? error.message : String(error),
|
|
148
|
+
context: 'extractVariantsFromJsxAttributes',
|
|
149
|
+
});
|
|
150
|
+
// Continue - variant detection may be incomplete but not fatal
|
|
151
|
+
}
|
|
152
|
+
// Check for gesture handlers (only if Framer Motion is being used)
|
|
153
|
+
if (usesMotion && !hasGestures) {
|
|
154
|
+
const gestureProps = ['whileHover', 'whileTap', 'whileDrag', 'whileFocus', 'whileInView',
|
|
155
|
+
'onTap', 'onPan', 'onDrag', 'onHover', 'onTapStart', 'onTapEnd',
|
|
156
|
+
'onPanStart', 'onPanEnd', 'onDragStart', 'onDragEnd', 'onHoverStart', 'onHoverEnd'];
|
|
157
|
+
try {
|
|
158
|
+
for (const attr of jsxAttributes) {
|
|
159
|
+
const jsxAttr = attr;
|
|
160
|
+
const attrName = jsxAttr.getNameNode().getText();
|
|
161
|
+
if (gestureProps.includes(attrName)) {
|
|
162
|
+
hasGestures = true;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
debugError('motion', 'extractMotionConfig', {
|
|
169
|
+
error: error instanceof Error ? error.message : String(error),
|
|
170
|
+
context: 'checkGestures',
|
|
171
|
+
});
|
|
172
|
+
// Default to false on error
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Check for layout animations (only if Framer Motion is being used)
|
|
176
|
+
if (usesMotion && !hasLayout) {
|
|
177
|
+
try {
|
|
178
|
+
for (const attr of jsxAttributes) {
|
|
179
|
+
const jsxAttr = attr;
|
|
180
|
+
const attrName = jsxAttr.getNameNode().getText();
|
|
181
|
+
if (attrName === 'layout' || attrName === 'layoutId') {
|
|
182
|
+
hasLayout = true;
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
debugError('motion', 'extractMotionConfig', {
|
|
189
|
+
error: error instanceof Error ? error.message : String(error),
|
|
190
|
+
context: 'checkLayoutAnimations',
|
|
191
|
+
});
|
|
192
|
+
// Default to false on error
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Check for viewport animations (only if Framer Motion is being used)
|
|
196
|
+
if (usesMotion && !hasViewport) {
|
|
197
|
+
try {
|
|
198
|
+
for (const attr of jsxAttributes) {
|
|
199
|
+
const jsxAttr = attr;
|
|
200
|
+
const attrName = jsxAttr.getNameNode().getText();
|
|
201
|
+
if (attrName === 'viewport') {
|
|
202
|
+
hasViewport = true;
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
debugError('motion', 'extractMotionConfig', {
|
|
209
|
+
error: error instanceof Error ? error.message : String(error),
|
|
210
|
+
context: 'checkViewportAnimations',
|
|
211
|
+
});
|
|
212
|
+
// Default to false on error
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Check for useInView hook using AST (only if Framer Motion is being used)
|
|
216
|
+
if (usesMotion && !hasViewport) {
|
|
217
|
+
try {
|
|
218
|
+
const callExpressions = source.getDescendantsOfKind(SyntaxKind.CallExpression);
|
|
219
|
+
for (const callExpr of callExpressions) {
|
|
220
|
+
const expr = callExpr.getExpression();
|
|
221
|
+
if (expr.getKind() === SyntaxKind.Identifier && expr.getText() === 'useInView') {
|
|
222
|
+
hasViewport = true;
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
debugError('motion', 'extractMotionConfig', {
|
|
229
|
+
error: error instanceof Error ? error.message : String(error),
|
|
230
|
+
context: 'checkUseInViewHook',
|
|
231
|
+
});
|
|
232
|
+
// Default to false on error
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
components: Array.from(components).sort(),
|
|
237
|
+
variants: Array.from(variants).sort(),
|
|
238
|
+
hasGestures,
|
|
239
|
+
hasLayout,
|
|
240
|
+
hasViewport,
|
|
241
|
+
};
|
|
15
242
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
243
|
+
catch (error) {
|
|
244
|
+
debugError('motion', 'extractMotionConfig', {
|
|
245
|
+
error: error instanceof Error ? error.message : String(error),
|
|
246
|
+
});
|
|
247
|
+
// Return empty/default values on unexpected errors
|
|
248
|
+
return {
|
|
249
|
+
components: [],
|
|
250
|
+
variants: [],
|
|
251
|
+
hasGestures: false,
|
|
252
|
+
hasLayout: false,
|
|
253
|
+
hasViewport: false,
|
|
254
|
+
};
|
|
22
255
|
}
|
|
23
|
-
// Check for gesture handlers
|
|
24
|
-
const hasGestures = /while(Hover|Tap|Drag|Focus|InView)\s*=/.test(sourceText) ||
|
|
25
|
-
/on(Tap|Pan|Drag|Hover)(Start|End)?\s*=/.test(sourceText);
|
|
26
|
-
// Check for layout animations
|
|
27
|
-
const hasLayout = /layout(?:Id)?\s*=/.test(sourceText);
|
|
28
|
-
// Check for viewport animations
|
|
29
|
-
const hasViewport = /useInView|viewport\s*=\s*\{/.test(sourceText);
|
|
30
|
-
return {
|
|
31
|
-
components: Array.from(components).sort(),
|
|
32
|
-
variants: Array.from(variants).sort(),
|
|
33
|
-
hasGestures,
|
|
34
|
-
hasLayout,
|
|
35
|
-
hasViewport,
|
|
36
|
-
};
|
|
37
256
|
}
|
|
38
257
|
/**
|
|
39
|
-
* Extract animation metadata
|
|
258
|
+
* Extract animation metadata using AST
|
|
40
259
|
*/
|
|
41
260
|
export function extractAnimationMetadata(source) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
});
|
|
49
|
-
if (hasFramerMotion) {
|
|
50
|
-
animation.library = 'framer-motion';
|
|
51
|
-
// Check for fade-in patterns
|
|
52
|
-
if (/animate\s*=\s*\{\{\s*opacity:\s*1/.test(sourceText)) {
|
|
53
|
-
animation.type = 'fade-in';
|
|
54
|
-
}
|
|
55
|
-
// Check for useInView hook
|
|
56
|
-
if (/useInView/.test(sourceText)) {
|
|
57
|
-
animation.trigger = 'inView';
|
|
261
|
+
try {
|
|
262
|
+
const animation = {};
|
|
263
|
+
// Cache import declarations for reuse
|
|
264
|
+
let importDeclarations = [];
|
|
265
|
+
try {
|
|
266
|
+
importDeclarations = source.getImportDeclarations();
|
|
58
267
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
268
|
+
catch (error) {
|
|
269
|
+
debugError('motion', 'extractAnimationMetadata', {
|
|
270
|
+
error: error instanceof Error ? error.message : String(error),
|
|
271
|
+
context: 'getImportDeclarations',
|
|
272
|
+
});
|
|
273
|
+
// Continue with empty array
|
|
274
|
+
}
|
|
275
|
+
// Check for framer-motion animations using AST
|
|
276
|
+
let hasFramerMotion = false;
|
|
277
|
+
try {
|
|
278
|
+
hasFramerMotion = importDeclarations.some(imp => {
|
|
279
|
+
const mod = imp.getModuleSpecifierValue();
|
|
280
|
+
return mod === 'framer-motion' || mod.startsWith('framer-motion/');
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
debugError('motion', 'extractAnimationMetadata', {
|
|
285
|
+
error: error instanceof Error ? error.message : String(error),
|
|
286
|
+
context: 'checkFramerMotionImports',
|
|
287
|
+
});
|
|
288
|
+
// Default to false on error
|
|
289
|
+
}
|
|
290
|
+
// Cache JSX attributes once for reuse in both Framer Motion and CSS checks
|
|
291
|
+
let jsxAttributes = [];
|
|
292
|
+
try {
|
|
293
|
+
jsxAttributes = source.getDescendantsOfKind(SyntaxKind.JsxAttribute);
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
debugError('motion', 'extractAnimationMetadata', {
|
|
297
|
+
error: error instanceof Error ? error.message : String(error),
|
|
298
|
+
context: 'getJsxAttributes',
|
|
299
|
+
});
|
|
300
|
+
// Continue with empty array
|
|
301
|
+
}
|
|
302
|
+
if (hasFramerMotion) {
|
|
303
|
+
animation.library = 'framer-motion';
|
|
304
|
+
// Check for fade-in patterns using AST
|
|
305
|
+
try {
|
|
306
|
+
for (const attr of jsxAttributes) {
|
|
307
|
+
if (attr.getNameNode().getText() === 'animate') {
|
|
308
|
+
const animateInitializer = attr.getInitializer();
|
|
309
|
+
if (animateInitializer && animateInitializer.getKind() === SyntaxKind.JsxExpression) {
|
|
310
|
+
const expr = animateInitializer.getExpression();
|
|
311
|
+
if (expr && expr.getKind() === SyntaxKind.ObjectLiteralExpression) {
|
|
312
|
+
const objLiteral = expr.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);
|
|
313
|
+
const properties = objLiteral.getProperties();
|
|
314
|
+
for (const prop of properties) {
|
|
315
|
+
if (prop.getKind() === SyntaxKind.PropertyAssignment) {
|
|
316
|
+
const name = prop.getNameNode();
|
|
317
|
+
if (name.getKind() === SyntaxKind.Identifier && name.getText() === 'opacity') {
|
|
318
|
+
const opacityInitializer = prop.getInitializer();
|
|
319
|
+
if (opacityInitializer && opacityInitializer.getKind() === SyntaxKind.NumericLiteral) {
|
|
320
|
+
const value = opacityInitializer.getLiteralValue?.() ?? parseFloat(opacityInitializer.getText());
|
|
321
|
+
if (value === 1) {
|
|
322
|
+
animation.type = 'fade-in';
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
if (animation.type === 'fade-in')
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
debugError('motion', 'extractAnimationMetadata', {
|
|
338
|
+
error: error instanceof Error ? error.message : String(error),
|
|
339
|
+
context: 'checkFadeInPatterns',
|
|
340
|
+
});
|
|
341
|
+
// Continue - animation detection may be incomplete but not fatal
|
|
342
|
+
}
|
|
343
|
+
// Check for useInView hook using AST
|
|
344
|
+
if (!animation.trigger) {
|
|
345
|
+
try {
|
|
346
|
+
const callExpressions = source.getDescendantsOfKind(SyntaxKind.CallExpression);
|
|
347
|
+
for (const callExpr of callExpressions) {
|
|
348
|
+
const expr = callExpr.getExpression();
|
|
349
|
+
if (expr.getKind() === SyntaxKind.Identifier && expr.getText() === 'useInView') {
|
|
350
|
+
animation.trigger = 'inView';
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
debugError('motion', 'extractAnimationMetadata', {
|
|
357
|
+
error: error instanceof Error ? error.message : String(error),
|
|
358
|
+
context: 'checkUseInViewHook',
|
|
359
|
+
});
|
|
360
|
+
// Continue - trigger detection may be incomplete but not fatal
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Check for CSS transitions/animations using AST (reuse jsxAttributes from above)
|
|
365
|
+
let hasTransition = false;
|
|
366
|
+
let hasAnimateClass = false;
|
|
367
|
+
try {
|
|
368
|
+
// Check for transition attribute or transition-related classes in className
|
|
369
|
+
hasTransition = jsxAttributes.some(attr => {
|
|
370
|
+
const name = attr.getNameNode().getText();
|
|
371
|
+
if (name === 'transition')
|
|
372
|
+
return true; // explicit prop
|
|
373
|
+
if (name === 'className' || name === 'class') {
|
|
374
|
+
const attrInitializer = attr.getInitializer();
|
|
375
|
+
if (attrInitializer) {
|
|
376
|
+
const text = attrInitializer.getText();
|
|
377
|
+
// Tailwind-style transitions
|
|
378
|
+
return /(?:^|\s)transition-/.test(text) || /(?:^|\s)duration-/.test(text);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return false;
|
|
382
|
+
});
|
|
383
|
+
hasAnimateClass = jsxAttributes.some(attr => {
|
|
384
|
+
const attrName = attr.getNameNode().getText();
|
|
385
|
+
if (attrName === 'className' || attrName === 'class') {
|
|
386
|
+
const attrInitializer = attr.getInitializer();
|
|
387
|
+
if (attrInitializer) {
|
|
388
|
+
const text = attrInitializer.getText();
|
|
389
|
+
return /animate-/.test(text);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return false;
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
debugError('motion', 'extractAnimationMetadata', {
|
|
397
|
+
error: error instanceof Error ? error.message : String(error),
|
|
398
|
+
context: 'checkCSSTransitionsAnimations',
|
|
399
|
+
});
|
|
400
|
+
// Default to false on error
|
|
401
|
+
}
|
|
402
|
+
if (hasTransition || hasAnimateClass) {
|
|
403
|
+
if (!animation.library) {
|
|
404
|
+
animation.library = 'css';
|
|
405
|
+
}
|
|
406
|
+
if (!animation.type && hasAnimateClass) {
|
|
407
|
+
try {
|
|
408
|
+
// Extract animate- class name
|
|
409
|
+
for (const attr of jsxAttributes) {
|
|
410
|
+
const attrName = attr.getNameNode().getText();
|
|
411
|
+
if (attrName === 'className' || attrName === 'class') {
|
|
412
|
+
const attrInitializer = attr.getInitializer();
|
|
413
|
+
if (attrInitializer) {
|
|
414
|
+
const text = attrInitializer.getText();
|
|
415
|
+
const animateMatch = text.match(/animate-([a-zA-Z0-9_-]+)/);
|
|
416
|
+
if (animateMatch) {
|
|
417
|
+
animation.type = animateMatch[1];
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
debugError('motion', 'extractAnimationMetadata', {
|
|
426
|
+
error: error instanceof Error ? error.message : String(error),
|
|
427
|
+
context: 'extractAnimateClassName',
|
|
428
|
+
});
|
|
429
|
+
// Continue - animation type detection may be incomplete but not fatal
|
|
430
|
+
}
|
|
69
431
|
}
|
|
70
432
|
}
|
|
433
|
+
return animation;
|
|
434
|
+
}
|
|
435
|
+
catch (error) {
|
|
436
|
+
debugError('motion', 'extractAnimationMetadata', {
|
|
437
|
+
error: error instanceof Error ? error.message : String(error),
|
|
438
|
+
});
|
|
439
|
+
// Return empty object on unexpected errors
|
|
440
|
+
return {};
|
|
71
441
|
}
|
|
72
|
-
return animation;
|
|
73
442
|
}
|
|
74
443
|
//# sourceMappingURL=motion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../../../src/core/styleExtractor/motion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IAOpD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAExC,8DAA8D;IAC9D,MAAM,sBAAsB,GAAG,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,sBAAsB,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,CAAC,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,wBAAwB;IACxB,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,CAAC,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,6BAA6B;IAC7B,MAAM,WAAW,GAAG,wCAAwC,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1D,wCAAwC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE7E,8BAA8B;IAC9B,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEvD,gCAAgC;IAChC,MAAM,WAAW,GAAG,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEnE,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;QACzC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;QACrC,WAAW;QACX,SAAS;QACT,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAkB;IACzD,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAExC,qCAAqC;IACrC,MAAM,eAAe,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAChE,MAAM,eAAe,GAAG,GAAG,CAAC,uBAAuB,EAAE,CAAC;QACtD,OAAO,eAAe,KAAK,eAAe,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,eAAe,EAAE,CAAC;QACpB,SAAS,CAAC,OAAO,GAAG,eAAe,CAAC;QAEpC,6BAA6B;QAC7B,IAAI,mCAAmC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,2BAA2B;QAC3B,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvB,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACvD,IAAI,YAAY,EAAE,CAAC;gBACjB,SAAS,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../../../src/core/styleExtractor/motion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,UAAU,EAA+E,MAAM,UAAU,CAAC;AAE/H,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IAOpD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,sCAAsC;QACtC,IAAI,kBAAkB,GAAG,EAAqD,CAAC;QAC/E,IAAI,CAAC;YACH,kBAAkB,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;gBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;YACH,4BAA4B;QAC9B,CAAC;QAED,gDAAgD;QAChD,IAAI,qBAAqB,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC;YACH,qBAAqB,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACpD,MAAM,GAAG,GAAG,GAAG,CAAC,uBAAuB,EAAE,CAAC;gBAC1C,OAAO,GAAG,KAAK,eAAe,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;gBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,0BAA0B;aACpC,CAAC,CAAC;YACH,4BAA4B;QAC9B,CAAC;QAED,wEAAwE;QACxE,IAAI,yBAAyB,GAA+B,EAAE,CAAC;QAC/D,IAAI,CAAC;YACH,yBAAyB,GAAG,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;gBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,8BAA8B;aACxC,CAAC,CAAC;YACH,4BAA4B;QAC9B,CAAC;QAED,IAAI,CAAC;YACH,KAAK,MAAM,UAAU,IAAI,yBAAyB,EAAE,CAAC;gBACnD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;gBAC9C,IAAI,UAAU,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;oBACxF,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;oBAChD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;gBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,kCAAkC;aAC5C,CAAC,CAAC;YACH,iEAAiE;QACnE,CAAC;QAED,kFAAkF;QAClF,MAAM,UAAU,GAAG,qBAAqB,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;QAEhE,sDAAsD;QACtD,IAAI,aAAa,GAAmB,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;gBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,kBAAkB;aAC5B,CAAC,CAAC;YACH,4BAA4B;QAC9B,CAAC;QAED,IAAI,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,IAAoB,CAAC;gBACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;gBAEjD,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;oBAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;oBAC7C,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;wBACtE,MAAM,IAAI,GAAI,WAAmB,CAAC,aAAa,EAAE,CAAC;wBAClD,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,uBAAuB,EAAE,CAAC;4BAClE,oDAAoD;4BACpD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;4BAC1E,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;4BAC9C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gCAC9B,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,kBAAkB,EAAE,CAAC;oCACrD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oCAChC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;wCAC7C,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;oCAC/B,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;4BAC5D,2EAA2E;4BAC3E,oDAAoD;4BACpD,IAAI,CAAC;gCACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gCAC/B,MAAM,oBAAoB,GAA0B,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;gCAChH,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;oCAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;oCACvC,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC;wCACnF,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;wCAC7C,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,uBAAuB,EAAE,CAAC;4CAChF,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;4CACjF,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;4CAC9C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gDAC9B,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,kBAAkB,EAAE,CAAC;oDACrD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;oDACzE,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;oDAC9C,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;wDACjD,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;oDACnC,CAAC;gDACH,CAAC;4CACH,CAAC;wCACH,CAAC;wCACD,MAAM;oCACR,CAAC;gCACH,CAAC;4BACH,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;oCAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oCAC7D,OAAO,EAAE,yCAAyC;iCACnD,CAAC,CAAC;gCACH,+DAA+D;4BACjE,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;gBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,kCAAkC;aAC5C,CAAC,CAAC;YACH,+DAA+D;QACjE,CAAC;QAED,mEAAmE;QACnE,IAAI,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa;gBACtF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU;gBAC/D,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;YAEtF,IAAI,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;oBACjC,MAAM,OAAO,GAAG,IAAoB,CAAC;oBACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;oBACjD,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpC,WAAW,GAAG,IAAI,CAAC;wBACnB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;oBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,OAAO,EAAE,eAAe;iBACzB,CAAC,CAAC;gBACH,4BAA4B;YAC9B,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,IAAI,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;oBACjC,MAAM,OAAO,GAAG,IAAoB,CAAC;oBACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;oBACjD,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;wBACrD,SAAS,GAAG,IAAI,CAAC;wBACjB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;oBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,OAAO,EAAE,uBAAuB;iBACjC,CAAC,CAAC;gBACH,4BAA4B;YAC9B,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,IAAI,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;oBACjC,MAAM,OAAO,GAAG,IAAoB,CAAC;oBACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;oBACjD,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;wBAC5B,WAAW,GAAG,IAAI,CAAC;wBACnB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;oBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,OAAO,EAAE,yBAAyB;iBACnC,CAAC,CAAC;gBACH,4BAA4B;YAC9B,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,IAAI,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,eAAe,GAAG,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;gBAC/E,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;oBACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;oBACtC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,WAAW,EAAE,CAAC;wBAC/E,WAAW,GAAG,IAAI,CAAC;wBACnB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;oBAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,OAAO,EAAE,oBAAoB;iBAC9B,CAAC,CAAC;gBACH,4BAA4B;YAC9B,CAAC;QACH,CAAC;QAED,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;YACzC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;YACrC,WAAW;YACX,SAAS;YACT,WAAW;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE;YAC1C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,mDAAmD;QACnD,OAAO;YACL,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;YACZ,WAAW,EAAE,KAAK;YAClB,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAkB;IACzD,IAAI,CAAC;QACH,MAAM,SAAS,GAAsB,EAAE,CAAC;QAExC,sCAAsC;QACtC,IAAI,kBAAkB,GAAG,EAAqD,CAAC;QAC/E,IAAI,CAAC;YACH,kBAAkB,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,0BAA0B,EAAE;gBAC/C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;YACH,4BAA4B;QAC9B,CAAC;QAED,+CAA+C;QAC/C,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC;YACH,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,uBAAuB,EAAE,CAAC;gBAC1C,OAAO,GAAG,KAAK,eAAe,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,0BAA0B,EAAE;gBAC/C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,0BAA0B;aACpC,CAAC,CAAC;YACH,4BAA4B;QAC9B,CAAC;QAED,2EAA2E;QAC3E,IAAI,aAAa,GAAmB,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,0BAA0B,EAAE;gBAC/C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,kBAAkB;aAC5B,CAAC,CAAC;YACH,4BAA4B;QAC9B,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,SAAS,CAAC,OAAO,GAAG,eAAe,CAAC;YAEpC,uCAAuC;YAEvC,IAAI,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;oBACjC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;wBAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;wBACjD,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;4BACpF,MAAM,IAAI,GAAI,kBAA0B,CAAC,aAAa,EAAE,CAAC;4BACzD,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,uBAAuB,EAAE,CAAC;gCAClE,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;gCAC1E,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;gCAC9C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;oCAC9B,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,kBAAkB,EAAE,CAAC;wCACrD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;wCAChC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;4CAC7E,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;4CACjD,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,cAAc,EAAE,CAAC;gDACrF,MAAM,KAAK,GAAI,kBAA0B,CAAC,eAAe,EAAE,EAAE,IAAI,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC;gDAC1G,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oDAChB,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC;oDAC3B,MAAM;gDACR,CAAC;4CACH,CAAC;wCACH,CAAC;oCACH,CAAC;gCACH,CAAC;gCACD,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS;oCAAE,MAAM;4BAC1C,CAAC;wBACH,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,QAAQ,EAAE,0BAA0B,EAAE;oBAC/C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,OAAO,EAAE,qBAAqB;iBAC/B,CAAC,CAAC;gBACH,iEAAiE;YACnE,CAAC;YAEC,qCAAqC;YACrC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,eAAe,GAAqB,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;oBACjG,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;wBACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;wBACtC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,WAAW,EAAE,CAAC;4BAC/E,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC;4BAC7B,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,UAAU,CAAC,QAAQ,EAAE,0BAA0B,EAAE;wBAC/C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC7D,OAAO,EAAE,oBAAoB;qBAC9B,CAAC,CAAC;oBACH,+DAA+D;gBACjE,CAAC;YACH,CAAC;QACH,CAAC;QAED,kFAAkF;QAClF,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,IAAI,CAAC;YACH,4EAA4E;YAC5E,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;gBAE1C,IAAI,IAAI,KAAK,YAAY;oBAAE,OAAO,IAAI,CAAC,CAAC,gBAAgB;gBAExD,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC7C,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC9C,IAAI,eAAe,EAAE,CAAC;wBACpB,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC;wBACvC,6BAA6B;wBAC7B,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5E,CAAC;gBACH,CAAC;gBAED,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;gBAC9C,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACrD,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC9C,IAAI,eAAe,EAAE,CAAC;wBACpB,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC;wBACvC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,0BAA0B,EAAE;gBAC/C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,+BAA+B;aACzC,CAAC,CAAC;YACH,4BAA4B;QAC9B,CAAC;QAED,IAAI,aAAa,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACvB,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,8BAA8B;oBAC9B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;wBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;wBAC9C,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;4BACrD,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;4BAC9C,IAAI,eAAe,EAAE,CAAC;gCACpB,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC;gCACvC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gCAC5D,IAAI,YAAY,EAAE,CAAC;oCACjB,SAAS,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oCACjC,MAAM;gCACR,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,UAAU,CAAC,QAAQ,EAAE,0BAA0B,EAAE;wBAC/C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC7D,OAAO,EAAE,yBAAyB;qBACnC,CAAC,CAAC;oBACH,sEAAsE;gBACxE,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,QAAQ,EAAE,0BAA0B,EAAE;YAC/C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,2CAA2C;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Radix UI extractor - Extracts Radix UI primitive usage
|
|
3
|
+
* Radix UI provides unstyled, accessible components/primitives
|
|
4
|
+
* Many teams use Radix directly, and ShadCN is built on top of it
|
|
5
|
+
*/
|
|
6
|
+
import { SourceFile } from 'ts-morph';
|
|
7
|
+
/**
|
|
8
|
+
* Extract Radix UI primitive usage from a source file
|
|
9
|
+
*/
|
|
10
|
+
export declare function extractRadixUI(source: SourceFile): {
|
|
11
|
+
primitives: Record<string, string[]>;
|
|
12
|
+
patterns: {
|
|
13
|
+
controlled: string[];
|
|
14
|
+
uncontrolled: string[];
|
|
15
|
+
portals: number;
|
|
16
|
+
asChild: number;
|
|
17
|
+
};
|
|
18
|
+
accessibility: {
|
|
19
|
+
usesDirection?: boolean;
|
|
20
|
+
usesFocusManagement?: boolean;
|
|
21
|
+
usesKeyboardNav?: boolean;
|
|
22
|
+
usesModal?: boolean;
|
|
23
|
+
};
|
|
24
|
+
features: {
|
|
25
|
+
primitiveCount?: number;
|
|
26
|
+
compositionDepth?: 'simple' | 'moderate' | 'complex';
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=radix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radix.d.ts","sourceRoot":"","sources":["../../../src/core/styleExtractor/radix.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,EAMX,MAAM,UAAU,CAAC;AAqDlB;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG;IAClD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,aAAa,EAAE;QACb,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;KACtD,CAAC;CACH,CAqRA"}
|