rawsql-ts 0.11.33-beta → 0.11.34-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) 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 +43 -35
  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/tokenReaders/CommandTokenReader.js +5 -0
  9. package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
  10. package/dist/esm/src/transformers/CTEBuilder.js +2 -2
  11. package/dist/esm/src/transformers/CTEBuilder.js.map +1 -1
  12. package/dist/esm/src/utils/CursorContextAnalyzer.d.ts +70 -0
  13. package/dist/esm/src/utils/CursorContextAnalyzer.js +322 -0
  14. package/dist/esm/src/utils/CursorContextAnalyzer.js.map +1 -0
  15. package/dist/esm/src/utils/IntelliSenseApi.d.ts +114 -0
  16. package/dist/esm/src/utils/IntelliSenseApi.js +284 -0
  17. package/dist/esm/src/utils/IntelliSenseApi.js.map +1 -0
  18. package/dist/esm/src/utils/KeywordCache.d.ts +65 -0
  19. package/dist/esm/src/utils/KeywordCache.js +202 -0
  20. package/dist/esm/src/utils/KeywordCache.js.map +1 -0
  21. package/dist/esm/src/utils/MultiQuerySplitter.d.ts +131 -0
  22. package/dist/esm/src/utils/MultiQuerySplitter.js +287 -0
  23. package/dist/esm/src/utils/MultiQuerySplitter.js.map +1 -0
  24. package/dist/esm/src/utils/PositionAwareParser.d.ts +85 -0
  25. package/dist/esm/src/utils/PositionAwareParser.js +336 -0
  26. package/dist/esm/src/utils/PositionAwareParser.js.map +1 -0
  27. package/dist/esm/src/utils/ScopeResolver.d.ts +127 -0
  28. package/dist/esm/src/utils/ScopeResolver.js +268 -0
  29. package/dist/esm/src/utils/ScopeResolver.js.map +1 -0
  30. package/dist/esm/src/utils/TextPositionUtils.d.ts +62 -0
  31. package/dist/esm/src/utils/TextPositionUtils.js +124 -0
  32. package/dist/esm/src/utils/TextPositionUtils.js.map +1 -0
  33. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  34. package/dist/index.min.js +43 -35
  35. package/dist/index.min.js.map +4 -4
  36. package/dist/src/index.d.ts +21 -0
  37. package/dist/src/index.js +20 -1
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/tokenReaders/CommandTokenReader.js +5 -0
  40. package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
  41. package/dist/src/transformers/CTEBuilder.js +2 -2
  42. package/dist/src/transformers/CTEBuilder.js.map +1 -1
  43. package/dist/src/utils/CursorContextAnalyzer.d.ts +70 -0
  44. package/dist/src/utils/CursorContextAnalyzer.js +338 -0
  45. package/dist/src/utils/CursorContextAnalyzer.js.map +1 -0
  46. package/dist/src/utils/IntelliSenseApi.d.ts +114 -0
  47. package/dist/src/utils/IntelliSenseApi.js +292 -0
  48. package/dist/src/utils/IntelliSenseApi.js.map +1 -0
  49. package/dist/src/utils/KeywordCache.d.ts +65 -0
  50. package/dist/src/utils/KeywordCache.js +206 -0
  51. package/dist/src/utils/KeywordCache.js.map +1 -0
  52. package/dist/src/utils/MultiQuerySplitter.d.ts +131 -0
  53. package/dist/src/utils/MultiQuerySplitter.js +292 -0
  54. package/dist/src/utils/MultiQuerySplitter.js.map +1 -0
  55. package/dist/src/utils/PositionAwareParser.d.ts +85 -0
  56. package/dist/src/utils/PositionAwareParser.js +363 -0
  57. package/dist/src/utils/PositionAwareParser.js.map +1 -0
  58. package/dist/src/utils/ScopeResolver.d.ts +127 -0
  59. package/dist/src/utils/ScopeResolver.js +272 -0
  60. package/dist/src/utils/ScopeResolver.js.map +1 -0
  61. package/dist/src/utils/TextPositionUtils.d.ts +62 -0
  62. package/dist/src/utils/TextPositionUtils.js +128 -0
  63. package/dist/src/utils/TextPositionUtils.js.map +1 -0
  64. package/dist/tsconfig.tsbuildinfo +1 -1
  65. package/package.json +1 -1
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KeywordCache = void 0;
4
+ const CommandTokenReader_1 = require("../tokenReaders/CommandTokenReader");
5
+ /**
6
+ * Utility for caching keyword relationships for fast access
7
+ * Dynamically builds keyword relationships from existing joinkeywordParser
8
+ *
9
+ * SOURCE DICTIONARIES (single source of truth):
10
+ * - JOIN patterns: /src/tokenReaders/CommandTokenReader.ts (joinTrie, lines 10-29)
11
+ * - Command patterns: /src/tokenReaders/CommandTokenReader.ts (keywordTrie, lines 30-118)
12
+ *
13
+ * MIGRATION NOTE:
14
+ * If keywords are added/modified in CommandTokenReader.ts, update the
15
+ * extractCommandPatternsFromTrie() method to reflect those changes.
16
+ * JOIN patterns are automatically extracted via joinkeywordParser.
17
+ */
18
+ class KeywordCache {
19
+ /**
20
+ * Initialize JOIN-related keyword suggestions
21
+ * Dynamically generated based on information extracted from joinkeywordParser
22
+ */
23
+ static initialize() {
24
+ if (this.initialized)
25
+ return;
26
+ // SOURCE: /src/tokenReaders/CommandTokenReader.ts joinTrie (lines 10-33)
27
+ // Dynamically build keyword relationships from joinTrie
28
+ const joinPatterns = [
29
+ ["join"],
30
+ ["inner", "join"],
31
+ ["cross", "join"],
32
+ ["left", "join"],
33
+ ["left", "outer", "join"],
34
+ ["right", "join"],
35
+ ["right", "outer", "join"],
36
+ ["full", "join"],
37
+ ["full", "outer", "join"],
38
+ ["natural", "join"],
39
+ ["natural", "inner", "join"],
40
+ ["natural", "left", "join"],
41
+ ["natural", "left", "outer", "join"],
42
+ ["natural", "right", "join"],
43
+ ["natural", "right", "outer", "join"],
44
+ ["natural", "full", "join"],
45
+ ["natural", "full", "outer", "join"],
46
+ // LATERAL JOIN patterns
47
+ ["lateral", "join"],
48
+ ["lateral", "inner", "join"],
49
+ ["lateral", "left", "join"],
50
+ ["lateral", "left", "outer", "join"],
51
+ ];
52
+ // Build keyword suggestion relationships
53
+ const suggestionMap = new Map();
54
+ // Build complete phrase suggestions for better UX
55
+ const completePhrases = new Set();
56
+ joinPatterns.forEach(pattern => {
57
+ if (pattern.length > 1) {
58
+ completePhrases.add(pattern.slice(1).join(' ').toUpperCase());
59
+ }
60
+ });
61
+ // For each prefix, find all possible complete continuations
62
+ joinPatterns.forEach(pattern => {
63
+ for (let i = 0; i < pattern.length - 1; i++) {
64
+ const prefix = pattern[i];
65
+ if (!suggestionMap.has(prefix)) {
66
+ suggestionMap.set(prefix, new Set());
67
+ }
68
+ // Find all patterns that start with this prefix and add complete phrases
69
+ joinPatterns.forEach(candidatePattern => {
70
+ if (candidatePattern.length > i + 1 && candidatePattern[i] === prefix) {
71
+ const completePhrase = candidatePattern.slice(i + 1).join(' ').toUpperCase();
72
+ suggestionMap.get(prefix).add(completePhrase);
73
+ }
74
+ });
75
+ }
76
+ });
77
+ // Convert Set to array and save to cache
78
+ suggestionMap.forEach((suggestions, keyword) => {
79
+ this.joinSuggestionCache.set(keyword.toLowerCase(), Array.from(suggestions));
80
+ });
81
+ // Also process command keywords
82
+ this.initializeCommandKeywords();
83
+ this.initialized = true;
84
+ }
85
+ /**
86
+ * Get next suggestions for the specified keyword
87
+ * Example: "left" → ["join", "outer", "outer join"]
88
+ */
89
+ static getJoinSuggestions(keyword) {
90
+ this.initialize();
91
+ return this.joinSuggestionCache.get(keyword.toLowerCase()) || [];
92
+ }
93
+ /**
94
+ * Check if a keyword is a valid JOIN keyword
95
+ * Uses existing joinkeywordParser as the primary resource
96
+ */
97
+ static isValidJoinKeyword(keyword) {
98
+ const result = CommandTokenReader_1.joinkeywordParser.parse(keyword, 0);
99
+ return result !== null;
100
+ }
101
+ /**
102
+ * Generate suggestions based on partial keyword input
103
+ * Example: "le" → find keywords starting with "left"
104
+ */
105
+ static getPartialSuggestions(partialKeyword) {
106
+ this.initialize();
107
+ const partial = partialKeyword.toLowerCase();
108
+ const suggestions = [];
109
+ this.joinSuggestionCache.forEach((values, key) => {
110
+ if (key.startsWith(partial)) {
111
+ suggestions.push(key);
112
+ // Include next suggestions for that keyword as well
113
+ values.forEach(value => {
114
+ if (!suggestions.includes(value)) {
115
+ suggestions.push(value);
116
+ }
117
+ });
118
+ }
119
+ });
120
+ return suggestions;
121
+ }
122
+ /**
123
+ * Get all JOIN keywords
124
+ */
125
+ static getAllJoinKeywords() {
126
+ this.initialize();
127
+ const allKeywords = new Set();
128
+ this.joinSuggestionCache.forEach((values, key) => {
129
+ allKeywords.add(key);
130
+ values.forEach(value => allKeywords.add(value));
131
+ });
132
+ return Array.from(allKeywords);
133
+ }
134
+ /**
135
+ * Initialize command keyword patterns
136
+ * Dynamically extracted from commandKeywordTrie
137
+ */
138
+ static initializeCommandKeywords() {
139
+ // Extract multi-word patterns from commandKeywordTrie
140
+ const commandPatterns = this.extractCommandPatternsFromTrie();
141
+ const suggestionMap = new Map();
142
+ commandPatterns.forEach(pattern => {
143
+ for (let i = 0; i < pattern.length - 1; i++) {
144
+ const prefix = pattern[i];
145
+ const nextWord = pattern[i + 1];
146
+ if (!suggestionMap.has(prefix)) {
147
+ suggestionMap.set(prefix, new Set());
148
+ }
149
+ suggestionMap.get(prefix).add(nextWord);
150
+ }
151
+ });
152
+ // Convert Set to array and save to cache
153
+ suggestionMap.forEach((suggestions, keyword) => {
154
+ this.commandSuggestionCache.set(keyword.toLowerCase(), Array.from(suggestions));
155
+ });
156
+ }
157
+ /**
158
+ * Extract multi-word patterns from commandKeywordTrie
159
+ * Uses known patterns since direct extraction from trie structure is difficult
160
+ *
161
+ * SOURCE: /src/tokenReaders/CommandTokenReader.ts keywordTrie (lines 30-118)
162
+ * MIGRATION: When updating, copy multi-word patterns from the source trie
163
+ */
164
+ static extractCommandPatternsFromTrie() {
165
+ // These are patterns defined in CommandTokenReader's keywordTrie
166
+ return [
167
+ ["group", "by"],
168
+ ["order", "by"],
169
+ ["distinct", "on"],
170
+ ["not", "materialized"],
171
+ ["row", "only"],
172
+ ["rows", "only"],
173
+ ["percent", "with", "ties"],
174
+ ["key", "share"],
175
+ ["no", "key", "update"],
176
+ ["union", "all"],
177
+ ["intersect", "all"],
178
+ ["except", "all"],
179
+ ["partition", "by"],
180
+ ["within", "group"],
181
+ ["with", "ordinality"]
182
+ ];
183
+ }
184
+ /**
185
+ * Get next command suggestions for the specified keyword
186
+ * Example: "group" → ["by"]
187
+ */
188
+ static getCommandSuggestions(keyword) {
189
+ this.initialize();
190
+ return this.commandSuggestionCache.get(keyword.toLowerCase()) || [];
191
+ }
192
+ /**
193
+ * Force cache re-initialization
194
+ * Used for testing or when keyword definitions have changed
195
+ */
196
+ static reset() {
197
+ this.joinSuggestionCache.clear();
198
+ this.commandSuggestionCache.clear();
199
+ this.initialized = false;
200
+ }
201
+ }
202
+ exports.KeywordCache = KeywordCache;
203
+ KeywordCache.joinSuggestionCache = new Map();
204
+ KeywordCache.commandSuggestionCache = new Map();
205
+ KeywordCache.initialized = false;
206
+ //# sourceMappingURL=KeywordCache.js.map
@@ -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,292 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiQueryUtils = exports.MultiQuerySplitter = void 0;
4
+ const TextPositionUtils_1 = require("./TextPositionUtils");
5
+ /**
6
+ * Splits SQL text containing multiple queries separated by semicolons
7
+ *
8
+ * Provides sophisticated query boundary detection that properly handles:
9
+ * - String literals containing semicolons
10
+ * - Comments containing semicolons
11
+ * - Nested structures and complex SQL
12
+ * - Empty queries and whitespace handling
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const multiSQL = `
17
+ * -- First query
18
+ * SELECT 'hello;world' FROM users;
19
+ *
20
+ * // Second query with comment
21
+ * SELECT id FROM orders WHERE status = 'active';
22
+ *
23
+ * -- Empty query
24
+ * ;
25
+ * `;
26
+ *
27
+ * const queries = MultiQuerySplitter.split(multiSQL);
28
+ * console.log(queries.queries.length); // 3 queries
29
+ *
30
+ * // Find query at cursor position
31
+ * const active = queries.getActive(150);
32
+ * console.log(active?.sql); // Query containing position 150
33
+ * ```
34
+ */
35
+ class MultiQuerySplitter {
36
+ /**
37
+ * Split multi-query SQL text into individual queries
38
+ *
39
+ * @param text - SQL text that may contain multiple queries separated by semicolons
40
+ * @returns Collection of individual queries with position information
41
+ */
42
+ static split(text) {
43
+ const queries = [];
44
+ // Handle completely empty or whitespace-only text
45
+ if (!text || text.trim() === '') {
46
+ return {
47
+ queries: [],
48
+ originalText: text,
49
+ getActive: () => undefined,
50
+ getQuery: () => undefined,
51
+ getNonEmpty: () => []
52
+ };
53
+ }
54
+ const rawBoundaries = this.splitRespectingQuotesAndComments(text);
55
+ const boundaries = this.mergeTrailingCommentSegments(rawBoundaries, text);
56
+ let queryIndex = 0;
57
+ for (const boundary of boundaries) {
58
+ const rawSql = boundary.text.trim();
59
+ const isEmpty = this.isEmptyQuery(rawSql);
60
+ // Use raw SQL as-is - boundaries are already correctly split by valid semicolons
61
+ const sql = rawSql;
62
+ const startLineCol = TextPositionUtils_1.TextPositionUtils.charOffsetToLineColumn(text, boundary.start);
63
+ const endLineCol = TextPositionUtils_1.TextPositionUtils.charOffsetToLineColumn(text, boundary.end);
64
+ queries.push({
65
+ sql,
66
+ start: boundary.start,
67
+ end: boundary.end,
68
+ startLine: (startLineCol === null || startLineCol === void 0 ? void 0 : startLineCol.line) || 1,
69
+ endLine: (endLineCol === null || endLineCol === void 0 ? void 0 : endLineCol.line) || 1,
70
+ index: queryIndex++,
71
+ isEmpty
72
+ });
73
+ }
74
+ return {
75
+ queries,
76
+ originalText: text,
77
+ getActive: (cursorPosition) => {
78
+ const charPos = typeof cursorPosition === 'number'
79
+ ? cursorPosition
80
+ : TextPositionUtils_1.TextPositionUtils.lineColumnToCharOffset(text, cursorPosition);
81
+ if (charPos === -1)
82
+ return undefined;
83
+ return queries.find(query => charPos >= query.start && charPos <= query.end);
84
+ },
85
+ getQuery: (index) => {
86
+ return queries[index];
87
+ },
88
+ getNonEmpty: () => {
89
+ return queries.filter(q => !q.isEmpty);
90
+ }
91
+ };
92
+ }
93
+ /**
94
+ * Get query boundaries from SQL text with proper semicolon handling
95
+ *
96
+ * @param text - SQL text to analyze
97
+ * @returns Array of boundary positions
98
+ */
99
+ /**
100
+ * Split text by semicolons while respecting quotes and comments
101
+ */
102
+ static splitRespectingQuotesAndComments(text) {
103
+ const segments = [];
104
+ let currentStart = 0;
105
+ let i = 0;
106
+ while (i <= text.length) {
107
+ // Check if we're at a valid semicolon or end of text
108
+ const isValidBreakpoint = (i === text.length) || (i < text.length && this.isValidSemicolon(text, i));
109
+ if (isValidBreakpoint) {
110
+ const segmentText = text.substring(currentStart, i);
111
+ if (segmentText.length > 0 || i < text.length) {
112
+ segments.push({
113
+ text: segmentText,
114
+ start: currentStart,
115
+ end: i
116
+ });
117
+ }
118
+ currentStart = i + 1;
119
+ }
120
+ i++;
121
+ }
122
+ return segments;
123
+ }
124
+ /**
125
+ * Check if character at position is a valid semicolon (not in quotes/comments)
126
+ */
127
+ static isValidSemicolon(text, pos) {
128
+ if (text[pos] !== ';')
129
+ return false;
130
+ // Check if this semicolon is inside quotes or comments by scanning from start
131
+ let inSingleQuote = false;
132
+ let inDoubleQuote = false;
133
+ let inLineComment = false;
134
+ let inBlockComment = false;
135
+ for (let i = 0; i < pos; i++) {
136
+ const char = text[i];
137
+ const nextChar = i + 1 < text.length ? text[i + 1] : '';
138
+ // Handle line comments
139
+ if (!inSingleQuote && !inDoubleQuote && !inBlockComment &&
140
+ char === '-' && nextChar === '-') {
141
+ inLineComment = true;
142
+ i++; // Skip next character
143
+ continue;
144
+ }
145
+ if (inLineComment && char === '\n') {
146
+ inLineComment = false;
147
+ continue;
148
+ }
149
+ // Handle block comments
150
+ if (!inSingleQuote && !inDoubleQuote && !inLineComment &&
151
+ char === '/' && nextChar === '*') {
152
+ inBlockComment = true;
153
+ i++; // Skip next character
154
+ continue;
155
+ }
156
+ if (inBlockComment && char === '*' && nextChar === '/') {
157
+ inBlockComment = false;
158
+ i++; // Skip next character
159
+ continue;
160
+ }
161
+ // Skip if in any comment
162
+ if (inLineComment || inBlockComment) {
163
+ continue;
164
+ }
165
+ // Handle quotes
166
+ if (char === "'" && !inDoubleQuote) {
167
+ if (inSingleQuote && nextChar === "'") {
168
+ i++; // Skip escaped quote
169
+ }
170
+ else {
171
+ inSingleQuote = !inSingleQuote;
172
+ }
173
+ continue;
174
+ }
175
+ if (char === '"' && !inSingleQuote) {
176
+ if (inDoubleQuote && nextChar === '"') {
177
+ i++; // Skip escaped quote
178
+ }
179
+ else {
180
+ inDoubleQuote = !inDoubleQuote;
181
+ }
182
+ continue;
183
+ }
184
+ }
185
+ // Return false if we're inside quotes or comments at this position
186
+ return !inSingleQuote && !inDoubleQuote && !inLineComment && !inBlockComment;
187
+ }
188
+ /**
189
+ * Merge comment-only segments with previous executable segments
190
+ */
191
+ static mergeTrailingCommentSegments(segments, fullText) {
192
+ const merged = [];
193
+ for (let i = 0; i < segments.length; i++) {
194
+ const segment = segments[i];
195
+ const segmentText = segment.text.trim();
196
+ // Check if this segment contains only comments/whitespace (no executable SQL)
197
+ const isCommentOnly = this.isEmptyQuery(segmentText);
198
+ if (isCommentOnly && merged.length > 0) {
199
+ // Only merge if this appears to be a trailing line comment (starts with --)
200
+ // and the previous segment contains executable SQL
201
+ const lastSegmentText = merged[merged.length - 1].text.trim();
202
+ const isTrailingLineComment = segmentText.startsWith('--');
203
+ const previousHasSQL = !this.isEmptyQuery(lastSegmentText);
204
+ if (isTrailingLineComment && previousHasSQL) {
205
+ // Merge trailing line comment with previous SQL segment
206
+ const lastSegment = merged[merged.length - 1];
207
+ merged[merged.length - 1] = {
208
+ text: fullText.substring(lastSegment.start, segment.end),
209
+ start: lastSegment.start,
210
+ end: segment.end
211
+ };
212
+ }
213
+ else {
214
+ // Keep as separate segment (empty query or standalone comment)
215
+ merged.push(segment);
216
+ }
217
+ }
218
+ else {
219
+ // Add as new segment
220
+ merged.push(segment);
221
+ }
222
+ }
223
+ return merged;
224
+ }
225
+ /**
226
+ * Clean SQL comments and extract SQL statements
227
+ *
228
+ * @param sql - SQL query text
229
+ * @returns Cleaned SQL text or null if no SQL remains
230
+ */
231
+ static cleanSqlComments(sql) {
232
+ if (!sql)
233
+ return null;
234
+ // Remove comments and extract SQL
235
+ let cleaned = sql;
236
+ // Remove line comments - standard SQL behavior: -- comments out to end of line
237
+ cleaned = cleaned.split('\n').map(line => {
238
+ const commentStart = line.indexOf('--');
239
+ if (commentStart >= 0) {
240
+ return line.substring(0, commentStart);
241
+ }
242
+ return line;
243
+ }).join('\n');
244
+ // Remove block comments
245
+ cleaned = cleaned.replace(/\/\*[\s\S]*?\*\//g, '');
246
+ const result = cleaned.trim();
247
+ return result.length > 0 ? result : null;
248
+ }
249
+ static isEmptyQuery(sql) {
250
+ if (!sql)
251
+ return true;
252
+ return this.cleanSqlComments(sql) === null;
253
+ }
254
+ }
255
+ exports.MultiQuerySplitter = MultiQuerySplitter;
256
+ /**
257
+ * Utility functions for working with query collections
258
+ */
259
+ class MultiQueryUtils {
260
+ /**
261
+ * Get context information for IntelliSense at a cursor position
262
+ *
263
+ * @param text - Multi-query SQL text
264
+ * @param cursorPosition - Cursor position
265
+ * @returns Active query and position within that query
266
+ */
267
+ static getContextAt(text, cursorPosition) {
268
+ const queries = MultiQuerySplitter.split(text);
269
+ const activeQuery = queries.getActive(cursorPosition);
270
+ if (!activeQuery)
271
+ return undefined;
272
+ const charPos = typeof cursorPosition === 'number'
273
+ ? cursorPosition
274
+ : TextPositionUtils_1.TextPositionUtils.lineColumnToCharOffset(text, cursorPosition);
275
+ if (charPos === -1)
276
+ return undefined;
277
+ const relativePosition = charPos - activeQuery.start;
278
+ return { query: activeQuery, relativePosition };
279
+ }
280
+ /**
281
+ * Extract all non-empty queries from multi-query text
282
+ *
283
+ * @param text - Multi-query SQL text
284
+ * @returns Array of query SQL strings
285
+ */
286
+ static extractQueries(text) {
287
+ const queries = MultiQuerySplitter.split(text);
288
+ return queries.getNonEmpty().map(q => q.sql);
289
+ }
290
+ }
291
+ exports.MultiQueryUtils = MultiQueryUtils;
292
+ //# 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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"}