UNPKG

@pgsql/cli

Version:

Unified CLI for PostgreSQL AST parsing, deparsing, and code generation

251 lines (182 loc) 8.85 kB
# @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`)