rawsql-ts 0.11.33-beta → 0.11.35-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 (113) hide show
  1. package/dist/esm/index.js +19 -0
  2. package/dist/esm/index.js.map +1 -1
  3. package/dist/esm/index.min.js +51 -43
  4. package/dist/esm/index.min.js.map +4 -4
  5. package/dist/esm/src/index.d.ts +21 -0
  6. package/dist/esm/src/index.js +19 -0
  7. package/dist/esm/src/index.js.map +1 -1
  8. package/dist/esm/src/models/ValueComponent.d.ts +2 -2
  9. package/dist/esm/src/models/ValueComponent.js +2 -2
  10. package/dist/esm/src/models/ValueComponent.js.map +1 -1
  11. package/dist/esm/src/parsers/FunctionExpressionParser.d.ts +8 -1
  12. package/dist/esm/src/parsers/FunctionExpressionParser.js +75 -7
  13. package/dist/esm/src/parsers/FunctionExpressionParser.js.map +1 -1
  14. package/dist/esm/src/parsers/LiteralParser.js +5 -5
  15. package/dist/esm/src/parsers/LiteralParser.js.map +1 -1
  16. package/dist/esm/src/parsers/ParenExpressionParser.js +5 -0
  17. package/dist/esm/src/parsers/ParenExpressionParser.js.map +1 -1
  18. package/dist/esm/src/parsers/SelectQueryParser.js +26 -3
  19. package/dist/esm/src/parsers/SelectQueryParser.js.map +1 -1
  20. package/dist/esm/src/parsers/SqlPrintTokenParser.js +31 -12
  21. package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
  22. package/dist/esm/src/parsers/ValueParser.js +6 -2
  23. package/dist/esm/src/parsers/ValueParser.js.map +1 -1
  24. package/dist/esm/src/tokenReaders/CommandTokenReader.js +5 -0
  25. package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
  26. package/dist/esm/src/tokenReaders/LiteralTokenReader.js +7 -15
  27. package/dist/esm/src/tokenReaders/LiteralTokenReader.js.map +1 -1
  28. package/dist/esm/src/transformers/CTEBuilder.js +2 -2
  29. package/dist/esm/src/transformers/CTEBuilder.js.map +1 -1
  30. package/dist/esm/src/transformers/PostgresArrayEntityCteBuilder.js +2 -2
  31. package/dist/esm/src/transformers/PostgresArrayEntityCteBuilder.js.map +1 -1
  32. package/dist/esm/src/transformers/PostgresJsonQueryBuilder.js +2 -2
  33. package/dist/esm/src/transformers/PostgresJsonQueryBuilder.js.map +1 -1
  34. package/dist/esm/src/transformers/PostgresObjectEntityCteBuilder.js +2 -2
  35. package/dist/esm/src/transformers/PostgresObjectEntityCteBuilder.js.map +1 -1
  36. package/dist/esm/src/utils/CursorContextAnalyzer.d.ts +70 -0
  37. package/dist/esm/src/utils/CursorContextAnalyzer.js +322 -0
  38. package/dist/esm/src/utils/CursorContextAnalyzer.js.map +1 -0
  39. package/dist/esm/src/utils/IntelliSenseApi.d.ts +114 -0
  40. package/dist/esm/src/utils/IntelliSenseApi.js +284 -0
  41. package/dist/esm/src/utils/IntelliSenseApi.js.map +1 -0
  42. package/dist/esm/src/utils/KeywordCache.d.ts +65 -0
  43. package/dist/esm/src/utils/KeywordCache.js +202 -0
  44. package/dist/esm/src/utils/KeywordCache.js.map +1 -0
  45. package/dist/esm/src/utils/MultiQuerySplitter.d.ts +131 -0
  46. package/dist/esm/src/utils/MultiQuerySplitter.js +287 -0
  47. package/dist/esm/src/utils/MultiQuerySplitter.js.map +1 -0
  48. package/dist/esm/src/utils/PositionAwareParser.d.ts +85 -0
  49. package/dist/esm/src/utils/PositionAwareParser.js +336 -0
  50. package/dist/esm/src/utils/PositionAwareParser.js.map +1 -0
  51. package/dist/esm/src/utils/ScopeResolver.d.ts +127 -0
  52. package/dist/esm/src/utils/ScopeResolver.js +268 -0
  53. package/dist/esm/src/utils/ScopeResolver.js.map +1 -0
  54. package/dist/esm/src/utils/TextPositionUtils.d.ts +62 -0
  55. package/dist/esm/src/utils/TextPositionUtils.js +124 -0
  56. package/dist/esm/src/utils/TextPositionUtils.js.map +1 -0
  57. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  58. package/dist/index.min.js +51 -43
  59. package/dist/index.min.js.map +4 -4
  60. package/dist/src/index.d.ts +21 -0
  61. package/dist/src/index.js +20 -1
  62. package/dist/src/index.js.map +1 -1
  63. package/dist/src/models/ValueComponent.d.ts +2 -2
  64. package/dist/src/models/ValueComponent.js +2 -2
  65. package/dist/src/models/ValueComponent.js.map +1 -1
  66. package/dist/src/parsers/FunctionExpressionParser.d.ts +8 -1
  67. package/dist/src/parsers/FunctionExpressionParser.js +75 -7
  68. package/dist/src/parsers/FunctionExpressionParser.js.map +1 -1
  69. package/dist/src/parsers/LiteralParser.js +5 -5
  70. package/dist/src/parsers/LiteralParser.js.map +1 -1
  71. package/dist/src/parsers/ParenExpressionParser.js +5 -0
  72. package/dist/src/parsers/ParenExpressionParser.js.map +1 -1
  73. package/dist/src/parsers/SelectQueryParser.js +26 -3
  74. package/dist/src/parsers/SelectQueryParser.js.map +1 -1
  75. package/dist/src/parsers/SqlPrintTokenParser.js +31 -12
  76. package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
  77. package/dist/src/parsers/ValueParser.js +6 -2
  78. package/dist/src/parsers/ValueParser.js.map +1 -1
  79. package/dist/src/tokenReaders/CommandTokenReader.js +5 -0
  80. package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
  81. package/dist/src/tokenReaders/LiteralTokenReader.js +7 -15
  82. package/dist/src/tokenReaders/LiteralTokenReader.js.map +1 -1
  83. package/dist/src/transformers/CTEBuilder.js +2 -2
  84. package/dist/src/transformers/CTEBuilder.js.map +1 -1
  85. package/dist/src/transformers/PostgresArrayEntityCteBuilder.js +2 -2
  86. package/dist/src/transformers/PostgresArrayEntityCteBuilder.js.map +1 -1
  87. package/dist/src/transformers/PostgresJsonQueryBuilder.js +2 -2
  88. package/dist/src/transformers/PostgresJsonQueryBuilder.js.map +1 -1
  89. package/dist/src/transformers/PostgresObjectEntityCteBuilder.js +2 -2
  90. package/dist/src/transformers/PostgresObjectEntityCteBuilder.js.map +1 -1
  91. package/dist/src/utils/CursorContextAnalyzer.d.ts +70 -0
  92. package/dist/src/utils/CursorContextAnalyzer.js +338 -0
  93. package/dist/src/utils/CursorContextAnalyzer.js.map +1 -0
  94. package/dist/src/utils/IntelliSenseApi.d.ts +114 -0
  95. package/dist/src/utils/IntelliSenseApi.js +292 -0
  96. package/dist/src/utils/IntelliSenseApi.js.map +1 -0
  97. package/dist/src/utils/KeywordCache.d.ts +65 -0
  98. package/dist/src/utils/KeywordCache.js +206 -0
  99. package/dist/src/utils/KeywordCache.js.map +1 -0
  100. package/dist/src/utils/MultiQuerySplitter.d.ts +131 -0
  101. package/dist/src/utils/MultiQuerySplitter.js +292 -0
  102. package/dist/src/utils/MultiQuerySplitter.js.map +1 -0
  103. package/dist/src/utils/PositionAwareParser.d.ts +85 -0
  104. package/dist/src/utils/PositionAwareParser.js +363 -0
  105. package/dist/src/utils/PositionAwareParser.js.map +1 -0
  106. package/dist/src/utils/ScopeResolver.d.ts +127 -0
  107. package/dist/src/utils/ScopeResolver.js +272 -0
  108. package/dist/src/utils/ScopeResolver.js.map +1 -0
  109. package/dist/src/utils/TextPositionUtils.d.ts +62 -0
  110. package/dist/src/utils/TextPositionUtils.js +128 -0
  111. package/dist/src/utils/TextPositionUtils.js.map +1 -0
  112. package/dist/tsconfig.tsbuildinfo +1 -1
  113. package/package.json +1 -1
