@dbmason/postgres 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # @dbmason/postgres
2
+
3
+ Postgres Dialect for Dbmason.
4
+
5
+ Provides the introspector, analyzer, and emitter logic specifically for PostgreSQL databases.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @dbmason/postgres
11
+ ```
@@ -0,0 +1,216 @@
1
+ import { AnalyzedTableNode } from '@dbmason/core';
2
+ import { ColumnHandle } from '@dbmason/core';
3
+ import { ColumnNode } from '@dbmason/core';
4
+ import { ColumnReference } from '@dbmason/core';
5
+ import { ConstraintNode } from '@dbmason/core';
6
+ import { DbmasonContext } from '@dbmason/core';
7
+ import { DbmasonDialect } from '@dbmason/core';
8
+ import { DbmasonDriver } from '@dbmason/core';
9
+ import { DbmasonIntrospector } from '@dbmason/core';
10
+ import { DbmasonScope } from '@dbmason/core';
11
+ import { DbOperation } from '@dbmason/core';
12
+ import { ExecutionPlan } from '@dbmason/core';
13
+ import { FunctionHandle } from '@dbmason/core';
14
+ import { GrantObjectKind } from '@dbmason/core';
15
+ import { IndexNode } from '@dbmason/core';
16
+ import { PolicyNode } from '@dbmason/core';
17
+ import { ProcedureHandle } from '@dbmason/core';
18
+ import { ReferentialAction } from '@dbmason/core';
19
+ import { RoleHandle } from '@dbmason/core';
20
+ import { RoleNode } from '@dbmason/core';
21
+ import { RoleReference } from '@dbmason/core';
22
+ import { Snapshot } from '@dbmason/core';
23
+ import { TableHandle } from '@dbmason/core';
24
+ import { TableNode } from '@dbmason/core';
25
+ import { TableReference } from '@dbmason/core';
26
+ import { TriggerEvent } from '@dbmason/core';
27
+ import { TriggerForEach } from '@dbmason/core';
28
+ import { TriggerNode } from '@dbmason/core';
29
+ import { TriggerWhen } from '@dbmason/core';
30
+ import { TypeHandle } from '@dbmason/core';
31
+ import { TypeReference } from '@dbmason/core';
32
+
33
+ export declare const bigserial: (name?: string) => PostgresColumnBuilder;
34
+
35
+ export declare const boolean: (name?: string) => PostgresColumnBuilder;
36
+
37
+ export declare const btree: (...columns: ColumnReference[]) => IndexNode;
38
+
39
+ export declare const custom: (type: unknown, name?: string) => PostgresColumnBuilder;
40
+
41
+ export { DbmasonContext }
42
+
43
+ export { DbOperation }
44
+
45
+ export declare const decimal: (name?: string) => PostgresColumnBuilder;
46
+
47
+ export declare function defineCompositeType(scope: DbmasonContext | DbmasonScope, name: string, fields: Record<string, TypeReference>): TypeHandle;
48
+
49
+ export declare function defineCron(scope: DbmasonContext | DbmasonScope, name: string, schedule: string, command: string): void;
50
+
51
+ export declare function defineEnum(scope: DbmasonContext | DbmasonScope, name: string, values: string[]): TypeHandle;
52
+
53
+ export declare function defineExtension(scope: DbmasonContext | DbmasonScope, name: string, options?: {
54
+ schema?: string;
55
+ version?: string;
56
+ }): void;
57
+
58
+ export declare function defineFunction(scope: DbmasonContext | DbmasonScope, name: string, input: PostgresFunctionInput): FunctionHandle;
59
+
60
+ export declare function defineGrant(ctx: DbmasonContext, to: RoleReference, privileges: string[], kind: GrantObjectKind, on: TableReference): void;
61
+
62
+ export declare function defineMaterializedView(scope: DbmasonContext | DbmasonScope, name: string, query: string): void;
63
+
64
+ export declare function definePolicy(scope: DbmasonContext | DbmasonScope, name: string, input: PolicyInput): PolicyNode;
65
+
66
+ export declare function defineProcedure(scope: DbmasonContext | DbmasonScope, name: string, input: PostgresProcedureInput): ProcedureHandle;
67
+
68
+ export declare function defineRole(scope: DbmasonContext | DbmasonScope, name: string, options?: RoleNode['options']): RoleHandle;
69
+
70
+ /**
71
+ * Postgres-specific defineTable
72
+ */
73
+ export declare function defineTable<C extends Record<string, PostgresColumnBuilder | string | ColumnNode>>(scope: DbmasonContext | DbmasonScope, name: string, input: PostgresTableInput<C>): TableHandle & {
74
+ [K in keyof C]: ColumnHandle;
75
+ };
76
+
77
+ export declare function defineTrigger(scope: DbmasonContext | DbmasonScope, tableName: string, name: string, input: TriggerInput): void;
78
+
79
+ export declare function defineView(scope: DbmasonContext | DbmasonScope, name: string, query: string): void;
80
+
81
+ export declare const doublePrecision: (name?: string) => PostgresColumnBuilder;
82
+
83
+ export declare const enumType: (type: unknown, name?: string) => PostgresColumnBuilder;
84
+
85
+ export { FunctionHandle }
86
+
87
+ export declare const gin: (...columns: ColumnReference[]) => IndexNode;
88
+
89
+ export declare const gist: (...columns: ColumnReference[]) => IndexNode;
90
+
91
+ export declare const hash: (...columns: ColumnReference[]) => IndexNode;
92
+
93
+ /**
94
+ * Postgres Index Helpers
95
+ */
96
+ export declare type IndexMethod = 'btree' | 'hash' | 'gist' | 'gin' | 'brin' | 'spgist';
97
+
98
+ export declare const integer: (name?: string) => PostgresColumnBuilder;
99
+
100
+ export declare const jsonb: (name?: string) => PostgresColumnBuilder;
101
+
102
+ export declare interface PolicyInput {
103
+ table?: TableReference;
104
+ method: 'rls' | 'rbac';
105
+ rbac?: RolePermissionInput[];
106
+ sql?: string;
107
+ }
108
+
109
+ export declare type PolicyKind = DbOperation;
110
+
111
+ /**
112
+ * Postgres-specific Column Builder
113
+ */
114
+ export declare class PostgresColumnBuilder {
115
+ private readonly node;
116
+ constructor(node: ColumnNode);
117
+ primaryKey(): PostgresColumnBuilder;
118
+ notNull(): PostgresColumnBuilder;
119
+ unique(): PostgresColumnBuilder;
120
+ default(expr: string): PostgresColumnBuilder;
121
+ defaultNow(): PostgresColumnBuilder;
122
+ defaultUuid(): PostgresColumnBuilder;
123
+ check(expression: string): PostgresColumnBuilder;
124
+ references(handle: ColumnReference, options?: {
125
+ onDelete?: ReferentialAction;
126
+ onUpdate?: ReferentialAction;
127
+ }): PostgresColumnBuilder;
128
+ references(table: string, column: string, options?: {
129
+ onDelete?: ReferentialAction;
130
+ onUpdate?: ReferentialAction;
131
+ }): PostgresColumnBuilder;
132
+ build(): ColumnNode;
133
+ }
134
+
135
+ export declare class PostgresDialect implements DbmasonDialect {
136
+ readonly name = "postgres";
137
+ private ctx?;
138
+ constructor();
139
+ setContext(ctx: DbmasonContext): void;
140
+ analyzeTable(table: TableNode): AnalyzedTableNode;
141
+ emit(plan: ExecutionPlan): string;
142
+ getDriver(connectionString: string): DbmasonDriver;
143
+ introspector: PostgresIntrospector;
144
+ }
145
+
146
+ export declare interface PostgresFunctionInput {
147
+ args?: Record<string, TypeReference>;
148
+ returns?: TableReference | TypeReference | string;
149
+ language?: 'plpgsql' | 'sql' | 'python' | 'javascript';
150
+ body: string;
151
+ }
152
+
153
+ declare class PostgresIntrospector implements DbmasonIntrospector {
154
+ introspect(connectionString: string): Promise<Snapshot>;
155
+ }
156
+
157
+ export declare interface PostgresProcedureInput {
158
+ args?: Record<string, TypeReference>;
159
+ returns?: TableReference | TypeReference | string;
160
+ language?: 'plpgsql' | 'sql' | 'python' | 'javascript';
161
+ body: string;
162
+ }
163
+
164
+ export declare interface PostgresTableInput<C = Record<string, unknown>> {
165
+ columns: C;
166
+ constraints?: ConstraintNode[];
167
+ indexes?: IndexNode[];
168
+ policies?: (PolicyNode | TablePolicyDefinitionInput)[];
169
+ triggers?: (TriggerNode | TriggerInput)[];
170
+ migration?: 'safe' | 'destructive';
171
+ options?: {
172
+ unlogged?: boolean;
173
+ inherits?: TableReference;
174
+ realtime?: boolean | RoleReference[];
175
+ };
176
+ }
177
+
178
+ export { ProcedureHandle }
179
+
180
+ export declare type RolePermissionInput = {
181
+ roles: RoleReference[];
182
+ allow: PolicyKind[];
183
+ };
184
+
185
+ export { RoleReference }
186
+
187
+ export declare const serial: (name?: string) => PostgresColumnBuilder;
188
+
189
+ export declare interface TablePolicyDefinitionInput extends PolicyInput {
190
+ name: string;
191
+ }
192
+
193
+ export { TableReference }
194
+
195
+ /**
196
+ * Postgres Column Factories
197
+ */
198
+ export declare const text: (name?: string) => PostgresColumnBuilder;
199
+
200
+ export declare const timestamp: (name?: string) => PostgresColumnBuilder;
201
+
202
+ export declare const timestamptz: (name?: string) => PostgresColumnBuilder;
203
+
204
+ export declare interface TriggerInput {
205
+ when: TriggerWhen;
206
+ events: TriggerEvent[];
207
+ procedure: ProcedureHandle | FunctionHandle | string;
208
+ forEach?: TriggerForEach;
209
+ condition?: string;
210
+ }
211
+
212
+ export { TypeHandle }
213
+
214
+ export declare const uuid: (name?: string) => PostgresColumnBuilder;
215
+
216
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,183 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("@dbmason/core"),_=require("pg");class b{static emit(e,n,a){if(e==="create")return this.generateCreateTableSQL(n)+this.generateTableIndexes(n)+`
2
+ `;if(e==="alter"&&a){const t=a.old;return this.generateAlterTableSQL(t,n)+this.diffIndexes(t,n)+`
3
+ `}else if(e==="drop")return`DROP TABLE "${n.name}" CASCADE;
4
+ `;return""}static generateCreateTableSQL(e){const n=Object.values(e.columns).map(r=>this.formatColumn(r)).join(`,
5
+ `),a=e.constraints.map(r=>` CONSTRAINT "${r.name}" ${r.definition}`).join(`,
6
+ `),t=e.module&&e.module!=="global",o=t?`"${e.module}"."${e.name}"`:`"${e.name}"`;let i=`-- Table: ${t?e.module+".":""}${e.name}
7
+ `;return i+=`CREATE TABLE ${o} (
8
+ ${n}${a?`,
9
+ `+a:""}
10
+ );
11
+ `,e.options?.unlogged&&(i=i.replace("CREATE TABLE","CREATE UNLOGGED TABLE")),i}static generateAlterTableSQL(e,n){const a=[];for(const[i,r]of Object.entries(n.columns))e.columns[i]||a.push(`ADD COLUMN "${i}" ${r.type}${r.notNull?" NOT NULL":""}`);return a.length===0?"":`ALTER TABLE ${n.module&&n.module!=="global"?`"${n.module}"."${n.name}"`:`"${n.name}"`}
12
+ ${a.join(`,
13
+ `)};
14
+ `}static formatColumn(e){let n=[`"${e.name}" ${e.type}`];if(e.primaryKey?n.push("PRIMARY KEY"):e.notNull&&n.push("NOT NULL"),e.unique&&n.push("UNIQUE"),e.default&&n.push(`DEFAULT ${e.default}`),e.references){const t=e.references.module&&e.references.module!=="global"?`"${e.references.module}"."${e.references.table}"`:`"${e.references.table}"`;n.push(`REFERENCES ${t}("${e.references.column}")`),e.references.onDelete&&n.push(`ON DELETE ${e.references.onDelete}`)}return n.join(" ")}static generateTableIndexes(e){return e.indexes.map(n=>this.emitIndex({...n,table:e.name,module:e.module})).join("")}static emitIndex(e){const n=e.columns.join(", "),a=e.method?` USING ${e.method.toUpperCase()}`:"",t=e.unique?"UNIQUE ":"",o=e.where?` WHERE ${e.where}`:"",i=e.expression?`(${e.expression})`:`(${n})`,l=e.module&&e.module!=="global"?`"${e.module}"."${e.table}"`:`"${e.table}"`;return`CREATE ${t}INDEX IF NOT EXISTS "${e.name}" ON ${l}${a} ${i}${o};
15
+ `}static diffIndexes(e,n){let a="";const t=new Map(e.indexes.map(o=>[o.name,o]));for(const o of n.indexes)t.has(o.name)||(a+=this.emitIndex({...o,table:n.name}));return a}}class T{static emit(e){const n=Object.entries(e.args).map(([o,i])=>`"${o}" ${i}`).join(", ");return`CREATE OR REPLACE PROCEDURE ${e.module&&e.module!=="global"?`"${e.module}"."${e.name}"`:`"${e.name}"`}(${n})
16
+ AS $$
17
+ ${e.body}
18
+ $$ LANGUAGE ${e.language};
19
+
20
+ `}}class ${static emit(e){const n=Object.entries(e.args).map(([o,i])=>`"${o}" ${i}`).join(", ");return`CREATE OR REPLACE FUNCTION ${e.module&&e.module!=="global"?`"${e.module}"."${e.name}"`:`"${e.name}"`}(${n})
21
+ RETURNS ${e.returns} AS $$
22
+ ${e.body}
23
+ $$ LANGUAGE ${e.language};
24
+
25
+ `}}class y{static emit(e){const a=e.module&&e.module!=="global"?`"${e.module}"."${e.name}"`:`"${e.name}"`;return`CREATE OR REPLACE ${e.kind==="MaterializedView"?"MATERIALIZED VIEW":"VIEW"} ${a} AS
26
+ ${e.query};
27
+
28
+ `}}class R{static emit(e){let n=`CREATE EXTENSION IF NOT EXISTS "${e.name}"`;return e.schema&&(n+=` SCHEMA "${e.schema}"`),e.version&&(n+=` VERSION '${e.version}'`),n+`;
29
+
30
+ `}}class O{static emit(e){return`SELECT cron.schedule('${e.name}', '${e.schedule}', $$ ${e.command} $$);
31
+ `}}class A{static emit(e){let n="";if(e.type==="enum"){const a=(e.values||[]).map(t=>`'${t}'`).join(", ");n=`CREATE TYPE "${e.name}" AS ENUM (${a});`}else{const a=Object.entries(e.fields||{}).map(([t,o])=>` "${t}" ${o}`).join(`,
32
+ `);n=`CREATE TYPE "${e.name}" AS (
33
+ ${a}
34
+ );`}return`DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = '${e.name}') THEN ${n} END IF; END $$;
35
+
36
+ `}}class I{static emit(e){let n="";if(e.options){const a=e.options;a.superuser!==void 0&&(n+=a.superuser?" SUPERUSER":" NOSUPERUSER"),a.createdb!==void 0&&(n+=a.createdb?" CREATEDB":" NOCREATEDB"),a.createrole!==void 0&&(n+=a.createrole?" CREATEROLE":" NOCREATEROLE"),a.inherit!==void 0&&(n+=a.inherit?" INHERIT":" NOINHERIT"),a.login!==void 0&&(n+=a.login?" LOGIN":" NOLOGIN"),a.password&&(n+=` PASSWORD '${a.password}'`)}return`DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = '${e.name}') THEN CREATE ROLE "${e.name}"${n}; END IF; END $$;
37
+
38
+ `}}class w{static emit(e){return`GRANT ${e.privileges.join(", ")} ON ${e.on} "${e.object}" TO "${e.to}";
39
+
40
+ `}}class C{static emit(e){return`CREATE TRIGGER "${e.name}"
41
+ ${e.when} ${e.events.join(" OR ")} ON "${e.table}"
42
+ FOR EACH ${e.forEach||"ROW"}
43
+ EXECUTE FUNCTION ${e.functionName}(${(e.functionArgs||[]).join(", ")});
44
+
45
+ `}}class D{static emit(e){let n=`-- Policy: ${e.name} on ${e.table}
46
+ `;if(e.method==="rls")n+=`ALTER TABLE "${e.table}" ENABLE ROW LEVEL SECURITY;
47
+ `,n+=`CREATE POLICY "${e.name}" ON "${e.table}" FOR ALL USING (${e.sql});
48
+ `;else if(e.method==="rbac"&&e.rbac)for(const a of e.rbac)n+=`GRANT ${a.operations.join(", ")} ON TABLE "${e.table}" TO ${a.roles.map(t=>`"${t}"`).join(", ")};
49
+ `;return n+`
50
+ `}}class k{static emit(e){let n=`-- Generated by @dbmason/postgres
51
+
52
+ `;const a=new Set;for(const t of e)t.node.module&&t.node.module!=="global"&&a.add(t.node.module);for(const t of a)n+=`CREATE SCHEMA IF NOT EXISTS "${t}";
53
+ `;a.size>0&&(n+=`
54
+ `);for(const t of e)switch(t.node.kind){case"Table":n+=b.emit(t.action,t.node,t.diff);break;case"Procedure":n+=T.emit(t.node);break;case"Function":n+=$.emit(t.node);break;case"Extension":n+=R.emit(t.node);break;case"Type":n+=A.emit(t.node);break;case"View":case"MaterializedView":n+=y.emit(t.node);break;case"Cron":n+=O.emit(t.node);break;case"Trigger":n+=C.emit(t.node);break;case"Policy":n+=D.emit(t.node);break;case"Role":n+=I.emit(t.node);break;case"Grant":n+=w.emit(t.node);break}return n}}class g{constructor(e){this.client=null,this.pool=new _.Pool({connectionString:e})}async connect(){this.client=await this.pool.connect()}async close(){this.client&&(this.client.release(),this.client=null),await this.pool.end()}async query(e,n){if(!this.client)throw new Error("Driver not connected");return this.client.query(e,n)}async beginTransaction(){await this.query("BEGIN")}async commitTransaction(){await this.query("COMMIT")}async rollbackTransaction(){await this.query("ROLLBACK")}}class S{static async introspect(e){const n={},a=await e.query(`
55
+ SELECT table_schema, table_name
56
+ FROM information_schema.tables
57
+ WHERE table_schema NOT IN ('information_schema', 'pg_catalog')
58
+ AND table_type = 'BASE TABLE'
59
+ `);for(const t of a.rows){const o=t.table_schema,i=t.table_name,r=await this.introspectColumns(e,o,i),l=await this.introspectIndexes(e,o,i),c=await this.introspectConstraints(e,o,i);n[i]={kind:"Table",name:i,module:o==="public"?"global":o,columns:r,indexes:l,constraints:c,policies:[],triggers:[]}}return n}static async introspectColumns(e,n,a){const t=await e.query(`
60
+ SELECT column_name, data_type, udt_name, is_nullable, column_default, is_identity
61
+ FROM information_schema.columns
62
+ WHERE table_schema = '${n}' AND table_name = '${a}'
63
+ `),o=await e.query(`
64
+ SELECT kcu.column_name
65
+ FROM information_schema.table_constraints tc
66
+ JOIN information_schema.key_column_usage kcu
67
+ ON tc.constraint_name = kcu.constraint_name
68
+ AND tc.table_schema = kcu.table_schema
69
+ WHERE tc.constraint_type = 'PRIMARY KEY'
70
+ AND tc.table_schema = '${n}' AND tc.table_name = '${a}'
71
+ `),i=new Set(o.rows.map(l=>l.column_name)),r={};for(const l of t.rows){let c=l.data_type==="USER-DEFINED"?l.udt_name:l.data_type,f=l.column_default||void 0;f&&f.includes("nextval")&&(c.toLowerCase()==="integer"||c.toLowerCase()==="int4"?(c="SERIAL",f=void 0):(c.toLowerCase()==="bigint"||c.toLowerCase()==="int8")&&(c="BIGSERIAL",f=void 0)),r[l.column_name]={kind:"Column",name:l.column_name,type:c.toUpperCase(),notNull:l.is_nullable==="NO",default:f,primaryKey:i.has(l.column_name),options:l.is_identity==="YES"?{identity:!0}:void 0}}return r}static async introspectIndexes(e,n,a){const t=await e.query(`
72
+ SELECT
73
+ i.relname as index_name,
74
+ a.attname as column_name,
75
+ ix.indisunique as is_unique
76
+ FROM pg_class t, pg_class i, pg_index ix, pg_attribute a, pg_namespace n
77
+ WHERE t.oid = ix.indrelid
78
+ AND i.oid = ix.indexrelid
79
+ AND a.attrelid = t.oid
80
+ AND a.attnum = ANY(ix.indkey)
81
+ AND t.relkind = 'r'
82
+ AND t.relname = '${a}'
83
+ AND n.oid = t.relnamespace
84
+ AND n.nspname = '${n}'
85
+ ORDER BY i.relname
86
+ `),o=new Map;for(const i of t.rows)o.has(i.index_name)||o.set(i.index_name,{kind:"Index",name:i.index_name,table:a,columns:[],unique:i.is_unique}),o.get(i.index_name).columns.push(i.column_name);return Array.from(o.values()).filter(i=>!i.name.endsWith("_pkey"))}static async introspectConstraints(e,n,a){const t=[],o=await e.query(`
87
+ SELECT
88
+ tc.constraint_name,
89
+ kcu.column_name,
90
+ ccu.table_schema AS foreign_schema,
91
+ ccu.table_name AS foreign_table,
92
+ ccu.column_name AS foreign_column
93
+ FROM information_schema.table_constraints AS tc
94
+ JOIN information_schema.key_column_usage AS kcu
95
+ ON tc.constraint_name = kcu.constraint_name
96
+ AND tc.table_schema = kcu.table_schema
97
+ JOIN information_schema.constraint_column_usage AS ccu
98
+ ON ccu.constraint_name = tc.constraint_name
99
+ AND ccu.table_schema = tc.table_schema
100
+ WHERE tc.constraint_type = 'FOREIGN KEY'
101
+ AND tc.table_schema = '${n}' AND tc.table_name = '${a}'
102
+ `);for(const c of o.rows){const p=c.foreign_schema&&c.foreign_schema!=="global"&&c.foreign_schema!=="public"?`"${c.foreign_schema}"."${c.foreign_table}"`:`"${c.foreign_table}"`,d=`FOREIGN KEY ("${c.column_name}") REFERENCES ${p}("${c.foreign_column}")`;t.push({kind:"Constraint",type:"foreign_key",definition:d,name:c.constraint_name,table:a})}const i=await e.query(`
103
+ SELECT
104
+ tc.constraint_name,
105
+ cc.check_clause
106
+ FROM information_schema.table_constraints tc
107
+ JOIN information_schema.check_constraints cc
108
+ ON tc.constraint_name = cc.constraint_name
109
+ WHERE tc.constraint_type = 'CHECK'
110
+ AND tc.table_schema = '${n}' AND tc.table_name = '${a}'
111
+ AND NOT (tc.constraint_name LIKE '%_not_null') -- Exclude internal NOT NULL checks
112
+ `);for(const c of i.rows)t.push({kind:"Constraint",type:"check",name:c.constraint_name,table:a,definition:`CHECK (${c.check_clause})`});const r=await e.query(`
113
+ SELECT
114
+ tc.constraint_name,
115
+ kcu.column_name
116
+ FROM information_schema.table_constraints AS tc
117
+ JOIN information_schema.key_column_usage AS kcu
118
+ ON tc.constraint_name = kcu.constraint_name
119
+ AND tc.table_schema = kcu.table_schema
120
+ WHERE tc.constraint_type = 'UNIQUE'
121
+ AND tc.table_schema = '${n}' AND tc.table_name = '${a}'
122
+ `),l=new Map;for(const c of r.rows)l.has(c.constraint_name)||l.set(c.constraint_name,[]),l.get(c.constraint_name).push(c.column_name);for(const[c,f]of l)t.push({kind:"Constraint",type:"unique",name:c,table:a,definition:`UNIQUE (${f.map(p=>`"${p}"`).join(", ")})`});return t}}class L{static async introspect(e){const n=await e.query(`
123
+ SELECT
124
+ n.nspname as schema,
125
+ c.relname as name,
126
+ pg_get_viewdef(c.oid, true) as definition,
127
+ c.relkind as kind
128
+ FROM pg_class c
129
+ JOIN pg_namespace n ON n.oid = c.relnamespace
130
+ WHERE c.relkind IN ('v', 'm')
131
+ AND n.nspname NOT IN ('information_schema', 'pg_catalog')
132
+ `),a={},t={};for(const o of n.rows){const i=o.name,r=o.schema==="public"?"global":o.schema,l=o.definition.trim();o.kind==="v"?a[i]={kind:"View",name:i,module:r,query:l}:t[i]={kind:"MaterializedView",name:i,module:r,query:l}}return{views:a,materializedViews:t}}}class x{static async introspect(e){const n=await e.query(`
133
+ SELECT
134
+ n.nspname as schema,
135
+ t.typname as name,
136
+ e.enumlabel as value
137
+ FROM pg_type t
138
+ JOIN pg_enum e ON t.oid = e.enumtypid
139
+ JOIN pg_namespace n ON n.oid = t.typnamespace
140
+ WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')
141
+ ORDER BY t.typname, e.enumsortorder
142
+ `),a={};for(const t of n.rows){const o=t.name,i=t.schema==="public"?"global":t.schema;a[o]||(a[o]={kind:"Type",name:o,module:i,type:"enum",values:[]}),a[o].values?.push(t.value)}return a}}class M{static async introspect(e){const n=await e.query(`
143
+ SELECT
144
+ n.nspname as schema,
145
+ p.proname as name,
146
+ p.prosrc as body,
147
+ l.lanname as language,
148
+ pg_get_function_arguments(p.oid) as args,
149
+ pg_get_function_result(p.oid) as returns
150
+ FROM pg_proc p
151
+ JOIN pg_namespace n ON n.oid = p.pronamespace
152
+ JOIN pg_language l ON l.oid = p.prolang
153
+ WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')
154
+ AND p.prokind = 'f'
155
+ `),a={};for(const t of n.rows){const o=t.name,i=t.schema==="public"?"global":t.schema,r={};if(t.args){const c=t.args.split(",").map(f=>f.trim());for(const f of c){const p=f.split(" ").map(d=>d.trim()).filter(Boolean);p.length>=2&&(["IN","OUT","INOUT","VARIADIC"].includes(p[0].toUpperCase())?p.length>=3&&(r[p[1]]=p.slice(2).join(" ")):r[p[0]]=p.slice(1).join(" "))}}const l=t.body;a[o]={kind:"Function",name:o,module:i,args:r,returns:t.returns,language:t.language,body:l}}return a}}class U{static async introspect(e){const n=await e.query(`
156
+ SELECT
157
+ n.nspname as schema,
158
+ p.proname as name,
159
+ p.prosrc as body,
160
+ l.lanname as language,
161
+ pg_get_function_arguments(p.oid) as args,
162
+ pg_get_function_result(p.oid) as returns
163
+ FROM pg_proc p
164
+ JOIN pg_namespace n ON n.oid = p.pronamespace
165
+ JOIN pg_language l ON l.oid = p.prolang
166
+ WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')
167
+ AND p.prokind = 'p'
168
+ `),a={};for(const t of n.rows){const o=t.name,i=t.schema==="public"?"global":t.schema,r={};if(t.args){const c=t.args.split(",").map(f=>f.trim());for(const f of c){const p=f.split(" ").map(d=>d.trim()).filter(Boolean);p.length>=2&&(["IN","OUT","INOUT","VARIADIC"].includes(p[0].toUpperCase())?p.length>=3&&(r[p[1]]=p.slice(2).join(" ")):r[p[0]]=p.slice(1).join(" "))}}const l=t.body;a[o]={kind:"Procedure",name:o,module:i,args:r,returns:t.returns,language:t.language,body:l}}return a}}class F{static async introspect(e){const n=await e.query(`
169
+ SELECT
170
+ n.nspname as schema,
171
+ t.tgname as name,
172
+ c.relname as table_name,
173
+ p.proname as function_name,
174
+ t.tgtype as type,
175
+ pg_get_triggerdef(t.oid) as definition
176
+ FROM pg_trigger t
177
+ JOIN pg_class c ON c.oid = t.tgrelid
178
+ JOIN pg_namespace n ON n.oid = c.relnamespace
179
+ JOIN pg_proc p ON p.oid = t.tgfoid
180
+ WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')
181
+ AND NOT t.tgisinternal
182
+ `),a={};for(const t of n.rows){const o=t.name,i=t.schema==="public"?"global":t.schema,r=t.definition.toUpperCase();let l="BEFORE";r.includes("AFTER")?l="AFTER":r.includes("INSTEAD OF")&&(l="INSTEAD OF");const c=[];r.includes("INSERT")&&c.push("INSERT"),r.includes("UPDATE")&&c.push("UPDATE"),r.includes("DELETE")&&c.push("DELETE"),r.includes("TRUNCATE")&&c.push("TRUNCATE");const f=r.includes("FOR EACH ROW")?"ROW":"STATEMENT";a[o]={kind:"Trigger",name:o,table:t.table_name,module:i,functionName:t.function_name,when:l,events:c,forEach:f}}return a}}class P{async introspect(e){const n=new g(e);await n.connect();try{const a=await S.introspect(n),{views:t,materializedViews:o}=await L.introspect(n),i=await x.introspect(n),r=await M.introspect(n),l=await U.introspect(n),c=await F.introspect(n);return{tables:a,procedures:l,functions:r,views:t,materializedViews:o,types:i,crons:{},extensions:{},roles:{},grants:{},policies:{},triggers:c,hashes:{}}}finally{await n.close()}}}class q{constructor(){this.name="postgres",this.introspector=new P}setContext(e){this.ctx=e}analyzeTable(e){const n=[];for(const i of Object.values(e.columns))i.references&&n.push(`table:${i.references.table}`),this.ctx&&this.ctx.types.has(i.type)&&n.push(`type:${i.type}`);const a=this.ctx?Array.from(this.ctx.policies.values()).filter(i=>i.table===e.name||i.module===e.module&&i.table===e.name):[],t=a.length>0,o=e.indexes.map(i=>({...i,name:i.name||`idx_${e.name}_${i.columns.join("_")}`}));return{...e,indexes:o,dependencies:n,rls:{enabled:t,policies:a}}}emit(e){return k.emit(e)}getDriver(e){return new g(e)}}function j(s,e,n){return m.internalDefinePolicy(s,e,n)}function v(s,e,n){return m.internalDefineProcedure(s,e,n)}function H(s,e,n){return m.internalDefineFunction(s,e,n)}function G(s,e,n){m.internalDefineView(s,e,n)}function W(s,e,n){m.internalDefineMaterializedView(s,e,n)}function V(s,e,n){return m.internalDefineEnum(s,e,n)}function B(s,e,n){return m.internalDefineCompositeType(s,e,n)}function E(s){return s.map(e=>m.resolveColumn(e).column)}const J=(...s)=>({kind:"Index",name:"",table:"",columns:E(s),method:"btree"}),Y=(...s)=>({kind:"Index",name:"",table:"",columns:E(s),method:"gin"}),z=(...s)=>({kind:"Index",name:"",table:"",columns:E(s),method:"gist"}),K=(...s)=>({kind:"Index",name:"",table:"",columns:E(s),method:"hash"});class u{constructor(e){this.node=e}primaryKey(){return new u({...this.node,primaryKey:!0,notNull:!0})}notNull(){return new u({...this.node,notNull:!0})}unique(){return new u({...this.node,unique:!0})}default(e){return new u({...this.node,default:e})}defaultNow(){return new u({...this.node,default:"NOW()"})}defaultUuid(){return new u({...this.node,default:"gen_random_uuid()"})}check(e){return new u({...this.node,check:e})}references(e,n,a){let t,o,i;return typeof e!="string"?(t=e.tableName,o=e.columnName,i=n):(t=e,o=n,i=a),new u({...this.node,references:{module:e.moduleName,table:t,column:o,onDelete:i?.onDelete,onUpdate:i?.onUpdate}})}build(){return this.node}}const X=(s="")=>new u({kind:"Column",name:s,type:"TEXT"}),Q=(s="")=>new u({kind:"Column",name:s,type:"UUID"}),h=(s="")=>new u({kind:"Column",name:s,type:"TIMESTAMPTZ"}),Z=h,ee=(s="")=>new u({kind:"Column",name:s,type:"JSONB"}),ne=(s="")=>new u({kind:"Column",name:s,type:"INTEGER"}),te=(s="")=>new u({kind:"Column",name:s,type:"BOOLEAN"}),ae=(s="")=>new u({kind:"Column",name:s,type:"DOUBLE PRECISION"}),se=(s="")=>new u({kind:"Column",name:s,type:"DECIMAL"}),ie=(s="")=>new u({kind:"Column",name:s,type:"SERIAL"}),oe=(s="")=>new u({kind:"Column",name:s,type:"BIGSERIAL"}),N=(s,e="")=>{const n=typeof s=="string"?s:s.moduleName&&s.moduleName!=="global"?`"${s.moduleName}"."${s.typeName}"`:s.typeName;return new u({kind:"Column",name:e,type:n})},re=N;function ce(s,e,n){const a={...n,options:n.options?{...n.options,inherits:n.options.inherits?m.resolveTable(n.options.inherits):void 0,realtime:Array.isArray(n.options.realtime)?n.options.realtime.map(t=>m.resolveRole(t)):n.options.realtime}:void 0};return m.internalDefineTable(s,e,a,t=>{const o={};for(const[i,r]of Object.entries(t))if(r instanceof u){const l=r.build();l.name=i,o[i]=l}else typeof r=="string"?o[i]={kind:"Column",name:i,type:r}:o[i]={...r,name:i};return o})}function le(s,e,n,a){m.internalDefineTrigger(s,e,n,a)}function me(s,e,n){return m.internalDefineRole(s,e,n)}function ue(s,e,n,a,t){return m.internalDefineGrant(s,e,n,a,t)}function pe(s,e,n){return m.internalDefineExtension(s,e,n)}function fe(s,e,n,a){return m.internalDefineCron(s,e,n,a)}Object.defineProperty(exports,"DbOperation",{enumerable:!0,get:()=>m.DbOperation});Object.defineProperty(exports,"DbmasonContext",{enumerable:!0,get:()=>m.DbmasonContext});Object.defineProperty(exports,"FunctionHandle",{enumerable:!0,get:()=>m.FunctionHandle});Object.defineProperty(exports,"ProcedureHandle",{enumerable:!0,get:()=>m.ProcedureHandle});Object.defineProperty(exports,"RoleReference",{enumerable:!0,get:()=>m.RoleReference});Object.defineProperty(exports,"TableReference",{enumerable:!0,get:()=>m.TableReference});Object.defineProperty(exports,"TypeHandle",{enumerable:!0,get:()=>m.TypeHandle});exports.PostgresColumnBuilder=u;exports.PostgresDialect=q;exports.bigserial=oe;exports.boolean=te;exports.btree=J;exports.custom=N;exports.decimal=se;exports.defineCompositeType=B;exports.defineCron=fe;exports.defineEnum=V;exports.defineExtension=pe;exports.defineFunction=H;exports.defineGrant=ue;exports.defineMaterializedView=W;exports.definePolicy=j;exports.defineProcedure=v;exports.defineRole=me;exports.defineTable=ce;exports.defineTrigger=le;exports.defineView=G;exports.doublePrecision=ae;exports.enumType=re;exports.gin=Y;exports.gist=z;exports.hash=K;exports.integer=ne;exports.jsonb=ee;exports.serial=ie;exports.text=X;exports.timestamp=Z;exports.timestamptz=h;exports.uuid=Q;
183
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/emitters/Table.emitter.ts","../src/emitters/Procedure.emitter.ts","../src/emitters/Function.emitter.ts","../src/emitters/View.emitter.ts","../src/emitters/Extension.emitter.ts","../src/emitters/Cron.emitter.ts","../src/emitters/Type.emitter.ts","../src/emitters/Role.emitter.ts","../src/emitters/Grant.emitter.ts","../src/emitters/Trigger.emitter.ts","../src/emitters/Policy.emitter.ts","../src/PostgresEmitter.ts","../src/PostgresDriver.ts","../src/introspectors/Table.introspector.ts","../src/introspectors/View.introspector.ts","../src/introspectors/Type.introspector.ts","../src/introspectors/Function.introspector.ts","../src/introspectors/Procedure.introspector.ts","../src/introspectors/Trigger.introspector.ts","../src/PostgresIntrospector.ts","../src/PostgresDialect.ts","../src/definitions/Policy.ts","../src/definitions/Procedure.ts","../src/definitions/Function.ts","../src/definitions/View.ts","../src/definitions/Type.ts","../src/definitions/Table.ts","../src/definitions/Trigger.ts","../src/definitions/Role.ts","../src/definitions/Grant.ts","../src/definitions/Extension.ts","../src/definitions/Cron.ts"],"sourcesContent":["import { TableNode, AnalyzedTableNode, ColumnNode, IndexNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Table\n */\nexport class TableEmitter {\n static emit(action: string, node: AnalyzedTableNode, diff?: unknown): string {\n if (action === 'create') {\n return this.generateCreateTableSQL(node) + this.generateTableIndexes(node) + '\\n';\n } else if (action === 'alter' && diff) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oldNode = (diff as any).old as TableNode;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // const newNode = (diff as any).new as TableNode;\n return this.generateAlterTableSQL(oldNode, node) + this.diffIndexes(oldNode, node) + '\\n';\n } else if (action === 'drop') {\n return `DROP TABLE \"${node.name}\" CASCADE;\\n`;\n }\n return '';\n }\n\n private static generateCreateTableSQL(node: AnalyzedTableNode): string {\n const columns = Object.values(node.columns).map(col => this.formatColumn(col)).join(',\\n ');\n const constraints = node.constraints.map(c => ` CONSTRAINT \"${c.name}\" ${c.definition}`).join(',\\n');\n \n const hasModule = node.module && node.module !== 'global';\n const fullName = hasModule ? `\"${node.module}\".\"${node.name}\"` : `\"${node.name}\"`;\n let sqlText = `-- Table: ${hasModule ? node.module + '.' : ''}${node.name}\\n`;\n sqlText += `CREATE TABLE ${fullName} (\\n ${columns}${constraints ? ',\\n' + constraints : ''}\\n);\\n`;\n\n if ((node.options as any)?.unlogged) {\n sqlText = sqlText.replace('CREATE TABLE', 'CREATE UNLOGGED TABLE');\n }\n return sqlText;\n }\n\n private static generateAlterTableSQL(oldNode: TableNode, newNode: AnalyzedTableNode): string {\n const changes: string[] = [];\n for (const [name, col] of Object.entries(newNode.columns)) {\n if (!oldNode.columns[name]) {\n changes.push(`ADD COLUMN \"${name}\" ${col.type}${col.notNull ? ' NOT NULL' : ''}`);\n }\n }\n if (changes.length === 0) return '';\n const hasModule = newNode.module && newNode.module !== 'global';\n const fullName = hasModule ? `\"${newNode.module}\".\"${newNode.name}\"` : `\"${newNode.name}\"`;\n return `ALTER TABLE ${fullName}\\n ${changes.join(',\\n ')};\\n`;\n }\n\n private static formatColumn(col: ColumnNode): string {\n let parts = [`\"${col.name}\" ${col.type}`];\n if (col.primaryKey) parts.push('PRIMARY KEY');\n else if (col.notNull) parts.push('NOT NULL');\n if (col.unique) parts.push('UNIQUE');\n if (col.default) parts.push(`DEFAULT ${col.default}`);\n if (col.references) {\n const hasRefModule = col.references.module && col.references.module !== 'global';\n const refTableName = hasRefModule ? `\"${col.references.module}\".\"${col.references.table}\"` : `\"${col.references.table}\"`;\n parts.push(`REFERENCES ${refTableName}(\"${col.references.column}\")`);\n if (col.references.onDelete) parts.push(`ON DELETE ${col.references.onDelete}`);\n }\n return parts.join(' ');\n }\n\n private static generateTableIndexes(node: AnalyzedTableNode): string {\n return node.indexes.map(idx => this.emitIndex({ ...idx, table: node.name, module: node.module })).join('');\n }\n\n private static emitIndex(node: IndexNode): string {\n const columns = node.columns.join(', ');\n const method = node.method ? ` USING ${node.method.toUpperCase()}` : '';\n const unique = node.unique ? 'UNIQUE ' : '';\n const where = node.where ? ` WHERE ${node.where}` : '';\n const expr = node.expression ? `(${node.expression})` : `(${columns})`;\n const hasModule = node.module && node.module !== 'global';\n const tableName = hasModule ? `\"${node.module}\".\"${node.table}\"` : `\"${node.table}\"`;\n return `CREATE ${unique}INDEX IF NOT EXISTS \"${node.name}\" ON ${tableName}${method} ${expr}${where};\\n`;\n }\n\n private static diffIndexes(oldNode: TableNode, newNode: AnalyzedTableNode): string {\n let sql = '';\n const oldIndexes = new Map(oldNode.indexes.map(idx => [idx.name, idx]));\n for (const newIdx of newNode.indexes) {\n if (!oldIndexes.has(newIdx.name)) {\n sql += this.emitIndex({ ...newIdx, table: newNode.name });\n }\n }\n return sql;\n }\n}\n","import { ProcedureNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Procedure\n */\nexport class ProcedureEmitter {\n static emit(node: ProcedureNode): string {\n const argList = Object.entries(node.args)\n .map(([name, type]) => `\"${name}\" ${type}`)\n .join(', ');\n \n const hasModule = node.module && node.module !== 'global';\n const fullName = hasModule ? `\"${node.module}\".\"${node.name}\"` : `\"${node.name}\"`;\n \n return `CREATE OR REPLACE PROCEDURE ${fullName}(${argList})\\nAS $$\\n${node.body}\\n$$ LANGUAGE ${node.language};\\n\\n`;\n }\n}\n","import { FunctionNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Function\n */\nexport class FunctionEmitter {\n static emit(node: FunctionNode): string {\n const argList = Object.entries(node.args)\n .map(([name, type]) => `\"${name}\" ${type}`)\n .join(', ');\n \n const hasModule = node.module && node.module !== 'global';\n const fullName = hasModule ? `\"${node.module}\".\"${node.name}\"` : `\"${node.name}\"`;\n \n return `CREATE OR REPLACE FUNCTION ${fullName}(${argList})\\nRETURNS ${node.returns} AS $$\\n${node.body}\\n$$ LANGUAGE ${node.language};\\n\\n`;\n }\n}\n","import { ViewNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: View\n */\nexport class ViewEmitter {\n static emit(node: ViewNode): string {\n const hasModule = node.module && node.module !== 'global';\n const fullName = hasModule ? `\"${node.module}\".\"${node.name}\"` : `\"${node.name}\"`;\n const kind = node.kind === 'MaterializedView' ? 'MATERIALIZED VIEW' : 'VIEW';\n \n return `CREATE OR REPLACE ${kind} ${fullName} AS\\n${node.query};\\n\\n`;\n }\n}\n","import { ExtensionNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Extension\n */\nexport class ExtensionEmitter {\n static emit(node: ExtensionNode): string {\n let sql = `CREATE EXTENSION IF NOT EXISTS \"${node.name}\"`;\n if (node.schema) sql += ` SCHEMA \"${node.schema}\"`;\n if (node.version) sql += ` VERSION '${node.version}'`;\n return sql + ';\\n\\n';\n }\n}\n","import { CronNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Cron\n */\nexport class CronEmitter {\n static emit(node: CronNode): string {\n return `SELECT cron.schedule('${node.name}', '${node.schedule}', $$ ${node.command} $$);\\n`;\n }\n}","import { TypeNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Type\n */\nexport class TypeEmitter {\n static emit(node: TypeNode): string {\n let sql = '';\n if (node.type === 'enum') {\n const vals = (node.values || []).map(v => `'${v}'`).join(', ');\n sql = `CREATE TYPE \"${node.name}\" AS ENUM (${vals});`;\n } else {\n const fields = Object.entries(node.fields || {})\n .map(([name, type]) => ` \"${name}\" ${type}`)\n .join(',\\n');\n sql = `CREATE TYPE \"${node.name}\" AS (\\n${fields}\\n);`;\n }\n // Idiomatic Postgres \"IF NOT EXISTS\" for types\n return `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = '${node.name}') THEN ${sql} END IF; END $$;\\n\\n`;\n }\n}\n","import { RoleNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Role\n */\nexport class RoleEmitter {\n static emit(node: RoleNode): string {\n let options = '';\n if (node.options) {\n const opts = node.options;\n if (opts.superuser !== undefined) options += opts.superuser ? ' SUPERUSER' : ' NOSUPERUSER';\n if (opts.createdb !== undefined) options += opts.createdb ? ' CREATEDB' : ' NOCREATEDB';\n if (opts.createrole !== undefined) options += opts.createrole ? ' CREATEROLE' : ' NOCREATEROLE';\n if (opts.inherit !== undefined) options += opts.inherit ? ' INHERIT' : ' NOINHERIT';\n if (opts.login !== undefined) options += opts.login ? ' LOGIN' : ' NOLOGIN';\n if (opts.password) options += ` PASSWORD '${opts.password}'`;\n }\n return `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = '${node.name}') THEN CREATE ROLE \"${node.name}\"${options}; END IF; END $$;\\n\\n`;\n }\n}\n","import { GrantNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Grant\n */\nexport class GrantEmitter {\n static emit(node: GrantNode): string {\n return `GRANT ${node.privileges.join(', ')} ON ${node.on} \"${node.object}\" TO \"${node.to}\";\\n\\n`;\n }\n}\n","import { TriggerNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Trigger\n */\nexport class TriggerEmitter {\n static emit(node: TriggerNode): string {\n return `CREATE TRIGGER \"${node.name}\"\\n ${node.when} ${node.events.join(' OR ')} ON \"${node.table}\"\\n FOR EACH ${node.forEach || 'ROW'}\\n EXECUTE FUNCTION ${node.functionName}(${(node.functionArgs || []).join(', ')});\\n\\n`;\n }\n}\n","import { PolicyNode } from '@dbmason/core';\n\n/**\n * Postgres SQL Emitter: Policy\n */\nexport class PolicyEmitter {\n static emit(node: PolicyNode): string {\n let sqlText = `-- Policy: ${node.name} on ${node.table}\\n`;\n if (node.method === 'rls') {\n sqlText += `ALTER TABLE \"${node.table}\" ENABLE ROW LEVEL SECURITY;\\n`;\n sqlText += `CREATE POLICY \"${node.name}\" ON \"${node.table}\" FOR ALL USING (${node.sql});\\n`;\n } else if (node.method === 'rbac' && node.rbac) {\n for (const perm of node.rbac) {\n sqlText += `GRANT ${perm.operations.join(', ')} ON TABLE \"${node.table}\" TO ${perm.roles.map(r => `\"${r}\"`).join(', ')};\\n`;\n }\n }\n return sqlText + '\\n';\n }\n}\n","import { \n ExecutionPlan, \n AnalyzedTableNode,\n ProcedureNode,\n FunctionNode,\n ViewNode,\n ExtensionNode,\n CronNode,\n TypeNode,\n RoleNode,\n GrantNode,\n TriggerNode,\n PolicyNode\n} from '@dbmason/core';\nimport { TableEmitter } from './emitters/Table.emitter';\nimport { ProcedureEmitter } from './emitters/Procedure.emitter';\nimport { FunctionEmitter } from './emitters/Function.emitter';\nimport { ViewEmitter } from './emitters/View.emitter';\nimport { ExtensionEmitter } from './emitters/Extension.emitter';\nimport { CronEmitter } from './emitters/Cron.emitter';\nimport { TypeEmitter } from './emitters/Type.emitter';\nimport { RoleEmitter } from './emitters/Role.emitter';\nimport { GrantEmitter } from './emitters/Grant.emitter';\nimport { TriggerEmitter } from './emitters/Trigger.emitter';\nimport { PolicyEmitter } from './emitters/Policy.emitter';\n\n/**\n * PostgresEmitter\n * \n * Orchestrates the conversion of an ExecutionPlan into Postgres SQL.\n */\nexport class PostgresEmitter {\n static emit(plan: ExecutionPlan): string {\n let sql = '-- Generated by @dbmason/postgres\\n\\n';\n\n // 1. Emit Schemas (Modules)\n const modules = new Set<string>();\n for (const step of plan) {\n if (step.node.module && step.node.module !== 'global') {\n modules.add(step.node.module);\n }\n }\n for (const mod of modules) {\n sql += `CREATE SCHEMA IF NOT EXISTS \"${mod}\";\\n`;\n }\n if (modules.size > 0) sql += '\\n';\n\n // 2. Emit Objects\n for (const step of plan) {\n switch (step.node.kind) {\n case 'Table':\n sql += TableEmitter.emit(step.action, step.node as any as AnalyzedTableNode, step.diff);\n break;\n case 'Procedure':\n sql += ProcedureEmitter.emit(step.node as any as ProcedureNode);\n break;\n case 'Function':\n sql += FunctionEmitter.emit(step.node as any as FunctionNode);\n break;\n case 'Extension':\n sql += ExtensionEmitter.emit(step.node as any as ExtensionNode);\n break;\n case 'Type':\n sql += TypeEmitter.emit(step.node as any as TypeNode);\n break;\n case 'View':\n case 'MaterializedView':\n sql += ViewEmitter.emit(step.node as any as ViewNode);\n break;\n case 'Cron':\n sql += CronEmitter.emit(step.node as any as CronNode);\n break;\n case 'Trigger':\n sql += TriggerEmitter.emit(step.node as any as TriggerNode);\n break;\n case 'Policy':\n sql += PolicyEmitter.emit(step.node as any as PolicyNode);\n break;\n case 'Role':\n sql += RoleEmitter.emit(step.node as any as RoleNode);\n break;\n case 'Grant':\n sql += GrantEmitter.emit(step.node as any as GrantNode);\n break;\n }\n }\n\n return sql;\n }\n}\n","import { Pool, PoolClient } from 'pg';\nimport { DbmasonDriver } from '@dbmason/core';\n\nexport class PostgresDriver implements DbmasonDriver {\n private pool: Pool;\n private client: PoolClient | null = null;\n\n constructor(connectionString: string) {\n this.pool = new Pool({ connectionString });\n }\n\n async connect(): Promise<void> {\n this.client = await this.pool.connect();\n }\n\n async close(): Promise<void> {\n if (this.client) {\n this.client.release();\n this.client = null;\n }\n await this.pool.end();\n }\n\n async query(sql: string, params?: any[]): Promise<unknown> {\n if (!this.client) throw new Error('Driver not connected');\n return this.client.query(sql, params);\n }\n\n async beginTransaction(): Promise<void> {\n await this.query('BEGIN');\n }\n\n async commitTransaction(): Promise<void> {\n await this.query('COMMIT');\n }\n\n async rollbackTransaction(): Promise<void> {\n await this.query('ROLLBACK');\n }\n}\n","import { TableNode, ColumnNode, IndexNode, ConstraintNode } from '@dbmason/core';\nimport { PostgresDriver } from '../PostgresDriver';\n\nexport class TableIntrospector {\n static async introspect(driver: PostgresDriver): Promise<Record<string, TableNode>> {\n const tableNodes: Record<string, TableNode> = {};\n\n // 1. Fetch Tables\n const tablesResult = await driver.query(`\n SELECT table_schema, table_name \n FROM information_schema.tables \n WHERE table_schema NOT IN ('information_schema', 'pg_catalog') \n AND table_type = 'BASE TABLE'\n `) as { rows: { table_schema: string; table_name: string }[] };\n\n for (const row of tablesResult.rows) {\n const schema = row.table_schema;\n const tableName = row.table_name;\n const columns = await this.introspectColumns(driver, schema, tableName);\n const indexes = await this.introspectIndexes(driver, schema, tableName);\n const constraints = await this.introspectConstraints(driver, schema, tableName);\n\n tableNodes[tableName] = {\n kind: 'Table',\n name: tableName,\n module: schema === 'public' ? 'global' : schema,\n columns,\n indexes,\n constraints, \n policies: [],\n triggers: []\n };\n }\n\n return tableNodes;\n }\n\n private static async introspectColumns(driver: PostgresDriver, schema: string, table: string): Promise<Record<string, ColumnNode>> {\n const columnsResult = await driver.query(`\n SELECT column_name, data_type, udt_name, is_nullable, column_default, is_identity\n FROM information_schema.columns \n WHERE table_schema = '${schema}' AND table_name = '${table}'\n `) as { rows: { column_name: string; data_type: string; udt_name: string; is_nullable: string; column_default: string; is_identity: string }[] };\n\n // Fetch PKs\n const pksResult = await driver.query(`\n SELECT kcu.column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n WHERE tc.constraint_type = 'PRIMARY KEY'\n AND tc.table_schema = '${schema}' AND tc.table_name = '${table}'\n `) as { rows: { column_name: string }[] };\n const pks = new Set(pksResult.rows.map(r => r.column_name));\n\n const columns: Record<string, ColumnNode> = {};\n for (const row of columnsResult.rows) {\n let type = row.data_type === 'USER-DEFINED' ? row.udt_name : row.data_type;\n let defaultValue = row.column_default || undefined;\n \n // Detect SERIAL/BIGSERIAL\n if (defaultValue && defaultValue.includes('nextval')) {\n if (type.toLowerCase() === 'integer' || type.toLowerCase() === 'int4') {\n type = 'SERIAL';\n defaultValue = undefined;\n } else if (type.toLowerCase() === 'bigint' || type.toLowerCase() === 'int8') {\n type = 'BIGSERIAL';\n defaultValue = undefined;\n }\n }\n\n columns[row.column_name] = {\n kind: 'Column',\n name: row.column_name,\n type: type.toUpperCase(),\n notNull: row.is_nullable === 'NO',\n default: defaultValue,\n primaryKey: pks.has(row.column_name),\n // Map is_identity to options or similar if strict mapping exists, \n // but Dbmason defines identity/sequence via options usually.\n // For now, if we want to represent it, we might need to extend ColumnNode to support 'identity'.\n // Checking ColumnNode definition in Table.internal.ts:\n // options?: unknown;\n // We can put it there.\n options: row.is_identity === 'YES' ? { identity: true } : undefined\n };\n }\n return columns;\n }\n\n private static async introspectIndexes(driver: PostgresDriver, schema: string, table: string): Promise<IndexNode[]> {\n const result = await driver.query(`\n SELECT \n i.relname as index_name,\n a.attname as column_name,\n ix.indisunique as is_unique\n FROM pg_class t, pg_class i, pg_index ix, pg_attribute a, pg_namespace n\n WHERE t.oid = ix.indrelid\n AND i.oid = ix.indexrelid\n AND a.attrelid = t.oid\n AND a.attnum = ANY(ix.indkey)\n AND t.relkind = 'r'\n AND t.relname = '${table}'\n AND n.oid = t.relnamespace\n AND n.nspname = '${schema}'\n ORDER BY i.relname\n `) as { rows: { index_name: string; column_name: string; is_unique: boolean }[] };\n\n // Group by index name\n const indexMap = new Map<string, IndexNode>();\n for (const row of result.rows) {\n if (!indexMap.has(row.index_name)) {\n indexMap.set(row.index_name, {\n kind: 'Index',\n name: row.index_name,\n table,\n columns: [],\n unique: row.is_unique\n });\n }\n indexMap.get(row.index_name)!.columns.push(row.column_name);\n }\n\n // Filter out PK indexes as they are implicit\n return Array.from(indexMap.values()).filter(idx => !idx.name.endsWith('_pkey'));\n }\n\n private static async introspectConstraints(driver: PostgresDriver, schema: string, table: string): Promise<ConstraintNode[]> {\n const constraints: ConstraintNode[] = [];\n\n // 1. Foreign Keys\n const fkResult = await driver.query(`\n SELECT\n tc.constraint_name,\n kcu.column_name,\n ccu.table_schema AS foreign_schema,\n ccu.table_name AS foreign_table,\n ccu.column_name AS foreign_column\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage AS ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_schema = '${schema}' AND tc.table_name = '${table}'\n `) as { rows: { constraint_name: string; column_name: string; foreign_schema: string; foreign_table: string; foreign_column: string }[] };\n\n for (const row of fkResult.rows) {\n // Construct definition string: FOREIGN KEY (col) REFERENCES table(col)\n const hasModule = row.foreign_schema && row.foreign_schema !== 'global' && row.foreign_schema !== 'public';\n const refTable = hasModule ? `\"${row.foreign_schema}\".\"${row.foreign_table}\"` : `\"${row.foreign_table}\"`;\n const definition = `FOREIGN KEY (\"${row.column_name}\") REFERENCES ${refTable}(\"${row.foreign_column}\")`;\n\n constraints.push({\n kind: 'Constraint',\n type: 'foreign_key',\n definition, \n name: row.constraint_name,\n table\n }); \n }\n\n // 2. Check Constraints\n const checkResult = await driver.query(`\n SELECT\n tc.constraint_name,\n cc.check_clause\n FROM information_schema.table_constraints tc\n JOIN information_schema.check_constraints cc\n ON tc.constraint_name = cc.constraint_name\n WHERE tc.constraint_type = 'CHECK'\n AND tc.table_schema = '${schema}' AND tc.table_name = '${table}'\n AND NOT (tc.constraint_name LIKE '%_not_null') -- Exclude internal NOT NULL checks\n `) as { rows: { constraint_name: string; check_clause: string }[] };\n\n for (const row of checkResult.rows) {\n constraints.push({\n kind: 'Constraint',\n type: 'check',\n name: row.constraint_name,\n table,\n definition: `CHECK (${row.check_clause})`\n });\n }\n\n // 3. Unique Constraints (Explicit constraints, not just unique indexes)\n const uniqueResult = await driver.query(`\n SELECT\n tc.constraint_name,\n kcu.column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n WHERE tc.constraint_type = 'UNIQUE'\n AND tc.table_schema = '${schema}' AND tc.table_name = '${table}'\n `) as { rows: { constraint_name: string; column_name: string }[] };\n\n const uniqueMap = new Map<string, string[]>();\n for (const row of uniqueResult.rows) {\n if (!uniqueMap.has(row.constraint_name)) uniqueMap.set(row.constraint_name, []);\n uniqueMap.get(row.constraint_name)!.push(row.column_name);\n }\n\n for (const [name, columns] of uniqueMap) {\n constraints.push({\n kind: 'Constraint',\n type: 'unique',\n name,\n table,\n definition: `UNIQUE (${columns.map(c => `\"${c}\"`).join(', ')})`\n });\n }\n\n return constraints;\n }\n}\n","import { ViewNode, MaterializedViewNode } from '@dbmason/core';\nimport { PostgresDriver } from '../PostgresDriver';\n\nexport class ViewIntrospector {\n static async introspect(driver: PostgresDriver): Promise<{ views: Record<string, ViewNode>, materializedViews: Record<string, MaterializedViewNode> }> {\n const result = await driver.query(`\n SELECT\n n.nspname as schema,\n c.relname as name,\n pg_get_viewdef(c.oid, true) as definition,\n c.relkind as kind\n FROM pg_class c\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE c.relkind IN ('v', 'm')\n AND n.nspname NOT IN ('information_schema', 'pg_catalog')\n `) as { rows: { schema: string; name: string; definition: string; kind: string }[] };\n\n const views: Record<string, ViewNode> = {};\n const materializedViews: Record<string, MaterializedViewNode> = {};\n\n for (const row of result.rows) {\n const name = row.name;\n const module = row.schema === 'public' ? 'global' : row.schema;\n const query = row.definition.trim();\n \n if (row.kind === 'v') {\n views[name] = { kind: 'View', name, module, query };\n } else {\n materializedViews[name] = { kind: 'MaterializedView', name, module, query };\n }\n }\n\n return { views, materializedViews };\n }\n}\n","import { TypeNode } from '@dbmason/core';\nimport { PostgresDriver } from '../PostgresDriver';\n\nexport class TypeIntrospector {\n static async introspect(driver: PostgresDriver): Promise<Record<string, TypeNode>> {\n const result = await driver.query(`\n SELECT \n n.nspname as schema,\n t.typname as name,\n e.enumlabel as value\n FROM pg_type t\n JOIN pg_enum e ON t.oid = e.enumtypid\n JOIN pg_namespace n ON n.oid = t.typnamespace\n WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')\n ORDER BY t.typname, e.enumsortorder\n `) as { rows: { schema: string; name: string; value: string }[] };\n\n const types: Record<string, TypeNode> = {};\n for (const row of result.rows) {\n const name = row.name;\n const module = row.schema === 'public' ? 'global' : row.schema;\n \n if (!types[name]) {\n types[name] = {\n kind: 'Type',\n name,\n module,\n type: 'enum',\n values: []\n };\n }\n types[name].values?.push(row.value);\n }\n return types;\n }\n}\n","import { FunctionNode } from '@dbmason/core';\nimport { PostgresDriver } from '../PostgresDriver';\n\nexport class FunctionIntrospector {\n static async introspect(driver: PostgresDriver): Promise<Record<string, FunctionNode>> {\n const result = await driver.query(`\n SELECT\n n.nspname as schema,\n p.proname as name,\n p.prosrc as body,\n l.lanname as language,\n pg_get_function_arguments(p.oid) as args,\n pg_get_function_result(p.oid) as returns\n FROM pg_proc p\n JOIN pg_namespace n ON n.oid = p.pronamespace\n JOIN pg_language l ON l.oid = p.prolang\n WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')\n AND p.prokind = 'f'\n `) as { rows: { schema: string; name: string; body: string; language: string; args: string; returns: string }[] };\n\n const functions: Record<string, FunctionNode> = {};\n\n for (const row of result.rows) {\n const name = row.name;\n const module = row.schema === 'public' ? 'global' : row.schema;\n \n const args: Record<string, string> = {};\n if (row.args) {\n // heuristic parser for \"a integer, b text\" or \"integer, text\"\n const parts = row.args.split(',').map(p => p.trim());\n for (const part of parts) {\n const subParts = part.split(' ').map(s => s.trim()).filter(Boolean);\n if (subParts.length >= 2) {\n // Skip direction keywords if present\n if (['IN', 'OUT', 'INOUT', 'VARIADIC'].includes(subParts[0].toUpperCase())) {\n if (subParts.length >= 3) {\n args[subParts[1]] = subParts.slice(2).join(' ');\n }\n } else {\n args[subParts[0]] = subParts.slice(1).join(' ');\n }\n }\n }\n }\n \n const body = row.body; \n\n functions[name] = {\n kind: 'Function',\n name,\n module,\n args,\n returns: row.returns,\n language: row.language,\n body\n };\n }\n\n return functions;\n }\n}\n","import { ProcedureNode } from '@dbmason/core';\nimport { PostgresDriver } from '../PostgresDriver';\n\nexport class ProcedureIntrospector {\n static async introspect(driver: PostgresDriver): Promise<Record<string, ProcedureNode>> {\n const result = await driver.query(`\n SELECT\n n.nspname as schema,\n p.proname as name,\n p.prosrc as body,\n l.lanname as language,\n pg_get_function_arguments(p.oid) as args,\n pg_get_function_result(p.oid) as returns\n FROM pg_proc p\n JOIN pg_namespace n ON n.oid = p.pronamespace\n JOIN pg_language l ON l.oid = p.prolang\n WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')\n AND p.prokind = 'p'\n `) as { rows: { schema: string; name: string; body: string; language: string; args: string; returns: string }[] };\n\n const procedures: Record<string, ProcedureNode> = {};\n\n for (const row of result.rows) {\n const name = row.name;\n const module = row.schema === 'public' ? 'global' : row.schema;\n \n const args: Record<string, string> = {};\n if (row.args) {\n const parts = row.args.split(',').map(p => p.trim());\n for (const part of parts) {\n const subParts = part.split(' ').map(s => s.trim()).filter(Boolean);\n if (subParts.length >= 2) {\n // Skip direction keywords if present\n if (['IN', 'OUT', 'INOUT', 'VARIADIC'].includes(subParts[0].toUpperCase())) {\n if (subParts.length >= 3) {\n args[subParts[1]] = subParts.slice(2).join(' ');\n }\n } else {\n args[subParts[0]] = subParts.slice(1).join(' ');\n }\n }\n }\n }\n \n const body = row.body; \n\n procedures[name] = {\n kind: 'Procedure',\n name,\n module,\n args,\n returns: row.returns,\n language: row.language,\n body\n };\n }\n\n return procedures;\n }\n}\n","import { TriggerNode } from '@dbmason/core';\nimport { PostgresDriver } from '../PostgresDriver';\n\nexport class TriggerIntrospector {\n static async introspect(driver: PostgresDriver): Promise<Record<string, TriggerNode>> {\n const result = await driver.query(`\n SELECT\n n.nspname as schema,\n t.tgname as name,\n c.relname as table_name,\n p.proname as function_name,\n t.tgtype as type,\n pg_get_triggerdef(t.oid) as definition\n FROM pg_trigger t\n JOIN pg_class c ON c.oid = t.tgrelid\n JOIN pg_namespace n ON n.oid = c.relnamespace\n JOIN pg_proc p ON p.oid = t.tgfoid\n WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')\n AND NOT t.tgisinternal\n `) as { rows: { schema: string; name: string; table_name: string; function_name: string; type: number; definition: string }[] };\n\n const triggers: Record<string, TriggerNode> = {};\n\n for (const row of result.rows) {\n const name = row.name;\n const module = row.schema === 'public' ? 'global' : row.schema;\n \n // Extract timing and events from definition or type\n // pg_get_triggerdef returns comprehensive string e.g. \"CREATE TRIGGER ... BEFORE INSERT OR UPDATE ON ...\"\n // We can parse the definition or use bitmask in tgtype.\n // Simplified parsing of definition for now:\n const def = row.definition.toUpperCase();\n \n let when = 'BEFORE';\n if (def.includes('AFTER')) when = 'AFTER';\n else if (def.includes('INSTEAD OF')) when = 'INSTEAD OF';\n\n const events: string[] = [];\n if (def.includes('INSERT')) events.push('INSERT');\n if (def.includes('UPDATE')) events.push('UPDATE');\n if (def.includes('DELETE')) events.push('DELETE');\n if (def.includes('TRUNCATE')) events.push('TRUNCATE');\n\n const forEach = def.includes('FOR EACH ROW') ? 'ROW' : 'STATEMENT';\n \n // condition (WHEN clause) is harder to extract from regex without robust parser.\n // Leaving condition undefined for now.\n\n triggers[name] = {\n kind: 'Trigger',\n name,\n table: row.table_name,\n module,\n functionName: row.function_name,\n when,\n events,\n forEach\n };\n }\n\n return triggers;\n }\n}\n","import { DbmasonIntrospector, Snapshot } from '@dbmason/core';\nimport { PostgresDriver } from './PostgresDriver';\nimport { TableIntrospector } from './introspectors/Table.introspector';\nimport { ViewIntrospector } from './introspectors/View.introspector';\nimport { TypeIntrospector } from './introspectors/Type.introspector';\nimport { FunctionIntrospector } from './introspectors/Function.introspector';\nimport { ProcedureIntrospector } from './introspectors/Procedure.introspector';\nimport { TriggerIntrospector } from './introspectors/Trigger.introspector';\n\nexport class PostgresIntrospector implements DbmasonIntrospector {\n async introspect(connectionString: string): Promise<Snapshot> {\n const driver = new PostgresDriver(connectionString);\n await driver.connect();\n\n try {\n const tables = await TableIntrospector.introspect(driver);\n const { views, materializedViews } = await ViewIntrospector.introspect(driver);\n const types = await TypeIntrospector.introspect(driver);\n const functions = await FunctionIntrospector.introspect(driver);\n const procedures = await ProcedureIntrospector.introspect(driver);\n const triggers = await TriggerIntrospector.introspect(driver);\n \n return {\n tables,\n procedures,\n functions,\n views,\n materializedViews,\n types,\n crons: {},\n extensions: {},\n roles: {},\n grants: {},\n policies: {},\n triggers,\n hashes: {}\n };\n } finally {\n await driver.close();\n }\n }\n}\n\n","import { \n DbmasonDialect, \n DbmasonDriver,\n TableNode, \n AnalyzedTableNode, \n IndexNode,\n ExecutionPlan,\n DbmasonContext\n} from '@dbmason/core';\nimport { PostgresEmitter } from './PostgresEmitter';\nimport { PostgresDriver } from './PostgresDriver';\nimport { PostgresIntrospector } from './PostgresIntrospector';\n\nexport class PostgresDialect implements DbmasonDialect {\n readonly name = 'postgres';\n\n private ctx?: DbmasonContext;\n\n constructor() {}\n\n setContext(ctx: DbmasonContext) {\n this.ctx = ctx;\n }\n\n analyzeTable(table: TableNode): AnalyzedTableNode {\n const dependencies: string[] = [];\n\n // 1. Column Dependencies (References & Types)\n for (const col of Object.values(table.columns)) {\n if (col.references) {\n dependencies.push(`table:${col.references.table}`);\n }\n if (this.ctx && this.ctx.types.has(col.type)) {\n dependencies.push(`type:${col.type}`);\n }\n }\n\n // 2. RLS Coverage analysis (Postgres specific)\n const policies = this.ctx ? Array.from(this.ctx.policies.values())\n .filter(p => p.table === table.name || (p.module === table.module && p.table === table.name)) : [];\n \n const rlsEnabled = policies.length > 0;\n\n // 3. Normalize index names\n const analyzedIndexes = table.indexes.map((idx: IndexNode) => ({\n ...idx,\n name: idx.name || `idx_${table.name}_${idx.columns.join('_')}`\n }));\n\n return {\n ...table,\n indexes: analyzedIndexes,\n dependencies,\n rls: {\n enabled: rlsEnabled,\n policies\n }\n };\n }\n\n emit(plan: ExecutionPlan): string {\n return PostgresEmitter.emit(plan);\n }\n\n getDriver(connectionString: string): DbmasonDriver {\n return new PostgresDriver(connectionString);\n }\n \n introspector = new PostgresIntrospector();\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefinePolicy, PolicyNode, DbOperation } from '@dbmason/core';\nimport { TableReference, RoleReference } from '@dbmason/core';\n\nexport type PolicyKind = DbOperation;\n\nexport type RolePermissionInput = {\n roles: RoleReference[];\n allow: PolicyKind[];\n};\n\nexport interface PolicyInput {\n table?: TableReference;\n method: 'rls' | 'rbac';\n rbac?: RolePermissionInput[];\n sql?: string;\n}\n\nexport interface TablePolicyDefinitionInput extends PolicyInput {\n name: string;\n}\n\nexport function definePolicy(scope: DbmasonContext | DbmasonScope, name: string, input: PolicyInput): PolicyNode {\n return internalDefinePolicy(scope, name, input);\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineProcedure } from '@dbmason/core';\nimport { ProcedureHandle, TypeReference, TableReference } from '@dbmason/core';\n\nexport interface PostgresProcedureInput {\n args?: Record<string, TypeReference>;\n returns?: TableReference | TypeReference | string;\n language?: 'plpgsql' | 'sql' | 'python' | 'javascript';\n body: string;\n}\n\nexport function defineProcedure(\n scope: DbmasonContext | DbmasonScope, \n name: string, \n input: PostgresProcedureInput\n): ProcedureHandle {\n return internalDefineProcedure(scope, name, input);\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineFunction } from '@dbmason/core';\nimport { FunctionHandle, TypeReference, TableReference } from '@dbmason/core';\n\nexport interface PostgresFunctionInput {\n args?: Record<string, TypeReference>;\n returns?: TableReference | TypeReference | string;\n language?: 'plpgsql' | 'sql' | 'python' | 'javascript';\n body: string;\n}\n\nexport function defineFunction(\n scope: DbmasonContext | DbmasonScope, \n name: string, \n input: PostgresFunctionInput\n): FunctionHandle {\n return internalDefineFunction(scope, name, input);\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineView, internalDefineMaterializedView } from '@dbmason/core';\n\nexport function defineView(\n scope: DbmasonContext | DbmasonScope, \n name: string, \n query: string\n): void {\n internalDefineView(scope, name, query);\n}\n\nexport function defineMaterializedView(\n scope: DbmasonContext | DbmasonScope, \n name: string, \n query: string\n): void {\n internalDefineMaterializedView(scope, name, query);\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineEnum, internalDefineCompositeType } from '@dbmason/core';\nimport { TypeHandle, TypeReference } from '@dbmason/core';\n\nexport function defineEnum(scope: DbmasonContext | DbmasonScope, name: string, values: string[]): TypeHandle {\n return internalDefineEnum(scope, name, values);\n}\n\nexport function defineCompositeType(scope: DbmasonContext | DbmasonScope, name: string, fields: Record<string, TypeReference>): TypeHandle {\n return internalDefineCompositeType(scope, name, fields);\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineTable, ColumnNode, IndexNode, ConstraintNode } from '@dbmason/core';\nimport { \n TableHandle, \n ColumnHandle, \n TableReference, \n RoleReference, \n resolveTable,\n resolveRole,\n ColumnReference,\n resolveColumn,\n ReferentialAction\n} from '@dbmason/core';\nimport { PolicyNode } from '@dbmason/core';\nimport { TablePolicyDefinitionInput } from './Policy';\nimport { TriggerNode } from '@dbmason/core';\nimport { TriggerInput } from './Trigger';\n\n/**\n * Postgres Index Helpers\n */\nexport type IndexMethod = 'btree' | 'hash' | 'gist' | 'gin' | 'brin' | 'spgist';\n\nfunction resolveColumns(refs: ColumnReference[]): string[] {\n return refs.map(ref => resolveColumn(ref).column);\n}\n\nexport const btree = (...columns: ColumnReference[]): IndexNode => ({\n kind: 'Index', name: '', table: '', columns: resolveColumns(columns), method: 'btree'\n});\nexport const gin = (...columns: ColumnReference[]): IndexNode => ({\n kind: 'Index', name: '', table: '', columns: resolveColumns(columns), method: 'gin'\n});\nexport const gist = (...columns: ColumnReference[]): IndexNode => ({\n kind: 'Index', name: '', table: '', columns: resolveColumns(columns), method: 'gist'\n});\nexport const hash = (...columns: ColumnReference[]): IndexNode => ({\n kind: 'Index', name: '', table: '', columns: resolveColumns(columns), method: 'hash'\n});\n\n/**\n * Postgres-specific Column Builder\n */\nexport class PostgresColumnBuilder {\n constructor(private readonly node: ColumnNode) {}\n\n primaryKey() {\n return new PostgresColumnBuilder({ ...this.node, primaryKey: true, notNull: true });\n }\n\n notNull() {\n return new PostgresColumnBuilder({ ...this.node, notNull: true });\n }\n\n unique() {\n return new PostgresColumnBuilder({ ...this.node, unique: true });\n }\n\n default(expr: string) {\n return new PostgresColumnBuilder({ ...this.node, default: expr });\n }\n\n defaultNow() {\n return new PostgresColumnBuilder({ ...this.node, default: 'NOW()' });\n }\n\n defaultUuid() {\n return new PostgresColumnBuilder({ ...this.node, default: 'gen_random_uuid()' });\n }\n\n check(expression: string) {\n return new PostgresColumnBuilder({ ...this.node, check: expression });\n }\n\n references(handle: ColumnReference, options?: { onDelete?: ReferentialAction, onUpdate?: ReferentialAction }): PostgresColumnBuilder;\n references(table: string, column: string, options?: { onDelete?: ReferentialAction, onUpdate?: ReferentialAction }): PostgresColumnBuilder;\n references(tableOrCol: ColumnReference | string, columnOrOptions?: string | { onDelete?: ReferentialAction, onUpdate?: ReferentialAction }, maybeOptions?: { onDelete?: ReferentialAction, onUpdate?: ReferentialAction }) {\n let tableName: string;\n let columnName: string;\n let options: { onDelete?: ReferentialAction, onUpdate?: ReferentialAction } | undefined;\n\n if (typeof tableOrCol !== 'string') {\n tableName = tableOrCol.tableName;\n columnName = tableOrCol.columnName;\n options = columnOrOptions as any;\n } else {\n tableName = tableOrCol;\n columnName = columnOrOptions as string;\n options = maybeOptions;\n }\n\n return new PostgresColumnBuilder({ \n ...this.node, \n references: {\n module: (tableOrCol as any).moduleName,\n table: tableName,\n column: columnName,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate\n } \n });\n }\n\n build(): ColumnNode {\n return this.node;\n }\n}\n\n/**\n * Postgres Column Factories\n */\nexport const text = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'TEXT' });\nexport const uuid = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'UUID' });\nexport const timestamptz = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'TIMESTAMPTZ' });\nexport const timestamp = timestamptz;\nexport const jsonb = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'JSONB' });\nexport const integer = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'INTEGER' });\nexport const boolean = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'BOOLEAN' });\nexport const doublePrecision = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'DOUBLE PRECISION' });\nexport const decimal = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'DECIMAL' });\nexport const serial = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'SERIAL' });\nexport const bigserial = (name: string = '') => new PostgresColumnBuilder({ kind: 'Column', name, type: 'BIGSERIAL' });\n\nexport const custom = (type: unknown, name: string = '') => {\n const typeName = typeof type === 'string' ? type : \n ((type as any).moduleName && (type as any).moduleName !== 'global' ? `\"${(type as any).moduleName}\".\"${(type as any).typeName}\"` : (type as any).typeName);\n return new PostgresColumnBuilder({ kind: 'Column', name, type: typeName });\n};\n\nexport const enumType = custom;\n\nexport interface PostgresTableInput<C = Record<string, unknown>> {\n columns: C;\n constraints?: ConstraintNode[];\n indexes?: IndexNode[];\n policies?: (PolicyNode | TablePolicyDefinitionInput)[];\n triggers?: (TriggerNode | TriggerInput)[];\n migration?: 'safe' | 'destructive';\n options?: {\n unlogged?: boolean;\n inherits?: TableReference;\n realtime?: boolean | RoleReference[];\n };\n}\n\n/**\n * Postgres-specific defineTable\n */\nexport function defineTable<C extends Record<string, PostgresColumnBuilder | string | ColumnNode>>(\n scope: DbmasonContext | DbmasonScope,\n name: string,\n input: PostgresTableInput<C>\n): TableHandle & { [K in keyof C]: ColumnHandle } {\n // We add Postgres-specific processing here before calling internal\n const postgresInput = {\n ...input,\n options: input.options ? {\n ...input.options,\n inherits: input.options.inherits ? resolveTable(input.options.inherits) : undefined,\n realtime: Array.isArray(input.options.realtime) \n ? input.options.realtime.map(r => resolveRole(r)) \n : input.options.realtime\n } : undefined\n };\n\n return internalDefineTable(scope, name, postgresInput, (cols: C) => {\n const processed: Record<string, ColumnNode> = {};\n for (const [colName, colDef] of Object.entries(cols)) {\n if (colDef instanceof PostgresColumnBuilder) {\n const node = colDef.build();\n node.name = colName;\n processed[colName] = node;\n } else if (typeof colDef === 'string') {\n processed[colName] = { kind: 'Column', name: colName, type: colDef };\n } else {\n processed[colName] = { ...colDef as ColumnNode, name: colName };\n }\n }\n return processed;\n }) as TableHandle & { [K in keyof C]: ColumnHandle };\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineTrigger, TriggerEvent, TriggerWhen, TriggerForEach } from '@dbmason/core';\nimport { ProcedureHandle, FunctionHandle } from '@dbmason/core';\n\nexport interface TriggerInput {\n when: TriggerWhen;\n events: TriggerEvent[];\n procedure: ProcedureHandle | FunctionHandle | string;\n forEach?: TriggerForEach;\n condition?: string;\n}\n\nexport function defineTrigger(\n scope: DbmasonContext | DbmasonScope, \n tableName: string, \n name: string, \n input: TriggerInput\n): void {\n internalDefineTrigger(scope, tableName, name, input);\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineRole, RoleNode } from '@dbmason/core';\nimport { RoleHandle } from '@dbmason/core';\n\nexport function defineRole(scope: DbmasonContext | DbmasonScope, name: string, options?: RoleNode['options']): RoleHandle {\n return internalDefineRole(scope, name, options);\n}\n","import { DbmasonContext } from '@dbmason/core';\nimport { internalDefineGrant, GrantObjectKind } from '@dbmason/core';\nimport { TableReference, RoleReference } from '@dbmason/core';\n\nexport function defineGrant(\n ctx: DbmasonContext, \n to: RoleReference, \n privileges: string[], \n kind: GrantObjectKind, \n on: TableReference\n): void {\n return internalDefineGrant(ctx, to, privileges, kind, on);\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineExtension } from '@dbmason/core';\n\nexport function defineExtension(scope: DbmasonContext | DbmasonScope, name: string, options?: { schema?: string, version?: string }): void {\n return internalDefineExtension(scope, name, options);\n}\n","import { DbmasonContext, DbmasonScope } from '@dbmason/core';\nimport { internalDefineCron } from '@dbmason/core';\n\nexport function defineCron(scope: DbmasonContext | DbmasonScope, name: string, schedule: string, command: string): void {\n return internalDefineCron(scope, name, schedule, command);\n}\n"],"names":["TableEmitter","action","node","diff","oldNode","columns","col","constraints","c","hasModule","fullName","sqlText","newNode","changes","name","parts","refTableName","idx","method","unique","where","expr","tableName","sql","oldIndexes","newIdx","ProcedureEmitter","argList","type","FunctionEmitter","ViewEmitter","ExtensionEmitter","CronEmitter","TypeEmitter","vals","v","fields","RoleEmitter","options","opts","GrantEmitter","TriggerEmitter","PolicyEmitter","perm","r","PostgresEmitter","plan","modules","step","mod","PostgresDriver","connectionString","Pool","params","TableIntrospector","driver","tableNodes","tablesResult","row","schema","indexes","table","columnsResult","pksResult","pks","defaultValue","result","indexMap","fkResult","refTable","definition","checkResult","uniqueResult","uniqueMap","ViewIntrospector","views","materializedViews","module","query","TypeIntrospector","types","FunctionIntrospector","functions","args","p","part","subParts","s","body","ProcedureIntrospector","procedures","TriggerIntrospector","triggers","def","when","events","forEach","PostgresIntrospector","tables","PostgresDialect","ctx","dependencies","policies","rlsEnabled","analyzedIndexes","definePolicy","scope","input","internalDefinePolicy","defineProcedure","internalDefineProcedure","defineFunction","internalDefineFunction","defineView","internalDefineView","defineMaterializedView","internalDefineMaterializedView","defineEnum","values","internalDefineEnum","defineCompositeType","internalDefineCompositeType","resolveColumns","refs","ref","resolveColumn","btree","gin","gist","hash","PostgresColumnBuilder","expression","tableOrCol","columnOrOptions","maybeOptions","columnName","text","uuid","timestamptz","timestamp","jsonb","integer","boolean","doublePrecision","decimal","serial","bigserial","custom","typeName","enumType","defineTable","postgresInput","resolveTable","resolveRole","internalDefineTable","cols","processed","colName","colDef","defineTrigger","internalDefineTrigger","defineRole","internalDefineRole","defineGrant","to","privileges","kind","on","internalDefineGrant","defineExtension","internalDefineExtension","defineCron","schedule","command","internalDefineCron"],"mappings":"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"}