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.
Files changed (102) hide show
  1. package/LLM_CONTEXT.md +2 -2
  2. package/README.md +96 -585
  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 +130 -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 +1 -0
  37. package/dist/core/astParser.d.ts.map +1 -1
  38. package/dist/core/astParser.js +74 -26
  39. package/dist/core/astParser.js.map +1 -1
  40. package/dist/core/manifest.d.ts.map +1 -1
  41. package/dist/core/manifest.js +28 -1
  42. package/dist/core/manifest.js.map +1 -1
  43. package/dist/core/pack/loader.d.ts.map +1 -1
  44. package/dist/core/pack/loader.js +22 -2
  45. package/dist/core/pack/loader.js.map +1 -1
  46. package/dist/core/styleExtractor/index.d.ts +2 -0
  47. package/dist/core/styleExtractor/index.d.ts.map +1 -1
  48. package/dist/core/styleExtractor/index.js +2 -0
  49. package/dist/core/styleExtractor/index.js.map +1 -1
  50. package/dist/core/styleExtractor/layout.d.ts +13 -2
  51. package/dist/core/styleExtractor/layout.d.ts.map +1 -1
  52. package/dist/core/styleExtractor/layout.js +135 -65
  53. package/dist/core/styleExtractor/layout.js.map +1 -1
  54. package/dist/core/styleExtractor/material.d.ts +19 -0
  55. package/dist/core/styleExtractor/material.d.ts.map +1 -0
  56. package/dist/core/styleExtractor/material.js +328 -0
  57. package/dist/core/styleExtractor/material.js.map +1 -0
  58. package/dist/core/styleExtractor/motion.d.ts +2 -2
  59. package/dist/core/styleExtractor/motion.d.ts.map +1 -1
  60. package/dist/core/styleExtractor/motion.js +425 -56
  61. package/dist/core/styleExtractor/motion.js.map +1 -1
  62. package/dist/core/styleExtractor/radix.d.ts +29 -0
  63. package/dist/core/styleExtractor/radix.d.ts.map +1 -0
  64. package/dist/core/styleExtractor/radix.js +315 -0
  65. package/dist/core/styleExtractor/radix.js.map +1 -0
  66. package/dist/core/styleExtractor/scss.d.ts.map +1 -1
  67. package/dist/core/styleExtractor/scss.js +37 -23
  68. package/dist/core/styleExtractor/scss.js.map +1 -1
  69. package/dist/core/styleExtractor/shadcn.d.ts +20 -0
  70. package/dist/core/styleExtractor/shadcn.d.ts.map +1 -0
  71. package/dist/core/styleExtractor/shadcn.js +345 -0
  72. package/dist/core/styleExtractor/shadcn.js.map +1 -0
  73. package/dist/core/styleExtractor/styleExtractor.d.ts.map +1 -1
  74. package/dist/core/styleExtractor/styleExtractor.js +270 -78
  75. package/dist/core/styleExtractor/styleExtractor.js.map +1 -1
  76. package/dist/core/styleExtractor/styled.d.ts +1 -1
  77. package/dist/core/styleExtractor/styled.d.ts.map +1 -1
  78. package/dist/core/styleExtractor/styled.js +308 -23
  79. package/dist/core/styleExtractor/styled.js.map +1 -1
  80. package/dist/core/styleExtractor/tailwind.d.ts +21 -3
  81. package/dist/core/styleExtractor/tailwind.d.ts.map +1 -1
  82. package/dist/core/styleExtractor/tailwind.js +279 -46
  83. package/dist/core/styleExtractor/tailwind.js.map +1 -1
  84. package/dist/types/UIFContract.d.ts +45 -0
  85. package/dist/types/UIFContract.d.ts.map +1 -1
  86. package/dist/types/UIFContract.js.map +1 -1
  87. package/dist/utils/config.d.ts.map +1 -1
  88. package/dist/utils/config.js +41 -2
  89. package/dist/utils/config.js.map +1 -1
  90. package/dist/utils/debug.d.ts +12 -0
  91. package/dist/utils/debug.d.ts.map +1 -0
  92. package/dist/utils/debug.js +16 -0
  93. package/dist/utils/debug.js.map +1 -0
  94. package/dist/utils/fsx.d.ts +2 -1
  95. package/dist/utils/fsx.d.ts.map +1 -1
  96. package/dist/utils/fsx.js +99 -28
  97. package/dist/utils/fsx.js.map +1 -1
  98. package/dist/utils/gitignore.d.ts.map +1 -1
  99. package/dist/utils/gitignore.js +28 -1
  100. package/dist/utils/gitignore.js.map +1 -1
  101. package/package.json +1 -1
  102. package/schema/logicstamp.context.schema.json +48 -1