@@ -0,0 +1,85 @@
1
+ import { SelectQuery } from '../models/SelectQuery';
2
+ import { ParseAnalysisResult } from '../parsers/SelectQueryParser';
3
+ import { Lexeme } from '../models/Lexeme';
4
+ import { LineColumn } from './LexemeCursor';
5
+ /**
6
+ * Options for position-aware parsing
7
+ */
8
+ export interface ParseToPositionOptions {
9
+ /** Enable error recovery to continue parsing after syntax errors */
10
+ errorRecovery?: boolean;
11
+ /** Insert missing tokens (e.g., missing FROM keywords) */
12
+ insertMissingTokens?: boolean;
13
+ /** Parse only up to the specified position */
14
+ parseToPosition?: {
15
+ line: number;
16
+ column: number;
17
+ } | number;
18
+ /** Maximum number of error recovery attempts */
19
+ maxRecoveryAttempts?: number;
20
+ }
21
+ /**
22
+ * Result of position-aware parsing
23
+ */
24
+ export interface PositionParseResult extends ParseAnalysisResult {
25
+ /** Tokens that were parsed up to the cursor position */
26
+ parsedTokens?: Lexeme[];
27
+ /** Token immediately before the cursor position */
28
+ tokenBeforeCursor?: Lexeme;
29
+ /** Whether parsing stopped at the cursor position */
30
+ stoppedAtCursor?: boolean;
31
+ /** Number of error recovery attempts made */
32
+ recoveryAttempts?: number;
33
+ /** Partial AST even if parsing failed */
34
+ partialAST?: SelectQuery;
35
+ }
36
+ /**
37
+ * Position-aware SQL parser with error recovery for IntelliSense
38
+ *
39
+ * Extends the standard parser to handle incomplete SQL and provide context
40
+ * for IntelliSense scenarios where users are actively typing.
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * // Parse incomplete SQL with error recovery
45
+ * const sql = "SELECT user.name FROM users user WHERE user.";
46
+ * const result = PositionAwareParser.parseToPosition(sql, sql.length, {
47
+ * errorRecovery: true,
48
+ * insertMissingTokens: true
49
+ * });
50
+ *
51
+ * console.log(result.tokenBeforeCursor?.value); // "."
52
+ * console.log(result.success); // true (with recovery)
53
+ * ```
54
+ */
55
+ export declare class PositionAwareParser {
56
+ /**
57
+ * Parse SQL text up to a specific position with error recovery
58
+ *
59
+ * @param sql - SQL text to parse
60
+ * @param cursorPosition - Character position to parse up to (0-based) or line/column
61
+ * @param options - Parsing options including error recovery
62
+ * @returns Parse result with position-specific information
63
+ */
64
+ static parseToPosition(sql: string, cursorPosition: number | LineColumn, options?: ParseToPositionOptions): PositionParseResult;
65
+ /**
66
+ * Parse current query from multi-query text at cursor position
67
+ *
68
+ * @param sql - Complete SQL text (may contain multiple statements)
69
+ * @param cursorPosition - Cursor position
70
+ * @param options - Parsing options
71
+ * @returns Parse result for the current query only
72
+ */
73
+ static parseCurrentQuery(sql: string, cursorPosition: number | LineColumn, options?: ParseToPositionOptions): PositionParseResult;
74
+ private static tryNormalParse;
75
+ private static tryErrorRecovery;
76
+ private static recoverWithTokenInsertion;
77
+ private static recoverWithTruncation;
78
+ private static recoverWithCompletion;
79
+ private static recoverWithMinimalSQL;
80
+ private static getAllTokens;
81
+ private static findTokenAtPosition;
82
+ private static findTokenBeforePosition;
83
+ private static findQueryBoundaries;
84
+ private static findQueryAtPosition;
85
+ }
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PositionAwareParser = void 0;
4
+ const SelectQueryParser_1 = require("../parsers/SelectQueryParser");
5
+ const LexemeCursor_1 = require("./LexemeCursor");
6
+ const TextPositionUtils_1 = require("./TextPositionUtils");
7
+ /**
8
+ * Position-aware SQL parser with error recovery for IntelliSense
9
+ *
10
+ * Extends the standard parser to handle incomplete SQL and provide context
11
+ * for IntelliSense scenarios where users are actively typing.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // Parse incomplete SQL with error recovery
16
+ * const sql = "SELECT user.name FROM users user WHERE user.";
17
+ * const result = PositionAwareParser.parseToPosition(sql, sql.length, {
18
+ * errorRecovery: true,
19
+ * insertMissingTokens: true
20
+ * });
21
+ *
22
+ * console.log(result.tokenBeforeCursor?.value); // "."
23
+ * console.log(result.success); // true (with recovery)
24
+ * ```
25
+ */
26
+ class PositionAwareParser {
27
+ /**
28
+ * Parse SQL text up to a specific position with error recovery
29
+ *
30
+ * @param sql - SQL text to parse
31
+ * @param cursorPosition - Character position to parse up to (0-based) or line/column
32
+ * @param options - Parsing options including error recovery
33
+ * @returns Parse result with position-specific information
34
+ */
35
+ static parseToPosition(sql, cursorPosition, options = {}) {
36
+ const charPosition = typeof cursorPosition === 'number'
37
+ ? cursorPosition
38
+ : TextPositionUtils_1.TextPositionUtils.lineColumnToCharOffset(sql, cursorPosition);
39
+ if (charPosition === -1) {
40
+ return {
41
+ success: false,
42
+ error: 'Invalid cursor position',
43
+ stoppedAtCursor: false
44
+ };
45
+ }
46
+ try {
47
+ // First, try normal parsing
48
+ const normalResult = this.tryNormalParse(sql, charPosition, options);
49
+ if (normalResult.success) {
50
+ return normalResult;
51
+ }
52
+ // If normal parsing fails and error recovery is enabled, try recovery
53
+ if (options.errorRecovery) {
54
+ return this.tryErrorRecovery(sql, charPosition, options);
55
+ }
56
+ return normalResult;
57
+ }
58
+ catch (error) {
59
+ return {
60
+ success: false,
61
+ error: error instanceof Error ? error.message : String(error),
62
+ stoppedAtCursor: false
63
+ };
64
+ }
65
+ }
66
+ /**
67
+ * Parse current query from multi-query text at cursor position
68
+ *
69
+ * @param sql - Complete SQL text (may contain multiple statements)
70
+ * @param cursorPosition - Cursor position
71
+ * @param options - Parsing options
72
+ * @returns Parse result for the current query only
73
+ */
74
+ static parseCurrentQuery(sql, cursorPosition, options = {}) {
75
+ const charPosition = typeof cursorPosition === 'number'
76
+ ? cursorPosition
77
+ : TextPositionUtils_1.TextPositionUtils.lineColumnToCharOffset(sql, cursorPosition);
78
+ if (charPosition === -1) {
79
+ return {
80
+ success: false,
81
+ error: 'Invalid cursor position',
82
+ stoppedAtCursor: false
83
+ };
84
+ }
85
+ // Split SQL by semicolons and find the query containing the cursor
86
+ const queryBoundaries = this.findQueryBoundaries(sql);
87
+ const currentQuery = this.findQueryAtPosition(queryBoundaries, charPosition);
88
+ if (!currentQuery) {
89
+ return {
90
+ success: false,
91
+ error: 'No query found at cursor position',
92
+ stoppedAtCursor: false
93
+ };
94
+ }
95
+ // Parse just the current query
96
+ const relativePosition = charPosition - currentQuery.start;
97
+ const querySQL = sql.substring(currentQuery.start, currentQuery.end);
98
+ return this.parseToPosition(querySQL, relativePosition, options);
99
+ }
100
+ static tryNormalParse(sql, cursorPosition, options) {
101
+ // Check for invalid cursor position first
102
+ if (cursorPosition < 0 || cursorPosition > sql.length) {
103
+ return {
104
+ success: false,
105
+ error: 'Invalid cursor position',
106
+ stoppedAtCursor: false
107
+ };
108
+ }
109
+ // Check if SQL appears incomplete (ends with dot, comma, etc.)
110
+ const trimmedSql = sql.trim();
111
+ const incompletePatterns = ['.', ',', 'SELECT', 'FROM', 'WHERE', 'JOIN', 'ON', 'GROUP BY', 'ORDER BY'];
112
+ const appearsIncomplete = incompletePatterns.some(pattern => trimmedSql.toLowerCase().endsWith(pattern.toLowerCase()));
113
+ // Try to parse the complete SQL
114
+ const analysisResult = SelectQueryParser_1.SelectQueryParser.analyze(sql);
115
+ // If parsing failed OR SQL appears incomplete, return failure to trigger error recovery
116
+ if (!analysisResult.success || appearsIncomplete) {
117
+ return { ...analysisResult, success: false };
118
+ }
119
+ // Get tokens and find cursor token
120
+ const allTokens = this.getAllTokens(sql);
121
+ const cursorToken = this.findTokenAtPosition(allTokens, cursorPosition);
122
+ const beforeCursor = this.findTokenBeforePosition(allTokens, cursorPosition);
123
+ return {
124
+ ...analysisResult,
125
+ parsedTokens: allTokens,
126
+ tokenBeforeCursor: beforeCursor,
127
+ stoppedAtCursor: cursorPosition < sql.length, // True if cursor is before end of SQL
128
+ recoveryAttempts: 0 // Normal parse, no recovery needed
129
+ };
130
+ }
131
+ static tryErrorRecovery(sql, cursorPosition, options) {
132
+ const maxAttempts = options.maxRecoveryAttempts || 5;
133
+ let attempts = 0;
134
+ // Error recovery strategies in order of preference
135
+ const strategies = [
136
+ () => this.recoverWithTokenInsertion(sql, cursorPosition, options),
137
+ () => this.recoverWithTruncation(sql, cursorPosition, options),
138
+ () => this.recoverWithCompletion(sql, cursorPosition, options),
139
+ () => this.recoverWithMinimalSQL(sql, cursorPosition, options)
140
+ ];
141
+ for (const strategy of strategies) {
142
+ if (attempts >= maxAttempts)
143
+ break;
144
+ attempts++;
145
+ try {
146
+ const result = strategy();
147
+ if (result.success) {
148
+ result.recoveryAttempts = attempts;
149
+ return result;
150
+ }
151
+ }
152
+ catch (error) {
153
+ continue; // Try next strategy
154
+ }
155
+ }
156
+ // All recovery attempts failed
157
+ return {
158
+ success: false,
159
+ error: 'All error recovery attempts failed',
160
+ recoveryAttempts: attempts,
161
+ stoppedAtCursor: false
162
+ };
163
+ }
164
+ static recoverWithTokenInsertion(sql, cursorPosition, options) {
165
+ if (!options.insertMissingTokens) {
166
+ throw new Error('Token insertion disabled');
167
+ }
168
+ // Common patterns to fix
169
+ const fixes = [
170
+ { pattern: /SELECT\s*$/i, replacement: 'SELECT 1 ' },
171
+ { pattern: /FROM\s*$/i, replacement: 'FROM dual ' },
172
+ { pattern: /WHERE\s*$/i, replacement: 'WHERE 1=1 ' },
173
+ { pattern: /JOIN\s*$/i, replacement: 'JOIN dual ON 1=1 ' },
174
+ { pattern: /ON\s*$/i, replacement: 'ON 1=1 ' },
175
+ { pattern: /GROUP\s+BY\s*$/i, replacement: 'GROUP BY 1 ' },
176
+ { pattern: /ORDER\s+BY\s*$/i, replacement: 'ORDER BY 1 ' }
177
+ ];
178
+ let fixedSQL = sql;
179
+ for (const fix of fixes) {
180
+ if (fix.pattern.test(sql)) {
181
+ fixedSQL = sql.replace(fix.pattern, fix.replacement);
182
+ break;
183
+ }
184
+ }
185
+ if (fixedSQL === sql) {
186
+ throw new Error('No applicable token insertion found');
187
+ }
188
+ const result = SelectQueryParser_1.SelectQueryParser.analyze(fixedSQL);
189
+ const tokens = this.getAllTokens(sql); // Use original SQL for tokens
190
+ return {
191
+ ...result,
192
+ parsedTokens: tokens,
193
+ tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition),
194
+ stoppedAtCursor: true,
195
+ recoveryAttempts: 1
196
+ };
197
+ }
198
+ static recoverWithTruncation(sql, cursorPosition, options) {
199
+ // Try truncating at cursor position and adding minimal completion
200
+ const truncated = sql.substring(0, cursorPosition);
201
+ const completions = [
202
+ '', // Try as-is first
203
+ ' 1', // Add simple expression
204
+ ' FROM dual', // Add FROM clause
205
+ ' WHERE 1=1' // Add WHERE clause
206
+ ];
207
+ for (const completion of completions) {
208
+ try {
209
+ const testSQL = truncated + completion;
210
+ const result = SelectQueryParser_1.SelectQueryParser.analyze(testSQL);
211
+ if (result.success) {
212
+ const tokens = this.getAllTokens(sql);
213
+ return {
214
+ ...result,
215
+ parsedTokens: tokens.filter(t => t.position && t.position.startPosition <= cursorPosition),
216
+ tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition),
217
+ stoppedAtCursor: true,
218
+ recoveryAttempts: 1
219
+ };
220
+ }
221
+ }
222
+ catch (error) {
223
+ continue;
224
+ }
225
+ }
226
+ throw new Error('Truncation recovery failed');
227
+ }
228
+ static recoverWithCompletion(sql, cursorPosition, options) {
229
+ // Try completing common incomplete patterns
230
+ const beforeCursor = sql.substring(0, cursorPosition);
231
+ const afterCursor = sql.substring(cursorPosition);
232
+ const completions = [
233
+ { pattern: /\.\s*$/, completion: 'id' }, // Complete column reference
234
+ { pattern: /\w+\s*$/, completion: '' }, // Complete identifier
235
+ { pattern: /,\s*$/, completion: '1' }, // Complete list item
236
+ { pattern: /\(\s*$/, completion: '1)' } // Complete parentheses
237
+ ];
238
+ for (const comp of completions) {
239
+ if (comp.pattern.test(beforeCursor)) {
240
+ const testSQL = beforeCursor + comp.completion + afterCursor;
241
+ try {
242
+ const result = SelectQueryParser_1.SelectQueryParser.analyze(testSQL);
243
+ if (result.success) {
244
+ const tokens = this.getAllTokens(sql);
245
+ return {
246
+ ...result,
247
+ parsedTokens: tokens,
248
+ tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition),
249
+ stoppedAtCursor: true,
250
+ recoveryAttempts: 1
251
+ };
252
+ }
253
+ }
254
+ catch (error) {
255
+ continue;
256
+ }
257
+ }
258
+ }
259
+ throw new Error('Completion recovery failed');
260
+ }
261
+ static recoverWithMinimalSQL(sql, cursorPosition, options) {
262
+ // Generate minimal valid SQL that preserves structure up to cursor
263
+ const minimalSQL = 'SELECT 1 FROM dual WHERE 1=1';
264
+ try {
265
+ const result = SelectQueryParser_1.SelectQueryParser.analyze(minimalSQL);
266
+ const tokens = this.getAllTokens(sql);
267
+ return {
268
+ success: true,
269
+ query: result.query,
270
+ parsedTokens: tokens.filter(t => t.position && t.position.startPosition <= cursorPosition),
271
+ tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition),
272
+ stoppedAtCursor: true,
273
+ partialAST: result.query,
274
+ recoveryAttempts: 1
275
+ };
276
+ }
277
+ catch (error) {
278
+ throw new Error('Minimal SQL recovery failed');
279
+ }
280
+ }
281
+ static getAllTokens(sql) {
282
+ try {
283
+ // Use LexemeCursor which includes position information
284
+ return LexemeCursor_1.LexemeCursor.getAllLexemesWithPosition(sql);
285
+ }
286
+ catch (error) {
287
+ return [];
288
+ }
289
+ }
290
+ static findTokenAtPosition(tokens, position) {
291
+ return tokens.find(token => token.position &&
292
+ position >= token.position.startPosition &&
293
+ position < token.position.endPosition);
294
+ }
295
+ static findTokenBeforePosition(tokens, position) {
296
+ // Find the last token that ends at or before the position
297
+ let beforeToken;
298
+ for (const token of tokens) {
299
+ if (token.position) {
300
+ if (token.position.endPosition <= position) {
301
+ beforeToken = token;
302
+ }
303
+ else if (token.position.startPosition < position) {
304
+ // Current position is within this token, so previous token is the one before
305
+ break;
306
+ }
307
+ else {
308
+ // We've passed the cursor position
309
+ break;
310
+ }
311
+ }
312
+ }
313
+ return beforeToken;
314
+ }
315
+ static findQueryBoundaries(sql) {
316
+ const boundaries = [];
317
+ let currentStart = 0;
318
+ let inString = false;
319
+ let stringChar = '';
320
+ let inComment = false;
321
+ for (let i = 0; i < sql.length; i++) {
322
+ const char = sql[i];
323
+ const nextChar = i < sql.length - 1 ? sql[i + 1] : '';
324
+ // Handle string literals
325
+ if (!inComment && (char === "'" || char === '"')) {
326
+ if (!inString) {
327
+ inString = true;
328
+ stringChar = char;
329
+ }
330
+ else if (char === stringChar) {
331
+ inString = false;
332
+ stringChar = '';
333
+ }
334
+ continue;
335
+ }
336
+ // Handle comments
337
+ if (!inString && char === '-' && nextChar === '-') {
338
+ inComment = true;
339
+ i++; // Skip next char
340
+ continue;
341
+ }
342
+ if (inComment && char === '\n') {
343
+ inComment = false;
344
+ continue;
345
+ }
346
+ // Handle semicolons (query boundaries)
347
+ if (!inString && !inComment && char === ';') {
348
+ boundaries.push({ start: currentStart, end: i });
349
+ currentStart = i + 1;
350
+ }
351
+ }
352
+ // Add final query if no trailing semicolon
353
+ if (currentStart < sql.length) {
354
+ boundaries.push({ start: currentStart, end: sql.length });
355
+ }
356
+ return boundaries;
357
+ }
358
+ static findQueryAtPosition(boundaries, position) {
359
+ return boundaries.find(boundary => position >= boundary.start && position <= boundary.end);
360
+ }
361
+ }
362
+ exports.PositionAwareParser = PositionAwareParser;
363
+ //# 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
+ }