@pgsql/cli
Version:
Unified CLI for PostgreSQL AST parsing, deparsing, and code generation
251 lines (182 loc) • 8.85 kB
Markdown
# @pgsql/cli
<p align="center" width="100%">
<img height="250" src="https://raw.githubusercontent.com/constructive-io/constructive/refs/heads/main/assets/outline-logo.svg" />
</p>
<p align="center" width="100%">
<a href="https://github.com/constructive-io/pgsql-parser/actions/workflows/run-tests.yaml">
<img height="20" src="https://github.com/constructive-io/pgsql-parser/actions/workflows/run-tests.yaml/badge.svg" />
</a>
<a href="https://github.com/constructive-io/pgsql-parser/blob/main/LICENSE"><img height="20" src="https://img.shields.io/badge/license-MIT-blue.svg"></a>
</p>
`@pgsql/cli` is a unified command-line interface for PostgreSQL AST operations, including parsing SQL to AST, deparsing AST back to SQL, and generating TypeScript definitions from PostgreSQL protobufs. It consolidates functionality from multiple packages into a single, easy-to-use CLI tool.
## Installation
```bash
npm install -g @pgsql/cli
```
## Features
- **Parse SQL to AST**: Convert PostgreSQL queries into Abstract Syntax Trees
- **Deparse AST to SQL**: Convert AST back into SQL queries
- **Generate TypeScript from Protobuf**: Create type-safe TypeScript definitions from PostgreSQL protobuf files
- **Download and Process Proto Files**: Fetch proto files from URLs and generate JavaScript
- **Runtime Schema Generation**: Generate runtime schemas for AST nodes
- **Unified Interface**: Single CLI tool for all PostgreSQL AST operations
## Quick Start
```bash
# Parse SQL to AST
pgsql parse query.sql
# Deparse AST back to SQL
pgsql deparse ast.json
# Generate TypeScript from protobuf
pgsql proto-gen --inFile pg_query.proto --outDir out --types --enums
# Download and process proto file
pgsql proto-fetch --url https://raw.githubusercontent.com/pganalyze/libpg_query/16-latest/protobuf/pg_query.proto --inFile pg_query.proto --outFile pg_query.js
```
## Commands
### `pgsql parse`
Parse SQL files into Abstract Syntax Trees (AST).
```bash
pgsql parse <sqlfile> [options]
```
#### Options
| Option | Description | Default |
|---------------------|------------------------------------------------------|------------|
| `-o, --output` | Output to file instead of stdout | |
| `-f, --format` | Output format: `json`, `pretty` | `pretty` |
| `--pl` | Parse as PL/pgSQL function only | `false` |
| `--clean` | Clean the AST tree (remove location info) | `false` |
| `-h, --help` | Show help | |
#### Examples
```bash
# Parse SQL and output to console
pgsql parse query.sql
# Parse SQL and save to file
pgsql parse query.sql -o ast.json
# Parse PL/pgSQL function
pgsql parse function.sql --pl
# Parse and output compact JSON
pgsql parse query.sql --format json
```
### `pgsql deparse`
Convert AST back to SQL.
```bash
pgsql deparse [options]
```
#### Options
| Option | Description | Default |
|---------------------|------------------------------------------------------|------------|
| `-i, --input` | Input JSON file (or use stdin) | |
| `-o, --output` | Output to file instead of stdout | |
| `-h, --help` | Show help | |
#### Examples
```bash
# Deparse from file
pgsql deparse -i ast.json
# Deparse from stdin
cat ast.json | pgsql deparse
# Parse and deparse in one line
pgsql parse query.sql | pgsql deparse
# Deparse to file
pgsql deparse -i ast.json -o query.sql
```
### `pgsql proto-gen`
Generate TypeScript definitions from PostgreSQL protobuf files.
```bash
pgsql proto-gen --inFile <proto> --outDir <dir> [options]
```
#### Options
| Option | Description | Default |
|-----------------------|------------------------------------------------------|------------|
| `--inFile` | Input .proto file | *Required* |
| `--outDir` | Output directory | *Required* |
| `--enums` | Generate TypeScript enums | `false` |
| `--enums-json` | Generate JSON enum mappings | `false` |
| `--types` | Generate TypeScript interfaces | `false` |
| `--utils` | Generate utility functions | `false` |
| `--ast-helpers` | Generate AST helper methods | `false` |
| `--wrapped-helpers` | Generate wrapped AST helpers | `false` |
| `--optional` | Make all fields optional | `false` |
| `--keep-case` | Keep original field casing | `false` |
| `--remove-undefined` | Remove UNDEFINED enum at position 0 | `false` |
| `-h, --help` | Show help | |
#### Examples
```bash
# Generate types and enums
pgsql proto-gen --inFile pg_query.proto --outDir out --types --enums
# Generate everything
pgsql proto-gen --inFile pg_query.proto --outDir out --types --enums --utils --ast-helpers
# Generate with optional fields
pgsql proto-gen --inFile pg_query.proto --outDir out --types --optional
```
### `pgsql proto-fetch`
Download and process proto files.
```bash
pgsql proto-fetch [options]
```
#### Options
| Option | Description | Default |
|---------------------|------------------------------------------------------|--------------------------------|
| `--url` | Proto file URL to download | |
| `--inFile` | Where to save the proto file | *Required* |
| `--outFile` | Generated JS output file | *Required* |
| `--replace-pkg` | Original package name to replace | `protobufjs/minimal` |
| `--with-pkg` | New package name | `@launchql/protobufjs/minimal` |
| `-h, --help` | Show help | |
#### Examples
```bash
# Download and process proto file
pgsql proto-fetch \
--url https://raw.githubusercontent.com/pganalyze/libpg_query/16-latest/protobuf/pg_query.proto \
--inFile pg_query.proto \
--outFile pg_query.js
# Process existing proto file
pgsql proto-fetch \
--inFile pg_query.proto \
--outFile pg_query.js \
--replace-pkg "protobufjs/minimal" \
--with-pkg "@custom/protobufjs"
```
### `pgsql runtime-schema`
Generate runtime schema for AST nodes.
```bash
pgsql runtime-schema --inFile <proto> --outDir <dir> [options]
```
#### Options
| Option | Description | Default |
|---------------------|------------------------------------------------------|-------------------|
| `--inFile` | Input .proto file | *Required* |
| `--outDir` | Output directory | *Required* |
| `--format` | Output format: `json`, `typescript` | `json` |
| `--filename` | Output filename (without extension) | `runtime-schema` |
| `-h, --help` | Show help | |
#### Examples
```bash
# Generate JSON schema
pgsql runtime-schema --inFile pg_query.proto --outDir out
# Generate TypeScript schema
pgsql runtime-schema --inFile pg_query.proto --outDir out --format typescript
# Custom filename
pgsql runtime-schema --inFile pg_query.proto --outDir out --filename ast-schema
```
## Migration Guide
### Migrating from `pgsql-parser` CLI
If you were using the `pgsql-parser` command-line tool:
```bash
# Old
pgsql-parser file.sql
pgsql-parser file.sql --pl
# New
pgsql parse file.sql
pgsql parse file.sql --pl
```
### Migrating from `pg-proto-parser`
If you were using the `pg-proto-parser` command-line tool:
```bash
# Old
pg-proto-parser codegen --inFile pg_query.proto --outDir out
# New
pgsql proto-gen --inFile pg_query.proto --outDir out
```
The command options remain largely the same, with some improvements:
- `codegen` → `proto-gen`
- `protogen` → `proto-fetch`
- Boolean flags now use kebab-case (e.g., `--enumsJSON` → `--enums-json`)