@@ -1,73 +1,152 @@
1
1
  /**
2
2
  * Prop Extractor - Extracts component props from TypeScript interfaces/types
3
3
  */
4
+ import { debugError } from '../../../utils/debug.js';
4
5
  /**
5
6
  * Extract component props from TypeScript interfaces/types
6
7
  */
7
8
  export function extractProps(source) {
8
9
  const props = {};
9
- // Look for interfaces ending with Props
10
- source.getInterfaces().forEach((iface) => {
11
- if (/Props$/i.test(iface.getName())) {
12
- iface.getProperties().forEach((prop) => {
13
- const name = prop.getName();
14
- const isOptional = prop.hasQuestionToken();
15
- const type = prop.getType().getText();
16
- props[name] = normalizePropType(type, isOptional);
10
+ const filePath = source.getFilePath?.() ?? 'unknown';
11
+ try {
12
+ // Look for interfaces ending with Props
13
+ try {
14
+ source.getInterfaces().forEach((iface) => {
15
+ try {
16
+ if (/Props$/i.test(iface.getName())) {
17
+ iface.getProperties().forEach((prop) => {
18
+ try {
19
+ const name = prop.getName();
20
+ const isOptional = prop.hasQuestionToken();
21
+ const type = prop.getType().getText();
22
+ props[name] = normalizePropType(type, isOptional);
23
+ }
24
+ catch (error) {
25
+ debugError('propExtractor', 'extractProps', {
26
+ filePath,
27
+ error: error instanceof Error ? error.message : String(error),
28
+ context: 'props-interface-property',
29
+ });
30
+ // Continue with next property
31
+ }
32
+ });
33
+ }
34
+ }
35
+ catch (error) {
36
+ debugError('propExtractor', 'extractProps', {
37
+ filePath,
38
+ error: error instanceof Error ? error.message : String(error),
39
+ context: 'props-interface',
40
+ });
41
+ // Continue with next interface
42
+ }
17
43
  });
18
44
  }
19
- });
20
- // Look for type aliases ending with Props
21
- source.getTypeAliases().forEach((typeAlias) => {
22
- if (/Props$/i.test(typeAlias.getName())) {
23
- const type = typeAlias.getType();
24
- const properties = type.getProperties();
25
- properties.forEach((prop) => {
26
- const name = prop.getName();
27
- const propType = prop.getTypeAtLocation(typeAlias).getText();
28
- // Check if optional from declaration
29
- const declarations = prop.getDeclarations();
30
- const isOptional = declarations.some((decl) => decl.getText().includes('?:'));
31
- props[name] = normalizePropType(propType, isOptional);
45
+ catch (error) {
46
+ debugError('propExtractor', 'extractProps', {
47
+ filePath,
48
+ error: error instanceof Error ? error.message : String(error),
49
+ context: 'props-interfaces-batch',
32
50
  });
33
51
  }
34
- });
52
+ // Look for type aliases ending with Props
53
+ try {
54
+ source.getTypeAliases().forEach((typeAlias) => {
55
+ try {
56
+ if (/Props$/i.test(typeAlias.getName())) {
57
+ const type = typeAlias.getType();
58
+ const properties = type.getProperties();
59
+ properties.forEach((prop) => {
60
+ try {
61
+ const name = prop.getName();
62
+ const propType = prop.getTypeAtLocation(typeAlias).getText();
63
+ // Check if optional from declaration
64
+ const declarations = prop.getDeclarations();
65
+ const isOptional = declarations.some((decl) => decl.getText().includes('?:'));
66
+ props[name] = normalizePropType(propType, isOptional);
67
+ }
68
+ catch (error) {
69
+ debugError('propExtractor', 'extractProps', {
70
+ filePath,
71
+ error: error instanceof Error ? error.message : String(error),
72
+ context: 'props-typealias-property',
73
+ });
74
+ // Continue with next property
75
+ }
76
+ });
77
+ }
78
+ }
79
+ catch (error) {
80
+ debugError('propExtractor', 'extractProps', {
81
+ filePath,
82
+ error: error instanceof Error ? error.message : String(error),
83
+ context: 'props-typealias',
84
+ });
85
+ // Continue with next type alias
86
+ }
87
+ });
88
+ }
89
+ catch (error) {
90
+ debugError('propExtractor', 'extractProps', {
91
+ filePath,
92
+ error: error instanceof Error ? error.message : String(error),
93
+ context: 'props-typealiases-batch',
94
+ });
95
+ }
96
+ }
97
+ catch (error) {
98
+ debugError('propExtractor', 'extractProps', {
99
+ filePath,
100
+ error: error instanceof Error ? error.message : String(error),
101
+ });
102
+ return {};
103
+ }
35
104
  return props;
36
105
  }
37
106
  /**
38
107
  * Normalize a prop type into the rich PropType format
39
108
  */
40
109
  export function normalizePropType(typeText, isOptional) {
41
- // Remove 'undefined' from unions if present
42
- const cleanType = typeText.replace(/\s*\|\s*undefined/g, '').trim();
43
- // Detect literal unions: "a" | "b" | "c"
44
- const literalUnionMatch = cleanType.match(/^("[\w-]+"(\s*\|\s*"[\w-]+")+)$/);
45
- if (literalUnionMatch) {
46
- const literals = cleanType
47
- .split('|')
48
- .map(t => t.trim().replace(/^"|"$/g, ''));
49
- return {
50
- type: 'literal-union',
51
- literals,
52
- ...(isOptional && { optional: true })
53
- };
54
- }
55
- // Detect function types: () => void, (x: string) => void
56
- if (cleanType.includes('=>') || cleanType.startsWith('(') && cleanType.includes(')')) {
57
- return {
58
- type: 'function',
59
- signature: cleanType,
60
- ...(isOptional && { optional: true })
61
- };
110
+ try {
111
+ // Remove 'undefined' from unions if present
112
+ const cleanType = typeText.replace(/\s*\|\s*undefined/g, '').trim();
113
+ // Detect literal unions: "a" | "b" | "c"
114
+ const literalUnionMatch = cleanType.match(/^("[\w-]+"(\s*\|\s*"[\w-]+")+)$/);
115
+ if (literalUnionMatch) {
116
+ const literals = cleanType
117
+ .split('|')
118
+ .map(t => t.trim().replace(/^"|"$/g, ''));
119
+ return {
120
+ type: 'literal-union',
121
+ literals,
122
+ ...(isOptional && { optional: true })
123
+ };
124
+ }
125
+ // Detect function types: () => void, (x: string) => void
126
+ if (cleanType.includes('=>') || cleanType.startsWith('(') && cleanType.includes(')')) {
127
+ return {
128
+ type: 'function',
129
+ signature: cleanType,
130
+ ...(isOptional && { optional: true })
131
+ };
132
+ }
133
+ // Simple type with optionality
134
+ if (isOptional && !['string', 'number', 'boolean'].includes(cleanType)) {
135
+ return {
136
+ type: cleanType,
137
+ optional: true
138
+ };
139
+ }
140
+ // Return simple string for common types (backward compat)
141
+ return cleanType;
62
142
  }
63
- // Simple type with optionality
64
- if (isOptional && !['string', 'number', 'boolean'].includes(cleanType)) {
65
- return {
66
- type: cleanType,
67
- optional: true
68
- };
143
+ catch (error) {
144
+ // Fallback to simple string type on error
145
+ debugError('propExtractor', 'normalizePropType', {
146
+ error: error instanceof Error ? error.message : String(error),
147
+ typeText,
148
+ });
149
+ return typeText;
69
150
  }
70
- // Return simple string for common types (backward compat)
71
- return cleanType;
72
151
  }
73
152
  //# sourceMappingURL=propExtractor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"propExtractor.js","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/propExtractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"propExtractor.js","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/propExtractor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stateExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/stateExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAElD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAY7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyCvE"}
1
+ {"version":3,"file":"stateExtractor.d.ts","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/stateExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAGlD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CA8B7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoEvE"}
@@ -2,18 +2,39 @@
2
2
  * State Extractor - Extracts component state and variable declarations from AST
3
3
  */
4
4
  import { SyntaxKind } from 'ts-morph';
5
+ import { debugError } from '../../../utils/debug.js';
5
6
  /**
6
7
  * Extract all variable declarations (const, let, var)
7
8
  */
8
9
  export function extractVariables(source) {
9
10
  const variables = new Set();
10
- source.getVariableDeclarations().forEach((varDecl) => {
11
- const name = varDecl.getName();
12
- // Skip destructured state setters (e.g., setCount from [count, setCount])
13
- if (!name.startsWith('set') || !varDecl.getParent()?.getText().includes('useState')) {
14
- variables.add(name);
15
- }
16
- });
11
+ const filePath = source.getFilePath?.() ?? 'unknown';
12
+ try {
13
+ source.getVariableDeclarations().forEach((varDecl) => {
14
+ try {
15
+ const name = varDecl.getName();
16
+ // Skip destructured state setters (e.g., setCount from [count, setCount])
17
+ if (!name.startsWith('set') || !varDecl.getParent()?.getText().includes('useState')) {
18
+ variables.add(name);
19
+ }
20
+ }
21
+ catch (error) {
22
+ debugError('stateExtractor', 'extractVariables', {
23
+ filePath,
24
+ error: error instanceof Error ? error.message : String(error),
25
+ context: 'variables-iteration',
26
+ });
27
+ // Continue with next variable
28
+ }
29
+ });
30
+ }
31
+ catch (error) {
32
+ debugError('stateExtractor', 'extractVariables', {
33
+ filePath,
34
+ error: error instanceof Error ? error.message : String(error),
35
+ });
36
+ return [];
37
+ }
17
38
  return Array.from(variables).sort();
18
39
  }
19
40
  /**
@@ -21,46 +42,76 @@ export function extractVariables(source) {
21
42
  */
22
43
  export function extractState(source) {
23
44
  const state = {};
24
- source.getDescendantsOfKind(SyntaxKind.VariableDeclaration).forEach((varDecl) => {
25
- const initializer = varDecl.getInitializer();
26
- if (!initializer)
27
- return;
28
- const initText = initializer.getText();
29
- if (initText.startsWith('useState(') || initText.startsWith('useState<')) {
30
- const bindingName = varDecl.getName();
31
- // Extract state variable name from array destructuring [value, setValue]
32
- const match = bindingName.match(/\[([a-zA-Z0-9_]+)\s*,/);
33
- if (match) {
34
- const stateVar = match[1];
35
- // Try to infer type from generic or initial value
36
- let type = 'unknown';
37
- const genericMatch = initText.match(/useState<([^>]+)>/);
38
- if (genericMatch) {
39
- type = genericMatch[1];
40
- }
41
- else {
42
- // Infer from initial value
43
- const valueMatch = initText.match(/useState\(([^)]+)\)/);
44
- if (valueMatch) {
45
- const value = valueMatch[1].trim();
46
- if (value === 'true' || value === 'false')
47
- type = 'boolean';
48
- else if (/^\d+$/.test(value))
49
- type = 'number';
50
- else if (/^["']/.test(value))
51
- type = 'string';
52
- else if (value === 'null')
53
- type = 'null';
54
- else if (value === '[]')
55
- type = 'array';
56
- else if (value === '{}')
57
- type = 'object';
45
+ const filePath = source.getFilePath?.() ?? 'unknown';
46
+ try {
47
+ source.getDescendantsOfKind(SyntaxKind.VariableDeclaration).forEach((varDecl) => {
48
+ try {
49
+ const initializer = varDecl.getInitializer();
50
+ if (!initializer)
51
+ return;
52
+ const initText = initializer.getText();
53
+ if (initText.startsWith('useState(') || initText.startsWith('useState<')) {
54
+ const bindingName = varDecl.getName();
55
+ // Extract state variable name from array destructuring [value, setValue]
56
+ const match = bindingName.match(/\[([a-zA-Z0-9_]+)\s*,/);
57
+ if (match) {
58
+ const stateVar = match[1];
59
+ // Try to infer type from generic or initial value
60
+ let type = 'unknown';
61
+ try {
62
+ const genericMatch = initText.match(/useState<([^>]+)>/);
63
+ if (genericMatch) {
64
+ type = genericMatch[1];
65
+ }
66
+ else {
67
+ // Infer from initial value
68
+ const valueMatch = initText.match(/useState\(([^)]+)\)/);
69
+ if (valueMatch) {
70
+ const value = valueMatch[1].trim();
71
+ if (value === 'true' || value === 'false')
72
+ type = 'boolean';
73
+ else if (/^\d+$/.test(value))
74
+ type = 'number';
75
+ else if (/^["']/.test(value))
76
+ type = 'string';
77
+ else if (value === 'null')
78
+ type = 'null';
79
+ else if (value === '[]')
80
+ type = 'array';
81
+ else if (value === '{}')
82
+ type = 'object';
83
+ }
84
+ }
85
+ }
86
+ catch (error) {
87
+ debugError('stateExtractor', 'extractState', {
88
+ filePath,
89
+ error: error instanceof Error ? error.message : String(error),
90
+ context: 'state-type-inference',
91
+ });
92
+ // Use 'unknown' as fallback
93
+ }
94
+ state[stateVar] = type;
58
95
  }
59
96
  }
60
- state[stateVar] = type;
61
97
  }
62
- }
63
- });
98
+ catch (error) {
99
+ debugError('stateExtractor', 'extractState', {
100
+ filePath,
101
+ error: error instanceof Error ? error.message : String(error),
102
+ context: 'state-iteration',
103
+ });
104
+ // Continue with next declaration
105
+ }
106
+ });
107
+ }
108
+ catch (error) {
109
+ debugError('stateExtractor', 'extractState', {
110
+ filePath,
111
+ error: error instanceof Error ? error.message : String(error),
112
+ });
113
+ return {};
114
+ }
64
115
  return state;
65
116
  }
66
117
  //# sourceMappingURL=stateExtractor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stateExtractor.js","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/stateExtractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,UAAU,EAAE,MAAM,UAAU,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,MAAM,CAAC,uBAAuB,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,0EAA0E;QAC1E,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACpF,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC7C,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9E,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAC7C,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACzE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAEtC,yEAAyE;YACzE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACzD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAE1B,kDAAkD;gBAClD,IAAI,IAAI,GAAG,SAAS,CAAC;gBACrB,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACzD,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACN,2BAA2B;oBAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;oBACzD,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACnC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO;4BAAE,IAAI,GAAG,SAAS,CAAC;6BACvD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;4BAAE,IAAI,GAAG,QAAQ,CAAC;6BACzC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;4BAAE,IAAI,GAAG,QAAQ,CAAC;6BACzC,IAAI,KAAK,KAAK,MAAM;4BAAE,IAAI,GAAG,MAAM,CAAC;6BACpC,IAAI,KAAK,KAAK,IAAI;4BAAE,IAAI,GAAG,OAAO,CAAC;6BACnC,IAAI,KAAK,KAAK,IAAI;4BAAE,IAAI,GAAG,QAAQ,CAAC;oBAC3C,CAAC;gBACH,CAAC;gBAED,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"stateExtractor.js","sourceRoot":"","sources":["../../../../src/core/astParser/extractors/stateExtractor.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,7 @@ export interface AstExtract {
38
38
  }
39
39
  /**
40
40
  * Extract all structural information from a TypeScript/React file
41
+ * Returns empty AST on parsing errors to prevent crashes
41
42
  */
42
43
  export declare function extractFromFile(filePath: string): Promise<AstExtract>;
43
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"astParser.d.ts","sourceRoot":"","sources":["../../src/core/astParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAOjH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAGD;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA8B3E;AAsDD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,UAAU,GAAG,cAAc,CAM1E"}
1
+ {"version":3,"file":"astParser.d.ts","sourceRoot":"","sources":["../../src/core/astParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQjH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAuBD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA2D3E;AAsDD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,UAAU,GAAG,cAAc,CAM1E"}
@@ -27,41 +27,89 @@
27
27
  * Uses ts-morph for robust AST traversal
28
28
  */
29
29
  import { Project, SyntaxKind, Node } from 'ts-morph';
30
+ import { debugError } from '../utils/debug.js';
30
31
  import { extractComponents, extractHooks } from './astParser/extractors/componentExtractor.js';
31
32
  import { extractProps } from './astParser/extractors/propExtractor.js';
32
33
  import { extractState, extractVariables } from './astParser/extractors/stateExtractor.js';
33
34
  import { extractEvents, extractJsxRoutes } from './astParser/extractors/eventExtractor.js';
34
35
  import { detectKind, extractNextJsMetadata } from './astParser/detectors.js';
36
+ /**
37
+ * Safe extraction wrapper that catches errors and logs them
38
+ */
39
+ function safeExtract(label, filePath, extractor, fallback) {
40
+ try {
41
+ return extractor();
42
+ }
43
+ catch (error) {
44
+ debugError('astParser', 'safeExtract', {
45
+ filePath,
46
+ error: error instanceof Error ? error.message : String(error),
47
+ context: label,
48
+ });
49
+ return fallback;
50
+ }
51
+ }
35
52
  /**
36
53
  * Extract all structural information from a TypeScript/React file
54
+ * Returns empty AST on parsing errors to prevent crashes
37
55
  */
38
56
  export async function extractFromFile(filePath) {
39
- const project = new Project({
40
- skipAddingFilesFromTsConfig: true,
41
- compilerOptions: {
42
- jsx: 1, // React JSX
43
- target: 99, // ESNext
44
- },
45
- });
46
- const source = project.addSourceFileAtPath(filePath);
47
- // Extract basic data first
48
- const hooks = extractHooks(source);
49
- const components = extractComponents(source);
50
- const imports = extractImports(source);
51
- const nextjs = extractNextJsMetadata(source, filePath);
52
- return {
53
- kind: detectKind(hooks, components, imports, filePath, source),
54
- variables: extractVariables(source),
55
- hooks,
56
- components,
57
- functions: extractFunctions(source),
58
- props: extractProps(source),
59
- state: extractState(source),
60
- emits: extractEvents(source),
61
- imports,
62
- jsxRoutes: extractJsxRoutes(source),
63
- ...(nextjs && { nextjs }),
64
- };
57
+ try {
58
+ const project = new Project({
59
+ skipAddingFilesFromTsConfig: true,
60
+ compilerOptions: {
61
+ jsx: 1, // React JSX
62
+ target: 99, // ESNext
63
+ },
64
+ });
65
+ const source = project.addSourceFileAtPath(filePath);
66
+ const resolvedPath = source.getFilePath?.() ?? filePath;
67
+ // Extract basic data first - wrap each extraction in try-catch for resilience
68
+ const hooks = safeExtract('hooks', resolvedPath, () => extractHooks(source), []);
69
+ const components = safeExtract('components', resolvedPath, () => extractComponents(source), []);
70
+ const imports = safeExtract('imports', resolvedPath, () => extractImports(source), []);
71
+ const nextjs = safeExtract('nextjs', resolvedPath, () => extractNextJsMetadata(source, filePath), undefined);
72
+ const variables = safeExtract('variables', resolvedPath, () => extractVariables(source), []);
73
+ const functions = safeExtract('functions', resolvedPath, () => extractFunctions(source), []);
74
+ const props = safeExtract('props', resolvedPath, () => extractProps(source), {});
75
+ const state = safeExtract('state', resolvedPath, () => extractState(source), {});
76
+ const emits = safeExtract('events', resolvedPath, () => extractEvents(source), {});
77
+ const jsxRoutes = safeExtract('jsxRoutes', resolvedPath, () => extractJsxRoutes(source), []);
78
+ const kind = safeExtract('kind', resolvedPath, () => detectKind(hooks, components, imports, filePath, source), 'ts:module');
79
+ return {
80
+ kind,
81
+ variables,
82
+ hooks,
83
+ components,
84
+ functions,
85
+ props,
86
+ state,
87
+ emits,
88
+ imports,
89
+ jsxRoutes,
90
+ ...(nextjs && { nextjs }),
91
+ };
92
+ }
93
+ catch (error) {
94
+ debugError('astParser', 'extractFromFile', {
95
+ filePath,
96
+ error: error instanceof Error ? error.message : String(error),
97
+ });
98
+ // Return empty AST on parsing errors instead of crashing
99
+ // Callers should check if the result is meaningful before using it
100
+ return {
101
+ kind: 'ts:module',
102
+ variables: [],
103
+ hooks: [],
104
+ components: [],
105
+ functions: [],
106
+ props: {},
107
+ state: {},
108
+ emits: {},
109
+ imports: [],
110
+ jsxRoutes: [],
111
+ };
112
+ }
65
113
  }
66
114
  /**
67
115
  * Extract all function declarations and arrow functions
@@ -1 +1 @@
1
- {"version":3,"file":"astParser.js","sourceRoot":"","sources":["../../src/core/astParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"astParser.js","sourceRoot":"","sources":["../../src/core/astParser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACzC,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,WAAW,EAAE,EACxB,OAAO,CAAC,EAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,GACzC,eAAe,CAyEjB;AA4DD;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG;IACxD,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,WAAW,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAoBA"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAI3D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACzC,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,WAAW,EAAE,EACxB,OAAO,CAAC,EAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,GACzC,eAAe,CAyEjB;AA4DD;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B7F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG;IACxD,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,WAAW,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAoBA"}
@@ -28,6 +28,7 @@
28
28
  import { writeFile } from 'node:fs/promises';
29
29
  import { join } from 'node:path';
30
30
  import { structureHash, signatureHash } from '../utils/hash.js';
31
+ import { debugError } from '../utils/debug.js';
31
32
  /**
32
33
  * Build dependency graph from contracts
33
34
  */
@@ -147,7 +148,33 @@ function findComponentByName(components, name) {
147
148
  export async function writeManifest(manifest, outPath) {
148
149
  const manifestPath = join(outPath, 'logicstamp.manifest.json');
149
150
  const json = JSON.stringify(manifest, null, 2);
150
- await writeFile(manifestPath, json, 'utf8');
151
+ try {
152
+ await writeFile(manifestPath, json, 'utf8');
153
+ }
154
+ catch (error) {
155
+ const err = error;
156
+ debugError('manifest', 'writeManifest', {
157
+ manifestPath,
158
+ outPath,
159
+ message: err.message,
160
+ code: err.code,
161
+ });
162
+ let userMessage;
163
+ switch (err.code) {
164
+ case 'ENOENT':
165
+ userMessage = `Parent directory not found for: "${manifestPath}"`;
166
+ break;
167
+ case 'EACCES':
168
+ userMessage = `Permission denied writing to: "${manifestPath}"`;
169
+ break;
170
+ case 'ENOSPC':
171
+ userMessage = `No space left on device. Cannot write: "${manifestPath}"`;
172
+ break;
173
+ default:
174
+ userMessage = `Failed to write manifest "${manifestPath}": ${err.message}`;
175
+ }
176
+ throw new Error(userMessage);
177
+ }
151
178
  }
152
179
  /**
153
180
  * Generate component usage statistics