UNPKG

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
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; }