rawsql-ts 0.11.28-beta → 0.11.30-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 (33) 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 +14 -14
  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/transformers/SchemaCollector.d.ts +7 -0
  9. package/dist/esm/src/transformers/SchemaCollector.js +99 -52
  10. package/dist/esm/src/transformers/SchemaCollector.js.map +1 -1
  11. package/dist/esm/src/utils/CTERegionDetector.d.ts +188 -0
  12. package/dist/esm/src/utils/CTERegionDetector.js +309 -0
  13. package/dist/esm/src/utils/CTERegionDetector.js.map +1 -0
  14. package/dist/esm/src/utils/LexemeCursor.d.ts +41 -10
  15. package/dist/esm/src/utils/LexemeCursor.js +46 -16
  16. package/dist/esm/src/utils/LexemeCursor.js.map +1 -1
  17. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  18. package/dist/index.min.js +16 -16
  19. package/dist/index.min.js.map +4 -4
  20. package/dist/src/index.d.ts +2 -0
  21. package/dist/src/index.js +1 -0
  22. package/dist/src/index.js.map +1 -1
  23. package/dist/src/transformers/SchemaCollector.d.ts +7 -0
  24. package/dist/src/transformers/SchemaCollector.js +99 -52
  25. package/dist/src/transformers/SchemaCollector.js.map +1 -1
  26. package/dist/src/utils/CTERegionDetector.d.ts +188 -0
  27. package/dist/src/utils/CTERegionDetector.js +313 -0
  28. package/dist/src/utils/CTERegionDetector.js.map +1 -0
  29. package/dist/src/utils/LexemeCursor.d.ts +41 -10
  30. package/dist/src/utils/LexemeCursor.js +46 -16
  31. package/dist/src/utils/LexemeCursor.js.map +1 -1
  32. package/dist/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +1 -1
