rawsql-ts 0.11.29-beta → 0.11.31-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 (39) hide show
  1. package/dist/esm/index.js +1 -0
  2. package/dist/esm/index.js.map +1 -1
  3. package/dist/esm/index.min.js +18 -16
  4. package/dist/esm/index.min.js.map +4 -4
  5. package/dist/esm/src/index.d.ts +2 -0
  6. package/dist/esm/src/index.js +1 -0
  7. package/dist/esm/src/index.js.map +1 -1
  8. package/dist/esm/src/parsers/SelectQueryParser.d.ts +51 -0
  9. package/dist/esm/src/parsers/SelectQueryParser.js +55 -0
  10. package/dist/esm/src/parsers/SelectQueryParser.js.map +1 -1
  11. package/dist/esm/src/transformers/SelectableColumnCollector.d.ts +5 -0
  12. package/dist/esm/src/transformers/SelectableColumnCollector.js +18 -2
  13. package/dist/esm/src/transformers/SelectableColumnCollector.js.map +1 -1
  14. package/dist/esm/src/utils/CTERegionDetector.d.ts +254 -0
  15. package/dist/esm/src/utils/CTERegionDetector.js +457 -0
  16. package/dist/esm/src/utils/CTERegionDetector.js.map +1 -0
  17. package/dist/esm/src/utils/LexemeCursor.d.ts +41 -10
  18. package/dist/esm/src/utils/LexemeCursor.js +46 -16
  19. package/dist/esm/src/utils/LexemeCursor.js.map +1 -1
  20. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  21. package/dist/index.min.js +18 -16
  22. package/dist/index.min.js.map +4 -4
  23. package/dist/src/index.d.ts +2 -0
  24. package/dist/src/index.js +1 -0
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/parsers/SelectQueryParser.d.ts +51 -0
  27. package/dist/src/parsers/SelectQueryParser.js +55 -0
  28. package/dist/src/parsers/SelectQueryParser.js.map +1 -1
  29. package/dist/src/transformers/SelectableColumnCollector.d.ts +5 -0
  30. package/dist/src/transformers/SelectableColumnCollector.js +18 -2
  31. package/dist/src/transformers/SelectableColumnCollector.js.map +1 -1
  32. package/dist/src/utils/CTERegionDetector.d.ts +254 -0
  33. package/dist/src/utils/CTERegionDetector.js +464 -0
  34. package/dist/src/utils/CTERegionDetector.js.map +1 -0
  35. package/dist/src/utils/LexemeCursor.d.ts +41 -10
  36. package/dist/src/utils/LexemeCursor.js +46 -16
  37. package/dist/src/utils/LexemeCursor.js.map +1 -1
  38. package/dist/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,457 @@
