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,268 @@
1
+ import { SimpleSelectQuery, BinarySelectQuery } from '../models/SelectQuery';
2
+ import { TableSource, SubQuerySource } from '../models/Clause';
3
+ import { CTECollector } from '../transformers/CTECollector';
4
+ import { TextPositionUtils } from './TextPositionUtils';
5
+ /**
6
+ * Resolves scope information at cursor positions for SQL IntelliSense
7
+ *
8
+ * Provides comprehensive scope analysis including table availability, CTE resolution,
9
+ * and column visibility for intelligent code completion suggestions.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const sql = `
14
+ * WITH users AS (SELECT id, name FROM accounts)
15
+ * SELECT u.name FROM users u
16
+ * LEFT JOIN orders o ON u.id = o.user_id
17
+ * WHERE u.|
18
+ * `;
19
+ * const scope = ScopeResolver.resolveAt(sql, { line: 4, column: 12 });
20
+ *
21
+ * console.log(scope.availableTables); // [{ name: 'users', alias: 'u' }, { name: 'orders', alias: 'o' }]
22
+ * console.log(scope.availableCTEs); // [{ name: 'users', columns: ['id', 'name'] }]
23
+ * ```
24
+ */
25
+ export class ScopeResolver {
26
+ /**
27
+ * Resolve scope information at the specified cursor position
28
+ *
29
+ * @param sql - SQL text to analyze
30
+ * @param cursorPosition - Character position of cursor (0-based)
31
+ * @returns Complete scope information
32
+ */
33
+ static resolve(sql, cursorPosition) {
34
+ // Simplified for suggestion-only focus - return basic scope information
35
+ // Complex SQL parsing removed to avoid issues with incomplete SQL syntax
36
+ return this.createEmptyScope();
37
+ }
38
+ /**
39
+ * Resolve scope information at line/column position
40
+ *
41
+ * @param sql - SQL text to analyze
42
+ * @param position - Line and column position (1-based)
43
+ * @returns Complete scope information
44
+ */
45
+ static resolveAt(sql, position) {
46
+ const charOffset = TextPositionUtils.lineColumnToCharOffset(sql, position);
47
+ if (charOffset === -1) {
48
+ return this.createEmptyScope();
49
+ }
50
+ return this.resolve(sql, charOffset);
51
+ }
52
+ /**
53
+ * Get available columns for a specific table or alias
54
+ *
55
+ * @param sql - SQL text containing the query
56
+ * @param cursorPosition - Cursor position for scope resolution
57
+ * @param tableOrAlias - Table name or alias to get columns for
58
+ * @returns Array of available columns for the specified table
59
+ */
60
+ static getColumnsForTable(sql, cursorPosition, tableOrAlias) {
61
+ const scope = this.resolve(sql, cursorPosition);
62
+ // Find matching table
63
+ const table = scope.availableTables.find(t => t.name === tableOrAlias || t.alias === tableOrAlias);
64
+ if (!table) {
65
+ return [];
66
+ }
67
+ // Return columns for this table
68
+ return scope.visibleColumns.filter(col => col.tableName === table.name ||
69
+ (table.alias && col.tableAlias === table.alias));
70
+ }
71
+ static analyzeScopeFromQuery(query) {
72
+ const scope = {
73
+ availableTables: [],
74
+ availableCTEs: [],
75
+ subqueryLevel: 0,
76
+ visibleColumns: [],
77
+ currentQuery: query,
78
+ parentQueries: []
79
+ };
80
+ if (query instanceof SimpleSelectQuery) {
81
+ // Collect CTEs
82
+ scope.availableCTEs = this.collectCTEs(query);
83
+ // Collect tables from FROM and JOINs
84
+ scope.availableTables = this.collectTablesFromQuery(query);
85
+ // Collect visible columns
86
+ scope.visibleColumns = this.collectVisibleColumns(scope.availableTables, scope.availableCTEs);
87
+ }
88
+ else if (query instanceof BinarySelectQuery) {
89
+ // For UNION queries, analyze both sides
90
+ const leftScope = this.analyzeScopeFromQuery(query.left);
91
+ const rightScope = this.analyzeScopeFromQuery(query.right);
92
+ // Merge scopes (tables from both sides available)
93
+ scope.availableTables = [...leftScope.availableTables, ...rightScope.availableTables];
94
+ scope.availableCTEs = [...leftScope.availableCTEs, ...rightScope.availableCTEs];
95
+ scope.visibleColumns = [...leftScope.visibleColumns, ...rightScope.visibleColumns];
96
+ }
97
+ return scope;
98
+ }
99
+ static collectCTEs(query) {
100
+ const ctes = [];
101
+ if (query.withClause) {
102
+ const cteCollector = new CTECollector();
103
+ const collectedCTEs = cteCollector.collect(query);
104
+ for (const cte of collectedCTEs) {
105
+ ctes.push({
106
+ name: cte.getSourceAliasName(),
107
+ query: cte.query,
108
+ columns: this.extractCTEColumns(cte.query),
109
+ materialized: cte.materialized || false
110
+ });
111
+ }
112
+ }
113
+ return ctes;
114
+ }
115
+ static collectTablesFromQuery(query) {
116
+ const tables = [];
117
+ // Collect from FROM clause
118
+ if (query.fromClause) {
119
+ const fromTables = this.extractTablesFromFromClause(query.fromClause);
120
+ tables.push(...fromTables);
121
+ }
122
+ return tables;
123
+ }
124
+ static extractTablesFromFromClause(fromClause) {
125
+ var _a, _b, _c, _d;
126
+ const tables = [];
127
+ // Extract main source table
128
+ if (fromClause.source.datasource instanceof TableSource) {
129
+ const table = {
130
+ name: this.extractTableName(fromClause.source.datasource.qualifiedName),
131
+ alias: (_a = fromClause.source.aliasExpression) === null || _a === void 0 ? void 0 : _a.table.name,
132
+ schema: this.extractSchemaName(fromClause.source.datasource.qualifiedName),
133
+ fullName: this.getQualifiedNameString(fromClause.source.datasource.qualifiedName),
134
+ sourceType: 'table'
135
+ };
136
+ tables.push(table);
137
+ }
138
+ else if (fromClause.source.datasource instanceof SubQuerySource) {
139
+ const table = {
140
+ name: ((_b = fromClause.source.aliasExpression) === null || _b === void 0 ? void 0 : _b.table.name) || 'subquery',
141
+ alias: (_c = fromClause.source.aliasExpression) === null || _c === void 0 ? void 0 : _c.table.name,
142
+ fullName: ((_d = fromClause.source.aliasExpression) === null || _d === void 0 ? void 0 : _d.table.name) || 'subquery',
143
+ sourceType: 'subquery',
144
+ originalQuery: fromClause.source.datasource.query
145
+ };
146
+ tables.push(table);
147
+ }
148
+ // Collect from JOINs
149
+ if (fromClause.joins) {
150
+ for (const join of fromClause.joins) {
151
+ const joinTables = this.extractTablesFromJoin(join);
152
+ tables.push(...joinTables);
153
+ }
154
+ }
155
+ return tables;
156
+ }
157
+ static extractTablesFromJoin(join) {
158
+ var _a, _b, _c, _d;
159
+ const tables = [];
160
+ if (join.source.datasource instanceof TableSource) {
161
+ const table = {
162
+ name: this.extractTableName(join.source.datasource.qualifiedName),
163
+ alias: (_a = join.source.aliasExpression) === null || _a === void 0 ? void 0 : _a.table.name,
164
+ schema: this.extractSchemaName(join.source.datasource.qualifiedName),
165
+ fullName: this.getQualifiedNameString(join.source.datasource.qualifiedName),
166
+ sourceType: 'table'
167
+ };
168
+ tables.push(table);
169
+ }
170
+ else if (join.source.datasource instanceof SubQuerySource) {
171
+ const table = {
172
+ name: ((_b = join.source.aliasExpression) === null || _b === void 0 ? void 0 : _b.table.name) || 'subquery',
173
+ alias: (_c = join.source.aliasExpression) === null || _c === void 0 ? void 0 : _c.table.name,
174
+ fullName: ((_d = join.source.aliasExpression) === null || _d === void 0 ? void 0 : _d.table.name) || 'subquery',
175
+ sourceType: 'subquery',
176
+ originalQuery: join.source.datasource.query
177
+ };
178
+ tables.push(table);
179
+ }
180
+ return tables;
181
+ }
182
+ static getQualifiedNameString(qualifiedName) {
183
+ // Use the existing method from QualifiedName to get the string representation
184
+ return qualifiedName.toString();
185
+ }
186
+ static extractTableName(qualifiedName) {
187
+ const fullName = this.getQualifiedNameString(qualifiedName);
188
+ const parts = fullName.split('.');
189
+ return parts[parts.length - 1]; // Last part is table name
190
+ }
191
+ static extractSchemaName(qualifiedName) {
192
+ const fullName = this.getQualifiedNameString(qualifiedName);
193
+ const parts = fullName.split('.');
194
+ return parts.length > 1 ? parts[parts.length - 2] : undefined;
195
+ }
196
+ static extractCTEColumns(query) {
197
+ // Try to extract column names from CTE SELECT clause
198
+ try {
199
+ if (query instanceof SimpleSelectQuery && query.selectClause) {
200
+ const columns = [];
201
+ for (const item of query.selectClause.items) {
202
+ // Use alias if available, otherwise try to extract from expression
203
+ if (item.identifier) {
204
+ columns.push(item.identifier.name);
205
+ }
206
+ else {
207
+ // Try to extract column name from expression
208
+ const columnName = this.extractColumnNameFromExpression(item.value);
209
+ if (columnName) {
210
+ columns.push(columnName);
211
+ }
212
+ }
213
+ }
214
+ return columns;
215
+ }
216
+ }
217
+ catch (error) {
218
+ // If extraction fails, return undefined
219
+ }
220
+ return undefined;
221
+ }
222
+ static extractColumnNameFromExpression(expression) {
223
+ // Simple extraction - can be enhanced based on ValueComponent types
224
+ if (expression && typeof expression === 'object' && 'value' in expression) {
225
+ return expression.value;
226
+ }
227
+ return undefined;
228
+ }
229
+ static collectVisibleColumns(tables, ctes) {
230
+ const columns = [];
231
+ // Add columns from CTEs
232
+ for (const cte of ctes) {
233
+ if (cte.columns) {
234
+ for (const columnName of cte.columns) {
235
+ columns.push({
236
+ name: columnName,
237
+ tableName: cte.name,
238
+ fullReference: `${cte.name}.${columnName}`
239
+ });
240
+ }
241
+ }
242
+ }
243
+ // For regular tables, we would need schema information to determine columns
244
+ // This is a placeholder - in practice, this would integrate with database metadata
245
+ for (const table of tables) {
246
+ if (table.sourceType === 'table') {
247
+ // Placeholder - would query database schema
248
+ columns.push({
249
+ name: '*',
250
+ tableName: table.name,
251
+ tableAlias: table.alias,
252
+ fullReference: `${table.alias || table.name}.*`
253
+ });
254
+ }
255
+ }
256
+ return columns;
257
+ }
258
+ static createEmptyScope() {
259
+ return {
260
+ availableTables: [],
261
+ availableCTEs: [],
262
+ subqueryLevel: 0,
263
+ visibleColumns: [],
264
+ parentQueries: []
265
+ };
266
+ }
267
+ }
268
+ //# sourceMappingURL=ScopeResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScopeResolver.js","sourceRoot":"","sources":["../../../../src/utils/ScopeResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { LineColumn } from './LexemeCursor';
2
+ /**
3
+ * Utility functions for text position conversion and manipulation
4
+ *
5
+ * Provides centralized functionality for converting between different
6
+ * position representations commonly used in text processing and SQL parsing.
7
+ */
8
+ export declare class TextPositionUtils {
9
+ /**
10
+ * Convert line/column position to character offset
11
+ *
12
+ * @param text - Source text
13
+ * @param position - Line/column position (1-based)
14
+ * @returns Character offset (0-based) or -1 if invalid
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const text = "SELECT id\nFROM users";
19
+ * const charOffset = TextPositionUtils.lineColumnToCharOffset(text, { line: 2, column: 1 });
20
+ * console.log(charOffset); // 10 (position of 'F' in 'FROM')
21
+ * ```
22
+ */
23
+ static lineColumnToCharOffset(text: string, position: LineColumn): number;
24
+ /**
25
+ * Convert character offset to line/column position
26
+ *
27
+ * @param text - Source text
28
+ * @param charOffset - Character offset (0-based)
29
+ * @returns Line/column position (1-based) or null if invalid
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const text = "SELECT id\nFROM users";
34
+ * const position = TextPositionUtils.charOffsetToLineColumn(text, 10);
35
+ * console.log(position); // { line: 2, column: 1 }
36
+ * ```
37
+ */
38
+ static charOffsetToLineColumn(text: string, charOffset: number): LineColumn | null;
39
+ /**
40
+ * Check if a position is within text bounds
41
+ *
42
+ * @param text - Source text
43
+ * @param position - Line/column position (1-based)
44
+ * @returns True if position is valid
45
+ */
46
+ static isValidPosition(text: string, position: LineColumn): boolean;
47
+ /**
48
+ * Get the line at the specified line number
49
+ *
50
+ * @param text - Source text
51
+ * @param lineNumber - Line number (1-based)
52
+ * @returns Line content or null if invalid
53
+ */
54
+ static getLine(text: string, lineNumber: number): string | null;
55
+ /**
56
+ * Get the total number of lines in text
57
+ *
58
+ * @param text - Source text
59
+ * @returns Number of lines
60
+ */
61
+ static getLineCount(text: string): number;
62
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Utility functions for text position conversion and manipulation
3
+ *
4
+ * Provides centralized functionality for converting between different
5
+ * position representations commonly used in text processing and SQL parsing.
6
+ */
7
+ export class TextPositionUtils {
8
+ /**
9
+ * Convert line/column position to character offset
10
+ *
11
+ * @param text - Source text
12
+ * @param position - Line/column position (1-based)
13
+ * @returns Character offset (0-based) or -1 if invalid
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const text = "SELECT id\nFROM users";
18
+ * const charOffset = TextPositionUtils.lineColumnToCharOffset(text, { line: 2, column: 1 });
19
+ * console.log(charOffset); // 10 (position of 'F' in 'FROM')
20
+ * ```
21
+ */
22
+ static lineColumnToCharOffset(text, position) {
23
+ if (position.line < 1 || position.column < 1) {
24
+ return -1;
25
+ }
26
+ const lines = text.split('\n');
27
+ if (position.line > lines.length) {
28
+ return -1;
29
+ }
30
+ const targetLine = lines[position.line - 1];
31
+ if (position.column > targetLine.length + 1) {
32
+ return -1;
33
+ }
34
+ let offset = 0;
35
+ for (let i = 0; i < position.line - 1; i++) {
36
+ offset += lines[i].length + 1; // +1 for newline
37
+ }
38
+ offset += position.column - 1;
39
+ return offset;
40
+ }
41
+ /**
42
+ * Convert character offset to line/column position
43
+ *
44
+ * @param text - Source text
45
+ * @param charOffset - Character offset (0-based)
46
+ * @returns Line/column position (1-based) or null if invalid
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const text = "SELECT id\nFROM users";
51
+ * const position = TextPositionUtils.charOffsetToLineColumn(text, 10);
52
+ * console.log(position); // { line: 2, column: 1 }
53
+ * ```
54
+ */
55
+ static charOffsetToLineColumn(text, charOffset) {
56
+ if (charOffset < 0 || charOffset > text.length) {
57
+ return null;
58
+ }
59
+ const lines = text.split('\n');
60
+ let currentOffset = 0;
61
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
62
+ const lineLength = lines[lineIndex].length;
63
+ if (charOffset < currentOffset + lineLength) {
64
+ return {
65
+ line: lineIndex + 1,
66
+ column: charOffset - currentOffset + 1
67
+ };
68
+ }
69
+ if (charOffset === currentOffset + lineLength && lineIndex < lines.length - 1) {
70
+ return {
71
+ line: lineIndex + 2,
72
+ column: 1
73
+ };
74
+ }
75
+ currentOffset += lineLength + 1; // +1 for newline
76
+ }
77
+ // Handle position at very end
78
+ if (charOffset === text.length) {
79
+ const lastLine = lines[lines.length - 1];
80
+ return {
81
+ line: lines.length,
82
+ column: lastLine.length + 1
83
+ };
84
+ }
85
+ return null;
86
+ }
87
+ /**
88
+ * Check if a position is within text bounds
89
+ *
90
+ * @param text - Source text
91
+ * @param position - Line/column position (1-based)
92
+ * @returns True if position is valid
93
+ */
94
+ static isValidPosition(text, position) {
95
+ return this.lineColumnToCharOffset(text, position) !== -1;
96
+ }
97
+ /**
98
+ * Get the line at the specified line number
99
+ *
100
+ * @param text - Source text
101
+ * @param lineNumber - Line number (1-based)
102
+ * @returns Line content or null if invalid
103
+ */
104
+ static getLine(text, lineNumber) {
105
+ if (lineNumber < 1) {
106
+ return null;
107
+ }
108
+ const lines = text.split('\n');
109
+ if (lineNumber > lines.length) {
110
+ return null;
111
+ }
112
+ return lines[lineNumber - 1];
113
+ }
114
+ /**
115
+ * Get the total number of lines in text
116
+ *
117
+ * @param text - Source text
118
+ * @returns Number of lines
119
+ */
120
+ static getLineCount(text) {
121
+ return text.split('\n').length;
122
+ }
123
+ }
124
+ //# sourceMappingURL=TextPositionUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextPositionUtils.js","sourceRoot":"","sources":["../../../../src/utils/TextPositionUtils.ts"],"names":[],"mappings":"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"}