TypeScript/JavaScript SDK
The Wvlet TypeScript SDK provides a native JavaScript implementation of the Wvlet compiler, allowing you to compile Wvlet queries to SQL directly in Node.js or browser environments.
Installation
npm install @wvlet/wvlet
# or
yarn add @wvlet/wvlet
# or
pnpm add @wvlet/wvlet
Quick Start
import { WvletCompiler } from '@wvlet/wvlet';
const compiler = new WvletCompiler();
const sql = compiler.compile('from users select name, email');
console.log(sql);
// Output: SELECT name, email FROM users
Features
- Pure JavaScript: Compiled from Scala.js, no native dependencies required
- Type Safety: Full TypeScript support with comprehensive type definitions
- Browser Support: Works in both Node.js and modern browsers
- Multiple Targets: Support for DuckDB and Trino SQL dialects
- Detailed Errors: Rich error messages with source location information
- Small API Surface: Simple and intuitive API design
Usage
Basic Usage
import { WvletCompiler } from '@wvlet/wvlet';
// Create a compiler instance
const compiler = new WvletCompiler({
target: 'duckdb' // or 'trino'
});
// Compile queries
const sql = compiler.compile('from orders where total > 100 select *');
Error Handling
import { WvletCompiler, CompilationError } from '@wvlet/wvlet';
const compiler = new WvletCompiler();
try {
const sql = compiler.compile('invalid query syntax');
} catch (error) {
if (error instanceof CompilationError) {
console.error(`Error: ${error.message}`);
console.error(`Status: ${error.statusCode}`);
if (error.location) {
console.error(`Location: line ${error.location.line}, column ${error.location.column}`);
}
}
}
Convenience Function
import { compile } from '@wvlet/wvlet';
// Quick compilation with default settings
const sql = compile('from users select count(*)');
API Reference
WvletCompiler
The main compiler class for Wvlet queries.
Constructor
new WvletCompiler(options?: CompileOptions)
Options:
target
: Target SQL dialect ('duckdb'
|'trino'
). Default:'duckdb'
profile
: Profile name for configuration
Methods
compile(query: string, options?: CompileOptions): string
Compiles a Wvlet query to SQL.
Parameters:
query
: The Wvlet query stringoptions
: Optional compilation options to override defaults
Returns: The compiled SQL string
Throws: CompilationError
if the query is invalid
static getVersion(): string
Returns the version of the Wvlet compiler.
Types
CompileOptions
interface CompileOptions {
target?: 'duckdb' | 'trino';
profile?: string;
}
CompilationError
class CompilationError extends Error {
statusCode: string;
location?: ErrorLocation;
}
ErrorLocation
interface ErrorLocation {
path: string;
fileName: string;
line: number; // 1-based
column: number; // 1-based
lineContent?: string;
}
Examples
Query with JOIN
const sql = compiler.compile(`
from users u
join orders o on u.id = o.user_id
select u.name, count(*) as order_count
group by u.name
`);
Query with CTE
const sql = compiler.compile(`
with recent_orders as (
from orders
where created_at > current_date - interval '7 days'
select *
)
from recent_orders
select customer_id, sum(total) as weekly_total
group by customer_id
`);
Window Functions
const sql = compiler.compile(`
from sales
select
product_id,
sale_date,
amount,
sum(amount) over (partition by product_id order by sale_date) as running_total
`);
Browser Usage
The SDK works directly in browsers that support ES modules:
<script type="module">
import { WvletCompiler } from 'https://unpkg.com/@wvlet/wvlet/dist/index.js';
const compiler = new WvletCompiler();
const sql = compiler.compile('from users select *');
console.log(sql);
</script>
Performance Considerations
- Bundle Size: The compiled Scala.js output is approximately 9MB (uncompressed)
- Compilation Speed: Compilation is performed synchronously and is typically fast for most queries
- Memory Usage: The compiler maintains minimal state between compilations
Differences from Python SDK
Unlike the Python SDK which uses a native library, the TypeScript SDK:
- Runs purely in JavaScript (via Scala.js compilation)
- Works in browser environments
- Has no native dependencies
- Provides synchronous-only API
Troubleshooting
Module Resolution Issues
If you encounter module resolution issues, ensure your tsconfig.json
includes:
{
"compilerOptions": {
"moduleResolution": "node",
"esModuleInterop": true
}
}
Browser Compatibility
The SDK requires browsers that support:
- ES2020 features
- ES modules
- Dynamic imports (for code splitting)
Source Code
The TypeScript SDK source code is available at: