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.
- package/dist/esm/index.js +19 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +43 -35
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/src/index.d.ts +21 -0
- package/dist/esm/src/index.js +19 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/tokenReaders/CommandTokenReader.js +5 -0
- package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/CTEBuilder.js +2 -2
- package/dist/esm/src/transformers/CTEBuilder.js.map +1 -1
- package/dist/esm/src/utils/CursorContextAnalyzer.d.ts +70 -0
- package/dist/esm/src/utils/CursorContextAnalyzer.js +322 -0
- package/dist/esm/src/utils/CursorContextAnalyzer.js.map +1 -0
- package/dist/esm/src/utils/IntelliSenseApi.d.ts +114 -0
- package/dist/esm/src/utils/IntelliSenseApi.js +284 -0
- package/dist/esm/src/utils/IntelliSenseApi.js.map +1 -0
- package/dist/esm/src/utils/KeywordCache.d.ts +65 -0
- package/dist/esm/src/utils/KeywordCache.js +202 -0
- package/dist/esm/src/utils/KeywordCache.js.map +1 -0
- package/dist/esm/src/utils/MultiQuerySplitter.d.ts +131 -0
- package/dist/esm/src/utils/MultiQuerySplitter.js +287 -0
- package/dist/esm/src/utils/MultiQuerySplitter.js.map +1 -0
- package/dist/esm/src/utils/PositionAwareParser.d.ts +85 -0
- package/dist/esm/src/utils/PositionAwareParser.js +336 -0
- package/dist/esm/src/utils/PositionAwareParser.js.map +1 -0
- package/dist/esm/src/utils/ScopeResolver.d.ts +127 -0
- package/dist/esm/src/utils/ScopeResolver.js +268 -0
- package/dist/esm/src/utils/ScopeResolver.js.map +1 -0
- package/dist/esm/src/utils/TextPositionUtils.d.ts +62 -0
- package/dist/esm/src/utils/TextPositionUtils.js +124 -0
- package/dist/esm/src/utils/TextPositionUtils.js.map +1 -0
- package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/index.min.js +43 -35
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.js +20 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/tokenReaders/CommandTokenReader.js +5 -0
- package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/src/transformers/CTEBuilder.js +2 -2
- package/dist/src/transformers/CTEBuilder.js.map +1 -1
- package/dist/src/utils/CursorContextAnalyzer.d.ts +70 -0
- package/dist/src/utils/CursorContextAnalyzer.js +338 -0
- package/dist/src/utils/CursorContextAnalyzer.js.map +1 -0
- package/dist/src/utils/IntelliSenseApi.d.ts +114 -0
- package/dist/src/utils/IntelliSenseApi.js +292 -0
- package/dist/src/utils/IntelliSenseApi.js.map +1 -0
- package/dist/src/utils/KeywordCache.d.ts +65 -0
- package/dist/src/utils/KeywordCache.js +206 -0
- package/dist/src/utils/KeywordCache.js.map +1 -0
- package/dist/src/utils/MultiQuerySplitter.d.ts +131 -0
- package/dist/src/utils/MultiQuerySplitter.js +292 -0
- package/dist/src/utils/MultiQuerySplitter.js.map +1 -0
- package/dist/src/utils/PositionAwareParser.d.ts +85 -0
- package/dist/src/utils/PositionAwareParser.js +363 -0
- package/dist/src/utils/PositionAwareParser.js.map +1 -0
- package/dist/src/utils/ScopeResolver.d.ts +127 -0
- package/dist/src/utils/ScopeResolver.js +272 -0
- package/dist/src/utils/ScopeResolver.js.map +1 -0
- package/dist/src/utils/TextPositionUtils.d.ts +62 -0
- package/dist/src/utils/TextPositionUtils.js +128 -0
- package/dist/src/utils/TextPositionUtils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- 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":";;;AACA,2DAAwD;AAiDxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAa,kBAAkB;IAC3B;;;;;OAKG;IACI,MAAM,CAAC,KAAK,CAAC,IAAY;QAC5B,MAAM,OAAO,GAAgB,EAAE,CAAC;QAEhC,kDAAkD;QAClD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9B,OAAO;gBACH,OAAO,EAAE,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;gBAC1B,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS;gBACzB,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE;aACxB,CAAC;QACN,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAG1E,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,iFAAiF;YACjF,MAAM,GAAG,GAAG,MAAM,CAAC;YAGnB,MAAM,YAAY,GAAG,qCAAiB,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpF,MAAM,UAAU,GAAG,qCAAiB,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEhF,OAAO,CAAC,IAAI,CAAC;gBACT,GAAG;gBACH,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,SAAS,EAAE,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,KAAI,CAAC;gBAClC,OAAO,EAAE,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,KAAI,CAAC;gBAC9B,KAAK,EAAE,UAAU,EAAE;gBACnB,OAAO;aACV,CAAC,CAAC;QACP,CAAC;QAED,OAAO;YACH,OAAO;YACP,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,CAAC,cAAmC,EAAE,EAAE;gBAC/C,MAAM,OAAO,GAAG,OAAO,cAAc,KAAK,QAAQ;oBAC9C,CAAC,CAAC,cAAc;oBAChB,CAAC,CAAC,qCAAiB,CAAC,sBAAsB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;gBAErE,IAAI,OAAO,KAAK,CAAC,CAAC;oBAAE,OAAO,SAAS,CAAC;gBAErC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACxB,OAAO,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,GAAG,CACjD,CAAC;YACN,CAAC;YACD,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxB,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;YACD,WAAW,EAAE,GAAG,EAAE;gBACd,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;SACJ,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACH;;OAEG;IACK,MAAM,CAAC,gCAAgC,CAAC,IAAY;QACxD,MAAM,QAAQ,GAAwD,EAAE,CAAC;QACzE,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,qDAAqD;YACrD,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAErG,IAAI,iBAAiB,EAAE,CAAC;gBACpB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBACpD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC5C,QAAQ,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,WAAW;wBACjB,KAAK,EAAE,YAAY;wBACnB,GAAG,EAAE,CAAC;qBACT,CAAC,CAAC;gBACP,CAAC;gBACD,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAED,CAAC,EAAE,CAAC;QACR,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,gBAAgB,CAAC,IAAY,EAAE,GAAW;QACrD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QAEpC,8EAA8E;QAC9E,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAExD,uBAAuB;YACvB,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc;gBACnD,IAAI,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACnC,aAAa,GAAG,IAAI,CAAC;gBACrB,CAAC,EAAE,CAAC,CAAC,sBAAsB;gBAC3B,SAAS;YACb,CAAC;YAED,IAAI,aAAa,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACjC,aAAa,GAAG,KAAK,CAAC;gBACtB,SAAS;YACb,CAAC;YAED,wBAAwB;YACxB,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa;gBAClD,IAAI,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACnC,cAAc,GAAG,IAAI,CAAC;gBACtB,CAAC,EAAE,CAAC,CAAC,sBAAsB;gBAC3B,SAAS;YACb,CAAC;YAED,IAAI,cAAc,IAAI,IAAI,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACrD,cAAc,GAAG,KAAK,CAAC;gBACvB,CAAC,EAAE,CAAC,CAAC,sBAAsB;gBAC3B,SAAS;YACb,CAAC;YAED,yBAAyB;YACzB,IAAI,aAAa,IAAI,cAAc,EAAE,CAAC;gBAClC,SAAS;YACb,CAAC;YAED,gBAAgB;YAChB,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjC,IAAI,aAAa,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;oBACpC,CAAC,EAAE,CAAC,CAAC,qBAAqB;gBAC9B,CAAC;qBAAM,CAAC;oBACJ,aAAa,GAAG,CAAC,aAAa,CAAC;gBACnC,CAAC;gBACD,SAAS;YACb,CAAC;YAED,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjC,IAAI,aAAa,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;oBACpC,CAAC,EAAE,CAAC,CAAC,qBAAqB;gBAC9B,CAAC;qBAAM,CAAC;oBACJ,aAAa,GAAG,CAAC,aAAa,CAAC;gBACnC,CAAC;gBACD,SAAS;YACb,CAAC;QACL,CAAC;QAED,mEAAmE;QACnE,OAAO,CAAC,aAAa,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc,CAAC;IACjF,CAAC;IAGD;;OAEG;IACK,MAAM,CAAC,4BAA4B,CACvC,QAA6D,EAC7D,QAAgB;QAEhB,MAAM,MAAM,GAAwD,EAAE,CAAC;QAEvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAExC,8EAA8E;YAC9E,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAGrD,IAAI,aAAa,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,4EAA4E;gBAC5E,mDAAmD;gBACnD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC9D,MAAM,qBAAqB,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC3D,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;gBAE3D,IAAI,qBAAqB,IAAI,cAAc,EAAE,CAAC;oBAC1C,wDAAwD;oBACxD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;wBACxB,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC;wBACxD,KAAK,EAAE,WAAW,CAAC,KAAK;wBACxB,GAAG,EAAE,OAAO,CAAC,GAAG;qBACnB,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACJ,+DAA+D;oBAC/D,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,qBAAqB;gBACrB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,gBAAgB,CAAC,GAAW;QACvC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,kCAAkC;QAClC,IAAI,OAAO,GAAG,GAAG,CAAC;QAElB,+EAA+E;QAC/E,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,wBAAwB;QACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,GAAW;QACnC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAC/C,CAAC;CAEJ;AAlQD,gDAkQC;AAED;;GAEG;AACH,MAAa,eAAe;IACxB;;;;;;OAMG;IACI,MAAM,CAAC,YAAY,CACtB,IAAY,EACZ,cAAmC;QAEnC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAEtD,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QAEnC,MAAM,OAAO,GAAG,OAAO,cAAc,KAAK,QAAQ;YAC9C,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,qCAAiB,CAAC,sBAAsB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAErE,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAErC,MAAM,gBAAgB,GAAG,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC;QAErD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;IACpD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,cAAc,CAAC,IAAY;QACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;CAEJ;AAvCD,0CAuCC"}
|