logicstamp-context 0.2.4 → 0.2.6

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.
Files changed (107) hide show
  1. package/LLM_CONTEXT.md +2 -2
  2. package/README.md +28 -19
  3. package/dist/cli/commands/compare.d.ts.map +1 -1
  4. package/dist/cli/commands/compare.js +120 -13
  5. package/dist/cli/commands/compare.js.map +1 -1
  6. package/dist/cli/commands/context/fileWriter.d.ts.map +1 -1
  7. package/dist/cli/commands/context/fileWriter.js +68 -6
  8. package/dist/cli/commands/context/fileWriter.js.map +1 -1
  9. package/dist/cli/commands/context/tokenEstimator.d.ts.map +1 -1
  10. package/dist/cli/commands/context/tokenEstimator.js +12 -4
  11. package/dist/cli/commands/context/tokenEstimator.js.map +1 -1
  12. package/dist/cli/commands/context.d.ts.map +1 -1
  13. package/dist/cli/commands/context.js +71 -2
  14. package/dist/cli/commands/context.js.map +1 -1
  15. package/dist/cli/commands/validate.d.ts.map +1 -1
  16. package/dist/cli/commands/validate.js +84 -8
  17. package/dist/cli/commands/validate.js.map +1 -1
  18. package/dist/cli/handlers/compareHandler.d.ts.map +1 -1
  19. package/dist/cli/handlers/compareHandler.js +123 -9
  20. package/dist/cli/handlers/compareHandler.js.map +1 -1
  21. package/dist/core/astParser/detectors.d.ts.map +1 -1
  22. package/dist/core/astParser/detectors.js +130 -57
  23. package/dist/core/astParser/detectors.js.map +1 -1
  24. package/dist/core/astParser/extractors/componentExtractor.d.ts.map +1 -1
  25. package/dist/core/astParser/extractors/componentExtractor.js +89 -20
  26. package/dist/core/astParser/extractors/componentExtractor.js.map +1 -1
  27. package/dist/core/astParser/extractors/eventExtractor.d.ts.map +1 -1
  28. package/dist/core/astParser/extractors/eventExtractor.js +83 -28
  29. package/dist/core/astParser/extractors/eventExtractor.js.map +1 -1
  30. package/dist/core/astParser/extractors/propExtractor.d.ts.map +1 -1
  31. package/dist/core/astParser/extractors/propExtractor.js +142 -51
  32. package/dist/core/astParser/extractors/propExtractor.js.map +1 -1
  33. package/dist/core/astParser/extractors/stateExtractor.d.ts.map +1 -1
  34. package/dist/core/astParser/extractors/stateExtractor.js +95 -44
  35. package/dist/core/astParser/extractors/stateExtractor.js.map +1 -1
  36. package/dist/core/astParser.d.ts +4 -1
  37. package/dist/core/astParser.d.ts.map +1 -1
  38. package/dist/core/astParser.js +183 -26
  39. package/dist/core/astParser.js.map +1 -1
  40. package/dist/core/contractBuilder.d.ts.map +1 -1
  41. package/dist/core/contractBuilder.js +11 -15
  42. package/dist/core/contractBuilder.js.map +1 -1
  43. package/dist/core/manifest.d.ts.map +1 -1
  44. package/dist/core/manifest.js +82 -4
  45. package/dist/core/manifest.js.map +1 -1
  46. package/dist/core/pack/loader.d.ts.map +1 -1
  47. package/dist/core/pack/loader.js +22 -2
  48. package/dist/core/pack/loader.js.map +1 -1
  49. package/dist/core/pack.d.ts.map +1 -1
  50. package/dist/core/pack.js +57 -1
  51. package/dist/core/pack.js.map +1 -1
  52. package/dist/core/styleExtractor/index.d.ts +1 -0
  53. package/dist/core/styleExtractor/index.d.ts.map +1 -1
  54. package/dist/core/styleExtractor/index.js +1 -0
  55. package/dist/core/styleExtractor/index.js.map +1 -1
  56. package/dist/core/styleExtractor/layout.d.ts +13 -2
  57. package/dist/core/styleExtractor/layout.d.ts.map +1 -1
  58. package/dist/core/styleExtractor/layout.js +135 -65
  59. package/dist/core/styleExtractor/layout.js.map +1 -1
  60. package/dist/core/styleExtractor/material.d.ts.map +1 -1
  61. package/dist/core/styleExtractor/material.js +291 -66
  62. package/dist/core/styleExtractor/material.js.map +1 -1
  63. package/dist/core/styleExtractor/motion.d.ts +2 -2
  64. package/dist/core/styleExtractor/motion.d.ts.map +1 -1
  65. package/dist/core/styleExtractor/motion.js +425 -56
  66. package/dist/core/styleExtractor/motion.js.map +1 -1
  67. package/dist/core/styleExtractor/radix.d.ts +29 -0
  68. package/dist/core/styleExtractor/radix.d.ts.map +1 -0
  69. package/dist/core/styleExtractor/radix.js +315 -0
  70. package/dist/core/styleExtractor/radix.js.map +1 -0
  71. package/dist/core/styleExtractor/scss.d.ts.map +1 -1
  72. package/dist/core/styleExtractor/scss.js +37 -23
  73. package/dist/core/styleExtractor/scss.js.map +1 -1
  74. package/dist/core/styleExtractor/shadcn.d.ts +20 -0
  75. package/dist/core/styleExtractor/shadcn.d.ts.map +1 -0
  76. package/dist/core/styleExtractor/shadcn.js +345 -0
  77. package/dist/core/styleExtractor/shadcn.js.map +1 -0
  78. package/dist/core/styleExtractor/styleExtractor.d.ts.map +1 -1
  79. package/dist/core/styleExtractor/styleExtractor.js +267 -89
  80. package/dist/core/styleExtractor/styleExtractor.js.map +1 -1
  81. package/dist/core/styleExtractor/styled.d.ts +1 -1
  82. package/dist/core/styleExtractor/styled.d.ts.map +1 -1
  83. package/dist/core/styleExtractor/styled.js +308 -23
  84. package/dist/core/styleExtractor/styled.js.map +1 -1
  85. package/dist/core/styleExtractor/tailwind.d.ts +21 -3
  86. package/dist/core/styleExtractor/tailwind.d.ts.map +1 -1
  87. package/dist/core/styleExtractor/tailwind.js +279 -46
  88. package/dist/core/styleExtractor/tailwind.js.map +1 -1
  89. package/dist/types/UIFContract.d.ts +34 -0
  90. package/dist/types/UIFContract.d.ts.map +1 -1
  91. package/dist/types/UIFContract.js.map +1 -1
  92. package/dist/utils/config.d.ts.map +1 -1
  93. package/dist/utils/config.js +41 -2
  94. package/dist/utils/config.js.map +1 -1
  95. package/dist/utils/debug.d.ts +12 -0
  96. package/dist/utils/debug.d.ts.map +1 -0
  97. package/dist/utils/debug.js +16 -0
  98. package/dist/utils/debug.js.map +1 -0
  99. package/dist/utils/fsx.d.ts +2 -1
  100. package/dist/utils/fsx.d.ts.map +1 -1
  101. package/dist/utils/fsx.js +99 -28
  102. package/dist/utils/fsx.js.map +1 -1
  103. package/dist/utils/gitignore.d.ts.map +1 -1
  104. package/dist/utils/gitignore.js +28 -1
  105. package/dist/utils/gitignore.js.map +1 -1
  106. package/package.json +1 -1
  107. package/schema/logicstamp.context.schema.json +26 -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;AAE/E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAgCzF;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,CAatG;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,CA8Cd"}
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 fullText = source.getFullText();
11
- // Get the first few lines (directives must be at the top)
12
- const firstLines = fullText.split('\n').slice(0, 5);
13
- // Check each line - directive must be at start of line (ignoring whitespace)
14
- for (const line of firstLines) {
15
- const trimmed = line.trim();
16
- // Skip empty lines and comments
17
- if (!trimmed || trimmed.startsWith('//') || trimmed.startsWith('/*')) {
18
- continue;
19
- }
20
- // Check for 'use client' directive at start of statement
21
- if (/^['"]use client['"];?$/.test(trimmed)) {
22
- return 'client';
23
- }
24
- // Check for 'use server' directive at start of statement
25
- if (/^['"]use server['"];?$/.test(trimmed)) {
26
- return 'server';
27
- }
28
- // If we hit a non-comment, non-directive line, stop looking
29
- if (trimmed) {
30
- break;
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 directive = detectNextJsDirective(source);
51
- const isInApp = isInNextAppDir(filePath);
52
- // Only return metadata if we have something to report
53
- if (directive || isInApp) {
54
- return {
55
- ...(isInApp && { isInAppDir: true }),
56
- ...(directive && { directive })
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
- // React component: has hooks or JSX components
66
- if (hooks.length > 0 || components.length > 0) {
67
- return 'react:component';
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.createElement usage
81
- if (/React\.createElement/.test(sourceText)) {
82
- return 'react:component';
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
- // Check for React component type annotations
85
- // Look for React.FC, React.FunctionComponent, or return type JSX.Element
86
- if (/React\.(FC|FunctionComponent|ReactElement)|:\s*JSX\.Element/.test(sourceText)) {
87
- return 'react:component';
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
- // Node CLI: check for CLI-specific patterns
91
- // 1. File is in a /cli/ directory, OR
92
- // 2. File uses process.argv (CLI argument parsing)
93
- const isInCliDir = /[/\\]cli[/\\]/.test(filePath);
94
- const sourceText = source.getFullText();
95
- const usesProcessArgv = /process\.argv/.test(sourceText);
96
- if (isInCliDir || usesProcessArgv) {
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":"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"}
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;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAkB;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,SAAS,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAEtC,0DAA0D;QAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEpD,6EAA6E;QAC7E,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAE5B,gCAAgC;gBAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrE,SAAS;gBACX,CAAC;gBAED,yDAAyD;gBACzD,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3C,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAED,yDAAyD;gBACzD,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3C,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAED,4DAA4D;gBAC5D,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM;gBACR,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,UAAU,EAAE,uBAAuB,EAAE;oBAC9C,QAAQ;oBACR,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,OAAO,EAAE,gBAAgB;iBAC1B,CAAC,CAAC;gBACH,0BAA0B;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,UAAU,EAAE,uBAAuB,EAAE;YAC9C,QAAQ;YACR,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,0DAA0D;IAC1D,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEpD,6DAA6D;IAC7D,yDAAyD;IACzD,OAAO,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAkB,EAAE,QAAgB;IACxE,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,QAAQ,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAEzC,sDAAsD;QACtD,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;YACzB,OAAO;gBACL,GAAG,CAAC,OAAO,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBACpC,GAAG,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;aAChC,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,UAAU,EAAE,uBAAuB,EAAE;YAC9C,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAe,EACf,UAAoB,EACpB,OAAiB,EACjB,QAAgB,EAChB,MAAkB;IAElB,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,QAAQ,CAAC;IAExD,IAAI,CAAC;QACH,+CAA+C;QAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAED,0BAA0B;QAC1B,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAExF,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBAExC,8DAA8D;gBAC9D,IAAI,cAAc,GAAG,KAAK,CAAC;gBAC3B,IAAI,CAAC;oBACH,cAAc,GAAG,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;wBAC9D,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,MAAM,GAAG,CAAC;wBACxE,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBACjF,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE;wBACnC,QAAQ,EAAE,YAAY;wBACtB,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,6BAA6B;gBAC/B,CAAC;gBAED,IAAI,cAAc,EAAE,CAAC;oBACnB,OAAO,iBAAiB,CAAC;gBAC3B,CAAC;gBAED,sCAAsC;gBACtC,IAAI,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5C,OAAO,iBAAiB,CAAC;gBAC3B,CAAC;gBAED,6CAA6C;gBAC7C,yEAAyE;gBACzE,IAAI,6DAA6D,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBACnF,OAAO,iBAAiB,CAAC;gBAC3B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE;oBACnC,QAAQ,EAAE,YAAY;oBACtB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,OAAO,EAAE,kBAAkB;iBAC5B,CAAC,CAAC;gBACH,6BAA6B;YAC/B,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,sCAAsC;QACtC,mDAAmD;QACnD,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEzD,IAAI,UAAU,IAAI,eAAe,EAAE,CAAC;gBAClC,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE;gBACnC,QAAQ,EAAE,YAAY;gBACtB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAC;YACH,0CAA0C;QAC5C,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE;YACnC,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,gCAAgC;QAChC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,6DAA6D;IAC7D,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -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;AAElD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAczD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAoB9D"}
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.getDescendantsOfKind(SyntaxKind.CallExpression).forEach((callExpr) => {
11
- const expr = callExpr.getExpression();
12
- const text = expr.getText();
13
- // Match useXxx pattern
14
- if (/^use[A-Z]/.test(text)) {
15
- hooks.add(text);
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
- // JSX opening elements
26
- source.getDescendantsOfKind(SyntaxKind.JsxOpeningElement).forEach((openingEl) => {
27
- const tagName = openingEl.getTagNameNode().getText();
28
- if (/^[A-Z]/.test(tagName)) {
29
- components.add(tagName);
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
- // Self-closing JSX elements
33
- source.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).forEach((selfClosing) => {
34
- const tagName = selfClosing.getTagNameNode().getText();
35
- if (/^[A-Z]/.test(tagName)) {
36
- components.add(tagName);
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;AAElD;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC7C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC1E,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,uBAAuB;QACvB,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAkB;IAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,uBAAuB;IACvB,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC9E,MAAM,OAAO,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,CAAC;QACrD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;QACpF,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,CAAC;QACvD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,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;AAE/D;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CA+B3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAa7D"}
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.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {
11
- const name = attr.getNameNode().getText();
12
- // Match onXxx pattern
13
- if (/^on[A-Z]/.test(name)) {
14
- const initializer = attr.getInitializer();
15
- if (initializer) {
16
- // Try to infer the event handler signature
17
- const initText = initializer.getText();
18
- // Extract function signature if possible
19
- let signature = '() => void'; // default
20
- // Try to parse arrow function signature: (arg) => { ... }
21
- const arrowMatch = initText.match(/\(([^)]*)\)\s*=>/);
22
- if (arrowMatch) {
23
- signature = `(${arrowMatch[1]}) => void`;
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
- // Look for route-like string literals in JSX
40
- source.getDescendantsOfKind(SyntaxKind.StringLiteral).forEach((strLit) => {
41
- const value = strLit.getLiteralValue();
42
- // Match route patterns like /path, /path/:id, etc.
43
- if (/^\/[a-z0-9\-_/:.]*$/i.test(value)) {
44
- routes.add(value);
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;AAGlD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,MAAM,MAAM,GAA8B,EAAE,CAAC;IAE7C,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;QAE1C,sBAAsB;QACtB,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,IAAI,WAAW,EAAE,CAAC;gBAChB,2CAA2C;gBAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;gBAEvC,yCAAyC;gBACzC,IAAI,SAAS,GAAG,YAAY,CAAC,CAAE,UAAU;gBAEzC,0DAA0D;gBAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBACtD,IAAI,UAAU,EAAE,CAAC;oBACf,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;gBAC3C,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC,GAAG;oBACb,IAAI,EAAE,UAAU;oBAChB,SAAS;iBACV,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,6CAA6C;IAC7C,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACvE,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACvC,mDAAmD;QACnD,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AACnC,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;AAE9D;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAqCzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,QAAQ,CAqCjF"}
1
+ {"version":3,"file":"propExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/propExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAQ,MAAM,UAAU,CAAC;AAC5C,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,CA4GzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,QAAQ,CA+CjF"}