1
+ import { TokenType } from '../models/Lexeme';
2
+ import { LexemeCursor } from './LexemeCursor';
3
+ /**
4
+ * Utility class for detecting CTE (Common Table Expression) regions and extracting executable SQL.
5
+ *
6
+ * Designed for SQL editor features where users want to execute specific CTE parts based on cursor position.
7
+ * This enables editors to provide "run current section" functionality that intelligently executes
8
+ * either the CTE the cursor is in, or the main query.
9
+ *
10
+ * @example Basic usage - Analyze cursor position
11
+ * ```typescript
12
+ * const sql = `
13
+ * WITH users_cte AS (
14
+ * SELECT id, name FROM users WHERE active = true
15
+ * )
16
+ * SELECT * FROM users_cte ORDER BY name
17
+ * `;
18
+ *
19
+ * const cursorPosition = 50; // Inside the CTE
20
+ * const analysis = CTERegionDetector.analyzeCursorPosition(sql, cursorPosition);
21
+ *
22
+ * if (analysis.isInCTE) {
23
+ * console.log(`Execute CTE: ${analysis.cteRegion.name}`);
24
+ * executeSQL(analysis.executableSQL); // Runs just the CTE SELECT
25
+ * }
26
+ * ```
27
+ *
28
+ * @example Get all executable sections
29
+ * ```typescript
30
+ * const positions = CTERegionDetector.getCTEPositions(sql);
31
+ * // Returns: [
32
+ * // { name: 'users_cte', startPosition: 17, type: 'CTE' },
33
+ * // { name: 'MAIN_QUERY', startPosition: 120, type: 'MAIN_QUERY' }
34
+ * // ]
35
+ * ```
36
+ */
37
+ export class CTERegionDetector {
38
+ /**
39
+ * Analyze cursor position and return information about the current context.
40
+ *
41
+ * This is the main method for SQL editor integration. It determines whether the cursor
42
+ * is inside a CTE or the main query, and provides the appropriate executable SQL.
43
+ *
44
+ * @param sql - The complete SQL string to analyze
45
+ * @param cursorPosition - The cursor position (0-based character offset)
46
+ * @returns Analysis result containing context information and executable SQL
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const sql = `WITH users AS (SELECT * FROM table) SELECT * FROM users`;
51
+ * const analysis = CTERegionDetector.analyzeCursorPosition(sql, 25);
52
+ *
53
+ * if (analysis.isInCTE) {
54
+ * console.log(`Cursor is in CTE: ${analysis.cteRegion.name}`);
55
+ * executeSQL(analysis.executableSQL); // Execute just the CTE
56
+ * } else {
57
+ * console.log('Cursor is in main query');
58
+ * executeSQL(analysis.executableSQL); // Execute the full query
59
+ * }
60
+ * ```
61
+ */
62
+ static analyzeCursorPosition(sql, cursorPosition) {
63
+ const cteRegions = this.extractCTERegions(sql);
64
+ const extendedRegions = this.calculateExtendedCTEBoundaries(sql, cteRegions);
65
+ // Find which CTE region contains the cursor using extended boundaries
66
+ const currentCTE = extendedRegions.find(region => cursorPosition >= region.startPosition && cursorPosition < region.extendedEndPosition);
67
+ if (currentCTE) {
68
+ return {
69
+ isInCTE: true,
70
+ cteRegion: {
71
+ name: currentCTE.name,
72
+ startPosition: currentCTE.startPosition,
73
+ endPosition: currentCTE.endPosition,
74
+ sqlContent: currentCTE.sqlContent
75
+ },
76
+ executableSQL: currentCTE.sqlContent
77
+ };
78
+ }
79
+ else {
80
+ // Cursor is in main query - return full SQL or main SELECT part
81
+ const mainSQL = this.extractMainQuery(sql, cteRegions);
82
+ return {
83
+ isInCTE: false,
84
+ cteRegion: null,
85
+ executableSQL: mainSQL
86
+ };
87
+ }
88
+ }
89
+ /**
90
+ * Get the CTE name at the specified cursor position (simplified interface).
91
+ *
92
+ * This method provides a simple interface for retrieving just the CTE name
93
+ * without additional context information.
94
+ *
95
+ * @param sql - The SQL string to analyze
96
+ * @param cursorPosition - The cursor position (0-based character offset)
97
+ * @returns The CTE name if cursor is in a CTE, null otherwise
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * const sql = `WITH users AS (SELECT * FROM table) SELECT * FROM users`;
102
+ * const cteName = CTERegionDetector.getCursorCte(sql, 25);
103
+ * console.log(cteName); // "users"
104
+ * ```
105
+ */
106
+ static getCursorCte(sql, cursorPosition) {
107
+ var _a;
108
+ try {
109
+ const analysis = this.analyzeCursorPosition(sql, cursorPosition);
110
+ return analysis.isInCTE ? ((_a = analysis.cteRegion) === null || _a === void 0 ? void 0 : _a.name) || null : null;
111
+ }
112
+ catch (error) {
113
+ return null;
114
+ }
115
+ }
116
+ /**
117
+ * Get the CTE name at the specified 2D coordinates (line, column).
118
+ *
119
+ * This method provides a convenient interface for editor integrations
120
+ * that work with line/column coordinates instead of character positions.
121
+ *
122
+ * @param sql - The SQL string to analyze
123
+ * @param line - The line number (1-based)
124
+ * @param column - The column number (1-based)
125
+ * @returns The CTE name if cursor is in a CTE, null otherwise
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * const sql = `WITH users AS (\n SELECT * FROM table\n) SELECT * FROM users`;
130
+ * const cteName = CTERegionDetector.getCursorCteAt(sql, 2, 5);
131
+ * console.log(cteName); // "users"
132
+ * ```
133
+ */
134
+ static getCursorCteAt(sql, line, column) {
135
+ try {
136
+ const position = this.lineColumnToPosition(sql, line, column);
137
+ if (position === -1) {
138
+ return null;
139
+ }
140
+ return this.getCursorCte(sql, position);
141
+ }
142
+ catch (error) {
143
+ return null;
144
+ }
145
+ }
146
+ /**
147
+ * Convert line/column coordinates to character position.
148
+ *
149
+ * @param text - The text to analyze
150
+ * @param line - The line number (1-based)
151
+ * @param column - The column number (1-based)
152
+ * @returns The character position (0-based), or -1 if invalid coordinates
153
+ */
154
+ static lineColumnToPosition(text, line, column) {
155
+ if (line < 1 || column < 1) {
156
+ return -1;
157
+ }
158
+ const lines = text.split('\n');
159
+ if (line > lines.length) {
160
+ return -1;
161
+ }
162
+ const targetLine = lines[line - 1];
163
+ if (column > targetLine.length + 1) { // +1 to allow position at end of line
164
+ return -1;
165
+ }
166
+ // Calculate position by summing lengths of previous lines plus newlines
167
+ let position = 0;
168
+ for (let i = 0; i < line - 1; i++) {
169
+ position += lines[i].length + 1; // +1 for the newline character
170
+ }
171
+ position += column - 1; // column is 1-based, position is 0-based
172
+ return position;
173
+ }
174
+ /**
175
+ * Convert character position to line/column coordinates.
176
+ *
177
+ * @param text - The text to analyze
178
+ * @param position - The character position (0-based)
179
+ * @returns Object with line and column (1-based), or null if invalid position
180
+ */
181
+ static positionToLineColumn(text, position) {
182
+ if (position < 0 || position > text.length) {
183
+ return null;
184
+ }
185
+ const beforePosition = text.substring(0, position);
186
+ const lines = beforePosition.split('\n');
187
+ return {
188
+ line: lines.length,
189
+ column: lines[lines.length - 1].length + 1
190
+ };
191
+ }
192
+ /**
193
+ * Extract all CTE regions from SQL text with their boundaries and executable content.
194
+ *
195
+ * Parses the SQL to identify all Common Table Expressions and their locations,
196
+ * providing the information needed for syntax highlighting, code folding, and selective execution.
197
+ *
198
+ * @param sql - The SQL string to analyze
199
+ * @returns Array of CTE regions with their boundaries and content
200
+ *
201
+ * @example
202
+ * ```typescript
203
+ * const sql = `
204
+ * WITH
205
+ * users AS (SELECT * FROM people),
206
+ * orders AS (SELECT * FROM purchases)
207
+ * SELECT * FROM users JOIN orders
208
+ * `;
209
+ *
210
+ * const regions = CTERegionDetector.extractCTERegions(sql);
211
+ * // Returns: [
212
+ * // { name: 'users', startPosition: 23, endPosition: 45, sqlContent: 'SELECT * FROM people' },
213
+ * // { name: 'orders', startPosition: 55, endPosition: 80, sqlContent: 'SELECT * FROM purchases' }
214
+ * // ]
215
+ * ```
216
+ */
217
+ static extractCTERegions(sql) {
218
+ const lexemes = LexemeCursor.getAllLexemesWithPosition(sql);
219
+ const cteRegions = [];
220
+ let i = 0;
221
+ let inWithClause = false;
222
+ while (i < lexemes.length) {
223
+ const lexeme = lexemes[i];
224
+ // Detect WITH clause start
225
+ if (lexeme.value.toLowerCase() === 'with' && !inWithClause) {
226
+ inWithClause = true;
227
+ i++;
228
+ continue;
229
+ }
230
+ // Skip RECURSIVE keyword if present
231
+ if (inWithClause && lexeme.value.toLowerCase() === 'recursive') {
232
+ i++;
233
+ continue;
234
+ }
235
+ // Detect CTE definition (identifier followed by AS)
236
+ if (inWithClause &&
237
+ lexeme.type === TokenType.Identifier &&
238
+ i + 1 < lexemes.length &&
239
+ lexemes[i + 1].value.toLowerCase() === 'as') {
240
+ const cteName = lexeme.value;
241
+ const cteStartPos = lexeme.position.startPosition;
242
+ // Find the opening parenthesis after AS
243
+ let parenIndex = i + 2;
244
+ while (parenIndex < lexemes.length && lexemes[parenIndex].value !== '(') {
245
+ parenIndex++;
246
+ }
247
+ if (parenIndex < lexemes.length) {
248
+ // Find matching closing parenthesis
249
+ const cteEndInfo = this.findMatchingParen(lexemes, parenIndex);
250
+ if (cteEndInfo) {
251
+ const cteEndPos = cteEndInfo.endPosition;
252
+ const sqlContent = this.extractCTESQL(sql, lexemes, parenIndex, cteEndInfo.index);
253
+ cteRegions.push({
254
+ name: cteName,
255
+ startPosition: cteStartPos,
256
+ endPosition: cteEndPos,
257
+ sqlContent: sqlContent
258
+ });
259
+ i = cteEndInfo.index + 1;
260
+ continue;
261
+ }
262
+ }
263
+ }
264
+ // Check if we've reached the main SELECT (end of WITH clause)
265
+ if (inWithClause && lexeme.value.toLowerCase() === 'select') {
266
+ // Verify this is not a SELECT inside a CTE by checking context
267
+ if (this.isMainQuerySelect(lexemes, i)) {
268
+ break;
269
+ }
270
+ }
271
+ i++;
272
+ }
273
+ return cteRegions;
274
+ }
275
+ /**
276
+ * Find matching closing parenthesis for CTE definition
277
+ */
278
+ static findMatchingParen(lexemes, openParenIndex) {
279
+ let depth = 1;
280
+ let i = openParenIndex + 1;
281
+ while (i < lexemes.length && depth > 0) {
282
+ if (lexemes[i].value === '(') {
283
+ depth++;
284
+ }
285
+ else if (lexemes[i].value === ')') {
286
+ depth--;
287
+ }
288
+ if (depth === 0) {
289
+ return {
290
+ index: i,
291
+ endPosition: lexemes[i].position.endPosition
292
+ };
293
+ }
294
+ i++;
295
+ }
296
+ return null;
297
+ }
298
+ /**
299
+ * Extract the SQL content of a CTE (the SELECT statement inside parentheses)
300
+ */
301
+ static extractCTESQL(sql, lexemes, openParenIndex, closeParenIndex) {
302
+ const startPos = lexemes[openParenIndex + 1].position.startPosition;
303
+ const endPos = lexemes[closeParenIndex - 1].position.endPosition;
304
+ return sql.substring(startPos, endPos).trim();
305
+ }
306
+ /**
307
+ * Check if a SELECT lexeme is the main query SELECT (not inside a CTE)
308
+ */
309
+ static isMainQuerySelect(lexemes, selectIndex) {
310
+ // Look backwards to see if we're still in a parenthesized context
311
+ let depth = 0;
312
+ for (let i = selectIndex - 1; i >= 0; i--) {
313
+ if (lexemes[i].value === ')') {
314
+ depth++;
315
+ }
316
+ else if (lexemes[i].value === '(') {
317
+ depth--;
318
+ }
319
+ }
320
+ return depth === 0; // We're at top level if depth is 0
321
+ }
322
+ /**
323
+ * Calculate extended CTE boundaries for better cursor position detection.
324
+ * Extended boundaries include the space between CTEs and before the main query.
325
+ */
326
+ static calculateExtendedCTEBoundaries(sql, cteRegions) {
327
+ if (cteRegions.length === 0) {
328
+ return [];
329
+ }
330
+ return cteRegions.map((region, index) => {
331
+ let extendedEndPosition;
332
+ if (index < cteRegions.length - 1) {
333
+ // Not the last CTE - extend to the start of the next CTE
334
+ extendedEndPosition = cteRegions[index + 1].startPosition;
335
+ }
336
+ else {
337
+ // Last CTE - extend to the start of the main query
338
+ const mainQueryStart = this.findMainQueryStart(sql, region.endPosition);
339
+ extendedEndPosition = mainQueryStart;
340
+ }
341
+ return Object.assign(Object.assign({}, region), { extendedEndPosition });
342
+ });
343
+ }
344
+ /**
345
+ * Find the start position of the main query after the last CTE
346
+ */
347
+ static findMainQueryStart(sql, afterPosition) {
348
+ // Look for the main SELECT keyword after the CTE definitions
349
+ let pos = afterPosition;
350
+ while (pos < sql.length) {
351
+ const remaining = sql.substring(pos).toLowerCase().trim();
352
+ if (remaining.startsWith('select')) {
353
+ // Find the actual position of SELECT in the original text
354
+ const selectIndex = sql.toLowerCase().indexOf('select', pos);
355
+ return selectIndex !== -1 ? selectIndex : pos;
356
+ }
357
+ pos++;
358
+ }
359
+ return sql.length; // If no main query found, extend to end of string
360
+ }
361
+ /**
362
+ * Extract the main query part (non-CTE SQL)
363
+ */
364
+ static extractMainQuery(sql, cteRegions) {
365
+ if (cteRegions.length === 0) {
366
+ return sql.trim();
367
+ }
368
+ // Find the end of the last CTE
369
+ const lastCTE = cteRegions[cteRegions.length - 1];
370
+ const mainQueryStart = lastCTE.endPosition;
371
+ // Find the main SELECT
372
+ let selectPos = mainQueryStart;
373
+ while (selectPos < sql.length) {
374
+ const remaining = sql.substring(selectPos).toLowerCase().trim();
375
+ if (remaining.startsWith('select')) {
376
+ break;
377
+ }
378
+ selectPos++;
379
+ }
380
+ return sql.substring(selectPos).trim();
381
+ }
382
+ /**
383
+ * Get a list of all executable sections (CTEs and main query) with their start positions.
384
+ *
385
+ * This method is particularly useful for building editor UI features such as:
386
+ * - Dropdown menus for section selection
387
+ * - Sidebar navigation for large queries
388
+ * - Quick jump functionality
389
+ * - "Run section" buttons
390
+ *
391
+ * @param sql - The SQL string to analyze
392
+ * @returns Array of executable sections with their names, positions, and types
393
+ *
394
+ * @example
395
+ * ```typescript
396
+ * const sql = `
397
+ * WITH monthly_sales AS (SELECT ...),
398
+ * yearly_summary AS (SELECT ...)
399
+ * SELECT * FROM yearly_summary
400
+ * `;
401
+ *
402
+ * const positions = CTERegionDetector.getCTEPositions(sql);
403
+ * // Returns: [
404
+ * // { name: 'monthly_sales', startPosition: 17, type: 'CTE' },
405
+ * // { name: 'yearly_summary', startPosition: 55, type: 'CTE' },
406
+ * // { name: 'MAIN_QUERY', startPosition: 120, type: 'MAIN_QUERY' }
407
+ * // ]
408
+ *
409
+ * // Use for editor UI
410
+ * positions.forEach(section => {
411
+ * addMenuItem(`${section.type}: ${section.name}`, () => {
412
+ * jumpToPosition(section.startPosition);
413
+ * });
414
+ * });
415
+ * ```
416
+ */
417
+ static getCTEPositions(sql) {
418
+ const cteRegions = this.extractCTERegions(sql);
419
+ const results = [];
420
+ // Add CTE regions
421
+ cteRegions.forEach(region => {
422
+ results.push({
423
+ name: region.name,
424
+ startPosition: region.startPosition,
425
+ type: 'CTE'
426
+ });
427
+ });
428
+ // Add main query position
429
+ if (cteRegions.length > 0) {
430
+ const lastCTE = cteRegions[cteRegions.length - 1];
431
+ let mainQueryPos = lastCTE.endPosition;
432
+ // Find the SELECT keyword
433
+ while (mainQueryPos < sql.length) {
434
+ const remaining = sql.substring(mainQueryPos).toLowerCase().trim();
435
+ if (remaining.startsWith('select')) {
436
+ results.push({
437
+ name: 'MAIN_QUERY',
438
+ startPosition: mainQueryPos,
439
+ type: 'MAIN_QUERY'
440
+ });
441
+ break;
442
+ }
443
+ mainQueryPos++;
444
+ }
445
+ }
446
+ else {
447
+ // No CTEs, entire SQL is main query
448
+ results.push({
449
+ name: 'MAIN_QUERY',
450
+ startPosition: 0,
451
+ type: 'MAIN_QUERY'
452
+ });
453
+ }
454
+ return results;
455
+ }
456
+ }
457
+ //# sourceMappingURL=CTERegionDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CTERegionDetector.js","sourceRoot":"","sources":["../../../../src/utils/CTERegionDetector.ts"],"names":[],"mappings":"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"}
@@ -1,27 +1,58 @@
1
1
  import { Lexeme } from '../models/Lexeme';
