lsp-intelligence 0.1.2 → 0.2.0

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 (126) hide show
  1. package/README.md +12 -7
  2. package/dist/analysis/pattern/collectSearchFiles.d.ts +5 -0
  3. package/dist/analysis/pattern/collectSearchFiles.js +38 -0
  4. package/dist/analysis/pattern/collectSearchFiles.js.map +1 -0
  5. package/dist/analysis/pattern/runPatternSearch.d.ts +17 -0
  6. package/dist/analysis/pattern/runPatternSearch.js +63 -0
  7. package/dist/analysis/pattern/runPatternSearch.js.map +1 -0
  8. package/dist/analysis/ts/extractDeclarations.d.ts +7 -0
  9. package/dist/analysis/ts/extractDeclarations.js +93 -0
  10. package/dist/analysis/ts/extractDeclarations.js.map +1 -0
  11. package/dist/analysis/ts/extractUsages.d.ts +7 -0
  12. package/dist/analysis/ts/extractUsages.js +120 -0
  13. package/dist/analysis/ts/extractUsages.js.map +1 -0
  14. package/dist/analysis/ts/parseSourceFile.d.ts +10 -0
  15. package/dist/analysis/ts/parseSourceFile.js +28 -0
  16. package/dist/analysis/ts/parseSourceFile.js.map +1 -0
  17. package/dist/analysis/ts/snippets.d.ts +14 -0
  18. package/dist/analysis/ts/snippets.js +29 -0
  19. package/dist/analysis/ts/snippets.js.map +1 -0
  20. package/dist/analysis/ts/structuralPredicates.d.ts +10 -0
  21. package/dist/analysis/ts/structuralPredicates.js +170 -0
  22. package/dist/analysis/ts/structuralPredicates.js.map +1 -0
  23. package/dist/ast/diffDeclarationShapes.d.ts +16 -0
  24. package/dist/ast/diffDeclarationShapes.js +179 -0
  25. package/dist/ast/diffDeclarationShapes.js.map +1 -0
  26. package/dist/ast/extractExportDeclarations.d.ts +21 -0
  27. package/dist/ast/extractExportDeclarations.js +218 -0
  28. package/dist/ast/extractExportDeclarations.js.map +1 -0
  29. package/dist/ast/findNodeAtPosition.d.ts +12 -0
  30. package/dist/ast/findNodeAtPosition.js +75 -0
  31. package/dist/ast/findNodeAtPosition.js.map +1 -0
  32. package/dist/ast/parseFile.d.ts +10 -0
  33. package/dist/ast/parseFile.js +29 -0
  34. package/dist/ast/parseFile.js.map +1 -0
  35. package/dist/engine/waitForDiagnostics.d.ts +7 -0
  36. package/dist/engine/waitForDiagnostics.js +16 -0
  37. package/dist/engine/waitForDiagnostics.js.map +1 -0
  38. package/dist/git/getBaseFileContent.d.ts +5 -0
  39. package/dist/git/getBaseFileContent.js +16 -0
  40. package/dist/git/getBaseFileContent.js.map +1 -0
  41. package/dist/git/getChangedFiles.d.ts +4 -0
  42. package/dist/git/getChangedFiles.js +21 -0
  43. package/dist/git/getChangedFiles.js.map +1 -0
  44. package/dist/git/getChangedHunks.d.ts +13 -0
  45. package/dist/git/getChangedHunks.js +51 -0
  46. package/dist/git/getChangedHunks.js.map +1 -0
  47. package/dist/git/getMergeBase.d.ts +5 -0
  48. package/dist/git/getMergeBase.js +23 -0
  49. package/dist/git/getMergeBase.js.map +1 -0
  50. package/dist/index.js +8 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/resolve/searchScope.d.ts +11 -0
  53. package/dist/resolve/searchScope.js +52 -0
  54. package/dist/resolve/searchScope.js.map +1 -0
  55. package/dist/resolve/targetResolver.d.ts +33 -0
  56. package/dist/resolve/targetResolver.js +84 -0
  57. package/dist/resolve/targetResolver.js.map +1 -0
  58. package/dist/search/families/behaviorFamilies.d.ts +22 -0
  59. package/dist/search/families/behaviorFamilies.js +90 -0
  60. package/dist/search/families/behaviorFamilies.js.map +1 -0
  61. package/dist/search/index/declarationIndex.d.ts +6 -0
  62. package/dist/search/index/declarationIndex.js +13 -0
  63. package/dist/search/index/declarationIndex.js.map +1 -0
  64. package/dist/search/index/types.d.ts +1 -0
  65. package/dist/search/index/types.js +2 -0
  66. package/dist/search/index/types.js.map +1 -0
  67. package/dist/search/index/usageIndex.d.ts +6 -0
  68. package/dist/search/index/usageIndex.js +13 -0
  69. package/dist/search/index/usageIndex.js.map +1 -0
  70. package/dist/search/index/workspaceIndex.d.ts +8 -0
  71. package/dist/search/index/workspaceIndex.js +91 -0
  72. package/dist/search/index/workspaceIndex.js.map +1 -0
  73. package/dist/search/query/parseQuery.d.ts +9 -0
  74. package/dist/search/query/parseQuery.js +244 -0
  75. package/dist/search/query/parseQuery.js.map +1 -0
  76. package/dist/search/query/planQuery.d.ts +9 -0
  77. package/dist/search/query/planQuery.js +58 -0
  78. package/dist/search/query/planQuery.js.map +1 -0
  79. package/dist/search/ranking/assessConfidence.d.ts +6 -0
  80. package/dist/search/ranking/assessConfidence.js +25 -0
  81. package/dist/search/ranking/assessConfidence.js.map +1 -0
  82. package/dist/search/ranking/mergeCandidates.d.ts +10 -0
  83. package/dist/search/ranking/mergeCandidates.js +46 -0
  84. package/dist/search/ranking/mergeCandidates.js.map +1 -0
  85. package/dist/search/ranking/rankCandidates.d.ts +12 -0
  86. package/dist/search/ranking/rankCandidates.js +58 -0
  87. package/dist/search/ranking/rankCandidates.js.map +1 -0
  88. package/dist/search/retrievers/behaviorRetriever.d.ts +7 -0
  89. package/dist/search/retrievers/behaviorRetriever.js +91 -0
  90. package/dist/search/retrievers/behaviorRetriever.js.map +1 -0
  91. package/dist/search/retrievers/identifierRetriever.d.ts +7 -0
  92. package/dist/search/retrievers/identifierRetriever.js +66 -0
  93. package/dist/search/retrievers/identifierRetriever.js.map +1 -0
  94. package/dist/search/retrievers/structuralRetriever.d.ts +11 -0
  95. package/dist/search/retrievers/structuralRetriever.js +141 -0
  96. package/dist/search/retrievers/structuralRetriever.js.map +1 -0
  97. package/dist/search/types.d.ts +121 -0
  98. package/dist/search/types.js +11 -0
  99. package/dist/search/types.js.map +1 -0
  100. package/dist/tools/composites/apiGuard.d.ts +1 -0
  101. package/dist/tools/composites/apiGuard.js +194 -0
  102. package/dist/tools/composites/apiGuard.js.map +1 -0
  103. package/dist/tools/composites/explainError.js +3 -2
  104. package/dist/tools/composites/explainError.js.map +1 -1
  105. package/dist/tools/composites/findCode.d.ts +1 -0
  106. package/dist/tools/composites/findCode.js +68 -0
  107. package/dist/tools/composites/findCode.js.map +1 -0
  108. package/dist/tools/composites/findPattern.d.ts +5 -0
  109. package/dist/tools/composites/findPattern.js +41 -0
  110. package/dist/tools/composites/findPattern.js.map +1 -0
  111. package/dist/tools/composites/rootCauseTrace.d.ts +1 -0
  112. package/dist/tools/composites/rootCauseTrace.js +213 -0
  113. package/dist/tools/composites/rootCauseTrace.js.map +1 -0
  114. package/dist/tools/composites/semanticDiff.js +24 -77
  115. package/dist/tools/composites/semanticDiff.js.map +1 -1
  116. package/dist/tools/live/liveDiagnostics.js +3 -2
  117. package/dist/tools/live/liveDiagnostics.js.map +1 -1
  118. package/dist/tools/primitives/diagnostics.js +2 -2
  119. package/dist/tools/primitives/diagnostics.js.map +1 -1
  120. package/dist/tools/registry.d.ts +10 -2
  121. package/dist/tools/registry.js +7 -2
  122. package/dist/tools/registry.js.map +1 -1
  123. package/package.json +8 -4
  124. package/dist/tools/primitives/typeHierarchy.d.ts +0 -1
  125. package/dist/tools/primitives/typeHierarchy.js +0 -55
  126. package/dist/tools/primitives/typeHierarchy.js.map +0 -1