@@ -0,0 +1,309 @@
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
+ // Find which CTE region contains the cursor
65
+ const currentCTE = cteRegions.find(region => cursorPosition >= region.startPosition && cursorPosition <= region.endPosition);
66
+ if (currentCTE) {
67
+ return {
68
+ isInCTE: true,
69
+ cteRegion: currentCTE,
70
+ executableSQL: currentCTE.sqlContent
71
+ };
72
+ }
73
+ else {
74
+ // Cursor is in main query - return full SQL or main SELECT part
75
+ const mainSQL = this.extractMainQuery(sql, cteRegions);
76
+ return {
77
+ isInCTE: false,
78
+ cteRegion: null,
79
+ executableSQL: mainSQL
80
+ };
81
+ }
82
+ }
83
+ /**
84
+ * Extract all CTE regions from SQL text with their boundaries and executable content.
85
+ *
86
+ * Parses the SQL to identify all Common Table Expressions and their locations,
87
+ * providing the information needed for syntax highlighting, code folding, and selective execution.
88
+ *
89
+ * @param sql - The SQL string to analyze
90
+ * @returns Array of CTE regions with their boundaries and content
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * const sql = `
95
+ * WITH
96
+ * users AS (SELECT * FROM people),
97
+ * orders AS (SELECT * FROM purchases)
98
+ * SELECT * FROM users JOIN orders
99
+ * `;
100
+ *
101
+ * const regions = CTERegionDetector.extractCTERegions(sql);
102
+ * // Returns: [
103
+ * // { name: 'users', startPosition: 23, endPosition: 45, sqlContent: 'SELECT * FROM people' },
104
+ * // { name: 'orders', startPosition: 55, endPosition: 80, sqlContent: 'SELECT * FROM purchases' }
105
+ * // ]
106
+ * ```
107
+ */
108
+ static extractCTERegions(sql) {
109
+ const lexemes = LexemeCursor.getAllLexemesWithPosition(sql);
110
+ const cteRegions = [];
111
+ let i = 0;
112
+ let inWithClause = false;
113
+ while (i < lexemes.length) {
114
+ const lexeme = lexemes[i];
115
+ // Detect WITH clause start
116
+ if (lexeme.value.toLowerCase() === 'with' && !inWithClause) {
117
+ inWithClause = true;
118
+ i++;
119
+ continue;
120
+ }
121
+ // Skip RECURSIVE keyword if present
122
+ if (inWithClause && lexeme.value.toLowerCase() === 'recursive') {
123
+ i++;
124
+ continue;
125
+ }
126
+ // Detect CTE definition (identifier followed by AS)
127
+ if (inWithClause &&
128
+ lexeme.type === TokenType.Identifier &&
129
+ i + 1 < lexemes.length &&
130
+ lexemes[i + 1].value.toLowerCase() === 'as') {
131
+ const cteName = lexeme.value;
132
+ const cteStartPos = lexeme.position.startPosition;
133
+ // Find the opening parenthesis after AS
134
+ let parenIndex = i + 2;
135
+ while (parenIndex < lexemes.length && lexemes[parenIndex].value !== '(') {
136
+ parenIndex++;
137
+ }
138
+ if (parenIndex < lexemes.length) {
139
+ // Find matching closing parenthesis
140
+ const cteEndInfo = this.findMatchingParen(lexemes, parenIndex);
141
+ if (cteEndInfo) {
142
+ const cteEndPos = cteEndInfo.endPosition;
143
+ const sqlContent = this.extractCTESQL(sql, lexemes, parenIndex, cteEndInfo.index);
144
+ cteRegions.push({
145
+ name: cteName,
146
+ startPosition: cteStartPos,
147
+ endPosition: cteEndPos,
148
+ sqlContent: sqlContent
149
+ });
150
+ i = cteEndInfo.index + 1;
151
+ continue;
152
+ }
153
+ }
154
+ }
155
+ // Check if we've reached the main SELECT (end of WITH clause)
156
+ if (inWithClause && lexeme.value.toLowerCase() === 'select') {
157
+ // Verify this is not a SELECT inside a CTE by checking context
158
+ if (this.isMainQuerySelect(lexemes, i)) {
159
+ break;
160
+ }
161
+ }
162
+ i++;
163
+ }
164
+ return cteRegions;
165
+ }
166
+ /**
167
+ * Find matching closing parenthesis for CTE definition
168
+ */
169
+ static findMatchingParen(lexemes, openParenIndex) {
170
+ let depth = 1;
171
+ let i = openParenIndex + 1;
172
+ while (i < lexemes.length && depth > 0) {
173
+ if (lexemes[i].value === '(') {
174
+ depth++;
175
+ }
176
+ else if (lexemes[i].value === ')') {
177
+ depth--;
178
+ }
179
+ if (depth === 0) {
180
+ return {
181
+ index: i,
182
+ endPosition: lexemes[i].position.endPosition
183
+ };
184
+ }
185
+ i++;
186
+ }
187
+ return null;
188
+ }
189
+ /**
190
+ * Extract the SQL content of a CTE (the SELECT statement inside parentheses)
191
+ */
192
+ static extractCTESQL(sql, lexemes, openParenIndex, closeParenIndex) {
193
+ const startPos = lexemes[openParenIndex + 1].position.startPosition;
194
+ const endPos = lexemes[closeParenIndex - 1].position.endPosition;
195
+ return sql.substring(startPos, endPos).trim();
196
+ }
197
+ /**
198
+ * Check if a SELECT lexeme is the main query SELECT (not inside a CTE)
199
+ */
200
+ static isMainQuerySelect(lexemes, selectIndex) {
201
+ // Look backwards to see if we're still in a parenthesized context
202
+ let depth = 0;
203
+ for (let i = selectIndex - 1; i >= 0; i--) {
204
+ if (lexemes[i].value === ')') {
205
+ depth++;
206
+ }
207
+ else if (lexemes[i].value === '(') {
208
+ depth--;
209
+ }
210
+ }
211
+ return depth === 0; // We're at top level if depth is 0
212
+ }
213
+ /**
214
+ * Extract the main query part (non-CTE SQL)
215
+ */
216
+ static extractMainQuery(sql, cteRegions) {
217
+ if (cteRegions.length === 0) {
218
+ return sql.trim();
219
+ }
220
+ // Find the end of the last CTE
221
+ const lastCTE = cteRegions[cteRegions.length - 1];
222
+ const mainQueryStart = lastCTE.endPosition;
223
+ // Find the main SELECT
224
+ let selectPos = mainQueryStart;
225
+ while (selectPos < sql.length) {
226
+ const remaining = sql.substring(selectPos).toLowerCase().trim();
227
+ if (remaining.startsWith('select')) {
228
+ break;
229
+ }
230
+ selectPos++;
231
+ }
232
+ return sql.substring(selectPos).trim();
233
+ }
234
+ /**
235
+ * Get a list of all executable sections (CTEs and main query) with their start positions.
236
+ *
237
+ * This method is particularly useful for building editor UI features such as:
238
+ * - Dropdown menus for section selection
239
+ * - Sidebar navigation for large queries
240
+ * - Quick jump functionality
241
+ * - "Run section" buttons
242
+ *
243
+ * @param sql - The SQL string to analyze
244
+ * @returns Array of executable sections with their names, positions, and types
245
+ *
246
+ * @example
247
+ * ```typescript
248
+ * const sql = `
249
+ * WITH monthly_sales AS (SELECT ...),
250
+ * yearly_summary AS (SELECT ...)
251
+ * SELECT * FROM yearly_summary
252
+ * `;
253
+ *
254
+ * const positions = CTERegionDetector.getCTEPositions(sql);
255
+ * // Returns: [
256
+ * // { name: 'monthly_sales', startPosition: 17, type: 'CTE' },
257
+ * // { name: 'yearly_summary', startPosition: 55, type: 'CTE' },
258
+ * // { name: 'MAIN_QUERY', startPosition: 120, type: 'MAIN_QUERY' }
259
+ * // ]
260
+ *
261
+ * // Use for editor UI
262
+ * positions.forEach(section => {
263
+ * addMenuItem(`${section.type}: ${section.name}`, () => {
264
+ * jumpToPosition(section.startPosition);
265
+ * });
266
+ * });
267
+ * ```
268
+ */
269
+ static getCTEPositions(sql) {
270
+ const cteRegions = this.extractCTERegions(sql);
271
+ const results = [];
272
+ // Add CTE regions
273
+ cteRegions.forEach(region => {
274
+ results.push({
275
+ name: region.name,
276
+ startPosition: region.startPosition,
277
+ type: 'CTE'
278
+ });
279
+ });
280
+ // Add main query position
281
+ if (cteRegions.length > 0) {
282
+ const lastCTE = cteRegions[cteRegions.length - 1];
283
+ let mainQueryPos = lastCTE.endPosition;
284
+ // Find the SELECT keyword
285
+ while (mainQueryPos < sql.length) {
286
+ const remaining = sql.substring(mainQueryPos).toLowerCase().trim();
287
+ if (remaining.startsWith('select')) {
288
+ results.push({
289
+ name: 'MAIN_QUERY',
290
+ startPosition: mainQueryPos,
291
+ type: 'MAIN_QUERY'
292
+ });
293
+ break;
294
+ }
295
+ mainQueryPos++;
296
+ }
297
+ }
298
+ else {
299
+ // No CTEs, entire SQL is main query
300
+ results.push({
301
+ name: 'MAIN_QUERY',
302
+ startPosition: 0,
303
+ type: 'MAIN_QUERY'
304
+ });
305
+ }
306
+ return results;
307
+ }
308
+ }
309
+ //# 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":"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"}
1
+ {"version":3,"file":"LexemeCursor.js","sourceRoot":"","sources":["../../../../src/utils/LexemeCursor.ts"],"names":[],"mappings":"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"}