New:Microsoft Teams Notifications Are Now Available in Socket.Learn more →
Get Started

@pgsql/scripts

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@pgsql/scripts

Migration script generation for PostgreSQL — derive revert and verify scripts from classified statement facts

latest
Source
npmnpm
Version
18.4.8
Version published
Weekly downloads
6.3K
94.52%
Maintainers
1
Weekly downloads
 
Created
Source

@pgsql/scripts

Migration script generation for PostgreSQL: derive revert and verify scripts from the classified statement facts of a deploy script (classifyStatements in @pgsql/transform).

import { classifyStatements } from '@pgsql/transform';
import { revertFor, verifyFor } from '@pgsql/scripts';
import { loadModule } from 'plpgsql-parser';

await loadModule();
const facts = classifyStatements(deploySql);

const { sql: revertSql, warnings } = revertFor(facts);
const { sql: verifySql } = verifyFor(facts);
  • revertFor(facts) — mechanical inverses in reverse topological order of the statement dependency graph, so dependents are dropped before their dependencies and no CASCADE is ever needed. Inverses are built as AST nodes and deparsed (pgsql-deparser), never string-templated.
  • verifyFor(facts) — one existence check per created object, each raising on failure via SELECT 1/(CASE WHEN <exists> THEN 1 ELSE 0 END);.

Nothing outside the supported vocabulary is ever guessed at: revertFor emits a -- revert not derivable: <reason> comment plus a warning; verifyFor emits nothing plus a warning. The list is exported as SUPPORTED_STATEMENTS (and SUPPORTED_NODE_TAGS).

Node-level API

For consumers that compose inverses at the AST level (semantic diffing, migration generation) without round-tripping through deparsed text:

import { invertStatement, existenceCheck } from '@pgsql/scripts';

const inverse = invertStatement(facts[0]);  // AST statement nodes, [] = nothing to revert, null = not derivable
const checks = existenceCheck(facts[0]);    // SelectStmt check nodes, [] = nothing to check, null = not derivable

invertStatement returns the per-statement inverse as wrapped AST nodes (e.g. { DropStmt: {...} }); existenceCheck returns the raise-on-failure checks as SelectStmt nodes. Both return null instead of guessing when derivation is not possible — including partially underivable multi-command statements.

Supported statements

StatementRevertVerify
CREATE SCHEMADROP SCHEMAinformation_schema.schemata
CREATE TABLEDROP TABLEto_regclass
CREATE VIEWDROP VIEWto_regclass
CREATE INDEXDROP INDEXto_regclass
CREATE SEQUENCEDROP SEQUENCEto_regclass
CREATE TYPE (composite, enum, range)DROP TYPEto_regtype
CREATE DOMAINDROP DOMAINto_regtype
CREATE FUNCTION / PROCEDUREDROP FUNCTION / PROCEDURE with input signature (overload safe)to_regprocedure
CREATE TRIGGERDROP TRIGGER ... ON tablepg_trigger
CREATE POLICYDROP POLICY ... ON tablepg_policies
CREATE EXTENSIONDROP EXTENSIONpg_extension
CREATE ROLEDROP ROLEpg_roles
ALTER TABLE ... ADD COLUMNDROP COLUMNinformation_schema.columns
ALTER TABLE ... ADD CONSTRAINT (named)DROP CONSTRAINTinformation_schema.table_constraints
ALTER TABLE ... ENABLE / FORCE ROW LEVEL SECURITYDISABLE / NO FORCEpg_class.relrowsecurity / relforcerowsecurity
GRANT privileges (tables, sequences, functions, schemas)REVOKE same privilegeshas_table_privilege / has_function_privilege / has_schema_privilege
GRANT role TO roleREVOKE role FROM rolepg_auth_members
COMMENT ONCOMMENT ON ... IS NULL—
CREATE MATERIALIZED VIEW / CREATE TABLE ASDROP MATERIALIZED VIEW / DROP TABLEto_regclass
CREATE SERVERDROP SERVERpg_foreign_server
CREATE FOREIGN TABLEDROP FOREIGN TABLEto_regclass
CREATE USER MAPPINGDROP USER MAPPINGpg_user_mappings
CREATE COLLATIONDROP COLLATIONpg_collation
CREATE AGGREGATEDROP AGGREGATE with input signatureto_regprocedure
CREATE OPERATOR (binary)DROP OPERATOR (left, right)to_regoperator
CREATE CASTDROP CAST (source AS target)pg_cast
CREATE PUBLICATIONDROP PUBLICATIONpg_publication
CREATE SUBSCRIPTIONDROP SUBSCRIPTIONpg_subscription
CREATE STATISTICSDROP STATISTICSpg_statistic_ext
CREATE EVENT TRIGGERDROP EVENT TRIGGERpg_event_trigger
CREATE RULEDROP RULE ... ON tablepg_rules
ALTER TYPE ... ADD VALUE— (Postgres has no DROP VALUE; warns)pg_enum
ALTER TABLE ... ATTACH PARTITIONDETACH PARTITIONpg_inherits
ALTER DEFAULT PRIVILEGES ... GRANTALTER DEFAULT PRIVILEGES ... REVOKEpg_default_acl + aclexplode
SECURITY LABELSECURITY LABEL ... IS NULL—
CREATE FOREIGN DATA WRAPPERDROP FOREIGN DATA WRAPPERpg_foreign_data_wrapper
CREATE CONVERSIONDROP CONVERSIONpg_conversion
CREATE ACCESS METHODDROP ACCESS METHODpg_am
CREATE TRANSFORMDROP TRANSFORM FOR type LANGUAGE langpg_transform
CREATE OPERATOR CLASS / FAMILYDROP ... USING ampg_opclass / pg_opfamily
CREATE TEXT SEARCH CONFIGURATION / DICTIONARY / PARSER / TEMPLATEmatching DROPpg_ts_config / pg_ts_dict / pg_ts_parser / pg_ts_template
CREATE TABLESPACEDROP TABLESPACEpg_tablespace
ALTER ... RENAME TOrename back (both names are in the statement)object exists under new name
ALTER ... SET SCHEMA (qualified source)move back (both schemas are in the statement)object exists in new schema
GRANT ALLREVOKE ALLexpands to the object type's concrete privilege list