@@ -0,0 +1,170 @@
1
+ import ts from 'typescript';
2
+ /**
3
+ * Evaluate structural predicates on a TS AST node.
4
+ * Returns which predicates matched and evidence strings.
5
+ */
6
+ export function evaluateStructuralPredicates(sf, node, predicates) {
7
+ const matched = [];
8
+ const evidence = [];
9
+ for (const pred of predicates) {
10
+ const result = evaluatePredicate(sf, node, pred);
11
+ if (result) {
12
+ matched.push(pred);
13
+ evidence.push(result);
14
+ }
15
+ }
16
+ return { matched, evidence };
17
+ }
18
+ function evaluatePredicate(sf, node, pred) {
19
+ switch (pred) {
20
+ case 'conditional':
21
+ return hasConditional(node) ? 'contains conditional branch' : null;
22
+ case 'returns-function':
23
+ return returnsFunction(node) ? 'returns a function expression' : null;
24
+ case 'returns-cleanup':
25
+ return returnsCleanup(node) ? 'callback returns a cleanup function' : null;
26
+ case 'no-cleanup':
27
+ return !returnsCleanup(node) && isCallbackLike(node) ? 'callback does not return cleanup' : null;
28
+ case 'has-try-catch':
29
+ return containsTryCatch(node) ? 'contains try-catch block' : null;
30
+ case 'no-try-catch':
31
+ return !containsTryCatch(node) ? 'no try-catch in scope' : null;
32
+ case 'switch-no-default':
33
+ return hasSwitchWithoutDefault(node) ? 'switch statement missing default case' : null;
34
+ case 'await-in-loop':
35
+ return hasAwaitInLoop(node) ? 'await inside loop body' : null;
36
+ case 'inside-hook':
37
+ return isInsideHookCall(node) ? 'inside a React hook call' : null;
38
+ case 'hook-callback':
39
+ return isHookCallback(node) ? 'is a callback argument to a hook' : null;
40
+ default:
41
+ return null;
42
+ }
43
+ }
44
+ // --- Predicate implementations ---
45
+ function hasConditional(node) {
46
+ let found = false;
47
+ function walk(n) {
48
+ if (found)
49
+ return;
50
+ if (ts.isIfStatement(n) || ts.isConditionalExpression(n) || ts.isSwitchStatement(n)) {
51
+ found = true;
52
+ return;
53
+ }
54
+ ts.forEachChild(n, walk);
55
+ }
56
+ ts.forEachChild(node, walk);
57
+ return found;
58
+ }
59
+ function returnsFunction(node) {
60
+ let found = false;
61
+ function walk(n) {
62
+ if (found)
63
+ return;
64
+ if (ts.isReturnStatement(n) && n.expression) {
65
+ if (ts.isArrowFunction(n.expression) || ts.isFunctionExpression(n.expression)) {
66
+ found = true;
67
+ return;
68
+ }
69
+ }
70
+ ts.forEachChild(n, walk);
71
+ }
72
+ ts.forEachChild(node, walk);
73
+ return found;
74
+ }
75
+ function returnsCleanup(node) {
76
+ // For hook callbacks: check if the callback body returns a function
77
+ const callback = getFirstCallbackArg(node);
78
+ if (!callback)
79
+ return returnsFunction(node);
80
+ return returnsFunction(callback);
81
+ }
82
+ function isCallbackLike(node) {
83
+ return getFirstCallbackArg(node) !== null;
84
+ }
85
+ function containsTryCatch(node) {
86
+ let found = false;
87
+ function walk(n) {
88
+ if (found)
89
+ return;
90
+ if (ts.isTryStatement(n)) {
91
+ found = true;
92
+ return;
93
+ }
94
+ ts.forEachChild(n, walk);
95
+ }
96
+ ts.forEachChild(node, walk);
97
+ return found;
98
+ }
99
+ function hasSwitchWithoutDefault(node) {
100
+ let found = false;
101
+ function walk(n) {
102
+ if (found)
103
+ return;
104
+ if (ts.isSwitchStatement(n)) {
105
+ const hasDefault = n.caseBlock.clauses.some((c) => ts.isDefaultClause(c));
106
+ if (!hasDefault) {
107
+ found = true;
108
+ return;
109
+ }
110
+ }
111
+ ts.forEachChild(n, walk);
112
+ }
113
+ ts.forEachChild(node, walk);
114
+ return found;
115
+ }
116
+ function hasAwaitInLoop(node) {
117
+ let insideLoop = false;
118
+ let found = false;
119
+ function walk(n) {
120
+ if (found)
121
+ return;
122
+ const wasInsideLoop = insideLoop;
123
+ if (ts.isForStatement(n) || ts.isForOfStatement(n) || ts.isForInStatement(n) || ts.isWhileStatement(n) || ts.isDoStatement(n)) {
124
+ insideLoop = true;
125
+ }
126
+ if (insideLoop && ts.isAwaitExpression(n)) {
127
+ found = true;
128
+ return;
129
+ }
130
+ ts.forEachChild(n, walk);
131
+ insideLoop = wasInsideLoop;
132
+ }
133
+ ts.forEachChild(node, walk);
134
+ return found;
135
+ }
136
+ function isInsideHookCall(node) {
137
+ let current = node;
138
+ while (current) {
139
+ if (ts.isCallExpression(current) && ts.isIdentifier(current.expression)) {
140
+ if (isHookName(current.expression.text))
141
+ return true;
142
+ }
143
+ current = current.parent;
144
+ }
145
+ return false;
146
+ }
147
+ function isHookCallback(node) {
148
+ // Check if this node is a call expression where the callee is a hook
149
+ if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
150
+ return isHookName(node.expression.text);
151
+ }
152
+ return false;
153
+ }
154
+ function isHookName(name) {
155
+ return /^use[A-Z]/.test(name);
156
+ }
157
+ /**
158
+ * Get the first callback argument from a call expression.
159
+ * For useEffect(callback, deps), returns the callback.
160
+ */
161
+ function getFirstCallbackArg(node) {
162
+ if (ts.isCallExpression(node) && node.arguments.length > 0) {
163
+ const first = node.arguments[0];
164
+ if (ts.isArrowFunction(first) || ts.isFunctionExpression(first)) {
165
+ return first;
166
+ }
167
+ }
168
+ return null;
169
+ }
170
+ //# sourceMappingURL=structuralPredicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structuralPredicates.js","sourceRoot":"","sources":["../../../src/analysis/ts/structuralPredicates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ExportDeclaration } from './extractExportDeclarations.js';
2
+ export type ApiChangeKind = 'added' | 'removed' | 'modified' | 'renamed' | 'enum_member_added' | 'enum_member_removed' | 'param_required' | 'param_added' | 'param_removed' | 'return_type_changed' | 'interface_shape_changed' | 'type_changed' | 'reexport_changed';
3
+ export type ApiRiskLevel = 'breaking' | 'risky' | 'safe';
4
+ export interface DeclDiff {
5
+ name: string;
6
+ kind: ApiChangeKind;
7
+ risk: ApiRiskLevel;
8
+ reason: string;
9
+ structuralDiff: string[];
10
+ baseDecl?: ExportDeclaration;
11
+ currentDecl?: ExportDeclaration;
12
+ }
13
+ /**
14
+ * Diff two sets of export declarations. Returns classified changes.
15
+ */
16
+ export declare function diffExportDeclarations(baseExports: ExportDeclaration[], currentExports: ExportDeclaration[]): DeclDiff[];
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Diff two sets of export declarations. Returns classified changes.
3
+ */
4
+ export function diffExportDeclarations(baseExports, currentExports) {
5
+ const diffs = [];
6
+ const baseMap = new Map(baseExports.map((e) => [e.name, e]));
7
+ const currentMap = new Map(currentExports.map((e) => [e.name, e]));
8
+ // Removed exports
9
+ for (const [name, base] of baseMap) {
10
+ if (!currentMap.has(name)) {
11
+ diffs.push({
12
+ name,
13
+ kind: 'removed',
14
+ risk: 'breaking',
15
+ reason: `Export "${name}" (${base.declarationKind}) was removed`,
16
+ structuralDiff: [`- ${base.signatureText.substring(0, 100)}`],
17
+ baseDecl: base,
18
+ });
19
+ }
20
+ }
21
+ // Added exports
22
+ for (const [name, current] of currentMap) {
23
+ if (!baseMap.has(name)) {
24
+ diffs.push({
25
+ name,
26
+ kind: 'added',
27
+ risk: 'safe',
28
+ reason: `New export "${name}" (${current.declarationKind})`,
29
+ structuralDiff: [`+ ${current.signatureText.substring(0, 100)}`],
30
+ currentDecl: current,
31
+ });
32
+ }
33
+ }
34
+ // Modified exports
35
+ for (const [name, current] of currentMap) {
36
+ const base = baseMap.get(name);
37
+ if (!base)
38
+ continue;
39
+ const changes = compareDeclarations(base, current);
40
+ if (changes.length > 0) {
41
+ const worstRisk = changes.reduce((worst, c) => {
42
+ if (c.risk === 'breaking')
43
+ return 'breaking';
44
+ if (c.risk === 'risky' && worst !== 'breaking')
45
+ return 'risky';
46
+ return worst;
47
+ }, 'safe');
48
+ diffs.push({
49
+ name,
50
+ kind: changes[0].kind,
51
+ risk: worstRisk,
52
+ reason: changes.map((c) => c.reason).join('; '),
53
+ structuralDiff: changes.flatMap((c) => c.diffs),
54
+ baseDecl: base,
55
+ currentDecl: current,
56
+ });
57
+ }
58
+ }
59
+ return diffs;
60
+ }
61
+ function compareDeclarations(base, current) {
62
+ const changes = [];
63
+ // Enum member comparison
64
+ if (base.declarationKind === 'enum' && current.declarationKind === 'enum') {
65
+ const baseMembers = new Set(base.members ?? []);
66
+ const currentMembers = new Set(current.members ?? []);
67
+ for (const m of currentMembers) {
68
+ if (!baseMembers.has(m)) {
69
+ changes.push({
70
+ kind: 'enum_member_added',
71
+ risk: 'risky',
72
+ reason: `Enum member "${m}" added — exhaustive handling may be incomplete`,
73
+ diffs: [`+ ${m}`],
74
+ });
75
+ }
76
+ }
77
+ for (const m of baseMembers) {
78
+ if (!currentMembers.has(m)) {
79
+ changes.push({
80
+ kind: 'enum_member_removed',
81
+ risk: 'breaking',
82
+ reason: `Enum member "${m}" removed`,
83
+ diffs: [`- ${m}`],
84
+ });
85
+ }
86
+ }
87
+ return changes;
88
+ }
89
+ // Interface member comparison
90
+ if (base.declarationKind === 'interface' && current.declarationKind === 'interface') {
91
+ const baseMembers = new Set(base.members ?? []);
92
+ const currentMembers = new Set(current.members ?? []);
93
+ for (const m of baseMembers) {
94
+ if (!currentMembers.has(m)) {
95
+ changes.push({
96
+ kind: 'interface_shape_changed',
97
+ risk: 'breaking',
98
+ reason: `Interface property "${m}" removed`,
99
+ diffs: [`- ${m}`],
100
+ });
101
+ }
102
+ }
103
+ for (const m of currentMembers) {
104
+ if (!baseMembers.has(m)) {
105
+ changes.push({
106
+ kind: 'interface_shape_changed',
107
+ risk: 'risky',
108
+ reason: `Interface property "${m}" added`,
109
+ diffs: [`+ ${m}`],
110
+ });
111
+ }
112
+ }
113
+ return changes;
114
+ }
115
+ // Function parameter comparison
116
+ if (base.declarationKind === 'function' && current.declarationKind === 'function') {
117
+ const baseParams = base.params ?? [];
118
+ const currentParams = current.params ?? [];
119
+ if (currentParams.length > baseParams.length) {
120
+ const added = currentParams.slice(baseParams.length);
121
+ for (const p of added) {
122
+ changes.push({
123
+ kind: p.optional ? 'param_added' : 'param_required',
124
+ risk: p.optional ? 'safe' : 'breaking',
125
+ reason: p.optional
126
+ ? `Optional parameter "${p.name}" added`
127
+ : `Required parameter "${p.name}" added`,
128
+ diffs: [`+ ${p.name}${p.optional ? '?' : ''}: ${p.type ?? 'unknown'}`],
129
+ });
130
+ }
131
+ }
132
+ if (currentParams.length < baseParams.length) {
133
+ const removed = baseParams.slice(currentParams.length);
134
+ for (const p of removed) {
135
+ changes.push({
136
+ kind: 'param_removed',
137
+ risk: 'breaking',
138
+ reason: `Parameter "${p.name}" removed`,
139
+ diffs: [`- ${p.name}: ${p.type ?? 'unknown'}`],
140
+ });
141
+ }
142
+ }
143
+ // Check optionality changes
144
+ for (let i = 0; i < Math.min(baseParams.length, currentParams.length); i++) {
145
+ if (baseParams[i].optional && !currentParams[i].optional) {
146
+ changes.push({
147
+ kind: 'param_required',
148
+ risk: 'breaking',
149
+ reason: `Parameter "${currentParams[i].name}" became required (was optional)`,
150
+ diffs: [`~ ${currentParams[i].name}?: → ${currentParams[i].name}:`],
151
+ });
152
+ }
153
+ }
154
+ // Return type change
155
+ if (base.returnType && current.returnType && base.returnType !== current.returnType) {
156
+ changes.push({
157
+ kind: 'return_type_changed',
158
+ risk: 'risky',
159
+ reason: `Return type changed: ${base.returnType} → ${current.returnType}`,
160
+ diffs: [`- returns: ${base.returnType}`, `+ returns: ${current.returnType}`],
161
+ });
162
+ }
163
+ return changes;
164
+ }
165
+ // Generic signature comparison (fallback)
166
+ if (base.signatureText !== current.signatureText) {
167
+ changes.push({
168
+ kind: 'modified',
169
+ risk: 'risky',
170
+ reason: `Declaration signature changed`,
171
+ diffs: [
172
+ `- ${base.signatureText.substring(0, 100)}`,
173
+ `+ ${current.signatureText.substring(0, 100)}`,
174
+ ],
175
+ });
176
+ }
177
+ return changes;
178
+ }
179
+ //# sourceMappingURL=diffDeclarationShapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffDeclarationShapes.js","sourceRoot":"","sources":["../../src/ast/diffDeclarationShapes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ export interface ExportDeclaration {
3
+ name: string;
4
+ declarationKind: 'function' | 'type' | 'interface' | 'enum' | 'class' | 'const' | 'variable' | 'reexport' | 'unknown';
5
+ line: number;
6
+ signatureText: string;
7
+ members?: string[];
8
+ params?: ParamInfo[];
9
+ returnType?: string;
10
+ }
11
+ export interface ParamInfo {
12
+ name: string;
13
+ type?: string;
14
+ optional: boolean;
15
+ }
16
+ /**
17
+ * AST-first export extraction with regex fallback for unsupported forms.
18
+ * When root is provided (non-null), uses ast-grep traversal.
19
+ * When root is null, falls back to regex over source lines.
20
+ */
21
+ export declare function extractExportDeclarations(root: SgNode | null, source: string): ExportDeclaration[];
@@ -0,0 +1,218 @@
1
+ /**
2
+ * AST-first export extraction with regex fallback for unsupported forms.
3
+ * When root is provided (non-null), uses ast-grep traversal.
4
+ * When root is null, falls back to regex over source lines.
5
+ */
6
+ export function extractExportDeclarations(root, source) {
7
+ if (root) {
8
+ return extractWithAst(root, source);
9
+ }
10
+ return extractWithRegex(source);
11
+ }
12
+ // --- AST-based extraction ---
13
+ function extractWithAst(root, source) {
14
+ const exports = [];
15
+ const lines = source.split('\n');
16
+ const seen = new Set();
17
+ // Find all exported declarations using ast-grep patterns
18
+ const patterns = [
19
+ { pattern: 'export function $NAME($$$) { $$$ }', kind: 'function' },
20
+ { pattern: 'export async function $NAME($$$) { $$$ }', kind: 'function' },
21
+ { pattern: 'export const $NAME = $$$', kind: 'const' },
22
+ { pattern: 'export let $NAME = $$$', kind: 'variable' },
23
+ { pattern: 'export interface $NAME { $$$ }', kind: 'interface' },
24
+ { pattern: 'export type $NAME = $$$', kind: 'type' },
25
+ { pattern: 'export enum $NAME { $$$ }', kind: 'enum' },
26
+ { pattern: 'export class $NAME { $$$ }', kind: 'class' },
27
+ { pattern: 'export abstract class $NAME { $$$ }', kind: 'class' },
28
+ { pattern: 'export default function $NAME($$$) { $$$ }', kind: 'function' },
29
+ ];
30
+ for (const { pattern, kind } of patterns) {
31
+ try {
32
+ const matches = root.findAll(pattern);
33
+ for (const match of matches) {
34
+ const nameNode = match.getMatch('NAME');
35
+ if (!nameNode)
36
+ continue;
37
+ const name = nameNode.text();
38
+ if (seen.has(name))
39
+ continue;
40
+ seen.add(name);
41
+ const range = match.range();
42
+ const line1 = range.start.line + 1;
43
+ const sigText = match.text().substring(0, 200);
44
+ const decl = {
45
+ name,
46
+ declarationKind: kind,
47
+ line: line1,
48
+ signatureText: sigText,
49
+ };
50
+ // Enrich based on kind
51
+ if (kind === 'function') {
52
+ decl.params = extractParamsFromText(sigText);
53
+ decl.returnType = extractReturnTypeFromText(sigText);
54
+ // Check if const is actually a function (arrow/function expression)
55
+ }
56
+ else if (kind === 'const') {
57
+ // Detect if this is actually a function (arrow or function expression)
58
+ if (sigText.match(/=\s*(?:async\s+)?(?:\(|function)/)) {
59
+ decl.declarationKind = 'function';
60
+ decl.params = extractParamsFromText(sigText);
61
+ decl.returnType = extractReturnTypeFromText(sigText);
62
+ }
63
+ }
64
+ else if (kind === 'enum' || kind === 'interface') {
65
+ decl.members = extractBlockMembersFromLines(lines, range.start.line);
66
+ }
67
+ exports.push(decl);
68
+ }
69
+ }
70
+ catch {
71
+ // Pattern may not match — continue with other patterns
72
+ }
73
+ }
74
+ // AST may miss re-exports and barrel exports — use regex for those
75
+ for (let i = 0; i < lines.length; i++) {
76
+ const line = lines[i];
77
+ // export { name1, name2 } from "module"
78
+ const reexportMatch = line.match(/export\s+\{([^}]+)\}\s+from\s+['"]/);
79
+ if (reexportMatch) {
80
+ const names = reexportMatch[1].split(',').map((n) => n.trim().split(/\s+as\s+/)[0].trim());
81
+ for (const name of names) {
82
+ if (name && !seen.has(name)) {
83
+ seen.add(name);
84
+ exports.push({ name, declarationKind: 'reexport', line: i + 1, signatureText: line.trim() });
85
+ }
86
+ }
87
+ }
88
+ // export * from "module"
89
+ const barrelMatch = line.match(/export\s+\*\s+from\s+['"]([^'"]+)['"]/);
90
+ if (barrelMatch && !seen.has(`*${barrelMatch[1]}`)) {
91
+ seen.add(`*${barrelMatch[1]}`);
92
+ exports.push({ name: `* from "${barrelMatch[1]}"`, declarationKind: 'reexport', line: i + 1, signatureText: line.trim() });
93
+ }
94
+ // export type { X } from "module"
95
+ const typeReexport = line.match(/export\s+type\s+\{([^}]+)\}\s+from\s+['"]/);
96
+ if (typeReexport) {
97
+ const names = typeReexport[1].split(',').map((n) => n.trim().split(/\s+as\s+/)[0].trim());
98
+ for (const name of names) {
99
+ if (name && !seen.has(name)) {
100
+ seen.add(name);
101
+ exports.push({ name, declarationKind: 'reexport', line: i + 1, signatureText: line.trim() });
102
+ }
103
+ }
104
+ }
105
+ }
106
+ return exports;
107
+ }
108
+ // --- Regex fallback (used when AST root is null) ---
109
+ function extractWithRegex(source) {
110
+ const exports = [];
111
+ const lines = source.split('\n');
112
+ for (let i = 0; i < lines.length; i++) {
113
+ const line = lines[i];
114
+ if (!line.includes('export'))
115
+ continue;
116
+ const funcMatch = line.match(/export\s+(?:default\s+)?(?:async\s+)?function\s+(\w+)/);
117
+ if (funcMatch) {
118
+ const sig = extractFuncSigFromLines(lines, i);
119
+ exports.push({ name: funcMatch[1], declarationKind: 'function', line: i + 1, signatureText: sig.text, params: sig.params, returnType: sig.returnType });
120
+ continue;
121
+ }
122
+ const constFuncMatch = line.match(/export\s+const\s+(\w+)\s*=\s*(?:async\s+)?(?:\(|function)/);
123
+ if (constFuncMatch) {
124
+ const sig = extractFuncSigFromLines(lines, i);
125
+ exports.push({ name: constFuncMatch[1], declarationKind: 'function', line: i + 1, signatureText: sig.text, params: sig.params, returnType: sig.returnType });
126
+ continue;
127
+ }
128
+ const constMatch = line.match(/export\s+(?:const|let|var)\s+(\w+)/);
129
+ if (constMatch && !constFuncMatch) {
130
+ exports.push({ name: constMatch[1], declarationKind: 'const', line: i + 1, signatureText: line.trim().substring(0, 150) });
131
+ continue;
132
+ }
133
+ const ifaceMatch = line.match(/export\s+interface\s+(\w+)/);
134
+ if (ifaceMatch) {
135
+ exports.push({ name: ifaceMatch[1], declarationKind: 'interface', line: i + 1, signatureText: line.trim(), members: extractBlockMembersFromLines(lines, i) });
136
+ continue;
137
+ }
138
+ const typeMatch = line.match(/export\s+type\s+(\w+)/);
139
+ if (typeMatch) {
140
+ exports.push({ name: typeMatch[1], declarationKind: 'type', line: i + 1, signatureText: line.trim().substring(0, 150) });
141
+ continue;
142
+ }
143
+ const enumMatch = line.match(/export\s+enum\s+(\w+)/);
144
+ if (enumMatch) {
145
+ exports.push({ name: enumMatch[1], declarationKind: 'enum', line: i + 1, signatureText: line.trim(), members: extractBlockMembersFromLines(lines, i) });
146
+ continue;
147
+ }
148
+ const classMatch = line.match(/export\s+(?:abstract\s+)?class\s+(\w+)/);
149
+ if (classMatch) {
150
+ exports.push({ name: classMatch[1], declarationKind: 'class', line: i + 1, signatureText: line.trim().substring(0, 150) });
151
+ continue;
152
+ }
153
+ const reexportMatch = line.match(/export\s+\{([^}]+)\}\s+from\s+['"]/);
154
+ if (reexportMatch) {
155
+ for (const name of reexportMatch[1].split(',').map((n) => n.trim().split(/\s+as\s+/)[0].trim()).filter(Boolean)) {
156
+ exports.push({ name, declarationKind: 'reexport', line: i + 1, signatureText: line.trim() });
157
+ }
158
+ continue;
159
+ }
160
+ const barrelMatch = line.match(/export\s+\*\s+from\s+['"]([^'"]+)['"]/);
161
+ if (barrelMatch) {
162
+ exports.push({ name: `* from "${barrelMatch[1]}"`, declarationKind: 'reexport', line: i + 1, signatureText: line.trim() });
163
+ }
164
+ }
165
+ return exports;
166
+ }
167
+ // --- Shared helpers ---
168
+ function extractParamsFromText(text) {
169
+ const paramMatch = text.match(/\(([^)]*)\)/);
170
+ if (!paramMatch)
171
+ return [];
172
+ const params = [];
173
+ for (const p of paramMatch[1].split(',')) {
174
+ const trimmed = p.trim();
175
+ if (!trimmed)
176
+ continue;
177
+ const optional = trimmed.includes('?');
178
+ const name = trimmed.split(/[?:]/)[0].trim();
179
+ const typeMatch = trimmed.match(/:\s*(.+)/);
180
+ params.push({ name, type: typeMatch?.[1]?.trim(), optional });
181
+ }
182
+ return params;
183
+ }
184
+ function extractReturnTypeFromText(text) {
185
+ const returnMatch = text.match(/\)\s*:\s*([^{=>]+)/);
186
+ return returnMatch?.[1]?.trim();
187
+ }
188
+ function extractBlockMembersFromLines(lines, startLine) {
189
+ const members = [];
190
+ let braceCount = 0;
191
+ let started = false;
192
+ for (let i = startLine; i < Math.min(startLine + 50, lines.length); i++) {
193
+ if (lines[i].includes('{')) {
194
+ started = true;
195
+ braceCount++;
196
+ }
197
+ if (lines[i].includes('}'))
198
+ braceCount--;
199
+ if (started && braceCount > 0) {
200
+ const memberMatch = lines[i].trim().match(/^(\w+)\s*[?:=,]/);
201
+ if (memberMatch && memberMatch[1] !== 'export')
202
+ members.push(memberMatch[1]);
203
+ }
204
+ if (started && braceCount === 0)
205
+ break;
206
+ }
207
+ return members;
208
+ }
209
+ function extractFuncSigFromLines(lines, startLine) {
210
+ let sig = '';
211
+ for (let i = startLine; i < Math.min(startLine + 10, lines.length); i++) {
212
+ sig += lines[i] + '\n';
213
+ if (lines[i].includes('{') || lines[i].includes('=>'))
214
+ break;
215
+ }
216
+ return { text: sig.trim().substring(0, 200), params: extractParamsFromText(sig), returnType: extractReturnTypeFromText(sig) };
217
+ }
218
+ //# sourceMappingURL=extractExportDeclarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractExportDeclarations.js","sourceRoot":"","sources":["../../src/ast/extractExportDeclarations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ /**
3
+ * Find the smallest AST node covering a given line (0-indexed).
4
+ */
5
+ export declare function findNodeAtLine(root: SgNode, line0: number): {
6
+ node: SgNode;
7
+ kind: string;
8
+ } | null;
9
+ /**
10
+ * Classify the error site based on the enclosing AST node.
11
+ */
12
+ export declare function classifyErrorSite(root: SgNode, line0: number): string | null;