rawsql-ts 0.11.32-beta → 0.11.34-beta

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 (169) hide show
  1. package/dist/esm/index.js +28 -0
  2. package/dist/esm/index.js.map +1 -1
  3. package/dist/esm/index.min.js +52 -36
  4. package/dist/esm/index.min.js.map +4 -4
  5. package/dist/esm/src/formatters/OriginalFormatRestorer.d.ts +40 -0
  6. package/dist/esm/src/formatters/OriginalFormatRestorer.js +135 -0
  7. package/dist/esm/src/formatters/OriginalFormatRestorer.js.map +1 -0
  8. package/dist/esm/src/index.d.ts +32 -0
  9. package/dist/esm/src/index.js +28 -0
  10. package/dist/esm/src/index.js.map +1 -1
  11. package/dist/esm/src/models/FormattingLexeme.d.ts +66 -0
  12. package/dist/esm/src/models/FormattingLexeme.js +2 -0
  13. package/dist/esm/src/models/FormattingLexeme.js.map +1 -0
  14. package/dist/esm/src/models/ValueComponent.d.ts +3 -1
  15. package/dist/esm/src/models/ValueComponent.js +3 -1
  16. package/dist/esm/src/models/ValueComponent.js.map +1 -1
  17. package/dist/esm/src/parsers/FunctionExpressionParser.d.ts +12 -0
  18. package/dist/esm/src/parsers/FunctionExpressionParser.js +111 -7
  19. package/dist/esm/src/parsers/FunctionExpressionParser.js.map +1 -1
  20. package/dist/esm/src/parsers/KeywordParser.d.ts +1 -0
  21. package/dist/esm/src/parsers/KeywordParser.js +10 -4
  22. package/dist/esm/src/parsers/KeywordParser.js.map +1 -1
  23. package/dist/esm/src/parsers/SqlPrintTokenParser.js +8 -0
  24. package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
  25. package/dist/esm/src/parsers/SqlTokenizer.d.ts +42 -2
  26. package/dist/esm/src/parsers/SqlTokenizer.js +213 -12
  27. package/dist/esm/src/parsers/SqlTokenizer.js.map +1 -1
  28. package/dist/esm/src/tokenReaders/CommandTokenReader.d.ts +3 -0
  29. package/dist/esm/src/tokenReaders/CommandTokenReader.js +9 -1
  30. package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
  31. package/dist/esm/src/transformers/AliasRenamer.d.ts +199 -0
  32. package/dist/esm/src/transformers/AliasRenamer.js +595 -0
  33. package/dist/esm/src/transformers/AliasRenamer.js.map +1 -0
  34. package/dist/esm/src/transformers/CTEBuilder.js +2 -2
  35. package/dist/esm/src/transformers/CTEBuilder.js.map +1 -1
  36. package/dist/esm/src/transformers/CTERenamer.d.ts +53 -0
  37. package/dist/esm/src/transformers/CTERenamer.js +138 -0
  38. package/dist/esm/src/transformers/CTERenamer.js.map +1 -1
  39. package/dist/esm/src/transformers/DynamicQueryBuilder.d.ts +72 -0
  40. package/dist/esm/src/transformers/DynamicQueryBuilder.js +42 -0
  41. package/dist/esm/src/transformers/DynamicQueryBuilder.js.map +1 -1
  42. package/dist/esm/src/transformers/FilterableItemCollector.d.ts +80 -0
  43. package/dist/esm/src/transformers/FilterableItemCollector.js +254 -0
  44. package/dist/esm/src/transformers/FilterableItemCollector.js.map +1 -0
  45. package/dist/esm/src/transformers/SelectableColumnCollector.d.ts +3 -0
  46. package/dist/esm/src/transformers/SelectableColumnCollector.js +68 -7
  47. package/dist/esm/src/transformers/SelectableColumnCollector.js.map +1 -1
  48. package/dist/esm/src/transformers/SmartRenamer.d.ts +134 -0
  49. package/dist/esm/src/transformers/SmartRenamer.js +430 -0
  50. package/dist/esm/src/transformers/SmartRenamer.js.map +1 -0
  51. package/dist/esm/src/transformers/SqlIdentifierRenamer.d.ts +150 -0
  52. package/dist/esm/src/transformers/SqlIdentifierRenamer.js +493 -0
  53. package/dist/esm/src/transformers/SqlIdentifierRenamer.js.map +1 -0
  54. package/dist/esm/src/transformers/SqlParamInjector.d.ts +27 -0
  55. package/dist/esm/src/transformers/SqlParamInjector.js +304 -16
  56. package/dist/esm/src/transformers/SqlParamInjector.js.map +1 -1
  57. package/dist/esm/src/transformers/SqlSortInjector.js +6 -3
  58. package/dist/esm/src/transformers/SqlSortInjector.js.map +1 -1
  59. package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js +5 -2
  60. package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
  61. package/dist/esm/src/utils/CursorContextAnalyzer.d.ts +70 -0
  62. package/dist/esm/src/utils/CursorContextAnalyzer.js +322 -0
  63. package/dist/esm/src/utils/CursorContextAnalyzer.js.map +1 -0
  64. package/dist/esm/src/utils/IntelliSenseApi.d.ts +114 -0
  65. package/dist/esm/src/utils/IntelliSenseApi.js +284 -0
  66. package/dist/esm/src/utils/IntelliSenseApi.js.map +1 -0
  67. package/dist/esm/src/utils/KeywordCache.d.ts +65 -0
  68. package/dist/esm/src/utils/KeywordCache.js +202 -0
  69. package/dist/esm/src/utils/KeywordCache.js.map +1 -0
  70. package/dist/esm/src/utils/LexemeCursor.d.ts +41 -0
  71. package/dist/esm/src/utils/LexemeCursor.js +93 -0
  72. package/dist/esm/src/utils/LexemeCursor.js.map +1 -1
  73. package/dist/esm/src/utils/MultiQuerySplitter.d.ts +131 -0
  74. package/dist/esm/src/utils/MultiQuerySplitter.js +287 -0
  75. package/dist/esm/src/utils/MultiQuerySplitter.js.map +1 -0
  76. package/dist/esm/src/utils/PositionAwareParser.d.ts +85 -0
  77. package/dist/esm/src/utils/PositionAwareParser.js +336 -0
  78. package/dist/esm/src/utils/PositionAwareParser.js.map +1 -0
  79. package/dist/esm/src/utils/ScopeResolver.d.ts +127 -0
  80. package/dist/esm/src/utils/ScopeResolver.js +268 -0
  81. package/dist/esm/src/utils/ScopeResolver.js.map +1 -0
  82. package/dist/esm/src/utils/TextPositionUtils.d.ts +62 -0
  83. package/dist/esm/src/utils/TextPositionUtils.js +124 -0
  84. package/dist/esm/src/utils/TextPositionUtils.js.map +1 -0
  85. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  86. package/dist/index.min.js +52 -36
  87. package/dist/index.min.js.map +4 -4
  88. package/dist/src/formatters/OriginalFormatRestorer.d.ts +40 -0
  89. package/dist/src/formatters/OriginalFormatRestorer.js +139 -0
  90. package/dist/src/formatters/OriginalFormatRestorer.js.map +1 -0
  91. package/dist/src/index.d.ts +32 -0
  92. package/dist/src/index.js +30 -1
  93. package/dist/src/index.js.map +1 -1
  94. package/dist/src/models/FormattingLexeme.d.ts +66 -0
  95. package/dist/src/models/FormattingLexeme.js +3 -0
  96. package/dist/src/models/FormattingLexeme.js.map +1 -0
  97. package/dist/src/models/ValueComponent.d.ts +3 -1
  98. package/dist/src/models/ValueComponent.js +3 -1
  99. package/dist/src/models/ValueComponent.js.map +1 -1
  100. package/dist/src/parsers/FunctionExpressionParser.d.ts +12 -0
  101. package/dist/src/parsers/FunctionExpressionParser.js +110 -6
  102. package/dist/src/parsers/FunctionExpressionParser.js.map +1 -1
  103. package/dist/src/parsers/KeywordParser.d.ts +1 -0
  104. package/dist/src/parsers/KeywordParser.js +10 -4
  105. package/dist/src/parsers/KeywordParser.js.map +1 -1
  106. package/dist/src/parsers/SqlPrintTokenParser.js +8 -0
  107. package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
  108. package/dist/src/parsers/SqlTokenizer.d.ts +42 -2
  109. package/dist/src/parsers/SqlTokenizer.js +222 -12
  110. package/dist/src/parsers/SqlTokenizer.js.map +1 -1
  111. package/dist/src/tokenReaders/CommandTokenReader.d.ts +3 -0
  112. package/dist/src/tokenReaders/CommandTokenReader.js +10 -2
  113. package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
  114. package/dist/src/transformers/AliasRenamer.d.ts +199 -0
  115. package/dist/src/transformers/AliasRenamer.js +599 -0
  116. package/dist/src/transformers/AliasRenamer.js.map +1 -0
  117. package/dist/src/transformers/CTEBuilder.js +2 -2
  118. package/dist/src/transformers/CTEBuilder.js.map +1 -1
  119. package/dist/src/transformers/CTERenamer.d.ts +53 -0
  120. package/dist/src/transformers/CTERenamer.js +138 -0
  121. package/dist/src/transformers/CTERenamer.js.map +1 -1
  122. package/dist/src/transformers/DynamicQueryBuilder.d.ts +72 -0
  123. package/dist/src/transformers/DynamicQueryBuilder.js +42 -0
  124. package/dist/src/transformers/DynamicQueryBuilder.js.map +1 -1
  125. package/dist/src/transformers/FilterableItemCollector.d.ts +80 -0
  126. package/dist/src/transformers/FilterableItemCollector.js +259 -0
  127. package/dist/src/transformers/FilterableItemCollector.js.map +1 -0
  128. package/dist/src/transformers/SelectableColumnCollector.d.ts +3 -0
  129. package/dist/src/transformers/SelectableColumnCollector.js +67 -6
  130. package/dist/src/transformers/SelectableColumnCollector.js.map +1 -1
  131. package/dist/src/transformers/SmartRenamer.d.ts +134 -0
  132. package/dist/src/transformers/SmartRenamer.js +442 -0
  133. package/dist/src/transformers/SmartRenamer.js.map +1 -0
  134. package/dist/src/transformers/SqlIdentifierRenamer.d.ts +150 -0
  135. package/dist/src/transformers/SqlIdentifierRenamer.js +497 -0
  136. package/dist/src/transformers/SqlIdentifierRenamer.js.map +1 -0
  137. package/dist/src/transformers/SqlParamInjector.d.ts +27 -0
  138. package/dist/src/transformers/SqlParamInjector.js +303 -15
  139. package/dist/src/transformers/SqlParamInjector.js.map +1 -1
  140. package/dist/src/transformers/SqlSortInjector.js +5 -2
  141. package/dist/src/transformers/SqlSortInjector.js.map +1 -1
  142. package/dist/src/transformers/UpstreamSelectQueryFinder.js +4 -1
  143. package/dist/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
  144. package/dist/src/utils/CursorContextAnalyzer.d.ts +70 -0
  145. package/dist/src/utils/CursorContextAnalyzer.js +338 -0
  146. package/dist/src/utils/CursorContextAnalyzer.js.map +1 -0
  147. package/dist/src/utils/IntelliSenseApi.d.ts +114 -0
  148. package/dist/src/utils/IntelliSenseApi.js +292 -0
  149. package/dist/src/utils/IntelliSenseApi.js.map +1 -0
  150. package/dist/src/utils/KeywordCache.d.ts +65 -0
  151. package/dist/src/utils/KeywordCache.js +206 -0
  152. package/dist/src/utils/KeywordCache.js.map +1 -0
  153. package/dist/src/utils/LexemeCursor.d.ts +41 -0
  154. package/dist/src/utils/LexemeCursor.js +93 -0
  155. package/dist/src/utils/LexemeCursor.js.map +1 -1
  156. package/dist/src/utils/MultiQuerySplitter.d.ts +131 -0
  157. package/dist/src/utils/MultiQuerySplitter.js +292 -0
  158. package/dist/src/utils/MultiQuerySplitter.js.map +1 -0
  159. package/dist/src/utils/PositionAwareParser.d.ts +85 -0
  160. package/dist/src/utils/PositionAwareParser.js +363 -0
  161. package/dist/src/utils/PositionAwareParser.js.map +1 -0
  162. package/dist/src/utils/ScopeResolver.d.ts +127 -0
  163. package/dist/src/utils/ScopeResolver.js +272 -0
  164. package/dist/src/utils/ScopeResolver.js.map +1 -0
  165. package/dist/src/utils/TextPositionUtils.d.ts +62 -0
  166. package/dist/src/utils/TextPositionUtils.js +128 -0
  167. package/dist/src/utils/TextPositionUtils.js.map +1 -0
  168. package/dist/tsconfig.tsbuildinfo +1 -1
  169. package/package.json +1 -1
