@ez4/pgmigration 0.26.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Silas B.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # EZ4: PgMigration
2
+
3
+ It provides a PostgreSQL migration library.
4
+
5
+ ## Getting started
6
+
7
+ #### Install
8
+
9
+ ```sh
10
+ npm install @ez4/pgmigration -D
11
+ ```
12
+
13
+ ## License
14
+
15
+ MIT License
@@ -0,0 +1,18 @@
1
+ import type { PgIndexRepository } from '@ez4/pgclient/library';
2
+ import type { AnySchema, ObjectSchema } from '@ez4/schema';
3
+ import type { ObjectComparison } from '@ez4/utils';
4
+ import type { SqlBuilder } from '@ez4/pgsql';
5
+ export declare const prepareCreateColumns: (builder: SqlBuilder, table: string, indexes: PgIndexRepository, columns: Record<string, AnySchema>) => {
6
+ query: string;
7
+ };
8
+ export declare const prepareUpdateColumns: (builder: SqlBuilder, table: string, schema: ObjectSchema, indexes: PgIndexRepository, changes: Record<string, ObjectComparison>) => {
9
+ check: string;
10
+ query: string;
11
+ }[];
12
+ export declare const prepareRenameColumns: (builder: SqlBuilder, table: string, changes: Record<string, string>) => {
13
+ check: string;
14
+ query: string;
15
+ }[];
16
+ export declare const prepareDeleteColumns: (builder: SqlBuilder, table: string, columns: Record<string, AnySchema>) => {
17
+ query: string;
18
+ };
@@ -0,0 +1,25 @@
1
+ import type { AnySchema, ObjectSchema, ObjectSchemaProperties } from '@ez4/schema';
2
+ import type { ObjectComparison } from '@ez4/utils';
3
+ import type { SqlBuilder } from '@ez4/pgsql';
4
+ export declare const prepareCreateConstraints: (builder: SqlBuilder, table: string, columns: Record<string, AnySchema>) => {
5
+ check: string;
6
+ query: string;
7
+ }[];
8
+ export declare const prepareUpdateConstraints: (builder: SqlBuilder, table: string, targetSchema: ObjectSchema, sourceSchema: ObjectSchema, changes: Record<string, ObjectComparison>) => ({
9
+ query: string;
10
+ check?: undefined;
11
+ } | {
12
+ check: string;
13
+ query: string;
14
+ })[];
15
+ export declare const prepareRenameConstraints: (builder: SqlBuilder, fromTable: string, toTable: string, columns: Record<string, AnySchema>) => {
16
+ check: string;
17
+ query: string;
18
+ }[];
19
+ export declare const prepareRenameConstraintColumns: (builder: SqlBuilder, table: string, columns: ObjectSchemaProperties, changes: Record<string, string>) => {
20
+ check: string;
21
+ query: string;
22
+ }[];
23
+ export declare const prepareDeleteConstraints: (builder: SqlBuilder, table: string, columns: Record<string, AnySchema>) => {
24
+ query: string;
25
+ }[];
@@ -0,0 +1,7 @@
1
+ export declare const prepareCreateDatabase: (database: string) => {
2
+ check: string;
3
+ query: string;
4
+ };
5
+ export declare const prepareDeleteDatabase: (database: string) => {
6
+ query: string;
7
+ };
@@ -0,0 +1,9 @@
1
+ import type { PgIndexRepository } from '@ez4/pgclient/library';
2
+ import type { ObjectSchema } from '@ez4/schema';
3
+ import type { SqlBuilder } from '@ez4/pgsql';
4
+ import type { PgMigrationQueries } from '../types/query.js';
5
+ type IndexQueries = Pick<PgMigrationQueries, 'constraints' | 'indexes'>;
6
+ export declare const prepareCreateIndexes: (builder: SqlBuilder, table: string, schema: ObjectSchema, indexes: PgIndexRepository, concurrent: boolean) => IndexQueries;
7
+ export declare const prepareRenameIndexes: (builder: SqlBuilder, fromTable: string, toTable: string, indexes: PgIndexRepository) => IndexQueries;
8
+ export declare const prepareDeleteIndexes: (builder: SqlBuilder, table: string, indexes: PgIndexRepository) => IndexQueries;
9
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { PgRelationRepository } from '@ez4/pgclient/library';
2
+ import type { ObjectSchema } from '@ez4/schema';
3
+ import type { ObjectComparison } from '@ez4/utils';
4
+ import type { SqlBuilder } from '@ez4/pgsql';
5
+ export declare const prepareCreateRelations: (builder: SqlBuilder, table: string, schema: ObjectSchema, relations: PgRelationRepository) => {
6
+ check: string;
7
+ query: string;
8
+ }[];
9
+ export declare const prepareUpdateRelations: (builder: SqlBuilder, table: string, relations: PgRelationRepository, changes: Record<string, ObjectComparison>) => any[];
10
+ export declare const prepareRenameRelations: (builder: SqlBuilder, fromTable: string, toTable: string, relations: PgRelationRepository) => {
11
+ check: string;
12
+ query: string;
13
+ }[];
14
+ export declare const prepareDeleteRelations: (builder: SqlBuilder, table: string, relations: PgRelationRepository) => {
15
+ query: string;
16
+ }[];
@@ -0,0 +1,12 @@
1
+ import type { PgIndexRepository } from '@ez4/pgclient/library';
2
+ import type { ObjectSchema } from '@ez4/schema';
3
+ import type { SqlBuilder } from '@ez4/pgsql';
4
+ export declare const prepareCreateTable: (builder: SqlBuilder, table: string, schema: ObjectSchema, indexes: PgIndexRepository) => {
5
+ query: string;
6
+ };
7
+ export declare const prepareRenameTable: (builder: SqlBuilder, fromTable: string, toTable: string) => {
8
+ query: string;
9
+ };
10
+ export declare const prepareDeleteTable: (builder: SqlBuilder, table: string) => {
11
+ query: string;
12
+ };
@@ -0,0 +1,95 @@
1
+ "use strict";var k=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var i=(e,t)=>k(e,"name",{value:t,configurable:!0});var H=(e,t)=>{for(var r in t)k(e,r,{get:t[r],enumerable:!0})},J=(e,t,r,n)=>{if(t&&
2
+ typeof t=="object"||typeof t=="function")for(let o of v(t))!G.call(e,o)&&o!==r&&
3
+ k(e,o,{get:()=>t[o],enumerable:!(n=V(t,o))||n.enumerable});return e};var W=e=>J(k({},"__esModule",{value:!0}),e);var he={};H(he,{getTableRepositoryChanges:()=>X,prepareCreateColumns:()=>de,prepareCreateDatabase:()=>ee,
4
+ prepareCreateIndexes:()=>ae,prepareCreateRelations:()=>pe,prepareCreateTable:()=>oe,
5
+ prepareDeleteColumns:()=>Se,prepareDeleteDatabase:()=>te,prepareDeleteIndexes:()=>me,
6
+ prepareDeleteRelations:()=>ge,prepareDeleteTable:()=>se,prepareRenameColumns:()=>xe,
7
+ prepareRenameIndexes:()=>ce,prepareRenameRelations:()=>ye,prepareRenameTable:()=>ie,
8
+ prepareUpdateColumns:()=>fe,prepareUpdateRelations:()=>le});module.exports=W(he);var d=require("@ez4/utils"),A=require("@ez4/pgclient/library"),T=require("@ez4/schema");var X=i((e,t)=>(0,d.deepCompareObject)(e,t,{onRename:i((r,n)=>!(0,d.isAnyObject)(
9
+ r)||!(0,d.isAnyObject)(n)?!1:(0,A.isRepositoryTable)(r)&&(0,A.isRepositoryTable)(
10
+ n)?Y(r.schema,n.schema):(0,T.isAnySchema)(r)&&(0,T.isAnySchema)(n)?Z(r,n):!1,"on\
11
+ Rename")}),"getTableRepositoryChanges"),Y=i((e,t)=>(0,d.deepEqual)(Object.keys(e.
12
+ properties),Object.keys(t.properties)),"canRenameTable"),Z=i((e,t)=>(0,d.deepEqual)(
13
+ e,t,{depth:1,include:{type:!0,definitions:!0,nullable:!0,format:!0}}),"canRename\
14
+ Column");var D=require("@ez4/pgsql");var z=i((e,t)=>{let[r]=e.select().rawColumn("1").from("pg_database").where({datname:e.
15
+ rawString(t)}).build();return r},"getCheckDatabaseQuery"),f=i((e,t)=>{let[r]=e.select().
16
+ rawColumn("1").from("pg_constraint").where({conname:e.rawString(t)}).build();return r},
17
+ "getCheckConstraintQuery"),B=i((e,t,r)=>{let[n]=e.select().rawColumn("1").from("\
18
+ information_schema.columns").where({column_name:e.rawString(r),table_name:e.rawString(
19
+ t)}).build();return n},"getCheckColumnQuery");var ee=i(e=>{let t=new D.SqlBuilder;return{check:z(t,e),query:`CREATE DATABASE "${e}\
20
+ "`}},"prepareCreateDatabase"),te=i(e=>({query:`DROP DATABASE IF EXISTS "${e}" WI\
21
+ TH (FORCE)`}),"prepareDeleteDatabase");var E=require("@ez4/database");var p=require("@ez4/schema"),Q=require("@ez4/utils");var h=i(e=>!!(e.nullable||e.optional),"isOptionalColumn"),q=i((e,t)=>{if((0,p.isScalarSchema)(
22
+ e)||(0,p.isObjectSchema)(e)||(0,p.isArraySchema)(e)||(0,p.isTupleSchema)(e)){let{
23
+ definitions:r}=e;switch(typeof r?.default){case"boolean":case"number":return`${r.
24
+ default}`;case"string":return`'${r.default}'`;case"object":return`'${JSON.stringify(
25
+ r.default)}'`}}if((0,p.isEnumSchema)(e)){let{definitions:r}=e;if(r?.default)return`\
26
+ '${r.default}'`}if((0,p.isStringSchema)(e)&&t)switch(e.format){case"date-time":case"\
27
+ date":case"time":return"now()";case"uuid":return"gen_random_uuid()"}if(h(e))return"\
28
+ null"},"getColumnDefault"),b=i((e,t)=>{switch(e.type){case p.SchemaType.Array:case p.SchemaType.
29
+ Object:case p.SchemaType.Reference:case p.SchemaType.Union:case p.SchemaType.Tuple:
30
+ return"jsonb";case p.SchemaType.Boolean:return"boolean";case p.SchemaType.Enum:return"\
31
+ text";case p.SchemaType.Number:return re(e,t);case p.SchemaType.String:return ne(
32
+ e)}},"getColumnType"),re=i((e,t)=>e.format==="integer"?t?"bigserial":"bigint":"d\
33
+ ecimal","getColumNumberType"),ne=i(e=>{switch(e.format){case"uuid":case"time":case"\
34
+ date":return e.format;case"date-time":return"timestamptz";default:let t=e.definitions?.
35
+ maxLength;return(0,Q.isAnyNumber)(t)?`varchar(${t})`:"text"}},"getColumnTextType");var oe=i((e,t,r,n)=>{let o=e.table(t).create().missing();for(let a in r.properties){
36
+ let s=r.properties[a],u=n[a]?.type===E.Index.Primary,c=!h(s),l=b(s,u),g=q(s,u);o.
37
+ column(a,l,c,g).missing()}return{query:o.build()}},"prepareCreateTable"),ie=i((e,t,r)=>({
38
+ query:e.table(t).rename(r).existing().build()}),"prepareRenameTable"),se=i((e,t)=>({
39
+ query:e.table(t).drop().existing().cascade().build()}),"prepareDeleteTable");var N=require("@ez4/schema"),y=require("@ez4/database");var _=require("@ez4/utils");var C=i((e,t)=>`${O(e,t)}_pk`,"getPrimaryKeyName"),R=i((e,t)=>`${O(e,t)}_uk`,"ge\
40
+ tUniqueKeyName"),I=i((e,t)=>`${O(e,t)}_sk`,"getSecondaryKeyName"),x=i((e,t)=>`${O(
41
+ e,t)}_fk`,"getRelationName");var O=i((e,t)=>`${e}_${(0,_.toSnakeCase)(t.replaceAll(":","_"))}`,"getName");var ae=i((e,t,r,n,o)=>{let a={constraints:[],indexes:[]};for(let s in n){let{columns:m,
42
+ type:u}=n[s];switch(u){default:throw new Error("Unsupported index type.");case y.Index.
43
+ Primary:{let c=C(t,s),l=e.table(t).alter().existing().constraint(c).primary(m);a.
44
+ constraints.push({check:f(e,c),query:l.build()});break}case y.Index.Unique:{let c=R(
45
+ t,s),l=e.table(t).alter().existing().constraint(c).unique(m);a.constraints.push(
46
+ {check:f(e,c),query:l.build()});break}case y.Index.Secondary:{let c=I(t,s),l=ue(
47
+ m,r),g=e.index(c).create(t,m).type(l).missing();o&&g.concurrent(),a.indexes.push(
48
+ {query:g.build()});break}}}return a},"prepareCreateIndexes"),ce=i((e,t,r,n)=>{let o={
49
+ constraints:[],indexes:[]};for(let a in n){let{type:s}=n[a];switch(s){default:throw new Error(
50
+ "Unsupported index type.");case y.Index.Primary:{let m=C(t,a),u=C(r,a),c=e.table(
51
+ r).alter().existing().constraint(m).rename(u);o.constraints.push({check:f(e,u),query:c.
52
+ build()});break}case y.Index.Unique:{let m=R(t,a),u=R(r,a),c=e.table(r).alter().
53
+ existing().constraint(m).rename(u);o.constraints.push({check:f(e,u),query:c.build()});
54
+ break}case y.Index.Secondary:{let m=I(t,a),u=I(r,a),c=e.index(m).rename(u).existing();
55
+ o.indexes.push({query:c.build()});break}}}return o},"prepareRenameIndexes"),me=i(
56
+ (e,t,r)=>{let n={constraints:[],indexes:[]};for(let o in r){let{type:a}=r[o];switch(a){default:
57
+ throw new Error("Unsupported index type.");case y.Index.Primary:{let s=C(t,o),m=e.
58
+ table(t).alter().existing().constraint(s).drop().existing();n.constraints.push({
59
+ query:m.build()});break}case y.Index.Unique:{let s=R(t,o),m=e.table(t).alter().existing().
60
+ constraint(s).drop().existing();n.constraints.push({query:m.build()});break}case y.Index.
61
+ Secondary:{let s=I(t,o),m=e.index(s).drop().existing().concurrent();n.indexes.push(
62
+ {query:m.build()});break}}}return n},"prepareDeleteIndexes"),ue=i((e,t)=>{if(e.length===
63
+ 1){let[r]=e;switch(t.properties[r]?.type){case N.SchemaType.Object:case N.SchemaType.
64
+ Union:case N.SchemaType.Array:case N.SchemaType.Tuple:return"GIN"}}return"BTREE"},
65
+ "getIndexType");var $=require("@ez4/pgclient/library"),U=require("@ez4/schema"),P=require("@ez4/database");var pe=i((e,t,r,n)=>{let o=[];for(let a in n){let s=n[a];if(s.targetIndex===P.Index.
66
+ Primary)continue;let{[s.targetColumn]:m}=r.properties,u=x(t,a),c=!!(0,U.IsNullishSchema)(
67
+ m);o.push({check:f(e,u),query:F(e,t,u,s,c).build()})}return o},"prepareCreateRel\
68
+ ations"),le=i((e,t,r,n)=>{let o=[];for(let a in r){let s=r[a];if(s.targetIndex===
69
+ P.Index.Primary)continue;let m=n[s.targetColumn]?.update,u=m?.optional??m?.nullable;
70
+ if(u===void 0)continue;let c=x(t,a);o.push({query:K(e,t,c).build()},{query:F(e,t,
71
+ c,s,u).build()})}return o},"prepareUpdateRelations"),ye=i((e,t,r,n)=>{let o=[];for(let a in n){
72
+ if(n[a].targetIndex===P.Index.Primary)continue;let m=x(t,a),u=x(r,a),c=e.table(r).
73
+ alter().existing().constraint(m).rename(u);o.push({check:f(e,u),query:c.build()})}
74
+ return o},"prepareRenameRelations"),ge=i((e,t,r)=>{let n=[];for(let o in r){if(r[o].
75
+ targetIndex===P.Index.Primary)continue;let s=x(t,o);n.push({query:K(e,t,s).build()})}
76
+ return n},"prepareDeleteRelations"),K=i((e,t,r)=>e.table(t).alter().existing().constraint(
77
+ r).drop().existing(),"getDeleteRelationQuery"),F=i((e,t,r,n,o)=>{let{sourceAlias:a,
78
+ sourceColumn:s,targetColumn:m}=n,u=(0,$.getTableName)(a),c=e.table(t).alter().existing().
79
+ constraint(r).foreign(m,u,[s]);return o?c.delete().null():c.delete().cascade(),c.
80
+ update().cascade(),c},"getCreateRelationQuery");var j=require("@ez4/database");var de=i((e,t,r,n)=>{let o=e.table(t).alter().existing();for(let a in n){let s=n[a],
81
+ u=r[a]?.type===j.Index.Primary,c=!h(s),l=b(s,u),g=q(s,u);o.add(a,l,c,g).missing()}
82
+ return{query:o.build()}},"prepareCreateColumns"),fe=i((e,t,r,n,o)=>{let a=[];for(let s in o){
83
+ let{update:m,nested:u}=o[s],c=r.properties[s],g=n[s]?.type===j.Index.Primary,L=u?.
84
+ definitions?.update?.default,w=m?.optional??m?.nullable,M=m?.type,S=e.table(t).alter().
85
+ existing().column(s);M!==void 0&&S.type(b(c,g)),w!==void 0&&S.optional(w),L!==void 0&&
86
+ S.default(q(c,g)),!S.empty&&a.push({check:B(e,t,s),query:S.build()})}return a},"\
87
+ prepareUpdateColumns"),xe=i((e,t,r)=>{let n=[];for(let o in r){let a=r[o],s=e.table(
88
+ t).alter().existing().rename(o,a);n.push({check:B(e,t,o),query:s.build()})}return n},
89
+ "prepareRenameColumns"),Se=i((e,t,r)=>{let n=e.table(t).alter().existing();for(let o in r)
90
+ n.drop(o).existing();return{query:n.build()}},"prepareDeleteColumns");0&&(module.exports={getTableRepositoryChanges,prepareCreateColumns,prepareCreateDatabase,
91
+ prepareCreateIndexes,prepareCreateRelations,prepareCreateTable,prepareDeleteColumns,
92
+ prepareDeleteDatabase,prepareDeleteIndexes,prepareDeleteRelations,prepareDeleteTable,
93
+ prepareRenameColumns,prepareRenameIndexes,prepareRenameRelations,prepareRenameTable,
94
+ prepareUpdateColumns,prepareUpdateRelations});
95
+ //# sourceMappingURL=library.cjs.map
@@ -0,0 +1,7 @@
1
+ export * from './utils/repository.js';
2
+ export * from './types/query.js';
3
+ export * from './common/database.js';
4
+ export * from './common/tables.js';
5
+ export * from './common/indexes.js';
6
+ export * from './common/relations.js';
7
+ export * from './common/columns.js';
@@ -0,0 +1,88 @@
1
+ var $=Object.defineProperty;var o=(e,t)=>$(e,"name",{value:t,configurable:!0});import{deepEqual as j,deepCompareObject as U,isAnyObject as A}from"@ez4/utils";import{
2
+ isRepositoryTable as T}from"@ez4/pgclient/library";import{isAnySchema as B}from"@ez4/schema";var ce=o((e,t)=>U(e,t,{onRename:o((r,n)=>!A(r)||!A(n)?!1:T(r)&&T(n)?K(r.schema,n.
3
+ schema):B(r)&&B(n)?F(r,n):!1,"onRename")}),"getTableRepositoryChanges"),K=o((e,t)=>j(
4
+ Object.keys(e.properties),Object.keys(t.properties)),"canRenameTable"),F=o((e,t)=>j(
5
+ e,t,{depth:1,include:{type:!0,definitions:!0,nullable:!0,format:!0}}),"canRename\
6
+ Column");import{SqlBuilder as L}from"@ez4/pgsql";var w=o((e,t)=>{let[r]=e.select().rawColumn("1").from("pg_database").where({datname:e.
7
+ rawString(t)}).build();return r},"getCheckDatabaseQuery"),d=o((e,t)=>{let[r]=e.select().
8
+ rawColumn("1").from("pg_constraint").where({conname:e.rawString(t)}).build();return r},
9
+ "getCheckConstraintQuery"),k=o((e,t,r)=>{let[n]=e.select().rawColumn("1").from("\
10
+ information_schema.columns").where({column_name:e.rawString(r),table_name:e.rawString(
11
+ t)}).build();return n},"getCheckColumnQuery");var de=o(e=>{let t=new L;return{check:w(t,e),query:`CREATE DATABASE "${e}"`}},"p\
12
+ repareCreateDatabase"),fe=o(e=>({query:`DROP DATABASE IF EXISTS "${e}" WITH (FOR\
13
+ CE)`}),"prepareDeleteDatabase");import{Index as Z}from"@ez4/database";import{isArraySchema as M,isEnumSchema as V,isObjectSchema as v,isScalarSchema as G,
14
+ isStringSchema as H,isTupleSchema as J,SchemaType as y}from"@ez4/schema";import{
15
+ isAnyNumber as W}from"@ez4/utils";var S=o(e=>!!(e.nullable||e.optional),"isOptionalColumn"),h=o((e,t)=>{if(G(e)||v(
16
+ e)||M(e)||J(e)){let{definitions:r}=e;switch(typeof r?.default){case"boolean":case"\
17
+ number":return`${r.default}`;case"string":return`'${r.default}'`;case"object":return`\
18
+ '${JSON.stringify(r.default)}'`}}if(V(e)){let{definitions:r}=e;if(r?.default)return`\
19
+ '${r.default}'`}if(H(e)&&t)switch(e.format){case"date-time":case"date":case"time":
20
+ return"now()";case"uuid":return"gen_random_uuid()"}if(S(e))return"null"},"getCol\
21
+ umnDefault"),q=o((e,t)=>{switch(e.type){case y.Array:case y.Object:case y.Reference:case y.
22
+ Union:case y.Tuple:return"jsonb";case y.Boolean:return"boolean";case y.Enum:return"\
23
+ text";case y.Number:return X(e,t);case y.String:return Y(e)}},"getColumnType"),X=o(
24
+ (e,t)=>e.format==="integer"?t?"bigserial":"bigint":"decimal","getColumNumberType"),
25
+ Y=o(e=>{switch(e.format){case"uuid":case"time":case"date":return e.format;case"d\
26
+ ate-time":return"timestamptz";default:let t=e.definitions?.maxLength;return W(t)?
27
+ `varchar(${t})`:"text"}},"getColumnTextType");var Ne=o((e,t,r,n)=>{let s=e.table(t).create().missing();for(let a in r.properties){
28
+ let i=r.properties[a],u=n[a]?.type===Z.Primary,c=!S(i),p=q(i,u),l=h(i,u);s.column(
29
+ a,p,c,l).missing()}return{query:s.build()}},"prepareCreateTable"),Pe=o((e,t,r)=>({
30
+ query:e.table(t).rename(r).existing().build()}),"prepareRenameTable"),ke=o((e,t)=>({
31
+ query:e.table(t).drop().existing().cascade().build()}),"prepareDeleteTable");import{SchemaType as N}from"@ez4/schema";import{Index as g}from"@ez4/database";import{toSnakeCase as ee}from"@ez4/utils";var b=o((e,t)=>`${I(e,t)}_pk`,"getPrimaryKeyName"),C=o((e,t)=>`${I(e,t)}_uk`,"ge\
32
+ tUniqueKeyName"),R=o((e,t)=>`${I(e,t)}_sk`,"getSecondaryKeyName"),f=o((e,t)=>`${I(
33
+ e,t)}_fk`,"getRelationName");var I=o((e,t)=>`${e}_${ee(t.replaceAll(":","_"))}`,"getName");var Ee=o((e,t,r,n,s)=>{let a={constraints:[],indexes:[]};for(let i in n){let{columns:m,
34
+ type:u}=n[i];switch(u){default:throw new Error("Unsupported index type.");case g.
35
+ Primary:{let c=b(t,i),p=e.table(t).alter().existing().constraint(c).primary(m);a.
36
+ constraints.push({check:d(e,c),query:p.build()});break}case g.Unique:{let c=C(t,
37
+ i),p=e.table(t).alter().existing().constraint(c).unique(m);a.constraints.push({check:d(
38
+ e,c),query:p.build()});break}case g.Secondary:{let c=R(t,i),p=te(m,r),l=e.index(
39
+ c).create(t,m).type(p).missing();s&&l.concurrent(),a.indexes.push({query:l.build()});
40
+ break}}}return a},"prepareCreateIndexes"),_e=o((e,t,r,n)=>{let s={constraints:[],
41
+ indexes:[]};for(let a in n){let{type:i}=n[a];switch(i){default:throw new Error("\
42
+ Unsupported index type.");case g.Primary:{let m=b(t,a),u=b(r,a),c=e.table(r).alter().
43
+ existing().constraint(m).rename(u);s.constraints.push({check:d(e,u),query:c.build()});
44
+ break}case g.Unique:{let m=C(t,a),u=C(r,a),c=e.table(r).alter().existing().constraint(
45
+ m).rename(u);s.constraints.push({check:d(e,u),query:c.build()});break}case g.Secondary:{
46
+ let m=R(t,a),u=R(r,a),c=e.index(m).rename(u).existing();s.indexes.push({query:c.
47
+ build()});break}}}return s},"prepareRenameIndexes"),$e=o((e,t,r)=>{let n={constraints:[],
48
+ indexes:[]};for(let s in r){let{type:a}=r[s];switch(a){default:throw new Error("\
49
+ Unsupported index type.");case g.Primary:{let i=b(t,s),m=e.table(t).alter().existing().
50
+ constraint(i).drop().existing();n.constraints.push({query:m.build()});break}case g.
51
+ Unique:{let i=C(t,s),m=e.table(t).alter().existing().constraint(i).drop().existing();
52
+ n.constraints.push({query:m.build()});break}case g.Secondary:{let i=R(t,s),m=e.index(
53
+ i).drop().existing().concurrent();n.indexes.push({query:m.build()});break}}}return n},
54
+ "prepareDeleteIndexes"),te=o((e,t)=>{if(e.length===1){let[r]=e;switch(t.properties[r]?.
55
+ type){case N.Object:case N.Union:case N.Array:case N.Tuple:return"GIN"}}return"B\
56
+ TREE"},"getIndexType");import{getTableName as re}from"@ez4/pgclient/library";import{IsNullishSchema as ne}from"@ez4/schema";
57
+ import{Index as P}from"@ez4/database";var Ge=o((e,t,r,n)=>{let s=[];for(let a in n){let i=n[a];if(i.targetIndex===P.Primary)
58
+ continue;let{[i.targetColumn]:m}=r.properties,u=f(t,a),c=!!ne(m);s.push({check:d(
59
+ e,u),query:D(e,t,u,i,c).build()})}return s},"prepareCreateRelations"),He=o((e,t,r,n)=>{
60
+ let s=[];for(let a in r){let i=r[a];if(i.targetIndex===P.Primary)continue;let m=n[i.
61
+ targetColumn]?.update,u=m?.optional??m?.nullable;if(u===void 0)continue;let c=f(
62
+ t,a);s.push({query:z(e,t,c).build()},{query:D(e,t,c,i,u).build()})}return s},"pr\
63
+ epareUpdateRelations"),Je=o((e,t,r,n)=>{let s=[];for(let a in n){if(n[a].targetIndex===
64
+ P.Primary)continue;let m=f(t,a),u=f(r,a),c=e.table(r).alter().existing().constraint(
65
+ m).rename(u);s.push({check:d(e,u),query:c.build()})}return s},"prepareRenameRela\
66
+ tions"),We=o((e,t,r)=>{let n=[];for(let s in r){if(r[s].targetIndex===P.Primary)
67
+ continue;let i=f(t,s);n.push({query:z(e,t,i).build()})}return n},"prepareDeleteR\
68
+ elations"),z=o((e,t,r)=>e.table(t).alter().existing().constraint(r).drop().existing(),
69
+ "getDeleteRelationQuery"),D=o((e,t,r,n,s)=>{let{sourceAlias:a,sourceColumn:i,targetColumn:m}=n,
70
+ u=re(a),c=e.table(t).alter().existing().constraint(r).foreign(m,u,[i]);return s?
71
+ c.delete().null():c.delete().cascade(),c.update().cascade(),c},"getCreateRelatio\
72
+ nQuery");import{Index as Q}from"@ez4/database";var rt=o((e,t,r,n)=>{let s=e.table(t).alter().existing();for(let a in n){let i=n[a],
73
+ u=r[a]?.type===Q.Primary,c=!S(i),p=q(i,u),l=h(i,u);s.add(a,p,c,l).missing()}return{
74
+ query:s.build()}},"prepareCreateColumns"),nt=o((e,t,r,n,s)=>{let a=[];for(let i in s){
75
+ let{update:m,nested:u}=s[i],c=r.properties[i],l=n[i]?.type===Q.Primary,E=u?.definitions?.
76
+ update?.default,O=m?.optional??m?.nullable,_=m?.type,x=e.table(t).alter().existing().
77
+ column(i);_!==void 0&&x.type(q(c,l)),O!==void 0&&x.optional(O),E!==void 0&&x.default(
78
+ h(c,l)),!x.empty&&a.push({check:k(e,t,i),query:x.build()})}return a},"prepareUpd\
79
+ ateColumns"),ot=o((e,t,r)=>{let n=[];for(let s in r){let a=r[s],i=e.table(t).alter().
80
+ existing().rename(s,a);n.push({check:k(e,t,s),query:i.build()})}return n},"prepa\
81
+ reRenameColumns"),it=o((e,t,r)=>{let n=e.table(t).alter().existing();for(let s in r)
82
+ n.drop(s).existing();return{query:n.build()}},"prepareDeleteColumns");export{ce as getTableRepositoryChanges,rt as prepareCreateColumns,de as prepareCreateDatabase,
83
+ Ee as prepareCreateIndexes,Ge as prepareCreateRelations,Ne as prepareCreateTable,
84
+ it as prepareDeleteColumns,fe as prepareDeleteDatabase,$e as prepareDeleteIndexes,
85
+ We as prepareDeleteRelations,ke as prepareDeleteTable,ot as prepareRenameColumns,
86
+ _e as prepareRenameIndexes,Je as prepareRenameRelations,Pe as prepareRenameTable,
87
+ nt as prepareUpdateColumns,He as prepareUpdateRelations};
88
+ //# sourceMappingURL=library.mjs.map
package/dist/main.cjs ADDED
@@ -0,0 +1,125 @@
1
+ "use strict";var Q=Object.defineProperty;var he=Object.getOwnPropertyDescriptor;var xe=Object.getOwnPropertyNames;var Se=Object.prototype.hasOwnProperty;var a=(e,t)=>Q(e,"name",{value:t,configurable:!0});var be=(e,t)=>{for(var n in t)Q(e,n,{get:t[n],enumerable:!0})},qe=(e,t,n,s)=>{if(t&&
2
+ typeof t=="object"||typeof t=="function")for(let r of xe(t))!Se.call(e,r)&&r!==n&&
3
+ Q(e,r,{get:()=>t[r],enumerable:!(s=he(t,r))||s.enumerable});return e};var Ce=e=>qe(Q({},"__esModule",{value:!0}),e);var je={};be(je,{getCreateQueries:()=>ye,getDeleteQueries:()=>fe,getUpdateQueries:()=>ke});
4
+ module.exports=Ce(je);var z=require("@ez4/pgsql");var G=require("@ez4/database");var l=require("@ez4/schema"),V=require("@ez4/utils");var P=a(e=>!!(e.nullable||e.optional),"isOptionalColumn"),N=a((e,t)=>{if((0,l.isScalarSchema)(
5
+ e)||(0,l.isObjectSchema)(e)||(0,l.isArraySchema)(e)||(0,l.isTupleSchema)(e)){let{
6
+ definitions:n}=e;switch(typeof n?.default){case"boolean":case"number":return`${n.
7
+ default}`;case"string":return`'${n.default}'`;case"object":return`'${JSON.stringify(
8
+ n.default)}'`}}if((0,l.isEnumSchema)(e)){let{definitions:n}=e;if(n?.default)return`\
9
+ '${n.default}'`}if((0,l.isStringSchema)(e)&&t)switch(e.format){case"date-time":case"\
10
+ date":case"time":return"now()";case"uuid":return"gen_random_uuid()"}if(P(e))return"\
11
+ null"},"getColumnDefault"),I=a((e,t)=>{switch(e.type){case l.SchemaType.Array:case l.SchemaType.
12
+ Object:case l.SchemaType.Reference:case l.SchemaType.Union:case l.SchemaType.Tuple:
13
+ return"jsonb";case l.SchemaType.Boolean:return"boolean";case l.SchemaType.Enum:return"\
14
+ text";case l.SchemaType.Number:return Re(e,t);case l.SchemaType.String:return Pe(
15
+ e)}},"getColumnType"),Re=a((e,t)=>e.format==="integer"?t?"bigserial":"bigint":"d\
16
+ ecimal","getColumNumberType"),Pe=a(e=>{switch(e.format){case"uuid":case"time":case"\
17
+ date":return e.format;case"date-time":return"timestamptz";default:let t=e.definitions?.
18
+ maxLength;return(0,V.isAnyNumber)(t)?`varchar(${t})`:"text"}},"getColumnTextType");var J=a((e,t,n,s)=>{let r=e.table(t).create().missing();for(let o in n.properties){
19
+ let i=n.properties[o],p=s[o]?.type===G.Index.Primary,c=!P(i),u=I(i,p),g=N(i,p);r.
20
+ column(o,u,c,g).missing()}return{query:r.build()}},"prepareCreateTable"),F=a((e,t,n)=>({
21
+ query:e.table(t).rename(n).existing().build()}),"prepareRenameTable"),H=a((e,t)=>({
22
+ query:e.table(t).drop().existing().cascade().build()}),"prepareDeleteTable");var U=require("@ez4/database");var d=a((e,t)=>{let[n]=e.select().rawColumn("1").from("pg_constraint").where({conname:e.
23
+ rawString(t)}).build();return n},"getCheckConstraintQuery"),D=a((e,t,n)=>{let[s]=e.
24
+ select().rawColumn("1").from("information_schema.columns").where({column_name:e.
25
+ rawString(n),table_name:e.rawString(t)}).build();return s},"getCheckColumnQuery");var W=a((e,t,n,s)=>{let r=e.table(t).alter().existing();for(let o in s){let i=s[o],
26
+ p=n[o]?.type===U.Index.Primary,c=!P(i),u=I(i,p),g=N(i,p);r.add(o,u,c,g).missing()}
27
+ return{query:r.build()}},"prepareCreateColumns"),X=a((e,t,n,s,r)=>{let o=[];for(let i in r){
28
+ let{update:m,nested:p}=r[i],c=n.properties[i],g=s[i]?.type===U.Index.Primary,b=p?.
29
+ definitions?.update?.default,A=m?.optional??m?.nullable,S=m?.type,R=e.table(t).alter().
30
+ existing().column(i);S!==void 0&&R.type(I(c,g)),A!==void 0&&R.optional(A),b!==void 0&&
31
+ R.default(N(c,g)),!R.empty&&o.push({check:D(e,t,i),query:R.build()})}return o},"\
32
+ prepareUpdateColumns"),Y=a((e,t,n)=>{let s=[];for(let r in n){let o=n[r],i=e.table(
33
+ t).alter().existing().rename(r,o);s.push({check:D(e,t,r),query:i.build()})}return s},
34
+ "prepareRenameColumns"),Z=a((e,t,n)=>{let s=e.table(t).alter().existing();for(let r in n)
35
+ s.drop(r).existing();return{query:s.build()}},"prepareDeleteColumns");var h=require("@ez4/schema");var ee=require("@ez4/utils");var O=a((e,t)=>`${T(e,t)}_pk`,"getPrimaryKeyName"),k=a((e,t)=>`${T(e,t)}_uk`,"ge\
36
+ tUniqueKeyName"),j=a((e,t)=>`${T(e,t)}_sk`,"getSecondaryKeyName"),q=a((e,t)=>`${T(
37
+ e,t)}_fk`,"getRelationName"),y=a((e,t)=>`${T(e,t)}_ck`,"getConstraintName"),T=a(
38
+ (e,t)=>`${e}_${(0,ee.toSnakeCase)(t.replaceAll(":","_"))}`,"getName");var v=a((e,t,n)=>{let s=[];for(let r in n){let o=n[r];if(!(0,h.isEnumSchema)(o))
39
+ continue;let i=y(t,r);s.push({check:d(e,i),query:$(e,t,i,r,o.options).build()})}
40
+ return s},"prepareCreateConstraints"),te=a((e,t,n,s,r)=>{let o=[];for(let i in r){
41
+ let{update:m,create:p,remove:c}=r[i];if(c){let u=s.properties[i];if((0,h.isEnumSchema)(
42
+ u)){let g=y(t,i);o.push({query:_(e,t,g).build()})}}if(m){let u=s.properties[i],g=n.
43
+ properties[i];if((0,h.isEnumSchema)(u)&&(0,h.isEnumSchema)(g)){let b=y(t,i);o.push(
44
+ {query:_(e,t,b).build()},{query:$(e,t,b,i,g.options).build()})}}if(p){let u=n.properties[i];
45
+ if((0,h.isEnumSchema)(u)){let g=y(t,i);o.push({check:d(e,g),query:$(e,t,g,i,u.options).
46
+ build()})}}}return o},"prepareUpdateConstraints"),ne=a((e,t,n,s)=>{let r=[];for(let o in s){
47
+ let i=s[o];if(!(0,h.isEnumSchema)(i))continue;let m=y(t,o),p=y(n,o),c=e.table(n).
48
+ alter().existing().constraint(m).rename(p);r.push({check:d(e,p),query:c.build()})}
49
+ return r},"prepareRenameConstraints"),re=a((e,t,n,s)=>{let r=[];for(let o in s){
50
+ let i=s[o],m=n[i];if(!(0,h.isEnumSchema)(m))continue;let p=y(t,o),c=y(t,i),u=e.table(
51
+ t).alter().existing().constraint(p).rename(c);r.push({check:d(e,c),query:u.build()})}
52
+ return r},"prepareRenameConstraintColumns"),oe=a((e,t,n)=>{let s=[];for(let r in n){
53
+ let o=n[r];if(!(0,h.isEnumSchema)(o))continue;let i=y(t,r);s.push({query:_(e,t,i).
54
+ build()})}return s},"prepareDeleteConstraints"),_=a((e,t,n)=>e.table(t).alter().
55
+ existing().constraint(n).drop().existing(),"getDeleteConstraintQuery"),$=a((e,t,n,s,r)=>{
56
+ let o=r.map(({value:i})=>`${i}`);return e.table(t).alter().existing().constraint(
57
+ n).check({[s]:{isIn:o}})},"getCreateConstraintQuery");var se=require("@ez4/pgclient/library"),ie=require("@ez4/schema"),B=require("@ez4/database");var E=a((e,t,n,s)=>{let r=[];for(let o in s){let i=s[o];if(i.targetIndex===B.Index.
58
+ Primary)continue;let{[i.targetColumn]:m}=n.properties,p=q(t,o),c=!!(0,ie.IsNullishSchema)(
59
+ m);r.push({check:d(e,p),query:ue(e,t,p,i,c).build()})}return r},"prepareCreateRe\
60
+ lations"),ae=a((e,t,n,s)=>{let r=[];for(let o in n){let i=n[o];if(i.targetIndex===
61
+ B.Index.Primary)continue;let m=s[i.targetColumn]?.update,p=m?.optional??m?.nullable;
62
+ if(p===void 0)continue;let c=q(t,o);r.push({query:pe(e,t,c).build()},{query:ue(e,
63
+ t,c,i,p).build()})}return r},"prepareUpdateRelations"),ce=a((e,t,n,s)=>{let r=[];
64
+ for(let o in s){if(s[o].targetIndex===B.Index.Primary)continue;let m=q(t,o),p=q(
65
+ n,o),c=e.table(n).alter().existing().constraint(m).rename(p);r.push({check:d(e,p),
66
+ query:c.build()})}return r},"prepareRenameRelations"),me=a((e,t,n)=>{let s=[];for(let r in n){
67
+ if(n[r].targetIndex===B.Index.Primary)continue;let i=q(t,r);s.push({query:pe(e,t,
68
+ i).build()})}return s},"prepareDeleteRelations"),pe=a((e,t,n)=>e.table(t).alter().
69
+ existing().constraint(n).drop().existing(),"getDeleteRelationQuery"),ue=a((e,t,n,s,r)=>{
70
+ let{sourceAlias:o,sourceColumn:i,targetColumn:m}=s,p=(0,se.getTableName)(o),c=e.
71
+ table(t).alter().existing().constraint(n).foreign(m,p,[i]);return r?c.delete().null():
72
+ c.delete().cascade(),c.update().cascade(),c},"getCreateRelationQuery");var w=require("@ez4/schema"),f=require("@ez4/database");var M=a((e,t,n,s,r)=>{let o={constraints:[],indexes:[]};for(let i in s){let{columns:m,
73
+ type:p}=s[i];switch(p){default:throw new Error("Unsupported index type.");case f.Index.
74
+ Primary:{let c=O(t,i),u=e.table(t).alter().existing().constraint(c).primary(m);o.
75
+ constraints.push({check:d(e,c),query:u.build()});break}case f.Index.Unique:{let c=k(
76
+ t,i),u=e.table(t).alter().existing().constraint(c).unique(m);o.constraints.push(
77
+ {check:d(e,c),query:u.build()});break}case f.Index.Secondary:{let c=j(t,i),u=Ne(
78
+ m,n),g=e.index(c).create(t,m).type(u).missing();r&&g.concurrent(),o.indexes.push(
79
+ {query:g.build()});break}}}return o},"prepareCreateIndexes"),le=a((e,t,n,s)=>{let r={
80
+ constraints:[],indexes:[]};for(let o in s){let{type:i}=s[o];switch(i){default:throw new Error(
81
+ "Unsupported index type.");case f.Index.Primary:{let m=O(t,o),p=O(n,o),c=e.table(
82
+ n).alter().existing().constraint(m).rename(p);r.constraints.push({check:d(e,p),query:c.
83
+ build()});break}case f.Index.Unique:{let m=k(t,o),p=k(n,o),c=e.table(n).alter().
84
+ existing().constraint(m).rename(p);r.constraints.push({check:d(e,p),query:c.build()});
85
+ break}case f.Index.Secondary:{let m=j(t,o),p=j(n,o),c=e.index(m).rename(p).existing();
86
+ r.indexes.push({query:c.build()});break}}}return r},"prepareRenameIndexes"),ge=a(
87
+ (e,t,n)=>{let s={constraints:[],indexes:[]};for(let r in n){let{type:o}=n[r];switch(o){default:
88
+ throw new Error("Unsupported index type.");case f.Index.Primary:{let i=O(t,r),m=e.
89
+ table(t).alter().existing().constraint(i).drop().existing();s.constraints.push({
90
+ query:m.build()});break}case f.Index.Unique:{let i=k(t,r),m=e.table(t).alter().existing().
91
+ constraint(i).drop().existing();s.constraints.push({query:m.build()});break}case f.Index.
92
+ Secondary:{let i=j(t,r),m=e.index(i).drop().existing().concurrent();s.indexes.push(
93
+ {query:m.build()});break}}}return s},"prepareDeleteIndexes"),Ne=a((e,t)=>{if(e.length===
94
+ 1){let[n]=e;switch(t.properties[n]?.type){case w.SchemaType.Object:case w.SchemaType.
95
+ Union:case w.SchemaType.Array:case w.SchemaType.Tuple:return"GIN"}}return"BTREE"},
96
+ "getIndexType");var x=require("@ez4/utils"),K=require("@ez4/pgclient/library"),L=require("@ez4/schema");var de=a((e,t)=>(0,x.deepCompareObject)(e,t,{onRename:a((n,s)=>!(0,x.isAnyObject)(
97
+ n)||!(0,x.isAnyObject)(s)?!1:(0,K.isRepositoryTable)(n)&&(0,K.isRepositoryTable)(
98
+ s)?Ie(n.schema,s.schema):(0,L.isAnySchema)(n)&&(0,L.isAnySchema)(s)?Oe(n,s):!1,"\
99
+ onRename")}),"getTableRepositoryChanges"),Ie=a((e,t)=>(0,x.deepEqual)(Object.keys(
100
+ e.properties),Object.keys(t.properties)),"canRenameTable"),Oe=a((e,t)=>(0,x.deepEqual)(
101
+ e,t,{depth:1,include:{type:!0,definitions:!0,nullable:!0,format:!0}}),"canRename\
102
+ Column");var ye=a(e=>{let t=new z.SqlBuilder,n={tables:[],constraints:[],relations:[],indexes:[]};
103
+ for(let s in e){let{name:r,schema:o,indexes:i,relations:m}=e[s];C(n,M(t,r,o,i,!1)),
104
+ n.tables.push(J(t,r,o,i)),n.constraints.push(...v(t,r,o.properties)),n.relations.
105
+ push(...E(t,r,o,m))}return n},"getCreateQueries"),ke=a((e,t)=>{let n=de(e,t),s=new z.SqlBuilder,
106
+ r={tables:[],constraints:[],relations:[],indexes:[]};if(n.create&&C(r,ye(n.create)),
107
+ n.rename)for(let o in n.rename){let i=n.rename[o],m=e[i].indexes,p=e[i].relations,
108
+ c=e[i].schema;C(r,le(s,o,i,m)),r.constraints.push(...ne(s,o,i,c.properties)),r.relations.
109
+ push(...ce(s,o,i,p)),r.tables.push(F(s,o,i))}if(n.nested)for(let o in n.nested){
110
+ let{nested:i}=n.nested[o];if(!i)continue;let{schema:m,relations:p,indexes:c}=i,u=m?.
111
+ nested?.properties,g=e[o].indexes,b=e[o].relations,A=t[o].schema,S=e[o].schema;u?.
112
+ create&&(r.tables.push(W(s,o,g,u.create)),r.constraints.push(...v(s,o,u.create))),
113
+ u?.nested&&(r.tables.push(...X(s,o,S,g,u.nested)),r.constraints.push(...te(s,o,S,
114
+ A,u.nested)),r.relations.push(...ae(s,o,b,u.nested))),u?.rename&&(r.tables.push(
115
+ ...Y(s,o,u.rename)),r.constraints.push(...re(s,o,S.properties,u.rename))),u?.remove&&
116
+ (r.tables.push(Z(s,o,u.remove)),r.constraints.push(...oe(s,o,u.remove))),c?.create&&
117
+ C(r,M(s,o,S,c.create,!0)),c?.remove&&C(r,ge(s,o,c.remove)),p?.create&&r.relations.
118
+ push(...E(s,o,S,p.create)),p?.remove&&r.relations.push(...me(s,o,p.remove))}return n.
119
+ remove&&C(r,fe(n.remove)),r},"getUpdateQueries"),fe=a(e=>{let t=new z.SqlBuilder,
120
+ n={tables:[],constraints:[],relations:[],indexes:[]};for(let s in e){let{name:r}=e[s];
121
+ n.tables.push(H(t,r))}return n},"getDeleteQueries"),C=a((e,t)=>{t.indexes&&e.indexes.
122
+ push(...t.indexes),t.constraints&&e.constraints.push(...t.constraints),t.relations&&
123
+ e.relations.push(...t.relations),t.tables&&e.tables.push(...t.tables)},"combineM\
124
+ igrationQueries");0&&(module.exports={getCreateQueries,getDeleteQueries,getUpdateQueries});
125
+ //# sourceMappingURL=main.cjs.map
package/dist/main.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './service/queries.js';
package/dist/main.mjs ADDED
@@ -0,0 +1,120 @@
1
+ var pe=Object.defineProperty;var a=(e,t)=>pe(e,"name",{value:t,configurable:!0});import{SqlBuilder as $}from"@ez4/pgsql";import{Index as be}from"@ez4/database";import{isArraySchema as ue,isEnumSchema as le,isObjectSchema as ge,isScalarSchema as de,
2
+ isStringSchema as ye,isTupleSchema as fe,SchemaType as y}from"@ez4/schema";import{
3
+ isAnyNumber as he}from"@ez4/utils";var R=a(e=>!!(e.nullable||e.optional),"isOptionalColumn"),P=a((e,t)=>{if(de(e)||
4
+ ge(e)||ue(e)||fe(e)){let{definitions:n}=e;switch(typeof n?.default){case"boolean":case"\
5
+ number":return`${n.default}`;case"string":return`'${n.default}'`;case"object":return`\
6
+ '${JSON.stringify(n.default)}'`}}if(le(e)){let{definitions:n}=e;if(n?.default)return`\
7
+ '${n.default}'`}if(ye(e)&&t)switch(e.format){case"date-time":case"date":case"tim\
8
+ e":return"now()";case"uuid":return"gen_random_uuid()"}if(R(e))return"null"},"get\
9
+ ColumnDefault"),N=a((e,t)=>{switch(e.type){case y.Array:case y.Object:case y.Reference:case y.
10
+ Union:case y.Tuple:return"jsonb";case y.Boolean:return"boolean";case y.Enum:return"\
11
+ text";case y.Number:return xe(e,t);case y.String:return Se(e)}},"getColumnType"),
12
+ xe=a((e,t)=>e.format==="integer"?t?"bigserial":"bigint":"decimal","getColumNumbe\
13
+ rType"),Se=a(e=>{switch(e.format){case"uuid":case"time":case"date":return e.format;case"\
14
+ date-time":return"timestamptz";default:let t=e.definitions?.maxLength;return he(
15
+ t)?`varchar(${t})`:"text"}},"getColumnTextType");var v=a((e,t,n,s)=>{let o=e.table(t).create().missing();for(let r in n.properties){
16
+ let i=n.properties[r],p=s[r]?.type===be.Primary,c=!R(i),u=N(i,p),l=P(i,p);o.column(
17
+ r,u,c,l).missing()}return{query:o.build()}},"prepareCreateTable"),E=a((e,t,n)=>({
18
+ query:e.table(t).rename(n).existing().build()}),"prepareRenameTable"),M=a((e,t)=>({
19
+ query:e.table(t).drop().existing().cascade().build()}),"prepareDeleteTable");import{Index as K}from"@ez4/database";var g=a((e,t)=>{let[n]=e.select().rawColumn("1").from("pg_constraint").where({conname:e.
20
+ rawString(t)}).build();return n},"getCheckConstraintQuery"),A=a((e,t,n)=>{let[s]=e.
21
+ select().rawColumn("1").from("information_schema.columns").where({column_name:e.
22
+ rawString(n),table_name:e.rawString(t)}).build();return s},"getCheckColumnQuery");var L=a((e,t,n,s)=>{let o=e.table(t).alter().existing();for(let r in s){let i=s[r],
23
+ p=n[r]?.type===K.Primary,c=!R(i),u=N(i,p),l=P(i,p);o.add(r,u,c,l).missing()}return{
24
+ query:o.build()}},"prepareCreateColumns"),V=a((e,t,n,s,o)=>{let r=[];for(let i in o){
25
+ let{update:m,nested:p}=o[i],c=n.properties[i],l=s[i]?.type===K.Primary,S=p?.definitions?.
26
+ update?.default,T=m?.optional??m?.nullable,x=m?.type,C=e.table(t).alter().existing().
27
+ column(i);x!==void 0&&C.type(N(c,l)),T!==void 0&&C.optional(T),S!==void 0&&C.default(
28
+ P(c,l)),!C.empty&&r.push({check:A(e,t,i),query:C.build()})}return r},"prepareUpd\
29
+ ateColumns"),G=a((e,t,n)=>{let s=[];for(let o in n){let r=n[o],i=e.table(t).alter().
30
+ existing().rename(o,r);s.push({check:A(e,t,o),query:i.build()})}return s},"prepa\
31
+ reRenameColumns"),J=a((e,t,n)=>{let s=e.table(t).alter().existing();for(let o in n)
32
+ s.drop(o).existing();return{query:s.build()}},"prepareDeleteColumns");import{isEnumSchema as h}from"@ez4/schema";import{toSnakeCase as qe}from"@ez4/utils";var I=a((e,t)=>`${j(e,t)}_pk`,"getPrimaryKeyName"),O=a((e,t)=>`${j(e,t)}_uk`,"ge\
33
+ tUniqueKeyName"),k=a((e,t)=>`${j(e,t)}_sk`,"getSecondaryKeyName"),b=a((e,t)=>`${j(
34
+ e,t)}_fk`,"getRelationName"),d=a((e,t)=>`${j(e,t)}_ck`,"getConstraintName"),j=a(
35
+ (e,t)=>`${e}_${qe(t.replaceAll(":","_"))}`,"getName");var D=a((e,t,n)=>{let s=[];for(let o in n){let r=n[o];if(!h(r))continue;let i=d(
36
+ t,o);s.push({check:g(e,i),query:z(e,t,i,o,r.options).build()})}return s},"prepar\
37
+ eCreateConstraints"),F=a((e,t,n,s,o)=>{let r=[];for(let i in o){let{update:m,create:p,
38
+ remove:c}=o[i];if(c){let u=s.properties[i];if(h(u)){let l=d(t,i);r.push({query:Q(
39
+ e,t,l).build()})}}if(m){let u=s.properties[i],l=n.properties[i];if(h(u)&&h(l)){let S=d(
40
+ t,i);r.push({query:Q(e,t,S).build()},{query:z(e,t,S,i,l.options).build()})}}if(p){
41
+ let u=n.properties[i];if(h(u)){let l=d(t,i);r.push({check:g(e,l),query:z(e,t,l,i,
42
+ u.options).build()})}}}return r},"prepareUpdateConstraints"),H=a((e,t,n,s)=>{let o=[];
43
+ for(let r in s){let i=s[r];if(!h(i))continue;let m=d(t,r),p=d(n,r),c=e.table(n).
44
+ alter().existing().constraint(m).rename(p);o.push({check:g(e,p),query:c.build()})}
45
+ return o},"prepareRenameConstraints"),W=a((e,t,n,s)=>{let o=[];for(let r in s){let i=s[r],
46
+ m=n[i];if(!h(m))continue;let p=d(t,r),c=d(t,i),u=e.table(t).alter().existing().constraint(
47
+ p).rename(c);o.push({check:g(e,c),query:u.build()})}return o},"prepareRenameCons\
48
+ traintColumns"),X=a((e,t,n)=>{let s=[];for(let o in n){let r=n[o];if(!h(r))continue;
49
+ let i=d(t,o);s.push({query:Q(e,t,i).build()})}return s},"prepareDeleteConstraint\
50
+ s"),Q=a((e,t,n)=>e.table(t).alter().existing().constraint(n).drop().existing(),"\
51
+ getDeleteConstraintQuery"),z=a((e,t,n,s,o)=>{let r=o.map(({value:i})=>`${i}`);return e.
52
+ table(t).alter().existing().constraint(n).check({[s]:{isIn:r}})},"getCreateConst\
53
+ raintQuery");import{getTableName as Ce}from"@ez4/pgclient/library";import{IsNullishSchema as Re}from"@ez4/schema";
54
+ import{Index as B}from"@ez4/database";var U=a((e,t,n,s)=>{let o=[];for(let r in s){let i=s[r];if(i.targetIndex===B.Primary)
55
+ continue;let{[i.targetColumn]:m}=n.properties,p=b(t,r),c=!!Re(m);o.push({check:g(
56
+ e,p),query:ne(e,t,p,i,c).build()})}return o},"prepareCreateRelations"),Y=a((e,t,n,s)=>{
57
+ let o=[];for(let r in n){let i=n[r];if(i.targetIndex===B.Primary)continue;let m=s[i.
58
+ targetColumn]?.update,p=m?.optional??m?.nullable;if(p===void 0)continue;let c=b(
59
+ t,r);o.push({query:te(e,t,c).build()},{query:ne(e,t,c,i,p).build()})}return o},"\
60
+ prepareUpdateRelations"),Z=a((e,t,n,s)=>{let o=[];for(let r in s){if(s[r].targetIndex===
61
+ B.Primary)continue;let m=b(t,r),p=b(n,r),c=e.table(n).alter().existing().constraint(
62
+ m).rename(p);o.push({check:g(e,p),query:c.build()})}return o},"prepareRenameRela\
63
+ tions"),ee=a((e,t,n)=>{let s=[];for(let o in n){if(n[o].targetIndex===B.Primary)
64
+ continue;let i=b(t,o);s.push({query:te(e,t,i).build()})}return s},"prepareDelete\
65
+ Relations"),te=a((e,t,n)=>e.table(t).alter().existing().constraint(n).drop().existing(),
66
+ "getDeleteRelationQuery"),ne=a((e,t,n,s,o)=>{let{sourceAlias:r,sourceColumn:i,targetColumn:m}=s,
67
+ p=Ce(r),c=e.table(t).alter().existing().constraint(n).foreign(m,p,[i]);return o?
68
+ c.delete().null():c.delete().cascade(),c.update().cascade(),c},"getCreateRelatio\
69
+ nQuery");import{SchemaType as w}from"@ez4/schema";import{Index as f}from"@ez4/database";var _=a((e,t,n,s,o)=>{let r={constraints:[],indexes:[]};for(let i in s){let{columns:m,
70
+ type:p}=s[i];switch(p){default:throw new Error("Unsupported index type.");case f.
71
+ Primary:{let c=I(t,i),u=e.table(t).alter().existing().constraint(c).primary(m);r.
72
+ constraints.push({check:g(e,c),query:u.build()});break}case f.Unique:{let c=O(t,
73
+ i),u=e.table(t).alter().existing().constraint(c).unique(m);r.constraints.push({check:g(
74
+ e,c),query:u.build()});break}case f.Secondary:{let c=k(t,i),u=Pe(m,n),l=e.index(
75
+ c).create(t,m).type(u).missing();o&&l.concurrent(),r.indexes.push({query:l.build()});
76
+ break}}}return r},"prepareCreateIndexes"),re=a((e,t,n,s)=>{let o={constraints:[],
77
+ indexes:[]};for(let r in s){let{type:i}=s[r];switch(i){default:throw new Error("\
78
+ Unsupported index type.");case f.Primary:{let m=I(t,r),p=I(n,r),c=e.table(n).alter().
79
+ existing().constraint(m).rename(p);o.constraints.push({check:g(e,p),query:c.build()});
80
+ break}case f.Unique:{let m=O(t,r),p=O(n,r),c=e.table(n).alter().existing().constraint(
81
+ m).rename(p);o.constraints.push({check:g(e,p),query:c.build()});break}case f.Secondary:{
82
+ let m=k(t,r),p=k(n,r),c=e.index(m).rename(p).existing();o.indexes.push({query:c.
83
+ build()});break}}}return o},"prepareRenameIndexes"),oe=a((e,t,n)=>{let s={constraints:[],
84
+ indexes:[]};for(let o in n){let{type:r}=n[o];switch(r){default:throw new Error("\
85
+ Unsupported index type.");case f.Primary:{let i=I(t,o),m=e.table(t).alter().existing().
86
+ constraint(i).drop().existing();s.constraints.push({query:m.build()});break}case f.
87
+ Unique:{let i=O(t,o),m=e.table(t).alter().existing().constraint(i).drop().existing();
88
+ s.constraints.push({query:m.build()});break}case f.Secondary:{let i=k(t,o),m=e.index(
89
+ i).drop().existing().concurrent();s.indexes.push({query:m.build()});break}}}return s},
90
+ "prepareDeleteIndexes"),Pe=a((e,t)=>{if(e.length===1){let[n]=e;switch(t.properties[n]?.
91
+ type){case w.Object:case w.Union:case w.Array:case w.Tuple:return"GIN"}}return"B\
92
+ TREE"},"getIndexType");import{deepEqual as ce,deepCompareObject as Ne,isAnyObject as se}from"@ez4/utils";
93
+ import{isRepositoryTable as ie}from"@ez4/pgclient/library";import{isAnySchema as ae}from"@ez4/schema";var me=a((e,t)=>Ne(e,t,{onRename:a((n,s)=>!se(n)||!se(s)?!1:ie(n)&&ie(s)?Ie(n.schema,
94
+ s.schema):ae(n)&&ae(s)?Oe(n,s):!1,"onRename")}),"getTableRepositoryChanges"),Ie=a(
95
+ (e,t)=>ce(Object.keys(e.properties),Object.keys(t.properties)),"canRenameTable"),
96
+ Oe=a((e,t)=>ce(e,t,{depth:1,include:{type:!0,definitions:!0,nullable:!0,format:!0}}),
97
+ "canRenameColumn");var ke=a(e=>{let t=new $,n={tables:[],constraints:[],relations:[],indexes:[]};for(let s in e){
98
+ let{name:o,schema:r,indexes:i,relations:m}=e[s];q(n,_(t,o,r,i,!1)),n.tables.push(
99
+ v(t,o,r,i)),n.constraints.push(...D(t,o,r.properties)),n.relations.push(...U(t,o,
100
+ r,m))}return n},"getCreateQueries"),Nt=a((e,t)=>{let n=me(e,t),s=new $,o={tables:[],
101
+ constraints:[],relations:[],indexes:[]};if(n.create&&q(o,ke(n.create)),n.rename)
102
+ for(let r in n.rename){let i=n.rename[r],m=e[i].indexes,p=e[i].relations,c=e[i].
103
+ schema;q(o,re(s,r,i,m)),o.constraints.push(...H(s,r,i,c.properties)),o.relations.
104
+ push(...Z(s,r,i,p)),o.tables.push(E(s,r,i))}if(n.nested)for(let r in n.nested){let{
105
+ nested:i}=n.nested[r];if(!i)continue;let{schema:m,relations:p,indexes:c}=i,u=m?.
106
+ nested?.properties,l=e[r].indexes,S=e[r].relations,T=t[r].schema,x=e[r].schema;u?.
107
+ create&&(o.tables.push(L(s,r,l,u.create)),o.constraints.push(...D(s,r,u.create))),
108
+ u?.nested&&(o.tables.push(...V(s,r,x,l,u.nested)),o.constraints.push(...F(s,r,x,
109
+ T,u.nested)),o.relations.push(...Y(s,r,S,u.nested))),u?.rename&&(o.tables.push(...G(
110
+ s,r,u.rename)),o.constraints.push(...W(s,r,x.properties,u.rename))),u?.remove&&(o.
111
+ tables.push(J(s,r,u.remove)),o.constraints.push(...X(s,r,u.remove))),c?.create&&
112
+ q(o,_(s,r,x,c.create,!0)),c?.remove&&q(o,oe(s,r,c.remove)),p?.create&&o.relations.
113
+ push(...U(s,r,x,p.create)),p?.remove&&o.relations.push(...ee(s,r,p.remove))}return n.
114
+ remove&&q(o,je(n.remove)),o},"getUpdateQueries"),je=a(e=>{let t=new $,n={tables:[],
115
+ constraints:[],relations:[],indexes:[]};for(let s in e){let{name:o}=e[s];n.tables.
116
+ push(M(t,o))}return n},"getDeleteQueries"),q=a((e,t)=>{t.indexes&&e.indexes.push(
117
+ ...t.indexes),t.constraints&&e.constraints.push(...t.constraints),t.relations&&e.
118
+ relations.push(...t.relations),t.tables&&e.tables.push(...t.tables)},"combineMig\
119
+ rationQueries");export{ke as getCreateQueries,je as getDeleteQueries,Nt as getUpdateQueries};
120
+ //# sourceMappingURL=main.mjs.map
@@ -0,0 +1,5 @@
1
+ import type { PgTableRepository } from '@ez4/pgclient/library';
2
+ import type { PgMigrationQueries } from '../types/query.js';
3
+ export declare const getCreateQueries: (target: PgTableRepository) => PgMigrationQueries;
4
+ export declare const getUpdateQueries: (target: PgTableRepository, source: PgTableRepository) => PgMigrationQueries;
5
+ export declare const getDeleteQueries: (target: PgTableRepository) => PgMigrationQueries;
@@ -0,0 +1,10 @@
1
+ export type PgMigrationStatement = {
2
+ check?: string;
3
+ query: string;
4
+ };
5
+ export type PgMigrationQueries = {
6
+ tables: PgMigrationStatement[];
7
+ constraints: PgMigrationStatement[];
8
+ relations: PgMigrationStatement[];
9
+ indexes: PgMigrationStatement[];
10
+ };
@@ -0,0 +1,4 @@
1
+ import type { SqlBuilder } from '@ez4/pgsql';
2
+ export declare const getCheckDatabaseQuery: (builder: SqlBuilder, database: string) => string;
3
+ export declare const getCheckConstraintQuery: (builder: SqlBuilder, name: string) => string;
4
+ export declare const getCheckColumnQuery: (builder: SqlBuilder, table: string, column: string) => string;
@@ -0,0 +1,4 @@
1
+ import type { AnySchema } from '@ez4/schema';
2
+ export declare const isOptionalColumn: (schema: AnySchema) => boolean;
3
+ export declare const getColumnDefault: (schema: AnySchema, primaryIndex: boolean) => string | undefined;
4
+ export declare const getColumnType: (schema: AnySchema, primaryIndex: boolean) => string;
@@ -0,0 +1,5 @@
1
+ export declare const getPrimaryKeyName: (table: string, name: string) => string;
2
+ export declare const getUniqueKeyName: (table: string, name: string) => string;
3
+ export declare const getSecondaryKeyName: (table: string, name: string) => string;
4
+ export declare const getRelationName: (table: string, name: string) => string;
5
+ export declare const getConstraintName: (table: string, name: string) => string;
@@ -0,0 +1,2 @@
1
+ import type { PgTableRepository } from '@ez4/pgclient/library';
2
+ export declare const getTableRepositoryChanges: (target: PgTableRepository, source: PgTableRepository) => import("@ez4/utils").ObjectComparison;
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@ez4/pgmigration",
3
+ "description": "EZ4: A PostgreSQL migration library",
4
+ "version": "0.26.0",
5
+ "author": "Silas B.",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "keywords": [
9
+ "ez4"
10
+ ],
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/sbalmt/ez4.git",
14
+ "directory": "packages/pgmigration"
15
+ },
16
+ "engines": {
17
+ "node": ">=22.7"
18
+ },
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/main.d.ts",
22
+ "require": "./dist/main.cjs",
23
+ "import": "./dist/main.mjs"
24
+ },
25
+ "./library": {
26
+ "types": "./dist/library.d.ts",
27
+ "require": "./dist/library.cjs",
28
+ "import": "./dist/library.mjs"
29
+ }
30
+ },
31
+ "workspaces": [
32
+ "packages/*"
33
+ ],
34
+ "scripts": {
35
+ "lint": "eslint --cache",
36
+ "clean": "rm -f *.tsbuildinfo && rm -rf dist/*",
37
+ "build": "tsc -p tsconfig.json && node tools/bundler.mjs",
38
+ "test": "npm run test:types && node --test --import ../../tools/tsnode.mjs test/*.spec.ts",
39
+ "test:client": "npm run test:types && node --test --import ../../tools/tsnode.mjs test/client-*.spec.ts",
40
+ "test:only": "npm run test:types && node --test-only --test --import ../../tools/tsnode.mjs test/*.spec.ts",
41
+ "test:types": "npm run build && tsc -p tsconfig.test.json",
42
+ "local:publish": "npm run build && npm run clean:registry && npm publish --registry http://localhost:4873",
43
+ "clean:registry": "rm -rf ../../.registry/@ez4/pgmigration",
44
+ "live:publish": "npm run build && npm publish --access public"
45
+ },
46
+ "dependencies": {
47
+ "@ez4/database": "^0.26.0",
48
+ "@ez4/pgsql": "^0.26.0",
49
+ "@ez4/pgclient": "^0.26.0",
50
+ "@ez4/schema": "^0.26.0",
51
+ "@ez4/utils": "^0.26.0"
52
+ }
53
+ }