This skill documents the code generation pipelines in pgsql-parser: protobuf-based TypeScript generation, type inference from SQL fixtures, and keyword list generation from PostgreSQL source.
Several packages generate TypeScript code from external sources rather than being hand-written. These generated files should not be edited by hand — instead, re-run the generation scripts after changing inputs.
Four packages generate TypeScript from the PostgreSQL protobuf definition at __fixtures__/proto/17-latest.proto:
| Package | Script | What it generates |
|---|---|---|
@pgsql/utils |
npm run build:proto |
AST helper functions (src/), wrapped helpers (wrapped.ts), runtime schema (runtime-schema.ts) |
@pgsql/traverse |
npm run build:proto |
Visitor-pattern traversal utilities |
@pgsql/transform |
npm run build:proto |
Multi-version AST transformer utilities |
pg-ast |
npm run build:proto |
Low-level AST type helpers |
Each package has a scripts/pg-proto-parser.ts that configures PgProtoParser with package-specific options (which features to enable, output paths, type sources).
When to re-run: After updating __fixtures__/proto/17-latest.proto (e.g., when upgrading to a new PostgreSQL version).
# Re-generate for a specific package
cd packages/utils && npm run build:proto
# Or build all (build:proto runs as part of build)
pnpm run buildNote: build:proto is called automatically as part of npm run build in these packages, so a full pnpm run build from root covers everything.
The pg-proto-parser package also has its own generation script:
cd packages/proto-parser && npm run generate:test-utilsThis generates test utility functions from a 13-latest.proto fixture into test-utils/utils/.
The pgsql-types package has a two-step pipeline that discovers actual AST usage patterns from SQL fixtures and generates narrowed TypeScript types:
cd packages/pgsql-types && npm run inferRuns scripts/infer-field-metadata.ts:
- Reads all
.sqlfiles from__fixtures__/kitchen-sink/and__fixtures__/postgres/ - Parses each statement and walks the AST
- For every
Node-typed field, records which concrete node tags actually appear - Writes
src/field-metadata.jsonwith nullable/tag/array info per field
cd packages/pgsql-types && npm run generateRuns scripts/generate-types.ts:
- Reads
src/field-metadata.json(must runinferfirst) - Generates
src/types.tswith narrowed union types instead of genericNode - Example: instead of
whereClause?: Node, generateswhereClause?: { BoolExpr: BoolExpr } | { A_Expr: A_Expr } | ...
When to re-run: After adding new SQL fixtures (which may introduce new node type combinations) or after updating the runtime schema.
Note: infer is called automatically as part of npm run build in pgsql-types.
cd packages/quotes && npm run keywords -- /path/to/postgres/src/include/parser/kwlist.hRuns scripts/keywords.ts:
- Reads PostgreSQL's
kwlist.hheader file (from a local PostgreSQL source checkout) - Parses
PG_KEYWORD(...)macros to extract keywords and their categories - Generates
src/kwlist.tswith typed keyword sets (RESERVED, UNRESERVED, COL_NAME, TYPE_FUNC_NAME)
When to re-run: When upgrading to a new PostgreSQL version that adds/removes/reclassifies keywords.
Requires: A local checkout of the PostgreSQL source code to provide the kwlist.h file. The script will prompt for the path interactively if not provided as an argument.
cd packages/deparser && ts-node scripts/generate-version-deparsers.tsGenerates versions/{13,14,15,16}/src/index.ts files that wire up version-specific AST transformers (e.g., PG13ToPG17Transformer) to the main v17 deparser. This allows deparsing ASTs from older PostgreSQL versions.
When to re-run: When adding support for a new PostgreSQL version or changing the transformer class names.
| Workflow | Command | Input | Output |
|---|---|---|---|
| Proto codegen (all) | pnpm run build |
__fixtures__/proto/17-latest.proto |
Generated TS in each package's src/ |
| Proto codegen (one pkg) | cd packages/<pkg> && npm run build:proto |
Same | Same |
| Type inference | cd packages/pgsql-types && npm run infer |
__fixtures__/kitchen-sink/**/*.sql |
src/field-metadata.json |
| Type generation | cd packages/pgsql-types && npm run generate |
src/field-metadata.json |
src/types.ts |
| Keyword generation | cd packages/quotes && npm run keywords -- <kwlist.h> |
PostgreSQL kwlist.h |
src/kwlist.ts |
| Version deparsers | cd packages/deparser && ts-node scripts/generate-version-deparsers.ts |
Transformer configs | versions/*/src/index.ts |