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 @@
1
+ {"version":3,"file":"KeywordCache.js","sourceRoot":"","sources":["../../../../src/utils/KeywordCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import { LineColumn } from './LexemeCursor';
2
+ /**
3
+ * Information about a single query within multi-query text
4
+ */
5
+ export interface QueryInfo {
6
+ /** SQL text of this query */
7
+ sql: string;
8
+ /** Start position in the original text (0-based character offset) */
9
+ start: number;
10
+ /** End position in the original text (0-based character offset) */
11
+ end: number;
12
+ /** Line number where query starts (1-based) */
13
+ startLine: number;
14
+ /** Line number where query ends (1-based) */
15
+ endLine: number;
16
+ /** Query index in the original text (0-based) */
17
+ index: number;
18
+ /** Whether this query is empty or contains only whitespace/comments */
19
+ isEmpty: boolean;
20
+ }
21
+ /**
22
+ * Collection of queries from multi-query text
23
+ */
24
+ export interface QueryCollection {
25
+ /** All queries found in the text */
26
+ queries: QueryInfo[];
27
+ /** Original text that was split */
28
+ originalText: string;
29
+ /**
30
+ * Get the query that contains the specified cursor position
31
+ * @param cursorPosition - Cursor position (character offset or line/column)
32
+ */
33
+ getActive(cursorPosition: number | LineColumn): QueryInfo | undefined;
34
+ /**
35
+ * Get the query at the specified index
36
+ * @param index - Query index (0-based)
37
+ */
38
+ getQuery(index: number): QueryInfo | undefined;
39
+ /**
40
+ * Get all non-empty queries
41
+ */
42
+ getNonEmpty(): QueryInfo[];
43
+ }
44
+ /**
45
+ * Splits SQL text containing multiple queries separated by semicolons
46
+ *
47
+ * Provides sophisticated query boundary detection that properly handles:
48
+ * - String literals containing semicolons
49
+ * - Comments containing semicolons
50
+ * - Nested structures and complex SQL
51
+ * - Empty queries and whitespace handling
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * const multiSQL = `
56
+ * -- First query
57
+ * SELECT 'hello;world' FROM users;
58
+ *
59
+ * // Second query with comment
60
+ * SELECT id FROM orders WHERE status = 'active';
61
+ *
62
+ * -- Empty query
63
+ * ;
64
+ * `;
65
+ *
66
+ * const queries = MultiQuerySplitter.split(multiSQL);
67
+ * console.log(queries.queries.length); // 3 queries
68
+ *
69
+ * // Find query at cursor position
70
+ * const active = queries.getActive(150);
71
+ * console.log(active?.sql); // Query containing position 150
72
+ * ```
73
+ */
74
+ export declare class MultiQuerySplitter {
75
+ /**
76
+ * Split multi-query SQL text into individual queries
77
+ *
78
+ * @param text - SQL text that may contain multiple queries separated by semicolons
79
+ * @returns Collection of individual queries with position information
80
+ */
81
+ static split(text: string): QueryCollection;
82
+ /**
83
+ * Get query boundaries from SQL text with proper semicolon handling
84
+ *
85
+ * @param text - SQL text to analyze
86
+ * @returns Array of boundary positions
87
+ */
88
+ /**
89
+ * Split text by semicolons while respecting quotes and comments
90
+ */
91
+ private static splitRespectingQuotesAndComments;
92
+ /**
93
+ * Check if character at position is a valid semicolon (not in quotes/comments)
94
+ */
95
+ private static isValidSemicolon;
96
+ /**
97
+ * Merge comment-only segments with previous executable segments
98
+ */
99
+ private static mergeTrailingCommentSegments;
100
+ /**
101
+ * Clean SQL comments and extract SQL statements
102
+ *
103
+ * @param sql - SQL query text
104
+ * @returns Cleaned SQL text or null if no SQL remains
105
+ */
106
+ private static cleanSqlComments;
107
+ private static isEmptyQuery;
108
+ }
109
+ /**
110
+ * Utility functions for working with query collections
111
+ */
112
+ export declare class MultiQueryUtils {
113
+ /**
114
+ * Get context information for IntelliSense at a cursor position
115
+ *
116
+ * @param text - Multi-query SQL text
117
+ * @param cursorPosition - Cursor position
118
+ * @returns Active query and position within that query
119
+ */
120
+ static getContextAt(text: string, cursorPosition: number | LineColumn): {
121
+ query: QueryInfo;
122
+ relativePosition: number;
123
+ } | undefined;
124
+ /**
125
+ * Extract all non-empty queries from multi-query text
126
+ *
127
+ * @param text - Multi-query SQL text
128
+ * @returns Array of query SQL strings
129
+ */
130
+ static extractQueries(text: string): string[];
131
+ }
@@ -0,0 +1,287 @@
1
+ import { TextPositionUtils } from './TextPositionUtils';
2
+ /**
3
+ * Splits SQL text containing multiple queries separated by semicolons
4
+ *
5
+ * Provides sophisticated query boundary detection that properly handles:
6
+ * - String literals containing semicolons
7
+ * - Comments containing semicolons
8
+ * - Nested structures and complex SQL
9
+ * - Empty queries and whitespace handling
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const multiSQL = `
14
+ * -- First query
15
+ * SELECT 'hello;world' FROM users;
16
+ *
17
+ * // Second query with comment
18
+ * SELECT id FROM orders WHERE status = 'active';
19
+ *
20
+ * -- Empty query
21
+ * ;
22
+ * `;
23
+ *
24
+ * const queries = MultiQuerySplitter.split(multiSQL);
25
+ * console.log(queries.queries.length); // 3 queries
26
+ *
27
+ * // Find query at cursor position
28
+ * const active = queries.getActive(150);
29
+ * console.log(active?.sql); // Query containing position 150
30
+ * ```
31
+ */
32
+ export class MultiQuerySplitter {
33
+ /**
34
+ * Split multi-query SQL text into individual queries
35
+ *
36
+ * @param text - SQL text that may contain multiple queries separated by semicolons
37
+ * @returns Collection of individual queries with position information
38
+ */
39
+ static split(text) {
40
+ const queries = [];
41
+ // Handle completely empty or whitespace-only text
42
+ if (!text || text.trim() === '') {
43
+ return {
44
+ queries: [],
45
+ originalText: text,
46
+ getActive: () => undefined,
47
+ getQuery: () => undefined,
48
+ getNonEmpty: () => []
49
+ };
50
+ }
51
+ const rawBoundaries = this.splitRespectingQuotesAndComments(text);
52
+ const boundaries = this.mergeTrailingCommentSegments(rawBoundaries, text);
53
+ let queryIndex = 0;
54
+ for (const boundary of boundaries) {
55
+ const rawSql = boundary.text.trim();
56
+ const isEmpty = this.isEmptyQuery(rawSql);
57
+ // Use raw SQL as-is - boundaries are already correctly split by valid semicolons
58
+ const sql = rawSql;
59
+ const startLineCol = TextPositionUtils.charOffsetToLineColumn(text, boundary.start);
60
+ const endLineCol = TextPositionUtils.charOffsetToLineColumn(text, boundary.end);
61
+ queries.push({
62
+ sql,
63
+ start: boundary.start,
64
+ end: boundary.end,
65
+ startLine: (startLineCol === null || startLineCol === void 0 ? void 0 : startLineCol.line) || 1,
66
+ endLine: (endLineCol === null || endLineCol === void 0 ? void 0 : endLineCol.line) || 1,
67
+ index: queryIndex++,
68
+ isEmpty
69
+ });
70
+ }
71
+ return {
72
+ queries,
73
+ originalText: text,
74
+ getActive: (cursorPosition) => {
75
+ const charPos = typeof cursorPosition === 'number'
76
+ ? cursorPosition
77
+ : TextPositionUtils.lineColumnToCharOffset(text, cursorPosition);
78
+ if (charPos === -1)
79
+ return undefined;
80
+ return queries.find(query => charPos >= query.start && charPos <= query.end);
81
+ },
82
+ getQuery: (index) => {
83
+ return queries[index];
84
+ },
85
+ getNonEmpty: () => {
86
+ return queries.filter(q => !q.isEmpty);
87
+ }
88
+ };
89
+ }
90
+ /**
91
+ * Get query boundaries from SQL text with proper semicolon handling
92
+ *
93
+ * @param text - SQL text to analyze
94
+ * @returns Array of boundary positions
95
+ */
96
+ /**
97
+ * Split text by semicolons while respecting quotes and comments
98
+ */
99
+ static splitRespectingQuotesAndComments(text) {
100
+ const segments = [];
101
+ let currentStart = 0;
102
+ let i = 0;
103
+ while (i <= text.length) {
104
+ // Check if we're at a valid semicolon or end of text
105
+ const isValidBreakpoint = (i === text.length) || (i < text.length && this.isValidSemicolon(text, i));
106
+ if (isValidBreakpoint) {
107
+ const segmentText = text.substring(currentStart, i);
108
+ if (segmentText.length > 0 || i < text.length) {
109
+ segments.push({
110
+ text: segmentText,
111
+ start: currentStart,
112
+ end: i
113
+ });
114
+ }
115
+ currentStart = i + 1;
116
+ }
117
+ i++;
118
+ }
119
+ return segments;
120
+ }
121
+ /**
122
+ * Check if character at position is a valid semicolon (not in quotes/comments)
123
+ */
124
+ static isValidSemicolon(text, pos) {
125
+ if (text[pos] !== ';')
126
+ return false;
127
+ // Check if this semicolon is inside quotes or comments by scanning from start
128
+ let inSingleQuote = false;
129
+ let inDoubleQuote = false;
130
+ let inLineComment = false;
131
+ let inBlockComment = false;
132
+ for (let i = 0; i < pos; i++) {
133
+ const char = text[i];
134
+ const nextChar = i + 1 < text.length ? text[i + 1] : '';
135
+ // Handle line comments
136
+ if (!inSingleQuote && !inDoubleQuote && !inBlockComment &&
137
+ char === '-' && nextChar === '-') {
138
+ inLineComment = true;
139
+ i++; // Skip next character
140
+ continue;
141
+ }
142
+ if (inLineComment && char === '\n') {
143
+ inLineComment = false;
144
+ continue;
145
+ }
146
+ // Handle block comments
147
+ if (!inSingleQuote && !inDoubleQuote && !inLineComment &&
148
+ char === '/' && nextChar === '*') {
149
+ inBlockComment = true;
150
+ i++; // Skip next character
151
+ continue;
152
+ }
153
+ if (inBlockComment && char === '*' && nextChar === '/') {
154
+ inBlockComment = false;
155
+ i++; // Skip next character
156
+ continue;
157
+ }
158
+ // Skip if in any comment
159
+ if (inLineComment || inBlockComment) {
160
+ continue;
161
+ }
162
+ // Handle quotes
163
+ if (char === "'" && !inDoubleQuote) {
164
+ if (inSingleQuote && nextChar === "'") {
165
+ i++; // Skip escaped quote
166
+ }
167
+ else {
168
+ inSingleQuote = !inSingleQuote;
169
+ }
170
+ continue;
171
+ }
172
+ if (char === '"' && !inSingleQuote) {
173
+ if (inDoubleQuote && nextChar === '"') {
174
+ i++; // Skip escaped quote
175
+ }
176
+ else {
177
+ inDoubleQuote = !inDoubleQuote;
178
+ }
179
+ continue;
180
+ }
181
+ }
182
+ // Return false if we're inside quotes or comments at this position
183
+ return !inSingleQuote && !inDoubleQuote && !inLineComment && !inBlockComment;
184
+ }
185
+ /**
186
+ * Merge comment-only segments with previous executable segments
187
+ */
188
+ static mergeTrailingCommentSegments(segments, fullText) {
189
+ const merged = [];
190
+ for (let i = 0; i < segments.length; i++) {
191
+ const segment = segments[i];
192
+ const segmentText = segment.text.trim();
193
+ // Check if this segment contains only comments/whitespace (no executable SQL)
194
+ const isCommentOnly = this.isEmptyQuery(segmentText);
195
+ if (isCommentOnly && merged.length > 0) {
196
+ // Only merge if this appears to be a trailing line comment (starts with --)
197
+ // and the previous segment contains executable SQL
198
+ const lastSegmentText = merged[merged.length - 1].text.trim();
199
+ const isTrailingLineComment = segmentText.startsWith('--');
200
+ const previousHasSQL = !this.isEmptyQuery(lastSegmentText);
201
+ if (isTrailingLineComment && previousHasSQL) {
202
+ // Merge trailing line comment with previous SQL segment
203
+ const lastSegment = merged[merged.length - 1];
204
+ merged[merged.length - 1] = {
205
+ text: fullText.substring(lastSegment.start, segment.end),
206
+ start: lastSegment.start,
207
+ end: segment.end
208
+ };
209
+ }
210
+ else {
211
+ // Keep as separate segment (empty query or standalone comment)
212
+ merged.push(segment);
213
+ }
214
+ }
215
+ else {
216
+ // Add as new segment
217
+ merged.push(segment);
218
+ }
219
+ }
220
+ return merged;
221
+ }
222
+ /**
223
+ * Clean SQL comments and extract SQL statements
224
+ *
225
+ * @param sql - SQL query text
226
+ * @returns Cleaned SQL text or null if no SQL remains
227
+ */
228
+ static cleanSqlComments(sql) {
229
+ if (!sql)
230
+ return null;
231
+ // Remove comments and extract SQL
232
+ let cleaned = sql;
233
+ // Remove line comments - standard SQL behavior: -- comments out to end of line
234
+ cleaned = cleaned.split('\n').map(line => {
235
+ const commentStart = line.indexOf('--');
236
+ if (commentStart >= 0) {
237
+ return line.substring(0, commentStart);
238
+ }
239
+ return line;
240
+ }).join('\n');
241
+ // Remove block comments
242
+ cleaned = cleaned.replace(/\/\*[\s\S]*?\*\//g, '');
243
+ const result = cleaned.trim();
244
+ return result.length > 0 ? result : null;
245
+ }
246
+ static isEmptyQuery(sql) {
247
+ if (!sql)
248
+ return true;
249
+ return this.cleanSqlComments(sql) === null;
250
+ }
251
+ }
252
+ /**
253
+ * Utility functions for working with query collections
254
+ */
255
+ export class MultiQueryUtils {
256
+ /**
257
+ * Get context information for IntelliSense at a cursor position
258
+ *
259
+ * @param text - Multi-query SQL text
260
+ * @param cursorPosition - Cursor position
261
+ * @returns Active query and position within that query
262
+ */
263
+ static getContextAt(text, cursorPosition) {
264
+ const queries = MultiQuerySplitter.split(text);
265
+ const activeQuery = queries.getActive(cursorPosition);
266
+ if (!activeQuery)
267
+ return undefined;
268
+ const charPos = typeof cursorPosition === 'number'
269
+ ? cursorPosition
270
+ : TextPositionUtils.lineColumnToCharOffset(text, cursorPosition);
271
+ if (charPos === -1)
272
+ return undefined;
273
+ const relativePosition = charPos - activeQuery.start;
274
+ return { query: activeQuery, relativePosition };
275
+ }
276
+ /**
277
+ * Extract all non-empty queries from multi-query text
278
+ *
279
+ * @param text - Multi-query SQL text
280
+ * @returns Array of query SQL strings
281
+ */
282
+ static extractQueries(text) {
283
+ const queries = MultiQuerySplitter.split(text);
284
+ return queries.getNonEmpty().map(q => q.sql);
285
+ }
286
+ }
287
+ //# sourceMappingURL=MultiQuerySplitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiQuerySplitter.js","sourceRoot":"","sources":["../../../../src/utils/MultiQuerySplitter.ts"],"names":[],"mappings":"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"}
@@ -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
+ }