rawsql-ts 0.11.32-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 (169) hide show
  1. package/dist/esm/index.js +28 -0
  2. package/dist/esm/index.js.map +1 -1
  3. package/dist/esm/index.min.js +52 -36
  4. package/dist/esm/index.min.js.map +4 -4
  5. package/dist/esm/src/formatters/OriginalFormatRestorer.d.ts +40 -0
  6. package/dist/esm/src/formatters/OriginalFormatRestorer.js +135 -0
  7. package/dist/esm/src/formatters/OriginalFormatRestorer.js.map +1 -0
  8. package/dist/esm/src/index.d.ts +32 -0
  9. package/dist/esm/src/index.js +28 -0
  10. package/dist/esm/src/index.js.map +1 -1
  11. package/dist/esm/src/models/FormattingLexeme.d.ts +66 -0
  12. package/dist/esm/src/models/FormattingLexeme.js +2 -0
  13. package/dist/esm/src/models/FormattingLexeme.js.map +1 -0
  14. package/dist/esm/src/models/ValueComponent.d.ts +3 -1
  15. package/dist/esm/src/models/ValueComponent.js +3 -1
  16. package/dist/esm/src/models/ValueComponent.js.map +1 -1
  17. package/dist/esm/src/parsers/FunctionExpressionParser.d.ts +12 -0
  18. package/dist/esm/src/parsers/FunctionExpressionParser.js +111 -7
  19. package/dist/esm/src/parsers/FunctionExpressionParser.js.map +1 -1
  20. package/dist/esm/src/parsers/KeywordParser.d.ts +1 -0
  21. package/dist/esm/src/parsers/KeywordParser.js +10 -4
  22. package/dist/esm/src/parsers/KeywordParser.js.map +1 -1
  23. package/dist/esm/src/parsers/SqlPrintTokenParser.js +8 -0
  24. package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
  25. package/dist/esm/src/parsers/SqlTokenizer.d.ts +42 -2
  26. package/dist/esm/src/parsers/SqlTokenizer.js +213 -12
  27. package/dist/esm/src/parsers/SqlTokenizer.js.map +1 -1
  28. package/dist/esm/src/tokenReaders/CommandTokenReader.d.ts +3 -0
  29. package/dist/esm/src/tokenReaders/CommandTokenReader.js +9 -1
  30. package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
  31. package/dist/esm/src/transformers/AliasRenamer.d.ts +199 -0
  32. package/dist/esm/src/transformers/AliasRenamer.js +595 -0
  33. package/dist/esm/src/transformers/AliasRenamer.js.map +1 -0
  34. package/dist/esm/src/transformers/CTEBuilder.js +2 -2
  35. package/dist/esm/src/transformers/CTEBuilder.js.map +1 -1
  36. package/dist/esm/src/transformers/CTERenamer.d.ts +53 -0
  37. package/dist/esm/src/transformers/CTERenamer.js +138 -0
  38. package/dist/esm/src/transformers/CTERenamer.js.map +1 -1
  39. package/dist/esm/src/transformers/DynamicQueryBuilder.d.ts +72 -0
  40. package/dist/esm/src/transformers/DynamicQueryBuilder.js +42 -0
  41. package/dist/esm/src/transformers/DynamicQueryBuilder.js.map +1 -1
  42. package/dist/esm/src/transformers/FilterableItemCollector.d.ts +80 -0
  43. package/dist/esm/src/transformers/FilterableItemCollector.js +254 -0
  44. package/dist/esm/src/transformers/FilterableItemCollector.js.map +1 -0
  45. package/dist/esm/src/transformers/SelectableColumnCollector.d.ts +3 -0
  46. package/dist/esm/src/transformers/SelectableColumnCollector.js +68 -7
  47. package/dist/esm/src/transformers/SelectableColumnCollector.js.map +1 -1
  48. package/dist/esm/src/transformers/SmartRenamer.d.ts +134 -0
  49. package/dist/esm/src/transformers/SmartRenamer.js +430 -0
  50. package/dist/esm/src/transformers/SmartRenamer.js.map +1 -0
  51. package/dist/esm/src/transformers/SqlIdentifierRenamer.d.ts +150 -0
  52. package/dist/esm/src/transformers/SqlIdentifierRenamer.js +493 -0
  53. package/dist/esm/src/transformers/SqlIdentifierRenamer.js.map +1 -0
  54. package/dist/esm/src/transformers/SqlParamInjector.d.ts +27 -0
  55. package/dist/esm/src/transformers/SqlParamInjector.js +304 -16
  56. package/dist/esm/src/transformers/SqlParamInjector.js.map +1 -1
  57. package/dist/esm/src/transformers/SqlSortInjector.js +6 -3
  58. package/dist/esm/src/transformers/SqlSortInjector.js.map +1 -1
  59. package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js +5 -2
  60. package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
  61. package/dist/esm/src/utils/CursorContextAnalyzer.d.ts +70 -0
  62. package/dist/esm/src/utils/CursorContextAnalyzer.js +322 -0
  63. package/dist/esm/src/utils/CursorContextAnalyzer.js.map +1 -0
  64. package/dist/esm/src/utils/IntelliSenseApi.d.ts +114 -0
  65. package/dist/esm/src/utils/IntelliSenseApi.js +284 -0
  66. package/dist/esm/src/utils/IntelliSenseApi.js.map +1 -0
  67. package/dist/esm/src/utils/KeywordCache.d.ts +65 -0
  68. package/dist/esm/src/utils/KeywordCache.js +202 -0
  69. package/dist/esm/src/utils/KeywordCache.js.map +1 -0
  70. package/dist/esm/src/utils/LexemeCursor.d.ts +41 -0
  71. package/dist/esm/src/utils/LexemeCursor.js +93 -0
  72. package/dist/esm/src/utils/LexemeCursor.js.map +1 -1
  73. package/dist/esm/src/utils/MultiQuerySplitter.d.ts +131 -0
  74. package/dist/esm/src/utils/MultiQuerySplitter.js +287 -0
  75. package/dist/esm/src/utils/MultiQuerySplitter.js.map +1 -0
  76. package/dist/esm/src/utils/PositionAwareParser.d.ts +85 -0
  77. package/dist/esm/src/utils/PositionAwareParser.js +336 -0
  78. package/dist/esm/src/utils/PositionAwareParser.js.map +1 -0
  79. package/dist/esm/src/utils/ScopeResolver.d.ts +127 -0
  80. package/dist/esm/src/utils/ScopeResolver.js +268 -0
  81. package/dist/esm/src/utils/ScopeResolver.js.map +1 -0
  82. package/dist/esm/src/utils/TextPositionUtils.d.ts +62 -0
  83. package/dist/esm/src/utils/TextPositionUtils.js +124 -0
  84. package/dist/esm/src/utils/TextPositionUtils.js.map +1 -0
  85. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  86. package/dist/index.min.js +52 -36
  87. package/dist/index.min.js.map +4 -4
  88. package/dist/src/formatters/OriginalFormatRestorer.d.ts +40 -0
  89. package/dist/src/formatters/OriginalFormatRestorer.js +139 -0
  90. package/dist/src/formatters/OriginalFormatRestorer.js.map +1 -0
  91. package/dist/src/index.d.ts +32 -0
  92. package/dist/src/index.js +30 -1
  93. package/dist/src/index.js.map +1 -1
  94. package/dist/src/models/FormattingLexeme.d.ts +66 -0
  95. package/dist/src/models/FormattingLexeme.js +3 -0
  96. package/dist/src/models/FormattingLexeme.js.map +1 -0
  97. package/dist/src/models/ValueComponent.d.ts +3 -1
  98. package/dist/src/models/ValueComponent.js +3 -1
  99. package/dist/src/models/ValueComponent.js.map +1 -1
  100. package/dist/src/parsers/FunctionExpressionParser.d.ts +12 -0
  101. package/dist/src/parsers/FunctionExpressionParser.js +110 -6
  102. package/dist/src/parsers/FunctionExpressionParser.js.map +1 -1
  103. package/dist/src/parsers/KeywordParser.d.ts +1 -0
  104. package/dist/src/parsers/KeywordParser.js +10 -4
  105. package/dist/src/parsers/KeywordParser.js.map +1 -1
  106. package/dist/src/parsers/SqlPrintTokenParser.js +8 -0
  107. package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
  108. package/dist/src/parsers/SqlTokenizer.d.ts +42 -2
  109. package/dist/src/parsers/SqlTokenizer.js +222 -12
  110. package/dist/src/parsers/SqlTokenizer.js.map +1 -1
  111. package/dist/src/tokenReaders/CommandTokenReader.d.ts +3 -0
  112. package/dist/src/tokenReaders/CommandTokenReader.js +10 -2
  113. package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
  114. package/dist/src/transformers/AliasRenamer.d.ts +199 -0
  115. package/dist/src/transformers/AliasRenamer.js +599 -0
  116. package/dist/src/transformers/AliasRenamer.js.map +1 -0
  117. package/dist/src/transformers/CTEBuilder.js +2 -2
  118. package/dist/src/transformers/CTEBuilder.js.map +1 -1
  119. package/dist/src/transformers/CTERenamer.d.ts +53 -0
  120. package/dist/src/transformers/CTERenamer.js +138 -0
  121. package/dist/src/transformers/CTERenamer.js.map +1 -1
  122. package/dist/src/transformers/DynamicQueryBuilder.d.ts +72 -0
  123. package/dist/src/transformers/DynamicQueryBuilder.js +42 -0
  124. package/dist/src/transformers/DynamicQueryBuilder.js.map +1 -1
  125. package/dist/src/transformers/FilterableItemCollector.d.ts +80 -0
  126. package/dist/src/transformers/FilterableItemCollector.js +259 -0
  127. package/dist/src/transformers/FilterableItemCollector.js.map +1 -0
  128. package/dist/src/transformers/SelectableColumnCollector.d.ts +3 -0
  129. package/dist/src/transformers/SelectableColumnCollector.js +67 -6
  130. package/dist/src/transformers/SelectableColumnCollector.js.map +1 -1
  131. package/dist/src/transformers/SmartRenamer.d.ts +134 -0
  132. package/dist/src/transformers/SmartRenamer.js +442 -0
  133. package/dist/src/transformers/SmartRenamer.js.map +1 -0
  134. package/dist/src/transformers/SqlIdentifierRenamer.d.ts +150 -0
  135. package/dist/src/transformers/SqlIdentifierRenamer.js +497 -0
  136. package/dist/src/transformers/SqlIdentifierRenamer.js.map +1 -0
  137. package/dist/src/transformers/SqlParamInjector.d.ts +27 -0
  138. package/dist/src/transformers/SqlParamInjector.js +303 -15
  139. package/dist/src/transformers/SqlParamInjector.js.map +1 -1
  140. package/dist/src/transformers/SqlSortInjector.js +5 -2
  141. package/dist/src/transformers/SqlSortInjector.js.map +1 -1
  142. package/dist/src/transformers/UpstreamSelectQueryFinder.js +4 -1
  143. package/dist/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
  144. package/dist/src/utils/CursorContextAnalyzer.d.ts +70 -0
  145. package/dist/src/utils/CursorContextAnalyzer.js +338 -0
  146. package/dist/src/utils/CursorContextAnalyzer.js.map +1 -0
  147. package/dist/src/utils/IntelliSenseApi.d.ts +114 -0
  148. package/dist/src/utils/IntelliSenseApi.js +292 -0
  149. package/dist/src/utils/IntelliSenseApi.js.map +1 -0
  150. package/dist/src/utils/KeywordCache.d.ts +65 -0
  151. package/dist/src/utils/KeywordCache.js +206 -0
  152. package/dist/src/utils/KeywordCache.js.map +1 -0
  153. package/dist/src/utils/LexemeCursor.d.ts +41 -0
  154. package/dist/src/utils/LexemeCursor.js +93 -0
  155. package/dist/src/utils/LexemeCursor.js.map +1 -1
  156. package/dist/src/utils/MultiQuerySplitter.d.ts +131 -0
  157. package/dist/src/utils/MultiQuerySplitter.js +292 -0
  158. package/dist/src/utils/MultiQuerySplitter.js.map +1 -0
  159. package/dist/src/utils/PositionAwareParser.d.ts +85 -0
  160. package/dist/src/utils/PositionAwareParser.js +363 -0
  161. package/dist/src/utils/PositionAwareParser.js.map +1 -0
  162. package/dist/src/utils/ScopeResolver.d.ts +127 -0
  163. package/dist/src/utils/ScopeResolver.js +272 -0
  164. package/dist/src/utils/ScopeResolver.js.map +1 -0
  165. package/dist/src/utils/TextPositionUtils.d.ts +62 -0
  166. package/dist/src/utils/TextPositionUtils.js +128 -0
  167. package/dist/src/utils/TextPositionUtils.js.map +1 -0
  168. package/dist/tsconfig.tsbuildinfo +1 -1
  169. package/package.json +1 -1
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseToPosition = parseToPosition;
4
+ exports.getCursorContext = getCursorContext;
5
+ exports.resolveScope = resolveScope;
6
+ exports.splitQueries = splitQueries;
7
+ exports.getIntelliSenseInfo = getIntelliSenseInfo;
8
+ exports.getCompletionSuggestions = getCompletionSuggestions;
9
+ const CursorContextAnalyzer_1 = require("./CursorContextAnalyzer");
10
+ const ScopeResolver_1 = require("./ScopeResolver");
11
+ const PositionAwareParser_1 = require("./PositionAwareParser");
12
+ const MultiQuerySplitter_1 = require("./MultiQuerySplitter");
13
+ const TextPositionUtils_1 = require("./TextPositionUtils");
14
+ /**
15
+ * Convenience API for SQL IntelliSense integration
16
+ *
17
+ * Provides simplified, high-level functions that combine the functionality
18
+ * of the various position-aware parsing components for easy integration
19
+ * with Monaco Editor and other code editors.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { parseToPosition, getCursorContext, resolveScope, splitQueries } from 'rawsql-ts';
24
+ *
25
+ * // Parse incomplete SQL with error recovery
26
+ * const sql = "SELECT u.name FROM users u WHERE u.";
27
+ * const parseResult = parseToPosition(sql, sql.length, { errorRecovery: true });
28
+ *
29
+ * // Get cursor context for completion suggestions
30
+ * const context = getCursorContext(sql, sql.length);
31
+ * console.log(context.isAfterDot); // true
32
+ * console.log(context.precedingIdentifier); // "u"
33
+ *
34
+ * // Get scope information for table/column completion
35
+ * const scope = resolveScope(sql, sql.length);
36
+ * console.log(scope.availableTables); // [{ name: 'users', alias: 'u' }]
37
+ *
38
+ * // Handle multi-query editor
39
+ * const multiSQL = "SELECT 1; SELECT 2;";
40
+ * const queries = splitQueries(multiSQL);
41
+ * const activeQuery = queries.getActive(12); // Get query at position
42
+ * ```
43
+ */
44
+ /**
45
+ * Parse SQL up to cursor position with error recovery
46
+ *
47
+ * Combines position-aware parsing with error recovery to handle incomplete SQL
48
+ * that users are actively typing. Ideal for providing IntelliSense in editors.
49
+ *
50
+ * @param sql - SQL text to parse
51
+ * @param cursorPosition - Cursor position (character offset or line/column)
52
+ * @param options - Parsing options including error recovery settings
53
+ * @returns Parse result with position-specific information
54
+ */
55
+ function parseToPosition(sql, cursorPosition, options = {}) {
56
+ return PositionAwareParser_1.PositionAwareParser.parseToPosition(sql, cursorPosition, options);
57
+ }
58
+ /**
59
+ * Analyze cursor context for IntelliSense completion suggestions
60
+ *
61
+ * Determines what type of completions should be offered at the cursor position
62
+ * based on SQL syntax context (SELECT clause, WHERE condition, etc.).
63
+ *
64
+ * @param sql - SQL text to analyze
65
+ * @param cursorPosition - Cursor position (character offset or line/column)
66
+ * @returns Cursor context information for completion logic
67
+ */
68
+ function getCursorContext(sql, cursorPosition) {
69
+ if (typeof cursorPosition === 'number') {
70
+ return CursorContextAnalyzer_1.CursorContextAnalyzer.analyzeIntelliSense(sql, cursorPosition);
71
+ }
72
+ else {
73
+ return CursorContextAnalyzer_1.CursorContextAnalyzer.analyzeIntelliSenseAt(sql, cursorPosition);
74
+ }
75
+ }
76
+ /**
77
+ * Resolve scope information at cursor position
78
+ *
79
+ * Provides comprehensive information about available tables, CTEs, and columns
80
+ * at the specified cursor position for intelligent completion suggestions.
81
+ *
82
+ * @param sql - SQL text to analyze
83
+ * @param cursorPosition - Cursor position (character offset or line/column)
84
+ * @returns Complete scope information including available tables and columns
85
+ */
86
+ function resolveScope(sql, cursorPosition) {
87
+ if (typeof cursorPosition === 'number') {
88
+ return ScopeResolver_1.ScopeResolver.resolve(sql, cursorPosition);
89
+ }
90
+ else {
91
+ return ScopeResolver_1.ScopeResolver.resolveAt(sql, cursorPosition);
92
+ }
93
+ }
94
+ /**
95
+ * Split multi-query SQL text into individual queries
96
+ *
97
+ * Handles SQL editors that contain multiple statements separated by semicolons.
98
+ * Properly handles string literals and comments containing semicolons.
99
+ *
100
+ * @param sql - Multi-query SQL text
101
+ * @returns Collection of individual queries with position information
102
+ */
103
+ function splitQueries(sql) {
104
+ return MultiQuerySplitter_1.MultiQuerySplitter.split(sql);
105
+ }
106
+ /**
107
+ * Get IntelliSense information for a cursor position in multi-query context
108
+ *
109
+ * Combines query splitting, context analysis, and scope resolution to provide
110
+ * complete IntelliSense information for a cursor position in multi-query SQL.
111
+ *
112
+ * @param sql - Multi-query SQL text
113
+ * @param cursorPosition - Cursor position
114
+ * @param options - Parsing options
115
+ * @returns Complete IntelliSense information or undefined if position is invalid
116
+ */
117
+ function getIntelliSenseInfo(sql, cursorPosition, options = {}) {
118
+ const charPos = typeof cursorPosition === 'number'
119
+ ? cursorPosition
120
+ : TextPositionUtils_1.TextPositionUtils.lineColumnToCharOffset(sql, cursorPosition);
121
+ if (charPos === -1) {
122
+ return undefined;
123
+ }
124
+ // Split queries and find the active one
125
+ const queries = splitQueries(sql);
126
+ const activeQuery = queries.getActive(charPos);
127
+ if (!activeQuery) {
128
+ return undefined;
129
+ }
130
+ // Calculate relative position within the active query
131
+ const relativePosition = charPos - activeQuery.start;
132
+ const querySQL = activeQuery.sql;
133
+ // Get IntelliSense information for the active query
134
+ const context = getCursorContext(querySQL, relativePosition);
135
+ const scope = resolveScope(querySQL, relativePosition);
136
+ const parseResult = parseToPosition(querySQL, relativePosition, options);
137
+ return {
138
+ context,
139
+ scope,
140
+ parseResult,
141
+ currentQuery: querySQL,
142
+ relativePosition
143
+ };
144
+ }
145
+ /**
146
+ * Get completion suggestions based on cursor context and scope
147
+ *
148
+ * Uses the new IntelliSense interface to provide targeted completion suggestions.
149
+ * This function leverages the suggestion-based design to efficiently determine
150
+ * what completions should be offered.
151
+ *
152
+ * @param sql - SQL text
153
+ * @param cursorPosition - Cursor position
154
+ * @returns Array of completion suggestions with context information
155
+ */
156
+ function getCompletionSuggestions(sql, cursorPosition) {
157
+ const charPos = typeof cursorPosition === 'number'
158
+ ? cursorPosition
159
+ : TextPositionUtils_1.TextPositionUtils.lineColumnToCharOffset(sql, cursorPosition);
160
+ if (charPos === -1) {
161
+ return [];
162
+ }
163
+ const intelliSenseContext = CursorContextAnalyzer_1.CursorContextAnalyzer.analyzeIntelliSense(sql, charPos);
164
+ const scope = resolveScope(sql, cursorPosition);
165
+ const suggestions = [];
166
+ // Add keyword suggestions
167
+ if (intelliSenseContext.suggestKeywords) {
168
+ // Add required keywords if specified
169
+ if (intelliSenseContext.requiredKeywords) {
170
+ intelliSenseContext.requiredKeywords.forEach(keyword => {
171
+ suggestions.push({
172
+ type: 'keyword',
173
+ value: keyword,
174
+ detail: `Required keyword: ${keyword}`
175
+ });
176
+ });
177
+ }
178
+ else {
179
+ // Add general contextual keywords based on token context
180
+ const generalKeywords = getGeneralKeywords(intelliSenseContext);
181
+ generalKeywords.forEach(keyword => {
182
+ suggestions.push({
183
+ type: 'keyword',
184
+ value: keyword.value,
185
+ detail: keyword.detail
186
+ });
187
+ });
188
+ }
189
+ }
190
+ // Add table suggestions
191
+ if (intelliSenseContext.suggestTables) {
192
+ scope.availableTables.forEach(table => {
193
+ suggestions.push({
194
+ type: 'table',
195
+ value: table.alias || table.name,
196
+ detail: `Table: ${table.fullName}`,
197
+ documentation: `Available table${table.alias ? ` (alias: ${table.alias})` : ''}`
198
+ });
199
+ });
200
+ // Add CTE suggestions
201
+ scope.availableCTEs.forEach(cte => {
202
+ suggestions.push({
203
+ type: 'cte',
204
+ value: cte.name,
205
+ detail: `CTE: ${cte.name}`,
206
+ documentation: `Common Table Expression${cte.columns ? ` with columns: ${cte.columns.join(', ')}` : ''}`
207
+ });
208
+ });
209
+ }
210
+ // Add column suggestions
211
+ if (intelliSenseContext.suggestColumns) {
212
+ if (intelliSenseContext.tableScope) {
213
+ // Specific table/alias column completion
214
+ const columns = scope.visibleColumns.filter(col => col.tableName === intelliSenseContext.tableScope ||
215
+ col.tableAlias === intelliSenseContext.tableScope);
216
+ columns.forEach(col => {
217
+ suggestions.push({
218
+ type: 'column',
219
+ value: col.name,
220
+ detail: `Column: ${col.fullReference}`,
221
+ documentation: `Column from ${col.tableName}${col.type ? ` (${col.type})` : ''}`
222
+ });
223
+ });
224
+ }
225
+ else {
226
+ // General column completion
227
+ scope.visibleColumns.forEach(col => {
228
+ suggestions.push({
229
+ type: 'column',
230
+ value: col.name === '*' ? '*' : `${col.tableAlias || col.tableName}.${col.name}`,
231
+ detail: `Column: ${col.fullReference}`,
232
+ documentation: `Column from ${col.tableName}`
233
+ });
234
+ });
235
+ }
236
+ }
237
+ return suggestions;
238
+ }
239
+ /**
240
+ * Get general keyword suggestions based on IntelliSense context
241
+ */
242
+ function getGeneralKeywords(context) {
243
+ var _a, _b, _c, _d;
244
+ // Determine context from token information
245
+ const prevToken = (_b = (_a = context.previousToken) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.toLowerCase();
246
+ const currentToken = (_d = (_c = context.currentToken) === null || _c === void 0 ? void 0 : _c.value) === null || _d === void 0 ? void 0 : _d.toLowerCase();
247
+ // SELECT context - aggregate functions and keywords
248
+ if (prevToken === "select" || currentToken === "select") {
249
+ return [
250
+ { value: "DISTINCT", detail: "Remove duplicate rows" },
251
+ { value: "COUNT", detail: "Aggregate function" },
252
+ { value: "SUM", detail: "Aggregate function" },
253
+ { value: "AVG", detail: "Aggregate function" },
254
+ { value: "MAX", detail: "Aggregate function" },
255
+ { value: "MIN", detail: "Aggregate function" }
256
+ ];
257
+ }
258
+ // FROM context - JOIN options and clauses
259
+ if (prevToken === "from" || currentToken === "from") {
260
+ return [
261
+ { value: "JOIN", detail: "Inner join tables" },
262
+ { value: "LEFT JOIN", detail: "Left outer join" },
263
+ { value: "RIGHT JOIN", detail: "Right outer join" },
264
+ { value: "FULL JOIN", detail: "Full outer join" },
265
+ { value: "WHERE", detail: "Filter conditions" },
266
+ { value: "GROUP BY", detail: "Group results" },
267
+ { value: "ORDER BY", detail: "Sort results" }
268
+ ];
269
+ }
270
+ // WHERE/HAVING context - logical operators
271
+ if (["where", "having", "on"].includes(prevToken || "") || ["where", "having", "on"].includes(currentToken || "")) {
272
+ return [
273
+ { value: "AND", detail: "Logical AND operator" },
274
+ { value: "OR", detail: "Logical OR operator" },
275
+ { value: "NOT", detail: "Logical NOT operator" },
276
+ { value: "IN", detail: "Match any value in list" },
277
+ { value: "LIKE", detail: "Pattern matching" },
278
+ { value: "BETWEEN", detail: "Range comparison" }
279
+ ];
280
+ }
281
+ // Default context - general SQL keywords
282
+ return [
283
+ { value: "SELECT", detail: "Query data" },
284
+ { value: "FROM", detail: "Specify table" },
285
+ { value: "WHERE", detail: "Filter conditions" },
286
+ { value: "JOIN", detail: "Join tables" },
287
+ { value: "GROUP BY", detail: "Group results" },
288
+ { value: "ORDER BY", detail: "Sort results" },
289
+ { value: "LIMIT", detail: "Limit results" }
290
+ ];
291
+ }
292
+ //# sourceMappingURL=IntelliSenseApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntelliSenseApi.js","sourceRoot":"","sources":["../../../src/utils/IntelliSenseApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Utility for caching keyword relationships for fast access
3
+ * Dynamically builds keyword relationships from existing joinkeywordParser
4
+ *
5
+ * SOURCE DICTIONARIES (single source of truth):
6
+ * - JOIN patterns: /src/tokenReaders/CommandTokenReader.ts (joinTrie, lines 10-29)
7
+ * - Command patterns: /src/tokenReaders/CommandTokenReader.ts (keywordTrie, lines 30-118)
8
+ *
9
+ * MIGRATION NOTE:
10
+ * If keywords are added/modified in CommandTokenReader.ts, update the
11
+ * extractCommandPatternsFromTrie() method to reflect those changes.
12
+ * JOIN patterns are automatically extracted via joinkeywordParser.
13
+ */
14
+ export declare class KeywordCache {
15
+ private static joinSuggestionCache;
16
+ private static commandSuggestionCache;
17
+ private static initialized;
18
+ /**
19
+ * Initialize JOIN-related keyword suggestions
20
+ * Dynamically generated based on information extracted from joinkeywordParser
21
+ */
22
+ private static initialize;
23
+ /**
24
+ * Get next suggestions for the specified keyword
25
+ * Example: "left" → ["join", "outer", "outer join"]
26
+ */
27
+ static getJoinSuggestions(keyword: string): string[];
28
+ /**
29
+ * Check if a keyword is a valid JOIN keyword
30
+ * Uses existing joinkeywordParser as the primary resource
31
+ */
32
+ static isValidJoinKeyword(keyword: string): boolean;
33
+ /**
34
+ * Generate suggestions based on partial keyword input
35
+ * Example: "le" → find keywords starting with "left"
36
+ */
37
+ static getPartialSuggestions(partialKeyword: string): string[];
38
+ /**
39
+ * Get all JOIN keywords
40
+ */
41
+ static getAllJoinKeywords(): string[];
42
+ /**
43
+ * Initialize command keyword patterns
44
+ * Dynamically extracted from commandKeywordTrie
45
+ */
46
+ private static initializeCommandKeywords;
47
+ /**
48
+ * Extract multi-word patterns from commandKeywordTrie
49
+ * Uses known patterns since direct extraction from trie structure is difficult
50
+ *
51
+ * SOURCE: /src/tokenReaders/CommandTokenReader.ts keywordTrie (lines 30-118)
52
+ * MIGRATION: When updating, copy multi-word patterns from the source trie
53
+ */
54
+ private static extractCommandPatternsFromTrie;
55
+ /**
56
+ * Get next command suggestions for the specified keyword
57
+ * Example: "group" → ["by"]
58
+ */
59
+ static getCommandSuggestions(keyword: string): string[];
60
+ /**
61
+ * Force cache re-initialization
62
+ * Used for testing or when keyword definitions have changed
63
+ */
64
+ static reset(): void;
65
+ }
@@ -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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"}
@@ -1,4 +1,11 @@
1
1
  import { Lexeme } from '../models/Lexeme';
2
+ /**
3
+ * Line and column position (1-based indexing for editor integration)
4
+ */
5
+ export interface LineColumn {
6
+ line: number;
7
+ column: number;
8
+ }
2
9
  /**
3
10
  * Utility class for cursor-to-lexeme mapping in SQL text.
4
11
  *
@@ -14,6 +21,24 @@ import { Lexeme } from '../models/Lexeme';
14
21
  */
15
22
  export declare class LexemeCursor {
16
23
  private static readonly SQL_COMMANDS;
24
+ /**
25
+ * Find the lexeme at the specified line and column position.
26
+ *
27
+ * Designed for GUI editor integration where users select alias text.
28
+ * Uses 1-based line and column indexing to match editor conventions.
29
+ *
30
+ * @param sql - The SQL string to analyze
31
+ * @param position - Line and column position (1-based)
32
+ * @returns The lexeme at the position, or null if not found
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const sql = "SELECT user_id FROM orders";
37
+ * const lexeme = LexemeCursor.findLexemeAtLineColumn(sql, { line: 1, column: 8 });
38
+ * console.log(lexeme?.value); // 'user_id'
39
+ * ```
40
+ */
41
+ static findLexemeAtLineColumn(sql: string, position: LineColumn): Lexeme | null;
17
42
  /**
18
43
  * Find the lexeme at the specified cursor position.
19
44
  *
@@ -85,4 +110,20 @@ export declare class LexemeCursor {
85
110
  * Create a lexeme with position information
86
111
  */
87
112
  private static createLexeme;
113
+ /**
114
+ * Convert line and column position to character offset.
115
+ *
116
+ * @param sql - The SQL string
117
+ * @param position - Line and column position (1-based)
118
+ * @returns Character offset (0-based), or -1 if position is out of bounds
119
+ */
120
+ private static lineColumnToCharOffset;
121
+ /**
122
+ * Convert character offset to line and column position.
123
+ *
124
+ * @param sql - The SQL string
125
+ * @param charOffset - Character offset (0-based)
126
+ * @returns Line and column position (1-based), or null if offset is out of bounds
127
+ */
128
+ static charOffsetToLineColumn(sql: string, charOffset: number): LineColumn | null;
88
129
  }