Not derivable (warned, never guessed): REVOKE, unnamed constraints, ALTER ... SET with unknown prior value, ALTER ... OWNER TO (prior owner unknown), SET SCHEMA on unqualified names, arbitrary DML, dynamic SQL, prefix operators.

🛠 Built by the Constructive team — creators of modular Postgres tooling for secure, composable backends. If you like our work, contribute on GitHub.

  • pgpm: A Postgres Package Manager that brings modular development to PostgreSQL with reusable packages, deterministic migrations, recursive dependency resolution, and tag-aware versioning.
  • pgsql-test: Instant, isolated PostgreSQL databases for each test with automatic transaction rollbacks, context switching, and clean seeding for fast, reliable database testing.
  • pgsql-seed: PostgreSQL seeding utilities for CSV, JSON, SQL data loading, and pgpm deployment.
  • pgsql-parser: The real PostgreSQL parser for Node.js, providing symmetric parsing and deparsing of SQL statements with actual PostgreSQL parser integration.
  • pgsql-deparser: A streamlined tool designed for converting PostgreSQL ASTs back into SQL queries, focusing solely on deparser functionality to complement pgsql-parser.
  • @pgsql/parser: Multi-version PostgreSQL parser with dynamic version selection at runtime, supporting PostgreSQL 15, 16, and 17 in a single package.
  • @pgsql/types: Offers TypeScript type definitions for PostgreSQL AST nodes, facilitating type-safe construction, analysis, and manipulation of ASTs.
  • @pgsql/enums: Provides TypeScript enum definitions for PostgreSQL constants, enabling type-safe usage of PostgreSQL enums and constants in your applications.
  • @pgsql/utils: A comprehensive utility library for PostgreSQL, offering type-safe AST node creation and enum value conversions, simplifying the construction and manipulation of PostgreSQL ASTs.
  • @pgsql/traverse: PostgreSQL AST traversal utilities for pgsql-parser, providing a visitor pattern for traversing PostgreSQL Abstract Syntax Tree nodes, similar to Babel's traverse functionality but specifically designed for PostgreSQL AST structures.
  • pg-proto-parser: A TypeScript tool that parses PostgreSQL Protocol Buffers definitions to generate TypeScript interfaces, utility functions, and JSON mappings for enums.
  • libpg-query: The real PostgreSQL parser exposed for Node.js, used primarily in pgsql-parser for parsing and deparsing SQL queries.

Disclaimer

AS DESCRIBED IN THE LICENSES, THE SOFTWARE IS PROVIDED "AS IS", AT YOUR OWN RISK, AND WITHOUT WARRANTIES OF ANY KIND.

No developer or entity involved in creating Software will be liable for any claims or damages whatsoever associated with your use, inability to use, or your interaction with other users of the Software code or Software CLI, including any direct, indirect, incidental, special, exemplary, punitive or consequential damages, or loss of profits, cryptocurrencies, tokens, or anything else of value.

Keywords

sql

FAQs

Package last updated on 17 Sep 2026

Related posts