2
2
  /**
3
- * Utility class for cursor-to-lexeme mapping in SQL text
4
- * Provides functionality to find lexemes at specific cursor positions for IDE integration
3
+ * Utility class for cursor-to-lexeme mapping in SQL text.
4
+ *
5
+ * Provides functionality to find lexemes at specific cursor positions for IDE integration.
6
+ * Handles SQL parsing with proper comment and whitespace handling for editor features.
7
+ *
8
+ * @example Basic usage
9
+ * ```typescript
10
+ * const sql = "SELECT id FROM users WHERE active = true";
11
+ * const lexeme = LexemeCursor.findLexemeAtPosition(sql, 7); // position at 'id'
12
+ * console.log(lexeme?.value); // 'id'
13
+ * ```
5
14
  */
6
15
  export declare class LexemeCursor {
7
16
  private static readonly SQL_COMMANDS;
8
17
  /**
9
- * Find the lexeme at the specified cursor position
10
- * @param sql The SQL string
11
- * @param cursorPosition The cursor position (0-based)
18
+ * Find the lexeme at the specified cursor position.
19
+ *
20
+ * Performs intelligent SQL parsing with proper comment and whitespace handling.
21
+ * Returns null if cursor is in whitespace or comments.
22
+ *
23
+ * @param sql - The SQL string to analyze
24
+ * @param cursorPosition - The cursor position (0-based character offset)
12
25
  * @returns The lexeme at the position, or null if not found
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const sql = "SELECT user_id FROM orders";
30
+ * const lexeme = LexemeCursor.findLexemeAtPosition(sql, 7);
31
+ * console.log(lexeme?.value); // 'user_id'
32
+ * ```
13
33
  */
14
34
  static findLexemeAtPosition(sql: string, cursorPosition: number): Lexeme | null;
15
35
  /**
16
- * Get all lexemes with position information
17
- * @param sql The SQL string
18
- * @returns Array of lexemes with position information
36
+ * Get all lexemes with position information from SQL text.
37
+ *
38
+ * Tokenizes the entire SQL string with precise position information.
39
+ * Useful for syntax highlighting, code analysis, and editor features.
40
+ *
41
+ * @param sql - The SQL string to tokenize
42
+ * @returns Array of lexemes with position information (excludes comments/whitespace)
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * const sql = "SELECT id FROM users";
47
+ * const lexemes = LexemeCursor.getAllLexemesWithPosition(sql);
48
+ * lexemes.forEach(l => console.log(`${l.value} at ${l.position.startPosition}`));
49
+ * ```
19
50
  */
20
51
  static getAllLexemesWithPosition(sql: string): Lexeme[];
21
52
  /**
22
- * Skip whitespace characters
53
+ * Skip whitespace and comments, returning new position
23
54
  */
24
- private static skipWhitespace;
55
+ private static skipWhitespaceAndComments;
25
56
  /**
26
57
  * Parse the next token starting at the given position
27
58
  */
@@ -1,14 +1,35 @@
1
1
  import { TokenType } from '../models/Lexeme';
2
+ import { StringUtils } from './stringUtils';
2
3
  /**
3
- * Utility class for cursor-to-lexeme mapping in SQL text
4
- * Provides functionality to find lexemes at specific cursor positions for IDE integration
4
+ * Utility class for cursor-to-lexeme mapping in SQL text.
5
+ *
6
+ * Provides functionality to find lexemes at specific cursor positions for IDE integration.
7
+ * Handles SQL parsing with proper comment and whitespace handling for editor features.
8
+ *
9
+ * @example Basic usage
10
+ * ```typescript
11
+ * const sql = "SELECT id FROM users WHERE active = true";
12
+ * const lexeme = LexemeCursor.findLexemeAtPosition(sql, 7); // position at 'id'
13
+ * console.log(lexeme?.value); // 'id'
14
+ * ```
5
15
  */
6
16
  export class LexemeCursor {
7
17
  /**
8
- * Find the lexeme at the specified cursor position
9
- * @param sql The SQL string
10
- * @param cursorPosition The cursor position (0-based)
18
+ * Find the lexeme at the specified cursor position.
19
+ *
20
+ * Performs intelligent SQL parsing with proper comment and whitespace handling.
21
+ * Returns null if cursor is in whitespace or comments.
22
+ *
23
+ * @param sql - The SQL string to analyze
24
+ * @param cursorPosition - The cursor position (0-based character offset)
11
25
  * @returns The lexeme at the position, or null if not found
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const sql = "SELECT user_id FROM orders";
30
+ * const lexeme = LexemeCursor.findLexemeAtPosition(sql, 7);
31
+ * console.log(lexeme?.value); // 'user_id'
32
+ * ```
12
33
  */
13
34
  static findLexemeAtPosition(sql, cursorPosition) {
14
35
  if (cursorPosition < 0 || cursorPosition >= sql.length) {
@@ -25,9 +46,20 @@ export class LexemeCursor {
25
46
  return null;
26
47
  }
27
48
  /**
28
- * Get all lexemes with position information
29
- * @param sql The SQL string
30
- * @returns Array of lexemes with position information
49
+ * Get all lexemes with position information from SQL text.
50
+ *
51
+ * Tokenizes the entire SQL string with precise position information.
52
+ * Useful for syntax highlighting, code analysis, and editor features.
53
+ *
54
+ * @param sql - The SQL string to tokenize
55
+ * @returns Array of lexemes with position information (excludes comments/whitespace)
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const sql = "SELECT id FROM users";
60
+ * const lexemes = LexemeCursor.getAllLexemesWithPosition(sql);
61
+ * lexemes.forEach(l => console.log(`${l.value} at ${l.position.startPosition}`));
62
+ * ```
31
63
  */
32
64
  static getAllLexemesWithPosition(sql) {
33
65
  if (!(sql === null || sql === void 0 ? void 0 : sql.trim())) {
@@ -37,7 +69,7 @@ export class LexemeCursor {
37
69
  const lexemes = [];
38
70
  let position = 0;
39
71
  while (position < sql.length) {
40
- position = this.skipWhitespace(sql, position);
72
+ position = this.skipWhitespaceAndComments(sql, position);
41
73
  if (position >= sql.length) {
42
74
  break;
43
75
  }
@@ -57,13 +89,11 @@ export class LexemeCursor {
57
89
  }
58
90
  }
59
91
  /**
60
- * Skip whitespace characters
92
+ * Skip whitespace and comments, returning new position
61
93
  */
62
- static skipWhitespace(sql, position) {
63
- while (position < sql.length && /\s/.test(sql[position])) {
64
- position++;
65
- }
66
- return position;
94
+ static skipWhitespaceAndComments(sql, position) {
95
+ const result = StringUtils.readWhiteSpaceAndComment(sql, position);
96
+ return result.position;
67
97
  }
68
98
  /**
69
99
  * Parse the next token starting at the given position
@@ -150,7 +180,7 @@ export class LexemeCursor {
150
180
  return TokenType.Command;
151
181
  }
152
182
  // Check if it's followed by parentheses (function)
153
- const nextNonWhitespacePos = this.skipWhitespace(sql, position);
183
+ const nextNonWhitespacePos = this.skipWhitespaceAndComments(sql, position);
154
184
  if (nextNonWhitespacePos < sql.length && sql[nextNonWhitespacePos] === '(') {
155
185
  return TokenType.Function;
156
186
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LexemeCursor.js","sourceRoot":"","sources":["../../../../src/utils/LexemeCursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;GAGG;AACH,MAAM,OAAO,YAAY;IAMrB;;;;;OAKG;IACI,MAAM,CAAC,oBAAoB,CAAC,GAAW,EAAE,cAAsB;QAClE,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;QAEpD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,MAAM,CAAC,QAAQ;gBACf,cAAc,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa;gBAC/C,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC/C,OAAO,MAAM,CAAC;YAClB,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,yBAAyB,CAAC,GAAW;QAC/C,IAAI,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACD,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,QAAQ,GAAG,CAAC,CAAC;YAEjB,OAAO,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC3B,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAE9C,IAAI,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;oBACzB,MAAM;gBACV,CAAC;gBAED,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAClD,IAAI,MAAM,EAAE,CAAC;oBACT,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrB,QAAQ,GAAG,MAAM,CAAC,QAAS,CAAC,WAAW,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACJ,QAAQ,EAAE,CAAC,CAAC,yBAAyB;gBACzC,CAAC;YACL,CAAC;YAED,OAAO,OAAO,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,cAAc,CAAC,GAAW,EAAE,QAAgB;QACvD,OAAO,QAAQ,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACvD,QAAQ,EAAE,CAAC;QACf,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,cAAc,CAAC,GAAW,EAAE,QAAgB;QACvD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3B,kBAAkB;QAClB,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;QAED,mCAAmC;QACnC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAED,QAAQ;QACR,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,iDAAiD;QACjD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,kBAAkB,CAAC,GAAW,EAAE,QAAgB;QAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC5B,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,OAAO,QAAQ,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;YACtD,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YACxB,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,gBAAgB;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,aAAa,CAAC,GAAW,EAAE,QAAgB;QACtD,IAAI,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;QAE5B,+CAA+C;QAC/C,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAChF,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,cAAc,CAAC,GAAW,EAAE,QAAgB;QACvD,IAAI,QAAQ,GAAG,QAAQ,CAAC;QACxB,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,OAAO,QAAQ,GAAG,GAAG,CAAC,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACjE,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAE5E,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,oBAAoB,CAAC,KAAa;QAC7C,QAAQ,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC;YACrC,KAAK,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,UAAU,CAAC;YACtC,KAAK,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,UAAU,CAAC,CAAC,qCAAqC;YAC5E,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC,QAAQ,CAAC;QACvC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,gBAAgB,CAAC,KAAa,EAAE,GAAW,EAAE,QAAgB;QACxE,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,0BAA0B;QAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,OAAO,SAAS,CAAC,OAAO,CAAC;QAC7B,CAAC;QAED,mDAAmD;QACnD,MAAM,oBAAoB,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAChE,IAAI,oBAAoB,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,oBAAoB,CAAC,KAAK,GAAG,EAAE,CAAC;YACzE,OAAO,SAAS,CAAC,QAAQ,CAAC;QAC9B,CAAC;QAED,OAAO,SAAS,CAAC,UAAU,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,eAAe,CAAC,SAAiB;QAC5C,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;YACjC,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC;YAClC,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,QAAgB,EAAE,MAAc;QACrF,OAAO;YACH,IAAI;YACJ,KAAK;YACL,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE;gBACN,aAAa,EAAE,QAAQ;gBACvB,WAAW,EAAE,MAAM;aACtB;SACJ,CAAC;IACN,CAAC;;AAlNuB,yBAAY,GAAG,IAAI,GAAG,CAAC;IAC3C,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ;IACxE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;IACxE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;CACxD,CAAC,CAAC"}
1
+ {"version":3,"file":"LexemeCursor.js","sourceRoot":"","sources":["../../../../src/utils/LexemeCursor.ts"],"names":[],"mappings":"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"}