logicstamp-context 0.2.4 → 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 +23 -19
- 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 +1 -0
- package/dist/core/styleExtractor/index.d.ts.map +1 -1
- package/dist/core/styleExtractor/index.js +1 -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.map +1 -1
- package/dist/core/styleExtractor/material.js +291 -66
- package/dist/core/styleExtractor/material.js.map +1 -1
- 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 +267 -89
- 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 +34 -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 +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../../src/core/astParser/detectors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../../src/core/astParser/detectors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG/E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAmDzF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOxD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAuBtG;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,GACjB,YAAY,CAqFd"}
|
|
@@ -2,34 +2,55 @@
|
|
|
2
2
|
* Detectors - Detect component kind and Next.js metadata
|
|
3
3
|
*/
|
|
4
4
|
import { SyntaxKind } from 'ts-morph';
|
|
5
|
+
import { debugError } from '../../utils/debug.js';
|
|
5
6
|
/**
|
|
6
7
|
* Detect Next.js 'use client' or 'use server' directives
|
|
7
8
|
* These directives must appear at the top of the file (before any imports)
|
|
8
9
|
*/
|
|
9
10
|
export function detectNextJsDirective(source) {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
11
|
+
const filePath = source.getFilePath?.() ?? 'unknown';
|
|
12
|
+
try {
|
|
13
|
+
const fullText = source.getFullText();
|
|
14
|
+
// Get the first few lines (directives must be at the top)
|
|
15
|
+
const firstLines = fullText.split('\n').slice(0, 5);
|
|
16
|
+
// Check each line - directive must be at start of line (ignoring whitespace)
|
|
17
|
+
for (const line of firstLines) {
|
|
18
|
+
try {
|
|
19
|
+
const trimmed = line.trim();
|
|
20
|
+
// Skip empty lines and comments
|
|
21
|
+
if (!trimmed || trimmed.startsWith('//') || trimmed.startsWith('/*')) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
// Check for 'use client' directive at start of statement
|
|
25
|
+
if (/^['"]use client['"];?$/.test(trimmed)) {
|
|
26
|
+
return 'client';
|
|
27
|
+
}
|
|
28
|
+
// Check for 'use server' directive at start of statement
|
|
29
|
+
if (/^['"]use server['"];?$/.test(trimmed)) {
|
|
30
|
+
return 'server';
|
|
31
|
+
}
|
|
32
|
+
// If we hit a non-comment, non-directive line, stop looking
|
|
33
|
+
if (trimmed) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
debugError('detector', 'detectNextJsDirective', {
|
|
39
|
+
filePath,
|
|
40
|
+
error: error instanceof Error ? error.message : String(error),
|
|
41
|
+
context: 'directive-line',
|
|
42
|
+
});
|
|
43
|
+
// Continue with next line
|
|
44
|
+
}
|
|
31
45
|
}
|
|
32
46
|
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
debugError('detector', 'detectNextJsDirective', {
|
|
49
|
+
filePath,
|
|
50
|
+
error: error instanceof Error ? error.message : String(error),
|
|
51
|
+
});
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
33
54
|
return undefined;
|
|
34
55
|
}
|
|
35
56
|
/**
|
|
@@ -47,14 +68,24 @@ export function isInNextAppDir(filePath) {
|
|
|
47
68
|
* Extract Next.js metadata from the file
|
|
48
69
|
*/
|
|
49
70
|
export function extractNextJsMetadata(source, filePath) {
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
71
|
+
const resolvedPath = source.getFilePath?.() ?? filePath;
|
|
72
|
+
try {
|
|
73
|
+
const directive = detectNextJsDirective(source);
|
|
74
|
+
const isInApp = isInNextAppDir(filePath);
|
|
75
|
+
// Only return metadata if we have something to report
|
|
76
|
+
if (directive || isInApp) {
|
|
77
|
+
return {
|
|
78
|
+
...(isInApp && { isInAppDir: true }),
|
|
79
|
+
...(directive && { directive })
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
debugError('detector', 'extractNextJsMetadata', {
|
|
85
|
+
filePath: resolvedPath,
|
|
86
|
+
error: error instanceof Error ? error.message : String(error),
|
|
87
|
+
});
|
|
88
|
+
return undefined;
|
|
58
89
|
}
|
|
59
90
|
return undefined;
|
|
60
91
|
}
|
|
@@ -62,39 +93,81 @@ export function extractNextJsMetadata(source, filePath) {
|
|
|
62
93
|
* Detect component kind based on its characteristics
|
|
63
94
|
*/
|
|
64
95
|
export function detectKind(hooks, components, imports, filePath, source) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
// Check for React imports
|
|
70
|
-
const hasReactImport = imports.some(imp => imp === 'react' || imp.startsWith('react/'));
|
|
71
|
-
if (hasReactImport) {
|
|
72
|
-
const sourceText = source.getFullText();
|
|
73
|
-
// Check for any JSX usage (including lowercase HTML elements)
|
|
74
|
-
const hasJsxElements = source.getDescendantsOfKind(SyntaxKind.JsxElement).length > 0 ||
|
|
75
|
-
source.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).length > 0 ||
|
|
76
|
-
source.getDescendantsOfKind(SyntaxKind.JsxFragment).length > 0;
|
|
77
|
-
if (hasJsxElements) {
|
|
96
|
+
const resolvedPath = source.getFilePath?.() ?? filePath;
|
|
97
|
+
try {
|
|
98
|
+
// React component: has hooks or JSX components
|
|
99
|
+
if (hooks.length > 0 || components.length > 0) {
|
|
78
100
|
return 'react:component';
|
|
79
101
|
}
|
|
80
|
-
// Check for React
|
|
81
|
-
|
|
82
|
-
|
|
102
|
+
// Check for React imports
|
|
103
|
+
const hasReactImport = imports.some(imp => imp === 'react' || imp.startsWith('react/'));
|
|
104
|
+
if (hasReactImport) {
|
|
105
|
+
try {
|
|
106
|
+
const sourceText = source.getFullText();
|
|
107
|
+
// Check for any JSX usage (including lowercase HTML elements)
|
|
108
|
+
let hasJsxElements = false;
|
|
109
|
+
try {
|
|
110
|
+
hasJsxElements = source.getDescendantsOfKind(SyntaxKind.JsxElement).length > 0 ||
|
|
111
|
+
source.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).length > 0 ||
|
|
112
|
+
source.getDescendantsOfKind(SyntaxKind.JsxFragment).length > 0;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
debugError('detector', 'detectKind', {
|
|
116
|
+
filePath: resolvedPath,
|
|
117
|
+
error: error instanceof Error ? error.message : String(error),
|
|
118
|
+
context: 'kind-jsx-traversal',
|
|
119
|
+
});
|
|
120
|
+
// Continue with other checks
|
|
121
|
+
}
|
|
122
|
+
if (hasJsxElements) {
|
|
123
|
+
return 'react:component';
|
|
124
|
+
}
|
|
125
|
+
// Check for React.createElement usage
|
|
126
|
+
if (/React\.createElement/.test(sourceText)) {
|
|
127
|
+
return 'react:component';
|
|
128
|
+
}
|
|
129
|
+
// Check for React component type annotations
|
|
130
|
+
// Look for React.FC, React.FunctionComponent, or return type JSX.Element
|
|
131
|
+
if (/React\.(FC|FunctionComponent|ReactElement)|:\s*JSX\.Element/.test(sourceText)) {
|
|
132
|
+
return 'react:component';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
debugError('detector', 'detectKind', {
|
|
137
|
+
filePath: resolvedPath,
|
|
138
|
+
error: error instanceof Error ? error.message : String(error),
|
|
139
|
+
context: 'kind-react-check',
|
|
140
|
+
});
|
|
141
|
+
// Continue with other checks
|
|
142
|
+
}
|
|
83
143
|
}
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
|
|
144
|
+
// Node CLI: check for CLI-specific patterns
|
|
145
|
+
// 1. File is in a /cli/ directory, OR
|
|
146
|
+
// 2. File uses process.argv (CLI argument parsing)
|
|
147
|
+
const isInCliDir = /[/\\]cli[/\\]/.test(filePath);
|
|
148
|
+
try {
|
|
149
|
+
const sourceText = source.getFullText();
|
|
150
|
+
const usesProcessArgv = /process\.argv/.test(sourceText);
|
|
151
|
+
if (isInCliDir || usesProcessArgv) {
|
|
152
|
+
return 'node:cli';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
debugError('detector', 'detectKind', {
|
|
157
|
+
filePath: resolvedPath,
|
|
158
|
+
error: error instanceof Error ? error.message : String(error),
|
|
159
|
+
context: 'kind-cli-check',
|
|
160
|
+
});
|
|
161
|
+
// If CLI check fails, continue to default
|
|
88
162
|
}
|
|
89
163
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return 'node:cli';
|
|
164
|
+
catch (error) {
|
|
165
|
+
debugError('detector', 'detectKind', {
|
|
166
|
+
filePath: resolvedPath,
|
|
167
|
+
error: error instanceof Error ? error.message : String(error),
|
|
168
|
+
});
|
|
169
|
+
// Default fallback on any error
|
|
170
|
+
return 'ts:module';
|
|
98
171
|
}
|
|
99
172
|
// Default: TypeScript module (even if it imports from node:)
|
|
100
173
|
return 'ts:module';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../../src/core/astParser/detectors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../../src/core/astParser/detectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"componentExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/componentExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"componentExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/componentExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAGlD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAgCzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CA+D9D"}
|
|
@@ -2,19 +2,40 @@
|
|
|
2
2
|
* Component Extractor - Extracts JSX components and React hooks from AST
|
|
3
3
|
*/
|
|
4
4
|
import { SyntaxKind } from 'ts-morph';
|
|
5
|
+
import { debugError } from '../../../utils/debug.js';
|
|
5
6
|
/**
|
|
6
7
|
* Extract all React hooks (useState, useEffect, custom hooks)
|
|
7
8
|
*/
|
|
8
9
|
export function extractHooks(source) {
|
|
9
10
|
const hooks = new Set();
|
|
10
|
-
source.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
const filePath = source.getFilePath?.() ?? 'unknown';
|
|
12
|
+
try {
|
|
13
|
+
source.getDescendantsOfKind(SyntaxKind.CallExpression).forEach((callExpr) => {
|
|
14
|
+
try {
|
|
15
|
+
const expr = callExpr.getExpression();
|
|
16
|
+
const text = expr.getText();
|
|
17
|
+
// Match useXxx pattern
|
|
18
|
+
if (/^use[A-Z]/.test(text)) {
|
|
19
|
+
hooks.add(text);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
debugError('componentExtractor', 'extractHooks', {
|
|
24
|
+
filePath,
|
|
25
|
+
error: error instanceof Error ? error.message : String(error),
|
|
26
|
+
context: 'hooks-iteration',
|
|
27
|
+
});
|
|
28
|
+
// Continue with next hook
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
debugError('componentExtractor', 'extractHooks', {
|
|
34
|
+
filePath,
|
|
35
|
+
error: error instanceof Error ? error.message : String(error),
|
|
36
|
+
});
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
18
39
|
return Array.from(hooks).sort();
|
|
19
40
|
}
|
|
20
41
|
/**
|
|
@@ -22,20 +43,68 @@ export function extractHooks(source) {
|
|
|
22
43
|
*/
|
|
23
44
|
export function extractComponents(source) {
|
|
24
45
|
const components = new Set();
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
46
|
+
const filePath = source.getFilePath?.() ?? 'unknown';
|
|
47
|
+
try {
|
|
48
|
+
// JSX opening elements
|
|
49
|
+
try {
|
|
50
|
+
source.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).forEach((openingEl) => {
|
|
51
|
+
try {
|
|
52
|
+
const tagName = openingEl.getTagNameNode().getText();
|
|
53
|
+
if (/^[A-Z]/.test(tagName)) {
|
|
54
|
+
components.add(tagName);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
debugError('componentExtractor', 'extractComponents', {
|
|
59
|
+
filePath,
|
|
60
|
+
error: error instanceof Error ? error.message : String(error),
|
|
61
|
+
context: 'components-opening',
|
|
62
|
+
});
|
|
63
|
+
// Continue with next element
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
debugError('componentExtractor', 'extractComponents', {
|
|
69
|
+
filePath,
|
|
70
|
+
error: error instanceof Error ? error.message : String(error),
|
|
71
|
+
context: 'components-opening-batch',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Self-closing JSX elements
|
|
75
|
+
try {
|
|
76
|
+
source.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).forEach((selfClosing) => {
|
|
77
|
+
try {
|
|
78
|
+
const tagName = selfClosing.getTagNameNode().getText();
|
|
79
|
+
if (/^[A-Z]/.test(tagName)) {
|
|
80
|
+
components.add(tagName);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
debugError('componentExtractor', 'extractComponents', {
|
|
85
|
+
filePath,
|
|
86
|
+
error: error instanceof Error ? error.message : String(error),
|
|
87
|
+
context: 'components-selfclosing',
|
|
88
|
+
});
|
|
89
|
+
// Continue with next element
|
|
90
|
+
}
|
|
91
|
+
});
|
|
30
92
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
93
|
+
catch (error) {
|
|
94
|
+
debugError('componentExtractor', 'extractComponents', {
|
|
95
|
+
filePath,
|
|
96
|
+
error: error instanceof Error ? error.message : String(error),
|
|
97
|
+
context: 'components-selfclosing-batch',
|
|
98
|
+
});
|
|
37
99
|
}
|
|
38
|
-
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
debugError('componentExtractor', 'extractComponents', {
|
|
103
|
+
filePath,
|
|
104
|
+
error: error instanceof Error ? error.message : String(error),
|
|
105
|
+
});
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
39
108
|
return Array.from(components).sort();
|
|
40
109
|
}
|
|
41
110
|
//# sourceMappingURL=componentExtractor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"componentExtractor.js","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/componentExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"componentExtractor.js","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/componentExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/eventExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"eventExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/eventExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CA8D3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CA+B7D"}
|
|
@@ -2,33 +2,68 @@
|
|
|
2
2
|
* Event Extractor - Extracts event handlers and route patterns from AST
|
|
3
3
|
*/
|
|
4
4
|
import { SyntaxKind } from 'ts-morph';
|
|
5
|
+
import { debugError } from '../../../utils/debug.js';
|
|
5
6
|
/**
|
|
6
7
|
* Extract event handlers from JSX attributes
|
|
7
8
|
*/
|
|
8
9
|
export function extractEvents(source) {
|
|
9
10
|
const events = {};
|
|
10
|
-
source.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
11
|
+
const filePath = source.getFilePath?.() ?? 'unknown';
|
|
12
|
+
try {
|
|
13
|
+
source.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {
|
|
14
|
+
try {
|
|
15
|
+
const name = attr.getNameNode().getText();
|
|
16
|
+
// Match onXxx pattern
|
|
17
|
+
if (/^on[A-Z]/.test(name)) {
|
|
18
|
+
const initializer = attr.getInitializer();
|
|
19
|
+
if (initializer) {
|
|
20
|
+
try {
|
|
21
|
+
// Try to infer the event handler signature
|
|
22
|
+
const initText = initializer.getText();
|
|
23
|
+
// Extract function signature if possible
|
|
24
|
+
let signature = '() => void'; // default
|
|
25
|
+
// Try to parse arrow function signature: (arg) => { ... }
|
|
26
|
+
const arrowMatch = initText.match(/\(([^)]*)\)\s*=>/);
|
|
27
|
+
if (arrowMatch) {
|
|
28
|
+
signature = `(${arrowMatch[1]}) => void`;
|
|
29
|
+
}
|
|
30
|
+
events[name] = {
|
|
31
|
+
type: 'function',
|
|
32
|
+
signature
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
debugError('eventExtractor', 'extractEvents', {
|
|
37
|
+
filePath,
|
|
38
|
+
error: error instanceof Error ? error.message : String(error),
|
|
39
|
+
context: 'events-signature',
|
|
40
|
+
});
|
|
41
|
+
// Use default signature
|
|
42
|
+
events[name] = {
|
|
43
|
+
type: 'function',
|
|
44
|
+
signature: '() => void'
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
24
48
|
}
|
|
25
|
-
events[name] = {
|
|
26
|
-
type: 'function',
|
|
27
|
-
signature
|
|
28
|
-
};
|
|
29
49
|
}
|
|
30
|
-
|
|
31
|
-
|
|
50
|
+
catch (error) {
|
|
51
|
+
debugError('eventExtractor', 'extractEvents', {
|
|
52
|
+
filePath,
|
|
53
|
+
error: error instanceof Error ? error.message : String(error),
|
|
54
|
+
context: 'events-iteration',
|
|
55
|
+
});
|
|
56
|
+
// Continue with next attribute
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
debugError('eventExtractor', 'extractEvents', {
|
|
62
|
+
filePath,
|
|
63
|
+
error: error instanceof Error ? error.message : String(error),
|
|
64
|
+
});
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
32
67
|
return events;
|
|
33
68
|
}
|
|
34
69
|
/**
|
|
@@ -36,14 +71,34 @@ export function extractEvents(source) {
|
|
|
36
71
|
*/
|
|
37
72
|
export function extractJsxRoutes(source) {
|
|
38
73
|
const routes = new Set();
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
74
|
+
const filePath = source.getFilePath?.() ?? 'unknown';
|
|
75
|
+
try {
|
|
76
|
+
// Look for route-like string literals in JSX
|
|
77
|
+
source.getDescendantsOfKind(SyntaxKind.StringLiteral).forEach((strLit) => {
|
|
78
|
+
try {
|
|
79
|
+
const value = strLit.getLiteralValue();
|
|
80
|
+
// Match route patterns like /path, /path/:id, etc.
|
|
81
|
+
if (/^\/[a-z0-9\-_/:.]*$/i.test(value)) {
|
|
82
|
+
routes.add(value);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
debugError('eventExtractor', 'extractJsxRoutes', {
|
|
87
|
+
filePath,
|
|
88
|
+
error: error instanceof Error ? error.message : String(error),
|
|
89
|
+
context: 'jsxRoutes-iteration',
|
|
90
|
+
});
|
|
91
|
+
// Continue with next literal
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
debugError('eventExtractor', 'extractJsxRoutes', {
|
|
97
|
+
filePath,
|
|
98
|
+
error: error instanceof Error ? error.message : String(error),
|
|
99
|
+
});
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
47
102
|
return Array.from(routes).sort();
|
|
48
103
|
}
|
|
49
104
|
//# sourceMappingURL=eventExtractor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventExtractor.js","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/eventExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"eventExtractor.js","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/eventExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/propExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"propExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/propExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAG9D;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAkGzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,QAAQ,CA8CjF"}
|