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.
- package/dist/esm/index.js +28 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +52 -36
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/src/formatters/OriginalFormatRestorer.d.ts +40 -0
- package/dist/esm/src/formatters/OriginalFormatRestorer.js +135 -0
- package/dist/esm/src/formatters/OriginalFormatRestorer.js.map +1 -0
- package/dist/esm/src/index.d.ts +32 -0
- package/dist/esm/src/index.js +28 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/models/FormattingLexeme.d.ts +66 -0
- package/dist/esm/src/models/FormattingLexeme.js +2 -0
- package/dist/esm/src/models/FormattingLexeme.js.map +1 -0
- package/dist/esm/src/models/ValueComponent.d.ts +3 -1
- package/dist/esm/src/models/ValueComponent.js +3 -1
- package/dist/esm/src/models/ValueComponent.js.map +1 -1
- package/dist/esm/src/parsers/FunctionExpressionParser.d.ts +12 -0
- package/dist/esm/src/parsers/FunctionExpressionParser.js +111 -7
- package/dist/esm/src/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/esm/src/parsers/KeywordParser.d.ts +1 -0
- package/dist/esm/src/parsers/KeywordParser.js +10 -4
- package/dist/esm/src/parsers/KeywordParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlPrintTokenParser.js +8 -0
- package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlTokenizer.d.ts +42 -2
- package/dist/esm/src/parsers/SqlTokenizer.js +213 -12
- package/dist/esm/src/parsers/SqlTokenizer.js.map +1 -1
- package/dist/esm/src/tokenReaders/CommandTokenReader.d.ts +3 -0
- package/dist/esm/src/tokenReaders/CommandTokenReader.js +9 -1
- package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/AliasRenamer.d.ts +199 -0
- package/dist/esm/src/transformers/AliasRenamer.js +595 -0
- package/dist/esm/src/transformers/AliasRenamer.js.map +1 -0
- package/dist/esm/src/transformers/CTEBuilder.js +2 -2
- package/dist/esm/src/transformers/CTEBuilder.js.map +1 -1
- package/dist/esm/src/transformers/CTERenamer.d.ts +53 -0
- package/dist/esm/src/transformers/CTERenamer.js +138 -0
- package/dist/esm/src/transformers/CTERenamer.js.map +1 -1
- package/dist/esm/src/transformers/DynamicQueryBuilder.d.ts +72 -0
- package/dist/esm/src/transformers/DynamicQueryBuilder.js +42 -0
- package/dist/esm/src/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/esm/src/transformers/FilterableItemCollector.d.ts +80 -0
- package/dist/esm/src/transformers/FilterableItemCollector.js +254 -0
- package/dist/esm/src/transformers/FilterableItemCollector.js.map +1 -0
- package/dist/esm/src/transformers/SelectableColumnCollector.d.ts +3 -0
- package/dist/esm/src/transformers/SelectableColumnCollector.js +68 -7
- package/dist/esm/src/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/esm/src/transformers/SmartRenamer.d.ts +134 -0
- package/dist/esm/src/transformers/SmartRenamer.js +430 -0
- package/dist/esm/src/transformers/SmartRenamer.js.map +1 -0
- package/dist/esm/src/transformers/SqlIdentifierRenamer.d.ts +150 -0
- package/dist/esm/src/transformers/SqlIdentifierRenamer.js +493 -0
- package/dist/esm/src/transformers/SqlIdentifierRenamer.js.map +1 -0
- package/dist/esm/src/transformers/SqlParamInjector.d.ts +27 -0
- package/dist/esm/src/transformers/SqlParamInjector.js +304 -16
- package/dist/esm/src/transformers/SqlParamInjector.js.map +1 -1
- package/dist/esm/src/transformers/SqlSortInjector.js +6 -3
- package/dist/esm/src/transformers/SqlSortInjector.js.map +1 -1
- package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js +5 -2
- package/dist/esm/src/transformers/UpstreamSelectQueryFinder.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/LexemeCursor.d.ts +41 -0
- package/dist/esm/src/utils/LexemeCursor.js +93 -0
- package/dist/esm/src/utils/LexemeCursor.js.map +1 -1
- 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 +52 -36
- package/dist/index.min.js.map +4 -4
- package/dist/src/formatters/OriginalFormatRestorer.d.ts +40 -0
- package/dist/src/formatters/OriginalFormatRestorer.js +139 -0
- package/dist/src/formatters/OriginalFormatRestorer.js.map +1 -0
- package/dist/src/index.d.ts +32 -0
- package/dist/src/index.js +30 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/models/FormattingLexeme.d.ts +66 -0
- package/dist/src/models/FormattingLexeme.js +3 -0
- package/dist/src/models/FormattingLexeme.js.map +1 -0
- package/dist/src/models/ValueComponent.d.ts +3 -1
- package/dist/src/models/ValueComponent.js +3 -1
- package/dist/src/models/ValueComponent.js.map +1 -1
- package/dist/src/parsers/FunctionExpressionParser.d.ts +12 -0
- package/dist/src/parsers/FunctionExpressionParser.js +110 -6
- package/dist/src/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/src/parsers/KeywordParser.d.ts +1 -0
- package/dist/src/parsers/KeywordParser.js +10 -4
- package/dist/src/parsers/KeywordParser.js.map +1 -1
- package/dist/src/parsers/SqlPrintTokenParser.js +8 -0
- package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/src/parsers/SqlTokenizer.d.ts +42 -2
- package/dist/src/parsers/SqlTokenizer.js +222 -12
- package/dist/src/parsers/SqlTokenizer.js.map +1 -1
- package/dist/src/tokenReaders/CommandTokenReader.d.ts +3 -0
- package/dist/src/tokenReaders/CommandTokenReader.js +10 -2
- package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/src/transformers/AliasRenamer.d.ts +199 -0
- package/dist/src/transformers/AliasRenamer.js +599 -0
- package/dist/src/transformers/AliasRenamer.js.map +1 -0
- package/dist/src/transformers/CTEBuilder.js +2 -2
- package/dist/src/transformers/CTEBuilder.js.map +1 -1
- package/dist/src/transformers/CTERenamer.d.ts +53 -0
- package/dist/src/transformers/CTERenamer.js +138 -0
- package/dist/src/transformers/CTERenamer.js.map +1 -1
- package/dist/src/transformers/DynamicQueryBuilder.d.ts +72 -0
- package/dist/src/transformers/DynamicQueryBuilder.js +42 -0
- package/dist/src/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/src/transformers/FilterableItemCollector.d.ts +80 -0
- package/dist/src/transformers/FilterableItemCollector.js +259 -0
- package/dist/src/transformers/FilterableItemCollector.js.map +1 -0
- package/dist/src/transformers/SelectableColumnCollector.d.ts +3 -0
- package/dist/src/transformers/SelectableColumnCollector.js +67 -6
- package/dist/src/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/src/transformers/SmartRenamer.d.ts +134 -0
- package/dist/src/transformers/SmartRenamer.js +442 -0
- package/dist/src/transformers/SmartRenamer.js.map +1 -0
- package/dist/src/transformers/SqlIdentifierRenamer.d.ts +150 -0
- package/dist/src/transformers/SqlIdentifierRenamer.js +497 -0
- package/dist/src/transformers/SqlIdentifierRenamer.js.map +1 -0
- package/dist/src/transformers/SqlParamInjector.d.ts +27 -0
- package/dist/src/transformers/SqlParamInjector.js +303 -15
- package/dist/src/transformers/SqlParamInjector.js.map +1 -1
- package/dist/src/transformers/SqlSortInjector.js +5 -2
- package/dist/src/transformers/SqlSortInjector.js.map +1 -1
- package/dist/src/transformers/UpstreamSelectQueryFinder.js +4 -1
- package/dist/src/transformers/UpstreamSelectQueryFinder.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/LexemeCursor.d.ts +41 -0
- package/dist/src/utils/LexemeCursor.js +93 -0
- package/dist/src/utils/LexemeCursor.js.map +1 -1
- 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,70 @@
|
|
1
|
+
import { Lexeme } from '../models/Lexeme';
|
2
|
+
import { LineColumn } from './LexemeCursor';
|
3
|
+
/**
|
4
|
+
* IntelliSense context focused on what suggestions can be provided
|
5
|
+
*/
|
6
|
+
export interface IntelliSenseContext {
|
7
|
+
/** Whether to suggest table names (can provide actual table list) */
|
8
|
+
suggestTables: boolean;
|
9
|
+
/** Whether to suggest column names (can provide actual column list) */
|
10
|
+
suggestColumns: boolean;
|
11
|
+
/** Whether to suggest SQL keywords (can provide keyword list) */
|
12
|
+
suggestKeywords: boolean;
|
13
|
+
/** If suggesting columns, limit to this table's columns (for table.| syntax) */
|
14
|
+
tableScope?: string;
|
15
|
+
/** If suggesting keywords, these specific keywords are required */
|
16
|
+
requiredKeywords?: string[];
|
17
|
+
/** Token at cursor position (if any) */
|
18
|
+
currentToken?: Lexeme;
|
19
|
+
/** Token immediately before cursor position */
|
20
|
+
previousToken?: Lexeme;
|
21
|
+
}
|
22
|
+
export declare class CursorContextAnalyzer {
|
23
|
+
/**
|
24
|
+
* Cache for processed keyword patterns
|
25
|
+
*/
|
26
|
+
private static patternCache;
|
27
|
+
/**
|
28
|
+
* Process existing dictionaries into IntelliSense-friendly patterns
|
29
|
+
* Single source of truth: existing CommandTokenReader dictionaries
|
30
|
+
*/
|
31
|
+
private static getKeywordPatterns;
|
32
|
+
/**
|
33
|
+
* Extract all keyword patterns from the existing dictionaries
|
34
|
+
*/
|
35
|
+
private static extractKeywordPatterns;
|
36
|
+
/**
|
37
|
+
* Check if a keyword exists in the command dictionaries using existing parsers
|
38
|
+
*/
|
39
|
+
private static isKeywordInDictionary;
|
40
|
+
/**
|
41
|
+
* Extract all keywords that require specific followup keywords
|
42
|
+
*/
|
43
|
+
private static extractRequiresKeywordPatterns;
|
44
|
+
/**
|
45
|
+
* Find all possible followup keywords for a given word using KeywordCache
|
46
|
+
*/
|
47
|
+
private static findPossibleFollowups;
|
48
|
+
/**
|
49
|
+
* Helper function to check if a token requires specific keywords
|
50
|
+
*/
|
51
|
+
private static requiresSpecificKeywords;
|
52
|
+
/**
|
53
|
+
* Analyze cursor position for IntelliSense suggestions
|
54
|
+
*
|
55
|
+
* Direct implementation that determines what suggestions can be provided
|
56
|
+
* without legacy context conversion overhead.
|
57
|
+
*
|
58
|
+
* @param sql - SQL text to analyze
|
59
|
+
* @param cursorPosition - Character position (0-based)
|
60
|
+
* @returns IntelliSense context focused on what suggestions can be provided
|
61
|
+
*/
|
62
|
+
static analyzeIntelliSense(sql: string, cursorPosition: number): IntelliSenseContext;
|
63
|
+
/**
|
64
|
+
* Analyze cursor position for IntelliSense at line/column position
|
65
|
+
*/
|
66
|
+
static analyzeIntelliSenseAt(sql: string, position: LineColumn): IntelliSenseContext;
|
67
|
+
private static isAfterDot;
|
68
|
+
private static findPrecedingIdentifier;
|
69
|
+
private static isIdentifier;
|
70
|
+
}
|
@@ -0,0 +1,338 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.CursorContextAnalyzer = void 0;
|
4
|
+
const LexemeCursor_1 = require("./LexemeCursor");
|
5
|
+
const TextPositionUtils_1 = require("./TextPositionUtils");
|
6
|
+
const KeywordCache_1 = require("./KeywordCache");
|
7
|
+
class CursorContextAnalyzer {
|
8
|
+
/**
|
9
|
+
* Process existing dictionaries into IntelliSense-friendly patterns
|
10
|
+
* Single source of truth: existing CommandTokenReader dictionaries
|
11
|
+
*/
|
12
|
+
static getKeywordPatterns() {
|
13
|
+
if (this.patternCache !== null) {
|
14
|
+
return this.patternCache;
|
15
|
+
}
|
16
|
+
const requiresKeywords = new Map();
|
17
|
+
const suggestsTables = new Set();
|
18
|
+
const suggestsColumns = new Set();
|
19
|
+
// Extract all patterns by systematically testing the dictionaries
|
20
|
+
this.extractKeywordPatterns(requiresKeywords, suggestsTables, suggestsColumns);
|
21
|
+
// Cache the processed patterns
|
22
|
+
this.patternCache = {
|
23
|
+
requiresKeywords,
|
24
|
+
suggestsTables,
|
25
|
+
suggestsColumns
|
26
|
+
};
|
27
|
+
return this.patternCache;
|
28
|
+
}
|
29
|
+
/**
|
30
|
+
* Extract all keyword patterns from the existing dictionaries
|
31
|
+
*/
|
32
|
+
static extractKeywordPatterns(requiresKeywords, suggestsTables, suggestsColumns) {
|
33
|
+
// Define SQL contexts and their expected behavior
|
34
|
+
const tableContexts = ['from', 'join']; // Keywords that introduce table names
|
35
|
+
const columnContexts = ['select', 'where', 'on', 'having', 'by']; // Keywords that introduce columns
|
36
|
+
// Check table context keywords
|
37
|
+
for (const keyword of tableContexts) {
|
38
|
+
if (this.isKeywordInDictionary(keyword)) {
|
39
|
+
suggestsTables.add(keyword);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
// Check column context keywords
|
43
|
+
for (const keyword of columnContexts) {
|
44
|
+
if (this.isKeywordInDictionary(keyword)) {
|
45
|
+
suggestsColumns.add(keyword);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
// Extract all keyword patterns that require followups
|
49
|
+
this.extractRequiresKeywordPatterns(requiresKeywords);
|
50
|
+
}
|
51
|
+
/**
|
52
|
+
* Check if a keyword exists in the command dictionaries using existing parsers
|
53
|
+
*/
|
54
|
+
static isKeywordInDictionary(keyword) {
|
55
|
+
// Use KeywordCache for JOIN keywords
|
56
|
+
if (KeywordCache_1.KeywordCache.isValidJoinKeyword(keyword)) {
|
57
|
+
return true;
|
58
|
+
}
|
59
|
+
// Check if keyword exists in command dictionary
|
60
|
+
// Since we can't directly query the trie, use known keyword list
|
61
|
+
const knownKeywords = ['from', 'join', 'select', 'where', 'on', 'having', 'by', 'group', 'order'];
|
62
|
+
return knownKeywords.includes(keyword);
|
63
|
+
}
|
64
|
+
/**
|
65
|
+
* Extract all keywords that require specific followup keywords
|
66
|
+
*/
|
67
|
+
static extractRequiresKeywordPatterns(requiresKeywords) {
|
68
|
+
// Test all potential first words that might require followup keywords
|
69
|
+
const potentialFirstWords = [
|
70
|
+
// JOIN modifiers
|
71
|
+
'inner', 'left', 'right', 'full', 'cross', 'natural', 'outer',
|
72
|
+
// Other composite keywords
|
73
|
+
'group', 'order'
|
74
|
+
];
|
75
|
+
for (const word of potentialFirstWords) {
|
76
|
+
const possibleFollowups = this.findPossibleFollowups(word);
|
77
|
+
if (possibleFollowups.length > 0) {
|
78
|
+
requiresKeywords.set(word, possibleFollowups);
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
/**
|
83
|
+
* Find all possible followup keywords for a given word using KeywordCache
|
84
|
+
*/
|
85
|
+
static findPossibleFollowups(word) {
|
86
|
+
const followups = new Set();
|
87
|
+
// Use KeywordCache for JOIN-related suggestions
|
88
|
+
const joinSuggestions = KeywordCache_1.KeywordCache.getJoinSuggestions(word.toLowerCase());
|
89
|
+
joinSuggestions.forEach(s => followups.add(s.toUpperCase()));
|
90
|
+
// Use KeywordCache for command-related suggestions
|
91
|
+
const commandSuggestions = KeywordCache_1.KeywordCache.getCommandSuggestions(word.toLowerCase());
|
92
|
+
commandSuggestions.forEach(s => followups.add(s.toUpperCase()));
|
93
|
+
return Array.from(followups);
|
94
|
+
}
|
95
|
+
/**
|
96
|
+
* Helper function to check if a token requires specific keywords
|
97
|
+
*/
|
98
|
+
static requiresSpecificKeywords(tokenValue) {
|
99
|
+
const patterns = this.getKeywordPatterns();
|
100
|
+
const requiredKeywords = patterns.requiresKeywords.get(tokenValue);
|
101
|
+
if (requiredKeywords) {
|
102
|
+
return {
|
103
|
+
suggestKeywords: true,
|
104
|
+
requiredKeywords
|
105
|
+
};
|
106
|
+
}
|
107
|
+
return null;
|
108
|
+
}
|
109
|
+
/**
|
110
|
+
* Analyze cursor position for IntelliSense suggestions
|
111
|
+
*
|
112
|
+
* Direct implementation that determines what suggestions can be provided
|
113
|
+
* without legacy context conversion overhead.
|
114
|
+
*
|
115
|
+
* @param sql - SQL text to analyze
|
116
|
+
* @param cursorPosition - Character position (0-based)
|
117
|
+
* @returns IntelliSense context focused on what suggestions can be provided
|
118
|
+
*/
|
119
|
+
static analyzeIntelliSense(sql, cursorPosition) {
|
120
|
+
try {
|
121
|
+
// Get all lexemes with position information
|
122
|
+
const allLexemes = LexemeCursor_1.LexemeCursor.getAllLexemesWithPosition(sql);
|
123
|
+
// Find token at cursor position
|
124
|
+
let actualTokenIndex = -1;
|
125
|
+
let actualCurrentToken;
|
126
|
+
// Find the token that contains or precedes the cursor
|
127
|
+
for (let i = 0; i < allLexemes.length; i++) {
|
128
|
+
const lexeme = allLexemes[i];
|
129
|
+
if (!lexeme.position)
|
130
|
+
continue;
|
131
|
+
if (cursorPosition >= lexeme.position.startPosition &&
|
132
|
+
cursorPosition <= lexeme.position.endPosition) {
|
133
|
+
// Cursor is within this token
|
134
|
+
actualCurrentToken = lexeme;
|
135
|
+
actualTokenIndex = i;
|
136
|
+
break;
|
137
|
+
}
|
138
|
+
else if (lexeme.position.startPosition > cursorPosition) {
|
139
|
+
// Cursor is before this token (in whitespace)
|
140
|
+
actualTokenIndex = Math.max(0, i - 1);
|
141
|
+
actualCurrentToken = actualTokenIndex >= 0 ? allLexemes[actualTokenIndex] : undefined;
|
142
|
+
break;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
// If not found, cursor is after all tokens
|
146
|
+
if (actualTokenIndex === -1 && allLexemes.length > 0) {
|
147
|
+
actualTokenIndex = allLexemes.length - 1;
|
148
|
+
actualCurrentToken = allLexemes[actualTokenIndex];
|
149
|
+
}
|
150
|
+
const previousToken = actualTokenIndex > 0 ? allLexemes[actualTokenIndex - 1] : undefined;
|
151
|
+
// Check for dot completion (highest priority)
|
152
|
+
const isAfterDot = this.isAfterDot(sql, cursorPosition, previousToken);
|
153
|
+
if (isAfterDot) {
|
154
|
+
const precedingIdentifier = this.findPrecedingIdentifier(sql, cursorPosition, allLexemes);
|
155
|
+
return {
|
156
|
+
suggestTables: false,
|
157
|
+
suggestColumns: true,
|
158
|
+
suggestKeywords: false,
|
159
|
+
tableScope: precedingIdentifier,
|
160
|
+
currentToken: actualCurrentToken,
|
161
|
+
previousToken: previousToken
|
162
|
+
};
|
163
|
+
}
|
164
|
+
// Check for keywords that require additional keywords
|
165
|
+
if (actualCurrentToken) {
|
166
|
+
const currentValue = actualCurrentToken.value.toLowerCase();
|
167
|
+
const keywordRequirement = this.requiresSpecificKeywords(currentValue);
|
168
|
+
if (keywordRequirement) {
|
169
|
+
return {
|
170
|
+
suggestTables: false,
|
171
|
+
suggestColumns: false,
|
172
|
+
...keywordRequirement,
|
173
|
+
currentToken: actualCurrentToken,
|
174
|
+
previousToken: previousToken
|
175
|
+
};
|
176
|
+
}
|
177
|
+
}
|
178
|
+
// Check tokens for context-based suggestions
|
179
|
+
const tokenValue = actualCurrentToken === null || actualCurrentToken === void 0 ? void 0 : actualCurrentToken.value.toLowerCase();
|
180
|
+
const prevValue = previousToken === null || previousToken === void 0 ? void 0 : previousToken.value.toLowerCase();
|
181
|
+
// Check current token first (when cursor is at end of token)
|
182
|
+
if (tokenValue) {
|
183
|
+
const patterns = this.getKeywordPatterns();
|
184
|
+
// Keywords that suggest tables after them
|
185
|
+
if (patterns.suggestsTables.has(tokenValue)) {
|
186
|
+
return {
|
187
|
+
suggestTables: true,
|
188
|
+
suggestColumns: false,
|
189
|
+
suggestKeywords: false,
|
190
|
+
currentToken: actualCurrentToken,
|
191
|
+
previousToken: previousToken
|
192
|
+
};
|
193
|
+
}
|
194
|
+
// Keywords that suggest columns after them
|
195
|
+
if (patterns.suggestsColumns.has(tokenValue)) {
|
196
|
+
return {
|
197
|
+
suggestTables: false,
|
198
|
+
suggestColumns: true,
|
199
|
+
suggestKeywords: false,
|
200
|
+
currentToken: actualCurrentToken,
|
201
|
+
previousToken: previousToken
|
202
|
+
};
|
203
|
+
}
|
204
|
+
}
|
205
|
+
// Check previous token (when cursor is in whitespace after token)
|
206
|
+
if (prevValue) {
|
207
|
+
const patterns = this.getKeywordPatterns();
|
208
|
+
// Check if previous token requires specific keywords (and next token doesn't already fulfill it)
|
209
|
+
const keywordRequirement = this.requiresSpecificKeywords(prevValue);
|
210
|
+
if (keywordRequirement && tokenValue !== 'join' && tokenValue !== 'outer' && tokenValue !== 'by') {
|
211
|
+
return {
|
212
|
+
suggestTables: false,
|
213
|
+
suggestColumns: false,
|
214
|
+
...keywordRequirement,
|
215
|
+
currentToken: actualCurrentToken,
|
216
|
+
previousToken: previousToken
|
217
|
+
};
|
218
|
+
}
|
219
|
+
// Keywords that suggest tables
|
220
|
+
if (patterns.suggestsTables.has(prevValue)) {
|
221
|
+
return {
|
222
|
+
suggestTables: true,
|
223
|
+
suggestColumns: false,
|
224
|
+
suggestKeywords: false,
|
225
|
+
currentToken: actualCurrentToken,
|
226
|
+
previousToken: previousToken
|
227
|
+
};
|
228
|
+
}
|
229
|
+
// Keywords that suggest columns
|
230
|
+
if (patterns.suggestsColumns.has(prevValue)) {
|
231
|
+
return {
|
232
|
+
suggestTables: false,
|
233
|
+
suggestColumns: true,
|
234
|
+
suggestKeywords: false,
|
235
|
+
currentToken: actualCurrentToken,
|
236
|
+
previousToken: previousToken
|
237
|
+
};
|
238
|
+
}
|
239
|
+
}
|
240
|
+
// Default fallback - suggest keywords
|
241
|
+
return {
|
242
|
+
suggestTables: false,
|
243
|
+
suggestColumns: false,
|
244
|
+
suggestKeywords: true,
|
245
|
+
currentToken: actualCurrentToken,
|
246
|
+
previousToken: previousToken
|
247
|
+
};
|
248
|
+
}
|
249
|
+
catch (error) {
|
250
|
+
// Return minimal context on error
|
251
|
+
return {
|
252
|
+
suggestTables: false,
|
253
|
+
suggestColumns: false,
|
254
|
+
suggestKeywords: false,
|
255
|
+
};
|
256
|
+
}
|
257
|
+
}
|
258
|
+
/**
|
259
|
+
* Analyze cursor position for IntelliSense at line/column position
|
260
|
+
*/
|
261
|
+
static analyzeIntelliSenseAt(sql, position) {
|
262
|
+
const charOffset = TextPositionUtils_1.TextPositionUtils.lineColumnToCharOffset(sql, position);
|
263
|
+
if (charOffset === -1) {
|
264
|
+
return {
|
265
|
+
suggestTables: false,
|
266
|
+
suggestColumns: false,
|
267
|
+
suggestKeywords: false,
|
268
|
+
};
|
269
|
+
}
|
270
|
+
return this.analyzeIntelliSense(sql, charOffset);
|
271
|
+
}
|
272
|
+
static isAfterDot(sql, cursorPosition, previousToken) {
|
273
|
+
// Check if character before cursor is a dot
|
274
|
+
if (cursorPosition > 0 && sql[cursorPosition - 1] === '.') {
|
275
|
+
return true;
|
276
|
+
}
|
277
|
+
// Check if previous token is a dot
|
278
|
+
if (previousToken && previousToken.value === '.') {
|
279
|
+
return true;
|
280
|
+
}
|
281
|
+
// Check for dot in nearby characters (handle whitespace)
|
282
|
+
let pos = cursorPosition - 1;
|
283
|
+
while (pos >= 0 && /\s/.test(sql[pos])) {
|
284
|
+
pos--; // Skip whitespace backwards
|
285
|
+
}
|
286
|
+
if (pos >= 0 && sql[pos] === '.') {
|
287
|
+
return true;
|
288
|
+
}
|
289
|
+
return false;
|
290
|
+
}
|
291
|
+
static findPrecedingIdentifier(sql, cursorPosition, lexemes) {
|
292
|
+
// If cursor is after a dot, look for identifier before the dot
|
293
|
+
if (this.isAfterDot(sql, cursorPosition)) {
|
294
|
+
// Find dot position in SQL text
|
295
|
+
let pos = cursorPosition - 1;
|
296
|
+
while (pos >= 0 && /\s/.test(sql[pos])) {
|
297
|
+
pos--; // Skip whitespace backwards
|
298
|
+
}
|
299
|
+
if (pos >= 0 && sql[pos] === '.') {
|
300
|
+
// Found the dot, now look for identifier before it
|
301
|
+
let identifierEnd = pos;
|
302
|
+
while (pos >= 0 && /\s/.test(sql[pos])) {
|
303
|
+
pos--; // Skip whitespace
|
304
|
+
}
|
305
|
+
// Extract identifier backwards
|
306
|
+
while (pos >= 0 && /[a-zA-Z0-9_]/.test(sql[pos])) {
|
307
|
+
pos--;
|
308
|
+
}
|
309
|
+
const identifierStart = pos + 1;
|
310
|
+
if (identifierStart < identifierEnd) {
|
311
|
+
return sql.substring(identifierStart, identifierEnd);
|
312
|
+
}
|
313
|
+
}
|
314
|
+
// Fallback: try to find dot token in lexemes and get identifier before it
|
315
|
+
for (let i = lexemes.length - 1; i >= 0; i--) {
|
316
|
+
if (lexemes[i].value === '.' &&
|
317
|
+
lexemes[i].position &&
|
318
|
+
lexemes[i].position.startPosition < cursorPosition) {
|
319
|
+
// Found a dot before cursor, get identifier before it
|
320
|
+
if (i > 0 && this.isIdentifier(lexemes[i - 1])) {
|
321
|
+
return lexemes[i - 1].value;
|
322
|
+
}
|
323
|
+
break;
|
324
|
+
}
|
325
|
+
}
|
326
|
+
}
|
327
|
+
return undefined;
|
328
|
+
}
|
329
|
+
static isIdentifier(lexeme) {
|
330
|
+
return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(lexeme.value);
|
331
|
+
}
|
332
|
+
}
|
333
|
+
exports.CursorContextAnalyzer = CursorContextAnalyzer;
|
334
|
+
/**
|
335
|
+
* Cache for processed keyword patterns
|
336
|
+
*/
|
337
|
+
CursorContextAnalyzer.patternCache = null;
|
338
|
+
//# sourceMappingURL=CursorContextAnalyzer.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CursorContextAnalyzer.js","sourceRoot":"","sources":["../../../src/utils/CursorContextAnalyzer.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,114 @@
|
|
1
|
+
import { IntelliSenseContext } from './CursorContextAnalyzer';
|
2
|
+
import { ScopeInfo } from './ScopeResolver';
|
3
|
+
import { ParseToPositionOptions, PositionParseResult } from './PositionAwareParser';
|
4
|
+
import { QueryCollection } from './MultiQuerySplitter';
|
5
|
+
import { LineColumn } from './LexemeCursor';
|
6
|
+
/**
|
7
|
+
* Convenience API for SQL IntelliSense integration
|
8
|
+
*
|
9
|
+
* Provides simplified, high-level functions that combine the functionality
|
10
|
+
* of the various position-aware parsing components for easy integration
|
11
|
+
* with Monaco Editor and other code editors.
|
12
|
+
*
|
13
|
+
* @example
|
14
|
+
* ```typescript
|
15
|
+
* import { parseToPosition, getCursorContext, resolveScope, splitQueries } from 'rawsql-ts';
|
16
|
+
*
|
17
|
+
* // Parse incomplete SQL with error recovery
|
18
|
+
* const sql = "SELECT u.name FROM users u WHERE u.";
|
19
|
+
* const parseResult = parseToPosition(sql, sql.length, { errorRecovery: true });
|
20
|
+
*
|
21
|
+
* // Get cursor context for completion suggestions
|
22
|
+
* const context = getCursorContext(sql, sql.length);
|
23
|
+
* console.log(context.isAfterDot); // true
|
24
|
+
* console.log(context.precedingIdentifier); // "u"
|
25
|
+
*
|
26
|
+
* // Get scope information for table/column completion
|
27
|
+
* const scope = resolveScope(sql, sql.length);
|
28
|
+
* console.log(scope.availableTables); // [{ name: 'users', alias: 'u' }]
|
29
|
+
*
|
30
|
+
* // Handle multi-query editor
|
31
|
+
* const multiSQL = "SELECT 1; SELECT 2;";
|
32
|
+
* const queries = splitQueries(multiSQL);
|
33
|
+
* const activeQuery = queries.getActive(12); // Get query at position
|
34
|
+
* ```
|
35
|
+
*/
|
36
|
+
/**
|
37
|
+
* Parse SQL up to cursor position with error recovery
|
38
|
+
*
|
39
|
+
* Combines position-aware parsing with error recovery to handle incomplete SQL
|
40
|
+
* that users are actively typing. Ideal for providing IntelliSense in editors.
|
41
|
+
*
|
42
|
+
* @param sql - SQL text to parse
|
43
|
+
* @param cursorPosition - Cursor position (character offset or line/column)
|
44
|
+
* @param options - Parsing options including error recovery settings
|
45
|
+
* @returns Parse result with position-specific information
|
46
|
+
*/
|
47
|
+
export declare function parseToPosition(sql: string, cursorPosition: number | LineColumn, options?: ParseToPositionOptions): PositionParseResult;
|
48
|
+
/**
|
49
|
+
* Analyze cursor context for IntelliSense completion suggestions
|
50
|
+
*
|
51
|
+
* Determines what type of completions should be offered at the cursor position
|
52
|
+
* based on SQL syntax context (SELECT clause, WHERE condition, etc.).
|
53
|
+
*
|
54
|
+
* @param sql - SQL text to analyze
|
55
|
+
* @param cursorPosition - Cursor position (character offset or line/column)
|
56
|
+
* @returns Cursor context information for completion logic
|
57
|
+
*/
|
58
|
+
export declare function getCursorContext(sql: string, cursorPosition: number | LineColumn): IntelliSenseContext;
|
59
|
+
/**
|
60
|
+
* Resolve scope information at cursor position
|
61
|
+
*
|
62
|
+
* Provides comprehensive information about available tables, CTEs, and columns
|
63
|
+
* at the specified cursor position for intelligent completion suggestions.
|
64
|
+
*
|
65
|
+
* @param sql - SQL text to analyze
|
66
|
+
* @param cursorPosition - Cursor position (character offset or line/column)
|
67
|
+
* @returns Complete scope information including available tables and columns
|
68
|
+
*/
|
69
|
+
export declare function resolveScope(sql: string, cursorPosition: number | LineColumn): ScopeInfo;
|
70
|
+
/**
|
71
|
+
* Split multi-query SQL text into individual queries
|
72
|
+
*
|
73
|
+
* Handles SQL editors that contain multiple statements separated by semicolons.
|
74
|
+
* Properly handles string literals and comments containing semicolons.
|
75
|
+
*
|
76
|
+
* @param sql - Multi-query SQL text
|
77
|
+
* @returns Collection of individual queries with position information
|
78
|
+
*/
|
79
|
+
export declare function splitQueries(sql: string): QueryCollection;
|
80
|
+
/**
|
81
|
+
* Get IntelliSense information for a cursor position in multi-query context
|
82
|
+
*
|
83
|
+
* Combines query splitting, context analysis, and scope resolution to provide
|
84
|
+
* complete IntelliSense information for a cursor position in multi-query SQL.
|
85
|
+
*
|
86
|
+
* @param sql - Multi-query SQL text
|
87
|
+
* @param cursorPosition - Cursor position
|
88
|
+
* @param options - Parsing options
|
89
|
+
* @returns Complete IntelliSense information or undefined if position is invalid
|
90
|
+
*/
|
91
|
+
export declare function getIntelliSenseInfo(sql: string, cursorPosition: number | LineColumn, options?: ParseToPositionOptions): {
|
92
|
+
context: IntelliSenseContext;
|
93
|
+
scope: ScopeInfo;
|
94
|
+
parseResult: PositionParseResult;
|
95
|
+
currentQuery: string;
|
96
|
+
relativePosition: number;
|
97
|
+
} | undefined;
|
98
|
+
/**
|
99
|
+
* Get completion suggestions based on cursor context and scope
|
100
|
+
*
|
101
|
+
* Uses the new IntelliSense interface to provide targeted completion suggestions.
|
102
|
+
* This function leverages the suggestion-based design to efficiently determine
|
103
|
+
* what completions should be offered.
|
104
|
+
*
|
105
|
+
* @param sql - SQL text
|
106
|
+
* @param cursorPosition - Cursor position
|
107
|
+
* @returns Array of completion suggestions with context information
|
108
|
+
*/
|
109
|
+
export declare function getCompletionSuggestions(sql: string, cursorPosition: number | LineColumn): Array<{
|
110
|
+
type: 'keyword' | 'table' | 'column' | 'cte' | 'function';
|
111
|
+
value: string;
|
112
|
+
detail?: string;
|
113
|
+
documentation?: string;
|
114
|
+
}>;
|