rawsql-ts
Version:
[beta]High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.
128 lines (127 loc) • 4.25 kB
TypeScript
import { SelectQuery } from '../models/SelectQuery';
/**
* Information about a table available in the current scope
*/
export interface AvailableTable {
/** Table name (unqualified) */
name: string;
/** Table alias (if any) */
alias?: string;
/** Schema name (if qualified) */
schema?: string;
/** Full qualified name */
fullName: string;
/** Source type: 'table', 'cte', 'subquery' */
sourceType: 'table' | 'cte' | 'subquery';
/** Original table reference for subqueries */
originalQuery?: SelectQuery;
}
/**
* Information about a CTE available in the current scope
*/
export interface AvailableCTE {
/** CTE name */
name: string;
/** Column names if determinable */
columns?: string[];
/** The CTE query definition */
query: SelectQuery;
/** Whether the CTE is materialized */
materialized?: boolean;
}
/**
* Information about columns available for a specific table
*/
export interface AvailableColumn {
/** Column name */
name: string;
/** Table name the column belongs to */
tableName: string;
/** Table alias (if any) */
tableAlias?: string;
/** Data type (if known) */
type?: string;
/** Whether column is nullable */
nullable?: boolean;
/** Full qualified column reference */
fullReference: string;
}
/**
* Complete scope information at a cursor position
*/
export interface ScopeInfo {
/** Tables available at the current position */
availableTables: AvailableTable[];
/** CTEs available at the current position */
availableCTEs: AvailableCTE[];
/** Nesting level (0 = root query) */
subqueryLevel: number;
/** Columns visible from all tables in scope */
visibleColumns: AvailableColumn[];
/** Current query being analyzed */
currentQuery?: SelectQuery;
/** Parent queries (for nested contexts) */
parentQueries: SelectQuery[];
}
/**
* Resolves scope information at cursor positions for SQL IntelliSense
*
* Provides comprehensive scope analysis including table availability, CTE resolution,
* and column visibility for intelligent code completion suggestions.
*
* @example
* ```typescript
* const sql = `
* WITH users AS (SELECT id, name FROM accounts)
* SELECT u.name FROM users u
* LEFT JOIN orders o ON u.id = o.user_id
* WHERE u.|
* `;
* const scope = ScopeResolver.resolveAt(sql, { line: 4, column: 12 });
*
* console.log(scope.availableTables); // [{ name: 'users', alias: 'u' }, { name: 'orders', alias: 'o' }]
* console.log(scope.availableCTEs); // [{ name: 'users', columns: ['id', 'name'] }]
* ```
*/
export declare class ScopeResolver {
/**
* Resolve scope information at the specified cursor position
*
* @param sql - SQL text to analyze
* @param cursorPosition - Character position of cursor (0-based)
* @returns Complete scope information
*/
static resolve(sql: string, cursorPosition: number): ScopeInfo;
/**
* Resolve scope information at line/column position
*
* @param sql - SQL text to analyze
* @param position - Line and column position (1-based)
* @returns Complete scope information
*/
static resolveAt(sql: string, position: {
line: number;
column: number;
}): ScopeInfo;
/**
* Get available columns for a specific table or alias
*
* @param sql - SQL text containing the query
* @param cursorPosition - Cursor position for scope resolution
* @param tableOrAlias - Table name or alias to get columns for
* @returns Array of available columns for the specified table
*/
static getColumnsForTable(sql: string, cursorPosition: number, tableOrAlias: string): AvailableColumn[];
private static analyzeScopeFromQuery;
private static collectCTEs;
private static collectTablesFromQuery;
private static extractTablesFromFromClause;
private static extractTablesFromJoin;
private static getQualifiedNameString;
private static extractTableName;
private static extractSchemaName;
private static extractCTEColumns;
private static extractColumnNameFromExpression;
private static collectVisibleColumns;
private static createEmptyScope;
}