@@ -0,0 +1,336 @@
1
+ import { SelectQueryParser } from '../parsers/SelectQueryParser';
2
+ import { LexemeCursor } from './LexemeCursor';
3
+ import { TextPositionUtils } from './TextPositionUtils';
4
+ /**
5
+ * Position-aware SQL parser with error recovery for IntelliSense
6
+ *
7
+ * Extends the standard parser to handle incomplete SQL and provide context
8
+ * for IntelliSense scenarios where users are actively typing.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Parse incomplete SQL with error recovery
13
+ * const sql = "SELECT user.name FROM users user WHERE user.";
14
+ * const result = PositionAwareParser.parseToPosition(sql, sql.length, {
15
+ * errorRecovery: true,
16
+ * insertMissingTokens: true
17
+ * });
18
+ *
19
+ * console.log(result.tokenBeforeCursor?.value); // "."
20
+ * console.log(result.success); // true (with recovery)
21
+ * ```
22
+ */
23
+ export class PositionAwareParser {
24
+ /**
25
+ * Parse SQL text up to a specific position with error recovery
26
+ *
27
+ * @param sql - SQL text to parse
28
+ * @param cursorPosition - Character position to parse up to (0-based) or line/column
29
+ * @param options - Parsing options including error recovery
30
+ * @returns Parse result with position-specific information
31
+ */
32
+ static parseToPosition(sql, cursorPosition, options = {}) {
33
+ const charPosition = typeof cursorPosition === 'number'
34
+ ? cursorPosition
35
+ : TextPositionUtils.lineColumnToCharOffset(sql, cursorPosition);
36
+ if (charPosition === -1) {
37
+ return {
38
+ success: false,
39
+ error: 'Invalid cursor position',
40
+ stoppedAtCursor: false
41
+ };
42
+ }
43
+ try {
44
+ // First, try normal parsing
45
+ const normalResult = this.tryNormalParse(sql, charPosition, options);
46
+ if (normalResult.success) {
47
+ return normalResult;
48
+ }
49
+ // If normal parsing fails and error recovery is enabled, try recovery
50
+ if (options.errorRecovery) {
51
+ return this.tryErrorRecovery(sql, charPosition, options);
52
+ }
53
+ return normalResult;
54
+ }
55
+ catch (error) {
56
+ return {
57
+ success: false,
58
+ error: error instanceof Error ? error.message : String(error),
59
+ stoppedAtCursor: false
60
+ };
61
+ }
62
+ }
63
+ /**
64
+ * Parse current query from multi-query text at cursor position
65
+ *
66
+ * @param sql - Complete SQL text (may contain multiple statements)
67
+ * @param cursorPosition - Cursor position
68
+ * @param options - Parsing options
69
+ * @returns Parse result for the current query only
70
+ */
71
+ static parseCurrentQuery(sql, cursorPosition, options = {}) {
72
+ const charPosition = typeof cursorPosition === 'number'
73
+ ? cursorPosition
74
+ : TextPositionUtils.lineColumnToCharOffset(sql, cursorPosition);
75
+ if (charPosition === -1) {
76
+ return {
77
+ success: false,
78
+ error: 'Invalid cursor position',
79
+ stoppedAtCursor: false
80
+ };
81
+ }
82
+ // Split SQL by semicolons and find the query containing the cursor
83
+ const queryBoundaries = this.findQueryBoundaries(sql);
84
+ const currentQuery = this.findQueryAtPosition(queryBoundaries, charPosition);
85
+ if (!currentQuery) {
86
+ return {
87
+ success: false,
88
+ error: 'No query found at cursor position',
89
+ stoppedAtCursor: false
90
+ };
91
+ }
92
+ // Parse just the current query
93
+ const relativePosition = charPosition - currentQuery.start;
94
+ const querySQL = sql.substring(currentQuery.start, currentQuery.end);
95
+ return this.parseToPosition(querySQL, relativePosition, options);
96
+ }
97
+ static tryNormalParse(sql, cursorPosition, options) {
98
+ // Check for invalid cursor position first
99
+ if (cursorPosition < 0 || cursorPosition > sql.length) {
100
+ return {
101
+ success: false,
102
+ error: 'Invalid cursor position',
103
+ stoppedAtCursor: false
104
+ };
105
+ }
106
+ // Check if SQL appears incomplete (ends with dot, comma, etc.)
107
+ const trimmedSql = sql.trim();
108
+ const incompletePatterns = ['.', ',', 'SELECT', 'FROM', 'WHERE', 'JOIN', 'ON', 'GROUP BY', 'ORDER BY'];
109
+ const appearsIncomplete = incompletePatterns.some(pattern => trimmedSql.toLowerCase().endsWith(pattern.toLowerCase()));
110
+ // Try to parse the complete SQL
111
+ const analysisResult = SelectQueryParser.analyze(sql);
112
+ // If parsing failed OR SQL appears incomplete, return failure to trigger error recovery
113
+ if (!analysisResult.success || appearsIncomplete) {
114
+ return Object.assign(Object.assign({}, analysisResult), { success: false });
115
+ }
116
+ // Get tokens and find cursor token
117
+ const allTokens = this.getAllTokens(sql);
118
+ const cursorToken = this.findTokenAtPosition(allTokens, cursorPosition);
119
+ const beforeCursor = this.findTokenBeforePosition(allTokens, cursorPosition);
120
+ return Object.assign(Object.assign({}, analysisResult), { parsedTokens: allTokens, tokenBeforeCursor: beforeCursor, stoppedAtCursor: cursorPosition < sql.length, recoveryAttempts: 0 // Normal parse, no recovery needed
121
+ });
122
+ }
123
+ static tryErrorRecovery(sql, cursorPosition, options) {
124
+ const maxAttempts = options.maxRecoveryAttempts || 5;
125
+ let attempts = 0;
126
+ // Error recovery strategies in order of preference
127
+ const strategies = [
128
+ () => this.recoverWithTokenInsertion(sql, cursorPosition, options),
129
+ () => this.recoverWithTruncation(sql, cursorPosition, options),
130
+ () => this.recoverWithCompletion(sql, cursorPosition, options),
131
+ () => this.recoverWithMinimalSQL(sql, cursorPosition, options)
132
+ ];
133
+ for (const strategy of strategies) {
134
+ if (attempts >= maxAttempts)
135
+ break;
136
+ attempts++;
137
+ try {
138
+ const result = strategy();
139
+ if (result.success) {
140
+ result.recoveryAttempts = attempts;
141
+ return result;
142
+ }
143
+ }
144
+ catch (error) {
145
+ continue; // Try next strategy
146
+ }
147
+ }
148
+ // All recovery attempts failed
149
+ return {
150
+ success: false,
151
+ error: 'All error recovery attempts failed',
152
+ recoveryAttempts: attempts,
153
+ stoppedAtCursor: false
154
+ };
155
+ }
156
+ static recoverWithTokenInsertion(sql, cursorPosition, options) {
157
+ if (!options.insertMissingTokens) {
158
+ throw new Error('Token insertion disabled');
159
+ }
160
+ // Common patterns to fix
161
+ const fixes = [
162
+ { pattern: /SELECT\s*$/i, replacement: 'SELECT 1 ' },
163
+ { pattern: /FROM\s*$/i, replacement: 'FROM dual ' },
164
+ { pattern: /WHERE\s*$/i, replacement: 'WHERE 1=1 ' },
165
+ { pattern: /JOIN\s*$/i, replacement: 'JOIN dual ON 1=1 ' },
166
+ { pattern: /ON\s*$/i, replacement: 'ON 1=1 ' },
167
+ { pattern: /GROUP\s+BY\s*$/i, replacement: 'GROUP BY 1 ' },
168
+ { pattern: /ORDER\s+BY\s*$/i, replacement: 'ORDER BY 1 ' }
169
+ ];
170
+ let fixedSQL = sql;
171
+ for (const fix of fixes) {
172
+ if (fix.pattern.test(sql)) {
173
+ fixedSQL = sql.replace(fix.pattern, fix.replacement);
174
+ break;
175
+ }
176
+ }
177
+ if (fixedSQL === sql) {
178
+ throw new Error('No applicable token insertion found');
179
+ }
180
+ const result = SelectQueryParser.analyze(fixedSQL);
181
+ const tokens = this.getAllTokens(sql); // Use original SQL for tokens
182
+ return Object.assign(Object.assign({}, result), { parsedTokens: tokens, tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition), stoppedAtCursor: true, recoveryAttempts: 1 });
183
+ }
184
+ static recoverWithTruncation(sql, cursorPosition, options) {
185
+ // Try truncating at cursor position and adding minimal completion
186
+ const truncated = sql.substring(0, cursorPosition);
187
+ const completions = [
188
+ '', // Try as-is first
189
+ ' 1', // Add simple expression
190
+ ' FROM dual', // Add FROM clause
191
+ ' WHERE 1=1' // Add WHERE clause
192
+ ];
193
+ for (const completion of completions) {
194
+ try {
195
+ const testSQL = truncated + completion;
196
+ const result = SelectQueryParser.analyze(testSQL);
197
+ if (result.success) {
198
+ const tokens = this.getAllTokens(sql);
199
+ return Object.assign(Object.assign({}, result), { parsedTokens: tokens.filter(t => t.position && t.position.startPosition <= cursorPosition), tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition), stoppedAtCursor: true, recoveryAttempts: 1 });
200
+ }
201
+ }
202
+ catch (error) {
203
+ continue;
204
+ }
205
+ }
206
+ throw new Error('Truncation recovery failed');
207
+ }
208
+ static recoverWithCompletion(sql, cursorPosition, options) {
209
+ // Try completing common incomplete patterns
210
+ const beforeCursor = sql.substring(0, cursorPosition);
211
+ const afterCursor = sql.substring(cursorPosition);
212
+ const completions = [
213
+ { pattern: /\.\s*$/, completion: 'id' }, // Complete column reference
214
+ { pattern: /\w+\s*$/, completion: '' }, // Complete identifier
215
+ { pattern: /,\s*$/, completion: '1' }, // Complete list item
216
+ { pattern: /\(\s*$/, completion: '1)' } // Complete parentheses
217
+ ];
218
+ for (const comp of completions) {
219
+ if (comp.pattern.test(beforeCursor)) {
220
+ const testSQL = beforeCursor + comp.completion + afterCursor;
221
+ try {
222
+ const result = SelectQueryParser.analyze(testSQL);
223
+ if (result.success) {
224
+ const tokens = this.getAllTokens(sql);
225
+ return Object.assign(Object.assign({}, result), { parsedTokens: tokens, tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition), stoppedAtCursor: true, recoveryAttempts: 1 });
226
+ }
227
+ }
228
+ catch (error) {
229
+ continue;
230
+ }
231
+ }
232
+ }
233
+ throw new Error('Completion recovery failed');
234
+ }
235
+ static recoverWithMinimalSQL(sql, cursorPosition, options) {
236
+ // Generate minimal valid SQL that preserves structure up to cursor
237
+ const minimalSQL = 'SELECT 1 FROM dual WHERE 1=1';
238
+ try {
239
+ const result = SelectQueryParser.analyze(minimalSQL);
240
+ const tokens = this.getAllTokens(sql);
241
+ return {
242
+ success: true,
243
+ query: result.query,
244
+ parsedTokens: tokens.filter(t => t.position && t.position.startPosition <= cursorPosition),
245
+ tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition),
246
+ stoppedAtCursor: true,
247
+ partialAST: result.query,
248
+ recoveryAttempts: 1
249
+ };
250
+ }
251
+ catch (error) {
252
+ throw new Error('Minimal SQL recovery failed');
253
+ }
254
+ }
255
+ static getAllTokens(sql) {
256
+ try {
257
+ // Use LexemeCursor which includes position information
258
+ return LexemeCursor.getAllLexemesWithPosition(sql);
259
+ }
260
+ catch (error) {
261
+ return [];
262
+ }
263
+ }
264
+ static findTokenAtPosition(tokens, position) {
265
+ return tokens.find(token => token.position &&
266
+ position >= token.position.startPosition &&
267
+ position < token.position.endPosition);
268
+ }
269
+ static findTokenBeforePosition(tokens, position) {
270
+ // Find the last token that ends at or before the position
271
+ let beforeToken;
272
+ for (const token of tokens) {
273
+ if (token.position) {
274
+ if (token.position.endPosition <= position) {
275
+ beforeToken = token;
276
+ }
277
+ else if (token.position.startPosition < position) {
278
+ // Current position is within this token, so previous token is the one before
279
+ break;
280
+ }
281
+ else {
282
+ // We've passed the cursor position
283
+ break;
284
+ }
285
+ }
286
+ }
287
+ return beforeToken;
288
+ }
289
+ static findQueryBoundaries(sql) {
290
+ const boundaries = [];
291
+ let currentStart = 0;
292
+ let inString = false;
293
+ let stringChar = '';
294
+ let inComment = false;
295
+ for (let i = 0; i < sql.length; i++) {
296
+ const char = sql[i];
297
+ const nextChar = i < sql.length - 1 ? sql[i + 1] : '';
298
+ // Handle string literals
299
+ if (!inComment && (char === "'" || char === '"')) {
300
+ if (!inString) {
301
+ inString = true;
302
+ stringChar = char;
303
+ }
304
+ else if (char === stringChar) {
305
+ inString = false;
306
+ stringChar = '';
307
+ }
308
+ continue;
309
+ }
310
+ // Handle comments
311
+ if (!inString && char === '-' && nextChar === '-') {
312
+ inComment = true;
313
+ i++; // Skip next char
314
+ continue;
315
+ }
316
+ if (inComment && char === '\n') {
317
+ inComment = false;
318
+ continue;
319
+ }
320
+ // Handle semicolons (query boundaries)
321
+ if (!inString && !inComment && char === ';') {
322
+ boundaries.push({ start: currentStart, end: i });
323
+ currentStart = i + 1;
324
+ }
325
+ }
326
+ // Add final query if no trailing semicolon
327
+ if (currentStart < sql.length) {
328
+ boundaries.push({ start: currentStart, end: sql.length });
329
+ }
330
+ return boundaries;
331
+ }
332
+ static findQueryAtPosition(boundaries, position) {
333
+ return boundaries.find(boundary => position >= boundary.start && position <= boundary.end);
334
+ }
335
+ }
336
+ //# sourceMappingURL=PositionAwareParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PositionAwareParser.js","sourceRoot":"","sources":["../../../../src/utils/PositionAwareParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import { SelectQuery } from '../models/SelectQuery';
2
+ /**
3
+ * Information about a table available in the current scope
4
+ */
5
+ export interface AvailableTable {
6
+ /** Table name (unqualified) */
7
+ name: string;
8
+ /** Table alias (if any) */
9
+ alias?: string;
10
+ /** Schema name (if qualified) */
11
+ schema?: string;
12
+ /** Full qualified name */
13
+ fullName: string;
14
+ /** Source type: 'table', 'cte', 'subquery' */
15
+ sourceType: 'table' | 'cte' | 'subquery';
16
+ /** Original table reference for subqueries */
17
+ originalQuery?: SelectQuery;
18
+ }
19
+ /**
20
+ * Information about a CTE available in the current scope
21
+ */
22
+ export interface AvailableCTE {
23
+ /** CTE name */
24
+ name: string;
25
+ /** Column names if determinable */
26
+ columns?: string[];
27
+ /** The CTE query definition */
28
+ query: SelectQuery;
29
+ /** Whether the CTE is materialized */
30
+ materialized?: boolean;
31
+ }
32
+ /**
33
+ * Information about columns available for a specific table
34
+ */
35
+ export interface AvailableColumn {
36
+ /** Column name */
37
+ name: string;
38
+ /** Table name the column belongs to */
39
+ tableName: string;
40
+ /** Table alias (if any) */
41
+ tableAlias?: string;
42
+ /** Data type (if known) */
43
+ type?: string;
44
+ /** Whether column is nullable */
45
+ nullable?: boolean;
46
+ /** Full qualified column reference */
47
+ fullReference: string;
48
+ }
49
+ /**
50
+ * Complete scope information at a cursor position
51
+ */
52
+ export interface ScopeInfo {
53
+ /** Tables available at the current position */
54
+ availableTables: AvailableTable[];
55
+ /** CTEs available at the current position */
56
+ availableCTEs: AvailableCTE[];
57
+ /** Nesting level (0 = root query) */
58
+ subqueryLevel: number;
59
+ /** Columns visible from all tables in scope */
60
+ visibleColumns: AvailableColumn[];
61
+ /** Current query being analyzed */
62
+ currentQuery?: SelectQuery;
63
+ /** Parent queries (for nested contexts) */
64
+ parentQueries: SelectQuery[];
65
+ }
66
+ /**
67
+ * Resolves scope information at cursor positions for SQL IntelliSense
68
+ *
69
+ * Provides comprehensive scope analysis including table availability, CTE resolution,
70
+ * and column visibility for intelligent code completion suggestions.
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const sql = `
75
+ * WITH users AS (SELECT id, name FROM accounts)
76
+ * SELECT u.name FROM users u
77
+ * LEFT JOIN orders o ON u.id = o.user_id
78
+ * WHERE u.|
79
+ * `;
80
+ * const scope = ScopeResolver.resolveAt(sql, { line: 4, column: 12 });
81
+ *
82
+ * console.log(scope.availableTables); // [{ name: 'users', alias: 'u' }, { name: 'orders', alias: 'o' }]
83
+ * console.log(scope.availableCTEs); // [{ name: 'users', columns: ['id', 'name'] }]
84
+ * ```
85
+ */
86
+ export declare class ScopeResolver {
87
+ /**
88
+ * Resolve scope information at the specified cursor position
89
+ *
90
+ * @param sql - SQL text to analyze
91
+ * @param cursorPosition - Character position of cursor (0-based)
92
+ * @returns Complete scope information
93
+ */
94
+ static resolve(sql: string, cursorPosition: number): ScopeInfo;
95
+ /**
96
+ * Resolve scope information at line/column position
97
+ *
98
+ * @param sql - SQL text to analyze
99
+ * @param position - Line and column position (1-based)
100
+ * @returns Complete scope information
101
+ */
102
+ static resolveAt(sql: string, position: {
103
+ line: number;
104
+ column: number;
105
+ }): ScopeInfo;
106
+ /**
107
+ * Get available columns for a specific table or alias
108
+ *
109
+ * @param sql - SQL text containing the query
110
+ * @param cursorPosition - Cursor position for scope resolution
111
+ * @param tableOrAlias - Table name or alias to get columns for
112
+ * @returns Array of available columns for the specified table
113
+ */
114
+ static getColumnsForTable(sql: string, cursorPosition: number, tableOrAlias: string): AvailableColumn[];
115
+ private static analyzeScopeFromQuery;
116
+ private static collectCTEs;
117
+ private static collectTablesFromQuery;
118
+ private static extractTablesFromFromClause;
119
+ private static extractTablesFromJoin;
120
+ private static getQualifiedNameString;
121
+ private static extractTableName;
122
+ private static extractSchemaName;
123
+ private static extractCTEColumns;
124
+ private static extractColumnNameFromExpression;
125
+ private static collectVisibleColumns;
126
+ private static createEmptyScope;
127
+ }