gummy-cli 0.0.68 → 0.0.71

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/dist/bin.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var ae=Object.create;var k=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var le=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var ue=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of re(e))!ce.call(n,a)&&a!==t&&k(n,a,{get:()=>e[a],enumerable:!(i=oe(e,a))||i.enumerable});return n};var $=(n,e,t)=>(t=n!=null?ae(le(n)):{},ue(e||!n||!n.__esModule?k(t,"default",{value:n,enumerable:!0}):t,n));var ne=require("commander");var ee=require("commander");var y=$(require("fs"),1),Q=$(require("path"),1),j=require("glob"),V=$(require("chalk"),1),I=require("gummy"),z=require("pkg-types");var E=require("kysely");function p(n,e){if(n.length!==e.length)return!1;let t=[...n].sort(),i=[...e].sort();return t.every((a,s)=>a===i[s])}var d=class{};function M(n){switch(n.dataType){case"BigInteger":return"bigint";case"BigSerial":return"bigserial";case"Boolean":return"boolean";case"Date":return"date";case"Decimal":return"decimal";case"Email":case"Varchar":return n.length?`varchar(${n.length})`:"varchar";case"Integer":return"integer";case"Serial":return"serial";case"Text":return"text";case"Timestamp":return"timestamp";case"UUID":return"uuid";case"Json":return"json";default:throw new Error(`Unsupported ColumnType: ${n.dataType}`)}}function F(n,e){return e.isPrimaryKey&&(n=n.primaryKey()),e.notNull&&(n=n.notNull()),e.isUnique&&(n=n.unique()),e.hasDefault&&e.defaultValue!==void 0&&(typeof e.defaultValue=="string"&&e.defaultValue.startsWith("sql`")?n=n.defaultTo(E.sql`${e.defaultValue}`):n=n.defaultTo(e.defaultValue)),n}function B(n){return[...n].sort()}function _(n,e){return`${n}_${e}_fk`}function U(n,e){let t=B(e);return`${n}_${t.join("_")}_unique`}function W(n,e){let t=B(e);return`${n}_${t.join("_")}_idx`}var D=class extends d{constructor(e,t,i){super(),this.table=e,this.columns=t,this.ifNotExists=i?.ifNotExists??!1,this.indexes=i?.indexes,this.uniqueConstraints=i?.uniqueConstraints}applyToState(e){e.tables[this.table]||(e.tables[this.table]={columns:{}});for(let t of this.columns)e.tables[this.table].columns[t.name]={...t};this.indexes&&(e.tables[this.table].indexes=this.indexes),this.uniqueConstraints&&(e.tables[this.table].uniqueConstraints=this.uniqueConstraints)}async execute(e){let t=e.schema.createTable(this.table);this.ifNotExists&&(t=t.ifNotExists());for(let i of this.columns){let a=M(i);t=t.addColumn(i.name,a,s=>F(s,i))}if(this.uniqueConstraints)for(let i of this.uniqueConstraints){let a=U(this.table,i);t=t.addUniqueConstraint(a,i)}if(await t.execute(),this.indexes)for(let i of this.indexes)await new q(i.table,i.columns).execute(e)}toCode(){return`new CreateTableAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)}, ${JSON.stringify({ifNotExists:this.ifNotExists,indexes:this.indexes,uniqueConstraints:this.uniqueConstraints})})`}},N=class extends d{constructor(e,t=!1){super(),this.table=e,this.ifExists=t}applyToState(e){delete e.tables[this.table]}async execute(e){let t=e.schema.dropTable(this.table);this.ifExists&&(t=t.ifExists()),await t.execute()}toCode(){return`new DropTableAction(${JSON.stringify(this.table)}, ${this.ifExists})`}},S=class extends d{constructor(e,t){super(),this.table=e,this.column=t}applyToState(e){e.tables[this.table]||(e.tables[this.table]={columns:{}}),e.tables[this.table].columns[this.column.name]={...this.column}}async execute(e){let t=M(this.column);await e.schema.alterTable(this.table).addColumn(this.column.name,t,i=>F(i,this.column)).execute()}toCode(){return`new AddColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.column)})`}},T=class extends d{constructor(e,t){super(),this.table=e,this.columnName=t}applyToState(e){e.tables[this.table]&&delete e.tables[this.table].columns[this.columnName]}async execute(e){await e.schema.alterTable(this.table).dropColumn(this.columnName).execute()}toCode(){return`new DropColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`}},A=class extends d{constructor(e,t,i){super(),this.table=e,this.columnName=t,this.changes=i}applyToState(e){if(e.tables[this.table]&&e.tables[this.table].columns[this.columnName]){let t=e.tables[this.table].columns[this.columnName];this.changes.dataType!==void 0&&(t.dataType=this.changes.dataType),this.changes.length!==void 0&&(t.length=this.changes.length),this.changes.isPrimaryKey!==void 0&&(t.isPrimaryKey=this.changes.isPrimaryKey),this.changes.notNull!==void 0&&(t.notNull=this.changes.notNull),this.changes.hasDefault!==void 0&&(t.hasDefault=this.changes.hasDefault,t.defaultValue=this.changes.defaultValue),this.changes.isUnique!==void 0&&(t.isUnique=this.changes.isUnique)}}async execute(e){if((this.changes.dataType!==void 0||this.changes.length!==void 0)&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>t.setDataType(M({dataType:this.changes.dataType,length:this.changes.length}))).execute(),this.changes.notNull!==void 0&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>this.changes.notNull?t.setNotNull():t.dropNotNull()).execute(),this.changes.hasDefault!==void 0&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>this.changes.hasDefault&&this.changes.defaultValue!==void 0?typeof this.changes.defaultValue=="string"&&this.changes.defaultValue.startsWith("sql`")?t.setDefault(E.sql`${this.changes.defaultValue}`):t.setDefault(this.changes.defaultValue):t.dropDefault()).execute(),this.changes.isUnique!==void 0){let t=U(this.table,[this.columnName]);this.changes.isUnique?await e.schema.alterTable(this.table).addUniqueConstraint(t,[this.columnName]).execute():await e.schema.alterTable(this.table).dropConstraint(t).execute()}}toCode(){return`new AlterColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.changes)})`}},b=class extends d{constructor(e,t,i,a,s){super(),this.table=e,this.columnName=t,this.referencedTable=i,this.referencedColumn=a,this.constraintName=_(e,t),this.onDelete=s?.onDelete,this.onUpdate=s?.onUpdate}applyToState(e){e.tables[this.table]&&e.tables[this.table].columns[this.columnName]&&(e.tables[this.table].columns[this.columnName].references=`${this.referencedTable}.${this.referencedColumn}`,e.tables[this.table].columns[this.columnName].onDelete=this.onDelete,e.tables[this.table].columns[this.columnName].onUpdate=this.onUpdate)}async execute(e){let t=e.schema.alterTable(this.table).addForeignKeyConstraint(this.constraintName,[this.columnName],this.referencedTable,[this.referencedColumn]);this.onDelete&&(t=t.onDelete(this.onDelete)),this.onUpdate&&(t=t.onUpdate(this.onUpdate)),await t.execute()}toCode(){return`new AddForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.referencedTable)}, ${JSON.stringify(this.referencedColumn)}, ${JSON.stringify({onDelete:this.onDelete,onUpdate:this.onUpdate})})`}},w=class extends d{constructor(e,t){super(),this.table=e,this.columnName=t,this.constraintName=_(e,t)}applyToState(e){if(e.tables[this.table]){let t=e.tables[this.table].columns[this.columnName];t&&t.references&&(t.references=void 0,t.onDelete=void 0,t.onUpdate=void 0)}}async execute(e){await e.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()}toCode(){return`new DropForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`}},q=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.indexName=W(e,t)}applyToState(e){e.tables[this.table].indexes||(e.tables[this.table].indexes=[]),e.tables[this.table].indexes.push({table:this.table,columns:this.columns})}async execute(e){await e.schema.createIndex(this.indexName).on(this.table).columns(this.columns).execute()}toCode(){return`new CreateIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},K=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.indexName=W(e,t)}applyToState(e){e.tables[this.table].indexes&&(e.tables[this.table].indexes=e.tables[this.table].indexes.filter(t=>!p(t.columns,this.columns)))}async execute(e){await e.schema.dropIndex(this.indexName).execute()}toCode(){return`new DropIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},v=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.constraintName=U(e,t)}applyToState(e){e.tables[this.table].uniqueConstraints||(e.tables[this.table].uniqueConstraints=[]),e.tables[this.table].uniqueConstraints.push(this.columns)}async execute(e){await e.schema.alterTable(this.table).addUniqueConstraint(this.constraintName,this.columns).execute()}toCode(){return`new AddUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},O=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.constraintName=U(e,t)}applyToState(e){e.tables[this.table].uniqueConstraints&&(e.tables[this.table].uniqueConstraints=e.tables[this.table].uniqueConstraints.filter(t=>U(this.table,t)!==this.constraintName))}async execute(e){await e.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()}toCode(){return`new DropUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}};var l=require("gummy");function R(n){let e=[],t=n.tables;for(let[i,a]of Object.entries(t)){let s=[],o=a.columns;for(let[u,f]of Object.entries(o))if(f.isPrimaryKey&&(s.push(u),f.notNull||e.push(`Primary key column "${u}" in table "${i}" must be NOT NULL.`)),f.references){let[m,h]=f.references.split(".");if(!n.tables[m])e.push(`Referenced table "${m}" for foreign key on "${i}.${u}" does not exist.`);else if(!n.tables[m].columns[h])e.push(`Referenced column "${m}.${h}" for foreign key on "${i}.${u}" does not exist.`);else{let g=n.tables[m].columns[h];fe(f.dataType,g.dataType)||e.push(`Data type incompatibility between foreign key column "${i}.${u}" (${l.ColumnType[f.dataType]}) and referenced column "${m}.${h}" (${l.ColumnType[g.dataType]}).`),!g.isPrimaryKey&&!g.isUnique&&e.push(`Referenced column "${m}.${h}" for foreign key on "${i}.${u}" is not PRIMARY KEY or UNIQUE.`)}}}return e}function fe(n,e){let t={[l.ColumnType.Integer]:[l.ColumnType.Integer,l.ColumnType.Serial,l.ColumnType.BigInteger,l.ColumnType.BigSerial],[l.ColumnType.BigInteger]:[l.ColumnType.BigInteger,l.ColumnType.BigSerial,l.ColumnType.Integer,l.ColumnType.Serial],[l.ColumnType.Serial]:[l.ColumnType.Integer,l.ColumnType.Serial],[l.ColumnType.BigSerial]:[l.ColumnType.BigInteger,l.ColumnType.BigSerial],[l.ColumnType.Varchar]:[l.ColumnType.Varchar,l.ColumnType.Text],[l.ColumnType.Text]:[l.ColumnType.Text,l.ColumnType.Varchar],[l.ColumnType.UUID]:[l.ColumnType.UUID]};return!!(n===e||t[n]?.includes(e))}var G=require("c12"),L=async()=>(await(0,G.loadConfig)({name:"gummy",rcFile:!1,globalRc:!1,dotenv:!1,packageJson:!1})).config;var Se={},H=V.default.bold.blue,Y=V.default.bold.red;async function X(){let n=await L(),e=await de(n.modelsDir),t=ge(e),i=R(t);if(i.length>0){console.log(Y("Validation Error(s) found in the database schema:"));for(let h of i)console.log(Y(`- ${h}`));process.exit(1)}let a=await be(n.migrationsDir),s=pe(a),o=ye(s,t);o.added.length===0&&o.removed.length===0&&o.modified.length===0&&o.foreignKeys.length===0&&(console.log(H("No changes detected. Migration file not generated.")),process.exit(0));let{actions:u,downActions:f}=De(o,t,s),m=new Date().toISOString().replace(/[-:T]/g,"").split(".")[0];Ne(u,f,m,n.migrationsDir),console.log(H("Migration script completed successfully."))}async function Z(n){if((await(0,z.readPackageJSON)()).type==="module"){let{tsImport:i}=await import("tsx/esm/api");return await i(n,{parentURL:Se.url})}let{require:t}=await import("tsx/cjs/api");return await t(n,__filename)}async function de(n="src/models"){let e=(0,j.globSync)(`${n}/**/*.{ts,js,mjs,mts}`,{absolute:!0}),t=[];for(let i of e)if(i.endsWith(".js")||i.endsWith(".ts")&&!i.endsWith(".d.ts")||i.endsWith(".mjs")||i.endsWith(".mts")&&!i.endsWith(".d.mts")){let a=await Z(i);Object.entries(a).forEach(([,o])=>{(0,I.isTable)(o)&&t.push(o)});let s=a.default;(0,I.isTable)(s)&&t.push(s)}return t}var me=n=>"length"in n&&typeof n.length=="number",he=n=>{let e=I.Table.columns(n);return{columns:Object.entries(e).reduce((t,[i,a])=>{let{foreignKeyConfigs:s}=a.config;return t[a.name]={name:a.name,dataType:a.columnType,length:me(a)?a.length:void 0,isPrimaryKey:a.primary,notNull:a.notNull,isUnique:a.isUnique,references:s!=null?`${s?.ref.table.tableName}.${s?.ref.name}`:void 0,onDelete:s?.actions.onDelete},t},{}),indexes:Object.entries(e).map(([,t])=>t).filter(t=>t.index).map(t=>({table:n.tableName,columns:[t.name]}))}};function ge(n){let e={tables:{}};return n.forEach(t=>{let i=t.tableName;e.tables[i]=he(t)}),e}async function be(n="migrations"){if(!y.existsSync(n))return[];let e=(0,j.globSync)(`${n}/**/*.{ts,js,mjs,mts}`,{absolute:!0}),t=[];for(let i of e.sort()){let a=await Z(i);a.actions&&Array.isArray(a.actions)&&t.push(...a.actions)}return t}function pe(n){let e={tables:{}};for(let t of n)t.applyToState(e);return e}function ye(n,e){let t={added:[],removed:[],modified:[],foreignKeys:[],indexes:{added:[],removed:[]},uniqueConstraints:{added:[],removed:[]}};for(let[i,a]of Object.entries(e.tables)){let s=n.tables[i];if(!s){let c=Object.values(a.columns).map(r=>({...r,references:void 0}));t.added.push(new D(i,c,{indexes:a.indexes,uniqueConstraints:a.uniqueConstraints}));for(let r of Object.values(a.columns))if(r.references){let[x,C]=r.references.split(".");t.foreignKeys.push(new b(i,r.name,x,C,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}continue}for(let[c,r]of Object.entries(a.columns)){let x=s.columns[c];if(x){let C=xe(x,r);if(C&&t.modified.push(new A(i,c,C)),x.references!==r.references&&(x.references&&t.foreignKeys.push(new w(i,c)),r.references)){let[J,P]=r.references.split(".");t.foreignKeys.push(new b(i,c,J,P,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}}else{let C={...r,references:void 0};if(t.added.push(new S(i,C)),r.references){let[J,P]=r.references.split(".");t.foreignKeys.push(new b(i,c,J,P,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}}}for(let c of Object.keys(s.columns))a.columns[c]||t.removed.push(new T(i,c));let o=a.indexes||[],u=s.indexes||[],f=o.filter(c=>!u.some(r=>p(r.columns,c.columns))),m=u.filter(c=>!o.some(r=>p(r.columns,c.columns)));for(let c of f)t.indexes.added.push(new q(i,c.columns));for(let c of m)t.indexes.removed.push(new K(i,c.columns));let h=a.uniqueConstraints||[],g=s.uniqueConstraints||[],ie=h.filter(c=>!g.some(r=>p(r,c))),se=g.filter(c=>!h.some(r=>p(r,c)));for(let c of ie)t.uniqueConstraints.added.push(new v(i,c));for(let c of se)t.uniqueConstraints.removed.push(new O(i,c))}for(let i of Object.keys(n.tables))e.tables[i]||t.removed.push(new N(i));return t}function xe(n,e){let t={},i=!1;n.dataType!==e.dataType&&(t.dataType=e.dataType,i=!0),n.length!==e.length&&(t.length=e.length,i=!0),n.isPrimaryKey!==e.isPrimaryKey&&(t.isPrimaryKey=e.isPrimaryKey,i=!0),n.notNull!==e.notNull&&(t.notNull=e.notNull,i=!0);let a=n.hasDefault?n.defaultValue:void 0,s=e.hasDefault?e.defaultValue:void 0;return a!==s&&(t.hasDefault=e.hasDefault,t.defaultValue=e.defaultValue,i=!0),n.isUnique!==e.isUnique&&(t.isUnique=e.isUnique,i=!0),i?t:null}function Ce(n,e){let t={};return n.dataType!==void 0&&(t.dataType=e.dataType,t.length=e.length),n.isPrimaryKey!==void 0&&(t.isPrimaryKey=e.isPrimaryKey),n.notNull!==void 0&&(t.notNull=e.notNull),n.hasDefault!==void 0&&(t.hasDefault=e.hasDefault,t.defaultValue=e.defaultValue),n.isUnique!==void 0&&(t.isUnique=e.isUnique),t}function De(n,e,t){let i=[],a=[];for(let s of n.added)i.push(s),s instanceof D?a.unshift(new N(s.table)):s instanceof S&&a.unshift(new T(s.table,s.column.name));for(let s of n.removed)if(i.push(s),s instanceof N){let o=t.tables[s.table];a.unshift(new D(s.table,Object.values(o.columns),{indexes:o.indexes,uniqueConstraints:o.uniqueConstraints}))}else if(s instanceof T){let o=t.tables[s.table].columns[s.columnName];a.unshift(new S(s.table,o))}for(let s of n.modified)if(i.push(s),s instanceof A){let o=Ce(s.changes,t.tables[s.table].columns[s.columnName]);a.unshift(new A(s.table,s.columnName,o))}for(let s of n.foreignKeys)if(i.push(s),s instanceof b)a.unshift(new w(s.table,s.columnName));else if(s instanceof w){let o=t.tables[s.table].columns[s.columnName];if(o.references){let[u,f]=o.references.split(".");a.unshift(new b(s.table,s.columnName,u,f,{onDelete:o.onDelete,onUpdate:o.onUpdate}))}}for(let s of n.indexes.added)i.push(s),a.unshift(new K(s.table,s.columns));for(let s of n.indexes.removed)i.push(s),a.unshift(new q(s.table,s.columns));for(let s of n.uniqueConstraints.added)i.push(s),a.unshift(new O(s.table,s.columns));for(let s of n.uniqueConstraints.removed)i.push(s),a.unshift(new v(s.table,s.columns));return{actions:i,downActions:a}}function Ne(n,e,t,i="migrations"){y.existsSync(i)||y.mkdirSync(i);let a=t.replace(/[-: ]/g,""),s=Q.join(i,`${a}_migration.ts`),o=`import { Kysely } from 'kysely';
2
+ "use strict";var ae=Object.create;var k=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var le=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var ue=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of re(e))!ce.call(n,a)&&a!==t&&k(n,a,{get:()=>e[a],enumerable:!(i=oe(e,a))||i.enumerable});return n};var $=(n,e,t)=>(t=n!=null?ae(le(n)):{},ue(e||!n||!n.__esModule?k(t,"default",{value:n,enumerable:!0}):t,n));var ne=require("commander");var ee=require("commander");var x=$(require("fs"),1),Q=$(require("path"),1),j=require("glob"),V=$(require("chalk"),1),I=require("gummy"),z=require("pkg-types");var E=require("kysely");function y(n,e){if(n.length!==e.length)return!1;let t=[...n].sort(),i=[...e].sort();return t.every((a,s)=>a===i[s])}var d=class{};function M(n){switch(n.dataType){case"BigInteger":return"bigint";case"BigSerial":return"bigserial";case"Boolean":return"boolean";case"Date":return"date";case"Decimal":return"decimal";case"Email":case"Varchar":return n.length?`varchar(${n.length})`:"varchar";case"Integer":return"integer";case"Serial":return"serial";case"Text":return"text";case"Timestamp":return"timestamp";case"UUID":return"uuid";case"Json":return"json";default:throw new Error(`Unsupported ColumnType: ${n.dataType}`)}}function F(n,e){return e.isPrimaryKey&&(n=n.primaryKey()),e.notNull&&(n=n.notNull()),e.isUnique&&(n=n.unique()),e.hasDefault&&e.defaultValue!==void 0&&(typeof e.defaultValue=="string"&&e.defaultValue.startsWith("sql`")?n=n.defaultTo(E.sql`${e.defaultValue}`):n=n.defaultTo(e.defaultValue)),n}function B(n){return[...n].sort()}function _(n,e){return`${n}_${e}_fk`}function U(n,e){let t=B(e);return`${n}_${t.join("_")}_unique`}function W(n,e){let t=B(e);return`${n}_${t.join("_")}_idx`}var D=class extends d{constructor(e,t,i){super(),this.table=e,this.columns=t,this.ifNotExists=i?.ifNotExists??!1,this.indexes=i?.indexes,this.uniqueConstraints=i?.uniqueConstraints}applyToState(e){e.tables[this.table]||(e.tables[this.table]={columns:{}});for(let t of this.columns)e.tables[this.table].columns[t.name]={...t};this.indexes&&(e.tables[this.table].indexes=this.indexes),this.uniqueConstraints&&(e.tables[this.table].uniqueConstraints=this.uniqueConstraints)}async execute(e){let t=e.schema.createTable(this.table);this.ifNotExists&&(t=t.ifNotExists());for(let i of this.columns){let a=M(i);t=t.addColumn(i.name,a,s=>F(s,i))}if(this.uniqueConstraints)for(let i of this.uniqueConstraints){let a=U(this.table,i);t=t.addUniqueConstraint(a,i)}if(await t.execute(),this.indexes)for(let i of this.indexes)await new q(i.table,i.columns).execute(e)}toCode(){return`new CreateTableAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)}, ${JSON.stringify({ifNotExists:this.ifNotExists,indexes:this.indexes,uniqueConstraints:this.uniqueConstraints})})`}},N=class extends d{constructor(e,t=!1){super(),this.table=e,this.ifExists=t}applyToState(e){delete e.tables[this.table]}async execute(e){let t=e.schema.dropTable(this.table);this.ifExists&&(t=t.ifExists()),await t.execute()}toCode(){return`new DropTableAction(${JSON.stringify(this.table)}, ${this.ifExists})`}},S=class extends d{constructor(e,t){super(),this.table=e,this.column=t}applyToState(e){e.tables[this.table]||(e.tables[this.table]={columns:{}}),e.tables[this.table].columns[this.column.name]={...this.column}}async execute(e){let t=M(this.column);await e.schema.alterTable(this.table).addColumn(this.column.name,t,i=>F(i,this.column)).execute()}toCode(){return`new AddColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.column)})`}},T=class extends d{constructor(e,t){super(),this.table=e,this.columnName=t}applyToState(e){e.tables[this.table]&&delete e.tables[this.table].columns[this.columnName]}async execute(e){await e.schema.alterTable(this.table).dropColumn(this.columnName).execute()}toCode(){return`new DropColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`}},A=class extends d{constructor(e,t,i){super(),this.table=e,this.columnName=t,this.changes=i}applyToState(e){if(e.tables[this.table]&&e.tables[this.table].columns[this.columnName]){let t=e.tables[this.table].columns[this.columnName];this.changes.dataType!==void 0&&(t.dataType=this.changes.dataType),this.changes.length!==void 0&&(t.length=this.changes.length),this.changes.isPrimaryKey!==void 0&&(t.isPrimaryKey=this.changes.isPrimaryKey),this.changes.notNull!==void 0&&(t.notNull=this.changes.notNull),this.changes.hasDefault!==void 0&&(t.hasDefault=this.changes.hasDefault,t.defaultValue=this.changes.defaultValue),this.changes.isUnique!==void 0&&(t.isUnique=this.changes.isUnique)}}async execute(e){if((this.changes.dataType!==void 0||this.changes.length!==void 0)&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>t.setDataType(M({dataType:this.changes.dataType,length:this.changes.length}))).execute(),this.changes.notNull!==void 0&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>this.changes.notNull?t.setNotNull():t.dropNotNull()).execute(),this.changes.hasDefault!==void 0&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>this.changes.hasDefault&&this.changes.defaultValue!==void 0?typeof this.changes.defaultValue=="string"&&this.changes.defaultValue.startsWith("sql`")?t.setDefault(E.sql`${this.changes.defaultValue}`):t.setDefault(this.changes.defaultValue):t.dropDefault()).execute(),this.changes.isUnique!==void 0){let t=U(this.table,[this.columnName]);this.changes.isUnique?await e.schema.alterTable(this.table).addUniqueConstraint(t,[this.columnName]).execute():await e.schema.alterTable(this.table).dropConstraint(t).execute()}}toCode(){return`new AlterColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.changes)})`}},b=class extends d{constructor(e,t,i,a,s){super(),this.table=e,this.columnName=t,this.referencedTable=i,this.referencedColumn=a,this.constraintName=_(e,t),this.onDelete=s?.onDelete,this.onUpdate=s?.onUpdate}applyToState(e){e.tables[this.table]&&e.tables[this.table].columns[this.columnName]&&(e.tables[this.table].columns[this.columnName].references=`${this.referencedTable}.${this.referencedColumn}`,e.tables[this.table].columns[this.columnName].onDelete=this.onDelete,e.tables[this.table].columns[this.columnName].onUpdate=this.onUpdate)}async execute(e){let t=e.schema.alterTable(this.table).addForeignKeyConstraint(this.constraintName,[this.columnName],this.referencedTable,[this.referencedColumn]);this.onDelete&&(t=t.onDelete(this.onDelete)),this.onUpdate&&(t=t.onUpdate(this.onUpdate)),await t.execute()}toCode(){return`new AddForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.referencedTable)}, ${JSON.stringify(this.referencedColumn)}, ${JSON.stringify({onDelete:this.onDelete,onUpdate:this.onUpdate})})`}},w=class extends d{constructor(e,t){super(),this.table=e,this.columnName=t,this.constraintName=_(e,t)}applyToState(e){if(e.tables[this.table]){let t=e.tables[this.table].columns[this.columnName];t&&t.references&&(t.references=void 0,t.onDelete=void 0,t.onUpdate=void 0)}}async execute(e){await e.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()}toCode(){return`new DropForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`}},q=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.indexName=W(e,t)}applyToState(e){e.tables[this.table].indexes||(e.tables[this.table].indexes=[]),e.tables[this.table].indexes.push({table:this.table,columns:this.columns})}async execute(e){await e.schema.createIndex(this.indexName).on(this.table).columns(this.columns).execute()}toCode(){return`new CreateIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},K=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.indexName=W(e,t)}applyToState(e){e.tables[this.table].indexes&&(e.tables[this.table].indexes=e.tables[this.table].indexes.filter(t=>!y(t.columns,this.columns)))}async execute(e){await e.schema.dropIndex(this.indexName).execute()}toCode(){return`new DropIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},v=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.constraintName=U(e,t)}applyToState(e){e.tables[this.table].uniqueConstraints||(e.tables[this.table].uniqueConstraints=[]),e.tables[this.table].uniqueConstraints.push(this.columns)}async execute(e){await e.schema.alterTable(this.table).addUniqueConstraint(this.constraintName,this.columns).execute()}toCode(){return`new AddUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},O=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.constraintName=U(e,t)}applyToState(e){e.tables[this.table].uniqueConstraints&&(e.tables[this.table].uniqueConstraints=e.tables[this.table].uniqueConstraints.filter(t=>U(this.table,t)!==this.constraintName))}async execute(e){await e.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()}toCode(){return`new DropUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}};var l=require("gummy");function R(n){let e=[],t=n.tables;for(let[i,a]of Object.entries(t)){let s=[],o=a.columns;for(let[u,f]of Object.entries(o))if(f.isPrimaryKey&&(s.push(u),f.notNull||e.push(`Primary key column "${u}" in table "${i}" must be NOT NULL.`)),f.references){let[m,h]=f.references.split(".");if(!n.tables[m])e.push(`Referenced table "${m}" for foreign key on "${i}.${u}" does not exist.`);else if(!n.tables[m].columns[h])e.push(`Referenced column "${m}.${h}" for foreign key on "${i}.${u}" does not exist.`);else{let g=n.tables[m].columns[h];fe(f.dataType,g.dataType)||e.push(`Data type incompatibility between foreign key column "${i}.${u}" (${l.ColumnType[f.dataType]}) and referenced column "${m}.${h}" (${l.ColumnType[g.dataType]}).`),!g.isPrimaryKey&&!g.isUnique&&e.push(`Referenced column "${m}.${h}" for foreign key on "${i}.${u}" is not PRIMARY KEY or UNIQUE.`)}}}return e}function fe(n,e){let t={[l.ColumnType.Integer]:[l.ColumnType.Integer,l.ColumnType.Serial,l.ColumnType.BigInteger,l.ColumnType.BigSerial],[l.ColumnType.BigInteger]:[l.ColumnType.BigInteger,l.ColumnType.BigSerial,l.ColumnType.Integer,l.ColumnType.Serial],[l.ColumnType.Serial]:[l.ColumnType.Integer,l.ColumnType.Serial],[l.ColumnType.BigSerial]:[l.ColumnType.BigInteger,l.ColumnType.BigSerial],[l.ColumnType.Varchar]:[l.ColumnType.Varchar,l.ColumnType.Text],[l.ColumnType.Text]:[l.ColumnType.Text,l.ColumnType.Varchar],[l.ColumnType.UUID]:[l.ColumnType.UUID]};return!!(n===e||t[n]?.includes(e))}var G=require("c12"),L=async()=>(await(0,G.loadConfig)({name:"gummy",rcFile:!1,globalRc:!1,dotenv:!1,packageJson:!1})).config;var Se={},H=V.default.bold.blue,Y=V.default.bold.red;async function X(){let n=await L(),e=await de(n.modelsDir),t=ge(e),i=R(t);if(i.length>0){console.log(Y("Validation Error(s) found in the database schema:"));for(let h of i)console.log(Y(`- ${h}`));process.exit(1)}let a=await be(n.migrationsDir),s=pe(a),o=ye(s,t);o.added.length===0&&o.removed.length===0&&o.modified.length===0&&o.foreignKeys.length===0&&(console.log(H("No changes detected. Migration file not generated.")),process.exit(0));let{actions:u,downActions:f}=De(o,t,s),m=new Date().toISOString().replace(/[-:T]/g,"").split(".")[0];Ne(u,f,m,n.migrationsDir),console.log(H("Migration script completed successfully."))}async function Z(n){if((await(0,z.readPackageJSON)()).type==="module"){let{tsImport:i}=await import("tsx/esm/api");return await i(n,{parentURL:Se.url})}let{require:t}=await import("tsx/cjs/api");return await t(n,__filename)}async function de(n="src/models"){let e=(0,j.globSync)(`${n}/**/*.{ts,js,mjs,mts}`,{absolute:!0}),t=[];for(let i of e)if(i.endsWith(".js")||i.endsWith(".ts")&&!i.endsWith(".d.ts")||i.endsWith(".mjs")||i.endsWith(".mts")&&!i.endsWith(".d.mts")){let a=await Z(i);Object.entries(a).forEach(([,o])=>{(0,I.isTable)(o)&&t.push(o)});let s=a.default;(0,I.isTable)(s)&&t.push(s)}return t}var me=n=>"length"in n&&typeof n.length=="number",he=n=>{let e=I.Table.columns(n);return{columns:Object.entries(e).reduce((t,[i,a])=>{let{foreignKeyConfigs:s}=a.config;return t[a.name]={name:a.name,dataType:a.columnType,length:me(a)?a.length:void 0,isPrimaryKey:a.primary,notNull:a.notNull,isUnique:a.isUnique,references:s!=null?`${s?.ref.table.tableName}.${s?.ref.name}`:void 0,onDelete:s?.actions.onDelete},t},{}),indexes:Object.entries(e).map(([,t])=>t).filter(t=>t.index).map(t=>({table:n.tableName,columns:[t.name]}))}};function ge(n){let e={tables:{}};return n.forEach(t=>{let i=t.tableName;e.tables[i]=he(t)}),e}async function be(n="migrations"){if(!x.existsSync(n))return[];let e=(0,j.globSync)(`${n}/**/*.{ts,js,mjs,mts}`,{absolute:!0}),t=[];for(let i of e.sort()){let a=await Z(i);a.actions&&Array.isArray(a.actions)&&t.push(...a.actions)}return t}function pe(n){let e={tables:{}};for(let t of n)t.applyToState(e);return e}function ye(n,e){let t={added:[],removed:[],modified:[],foreignKeys:[],indexes:{added:[],removed:[]},uniqueConstraints:{added:[],removed:[]}};for(let[i,a]of Object.entries(e.tables)){let s=n.tables[i];if(!s){let c=Object.values(a.columns).map(r=>({...r,references:void 0}));t.added.push(new D(i,c,{indexes:a.indexes,uniqueConstraints:a.uniqueConstraints}));for(let r of Object.values(a.columns))if(r.references){let[p,C]=r.references.split(".");t.foreignKeys.push(new b(i,r.name,p,C,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}continue}for(let[c,r]of Object.entries(a.columns)){let p=s.columns[c];if(p){let C=xe(p,r);if(C&&t.modified.push(new A(i,c,C)),(p.references!==r.references||p.onDelete!==r.onDelete)&&(p.references&&t.foreignKeys.push(new w(i,c)),r.references)){let[J,P]=r.references.split(".");t.foreignKeys.push(new b(i,c,J,P,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}}else{let C={...r,references:void 0};if(t.added.push(new S(i,C)),r.references){let[J,P]=r.references.split(".");t.foreignKeys.push(new b(i,c,J,P,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}}}for(let c of Object.keys(s.columns))a.columns[c]||t.removed.push(new T(i,c));let o=a.indexes||[],u=s.indexes||[],f=o.filter(c=>!u.some(r=>y(r.columns,c.columns))),m=u.filter(c=>!o.some(r=>y(r.columns,c.columns)));for(let c of f)t.indexes.added.push(new q(i,c.columns));for(let c of m)t.indexes.removed.push(new K(i,c.columns));let h=a.uniqueConstraints||[],g=s.uniqueConstraints||[],ie=h.filter(c=>!g.some(r=>y(r,c))),se=g.filter(c=>!h.some(r=>y(r,c)));for(let c of ie)t.uniqueConstraints.added.push(new v(i,c));for(let c of se)t.uniqueConstraints.removed.push(new O(i,c))}for(let i of Object.keys(n.tables))e.tables[i]||t.removed.push(new N(i));return t}function xe(n,e){let t={},i=!1;n.dataType!==e.dataType&&(t.dataType=e.dataType,i=!0),n.length!==e.length&&(t.length=e.length,i=!0),n.isPrimaryKey!==e.isPrimaryKey&&(t.isPrimaryKey=e.isPrimaryKey,i=!0),n.notNull!==e.notNull&&(t.notNull=e.notNull,i=!0);let a=n.hasDefault?n.defaultValue:void 0,s=e.hasDefault?e.defaultValue:void 0;return a!==s&&(t.hasDefault=e.hasDefault,t.defaultValue=e.defaultValue,i=!0),n.isUnique!==e.isUnique&&(t.isUnique=e.isUnique,i=!0),i?t:null}function Ce(n,e){let t={};return n.dataType!==void 0&&(t.dataType=e.dataType,t.length=e.length),n.isPrimaryKey!==void 0&&(t.isPrimaryKey=e.isPrimaryKey),n.notNull!==void 0&&(t.notNull=e.notNull),n.hasDefault!==void 0&&(t.hasDefault=e.hasDefault,t.defaultValue=e.defaultValue),n.isUnique!==void 0&&(t.isUnique=e.isUnique),t}function De(n,e,t){let i=[],a=[];for(let s of n.added)i.push(s),s instanceof D?a.unshift(new N(s.table)):s instanceof S&&a.unshift(new T(s.table,s.column.name));for(let s of n.removed)if(i.push(s),s instanceof N){let o=t.tables[s.table];a.unshift(new D(s.table,Object.values(o.columns),{indexes:o.indexes,uniqueConstraints:o.uniqueConstraints}))}else if(s instanceof T){let o=t.tables[s.table].columns[s.columnName];a.unshift(new S(s.table,o))}for(let s of n.modified)if(i.push(s),s instanceof A){let o=Ce(s.changes,t.tables[s.table].columns[s.columnName]);a.unshift(new A(s.table,s.columnName,o))}for(let s of n.foreignKeys)if(i.push(s),s instanceof b)a.unshift(new w(s.table,s.columnName));else if(s instanceof w){let o=t.tables[s.table].columns[s.columnName];if(o.references){let[u,f]=o.references.split(".");a.unshift(new b(s.table,s.columnName,u,f,{onDelete:o.onDelete,onUpdate:o.onUpdate}))}}for(let s of n.indexes.added)i.push(s),a.unshift(new K(s.table,s.columns));for(let s of n.indexes.removed)i.push(s),a.unshift(new q(s.table,s.columns));for(let s of n.uniqueConstraints.added)i.push(s),a.unshift(new O(s.table,s.columns));for(let s of n.uniqueConstraints.removed)i.push(s),a.unshift(new v(s.table,s.columns));return{actions:i,downActions:a}}function Ne(n,e,t,i="migrations"){x.existsSync(i)||x.mkdirSync(i);let a=t.replace(/[-: ]/g,""),s=Q.join(i,`${a}_migration.ts`),o=`import { Kysely } from 'kysely';
3
3
  import {
4
4
  MigrationAction,
5
5
  CreateTableAction,
@@ -38,5 +38,5 @@ export async function up(db: Kysely<any>): Promise<void> {
38
38
  export async function down(db: Kysely<any>): Promise<void> {
39
39
  await executeActions(downActions, db);
40
40
  }
41
- `;y.writeFileSync(s,h)}var te=new ee.Command().name("makemigrations").action(async()=>{await X()});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Te(){let n=new ne.Command;n.addCommand(te),n.parse()}Te();
41
+ `;x.writeFileSync(s,h)}var te=new ee.Command().name("makemigrations").action(async()=>{await X()});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Te(){let n=new ne.Command;n.addCommand(te),n.parse()}Te();
42
42
  //# sourceMappingURL=bin.cjs.map
package/dist/bin.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.mts","../src/commands/makemigrations.mts","../src/migrate/makemigrations.mts","../src/migrate/actions.mts","../src/utils.mts","../src/migrate/validate.mts","../src/config.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\n\nimport { makemigrations } from './commands/makemigrations.mjs'\n\nprocess.on('SIGINT', () => process.exit(0))\nprocess.on('SIGTERM', () => process.exit(0))\n\nasync function main() {\n const program = new Command()\n program.addCommand(makemigrations)\n program.parse()\n}\n\nmain()\n","import { Command } from 'commander'\nimport { makeMigrations } from '../migrate/makemigrations.mjs'\n\nexport const makemigrations = new Command().name('makemigrations').action(async () => {\n await makeMigrations()\n})\n","import * as fs from 'fs'\nimport * as path from 'path'\nimport { globSync } from 'glob'\nimport chalk from 'chalk'\nimport { Column, isTable, Table } from 'gummy'\nimport { readPackageJSON } from 'pkg-types'\n\nimport {\n AddColumnAction,\n AddForeignKeyConstraintAction,\n AddUniqueConstraintAction,\n AlterColumnAction,\n CreateIndexAction,\n CreateTableAction,\n DropColumnAction,\n DropForeignKeyConstraintAction,\n DropIndexAction,\n DropTableAction,\n DropUniqueConstraintAction,\n MigrationAction,\n} from './actions.mjs'\nimport { ColumnDefinition, ColumnDefinitionDiff, DatabaseState, TableState } from './types.mjs'\nimport { validateDatabaseState } from './validate.mjs'\nimport { areArrayEqual } from '../utils.mjs'\nimport { getConfig } from '../config.mjs'\n\nconst info = chalk.bold.blue\nconst error = chalk.bold.red\n\nexport async function makeMigrations() {\n const config = await getConfig()\n\n // Step 1: Extract all table instances from 'src/models/'\n const tableInstances = await extractTableInstances(config.modelsDir)\n\n // Step 2: Extract column definitions from each table instance\n const newState = buildNewState(tableInstances)\n\n // Step 3: Validate the newState before proceeding\n const validationErrors = validateDatabaseState(newState)\n if (validationErrors.length > 0) {\n console.log(error('Validation Error(s) found in the database schema:'))\n for (const errMsg of validationErrors) {\n console.log(error(`- ${errMsg}`))\n }\n process.exit(1)\n }\n\n // Step 4: Load past migration actions and reconstruct oldState\n const pastMigrationActions = await loadPastMigrationActions(config.migrationsDir)\n const oldState = reconstructOldState(pastMigrationActions)\n\n // Step 5: Compare oldState and newState to get stateDiff\n const stateDiff = compareStates(oldState, newState)\n if (\n stateDiff.added.length === 0 &&\n stateDiff.removed.length === 0 &&\n stateDiff.modified.length === 0 &&\n stateDiff.foreignKeys.length === 0\n ) {\n console.log(info('No changes detected. Migration file not generated.'))\n process.exit(0)\n }\n\n // Step 6: Generate migration actions for the current stateDiff\n const { actions, downActions } = generateMigrationActions(stateDiff, newState, oldState)\n\n // Step 7: Generate migration file based on migration actions\n const timestamp = new Date().toISOString().replace(/[-:T]/g, '').split('.')[0]\n generateMigrationFile(actions, downActions, timestamp, config.migrationsDir)\n\n console.log(info('Migration script completed successfully.'))\n}\n\ntype StateDiff = {\n added: MigrationAction[]\n removed: MigrationAction[]\n modified: MigrationAction[]\n foreignKeys: (AddForeignKeyConstraintAction | DropForeignKeyConstraintAction)[]\n indexes: {\n added: CreateIndexAction[]\n removed: DropIndexAction[]\n }\n uniqueConstraints: {\n added: AddUniqueConstraintAction[]\n removed: DropUniqueConstraintAction[]\n }\n}\n\nasync function importTSFile(path: string): Promise<any> {\n const localPackageJson = await readPackageJSON()\n if (localPackageJson.type === 'module') {\n const { tsImport } = await import('tsx/esm/api')\n\n // if (isWindows && !path.startsWith('file://')) {\n // path = `file://${path}`\n // }\n\n return await tsImport(path, { parentURL: import.meta.url })\n }\n\n const { require: tsRequire } = await import('tsx/cjs/api')\n\n return await tsRequire(path, __filename)\n}\n\nexport async function extractTableInstances(modelsDir = 'src/models'): Promise<Table[]> {\n const files = globSync(`${modelsDir}/**/*.{ts,js,mjs,mts}`, { absolute: true })\n const tableInstances: Table[] = []\n\n for (const fileName of files) {\n if (\n fileName.endsWith('.js') ||\n (fileName.endsWith('.ts') && !fileName.endsWith('.d.ts')) ||\n fileName.endsWith('.mjs') ||\n (fileName.endsWith('.mts') && !fileName.endsWith('.d.mts'))\n ) {\n const m = await importTSFile(fileName)\n\n Object.entries(m).forEach(([, exported]) => {\n if (isTable(exported)) {\n tableInstances.push(exported)\n }\n })\n\n const defaultExported = m.default\n if (isTable(defaultExported)) {\n tableInstances.push(defaultExported)\n }\n }\n }\n\n return tableInstances\n}\n\nconst _isWithLength = (column: Column): column is typeof column & { length: number } => {\n return 'length' in column && typeof column.length === 'number'\n}\n\nconst extractColumns = (table: Table): TableState => {\n const columns = Table.columns(table)\n return {\n columns: Object.entries(columns).reduce(\n (tableDefinition, [_, column]) => {\n const { foreignKeyConfigs } = column.config\n tableDefinition[column.name] = {\n name: column.name,\n dataType: column.columnType,\n length: _isWithLength(column) ? column.length : undefined,\n isPrimaryKey: column.primary,\n notNull: column.notNull,\n // TODO: We only support application side default value for now\n // hasDefault: column.hasDefault,\n // defaultValue: column.default,\n isUnique: column.isUnique,\n references:\n foreignKeyConfigs != null\n ? `${foreignKeyConfigs?.ref.table.tableName}.${foreignKeyConfigs?.ref.name}`\n : undefined,\n onDelete: foreignKeyConfigs?.actions.onDelete,\n }\n return tableDefinition\n },\n {} as { [columnName: string]: ColumnDefinition },\n ),\n indexes: Object.entries(columns)\n .map(([, column]) => column)\n .filter((column) => column.index)\n .map((column) => ({ table: table.tableName, columns: [column.name] })),\n // TODO: indexes\n // TODO: uniqueConstraints\n }\n}\n\nexport function buildNewState(tableInstances: Table[]): DatabaseState {\n const newState: DatabaseState = { tables: {} }\n tableInstances.forEach((instance) => {\n const tableName = instance.tableName\n newState.tables[tableName] = extractColumns(instance)\n })\n return newState\n}\n\nexport async function loadPastMigrationActions(migrationsDir = 'migrations'): Promise<MigrationAction[]> {\n if (!fs.existsSync(migrationsDir)) {\n return []\n }\n\n const migrationFiles = globSync(`${migrationsDir}/**/*.{ts,js,mjs,mts}`, { absolute: true })\n const allActions: MigrationAction[] = []\n for (const file of migrationFiles.sort()) {\n const migrationModule = await importTSFile(file)\n\n if (migrationModule.actions && Array.isArray(migrationModule.actions)) {\n allActions.push(...migrationModule.actions)\n }\n }\n\n return allActions\n}\n\nexport function reconstructOldState(migrationActions: MigrationAction[]): DatabaseState {\n const state: DatabaseState = { tables: {} }\n\n for (const action of migrationActions) {\n action.applyToState(state)\n }\n\n return state\n}\n\nfunction compareStates(oldState: DatabaseState, newState: DatabaseState): StateDiff {\n const stateDiff: StateDiff = {\n added: [],\n removed: [],\n modified: [],\n foreignKeys: [],\n indexes: { added: [], removed: [] },\n uniqueConstraints: { added: [], removed: [] },\n }\n\n // Compare tables\n for (const [tableName, newTableDef] of Object.entries(newState.tables)) {\n const oldTableDef = oldState.tables[tableName]\n\n if (!oldTableDef) {\n // New table\n const columnsWithoutFK = Object.values(newTableDef.columns).map((col) => ({\n ...col,\n references: undefined,\n }))\n stateDiff.added.push(\n new CreateTableAction(tableName, columnsWithoutFK, {\n indexes: newTableDef.indexes,\n uniqueConstraints: newTableDef.uniqueConstraints,\n }),\n )\n // Collect foreign key constraints\n for (const columnDef of Object.values(newTableDef.columns)) {\n if (columnDef.references) {\n const [referencedTable, referencedColumn] = columnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnDef.name, referencedTable, referencedColumn, {\n onDelete: columnDef.onDelete,\n onUpdate: columnDef.onUpdate,\n }),\n )\n }\n }\n continue\n }\n\n // Compare columns\n for (const [columnName, newColumnDef] of Object.entries(newTableDef.columns)) {\n const oldColumnDef = oldTableDef.columns[columnName]\n\n if (!oldColumnDef) {\n // New column\n const columnWithoutFK = { ...newColumnDef, references: undefined }\n stateDiff.added.push(new AddColumnAction(tableName, columnWithoutFK))\n // Collect foreign key constraints\n if (newColumnDef.references) {\n const [referencedTable, referencedColumn] = newColumnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnName, referencedTable, referencedColumn, {\n onDelete: newColumnDef.onDelete,\n onUpdate: newColumnDef.onUpdate,\n }),\n )\n }\n } else {\n // Generate column definition differences\n const diff = generateColumnDefinitionDiff(oldColumnDef, newColumnDef)\n if (diff) {\n stateDiff.modified.push(new AlterColumnAction(tableName, columnName, diff))\n }\n\n // Detect foreign key constraint changes\n if (oldColumnDef.references !== newColumnDef.references) {\n if (oldColumnDef.references) {\n // Drop old foreign key constraint\n stateDiff.foreignKeys.push(new DropForeignKeyConstraintAction(tableName, columnName))\n }\n if (newColumnDef.references) {\n // Add new foreign key constraint\n const [referencedTable, referencedColumn] = newColumnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnName, referencedTable, referencedColumn, {\n onDelete: newColumnDef.onDelete,\n onUpdate: newColumnDef.onUpdate,\n }),\n )\n }\n }\n }\n }\n\n // Check for removed columns\n for (const columnName of Object.keys(oldTableDef.columns)) {\n if (!newTableDef.columns[columnName]) {\n stateDiff.removed.push(new DropColumnAction(tableName, columnName))\n }\n }\n\n // Compare indexes\n const newIndexes = newTableDef.indexes || []\n const oldIndexes = oldTableDef.indexes || []\n\n const addedIndexes = newIndexes.filter(\n (newIndex) => !oldIndexes.some((oldIndex) => areArrayEqual(oldIndex.columns, newIndex.columns)),\n )\n\n const removedIndexes = oldIndexes.filter(\n (oldIndex) => !newIndexes.some((newIndex) => areArrayEqual(newIndex.columns, oldIndex.columns)),\n )\n\n for (const index of addedIndexes) {\n stateDiff.indexes.added.push(new CreateIndexAction(tableName, index.columns))\n }\n\n for (const index of removedIndexes) {\n stateDiff.indexes.removed.push(new DropIndexAction(tableName, index.columns))\n }\n\n // Compare unique constraints\n const newUniqueConstraints = newTableDef.uniqueConstraints || []\n const oldUniqueConstraints = oldTableDef.uniqueConstraints || []\n\n const addedUniqueConstraints = newUniqueConstraints.filter(\n (newConstraint) => !oldUniqueConstraints.some((oldConstraint) => areArrayEqual(oldConstraint, newConstraint)),\n )\n\n const removedUniqueConstraints = oldUniqueConstraints.filter(\n (oldConstraint) => !newUniqueConstraints.some((newConstraint) => areArrayEqual(newConstraint, oldConstraint)),\n )\n\n for (const columns of addedUniqueConstraints) {\n stateDiff.uniqueConstraints.added.push(new AddUniqueConstraintAction(tableName, columns))\n }\n\n for (const columns of removedUniqueConstraints) {\n stateDiff.uniqueConstraints.removed.push(new DropUniqueConstraintAction(tableName, columns))\n }\n }\n\n // Check for removed tables\n for (const tableName of Object.keys(oldState.tables)) {\n if (!newState.tables[tableName]) {\n stateDiff.removed.push(new DropTableAction(tableName))\n }\n }\n\n return stateDiff\n}\n\nfunction generateColumnDefinitionDiff(\n oldColumn: ColumnDefinition,\n newColumn: ColumnDefinition,\n): ColumnDefinitionDiff | null {\n const diff: ColumnDefinitionDiff = {}\n let hasChanges = false\n\n if (oldColumn.dataType !== newColumn.dataType) {\n diff.dataType = newColumn.dataType\n hasChanges = true\n }\n\n if (oldColumn.length !== newColumn.length) {\n diff.length = newColumn.length\n hasChanges = true\n }\n\n if (oldColumn.isPrimaryKey !== newColumn.isPrimaryKey) {\n diff.isPrimaryKey = newColumn.isPrimaryKey\n hasChanges = true\n }\n\n if (oldColumn.notNull !== newColumn.notNull) {\n diff.notNull = newColumn.notNull\n hasChanges = true\n }\n\n const oldDefault = oldColumn.hasDefault ? oldColumn.defaultValue : undefined\n const newDefault = newColumn.hasDefault ? newColumn.defaultValue : undefined\n if (oldDefault !== newDefault) {\n diff.hasDefault = newColumn.hasDefault\n diff.defaultValue = newColumn.defaultValue\n hasChanges = true\n }\n\n if (oldColumn.isUnique !== newColumn.isUnique) {\n diff.isUnique = newColumn.isUnique\n hasChanges = true\n }\n\n return hasChanges ? diff : null\n}\n\nfunction generateReverseColumnDefinitionDiff(\n changes: ColumnDefinitionDiff,\n oldColumn: ColumnDefinition,\n): ColumnDefinitionDiff {\n const reverseDiff: ColumnDefinitionDiff = {}\n\n if (changes.dataType !== undefined) {\n reverseDiff.dataType = oldColumn.dataType\n reverseDiff.length = oldColumn.length\n }\n\n if (changes.isPrimaryKey !== undefined) {\n reverseDiff.isPrimaryKey = oldColumn.isPrimaryKey\n }\n\n if (changes.notNull !== undefined) {\n reverseDiff.notNull = oldColumn.notNull\n }\n\n if (changes.hasDefault !== undefined) {\n reverseDiff.hasDefault = oldColumn.hasDefault\n reverseDiff.defaultValue = oldColumn.defaultValue\n }\n\n if (changes.isUnique !== undefined) {\n reverseDiff.isUnique = oldColumn.isUnique\n }\n\n return reverseDiff\n}\n\nfunction generateMigrationActions(stateDiff: StateDiff, newState: DatabaseState, oldState: DatabaseState) {\n const actions: MigrationAction[] = []\n const downActions: MigrationAction[] = []\n\n // Added actions\n for (const action of stateDiff.added) {\n actions.push(action)\n if (action instanceof CreateTableAction) {\n downActions.unshift(new DropTableAction(action.table))\n } else if (action instanceof AddColumnAction) {\n downActions.unshift(new DropColumnAction(action.table, action.column.name))\n }\n }\n\n // Removed actions\n for (const action of stateDiff.removed) {\n actions.push(action)\n if (action instanceof DropTableAction) {\n const tableDef = oldState.tables[action.table]\n downActions.unshift(\n new CreateTableAction(action.table, Object.values(tableDef.columns), {\n indexes: tableDef.indexes,\n uniqueConstraints: tableDef.uniqueConstraints,\n }),\n )\n } else if (action instanceof DropColumnAction) {\n const columnDef = oldState.tables[action.table].columns[action.columnName]\n downActions.unshift(new AddColumnAction(action.table, columnDef))\n }\n }\n\n // Modified actions\n for (const action of stateDiff.modified) {\n actions.push(action)\n // Generate reverse diff for down action\n if (action instanceof AlterColumnAction) {\n const reverseDiff = generateReverseColumnDefinitionDiff(\n action.changes,\n oldState.tables[action.table].columns[action.columnName],\n )\n downActions.unshift(new AlterColumnAction(action.table, action.columnName, reverseDiff))\n }\n }\n\n // Foreign key constraints\n for (const fkAction of stateDiff.foreignKeys) {\n actions.push(fkAction)\n if (fkAction instanceof AddForeignKeyConstraintAction) {\n downActions.unshift(new DropForeignKeyConstraintAction(fkAction.table, fkAction.columnName))\n } else if (fkAction instanceof DropForeignKeyConstraintAction) {\n const oldColumnDef = oldState.tables[fkAction.table].columns[fkAction.columnName]\n if (oldColumnDef.references) {\n const [referencedTable, referencedColumn] = oldColumnDef.references.split('.')\n downActions.unshift(\n new AddForeignKeyConstraintAction(fkAction.table, fkAction.columnName, referencedTable, referencedColumn, {\n onDelete: oldColumnDef.onDelete,\n onUpdate: oldColumnDef.onUpdate,\n }),\n )\n }\n }\n }\n\n // Indexes\n for (const indexAction of stateDiff.indexes.added) {\n actions.push(indexAction)\n downActions.unshift(new DropIndexAction(indexAction.table, indexAction.columns))\n }\n\n for (const indexAction of stateDiff.indexes.removed) {\n actions.push(indexAction)\n downActions.unshift(new CreateIndexAction(indexAction.table, indexAction.columns))\n }\n\n // Unique constraints\n for (const ucAction of stateDiff.uniqueConstraints.added) {\n actions.push(ucAction)\n downActions.unshift(new DropUniqueConstraintAction(ucAction.table, ucAction.columns))\n }\n\n for (const ucAction of stateDiff.uniqueConstraints.removed) {\n actions.push(ucAction)\n downActions.unshift(new AddUniqueConstraintAction(ucAction.table, ucAction.columns))\n }\n\n return { actions, downActions }\n}\n\nfunction generateMigrationFile(\n actions: MigrationAction[],\n downActions: MigrationAction[],\n timestamp: string,\n migrationsDir = 'migrations',\n) {\n if (!fs.existsSync(migrationsDir)) {\n fs.mkdirSync(migrationsDir)\n }\n\n const fileNameTimestamp = timestamp.replace(/[-: ]/g, '')\n const filePath = path.join(migrationsDir, `${fileNameTimestamp}_migration.ts`)\n\n const importStatements = `import { Kysely } from 'kysely';\nimport {\n MigrationAction,\n CreateTableAction,\n DropTableAction,\n AddColumnAction,\n DropColumnAction,\n AlterColumnAction,\n AddForeignKeyConstraintAction,\n DropForeignKeyConstraintAction,\n CreateIndexAction,\n DropIndexAction,\n AddUniqueConstraintAction,\n DropUniqueConstraintAction,\n executeActions\n} from 'gummy-cli';\n `\n\n const actionInstances = actions.map((action) => action.toCode())\n const downActionInstances = downActions.map((action) => action.toCode())\n\n const fileHeader = `// Generated by Gummy on ${timestamp}`\n\n const migrationFileContent = `${fileHeader}\n\n${importStatements}\n\nexport const actions: MigrationAction[] = [\n ${actionInstances.join(',\\n ')}\n];\n\nexport const downActions: MigrationAction[] = [\n ${downActionInstances.join(',\\n ')}\n];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function up(db: Kysely<any>): Promise<void> {\n await executeActions(actions, db);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function down(db: Kysely<any>): Promise<void> {\n await executeActions(downActions, db);\n}\n`\n\n fs.writeFileSync(filePath, migrationFileContent)\n}\n","import { Kysely, sql } from 'kysely'\nimport { ColumnDefinition, ColumnDefinitionDiff, DatabaseState, IndexDefinition } from './types.mjs'\nimport { ColumnDefinitionBuilder } from 'kysely'\nimport { areArrayEqual } from '../utils.mjs'\n\nexport abstract class MigrationAction {\n abstract applyToState(state: DatabaseState): void\n abstract execute(db: Kysely<any>): Promise<void>\n abstract toCode(): string\n}\n\n// Helper functions\nfunction mapColumnTypeToDataType(columnDef: ColumnDefinition): any {\n switch (columnDef.dataType) {\n case 'BigInteger':\n return 'bigint'\n case 'BigSerial':\n return 'bigserial'\n case 'Boolean':\n return 'boolean'\n case 'Date':\n return 'date'\n case 'Decimal':\n return 'decimal'\n case 'Email':\n case 'Varchar':\n return columnDef.length ? `varchar(${columnDef.length})` : 'varchar'\n case 'Integer':\n return 'integer'\n case 'Serial':\n return 'serial'\n case 'Text':\n return 'text'\n case 'Timestamp':\n return 'timestamp'\n case 'UUID':\n return 'uuid'\n case 'Json':\n return 'json'\n default:\n throw new Error(`Unsupported ColumnType: ${columnDef.dataType}`)\n }\n}\n\nfunction buildCol(col: ColumnDefinitionBuilder, columnDef: ColumnDefinition): ColumnDefinitionBuilder {\n if (columnDef.isPrimaryKey) {\n col = col.primaryKey()\n }\n if (columnDef.notNull) {\n col = col.notNull()\n }\n if (columnDef.isUnique) {\n col = col.unique()\n }\n if (columnDef.hasDefault && columnDef.defaultValue !== undefined) {\n if (typeof columnDef.defaultValue === 'string' && columnDef.defaultValue.startsWith('sql`')) {\n col = col.defaultTo(sql`${columnDef.defaultValue}`)\n } else {\n col = col.defaultTo(columnDef.defaultValue)\n }\n }\n // Foreign key handling is done separately\n return col\n}\n\n// Helper functions for constraint names\n\nfunction sortColumns(columns: string[]): string[] {\n return [...columns].sort()\n}\n\nexport function generateForeignKeyConstraintName(tableName: string, columnName: string): string {\n return `${tableName}_${columnName}_fk`\n}\n\nexport function generateUniqueConstraintName(tableName: string, columns: string[]): string {\n const sortedColumns = sortColumns(columns)\n return `${tableName}_${sortedColumns.join('_')}_unique`\n}\n\nexport function generateIndexName(tableName: string, columns: string[]): string {\n const sortedColumns = sortColumns(columns)\n return `${tableName}_${sortedColumns.join('_')}_idx`\n}\n\n// executeActions function\nexport async function executeActions(actions: MigrationAction[], db: Kysely<any>): Promise<void> {\n for (const action of actions) {\n await action.execute(db)\n }\n}\n\n// MigrationAction subclasses\n\nexport class CreateTableAction extends MigrationAction {\n table: string\n columns: ColumnDefinition[]\n ifNotExists: boolean\n indexes?: IndexDefinition[]\n uniqueConstraints?: string[][] // Array of column name arrays\n\n constructor(\n tableName: string,\n columns: ColumnDefinition[],\n options?: {\n ifNotExists?: boolean\n indexes?: IndexDefinition[]\n uniqueConstraints?: string[][]\n },\n ) {\n super()\n this.table = tableName\n this.columns = columns\n this.ifNotExists = options?.ifNotExists ?? false\n this.indexes = options?.indexes\n this.uniqueConstraints = options?.uniqueConstraints\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table]) {\n state.tables[this.table] = { columns: {} }\n }\n for (const column of this.columns) {\n state.tables[this.table].columns[column.name] = { ...column }\n }\n if (this.indexes) {\n state.tables[this.table].indexes = this.indexes\n }\n if (this.uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = this.uniqueConstraints\n }\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema.createTable(this.table)\n if (this.ifNotExists) {\n builder = builder.ifNotExists()\n }\n for (const column of this.columns) {\n const dataType = mapColumnTypeToDataType(column)\n builder = builder.addColumn(column.name, dataType, (col) => buildCol(col, column))\n }\n // Add unique constraints\n if (this.uniqueConstraints) {\n for (const columns of this.uniqueConstraints) {\n const constraintName = generateUniqueConstraintName(this.table, columns)\n builder = builder.addUniqueConstraint(constraintName, columns as any)\n }\n }\n await builder.execute()\n\n // Create indexes\n if (this.indexes) {\n for (const index of this.indexes) {\n await new CreateIndexAction(index.table, index.columns).execute(db)\n }\n }\n }\n\n toCode(): string {\n return `new CreateTableAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)}, ${JSON.stringify({\n ifNotExists: this.ifNotExists,\n indexes: this.indexes,\n uniqueConstraints: this.uniqueConstraints,\n })})`\n }\n}\n\nexport class DropTableAction extends MigrationAction {\n table: string\n ifExists: boolean\n\n constructor(tableName: string, ifExists: boolean = false) {\n super()\n this.table = tableName\n this.ifExists = ifExists\n }\n\n applyToState(state: DatabaseState): void {\n delete state.tables[this.table]\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema.dropTable(this.table)\n if (this.ifExists) {\n builder = builder.ifExists()\n }\n await builder.execute()\n }\n\n toCode(): string {\n return `new DropTableAction(${JSON.stringify(this.table)}, ${this.ifExists})`\n }\n}\n\nexport class AddColumnAction extends MigrationAction {\n table: string\n column: ColumnDefinition\n\n constructor(tableName: string, column: ColumnDefinition) {\n super()\n this.table = tableName\n this.column = column\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table]) {\n state.tables[this.table] = { columns: {} }\n }\n state.tables[this.table].columns[this.column.name] = { ...this.column }\n }\n\n async execute(db: Kysely<any>) {\n const dataType = mapColumnTypeToDataType(this.column)\n await db.schema\n .alterTable(this.table)\n .addColumn(this.column.name, dataType, (col) => buildCol(col, this.column))\n .execute()\n }\n\n toCode(): string {\n return `new AddColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.column)})`\n }\n}\n\n// 4. DropColumnAction\nexport class DropColumnAction extends MigrationAction {\n table: string\n columnName: string\n\n constructor(tableName: string, columnName: string) {\n super()\n this.table = tableName\n this.columnName = columnName\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table]) {\n delete state.tables[this.table].columns[this.columnName]\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropColumn(this.columnName).execute()\n }\n\n toCode(): string {\n return `new DropColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`\n }\n}\n\nexport class AlterColumnAction extends MigrationAction {\n table: string\n columnName: string\n changes: ColumnDefinitionDiff\n\n constructor(tableName: string, columnName: string, changes: ColumnDefinitionDiff) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.changes = changes\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table] && state.tables[this.table].columns[this.columnName]) {\n const column = state.tables[this.table].columns[this.columnName]\n if (this.changes.dataType !== undefined) {\n column.dataType = this.changes.dataType\n }\n if (this.changes.length !== undefined) {\n column.length = this.changes.length\n }\n if (this.changes.isPrimaryKey !== undefined) {\n column.isPrimaryKey = this.changes.isPrimaryKey\n }\n if (this.changes.notNull !== undefined) {\n column.notNull = this.changes.notNull\n }\n if (this.changes.hasDefault !== undefined) {\n column.hasDefault = this.changes.hasDefault\n column.defaultValue = this.changes.defaultValue\n }\n if (this.changes.isUnique !== undefined) {\n column.isUnique = this.changes.isUnique\n }\n }\n }\n\n async execute(db: Kysely<any>) {\n if (this.changes.dataType !== undefined || this.changes.length !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) =>\n col.setDataType(\n mapColumnTypeToDataType({\n dataType: this.changes.dataType,\n length: this.changes.length,\n } as ColumnDefinition),\n ),\n )\n .execute()\n }\n\n if (this.changes.notNull !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) => (this.changes.notNull ? col.setNotNull() : col.dropNotNull()))\n .execute()\n }\n\n if (this.changes.hasDefault !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) => {\n if (this.changes.hasDefault && this.changes.defaultValue !== undefined) {\n if (typeof this.changes.defaultValue === 'string' && this.changes.defaultValue.startsWith('sql`')) {\n return col.setDefault(sql`${this.changes.defaultValue}`)\n } else {\n return col.setDefault(this.changes.defaultValue)\n }\n } else {\n return col.dropDefault()\n }\n })\n .execute()\n }\n\n if (this.changes.isUnique !== undefined) {\n const constraintName = generateUniqueConstraintName(this.table, [this.columnName])\n if (this.changes.isUnique) {\n await db.schema.alterTable(this.table).addUniqueConstraint(constraintName, [this.columnName]).execute()\n } else {\n await db.schema.alterTable(this.table).dropConstraint(constraintName).execute()\n }\n }\n }\n\n toCode(): string {\n return `new AlterColumnAction(${JSON.stringify(\n this.table,\n )}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.changes)})`\n }\n}\n\nexport class AddForeignKeyConstraintAction extends MigrationAction {\n table: string\n columnName: string\n referencedTable: string\n referencedColumn: string\n constraintName: string\n onDelete?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n onUpdate?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n\n constructor(\n tableName: string,\n columnName: string,\n referencedTable: string,\n referencedColumn: string,\n options?: {\n onDelete?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n onUpdate?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n },\n ) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.referencedTable = referencedTable\n this.referencedColumn = referencedColumn\n this.constraintName = generateForeignKeyConstraintName(tableName, columnName)\n this.onDelete = options?.onDelete\n this.onUpdate = options?.onUpdate\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table] && state.tables[this.table].columns[this.columnName]) {\n state.tables[this.table].columns[this.columnName].references = `${this.referencedTable}.${this.referencedColumn}`\n state.tables[this.table].columns[this.columnName].onDelete = this.onDelete\n state.tables[this.table].columns[this.columnName].onUpdate = this.onUpdate\n }\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema\n .alterTable(this.table)\n .addForeignKeyConstraint(this.constraintName, [this.columnName], this.referencedTable, [this.referencedColumn])\n\n if (this.onDelete) {\n builder = builder.onDelete(this.onDelete)\n }\n if (this.onUpdate) {\n builder = builder.onUpdate(this.onUpdate)\n }\n\n await builder.execute()\n }\n\n toCode(): string {\n return `new AddForeignKeyConstraintAction(${JSON.stringify(\n this.table,\n )}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(\n this.referencedTable,\n )}, ${JSON.stringify(this.referencedColumn)}, ${JSON.stringify({\n onDelete: this.onDelete,\n onUpdate: this.onUpdate,\n })})`\n }\n}\n\nexport class DropForeignKeyConstraintAction extends MigrationAction {\n table: string\n columnName: string\n constraintName: string\n\n constructor(tableName: string, columnName: string) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.constraintName = generateForeignKeyConstraintName(tableName, columnName)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table]) {\n const column = state.tables[this.table].columns[this.columnName]\n if (column && column.references) {\n column.references = undefined\n column.onDelete = undefined\n column.onUpdate = undefined\n }\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()\n }\n\n toCode(): string {\n return `new DropForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`\n }\n}\n\nexport class CreateIndexAction extends MigrationAction {\n table: string\n columns: string[]\n indexName: string\n\n constructor(table: string, columns: string[]) {\n super()\n this.table = table\n this.columns = columns\n this.indexName = generateIndexName(table, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table].indexes) {\n state.tables[this.table].indexes = []\n }\n state.tables[this.table].indexes!.push({\n table: this.table,\n columns: this.columns,\n })\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.createIndex(this.indexName).on(this.table).columns(this.columns).execute()\n }\n\n toCode(): string {\n return `new CreateIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class DropIndexAction extends MigrationAction {\n table: string\n columns: string[]\n indexName: string\n\n constructor(table: string, columns: string[]) {\n super()\n this.table = table\n this.columns = columns\n this.indexName = generateIndexName(table, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table].indexes) {\n state.tables[this.table].indexes = state.tables[this.table].indexes!.filter(\n (idx) => !areArrayEqual(idx.columns, this.columns),\n )\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.dropIndex(this.indexName).execute()\n }\n\n toCode(): string {\n return `new DropIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class AddUniqueConstraintAction extends MigrationAction {\n table: string\n columns: string[]\n constraintName: string\n\n constructor(tableName: string, columns: string[]) {\n super()\n this.table = tableName\n this.columns = columns\n this.constraintName = generateUniqueConstraintName(tableName, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table].uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = []\n }\n state.tables[this.table].uniqueConstraints!.push(this.columns)\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).addUniqueConstraint(this.constraintName, this.columns).execute()\n }\n\n toCode(): string {\n return `new AddUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class DropUniqueConstraintAction extends MigrationAction {\n table: string\n columns: string[]\n constraintName: string\n\n constructor(tableName: string, columns: string[]) {\n super()\n this.table = tableName\n this.columns = columns\n this.constraintName = generateUniqueConstraintName(tableName, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table].uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = state.tables[this.table].uniqueConstraints!.filter(\n (cols) => generateUniqueConstraintName(this.table, cols) !== this.constraintName,\n )\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()\n }\n\n toCode(): string {\n return `new DropUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n","export function areArrayEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n const sortedA = [...a].sort()\n const sortedB = [...b].sort()\n return sortedA.every((value, index) => value === sortedB[index])\n}\n","import { ColumnType } from 'gummy'\nimport { ColumnTypeStr, DatabaseState } from './types.mjs'\n\nexport function validateDatabaseState(state: DatabaseState): string[] {\n const errors: string[] = []\n\n const tables = state.tables\n for (const [tableName, tableState] of Object.entries(tables)) {\n // Collect primary keys\n const primaryKeys = []\n\n const columns = tableState.columns\n for (const [columnName, columnDef] of Object.entries(columns)) {\n // Check for primary keys\n if (columnDef.isPrimaryKey) {\n primaryKeys.push(columnName)\n // Primary key columns must be NOT NULL\n if (!columnDef.notNull) {\n errors.push(`Primary key column \"${columnName}\" in table \"${tableName}\" must be NOT NULL.`)\n }\n }\n\n // Check foreign key references\n if (columnDef.references) {\n const [referencedTable, referencedColumn] = columnDef.references.split('.')\n if (!state.tables[referencedTable]) {\n errors.push(\n `Referenced table \"${referencedTable}\" for foreign key on \"${tableName}.${columnName}\" does not exist.`,\n )\n } else if (!state.tables[referencedTable].columns[referencedColumn]) {\n errors.push(\n `Referenced column \"${referencedTable}.${referencedColumn}\" for foreign key on \"${tableName}.${columnName}\" does not exist.`,\n )\n } else {\n const foreignColumnDef = state.tables[referencedTable].columns[referencedColumn]\n // Check data type compatibility\n if (!areDataTypesCompatible(columnDef.dataType, foreignColumnDef.dataType)) {\n errors.push(\n `Data type incompatibility between foreign key column \"${tableName}.${columnName}\" (${ColumnType[columnDef.dataType]}) and referenced column \"${referencedTable}.${referencedColumn}\" (${ColumnType[foreignColumnDef.dataType]}).`,\n )\n }\n // Referenced column should be PRIMARY KEY or UNIQUE\n if (!foreignColumnDef.isPrimaryKey && !foreignColumnDef.isUnique) {\n errors.push(\n `Referenced column \"${referencedTable}.${referencedColumn}\" for foreign key on \"${tableName}.${columnName}\" is not PRIMARY KEY or UNIQUE.`,\n )\n }\n }\n }\n }\n }\n\n return errors\n}\n\nfunction areDataTypesCompatible(fkType: ColumnTypeStr, pkType: ColumnTypeStr): boolean {\n const compatibleTypes: { [key in ColumnTypeStr]?: ColumnTypeStr[] } = {\n [ColumnType.Integer]: [ColumnType.Integer, ColumnType.Serial, ColumnType.BigInteger, ColumnType.BigSerial],\n [ColumnType.BigInteger]: [ColumnType.BigInteger, ColumnType.BigSerial, ColumnType.Integer, ColumnType.Serial],\n [ColumnType.Serial]: [ColumnType.Integer, ColumnType.Serial],\n [ColumnType.BigSerial]: [ColumnType.BigInteger, ColumnType.BigSerial],\n [ColumnType.Varchar]: [ColumnType.Varchar, ColumnType.Text],\n [ColumnType.Text]: [ColumnType.Text, ColumnType.Varchar],\n [ColumnType.UUID]: [ColumnType.UUID],\n }\n\n if (fkType === pkType) {\n return true\n }\n\n if (compatibleTypes[fkType]?.includes(pkType)) {\n return true\n }\n\n return false\n}\n","import { loadConfig } from 'c12'\n\nexport type Config = {\n modelsDir?: string\n migrationsDir?: string\n}\n\nexport const getConfig = async () => {\n const loadedConfig = await loadConfig<Config>({\n name: 'gummy',\n rcFile: false,\n globalRc: false,\n dotenv: false,\n packageJson: false,\n })\n\n return loadedConfig.config\n}\n\nexport const defineConfig = (input: Config): Config => input\n"],"mappings":"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","names":["import_commander","import_commander","fs","path","import_glob","import_chalk","import_gummy","import_pkg_types","import_kysely","areArrayEqual","a","b","sortedA","sortedB","value","index","MigrationAction","mapColumnTypeToDataType","columnDef","buildCol","col","sortColumns","columns","generateForeignKeyConstraintName","tableName","columnName","generateUniqueConstraintName","sortedColumns","generateIndexName","CreateTableAction","MigrationAction","tableName","columns","options","state","column","db","builder","dataType","mapColumnTypeToDataType","col","buildCol","constraintName","generateUniqueConstraintName","index","CreateIndexAction","DropTableAction","ifExists","AddColumnAction","DropColumnAction","columnName","AlterColumnAction","changes","AddForeignKeyConstraintAction","referencedTable","referencedColumn","generateForeignKeyConstraintName","DropForeignKeyConstraintAction","table","generateIndexName","DropIndexAction","idx","areArrayEqual","AddUniqueConstraintAction","DropUniqueConstraintAction","cols","import_gummy","validateDatabaseState","state","errors","tables","tableName","tableState","primaryKeys","columns","columnName","columnDef","referencedTable","referencedColumn","foreignColumnDef","areDataTypesCompatible","fkType","pkType","compatibleTypes","import_c12","getConfig","import_meta","info","chalk","error","makeMigrations","config","getConfig","tableInstances","extractTableInstances","newState","buildNewState","validationErrors","validateDatabaseState","errMsg","pastMigrationActions","loadPastMigrationActions","oldState","reconstructOldState","stateDiff","compareStates","actions","downActions","generateMigrationActions","timestamp","generateMigrationFile","importTSFile","path","tsImport","tsRequire","modelsDir","files","fileName","m","exported","defaultExported","_isWithLength","column","extractColumns","table","columns","tableDefinition","_","foreignKeyConfigs","instance","tableName","migrationsDir","migrationFiles","allActions","file","migrationModule","migrationActions","state","action","newTableDef","oldTableDef","columnsWithoutFK","col","CreateTableAction","columnDef","referencedTable","referencedColumn","AddForeignKeyConstraintAction","columnName","newColumnDef","oldColumnDef","diff","generateColumnDefinitionDiff","AlterColumnAction","DropForeignKeyConstraintAction","columnWithoutFK","AddColumnAction","DropColumnAction","newIndexes","oldIndexes","addedIndexes","newIndex","oldIndex","areArrayEqual","removedIndexes","index","CreateIndexAction","DropIndexAction","newUniqueConstraints","oldUniqueConstraints","addedUniqueConstraints","newConstraint","oldConstraint","removedUniqueConstraints","AddUniqueConstraintAction","DropUniqueConstraintAction","DropTableAction","oldColumn","newColumn","hasChanges","oldDefault","newDefault","generateReverseColumnDefinitionDiff","changes","reverseDiff","tableDef","fkAction","indexAction","ucAction","fileNameTimestamp","filePath","importStatements","actionInstances","downActionInstances","migrationFileContent","makemigrations","makeMigrations","main","program","makemigrations"]}
1
+ {"version":3,"sources":["../src/bin.mts","../src/commands/makemigrations.mts","../src/migrate/makemigrations.mts","../src/migrate/actions.mts","../src/utils.mts","../src/migrate/validate.mts","../src/config.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\n\nimport { makemigrations } from './commands/makemigrations.mjs'\n\nprocess.on('SIGINT', () => process.exit(0))\nprocess.on('SIGTERM', () => process.exit(0))\n\nasync function main() {\n const program = new Command()\n program.addCommand(makemigrations)\n program.parse()\n}\n\nmain()\n","import { Command } from 'commander'\nimport { makeMigrations } from '../migrate/makemigrations.mjs'\n\nexport const makemigrations = new Command().name('makemigrations').action(async () => {\n await makeMigrations()\n})\n","import * as fs from 'fs'\nimport * as path from 'path'\nimport { globSync } from 'glob'\nimport chalk from 'chalk'\nimport { Column, isTable, Table } from 'gummy'\nimport { readPackageJSON } from 'pkg-types'\n\nimport {\n AddColumnAction,\n AddForeignKeyConstraintAction,\n AddUniqueConstraintAction,\n AlterColumnAction,\n CreateIndexAction,\n CreateTableAction,\n DropColumnAction,\n DropForeignKeyConstraintAction,\n DropIndexAction,\n DropTableAction,\n DropUniqueConstraintAction,\n MigrationAction,\n} from './actions.mjs'\nimport { ColumnDefinition, ColumnDefinitionDiff, DatabaseState, TableState } from './types.mjs'\nimport { validateDatabaseState } from './validate.mjs'\nimport { areArrayEqual } from '../utils.mjs'\nimport { getConfig } from '../config.mjs'\n\nconst info = chalk.bold.blue\nconst error = chalk.bold.red\n\nexport async function makeMigrations() {\n const config = await getConfig()\n\n // Step 1: Extract all table instances from 'src/models/'\n const tableInstances = await extractTableInstances(config.modelsDir)\n\n // Step 2: Extract column definitions from each table instance\n const newState = buildNewState(tableInstances)\n\n // Step 3: Validate the newState before proceeding\n const validationErrors = validateDatabaseState(newState)\n if (validationErrors.length > 0) {\n console.log(error('Validation Error(s) found in the database schema:'))\n for (const errMsg of validationErrors) {\n console.log(error(`- ${errMsg}`))\n }\n process.exit(1)\n }\n\n // Step 4: Load past migration actions and reconstruct oldState\n const pastMigrationActions = await loadPastMigrationActions(config.migrationsDir)\n const oldState = reconstructOldState(pastMigrationActions)\n\n // Step 5: Compare oldState and newState to get stateDiff\n const stateDiff = compareStates(oldState, newState)\n if (\n stateDiff.added.length === 0 &&\n stateDiff.removed.length === 0 &&\n stateDiff.modified.length === 0 &&\n stateDiff.foreignKeys.length === 0\n ) {\n console.log(info('No changes detected. Migration file not generated.'))\n process.exit(0)\n }\n\n // Step 6: Generate migration actions for the current stateDiff\n const { actions, downActions } = generateMigrationActions(stateDiff, newState, oldState)\n\n // Step 7: Generate migration file based on migration actions\n const timestamp = new Date().toISOString().replace(/[-:T]/g, '').split('.')[0]\n generateMigrationFile(actions, downActions, timestamp, config.migrationsDir)\n\n console.log(info('Migration script completed successfully.'))\n}\n\ntype StateDiff = {\n added: MigrationAction[]\n removed: MigrationAction[]\n modified: MigrationAction[]\n foreignKeys: (AddForeignKeyConstraintAction | DropForeignKeyConstraintAction)[]\n indexes: {\n added: CreateIndexAction[]\n removed: DropIndexAction[]\n }\n uniqueConstraints: {\n added: AddUniqueConstraintAction[]\n removed: DropUniqueConstraintAction[]\n }\n}\n\nasync function importTSFile(path: string): Promise<any> {\n const localPackageJson = await readPackageJSON()\n if (localPackageJson.type === 'module') {\n const { tsImport } = await import('tsx/esm/api')\n\n // if (isWindows && !path.startsWith('file://')) {\n // path = `file://${path}`\n // }\n\n return await tsImport(path, { parentURL: import.meta.url })\n }\n\n const { require: tsRequire } = await import('tsx/cjs/api')\n\n return await tsRequire(path, __filename)\n}\n\nexport async function extractTableInstances(modelsDir = 'src/models'): Promise<Table[]> {\n const files = globSync(`${modelsDir}/**/*.{ts,js,mjs,mts}`, { absolute: true })\n const tableInstances: Table[] = []\n\n for (const fileName of files) {\n if (\n fileName.endsWith('.js') ||\n (fileName.endsWith('.ts') && !fileName.endsWith('.d.ts')) ||\n fileName.endsWith('.mjs') ||\n (fileName.endsWith('.mts') && !fileName.endsWith('.d.mts'))\n ) {\n const m = await importTSFile(fileName)\n\n Object.entries(m).forEach(([, exported]) => {\n if (isTable(exported)) {\n tableInstances.push(exported)\n }\n })\n\n const defaultExported = m.default\n if (isTable(defaultExported)) {\n tableInstances.push(defaultExported)\n }\n }\n }\n\n return tableInstances\n}\n\nconst _isWithLength = (column: Column): column is typeof column & { length: number } => {\n return 'length' in column && typeof column.length === 'number'\n}\n\nconst extractColumns = (table: Table): TableState => {\n const columns = Table.columns(table)\n return {\n columns: Object.entries(columns).reduce(\n (tableDefinition, [_, column]) => {\n const { foreignKeyConfigs } = column.config\n tableDefinition[column.name] = {\n name: column.name,\n dataType: column.columnType,\n length: _isWithLength(column) ? column.length : undefined,\n isPrimaryKey: column.primary,\n notNull: column.notNull,\n // TODO: We only support application side default value for now\n // hasDefault: column.hasDefault,\n // defaultValue: column.default,\n isUnique: column.isUnique,\n references:\n foreignKeyConfigs != null\n ? `${foreignKeyConfigs?.ref.table.tableName}.${foreignKeyConfigs?.ref.name}`\n : undefined,\n onDelete: foreignKeyConfigs?.actions.onDelete,\n }\n return tableDefinition\n },\n {} as { [columnName: string]: ColumnDefinition },\n ),\n indexes: Object.entries(columns)\n .map(([, column]) => column)\n .filter((column) => column.index)\n .map((column) => ({ table: table.tableName, columns: [column.name] })),\n // TODO: indexes\n // TODO: uniqueConstraints\n }\n}\n\nexport function buildNewState(tableInstances: Table[]): DatabaseState {\n const newState: DatabaseState = { tables: {} }\n tableInstances.forEach((instance) => {\n const tableName = instance.tableName\n newState.tables[tableName] = extractColumns(instance)\n })\n return newState\n}\n\nexport async function loadPastMigrationActions(migrationsDir = 'migrations'): Promise<MigrationAction[]> {\n if (!fs.existsSync(migrationsDir)) {\n return []\n }\n\n const migrationFiles = globSync(`${migrationsDir}/**/*.{ts,js,mjs,mts}`, { absolute: true })\n const allActions: MigrationAction[] = []\n for (const file of migrationFiles.sort()) {\n const migrationModule = await importTSFile(file)\n\n if (migrationModule.actions && Array.isArray(migrationModule.actions)) {\n allActions.push(...migrationModule.actions)\n }\n }\n\n return allActions\n}\n\nexport function reconstructOldState(migrationActions: MigrationAction[]): DatabaseState {\n const state: DatabaseState = { tables: {} }\n\n for (const action of migrationActions) {\n action.applyToState(state)\n }\n\n return state\n}\n\nfunction compareStates(oldState: DatabaseState, newState: DatabaseState): StateDiff {\n const stateDiff: StateDiff = {\n added: [],\n removed: [],\n modified: [],\n foreignKeys: [],\n indexes: { added: [], removed: [] },\n uniqueConstraints: { added: [], removed: [] },\n }\n\n // Compare tables\n for (const [tableName, newTableDef] of Object.entries(newState.tables)) {\n const oldTableDef = oldState.tables[tableName]\n\n if (!oldTableDef) {\n // New table\n const columnsWithoutFK = Object.values(newTableDef.columns).map((col) => ({\n ...col,\n references: undefined,\n }))\n stateDiff.added.push(\n new CreateTableAction(tableName, columnsWithoutFK, {\n indexes: newTableDef.indexes,\n uniqueConstraints: newTableDef.uniqueConstraints,\n }),\n )\n // Collect foreign key constraints\n for (const columnDef of Object.values(newTableDef.columns)) {\n if (columnDef.references) {\n const [referencedTable, referencedColumn] = columnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnDef.name, referencedTable, referencedColumn, {\n onDelete: columnDef.onDelete,\n onUpdate: columnDef.onUpdate,\n }),\n )\n }\n }\n continue\n }\n\n // Compare columns\n for (const [columnName, newColumnDef] of Object.entries(newTableDef.columns)) {\n const oldColumnDef = oldTableDef.columns[columnName]\n\n if (!oldColumnDef) {\n // New column\n const columnWithoutFK = { ...newColumnDef, references: undefined }\n stateDiff.added.push(new AddColumnAction(tableName, columnWithoutFK))\n // Collect foreign key constraints\n if (newColumnDef.references) {\n const [referencedTable, referencedColumn] = newColumnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnName, referencedTable, referencedColumn, {\n onDelete: newColumnDef.onDelete,\n onUpdate: newColumnDef.onUpdate,\n }),\n )\n }\n } else {\n // Generate column definition differences\n const diff = generateColumnDefinitionDiff(oldColumnDef, newColumnDef)\n if (diff) {\n stateDiff.modified.push(new AlterColumnAction(tableName, columnName, diff))\n }\n\n // Detect foreign key constraint changes\n if (oldColumnDef.references !== newColumnDef.references || oldColumnDef.onDelete !== newColumnDef.onDelete) {\n if (oldColumnDef.references) {\n // Drop old foreign key constraint\n stateDiff.foreignKeys.push(new DropForeignKeyConstraintAction(tableName, columnName))\n }\n if (newColumnDef.references) {\n // Add new foreign key constraint\n const [referencedTable, referencedColumn] = newColumnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnName, referencedTable, referencedColumn, {\n onDelete: newColumnDef.onDelete,\n onUpdate: newColumnDef.onUpdate,\n }),\n )\n }\n }\n }\n }\n\n // Check for removed columns\n for (const columnName of Object.keys(oldTableDef.columns)) {\n if (!newTableDef.columns[columnName]) {\n stateDiff.removed.push(new DropColumnAction(tableName, columnName))\n }\n }\n\n // Compare indexes\n const newIndexes = newTableDef.indexes || []\n const oldIndexes = oldTableDef.indexes || []\n\n const addedIndexes = newIndexes.filter(\n (newIndex) => !oldIndexes.some((oldIndex) => areArrayEqual(oldIndex.columns, newIndex.columns)),\n )\n\n const removedIndexes = oldIndexes.filter(\n (oldIndex) => !newIndexes.some((newIndex) => areArrayEqual(newIndex.columns, oldIndex.columns)),\n )\n\n for (const index of addedIndexes) {\n stateDiff.indexes.added.push(new CreateIndexAction(tableName, index.columns))\n }\n\n for (const index of removedIndexes) {\n stateDiff.indexes.removed.push(new DropIndexAction(tableName, index.columns))\n }\n\n // Compare unique constraints\n const newUniqueConstraints = newTableDef.uniqueConstraints || []\n const oldUniqueConstraints = oldTableDef.uniqueConstraints || []\n\n const addedUniqueConstraints = newUniqueConstraints.filter(\n (newConstraint) => !oldUniqueConstraints.some((oldConstraint) => areArrayEqual(oldConstraint, newConstraint)),\n )\n\n const removedUniqueConstraints = oldUniqueConstraints.filter(\n (oldConstraint) => !newUniqueConstraints.some((newConstraint) => areArrayEqual(newConstraint, oldConstraint)),\n )\n\n for (const columns of addedUniqueConstraints) {\n stateDiff.uniqueConstraints.added.push(new AddUniqueConstraintAction(tableName, columns))\n }\n\n for (const columns of removedUniqueConstraints) {\n stateDiff.uniqueConstraints.removed.push(new DropUniqueConstraintAction(tableName, columns))\n }\n }\n\n // Check for removed tables\n for (const tableName of Object.keys(oldState.tables)) {\n if (!newState.tables[tableName]) {\n stateDiff.removed.push(new DropTableAction(tableName))\n }\n }\n\n return stateDiff\n}\n\nfunction generateColumnDefinitionDiff(\n oldColumn: ColumnDefinition,\n newColumn: ColumnDefinition,\n): ColumnDefinitionDiff | null {\n const diff: ColumnDefinitionDiff = {}\n let hasChanges = false\n\n if (oldColumn.dataType !== newColumn.dataType) {\n diff.dataType = newColumn.dataType\n hasChanges = true\n }\n\n if (oldColumn.length !== newColumn.length) {\n diff.length = newColumn.length\n hasChanges = true\n }\n\n if (oldColumn.isPrimaryKey !== newColumn.isPrimaryKey) {\n diff.isPrimaryKey = newColumn.isPrimaryKey\n hasChanges = true\n }\n\n if (oldColumn.notNull !== newColumn.notNull) {\n diff.notNull = newColumn.notNull\n hasChanges = true\n }\n\n const oldDefault = oldColumn.hasDefault ? oldColumn.defaultValue : undefined\n const newDefault = newColumn.hasDefault ? newColumn.defaultValue : undefined\n if (oldDefault !== newDefault) {\n diff.hasDefault = newColumn.hasDefault\n diff.defaultValue = newColumn.defaultValue\n hasChanges = true\n }\n\n if (oldColumn.isUnique !== newColumn.isUnique) {\n diff.isUnique = newColumn.isUnique\n hasChanges = true\n }\n\n return hasChanges ? diff : null\n}\n\nfunction generateReverseColumnDefinitionDiff(\n changes: ColumnDefinitionDiff,\n oldColumn: ColumnDefinition,\n): ColumnDefinitionDiff {\n const reverseDiff: ColumnDefinitionDiff = {}\n\n if (changes.dataType !== undefined) {\n reverseDiff.dataType = oldColumn.dataType\n reverseDiff.length = oldColumn.length\n }\n\n if (changes.isPrimaryKey !== undefined) {\n reverseDiff.isPrimaryKey = oldColumn.isPrimaryKey\n }\n\n if (changes.notNull !== undefined) {\n reverseDiff.notNull = oldColumn.notNull\n }\n\n if (changes.hasDefault !== undefined) {\n reverseDiff.hasDefault = oldColumn.hasDefault\n reverseDiff.defaultValue = oldColumn.defaultValue\n }\n\n if (changes.isUnique !== undefined) {\n reverseDiff.isUnique = oldColumn.isUnique\n }\n\n return reverseDiff\n}\n\nfunction generateMigrationActions(stateDiff: StateDiff, newState: DatabaseState, oldState: DatabaseState) {\n const actions: MigrationAction[] = []\n const downActions: MigrationAction[] = []\n\n // Added actions\n for (const action of stateDiff.added) {\n actions.push(action)\n if (action instanceof CreateTableAction) {\n downActions.unshift(new DropTableAction(action.table))\n } else if (action instanceof AddColumnAction) {\n downActions.unshift(new DropColumnAction(action.table, action.column.name))\n }\n }\n\n // Removed actions\n for (const action of stateDiff.removed) {\n actions.push(action)\n if (action instanceof DropTableAction) {\n const tableDef = oldState.tables[action.table]\n downActions.unshift(\n new CreateTableAction(action.table, Object.values(tableDef.columns), {\n indexes: tableDef.indexes,\n uniqueConstraints: tableDef.uniqueConstraints,\n }),\n )\n } else if (action instanceof DropColumnAction) {\n const columnDef = oldState.tables[action.table].columns[action.columnName]\n downActions.unshift(new AddColumnAction(action.table, columnDef))\n }\n }\n\n // Modified actions\n for (const action of stateDiff.modified) {\n actions.push(action)\n // Generate reverse diff for down action\n if (action instanceof AlterColumnAction) {\n const reverseDiff = generateReverseColumnDefinitionDiff(\n action.changes,\n oldState.tables[action.table].columns[action.columnName],\n )\n downActions.unshift(new AlterColumnAction(action.table, action.columnName, reverseDiff))\n }\n }\n\n // Foreign key constraints\n for (const fkAction of stateDiff.foreignKeys) {\n actions.push(fkAction)\n if (fkAction instanceof AddForeignKeyConstraintAction) {\n downActions.unshift(new DropForeignKeyConstraintAction(fkAction.table, fkAction.columnName))\n } else if (fkAction instanceof DropForeignKeyConstraintAction) {\n const oldColumnDef = oldState.tables[fkAction.table].columns[fkAction.columnName]\n if (oldColumnDef.references) {\n const [referencedTable, referencedColumn] = oldColumnDef.references.split('.')\n downActions.unshift(\n new AddForeignKeyConstraintAction(fkAction.table, fkAction.columnName, referencedTable, referencedColumn, {\n onDelete: oldColumnDef.onDelete,\n onUpdate: oldColumnDef.onUpdate,\n }),\n )\n }\n }\n }\n\n // Indexes\n for (const indexAction of stateDiff.indexes.added) {\n actions.push(indexAction)\n downActions.unshift(new DropIndexAction(indexAction.table, indexAction.columns))\n }\n\n for (const indexAction of stateDiff.indexes.removed) {\n actions.push(indexAction)\n downActions.unshift(new CreateIndexAction(indexAction.table, indexAction.columns))\n }\n\n // Unique constraints\n for (const ucAction of stateDiff.uniqueConstraints.added) {\n actions.push(ucAction)\n downActions.unshift(new DropUniqueConstraintAction(ucAction.table, ucAction.columns))\n }\n\n for (const ucAction of stateDiff.uniqueConstraints.removed) {\n actions.push(ucAction)\n downActions.unshift(new AddUniqueConstraintAction(ucAction.table, ucAction.columns))\n }\n\n return { actions, downActions }\n}\n\nfunction generateMigrationFile(\n actions: MigrationAction[],\n downActions: MigrationAction[],\n timestamp: string,\n migrationsDir = 'migrations',\n) {\n if (!fs.existsSync(migrationsDir)) {\n fs.mkdirSync(migrationsDir)\n }\n\n const fileNameTimestamp = timestamp.replace(/[-: ]/g, '')\n const filePath = path.join(migrationsDir, `${fileNameTimestamp}_migration.ts`)\n\n const importStatements = `import { Kysely } from 'kysely';\nimport {\n MigrationAction,\n CreateTableAction,\n DropTableAction,\n AddColumnAction,\n DropColumnAction,\n AlterColumnAction,\n AddForeignKeyConstraintAction,\n DropForeignKeyConstraintAction,\n CreateIndexAction,\n DropIndexAction,\n AddUniqueConstraintAction,\n DropUniqueConstraintAction,\n executeActions\n} from 'gummy-cli';\n `\n\n const actionInstances = actions.map((action) => action.toCode())\n const downActionInstances = downActions.map((action) => action.toCode())\n\n const fileHeader = `// Generated by Gummy on ${timestamp}`\n\n const migrationFileContent = `${fileHeader}\n\n${importStatements}\n\nexport const actions: MigrationAction[] = [\n ${actionInstances.join(',\\n ')}\n];\n\nexport const downActions: MigrationAction[] = [\n ${downActionInstances.join(',\\n ')}\n];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function up(db: Kysely<any>): Promise<void> {\n await executeActions(actions, db);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function down(db: Kysely<any>): Promise<void> {\n await executeActions(downActions, db);\n}\n`\n\n fs.writeFileSync(filePath, migrationFileContent)\n}\n","import { Kysely, sql } from 'kysely'\nimport { ColumnDefinition, ColumnDefinitionDiff, DatabaseState, IndexDefinition } from './types.mjs'\nimport { ColumnDefinitionBuilder } from 'kysely'\nimport { areArrayEqual } from '../utils.mjs'\n\nexport abstract class MigrationAction {\n abstract applyToState(state: DatabaseState): void\n abstract execute(db: Kysely<any>): Promise<void>\n abstract toCode(): string\n}\n\n// Helper functions\nfunction mapColumnTypeToDataType(columnDef: ColumnDefinition): any {\n switch (columnDef.dataType) {\n case 'BigInteger':\n return 'bigint'\n case 'BigSerial':\n return 'bigserial'\n case 'Boolean':\n return 'boolean'\n case 'Date':\n return 'date'\n case 'Decimal':\n return 'decimal'\n case 'Email':\n case 'Varchar':\n return columnDef.length ? `varchar(${columnDef.length})` : 'varchar'\n case 'Integer':\n return 'integer'\n case 'Serial':\n return 'serial'\n case 'Text':\n return 'text'\n case 'Timestamp':\n return 'timestamp'\n case 'UUID':\n return 'uuid'\n case 'Json':\n return 'json'\n default:\n throw new Error(`Unsupported ColumnType: ${columnDef.dataType}`)\n }\n}\n\nfunction buildCol(col: ColumnDefinitionBuilder, columnDef: ColumnDefinition): ColumnDefinitionBuilder {\n if (columnDef.isPrimaryKey) {\n col = col.primaryKey()\n }\n if (columnDef.notNull) {\n col = col.notNull()\n }\n if (columnDef.isUnique) {\n col = col.unique()\n }\n if (columnDef.hasDefault && columnDef.defaultValue !== undefined) {\n if (typeof columnDef.defaultValue === 'string' && columnDef.defaultValue.startsWith('sql`')) {\n col = col.defaultTo(sql`${columnDef.defaultValue}`)\n } else {\n col = col.defaultTo(columnDef.defaultValue)\n }\n }\n // Foreign key handling is done separately\n return col\n}\n\n// Helper functions for constraint names\n\nfunction sortColumns(columns: string[]): string[] {\n return [...columns].sort()\n}\n\nexport function generateForeignKeyConstraintName(tableName: string, columnName: string): string {\n return `${tableName}_${columnName}_fk`\n}\n\nexport function generateUniqueConstraintName(tableName: string, columns: string[]): string {\n const sortedColumns = sortColumns(columns)\n return `${tableName}_${sortedColumns.join('_')}_unique`\n}\n\nexport function generateIndexName(tableName: string, columns: string[]): string {\n const sortedColumns = sortColumns(columns)\n return `${tableName}_${sortedColumns.join('_')}_idx`\n}\n\n// executeActions function\nexport async function executeActions(actions: MigrationAction[], db: Kysely<any>): Promise<void> {\n for (const action of actions) {\n await action.execute(db)\n }\n}\n\n// MigrationAction subclasses\n\nexport class CreateTableAction extends MigrationAction {\n table: string\n columns: ColumnDefinition[]\n ifNotExists: boolean\n indexes?: IndexDefinition[]\n uniqueConstraints?: string[][] // Array of column name arrays\n\n constructor(\n tableName: string,\n columns: ColumnDefinition[],\n options?: {\n ifNotExists?: boolean\n indexes?: IndexDefinition[]\n uniqueConstraints?: string[][]\n },\n ) {\n super()\n this.table = tableName\n this.columns = columns\n this.ifNotExists = options?.ifNotExists ?? false\n this.indexes = options?.indexes\n this.uniqueConstraints = options?.uniqueConstraints\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table]) {\n state.tables[this.table] = { columns: {} }\n }\n for (const column of this.columns) {\n state.tables[this.table].columns[column.name] = { ...column }\n }\n if (this.indexes) {\n state.tables[this.table].indexes = this.indexes\n }\n if (this.uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = this.uniqueConstraints\n }\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema.createTable(this.table)\n if (this.ifNotExists) {\n builder = builder.ifNotExists()\n }\n for (const column of this.columns) {\n const dataType = mapColumnTypeToDataType(column)\n builder = builder.addColumn(column.name, dataType, (col) => buildCol(col, column))\n }\n // Add unique constraints\n if (this.uniqueConstraints) {\n for (const columns of this.uniqueConstraints) {\n const constraintName = generateUniqueConstraintName(this.table, columns)\n builder = builder.addUniqueConstraint(constraintName, columns as any)\n }\n }\n await builder.execute()\n\n // Create indexes\n if (this.indexes) {\n for (const index of this.indexes) {\n await new CreateIndexAction(index.table, index.columns).execute(db)\n }\n }\n }\n\n toCode(): string {\n return `new CreateTableAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)}, ${JSON.stringify({\n ifNotExists: this.ifNotExists,\n indexes: this.indexes,\n uniqueConstraints: this.uniqueConstraints,\n })})`\n }\n}\n\nexport class DropTableAction extends MigrationAction {\n table: string\n ifExists: boolean\n\n constructor(tableName: string, ifExists: boolean = false) {\n super()\n this.table = tableName\n this.ifExists = ifExists\n }\n\n applyToState(state: DatabaseState): void {\n delete state.tables[this.table]\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema.dropTable(this.table)\n if (this.ifExists) {\n builder = builder.ifExists()\n }\n await builder.execute()\n }\n\n toCode(): string {\n return `new DropTableAction(${JSON.stringify(this.table)}, ${this.ifExists})`\n }\n}\n\nexport class AddColumnAction extends MigrationAction {\n table: string\n column: ColumnDefinition\n\n constructor(tableName: string, column: ColumnDefinition) {\n super()\n this.table = tableName\n this.column = column\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table]) {\n state.tables[this.table] = { columns: {} }\n }\n state.tables[this.table].columns[this.column.name] = { ...this.column }\n }\n\n async execute(db: Kysely<any>) {\n const dataType = mapColumnTypeToDataType(this.column)\n await db.schema\n .alterTable(this.table)\n .addColumn(this.column.name, dataType, (col) => buildCol(col, this.column))\n .execute()\n }\n\n toCode(): string {\n return `new AddColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.column)})`\n }\n}\n\n// 4. DropColumnAction\nexport class DropColumnAction extends MigrationAction {\n table: string\n columnName: string\n\n constructor(tableName: string, columnName: string) {\n super()\n this.table = tableName\n this.columnName = columnName\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table]) {\n delete state.tables[this.table].columns[this.columnName]\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropColumn(this.columnName).execute()\n }\n\n toCode(): string {\n return `new DropColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`\n }\n}\n\nexport class AlterColumnAction extends MigrationAction {\n table: string\n columnName: string\n changes: ColumnDefinitionDiff\n\n constructor(tableName: string, columnName: string, changes: ColumnDefinitionDiff) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.changes = changes\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table] && state.tables[this.table].columns[this.columnName]) {\n const column = state.tables[this.table].columns[this.columnName]\n if (this.changes.dataType !== undefined) {\n column.dataType = this.changes.dataType\n }\n if (this.changes.length !== undefined) {\n column.length = this.changes.length\n }\n if (this.changes.isPrimaryKey !== undefined) {\n column.isPrimaryKey = this.changes.isPrimaryKey\n }\n if (this.changes.notNull !== undefined) {\n column.notNull = this.changes.notNull\n }\n if (this.changes.hasDefault !== undefined) {\n column.hasDefault = this.changes.hasDefault\n column.defaultValue = this.changes.defaultValue\n }\n if (this.changes.isUnique !== undefined) {\n column.isUnique = this.changes.isUnique\n }\n }\n }\n\n async execute(db: Kysely<any>) {\n if (this.changes.dataType !== undefined || this.changes.length !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) =>\n col.setDataType(\n mapColumnTypeToDataType({\n dataType: this.changes.dataType,\n length: this.changes.length,\n } as ColumnDefinition),\n ),\n )\n .execute()\n }\n\n if (this.changes.notNull !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) => (this.changes.notNull ? col.setNotNull() : col.dropNotNull()))\n .execute()\n }\n\n if (this.changes.hasDefault !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) => {\n if (this.changes.hasDefault && this.changes.defaultValue !== undefined) {\n if (typeof this.changes.defaultValue === 'string' && this.changes.defaultValue.startsWith('sql`')) {\n return col.setDefault(sql`${this.changes.defaultValue}`)\n } else {\n return col.setDefault(this.changes.defaultValue)\n }\n } else {\n return col.dropDefault()\n }\n })\n .execute()\n }\n\n if (this.changes.isUnique !== undefined) {\n const constraintName = generateUniqueConstraintName(this.table, [this.columnName])\n if (this.changes.isUnique) {\n await db.schema.alterTable(this.table).addUniqueConstraint(constraintName, [this.columnName]).execute()\n } else {\n await db.schema.alterTable(this.table).dropConstraint(constraintName).execute()\n }\n }\n }\n\n toCode(): string {\n return `new AlterColumnAction(${JSON.stringify(\n this.table,\n )}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.changes)})`\n }\n}\n\nexport class AddForeignKeyConstraintAction extends MigrationAction {\n table: string\n columnName: string\n referencedTable: string\n referencedColumn: string\n constraintName: string\n onDelete?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n onUpdate?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n\n constructor(\n tableName: string,\n columnName: string,\n referencedTable: string,\n referencedColumn: string,\n options?: {\n onDelete?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n onUpdate?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n },\n ) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.referencedTable = referencedTable\n this.referencedColumn = referencedColumn\n this.constraintName = generateForeignKeyConstraintName(tableName, columnName)\n this.onDelete = options?.onDelete\n this.onUpdate = options?.onUpdate\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table] && state.tables[this.table].columns[this.columnName]) {\n state.tables[this.table].columns[this.columnName].references = `${this.referencedTable}.${this.referencedColumn}`\n state.tables[this.table].columns[this.columnName].onDelete = this.onDelete\n state.tables[this.table].columns[this.columnName].onUpdate = this.onUpdate\n }\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema\n .alterTable(this.table)\n .addForeignKeyConstraint(this.constraintName, [this.columnName], this.referencedTable, [this.referencedColumn])\n\n if (this.onDelete) {\n builder = builder.onDelete(this.onDelete)\n }\n if (this.onUpdate) {\n builder = builder.onUpdate(this.onUpdate)\n }\n\n await builder.execute()\n }\n\n toCode(): string {\n return `new AddForeignKeyConstraintAction(${JSON.stringify(\n this.table,\n )}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(\n this.referencedTable,\n )}, ${JSON.stringify(this.referencedColumn)}, ${JSON.stringify({\n onDelete: this.onDelete,\n onUpdate: this.onUpdate,\n })})`\n }\n}\n\nexport class DropForeignKeyConstraintAction extends MigrationAction {\n table: string\n columnName: string\n constraintName: string\n\n constructor(tableName: string, columnName: string) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.constraintName = generateForeignKeyConstraintName(tableName, columnName)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table]) {\n const column = state.tables[this.table].columns[this.columnName]\n if (column && column.references) {\n column.references = undefined\n column.onDelete = undefined\n column.onUpdate = undefined\n }\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()\n }\n\n toCode(): string {\n return `new DropForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`\n }\n}\n\nexport class CreateIndexAction extends MigrationAction {\n table: string\n columns: string[]\n indexName: string\n\n constructor(table: string, columns: string[]) {\n super()\n this.table = table\n this.columns = columns\n this.indexName = generateIndexName(table, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table].indexes) {\n state.tables[this.table].indexes = []\n }\n state.tables[this.table].indexes!.push({\n table: this.table,\n columns: this.columns,\n })\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.createIndex(this.indexName).on(this.table).columns(this.columns).execute()\n }\n\n toCode(): string {\n return `new CreateIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class DropIndexAction extends MigrationAction {\n table: string\n columns: string[]\n indexName: string\n\n constructor(table: string, columns: string[]) {\n super()\n this.table = table\n this.columns = columns\n this.indexName = generateIndexName(table, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table].indexes) {\n state.tables[this.table].indexes = state.tables[this.table].indexes!.filter(\n (idx) => !areArrayEqual(idx.columns, this.columns),\n )\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.dropIndex(this.indexName).execute()\n }\n\n toCode(): string {\n return `new DropIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class AddUniqueConstraintAction extends MigrationAction {\n table: string\n columns: string[]\n constraintName: string\n\n constructor(tableName: string, columns: string[]) {\n super()\n this.table = tableName\n this.columns = columns\n this.constraintName = generateUniqueConstraintName(tableName, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table].uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = []\n }\n state.tables[this.table].uniqueConstraints!.push(this.columns)\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).addUniqueConstraint(this.constraintName, this.columns).execute()\n }\n\n toCode(): string {\n return `new AddUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class DropUniqueConstraintAction extends MigrationAction {\n table: string\n columns: string[]\n constraintName: string\n\n constructor(tableName: string, columns: string[]) {\n super()\n this.table = tableName\n this.columns = columns\n this.constraintName = generateUniqueConstraintName(tableName, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table].uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = state.tables[this.table].uniqueConstraints!.filter(\n (cols) => generateUniqueConstraintName(this.table, cols) !== this.constraintName,\n )\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()\n }\n\n toCode(): string {\n return `new DropUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n","export function areArrayEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n const sortedA = [...a].sort()\n const sortedB = [...b].sort()\n return sortedA.every((value, index) => value === sortedB[index])\n}\n","import { ColumnType } from 'gummy'\nimport { ColumnTypeStr, DatabaseState } from './types.mjs'\n\nexport function validateDatabaseState(state: DatabaseState): string[] {\n const errors: string[] = []\n\n const tables = state.tables\n for (const [tableName, tableState] of Object.entries(tables)) {\n // Collect primary keys\n const primaryKeys = []\n\n const columns = tableState.columns\n for (const [columnName, columnDef] of Object.entries(columns)) {\n // Check for primary keys\n if (columnDef.isPrimaryKey) {\n primaryKeys.push(columnName)\n // Primary key columns must be NOT NULL\n if (!columnDef.notNull) {\n errors.push(`Primary key column \"${columnName}\" in table \"${tableName}\" must be NOT NULL.`)\n }\n }\n\n // Check foreign key references\n if (columnDef.references) {\n const [referencedTable, referencedColumn] = columnDef.references.split('.')\n if (!state.tables[referencedTable]) {\n errors.push(\n `Referenced table \"${referencedTable}\" for foreign key on \"${tableName}.${columnName}\" does not exist.`,\n )\n } else if (!state.tables[referencedTable].columns[referencedColumn]) {\n errors.push(\n `Referenced column \"${referencedTable}.${referencedColumn}\" for foreign key on \"${tableName}.${columnName}\" does not exist.`,\n )\n } else {\n const foreignColumnDef = state.tables[referencedTable].columns[referencedColumn]\n // Check data type compatibility\n if (!areDataTypesCompatible(columnDef.dataType, foreignColumnDef.dataType)) {\n errors.push(\n `Data type incompatibility between foreign key column \"${tableName}.${columnName}\" (${ColumnType[columnDef.dataType]}) and referenced column \"${referencedTable}.${referencedColumn}\" (${ColumnType[foreignColumnDef.dataType]}).`,\n )\n }\n // Referenced column should be PRIMARY KEY or UNIQUE\n if (!foreignColumnDef.isPrimaryKey && !foreignColumnDef.isUnique) {\n errors.push(\n `Referenced column \"${referencedTable}.${referencedColumn}\" for foreign key on \"${tableName}.${columnName}\" is not PRIMARY KEY or UNIQUE.`,\n )\n }\n }\n }\n }\n }\n\n return errors\n}\n\nfunction areDataTypesCompatible(fkType: ColumnTypeStr, pkType: ColumnTypeStr): boolean {\n const compatibleTypes: { [key in ColumnTypeStr]?: ColumnTypeStr[] } = {\n [ColumnType.Integer]: [ColumnType.Integer, ColumnType.Serial, ColumnType.BigInteger, ColumnType.BigSerial],\n [ColumnType.BigInteger]: [ColumnType.BigInteger, ColumnType.BigSerial, ColumnType.Integer, ColumnType.Serial],\n [ColumnType.Serial]: [ColumnType.Integer, ColumnType.Serial],\n [ColumnType.BigSerial]: [ColumnType.BigInteger, ColumnType.BigSerial],\n [ColumnType.Varchar]: [ColumnType.Varchar, ColumnType.Text],\n [ColumnType.Text]: [ColumnType.Text, ColumnType.Varchar],\n [ColumnType.UUID]: [ColumnType.UUID],\n }\n\n if (fkType === pkType) {\n return true\n }\n\n if (compatibleTypes[fkType]?.includes(pkType)) {\n return true\n }\n\n return false\n}\n","import { loadConfig } from 'c12'\n\nexport type Config = {\n modelsDir?: string\n migrationsDir?: string\n}\n\nexport const getConfig = async () => {\n const loadedConfig = await loadConfig<Config>({\n name: 'gummy',\n rcFile: false,\n globalRc: false,\n dotenv: false,\n packageJson: false,\n })\n\n return loadedConfig.config\n}\n\nexport const defineConfig = (input: Config): Config => input\n"],"mappings":"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","names":["import_commander","import_commander","fs","path","import_glob","import_chalk","import_gummy","import_pkg_types","import_kysely","areArrayEqual","a","b","sortedA","sortedB","value","index","MigrationAction","mapColumnTypeToDataType","columnDef","buildCol","col","sortColumns","columns","generateForeignKeyConstraintName","tableName","columnName","generateUniqueConstraintName","sortedColumns","generateIndexName","CreateTableAction","MigrationAction","tableName","columns","options","state","column","db","builder","dataType","mapColumnTypeToDataType","col","buildCol","constraintName","generateUniqueConstraintName","index","CreateIndexAction","DropTableAction","ifExists","AddColumnAction","DropColumnAction","columnName","AlterColumnAction","changes","AddForeignKeyConstraintAction","referencedTable","referencedColumn","generateForeignKeyConstraintName","DropForeignKeyConstraintAction","table","generateIndexName","DropIndexAction","idx","areArrayEqual","AddUniqueConstraintAction","DropUniqueConstraintAction","cols","import_gummy","validateDatabaseState","state","errors","tables","tableName","tableState","primaryKeys","columns","columnName","columnDef","referencedTable","referencedColumn","foreignColumnDef","areDataTypesCompatible","fkType","pkType","compatibleTypes","import_c12","getConfig","import_meta","info","chalk","error","makeMigrations","config","getConfig","tableInstances","extractTableInstances","newState","buildNewState","validationErrors","validateDatabaseState","errMsg","pastMigrationActions","loadPastMigrationActions","oldState","reconstructOldState","stateDiff","compareStates","actions","downActions","generateMigrationActions","timestamp","generateMigrationFile","importTSFile","path","tsImport","tsRequire","modelsDir","files","fileName","m","exported","defaultExported","_isWithLength","column","extractColumns","table","columns","tableDefinition","_","foreignKeyConfigs","instance","tableName","migrationsDir","migrationFiles","allActions","file","migrationModule","migrationActions","state","action","newTableDef","oldTableDef","columnsWithoutFK","col","CreateTableAction","columnDef","referencedTable","referencedColumn","AddForeignKeyConstraintAction","columnName","newColumnDef","oldColumnDef","diff","generateColumnDefinitionDiff","AlterColumnAction","DropForeignKeyConstraintAction","columnWithoutFK","AddColumnAction","DropColumnAction","newIndexes","oldIndexes","addedIndexes","newIndex","oldIndex","areArrayEqual","removedIndexes","index","CreateIndexAction","DropIndexAction","newUniqueConstraints","oldUniqueConstraints","addedUniqueConstraints","newConstraint","oldConstraint","removedUniqueConstraints","AddUniqueConstraintAction","DropUniqueConstraintAction","DropTableAction","oldColumn","newColumn","hasChanges","oldDefault","newDefault","generateReverseColumnDefinitionDiff","changes","reverseDiff","tableDef","fkAction","indexAction","ucAction","fileNameTimestamp","filePath","importStatements","actionInstances","downActionInstances","migrationFileContent","makemigrations","makeMigrations","main","program","makemigrations"]}
package/dist/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{Command as ge}from"commander";import{Command as he}from"commander";import*as y from"fs";import*as R from"path";import{globSync as G}from"glob";import L from"chalk";import{isTable as B,Table as te}from"gummy";import{readPackageJSON as ne}from"pkg-types";import{sql as P}from"kysely";function p(n,e){if(n.length!==e.length)return!1;let t=[...n].sort(),i=[...e].sort();return t.every((a,s)=>a===i[s])}var d=class{};function J(n){switch(n.dataType){case"BigInteger":return"bigint";case"BigSerial":return"bigserial";case"Boolean":return"boolean";case"Date":return"date";case"Decimal":return"decimal";case"Email":case"Varchar":return n.length?`varchar(${n.length})`:"varchar";case"Integer":return"integer";case"Serial":return"serial";case"Text":return"text";case"Timestamp":return"timestamp";case"UUID":return"uuid";case"Json":return"json";default:throw new Error(`Unsupported ColumnType: ${n.dataType}`)}}function E(n,e){return e.isPrimaryKey&&(n=n.primaryKey()),e.notNull&&(n=n.notNull()),e.isUnique&&(n=n.unique()),e.hasDefault&&e.defaultValue!==void 0&&(typeof e.defaultValue=="string"&&e.defaultValue.startsWith("sql`")?n=n.defaultTo(P`${e.defaultValue}`):n=n.defaultTo(e.defaultValue)),n}function M(n){return[...n].sort()}function j(n,e){return`${n}_${e}_fk`}function $(n,e){let t=M(e);return`${n}_${t.join("_")}_unique`}function V(n,e){let t=M(e);return`${n}_${t.join("_")}_idx`}var D=class extends d{constructor(e,t,i){super(),this.table=e,this.columns=t,this.ifNotExists=i?.ifNotExists??!1,this.indexes=i?.indexes,this.uniqueConstraints=i?.uniqueConstraints}applyToState(e){e.tables[this.table]||(e.tables[this.table]={columns:{}});for(let t of this.columns)e.tables[this.table].columns[t.name]={...t};this.indexes&&(e.tables[this.table].indexes=this.indexes),this.uniqueConstraints&&(e.tables[this.table].uniqueConstraints=this.uniqueConstraints)}async execute(e){let t=e.schema.createTable(this.table);this.ifNotExists&&(t=t.ifNotExists());for(let i of this.columns){let a=J(i);t=t.addColumn(i.name,a,s=>E(s,i))}if(this.uniqueConstraints)for(let i of this.uniqueConstraints){let a=$(this.table,i);t=t.addUniqueConstraint(a,i)}if(await t.execute(),this.indexes)for(let i of this.indexes)await new q(i.table,i.columns).execute(e)}toCode(){return`new CreateTableAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)}, ${JSON.stringify({ifNotExists:this.ifNotExists,indexes:this.indexes,uniqueConstraints:this.uniqueConstraints})})`}},N=class extends d{constructor(e,t=!1){super(),this.table=e,this.ifExists=t}applyToState(e){delete e.tables[this.table]}async execute(e){let t=e.schema.dropTable(this.table);this.ifExists&&(t=t.ifExists()),await t.execute()}toCode(){return`new DropTableAction(${JSON.stringify(this.table)}, ${this.ifExists})`}},S=class extends d{constructor(e,t){super(),this.table=e,this.column=t}applyToState(e){e.tables[this.table]||(e.tables[this.table]={columns:{}}),e.tables[this.table].columns[this.column.name]={...this.column}}async execute(e){let t=J(this.column);await e.schema.alterTable(this.table).addColumn(this.column.name,t,i=>E(i,this.column)).execute()}toCode(){return`new AddColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.column)})`}},T=class extends d{constructor(e,t){super(),this.table=e,this.columnName=t}applyToState(e){e.tables[this.table]&&delete e.tables[this.table].columns[this.columnName]}async execute(e){await e.schema.alterTable(this.table).dropColumn(this.columnName).execute()}toCode(){return`new DropColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`}},A=class extends d{constructor(e,t,i){super(),this.table=e,this.columnName=t,this.changes=i}applyToState(e){if(e.tables[this.table]&&e.tables[this.table].columns[this.columnName]){let t=e.tables[this.table].columns[this.columnName];this.changes.dataType!==void 0&&(t.dataType=this.changes.dataType),this.changes.length!==void 0&&(t.length=this.changes.length),this.changes.isPrimaryKey!==void 0&&(t.isPrimaryKey=this.changes.isPrimaryKey),this.changes.notNull!==void 0&&(t.notNull=this.changes.notNull),this.changes.hasDefault!==void 0&&(t.hasDefault=this.changes.hasDefault,t.defaultValue=this.changes.defaultValue),this.changes.isUnique!==void 0&&(t.isUnique=this.changes.isUnique)}}async execute(e){if((this.changes.dataType!==void 0||this.changes.length!==void 0)&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>t.setDataType(J({dataType:this.changes.dataType,length:this.changes.length}))).execute(),this.changes.notNull!==void 0&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>this.changes.notNull?t.setNotNull():t.dropNotNull()).execute(),this.changes.hasDefault!==void 0&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>this.changes.hasDefault&&this.changes.defaultValue!==void 0?typeof this.changes.defaultValue=="string"&&this.changes.defaultValue.startsWith("sql`")?t.setDefault(P`${this.changes.defaultValue}`):t.setDefault(this.changes.defaultValue):t.dropDefault()).execute(),this.changes.isUnique!==void 0){let t=$(this.table,[this.columnName]);this.changes.isUnique?await e.schema.alterTable(this.table).addUniqueConstraint(t,[this.columnName]).execute():await e.schema.alterTable(this.table).dropConstraint(t).execute()}}toCode(){return`new AlterColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.changes)})`}},b=class extends d{constructor(e,t,i,a,s){super(),this.table=e,this.columnName=t,this.referencedTable=i,this.referencedColumn=a,this.constraintName=j(e,t),this.onDelete=s?.onDelete,this.onUpdate=s?.onUpdate}applyToState(e){e.tables[this.table]&&e.tables[this.table].columns[this.columnName]&&(e.tables[this.table].columns[this.columnName].references=`${this.referencedTable}.${this.referencedColumn}`,e.tables[this.table].columns[this.columnName].onDelete=this.onDelete,e.tables[this.table].columns[this.columnName].onUpdate=this.onUpdate)}async execute(e){let t=e.schema.alterTable(this.table).addForeignKeyConstraint(this.constraintName,[this.columnName],this.referencedTable,[this.referencedColumn]);this.onDelete&&(t=t.onDelete(this.onDelete)),this.onUpdate&&(t=t.onUpdate(this.onUpdate)),await t.execute()}toCode(){return`new AddForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.referencedTable)}, ${JSON.stringify(this.referencedColumn)}, ${JSON.stringify({onDelete:this.onDelete,onUpdate:this.onUpdate})})`}},w=class extends d{constructor(e,t){super(),this.table=e,this.columnName=t,this.constraintName=j(e,t)}applyToState(e){if(e.tables[this.table]){let t=e.tables[this.table].columns[this.columnName];t&&t.references&&(t.references=void 0,t.onDelete=void 0,t.onUpdate=void 0)}}async execute(e){await e.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()}toCode(){return`new DropForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`}},q=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.indexName=V(e,t)}applyToState(e){e.tables[this.table].indexes||(e.tables[this.table].indexes=[]),e.tables[this.table].indexes.push({table:this.table,columns:this.columns})}async execute(e){await e.schema.createIndex(this.indexName).on(this.table).columns(this.columns).execute()}toCode(){return`new CreateIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},U=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.indexName=V(e,t)}applyToState(e){e.tables[this.table].indexes&&(e.tables[this.table].indexes=e.tables[this.table].indexes.filter(t=>!p(t.columns,this.columns)))}async execute(e){await e.schema.dropIndex(this.indexName).execute()}toCode(){return`new DropIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},K=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.constraintName=$(e,t)}applyToState(e){e.tables[this.table].uniqueConstraints||(e.tables[this.table].uniqueConstraints=[]),e.tables[this.table].uniqueConstraints.push(this.columns)}async execute(e){await e.schema.alterTable(this.table).addUniqueConstraint(this.constraintName,this.columns).execute()}toCode(){return`new AddUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},v=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.constraintName=$(e,t)}applyToState(e){e.tables[this.table].uniqueConstraints&&(e.tables[this.table].uniqueConstraints=e.tables[this.table].uniqueConstraints.filter(t=>$(this.table,t)!==this.constraintName))}async execute(e){await e.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()}toCode(){return`new DropUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}};import{ColumnType as c}from"gummy";function k(n){let e=[],t=n.tables;for(let[i,a]of Object.entries(t)){let s=[],o=a.columns;for(let[u,f]of Object.entries(o))if(f.isPrimaryKey&&(s.push(u),f.notNull||e.push(`Primary key column "${u}" in table "${i}" must be NOT NULL.`)),f.references){let[m,h]=f.references.split(".");if(!n.tables[m])e.push(`Referenced table "${m}" for foreign key on "${i}.${u}" does not exist.`);else if(!n.tables[m].columns[h])e.push(`Referenced column "${m}.${h}" for foreign key on "${i}.${u}" does not exist.`);else{let g=n.tables[m].columns[h];Z(f.dataType,g.dataType)||e.push(`Data type incompatibility between foreign key column "${i}.${u}" (${c[f.dataType]}) and referenced column "${m}.${h}" (${c[g.dataType]}).`),!g.isPrimaryKey&&!g.isUnique&&e.push(`Referenced column "${m}.${h}" for foreign key on "${i}.${u}" is not PRIMARY KEY or UNIQUE.`)}}}return e}function Z(n,e){let t={[c.Integer]:[c.Integer,c.Serial,c.BigInteger,c.BigSerial],[c.BigInteger]:[c.BigInteger,c.BigSerial,c.Integer,c.Serial],[c.Serial]:[c.Integer,c.Serial],[c.BigSerial]:[c.BigInteger,c.BigSerial],[c.Varchar]:[c.Varchar,c.Text],[c.Text]:[c.Text,c.Varchar],[c.UUID]:[c.UUID]};return!!(n===e||t[n]?.includes(e))}import{loadConfig as ee}from"c12";var F=async()=>(await ee({name:"gummy",rcFile:!1,globalRc:!1,dotenv:!1,packageJson:!1})).config;var _=L.bold.blue,W=L.bold.red;async function H(){let n=await F(),e=await ie(n.modelsDir),t=oe(e),i=k(t);if(i.length>0){console.log(W("Validation Error(s) found in the database schema:"));for(let h of i)console.log(W(`- ${h}`));process.exit(1)}let a=await re(n.migrationsDir),s=le(a),o=ce(s,t);o.added.length===0&&o.removed.length===0&&o.modified.length===0&&o.foreignKeys.length===0&&(console.log(_("No changes detected. Migration file not generated.")),process.exit(0));let{actions:u,downActions:f}=de(o,t,s),m=new Date().toISOString().replace(/[-:T]/g,"").split(".")[0];me(u,f,m,n.migrationsDir),console.log(_("Migration script completed successfully."))}async function Y(n){if((await ne()).type==="module"){let{tsImport:i}=await import("tsx/esm/api");return await i(n,{parentURL:import.meta.url})}let{require:t}=await import("tsx/cjs/api");return await t(n,__filename)}async function ie(n="src/models"){let e=G(`${n}/**/*.{ts,js,mjs,mts}`,{absolute:!0}),t=[];for(let i of e)if(i.endsWith(".js")||i.endsWith(".ts")&&!i.endsWith(".d.ts")||i.endsWith(".mjs")||i.endsWith(".mts")&&!i.endsWith(".d.mts")){let a=await Y(i);Object.entries(a).forEach(([,o])=>{B(o)&&t.push(o)});let s=a.default;B(s)&&t.push(s)}return t}var se=n=>"length"in n&&typeof n.length=="number",ae=n=>{let e=te.columns(n);return{columns:Object.entries(e).reduce((t,[i,a])=>{let{foreignKeyConfigs:s}=a.config;return t[a.name]={name:a.name,dataType:a.columnType,length:se(a)?a.length:void 0,isPrimaryKey:a.primary,notNull:a.notNull,isUnique:a.isUnique,references:s!=null?`${s?.ref.table.tableName}.${s?.ref.name}`:void 0,onDelete:s?.actions.onDelete},t},{}),indexes:Object.entries(e).map(([,t])=>t).filter(t=>t.index).map(t=>({table:n.tableName,columns:[t.name]}))}};function oe(n){let e={tables:{}};return n.forEach(t=>{let i=t.tableName;e.tables[i]=ae(t)}),e}async function re(n="migrations"){if(!y.existsSync(n))return[];let e=G(`${n}/**/*.{ts,js,mjs,mts}`,{absolute:!0}),t=[];for(let i of e.sort()){let a=await Y(i);a.actions&&Array.isArray(a.actions)&&t.push(...a.actions)}return t}function le(n){let e={tables:{}};for(let t of n)t.applyToState(e);return e}function ce(n,e){let t={added:[],removed:[],modified:[],foreignKeys:[],indexes:{added:[],removed:[]},uniqueConstraints:{added:[],removed:[]}};for(let[i,a]of Object.entries(e.tables)){let s=n.tables[i];if(!s){let l=Object.values(a.columns).map(r=>({...r,references:void 0}));t.added.push(new D(i,l,{indexes:a.indexes,uniqueConstraints:a.uniqueConstraints}));for(let r of Object.values(a.columns))if(r.references){let[x,C]=r.references.split(".");t.foreignKeys.push(new b(i,r.name,x,C,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}continue}for(let[l,r]of Object.entries(a.columns)){let x=s.columns[l];if(x){let C=ue(x,r);if(C&&t.modified.push(new A(i,l,C)),x.references!==r.references&&(x.references&&t.foreignKeys.push(new w(i,l)),r.references)){let[O,I]=r.references.split(".");t.foreignKeys.push(new b(i,l,O,I,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}}else{let C={...r,references:void 0};if(t.added.push(new S(i,C)),r.references){let[O,I]=r.references.split(".");t.foreignKeys.push(new b(i,l,O,I,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}}}for(let l of Object.keys(s.columns))a.columns[l]||t.removed.push(new T(i,l));let o=a.indexes||[],u=s.indexes||[],f=o.filter(l=>!u.some(r=>p(r.columns,l.columns))),m=u.filter(l=>!o.some(r=>p(r.columns,l.columns)));for(let l of f)t.indexes.added.push(new q(i,l.columns));for(let l of m)t.indexes.removed.push(new U(i,l.columns));let h=a.uniqueConstraints||[],g=s.uniqueConstraints||[],z=h.filter(l=>!g.some(r=>p(r,l))),X=g.filter(l=>!h.some(r=>p(r,l)));for(let l of z)t.uniqueConstraints.added.push(new K(i,l));for(let l of X)t.uniqueConstraints.removed.push(new v(i,l))}for(let i of Object.keys(n.tables))e.tables[i]||t.removed.push(new N(i));return t}function ue(n,e){let t={},i=!1;n.dataType!==e.dataType&&(t.dataType=e.dataType,i=!0),n.length!==e.length&&(t.length=e.length,i=!0),n.isPrimaryKey!==e.isPrimaryKey&&(t.isPrimaryKey=e.isPrimaryKey,i=!0),n.notNull!==e.notNull&&(t.notNull=e.notNull,i=!0);let a=n.hasDefault?n.defaultValue:void 0,s=e.hasDefault?e.defaultValue:void 0;return a!==s&&(t.hasDefault=e.hasDefault,t.defaultValue=e.defaultValue,i=!0),n.isUnique!==e.isUnique&&(t.isUnique=e.isUnique,i=!0),i?t:null}function fe(n,e){let t={};return n.dataType!==void 0&&(t.dataType=e.dataType,t.length=e.length),n.isPrimaryKey!==void 0&&(t.isPrimaryKey=e.isPrimaryKey),n.notNull!==void 0&&(t.notNull=e.notNull),n.hasDefault!==void 0&&(t.hasDefault=e.hasDefault,t.defaultValue=e.defaultValue),n.isUnique!==void 0&&(t.isUnique=e.isUnique),t}function de(n,e,t){let i=[],a=[];for(let s of n.added)i.push(s),s instanceof D?a.unshift(new N(s.table)):s instanceof S&&a.unshift(new T(s.table,s.column.name));for(let s of n.removed)if(i.push(s),s instanceof N){let o=t.tables[s.table];a.unshift(new D(s.table,Object.values(o.columns),{indexes:o.indexes,uniqueConstraints:o.uniqueConstraints}))}else if(s instanceof T){let o=t.tables[s.table].columns[s.columnName];a.unshift(new S(s.table,o))}for(let s of n.modified)if(i.push(s),s instanceof A){let o=fe(s.changes,t.tables[s.table].columns[s.columnName]);a.unshift(new A(s.table,s.columnName,o))}for(let s of n.foreignKeys)if(i.push(s),s instanceof b)a.unshift(new w(s.table,s.columnName));else if(s instanceof w){let o=t.tables[s.table].columns[s.columnName];if(o.references){let[u,f]=o.references.split(".");a.unshift(new b(s.table,s.columnName,u,f,{onDelete:o.onDelete,onUpdate:o.onUpdate}))}}for(let s of n.indexes.added)i.push(s),a.unshift(new U(s.table,s.columns));for(let s of n.indexes.removed)i.push(s),a.unshift(new q(s.table,s.columns));for(let s of n.uniqueConstraints.added)i.push(s),a.unshift(new v(s.table,s.columns));for(let s of n.uniqueConstraints.removed)i.push(s),a.unshift(new K(s.table,s.columns));return{actions:i,downActions:a}}function me(n,e,t,i="migrations"){y.existsSync(i)||y.mkdirSync(i);let a=t.replace(/[-: ]/g,""),s=R.join(i,`${a}_migration.ts`),o=`import { Kysely } from 'kysely';
2
+ import{Command as ge}from"commander";import{Command as he}from"commander";import*as x from"fs";import*as R from"path";import{globSync as G}from"glob";import L from"chalk";import{isTable as B,Table as te}from"gummy";import{readPackageJSON as ne}from"pkg-types";import{sql as P}from"kysely";function y(n,e){if(n.length!==e.length)return!1;let t=[...n].sort(),i=[...e].sort();return t.every((a,s)=>a===i[s])}var d=class{};function J(n){switch(n.dataType){case"BigInteger":return"bigint";case"BigSerial":return"bigserial";case"Boolean":return"boolean";case"Date":return"date";case"Decimal":return"decimal";case"Email":case"Varchar":return n.length?`varchar(${n.length})`:"varchar";case"Integer":return"integer";case"Serial":return"serial";case"Text":return"text";case"Timestamp":return"timestamp";case"UUID":return"uuid";case"Json":return"json";default:throw new Error(`Unsupported ColumnType: ${n.dataType}`)}}function E(n,e){return e.isPrimaryKey&&(n=n.primaryKey()),e.notNull&&(n=n.notNull()),e.isUnique&&(n=n.unique()),e.hasDefault&&e.defaultValue!==void 0&&(typeof e.defaultValue=="string"&&e.defaultValue.startsWith("sql`")?n=n.defaultTo(P`${e.defaultValue}`):n=n.defaultTo(e.defaultValue)),n}function M(n){return[...n].sort()}function j(n,e){return`${n}_${e}_fk`}function $(n,e){let t=M(e);return`${n}_${t.join("_")}_unique`}function V(n,e){let t=M(e);return`${n}_${t.join("_")}_idx`}var D=class extends d{constructor(e,t,i){super(),this.table=e,this.columns=t,this.ifNotExists=i?.ifNotExists??!1,this.indexes=i?.indexes,this.uniqueConstraints=i?.uniqueConstraints}applyToState(e){e.tables[this.table]||(e.tables[this.table]={columns:{}});for(let t of this.columns)e.tables[this.table].columns[t.name]={...t};this.indexes&&(e.tables[this.table].indexes=this.indexes),this.uniqueConstraints&&(e.tables[this.table].uniqueConstraints=this.uniqueConstraints)}async execute(e){let t=e.schema.createTable(this.table);this.ifNotExists&&(t=t.ifNotExists());for(let i of this.columns){let a=J(i);t=t.addColumn(i.name,a,s=>E(s,i))}if(this.uniqueConstraints)for(let i of this.uniqueConstraints){let a=$(this.table,i);t=t.addUniqueConstraint(a,i)}if(await t.execute(),this.indexes)for(let i of this.indexes)await new q(i.table,i.columns).execute(e)}toCode(){return`new CreateTableAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)}, ${JSON.stringify({ifNotExists:this.ifNotExists,indexes:this.indexes,uniqueConstraints:this.uniqueConstraints})})`}},N=class extends d{constructor(e,t=!1){super(),this.table=e,this.ifExists=t}applyToState(e){delete e.tables[this.table]}async execute(e){let t=e.schema.dropTable(this.table);this.ifExists&&(t=t.ifExists()),await t.execute()}toCode(){return`new DropTableAction(${JSON.stringify(this.table)}, ${this.ifExists})`}},S=class extends d{constructor(e,t){super(),this.table=e,this.column=t}applyToState(e){e.tables[this.table]||(e.tables[this.table]={columns:{}}),e.tables[this.table].columns[this.column.name]={...this.column}}async execute(e){let t=J(this.column);await e.schema.alterTable(this.table).addColumn(this.column.name,t,i=>E(i,this.column)).execute()}toCode(){return`new AddColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.column)})`}},T=class extends d{constructor(e,t){super(),this.table=e,this.columnName=t}applyToState(e){e.tables[this.table]&&delete e.tables[this.table].columns[this.columnName]}async execute(e){await e.schema.alterTable(this.table).dropColumn(this.columnName).execute()}toCode(){return`new DropColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`}},A=class extends d{constructor(e,t,i){super(),this.table=e,this.columnName=t,this.changes=i}applyToState(e){if(e.tables[this.table]&&e.tables[this.table].columns[this.columnName]){let t=e.tables[this.table].columns[this.columnName];this.changes.dataType!==void 0&&(t.dataType=this.changes.dataType),this.changes.length!==void 0&&(t.length=this.changes.length),this.changes.isPrimaryKey!==void 0&&(t.isPrimaryKey=this.changes.isPrimaryKey),this.changes.notNull!==void 0&&(t.notNull=this.changes.notNull),this.changes.hasDefault!==void 0&&(t.hasDefault=this.changes.hasDefault,t.defaultValue=this.changes.defaultValue),this.changes.isUnique!==void 0&&(t.isUnique=this.changes.isUnique)}}async execute(e){if((this.changes.dataType!==void 0||this.changes.length!==void 0)&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>t.setDataType(J({dataType:this.changes.dataType,length:this.changes.length}))).execute(),this.changes.notNull!==void 0&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>this.changes.notNull?t.setNotNull():t.dropNotNull()).execute(),this.changes.hasDefault!==void 0&&await e.schema.alterTable(this.table).alterColumn(this.columnName,t=>this.changes.hasDefault&&this.changes.defaultValue!==void 0?typeof this.changes.defaultValue=="string"&&this.changes.defaultValue.startsWith("sql`")?t.setDefault(P`${this.changes.defaultValue}`):t.setDefault(this.changes.defaultValue):t.dropDefault()).execute(),this.changes.isUnique!==void 0){let t=$(this.table,[this.columnName]);this.changes.isUnique?await e.schema.alterTable(this.table).addUniqueConstraint(t,[this.columnName]).execute():await e.schema.alterTable(this.table).dropConstraint(t).execute()}}toCode(){return`new AlterColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.changes)})`}},b=class extends d{constructor(e,t,i,a,s){super(),this.table=e,this.columnName=t,this.referencedTable=i,this.referencedColumn=a,this.constraintName=j(e,t),this.onDelete=s?.onDelete,this.onUpdate=s?.onUpdate}applyToState(e){e.tables[this.table]&&e.tables[this.table].columns[this.columnName]&&(e.tables[this.table].columns[this.columnName].references=`${this.referencedTable}.${this.referencedColumn}`,e.tables[this.table].columns[this.columnName].onDelete=this.onDelete,e.tables[this.table].columns[this.columnName].onUpdate=this.onUpdate)}async execute(e){let t=e.schema.alterTable(this.table).addForeignKeyConstraint(this.constraintName,[this.columnName],this.referencedTable,[this.referencedColumn]);this.onDelete&&(t=t.onDelete(this.onDelete)),this.onUpdate&&(t=t.onUpdate(this.onUpdate)),await t.execute()}toCode(){return`new AddForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.referencedTable)}, ${JSON.stringify(this.referencedColumn)}, ${JSON.stringify({onDelete:this.onDelete,onUpdate:this.onUpdate})})`}},w=class extends d{constructor(e,t){super(),this.table=e,this.columnName=t,this.constraintName=j(e,t)}applyToState(e){if(e.tables[this.table]){let t=e.tables[this.table].columns[this.columnName];t&&t.references&&(t.references=void 0,t.onDelete=void 0,t.onUpdate=void 0)}}async execute(e){await e.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()}toCode(){return`new DropForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`}},q=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.indexName=V(e,t)}applyToState(e){e.tables[this.table].indexes||(e.tables[this.table].indexes=[]),e.tables[this.table].indexes.push({table:this.table,columns:this.columns})}async execute(e){await e.schema.createIndex(this.indexName).on(this.table).columns(this.columns).execute()}toCode(){return`new CreateIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},U=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.indexName=V(e,t)}applyToState(e){e.tables[this.table].indexes&&(e.tables[this.table].indexes=e.tables[this.table].indexes.filter(t=>!y(t.columns,this.columns)))}async execute(e){await e.schema.dropIndex(this.indexName).execute()}toCode(){return`new DropIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},K=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.constraintName=$(e,t)}applyToState(e){e.tables[this.table].uniqueConstraints||(e.tables[this.table].uniqueConstraints=[]),e.tables[this.table].uniqueConstraints.push(this.columns)}async execute(e){await e.schema.alterTable(this.table).addUniqueConstraint(this.constraintName,this.columns).execute()}toCode(){return`new AddUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}},v=class extends d{constructor(e,t){super(),this.table=e,this.columns=t,this.constraintName=$(e,t)}applyToState(e){e.tables[this.table].uniqueConstraints&&(e.tables[this.table].uniqueConstraints=e.tables[this.table].uniqueConstraints.filter(t=>$(this.table,t)!==this.constraintName))}async execute(e){await e.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()}toCode(){return`new DropUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`}};import{ColumnType as c}from"gummy";function k(n){let e=[],t=n.tables;for(let[i,a]of Object.entries(t)){let s=[],o=a.columns;for(let[u,f]of Object.entries(o))if(f.isPrimaryKey&&(s.push(u),f.notNull||e.push(`Primary key column "${u}" in table "${i}" must be NOT NULL.`)),f.references){let[m,h]=f.references.split(".");if(!n.tables[m])e.push(`Referenced table "${m}" for foreign key on "${i}.${u}" does not exist.`);else if(!n.tables[m].columns[h])e.push(`Referenced column "${m}.${h}" for foreign key on "${i}.${u}" does not exist.`);else{let g=n.tables[m].columns[h];Z(f.dataType,g.dataType)||e.push(`Data type incompatibility between foreign key column "${i}.${u}" (${c[f.dataType]}) and referenced column "${m}.${h}" (${c[g.dataType]}).`),!g.isPrimaryKey&&!g.isUnique&&e.push(`Referenced column "${m}.${h}" for foreign key on "${i}.${u}" is not PRIMARY KEY or UNIQUE.`)}}}return e}function Z(n,e){let t={[c.Integer]:[c.Integer,c.Serial,c.BigInteger,c.BigSerial],[c.BigInteger]:[c.BigInteger,c.BigSerial,c.Integer,c.Serial],[c.Serial]:[c.Integer,c.Serial],[c.BigSerial]:[c.BigInteger,c.BigSerial],[c.Varchar]:[c.Varchar,c.Text],[c.Text]:[c.Text,c.Varchar],[c.UUID]:[c.UUID]};return!!(n===e||t[n]?.includes(e))}import{loadConfig as ee}from"c12";var F=async()=>(await ee({name:"gummy",rcFile:!1,globalRc:!1,dotenv:!1,packageJson:!1})).config;var _=L.bold.blue,W=L.bold.red;async function H(){let n=await F(),e=await ie(n.modelsDir),t=oe(e),i=k(t);if(i.length>0){console.log(W("Validation Error(s) found in the database schema:"));for(let h of i)console.log(W(`- ${h}`));process.exit(1)}let a=await re(n.migrationsDir),s=le(a),o=ce(s,t);o.added.length===0&&o.removed.length===0&&o.modified.length===0&&o.foreignKeys.length===0&&(console.log(_("No changes detected. Migration file not generated.")),process.exit(0));let{actions:u,downActions:f}=de(o,t,s),m=new Date().toISOString().replace(/[-:T]/g,"").split(".")[0];me(u,f,m,n.migrationsDir),console.log(_("Migration script completed successfully."))}async function Y(n){if((await ne()).type==="module"){let{tsImport:i}=await import("tsx/esm/api");return await i(n,{parentURL:import.meta.url})}let{require:t}=await import("tsx/cjs/api");return await t(n,__filename)}async function ie(n="src/models"){let e=G(`${n}/**/*.{ts,js,mjs,mts}`,{absolute:!0}),t=[];for(let i of e)if(i.endsWith(".js")||i.endsWith(".ts")&&!i.endsWith(".d.ts")||i.endsWith(".mjs")||i.endsWith(".mts")&&!i.endsWith(".d.mts")){let a=await Y(i);Object.entries(a).forEach(([,o])=>{B(o)&&t.push(o)});let s=a.default;B(s)&&t.push(s)}return t}var se=n=>"length"in n&&typeof n.length=="number",ae=n=>{let e=te.columns(n);return{columns:Object.entries(e).reduce((t,[i,a])=>{let{foreignKeyConfigs:s}=a.config;return t[a.name]={name:a.name,dataType:a.columnType,length:se(a)?a.length:void 0,isPrimaryKey:a.primary,notNull:a.notNull,isUnique:a.isUnique,references:s!=null?`${s?.ref.table.tableName}.${s?.ref.name}`:void 0,onDelete:s?.actions.onDelete},t},{}),indexes:Object.entries(e).map(([,t])=>t).filter(t=>t.index).map(t=>({table:n.tableName,columns:[t.name]}))}};function oe(n){let e={tables:{}};return n.forEach(t=>{let i=t.tableName;e.tables[i]=ae(t)}),e}async function re(n="migrations"){if(!x.existsSync(n))return[];let e=G(`${n}/**/*.{ts,js,mjs,mts}`,{absolute:!0}),t=[];for(let i of e.sort()){let a=await Y(i);a.actions&&Array.isArray(a.actions)&&t.push(...a.actions)}return t}function le(n){let e={tables:{}};for(let t of n)t.applyToState(e);return e}function ce(n,e){let t={added:[],removed:[],modified:[],foreignKeys:[],indexes:{added:[],removed:[]},uniqueConstraints:{added:[],removed:[]}};for(let[i,a]of Object.entries(e.tables)){let s=n.tables[i];if(!s){let l=Object.values(a.columns).map(r=>({...r,references:void 0}));t.added.push(new D(i,l,{indexes:a.indexes,uniqueConstraints:a.uniqueConstraints}));for(let r of Object.values(a.columns))if(r.references){let[p,C]=r.references.split(".");t.foreignKeys.push(new b(i,r.name,p,C,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}continue}for(let[l,r]of Object.entries(a.columns)){let p=s.columns[l];if(p){let C=ue(p,r);if(C&&t.modified.push(new A(i,l,C)),(p.references!==r.references||p.onDelete!==r.onDelete)&&(p.references&&t.foreignKeys.push(new w(i,l)),r.references)){let[O,I]=r.references.split(".");t.foreignKeys.push(new b(i,l,O,I,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}}else{let C={...r,references:void 0};if(t.added.push(new S(i,C)),r.references){let[O,I]=r.references.split(".");t.foreignKeys.push(new b(i,l,O,I,{onDelete:r.onDelete,onUpdate:r.onUpdate}))}}}for(let l of Object.keys(s.columns))a.columns[l]||t.removed.push(new T(i,l));let o=a.indexes||[],u=s.indexes||[],f=o.filter(l=>!u.some(r=>y(r.columns,l.columns))),m=u.filter(l=>!o.some(r=>y(r.columns,l.columns)));for(let l of f)t.indexes.added.push(new q(i,l.columns));for(let l of m)t.indexes.removed.push(new U(i,l.columns));let h=a.uniqueConstraints||[],g=s.uniqueConstraints||[],z=h.filter(l=>!g.some(r=>y(r,l))),X=g.filter(l=>!h.some(r=>y(r,l)));for(let l of z)t.uniqueConstraints.added.push(new K(i,l));for(let l of X)t.uniqueConstraints.removed.push(new v(i,l))}for(let i of Object.keys(n.tables))e.tables[i]||t.removed.push(new N(i));return t}function ue(n,e){let t={},i=!1;n.dataType!==e.dataType&&(t.dataType=e.dataType,i=!0),n.length!==e.length&&(t.length=e.length,i=!0),n.isPrimaryKey!==e.isPrimaryKey&&(t.isPrimaryKey=e.isPrimaryKey,i=!0),n.notNull!==e.notNull&&(t.notNull=e.notNull,i=!0);let a=n.hasDefault?n.defaultValue:void 0,s=e.hasDefault?e.defaultValue:void 0;return a!==s&&(t.hasDefault=e.hasDefault,t.defaultValue=e.defaultValue,i=!0),n.isUnique!==e.isUnique&&(t.isUnique=e.isUnique,i=!0),i?t:null}function fe(n,e){let t={};return n.dataType!==void 0&&(t.dataType=e.dataType,t.length=e.length),n.isPrimaryKey!==void 0&&(t.isPrimaryKey=e.isPrimaryKey),n.notNull!==void 0&&(t.notNull=e.notNull),n.hasDefault!==void 0&&(t.hasDefault=e.hasDefault,t.defaultValue=e.defaultValue),n.isUnique!==void 0&&(t.isUnique=e.isUnique),t}function de(n,e,t){let i=[],a=[];for(let s of n.added)i.push(s),s instanceof D?a.unshift(new N(s.table)):s instanceof S&&a.unshift(new T(s.table,s.column.name));for(let s of n.removed)if(i.push(s),s instanceof N){let o=t.tables[s.table];a.unshift(new D(s.table,Object.values(o.columns),{indexes:o.indexes,uniqueConstraints:o.uniqueConstraints}))}else if(s instanceof T){let o=t.tables[s.table].columns[s.columnName];a.unshift(new S(s.table,o))}for(let s of n.modified)if(i.push(s),s instanceof A){let o=fe(s.changes,t.tables[s.table].columns[s.columnName]);a.unshift(new A(s.table,s.columnName,o))}for(let s of n.foreignKeys)if(i.push(s),s instanceof b)a.unshift(new w(s.table,s.columnName));else if(s instanceof w){let o=t.tables[s.table].columns[s.columnName];if(o.references){let[u,f]=o.references.split(".");a.unshift(new b(s.table,s.columnName,u,f,{onDelete:o.onDelete,onUpdate:o.onUpdate}))}}for(let s of n.indexes.added)i.push(s),a.unshift(new U(s.table,s.columns));for(let s of n.indexes.removed)i.push(s),a.unshift(new q(s.table,s.columns));for(let s of n.uniqueConstraints.added)i.push(s),a.unshift(new v(s.table,s.columns));for(let s of n.uniqueConstraints.removed)i.push(s),a.unshift(new K(s.table,s.columns));return{actions:i,downActions:a}}function me(n,e,t,i="migrations"){x.existsSync(i)||x.mkdirSync(i);let a=t.replace(/[-: ]/g,""),s=R.join(i,`${a}_migration.ts`),o=`import { Kysely } from 'kysely';
3
3
  import {
4
4
  MigrationAction,
5
5
  CreateTableAction,
@@ -38,5 +38,5 @@ export async function up(db: Kysely<any>): Promise<void> {
38
38
  export async function down(db: Kysely<any>): Promise<void> {
39
39
  await executeActions(downActions, db);
40
40
  }
41
- `;y.writeFileSync(s,h)}var Q=new he().name("makemigrations").action(async()=>{await H()});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function be(){let n=new ge;n.addCommand(Q),n.parse()}be();
41
+ `;x.writeFileSync(s,h)}var Q=new he().name("makemigrations").action(async()=>{await H()});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function be(){let n=new ge;n.addCommand(Q),n.parse()}be();
42
42
  //# sourceMappingURL=bin.js.map
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.mts","../src/commands/makemigrations.mts","../src/migrate/makemigrations.mts","../src/migrate/actions.mts","../src/utils.mts","../src/migrate/validate.mts","../src/config.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\n\nimport { makemigrations } from './commands/makemigrations.mjs'\n\nprocess.on('SIGINT', () => process.exit(0))\nprocess.on('SIGTERM', () => process.exit(0))\n\nasync function main() {\n const program = new Command()\n program.addCommand(makemigrations)\n program.parse()\n}\n\nmain()\n","import { Command } from 'commander'\nimport { makeMigrations } from '../migrate/makemigrations.mjs'\n\nexport const makemigrations = new Command().name('makemigrations').action(async () => {\n await makeMigrations()\n})\n","import * as fs from 'fs'\nimport * as path from 'path'\nimport { globSync } from 'glob'\nimport chalk from 'chalk'\nimport { Column, isTable, Table } from 'gummy'\nimport { readPackageJSON } from 'pkg-types'\n\nimport {\n AddColumnAction,\n AddForeignKeyConstraintAction,\n AddUniqueConstraintAction,\n AlterColumnAction,\n CreateIndexAction,\n CreateTableAction,\n DropColumnAction,\n DropForeignKeyConstraintAction,\n DropIndexAction,\n DropTableAction,\n DropUniqueConstraintAction,\n MigrationAction,\n} from './actions.mjs'\nimport { ColumnDefinition, ColumnDefinitionDiff, DatabaseState, TableState } from './types.mjs'\nimport { validateDatabaseState } from './validate.mjs'\nimport { areArrayEqual } from '../utils.mjs'\nimport { getConfig } from '../config.mjs'\n\nconst info = chalk.bold.blue\nconst error = chalk.bold.red\n\nexport async function makeMigrations() {\n const config = await getConfig()\n\n // Step 1: Extract all table instances from 'src/models/'\n const tableInstances = await extractTableInstances(config.modelsDir)\n\n // Step 2: Extract column definitions from each table instance\n const newState = buildNewState(tableInstances)\n\n // Step 3: Validate the newState before proceeding\n const validationErrors = validateDatabaseState(newState)\n if (validationErrors.length > 0) {\n console.log(error('Validation Error(s) found in the database schema:'))\n for (const errMsg of validationErrors) {\n console.log(error(`- ${errMsg}`))\n }\n process.exit(1)\n }\n\n // Step 4: Load past migration actions and reconstruct oldState\n const pastMigrationActions = await loadPastMigrationActions(config.migrationsDir)\n const oldState = reconstructOldState(pastMigrationActions)\n\n // Step 5: Compare oldState and newState to get stateDiff\n const stateDiff = compareStates(oldState, newState)\n if (\n stateDiff.added.length === 0 &&\n stateDiff.removed.length === 0 &&\n stateDiff.modified.length === 0 &&\n stateDiff.foreignKeys.length === 0\n ) {\n console.log(info('No changes detected. Migration file not generated.'))\n process.exit(0)\n }\n\n // Step 6: Generate migration actions for the current stateDiff\n const { actions, downActions } = generateMigrationActions(stateDiff, newState, oldState)\n\n // Step 7: Generate migration file based on migration actions\n const timestamp = new Date().toISOString().replace(/[-:T]/g, '').split('.')[0]\n generateMigrationFile(actions, downActions, timestamp, config.migrationsDir)\n\n console.log(info('Migration script completed successfully.'))\n}\n\ntype StateDiff = {\n added: MigrationAction[]\n removed: MigrationAction[]\n modified: MigrationAction[]\n foreignKeys: (AddForeignKeyConstraintAction | DropForeignKeyConstraintAction)[]\n indexes: {\n added: CreateIndexAction[]\n removed: DropIndexAction[]\n }\n uniqueConstraints: {\n added: AddUniqueConstraintAction[]\n removed: DropUniqueConstraintAction[]\n }\n}\n\nasync function importTSFile(path: string): Promise<any> {\n const localPackageJson = await readPackageJSON()\n if (localPackageJson.type === 'module') {\n const { tsImport } = await import('tsx/esm/api')\n\n // if (isWindows && !path.startsWith('file://')) {\n // path = `file://${path}`\n // }\n\n return await tsImport(path, { parentURL: import.meta.url })\n }\n\n const { require: tsRequire } = await import('tsx/cjs/api')\n\n return await tsRequire(path, __filename)\n}\n\nexport async function extractTableInstances(modelsDir = 'src/models'): Promise<Table[]> {\n const files = globSync(`${modelsDir}/**/*.{ts,js,mjs,mts}`, { absolute: true })\n const tableInstances: Table[] = []\n\n for (const fileName of files) {\n if (\n fileName.endsWith('.js') ||\n (fileName.endsWith('.ts') && !fileName.endsWith('.d.ts')) ||\n fileName.endsWith('.mjs') ||\n (fileName.endsWith('.mts') && !fileName.endsWith('.d.mts'))\n ) {\n const m = await importTSFile(fileName)\n\n Object.entries(m).forEach(([, exported]) => {\n if (isTable(exported)) {\n tableInstances.push(exported)\n }\n })\n\n const defaultExported = m.default\n if (isTable(defaultExported)) {\n tableInstances.push(defaultExported)\n }\n }\n }\n\n return tableInstances\n}\n\nconst _isWithLength = (column: Column): column is typeof column & { length: number } => {\n return 'length' in column && typeof column.length === 'number'\n}\n\nconst extractColumns = (table: Table): TableState => {\n const columns = Table.columns(table)\n return {\n columns: Object.entries(columns).reduce(\n (tableDefinition, [_, column]) => {\n const { foreignKeyConfigs } = column.config\n tableDefinition[column.name] = {\n name: column.name,\n dataType: column.columnType,\n length: _isWithLength(column) ? column.length : undefined,\n isPrimaryKey: column.primary,\n notNull: column.notNull,\n // TODO: We only support application side default value for now\n // hasDefault: column.hasDefault,\n // defaultValue: column.default,\n isUnique: column.isUnique,\n references:\n foreignKeyConfigs != null\n ? `${foreignKeyConfigs?.ref.table.tableName}.${foreignKeyConfigs?.ref.name}`\n : undefined,\n onDelete: foreignKeyConfigs?.actions.onDelete,\n }\n return tableDefinition\n },\n {} as { [columnName: string]: ColumnDefinition },\n ),\n indexes: Object.entries(columns)\n .map(([, column]) => column)\n .filter((column) => column.index)\n .map((column) => ({ table: table.tableName, columns: [column.name] })),\n // TODO: indexes\n // TODO: uniqueConstraints\n }\n}\n\nexport function buildNewState(tableInstances: Table[]): DatabaseState {\n const newState: DatabaseState = { tables: {} }\n tableInstances.forEach((instance) => {\n const tableName = instance.tableName\n newState.tables[tableName] = extractColumns(instance)\n })\n return newState\n}\n\nexport async function loadPastMigrationActions(migrationsDir = 'migrations'): Promise<MigrationAction[]> {\n if (!fs.existsSync(migrationsDir)) {\n return []\n }\n\n const migrationFiles = globSync(`${migrationsDir}/**/*.{ts,js,mjs,mts}`, { absolute: true })\n const allActions: MigrationAction[] = []\n for (const file of migrationFiles.sort()) {\n const migrationModule = await importTSFile(file)\n\n if (migrationModule.actions && Array.isArray(migrationModule.actions)) {\n allActions.push(...migrationModule.actions)\n }\n }\n\n return allActions\n}\n\nexport function reconstructOldState(migrationActions: MigrationAction[]): DatabaseState {\n const state: DatabaseState = { tables: {} }\n\n for (const action of migrationActions) {\n action.applyToState(state)\n }\n\n return state\n}\n\nfunction compareStates(oldState: DatabaseState, newState: DatabaseState): StateDiff {\n const stateDiff: StateDiff = {\n added: [],\n removed: [],\n modified: [],\n foreignKeys: [],\n indexes: { added: [], removed: [] },\n uniqueConstraints: { added: [], removed: [] },\n }\n\n // Compare tables\n for (const [tableName, newTableDef] of Object.entries(newState.tables)) {\n const oldTableDef = oldState.tables[tableName]\n\n if (!oldTableDef) {\n // New table\n const columnsWithoutFK = Object.values(newTableDef.columns).map((col) => ({\n ...col,\n references: undefined,\n }))\n stateDiff.added.push(\n new CreateTableAction(tableName, columnsWithoutFK, {\n indexes: newTableDef.indexes,\n uniqueConstraints: newTableDef.uniqueConstraints,\n }),\n )\n // Collect foreign key constraints\n for (const columnDef of Object.values(newTableDef.columns)) {\n if (columnDef.references) {\n const [referencedTable, referencedColumn] = columnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnDef.name, referencedTable, referencedColumn, {\n onDelete: columnDef.onDelete,\n onUpdate: columnDef.onUpdate,\n }),\n )\n }\n }\n continue\n }\n\n // Compare columns\n for (const [columnName, newColumnDef] of Object.entries(newTableDef.columns)) {\n const oldColumnDef = oldTableDef.columns[columnName]\n\n if (!oldColumnDef) {\n // New column\n const columnWithoutFK = { ...newColumnDef, references: undefined }\n stateDiff.added.push(new AddColumnAction(tableName, columnWithoutFK))\n // Collect foreign key constraints\n if (newColumnDef.references) {\n const [referencedTable, referencedColumn] = newColumnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnName, referencedTable, referencedColumn, {\n onDelete: newColumnDef.onDelete,\n onUpdate: newColumnDef.onUpdate,\n }),\n )\n }\n } else {\n // Generate column definition differences\n const diff = generateColumnDefinitionDiff(oldColumnDef, newColumnDef)\n if (diff) {\n stateDiff.modified.push(new AlterColumnAction(tableName, columnName, diff))\n }\n\n // Detect foreign key constraint changes\n if (oldColumnDef.references !== newColumnDef.references) {\n if (oldColumnDef.references) {\n // Drop old foreign key constraint\n stateDiff.foreignKeys.push(new DropForeignKeyConstraintAction(tableName, columnName))\n }\n if (newColumnDef.references) {\n // Add new foreign key constraint\n const [referencedTable, referencedColumn] = newColumnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnName, referencedTable, referencedColumn, {\n onDelete: newColumnDef.onDelete,\n onUpdate: newColumnDef.onUpdate,\n }),\n )\n }\n }\n }\n }\n\n // Check for removed columns\n for (const columnName of Object.keys(oldTableDef.columns)) {\n if (!newTableDef.columns[columnName]) {\n stateDiff.removed.push(new DropColumnAction(tableName, columnName))\n }\n }\n\n // Compare indexes\n const newIndexes = newTableDef.indexes || []\n const oldIndexes = oldTableDef.indexes || []\n\n const addedIndexes = newIndexes.filter(\n (newIndex) => !oldIndexes.some((oldIndex) => areArrayEqual(oldIndex.columns, newIndex.columns)),\n )\n\n const removedIndexes = oldIndexes.filter(\n (oldIndex) => !newIndexes.some((newIndex) => areArrayEqual(newIndex.columns, oldIndex.columns)),\n )\n\n for (const index of addedIndexes) {\n stateDiff.indexes.added.push(new CreateIndexAction(tableName, index.columns))\n }\n\n for (const index of removedIndexes) {\n stateDiff.indexes.removed.push(new DropIndexAction(tableName, index.columns))\n }\n\n // Compare unique constraints\n const newUniqueConstraints = newTableDef.uniqueConstraints || []\n const oldUniqueConstraints = oldTableDef.uniqueConstraints || []\n\n const addedUniqueConstraints = newUniqueConstraints.filter(\n (newConstraint) => !oldUniqueConstraints.some((oldConstraint) => areArrayEqual(oldConstraint, newConstraint)),\n )\n\n const removedUniqueConstraints = oldUniqueConstraints.filter(\n (oldConstraint) => !newUniqueConstraints.some((newConstraint) => areArrayEqual(newConstraint, oldConstraint)),\n )\n\n for (const columns of addedUniqueConstraints) {\n stateDiff.uniqueConstraints.added.push(new AddUniqueConstraintAction(tableName, columns))\n }\n\n for (const columns of removedUniqueConstraints) {\n stateDiff.uniqueConstraints.removed.push(new DropUniqueConstraintAction(tableName, columns))\n }\n }\n\n // Check for removed tables\n for (const tableName of Object.keys(oldState.tables)) {\n if (!newState.tables[tableName]) {\n stateDiff.removed.push(new DropTableAction(tableName))\n }\n }\n\n return stateDiff\n}\n\nfunction generateColumnDefinitionDiff(\n oldColumn: ColumnDefinition,\n newColumn: ColumnDefinition,\n): ColumnDefinitionDiff | null {\n const diff: ColumnDefinitionDiff = {}\n let hasChanges = false\n\n if (oldColumn.dataType !== newColumn.dataType) {\n diff.dataType = newColumn.dataType\n hasChanges = true\n }\n\n if (oldColumn.length !== newColumn.length) {\n diff.length = newColumn.length\n hasChanges = true\n }\n\n if (oldColumn.isPrimaryKey !== newColumn.isPrimaryKey) {\n diff.isPrimaryKey = newColumn.isPrimaryKey\n hasChanges = true\n }\n\n if (oldColumn.notNull !== newColumn.notNull) {\n diff.notNull = newColumn.notNull\n hasChanges = true\n }\n\n const oldDefault = oldColumn.hasDefault ? oldColumn.defaultValue : undefined\n const newDefault = newColumn.hasDefault ? newColumn.defaultValue : undefined\n if (oldDefault !== newDefault) {\n diff.hasDefault = newColumn.hasDefault\n diff.defaultValue = newColumn.defaultValue\n hasChanges = true\n }\n\n if (oldColumn.isUnique !== newColumn.isUnique) {\n diff.isUnique = newColumn.isUnique\n hasChanges = true\n }\n\n return hasChanges ? diff : null\n}\n\nfunction generateReverseColumnDefinitionDiff(\n changes: ColumnDefinitionDiff,\n oldColumn: ColumnDefinition,\n): ColumnDefinitionDiff {\n const reverseDiff: ColumnDefinitionDiff = {}\n\n if (changes.dataType !== undefined) {\n reverseDiff.dataType = oldColumn.dataType\n reverseDiff.length = oldColumn.length\n }\n\n if (changes.isPrimaryKey !== undefined) {\n reverseDiff.isPrimaryKey = oldColumn.isPrimaryKey\n }\n\n if (changes.notNull !== undefined) {\n reverseDiff.notNull = oldColumn.notNull\n }\n\n if (changes.hasDefault !== undefined) {\n reverseDiff.hasDefault = oldColumn.hasDefault\n reverseDiff.defaultValue = oldColumn.defaultValue\n }\n\n if (changes.isUnique !== undefined) {\n reverseDiff.isUnique = oldColumn.isUnique\n }\n\n return reverseDiff\n}\n\nfunction generateMigrationActions(stateDiff: StateDiff, newState: DatabaseState, oldState: DatabaseState) {\n const actions: MigrationAction[] = []\n const downActions: MigrationAction[] = []\n\n // Added actions\n for (const action of stateDiff.added) {\n actions.push(action)\n if (action instanceof CreateTableAction) {\n downActions.unshift(new DropTableAction(action.table))\n } else if (action instanceof AddColumnAction) {\n downActions.unshift(new DropColumnAction(action.table, action.column.name))\n }\n }\n\n // Removed actions\n for (const action of stateDiff.removed) {\n actions.push(action)\n if (action instanceof DropTableAction) {\n const tableDef = oldState.tables[action.table]\n downActions.unshift(\n new CreateTableAction(action.table, Object.values(tableDef.columns), {\n indexes: tableDef.indexes,\n uniqueConstraints: tableDef.uniqueConstraints,\n }),\n )\n } else if (action instanceof DropColumnAction) {\n const columnDef = oldState.tables[action.table].columns[action.columnName]\n downActions.unshift(new AddColumnAction(action.table, columnDef))\n }\n }\n\n // Modified actions\n for (const action of stateDiff.modified) {\n actions.push(action)\n // Generate reverse diff for down action\n if (action instanceof AlterColumnAction) {\n const reverseDiff = generateReverseColumnDefinitionDiff(\n action.changes,\n oldState.tables[action.table].columns[action.columnName],\n )\n downActions.unshift(new AlterColumnAction(action.table, action.columnName, reverseDiff))\n }\n }\n\n // Foreign key constraints\n for (const fkAction of stateDiff.foreignKeys) {\n actions.push(fkAction)\n if (fkAction instanceof AddForeignKeyConstraintAction) {\n downActions.unshift(new DropForeignKeyConstraintAction(fkAction.table, fkAction.columnName))\n } else if (fkAction instanceof DropForeignKeyConstraintAction) {\n const oldColumnDef = oldState.tables[fkAction.table].columns[fkAction.columnName]\n if (oldColumnDef.references) {\n const [referencedTable, referencedColumn] = oldColumnDef.references.split('.')\n downActions.unshift(\n new AddForeignKeyConstraintAction(fkAction.table, fkAction.columnName, referencedTable, referencedColumn, {\n onDelete: oldColumnDef.onDelete,\n onUpdate: oldColumnDef.onUpdate,\n }),\n )\n }\n }\n }\n\n // Indexes\n for (const indexAction of stateDiff.indexes.added) {\n actions.push(indexAction)\n downActions.unshift(new DropIndexAction(indexAction.table, indexAction.columns))\n }\n\n for (const indexAction of stateDiff.indexes.removed) {\n actions.push(indexAction)\n downActions.unshift(new CreateIndexAction(indexAction.table, indexAction.columns))\n }\n\n // Unique constraints\n for (const ucAction of stateDiff.uniqueConstraints.added) {\n actions.push(ucAction)\n downActions.unshift(new DropUniqueConstraintAction(ucAction.table, ucAction.columns))\n }\n\n for (const ucAction of stateDiff.uniqueConstraints.removed) {\n actions.push(ucAction)\n downActions.unshift(new AddUniqueConstraintAction(ucAction.table, ucAction.columns))\n }\n\n return { actions, downActions }\n}\n\nfunction generateMigrationFile(\n actions: MigrationAction[],\n downActions: MigrationAction[],\n timestamp: string,\n migrationsDir = 'migrations',\n) {\n if (!fs.existsSync(migrationsDir)) {\n fs.mkdirSync(migrationsDir)\n }\n\n const fileNameTimestamp = timestamp.replace(/[-: ]/g, '')\n const filePath = path.join(migrationsDir, `${fileNameTimestamp}_migration.ts`)\n\n const importStatements = `import { Kysely } from 'kysely';\nimport {\n MigrationAction,\n CreateTableAction,\n DropTableAction,\n AddColumnAction,\n DropColumnAction,\n AlterColumnAction,\n AddForeignKeyConstraintAction,\n DropForeignKeyConstraintAction,\n CreateIndexAction,\n DropIndexAction,\n AddUniqueConstraintAction,\n DropUniqueConstraintAction,\n executeActions\n} from 'gummy-cli';\n `\n\n const actionInstances = actions.map((action) => action.toCode())\n const downActionInstances = downActions.map((action) => action.toCode())\n\n const fileHeader = `// Generated by Gummy on ${timestamp}`\n\n const migrationFileContent = `${fileHeader}\n\n${importStatements}\n\nexport const actions: MigrationAction[] = [\n ${actionInstances.join(',\\n ')}\n];\n\nexport const downActions: MigrationAction[] = [\n ${downActionInstances.join(',\\n ')}\n];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function up(db: Kysely<any>): Promise<void> {\n await executeActions(actions, db);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function down(db: Kysely<any>): Promise<void> {\n await executeActions(downActions, db);\n}\n`\n\n fs.writeFileSync(filePath, migrationFileContent)\n}\n","import { Kysely, sql } from 'kysely'\nimport { ColumnDefinition, ColumnDefinitionDiff, DatabaseState, IndexDefinition } from './types.mjs'\nimport { ColumnDefinitionBuilder } from 'kysely'\nimport { areArrayEqual } from '../utils.mjs'\n\nexport abstract class MigrationAction {\n abstract applyToState(state: DatabaseState): void\n abstract execute(db: Kysely<any>): Promise<void>\n abstract toCode(): string\n}\n\n// Helper functions\nfunction mapColumnTypeToDataType(columnDef: ColumnDefinition): any {\n switch (columnDef.dataType) {\n case 'BigInteger':\n return 'bigint'\n case 'BigSerial':\n return 'bigserial'\n case 'Boolean':\n return 'boolean'\n case 'Date':\n return 'date'\n case 'Decimal':\n return 'decimal'\n case 'Email':\n case 'Varchar':\n return columnDef.length ? `varchar(${columnDef.length})` : 'varchar'\n case 'Integer':\n return 'integer'\n case 'Serial':\n return 'serial'\n case 'Text':\n return 'text'\n case 'Timestamp':\n return 'timestamp'\n case 'UUID':\n return 'uuid'\n case 'Json':\n return 'json'\n default:\n throw new Error(`Unsupported ColumnType: ${columnDef.dataType}`)\n }\n}\n\nfunction buildCol(col: ColumnDefinitionBuilder, columnDef: ColumnDefinition): ColumnDefinitionBuilder {\n if (columnDef.isPrimaryKey) {\n col = col.primaryKey()\n }\n if (columnDef.notNull) {\n col = col.notNull()\n }\n if (columnDef.isUnique) {\n col = col.unique()\n }\n if (columnDef.hasDefault && columnDef.defaultValue !== undefined) {\n if (typeof columnDef.defaultValue === 'string' && columnDef.defaultValue.startsWith('sql`')) {\n col = col.defaultTo(sql`${columnDef.defaultValue}`)\n } else {\n col = col.defaultTo(columnDef.defaultValue)\n }\n }\n // Foreign key handling is done separately\n return col\n}\n\n// Helper functions for constraint names\n\nfunction sortColumns(columns: string[]): string[] {\n return [...columns].sort()\n}\n\nexport function generateForeignKeyConstraintName(tableName: string, columnName: string): string {\n return `${tableName}_${columnName}_fk`\n}\n\nexport function generateUniqueConstraintName(tableName: string, columns: string[]): string {\n const sortedColumns = sortColumns(columns)\n return `${tableName}_${sortedColumns.join('_')}_unique`\n}\n\nexport function generateIndexName(tableName: string, columns: string[]): string {\n const sortedColumns = sortColumns(columns)\n return `${tableName}_${sortedColumns.join('_')}_idx`\n}\n\n// executeActions function\nexport async function executeActions(actions: MigrationAction[], db: Kysely<any>): Promise<void> {\n for (const action of actions) {\n await action.execute(db)\n }\n}\n\n// MigrationAction subclasses\n\nexport class CreateTableAction extends MigrationAction {\n table: string\n columns: ColumnDefinition[]\n ifNotExists: boolean\n indexes?: IndexDefinition[]\n uniqueConstraints?: string[][] // Array of column name arrays\n\n constructor(\n tableName: string,\n columns: ColumnDefinition[],\n options?: {\n ifNotExists?: boolean\n indexes?: IndexDefinition[]\n uniqueConstraints?: string[][]\n },\n ) {\n super()\n this.table = tableName\n this.columns = columns\n this.ifNotExists = options?.ifNotExists ?? false\n this.indexes = options?.indexes\n this.uniqueConstraints = options?.uniqueConstraints\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table]) {\n state.tables[this.table] = { columns: {} }\n }\n for (const column of this.columns) {\n state.tables[this.table].columns[column.name] = { ...column }\n }\n if (this.indexes) {\n state.tables[this.table].indexes = this.indexes\n }\n if (this.uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = this.uniqueConstraints\n }\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema.createTable(this.table)\n if (this.ifNotExists) {\n builder = builder.ifNotExists()\n }\n for (const column of this.columns) {\n const dataType = mapColumnTypeToDataType(column)\n builder = builder.addColumn(column.name, dataType, (col) => buildCol(col, column))\n }\n // Add unique constraints\n if (this.uniqueConstraints) {\n for (const columns of this.uniqueConstraints) {\n const constraintName = generateUniqueConstraintName(this.table, columns)\n builder = builder.addUniqueConstraint(constraintName, columns as any)\n }\n }\n await builder.execute()\n\n // Create indexes\n if (this.indexes) {\n for (const index of this.indexes) {\n await new CreateIndexAction(index.table, index.columns).execute(db)\n }\n }\n }\n\n toCode(): string {\n return `new CreateTableAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)}, ${JSON.stringify({\n ifNotExists: this.ifNotExists,\n indexes: this.indexes,\n uniqueConstraints: this.uniqueConstraints,\n })})`\n }\n}\n\nexport class DropTableAction extends MigrationAction {\n table: string\n ifExists: boolean\n\n constructor(tableName: string, ifExists: boolean = false) {\n super()\n this.table = tableName\n this.ifExists = ifExists\n }\n\n applyToState(state: DatabaseState): void {\n delete state.tables[this.table]\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema.dropTable(this.table)\n if (this.ifExists) {\n builder = builder.ifExists()\n }\n await builder.execute()\n }\n\n toCode(): string {\n return `new DropTableAction(${JSON.stringify(this.table)}, ${this.ifExists})`\n }\n}\n\nexport class AddColumnAction extends MigrationAction {\n table: string\n column: ColumnDefinition\n\n constructor(tableName: string, column: ColumnDefinition) {\n super()\n this.table = tableName\n this.column = column\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table]) {\n state.tables[this.table] = { columns: {} }\n }\n state.tables[this.table].columns[this.column.name] = { ...this.column }\n }\n\n async execute(db: Kysely<any>) {\n const dataType = mapColumnTypeToDataType(this.column)\n await db.schema\n .alterTable(this.table)\n .addColumn(this.column.name, dataType, (col) => buildCol(col, this.column))\n .execute()\n }\n\n toCode(): string {\n return `new AddColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.column)})`\n }\n}\n\n// 4. DropColumnAction\nexport class DropColumnAction extends MigrationAction {\n table: string\n columnName: string\n\n constructor(tableName: string, columnName: string) {\n super()\n this.table = tableName\n this.columnName = columnName\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table]) {\n delete state.tables[this.table].columns[this.columnName]\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropColumn(this.columnName).execute()\n }\n\n toCode(): string {\n return `new DropColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`\n }\n}\n\nexport class AlterColumnAction extends MigrationAction {\n table: string\n columnName: string\n changes: ColumnDefinitionDiff\n\n constructor(tableName: string, columnName: string, changes: ColumnDefinitionDiff) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.changes = changes\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table] && state.tables[this.table].columns[this.columnName]) {\n const column = state.tables[this.table].columns[this.columnName]\n if (this.changes.dataType !== undefined) {\n column.dataType = this.changes.dataType\n }\n if (this.changes.length !== undefined) {\n column.length = this.changes.length\n }\n if (this.changes.isPrimaryKey !== undefined) {\n column.isPrimaryKey = this.changes.isPrimaryKey\n }\n if (this.changes.notNull !== undefined) {\n column.notNull = this.changes.notNull\n }\n if (this.changes.hasDefault !== undefined) {\n column.hasDefault = this.changes.hasDefault\n column.defaultValue = this.changes.defaultValue\n }\n if (this.changes.isUnique !== undefined) {\n column.isUnique = this.changes.isUnique\n }\n }\n }\n\n async execute(db: Kysely<any>) {\n if (this.changes.dataType !== undefined || this.changes.length !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) =>\n col.setDataType(\n mapColumnTypeToDataType({\n dataType: this.changes.dataType,\n length: this.changes.length,\n } as ColumnDefinition),\n ),\n )\n .execute()\n }\n\n if (this.changes.notNull !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) => (this.changes.notNull ? col.setNotNull() : col.dropNotNull()))\n .execute()\n }\n\n if (this.changes.hasDefault !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) => {\n if (this.changes.hasDefault && this.changes.defaultValue !== undefined) {\n if (typeof this.changes.defaultValue === 'string' && this.changes.defaultValue.startsWith('sql`')) {\n return col.setDefault(sql`${this.changes.defaultValue}`)\n } else {\n return col.setDefault(this.changes.defaultValue)\n }\n } else {\n return col.dropDefault()\n }\n })\n .execute()\n }\n\n if (this.changes.isUnique !== undefined) {\n const constraintName = generateUniqueConstraintName(this.table, [this.columnName])\n if (this.changes.isUnique) {\n await db.schema.alterTable(this.table).addUniqueConstraint(constraintName, [this.columnName]).execute()\n } else {\n await db.schema.alterTable(this.table).dropConstraint(constraintName).execute()\n }\n }\n }\n\n toCode(): string {\n return `new AlterColumnAction(${JSON.stringify(\n this.table,\n )}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.changes)})`\n }\n}\n\nexport class AddForeignKeyConstraintAction extends MigrationAction {\n table: string\n columnName: string\n referencedTable: string\n referencedColumn: string\n constraintName: string\n onDelete?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n onUpdate?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n\n constructor(\n tableName: string,\n columnName: string,\n referencedTable: string,\n referencedColumn: string,\n options?: {\n onDelete?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n onUpdate?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n },\n ) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.referencedTable = referencedTable\n this.referencedColumn = referencedColumn\n this.constraintName = generateForeignKeyConstraintName(tableName, columnName)\n this.onDelete = options?.onDelete\n this.onUpdate = options?.onUpdate\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table] && state.tables[this.table].columns[this.columnName]) {\n state.tables[this.table].columns[this.columnName].references = `${this.referencedTable}.${this.referencedColumn}`\n state.tables[this.table].columns[this.columnName].onDelete = this.onDelete\n state.tables[this.table].columns[this.columnName].onUpdate = this.onUpdate\n }\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema\n .alterTable(this.table)\n .addForeignKeyConstraint(this.constraintName, [this.columnName], this.referencedTable, [this.referencedColumn])\n\n if (this.onDelete) {\n builder = builder.onDelete(this.onDelete)\n }\n if (this.onUpdate) {\n builder = builder.onUpdate(this.onUpdate)\n }\n\n await builder.execute()\n }\n\n toCode(): string {\n return `new AddForeignKeyConstraintAction(${JSON.stringify(\n this.table,\n )}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(\n this.referencedTable,\n )}, ${JSON.stringify(this.referencedColumn)}, ${JSON.stringify({\n onDelete: this.onDelete,\n onUpdate: this.onUpdate,\n })})`\n }\n}\n\nexport class DropForeignKeyConstraintAction extends MigrationAction {\n table: string\n columnName: string\n constraintName: string\n\n constructor(tableName: string, columnName: string) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.constraintName = generateForeignKeyConstraintName(tableName, columnName)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table]) {\n const column = state.tables[this.table].columns[this.columnName]\n if (column && column.references) {\n column.references = undefined\n column.onDelete = undefined\n column.onUpdate = undefined\n }\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()\n }\n\n toCode(): string {\n return `new DropForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`\n }\n}\n\nexport class CreateIndexAction extends MigrationAction {\n table: string\n columns: string[]\n indexName: string\n\n constructor(table: string, columns: string[]) {\n super()\n this.table = table\n this.columns = columns\n this.indexName = generateIndexName(table, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table].indexes) {\n state.tables[this.table].indexes = []\n }\n state.tables[this.table].indexes!.push({\n table: this.table,\n columns: this.columns,\n })\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.createIndex(this.indexName).on(this.table).columns(this.columns).execute()\n }\n\n toCode(): string {\n return `new CreateIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class DropIndexAction extends MigrationAction {\n table: string\n columns: string[]\n indexName: string\n\n constructor(table: string, columns: string[]) {\n super()\n this.table = table\n this.columns = columns\n this.indexName = generateIndexName(table, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table].indexes) {\n state.tables[this.table].indexes = state.tables[this.table].indexes!.filter(\n (idx) => !areArrayEqual(idx.columns, this.columns),\n )\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.dropIndex(this.indexName).execute()\n }\n\n toCode(): string {\n return `new DropIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class AddUniqueConstraintAction extends MigrationAction {\n table: string\n columns: string[]\n constraintName: string\n\n constructor(tableName: string, columns: string[]) {\n super()\n this.table = tableName\n this.columns = columns\n this.constraintName = generateUniqueConstraintName(tableName, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table].uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = []\n }\n state.tables[this.table].uniqueConstraints!.push(this.columns)\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).addUniqueConstraint(this.constraintName, this.columns).execute()\n }\n\n toCode(): string {\n return `new AddUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class DropUniqueConstraintAction extends MigrationAction {\n table: string\n columns: string[]\n constraintName: string\n\n constructor(tableName: string, columns: string[]) {\n super()\n this.table = tableName\n this.columns = columns\n this.constraintName = generateUniqueConstraintName(tableName, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table].uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = state.tables[this.table].uniqueConstraints!.filter(\n (cols) => generateUniqueConstraintName(this.table, cols) !== this.constraintName,\n )\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()\n }\n\n toCode(): string {\n return `new DropUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n","export function areArrayEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n const sortedA = [...a].sort()\n const sortedB = [...b].sort()\n return sortedA.every((value, index) => value === sortedB[index])\n}\n","import { ColumnType } from 'gummy'\nimport { ColumnTypeStr, DatabaseState } from './types.mjs'\n\nexport function validateDatabaseState(state: DatabaseState): string[] {\n const errors: string[] = []\n\n const tables = state.tables\n for (const [tableName, tableState] of Object.entries(tables)) {\n // Collect primary keys\n const primaryKeys = []\n\n const columns = tableState.columns\n for (const [columnName, columnDef] of Object.entries(columns)) {\n // Check for primary keys\n if (columnDef.isPrimaryKey) {\n primaryKeys.push(columnName)\n // Primary key columns must be NOT NULL\n if (!columnDef.notNull) {\n errors.push(`Primary key column \"${columnName}\" in table \"${tableName}\" must be NOT NULL.`)\n }\n }\n\n // Check foreign key references\n if (columnDef.references) {\n const [referencedTable, referencedColumn] = columnDef.references.split('.')\n if (!state.tables[referencedTable]) {\n errors.push(\n `Referenced table \"${referencedTable}\" for foreign key on \"${tableName}.${columnName}\" does not exist.`,\n )\n } else if (!state.tables[referencedTable].columns[referencedColumn]) {\n errors.push(\n `Referenced column \"${referencedTable}.${referencedColumn}\" for foreign key on \"${tableName}.${columnName}\" does not exist.`,\n )\n } else {\n const foreignColumnDef = state.tables[referencedTable].columns[referencedColumn]\n // Check data type compatibility\n if (!areDataTypesCompatible(columnDef.dataType, foreignColumnDef.dataType)) {\n errors.push(\n `Data type incompatibility between foreign key column \"${tableName}.${columnName}\" (${ColumnType[columnDef.dataType]}) and referenced column \"${referencedTable}.${referencedColumn}\" (${ColumnType[foreignColumnDef.dataType]}).`,\n )\n }\n // Referenced column should be PRIMARY KEY or UNIQUE\n if (!foreignColumnDef.isPrimaryKey && !foreignColumnDef.isUnique) {\n errors.push(\n `Referenced column \"${referencedTable}.${referencedColumn}\" for foreign key on \"${tableName}.${columnName}\" is not PRIMARY KEY or UNIQUE.`,\n )\n }\n }\n }\n }\n }\n\n return errors\n}\n\nfunction areDataTypesCompatible(fkType: ColumnTypeStr, pkType: ColumnTypeStr): boolean {\n const compatibleTypes: { [key in ColumnTypeStr]?: ColumnTypeStr[] } = {\n [ColumnType.Integer]: [ColumnType.Integer, ColumnType.Serial, ColumnType.BigInteger, ColumnType.BigSerial],\n [ColumnType.BigInteger]: [ColumnType.BigInteger, ColumnType.BigSerial, ColumnType.Integer, ColumnType.Serial],\n [ColumnType.Serial]: [ColumnType.Integer, ColumnType.Serial],\n [ColumnType.BigSerial]: [ColumnType.BigInteger, ColumnType.BigSerial],\n [ColumnType.Varchar]: [ColumnType.Varchar, ColumnType.Text],\n [ColumnType.Text]: [ColumnType.Text, ColumnType.Varchar],\n [ColumnType.UUID]: [ColumnType.UUID],\n }\n\n if (fkType === pkType) {\n return true\n }\n\n if (compatibleTypes[fkType]?.includes(pkType)) {\n return true\n }\n\n return false\n}\n","import { loadConfig } from 'c12'\n\nexport type Config = {\n modelsDir?: string\n migrationsDir?: string\n}\n\nexport const getConfig = async () => {\n const loadedConfig = await loadConfig<Config>({\n name: 'gummy',\n rcFile: false,\n globalRc: false,\n dotenv: false,\n packageJson: false,\n })\n\n return loadedConfig.config\n}\n\nexport const defineConfig = (input: Config): Config => input\n"],"mappings":"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","names":["Command","Command","fs","path","globSync","chalk","isTable","Table","readPackageJSON","sql","areArrayEqual","a","b","sortedA","sortedB","value","index","MigrationAction","mapColumnTypeToDataType","columnDef","buildCol","col","sql","sortColumns","columns","generateForeignKeyConstraintName","tableName","columnName","generateUniqueConstraintName","sortedColumns","generateIndexName","CreateTableAction","MigrationAction","tableName","columns","options","state","column","db","builder","dataType","mapColumnTypeToDataType","col","buildCol","constraintName","generateUniqueConstraintName","index","CreateIndexAction","DropTableAction","ifExists","AddColumnAction","DropColumnAction","columnName","AlterColumnAction","changes","sql","AddForeignKeyConstraintAction","referencedTable","referencedColumn","generateForeignKeyConstraintName","DropForeignKeyConstraintAction","table","generateIndexName","DropIndexAction","idx","areArrayEqual","AddUniqueConstraintAction","DropUniqueConstraintAction","cols","ColumnType","validateDatabaseState","state","errors","tables","tableName","tableState","primaryKeys","columns","columnName","columnDef","referencedTable","referencedColumn","foreignColumnDef","areDataTypesCompatible","fkType","pkType","compatibleTypes","loadConfig","getConfig","info","chalk","error","makeMigrations","config","getConfig","tableInstances","extractTableInstances","newState","buildNewState","validationErrors","validateDatabaseState","errMsg","pastMigrationActions","loadPastMigrationActions","oldState","reconstructOldState","stateDiff","compareStates","actions","downActions","generateMigrationActions","timestamp","generateMigrationFile","importTSFile","path","readPackageJSON","tsImport","tsRequire","modelsDir","files","globSync","fileName","m","exported","isTable","defaultExported","_isWithLength","column","extractColumns","table","columns","Table","tableDefinition","_","foreignKeyConfigs","instance","tableName","migrationsDir","migrationFiles","allActions","file","migrationModule","migrationActions","state","action","newTableDef","oldTableDef","columnsWithoutFK","col","CreateTableAction","columnDef","referencedTable","referencedColumn","AddForeignKeyConstraintAction","columnName","newColumnDef","oldColumnDef","diff","generateColumnDefinitionDiff","AlterColumnAction","DropForeignKeyConstraintAction","columnWithoutFK","AddColumnAction","DropColumnAction","newIndexes","oldIndexes","addedIndexes","newIndex","oldIndex","areArrayEqual","removedIndexes","index","CreateIndexAction","DropIndexAction","newUniqueConstraints","oldUniqueConstraints","addedUniqueConstraints","newConstraint","oldConstraint","removedUniqueConstraints","AddUniqueConstraintAction","DropUniqueConstraintAction","DropTableAction","oldColumn","newColumn","hasChanges","oldDefault","newDefault","generateReverseColumnDefinitionDiff","changes","reverseDiff","tableDef","fkAction","indexAction","ucAction","fileNameTimestamp","filePath","importStatements","actionInstances","downActionInstances","migrationFileContent","makemigrations","Command","makeMigrations","main","program","Command","makemigrations"]}
1
+ {"version":3,"sources":["../src/bin.mts","../src/commands/makemigrations.mts","../src/migrate/makemigrations.mts","../src/migrate/actions.mts","../src/utils.mts","../src/migrate/validate.mts","../src/config.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\n\nimport { makemigrations } from './commands/makemigrations.mjs'\n\nprocess.on('SIGINT', () => process.exit(0))\nprocess.on('SIGTERM', () => process.exit(0))\n\nasync function main() {\n const program = new Command()\n program.addCommand(makemigrations)\n program.parse()\n}\n\nmain()\n","import { Command } from 'commander'\nimport { makeMigrations } from '../migrate/makemigrations.mjs'\n\nexport const makemigrations = new Command().name('makemigrations').action(async () => {\n await makeMigrations()\n})\n","import * as fs from 'fs'\nimport * as path from 'path'\nimport { globSync } from 'glob'\nimport chalk from 'chalk'\nimport { Column, isTable, Table } from 'gummy'\nimport { readPackageJSON } from 'pkg-types'\n\nimport {\n AddColumnAction,\n AddForeignKeyConstraintAction,\n AddUniqueConstraintAction,\n AlterColumnAction,\n CreateIndexAction,\n CreateTableAction,\n DropColumnAction,\n DropForeignKeyConstraintAction,\n DropIndexAction,\n DropTableAction,\n DropUniqueConstraintAction,\n MigrationAction,\n} from './actions.mjs'\nimport { ColumnDefinition, ColumnDefinitionDiff, DatabaseState, TableState } from './types.mjs'\nimport { validateDatabaseState } from './validate.mjs'\nimport { areArrayEqual } from '../utils.mjs'\nimport { getConfig } from '../config.mjs'\n\nconst info = chalk.bold.blue\nconst error = chalk.bold.red\n\nexport async function makeMigrations() {\n const config = await getConfig()\n\n // Step 1: Extract all table instances from 'src/models/'\n const tableInstances = await extractTableInstances(config.modelsDir)\n\n // Step 2: Extract column definitions from each table instance\n const newState = buildNewState(tableInstances)\n\n // Step 3: Validate the newState before proceeding\n const validationErrors = validateDatabaseState(newState)\n if (validationErrors.length > 0) {\n console.log(error('Validation Error(s) found in the database schema:'))\n for (const errMsg of validationErrors) {\n console.log(error(`- ${errMsg}`))\n }\n process.exit(1)\n }\n\n // Step 4: Load past migration actions and reconstruct oldState\n const pastMigrationActions = await loadPastMigrationActions(config.migrationsDir)\n const oldState = reconstructOldState(pastMigrationActions)\n\n // Step 5: Compare oldState and newState to get stateDiff\n const stateDiff = compareStates(oldState, newState)\n if (\n stateDiff.added.length === 0 &&\n stateDiff.removed.length === 0 &&\n stateDiff.modified.length === 0 &&\n stateDiff.foreignKeys.length === 0\n ) {\n console.log(info('No changes detected. Migration file not generated.'))\n process.exit(0)\n }\n\n // Step 6: Generate migration actions for the current stateDiff\n const { actions, downActions } = generateMigrationActions(stateDiff, newState, oldState)\n\n // Step 7: Generate migration file based on migration actions\n const timestamp = new Date().toISOString().replace(/[-:T]/g, '').split('.')[0]\n generateMigrationFile(actions, downActions, timestamp, config.migrationsDir)\n\n console.log(info('Migration script completed successfully.'))\n}\n\ntype StateDiff = {\n added: MigrationAction[]\n removed: MigrationAction[]\n modified: MigrationAction[]\n foreignKeys: (AddForeignKeyConstraintAction | DropForeignKeyConstraintAction)[]\n indexes: {\n added: CreateIndexAction[]\n removed: DropIndexAction[]\n }\n uniqueConstraints: {\n added: AddUniqueConstraintAction[]\n removed: DropUniqueConstraintAction[]\n }\n}\n\nasync function importTSFile(path: string): Promise<any> {\n const localPackageJson = await readPackageJSON()\n if (localPackageJson.type === 'module') {\n const { tsImport } = await import('tsx/esm/api')\n\n // if (isWindows && !path.startsWith('file://')) {\n // path = `file://${path}`\n // }\n\n return await tsImport(path, { parentURL: import.meta.url })\n }\n\n const { require: tsRequire } = await import('tsx/cjs/api')\n\n return await tsRequire(path, __filename)\n}\n\nexport async function extractTableInstances(modelsDir = 'src/models'): Promise<Table[]> {\n const files = globSync(`${modelsDir}/**/*.{ts,js,mjs,mts}`, { absolute: true })\n const tableInstances: Table[] = []\n\n for (const fileName of files) {\n if (\n fileName.endsWith('.js') ||\n (fileName.endsWith('.ts') && !fileName.endsWith('.d.ts')) ||\n fileName.endsWith('.mjs') ||\n (fileName.endsWith('.mts') && !fileName.endsWith('.d.mts'))\n ) {\n const m = await importTSFile(fileName)\n\n Object.entries(m).forEach(([, exported]) => {\n if (isTable(exported)) {\n tableInstances.push(exported)\n }\n })\n\n const defaultExported = m.default\n if (isTable(defaultExported)) {\n tableInstances.push(defaultExported)\n }\n }\n }\n\n return tableInstances\n}\n\nconst _isWithLength = (column: Column): column is typeof column & { length: number } => {\n return 'length' in column && typeof column.length === 'number'\n}\n\nconst extractColumns = (table: Table): TableState => {\n const columns = Table.columns(table)\n return {\n columns: Object.entries(columns).reduce(\n (tableDefinition, [_, column]) => {\n const { foreignKeyConfigs } = column.config\n tableDefinition[column.name] = {\n name: column.name,\n dataType: column.columnType,\n length: _isWithLength(column) ? column.length : undefined,\n isPrimaryKey: column.primary,\n notNull: column.notNull,\n // TODO: We only support application side default value for now\n // hasDefault: column.hasDefault,\n // defaultValue: column.default,\n isUnique: column.isUnique,\n references:\n foreignKeyConfigs != null\n ? `${foreignKeyConfigs?.ref.table.tableName}.${foreignKeyConfigs?.ref.name}`\n : undefined,\n onDelete: foreignKeyConfigs?.actions.onDelete,\n }\n return tableDefinition\n },\n {} as { [columnName: string]: ColumnDefinition },\n ),\n indexes: Object.entries(columns)\n .map(([, column]) => column)\n .filter((column) => column.index)\n .map((column) => ({ table: table.tableName, columns: [column.name] })),\n // TODO: indexes\n // TODO: uniqueConstraints\n }\n}\n\nexport function buildNewState(tableInstances: Table[]): DatabaseState {\n const newState: DatabaseState = { tables: {} }\n tableInstances.forEach((instance) => {\n const tableName = instance.tableName\n newState.tables[tableName] = extractColumns(instance)\n })\n return newState\n}\n\nexport async function loadPastMigrationActions(migrationsDir = 'migrations'): Promise<MigrationAction[]> {\n if (!fs.existsSync(migrationsDir)) {\n return []\n }\n\n const migrationFiles = globSync(`${migrationsDir}/**/*.{ts,js,mjs,mts}`, { absolute: true })\n const allActions: MigrationAction[] = []\n for (const file of migrationFiles.sort()) {\n const migrationModule = await importTSFile(file)\n\n if (migrationModule.actions && Array.isArray(migrationModule.actions)) {\n allActions.push(...migrationModule.actions)\n }\n }\n\n return allActions\n}\n\nexport function reconstructOldState(migrationActions: MigrationAction[]): DatabaseState {\n const state: DatabaseState = { tables: {} }\n\n for (const action of migrationActions) {\n action.applyToState(state)\n }\n\n return state\n}\n\nfunction compareStates(oldState: DatabaseState, newState: DatabaseState): StateDiff {\n const stateDiff: StateDiff = {\n added: [],\n removed: [],\n modified: [],\n foreignKeys: [],\n indexes: { added: [], removed: [] },\n uniqueConstraints: { added: [], removed: [] },\n }\n\n // Compare tables\n for (const [tableName, newTableDef] of Object.entries(newState.tables)) {\n const oldTableDef = oldState.tables[tableName]\n\n if (!oldTableDef) {\n // New table\n const columnsWithoutFK = Object.values(newTableDef.columns).map((col) => ({\n ...col,\n references: undefined,\n }))\n stateDiff.added.push(\n new CreateTableAction(tableName, columnsWithoutFK, {\n indexes: newTableDef.indexes,\n uniqueConstraints: newTableDef.uniqueConstraints,\n }),\n )\n // Collect foreign key constraints\n for (const columnDef of Object.values(newTableDef.columns)) {\n if (columnDef.references) {\n const [referencedTable, referencedColumn] = columnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnDef.name, referencedTable, referencedColumn, {\n onDelete: columnDef.onDelete,\n onUpdate: columnDef.onUpdate,\n }),\n )\n }\n }\n continue\n }\n\n // Compare columns\n for (const [columnName, newColumnDef] of Object.entries(newTableDef.columns)) {\n const oldColumnDef = oldTableDef.columns[columnName]\n\n if (!oldColumnDef) {\n // New column\n const columnWithoutFK = { ...newColumnDef, references: undefined }\n stateDiff.added.push(new AddColumnAction(tableName, columnWithoutFK))\n // Collect foreign key constraints\n if (newColumnDef.references) {\n const [referencedTable, referencedColumn] = newColumnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnName, referencedTable, referencedColumn, {\n onDelete: newColumnDef.onDelete,\n onUpdate: newColumnDef.onUpdate,\n }),\n )\n }\n } else {\n // Generate column definition differences\n const diff = generateColumnDefinitionDiff(oldColumnDef, newColumnDef)\n if (diff) {\n stateDiff.modified.push(new AlterColumnAction(tableName, columnName, diff))\n }\n\n // Detect foreign key constraint changes\n if (oldColumnDef.references !== newColumnDef.references || oldColumnDef.onDelete !== newColumnDef.onDelete) {\n if (oldColumnDef.references) {\n // Drop old foreign key constraint\n stateDiff.foreignKeys.push(new DropForeignKeyConstraintAction(tableName, columnName))\n }\n if (newColumnDef.references) {\n // Add new foreign key constraint\n const [referencedTable, referencedColumn] = newColumnDef.references.split('.')\n stateDiff.foreignKeys.push(\n new AddForeignKeyConstraintAction(tableName, columnName, referencedTable, referencedColumn, {\n onDelete: newColumnDef.onDelete,\n onUpdate: newColumnDef.onUpdate,\n }),\n )\n }\n }\n }\n }\n\n // Check for removed columns\n for (const columnName of Object.keys(oldTableDef.columns)) {\n if (!newTableDef.columns[columnName]) {\n stateDiff.removed.push(new DropColumnAction(tableName, columnName))\n }\n }\n\n // Compare indexes\n const newIndexes = newTableDef.indexes || []\n const oldIndexes = oldTableDef.indexes || []\n\n const addedIndexes = newIndexes.filter(\n (newIndex) => !oldIndexes.some((oldIndex) => areArrayEqual(oldIndex.columns, newIndex.columns)),\n )\n\n const removedIndexes = oldIndexes.filter(\n (oldIndex) => !newIndexes.some((newIndex) => areArrayEqual(newIndex.columns, oldIndex.columns)),\n )\n\n for (const index of addedIndexes) {\n stateDiff.indexes.added.push(new CreateIndexAction(tableName, index.columns))\n }\n\n for (const index of removedIndexes) {\n stateDiff.indexes.removed.push(new DropIndexAction(tableName, index.columns))\n }\n\n // Compare unique constraints\n const newUniqueConstraints = newTableDef.uniqueConstraints || []\n const oldUniqueConstraints = oldTableDef.uniqueConstraints || []\n\n const addedUniqueConstraints = newUniqueConstraints.filter(\n (newConstraint) => !oldUniqueConstraints.some((oldConstraint) => areArrayEqual(oldConstraint, newConstraint)),\n )\n\n const removedUniqueConstraints = oldUniqueConstraints.filter(\n (oldConstraint) => !newUniqueConstraints.some((newConstraint) => areArrayEqual(newConstraint, oldConstraint)),\n )\n\n for (const columns of addedUniqueConstraints) {\n stateDiff.uniqueConstraints.added.push(new AddUniqueConstraintAction(tableName, columns))\n }\n\n for (const columns of removedUniqueConstraints) {\n stateDiff.uniqueConstraints.removed.push(new DropUniqueConstraintAction(tableName, columns))\n }\n }\n\n // Check for removed tables\n for (const tableName of Object.keys(oldState.tables)) {\n if (!newState.tables[tableName]) {\n stateDiff.removed.push(new DropTableAction(tableName))\n }\n }\n\n return stateDiff\n}\n\nfunction generateColumnDefinitionDiff(\n oldColumn: ColumnDefinition,\n newColumn: ColumnDefinition,\n): ColumnDefinitionDiff | null {\n const diff: ColumnDefinitionDiff = {}\n let hasChanges = false\n\n if (oldColumn.dataType !== newColumn.dataType) {\n diff.dataType = newColumn.dataType\n hasChanges = true\n }\n\n if (oldColumn.length !== newColumn.length) {\n diff.length = newColumn.length\n hasChanges = true\n }\n\n if (oldColumn.isPrimaryKey !== newColumn.isPrimaryKey) {\n diff.isPrimaryKey = newColumn.isPrimaryKey\n hasChanges = true\n }\n\n if (oldColumn.notNull !== newColumn.notNull) {\n diff.notNull = newColumn.notNull\n hasChanges = true\n }\n\n const oldDefault = oldColumn.hasDefault ? oldColumn.defaultValue : undefined\n const newDefault = newColumn.hasDefault ? newColumn.defaultValue : undefined\n if (oldDefault !== newDefault) {\n diff.hasDefault = newColumn.hasDefault\n diff.defaultValue = newColumn.defaultValue\n hasChanges = true\n }\n\n if (oldColumn.isUnique !== newColumn.isUnique) {\n diff.isUnique = newColumn.isUnique\n hasChanges = true\n }\n\n return hasChanges ? diff : null\n}\n\nfunction generateReverseColumnDefinitionDiff(\n changes: ColumnDefinitionDiff,\n oldColumn: ColumnDefinition,\n): ColumnDefinitionDiff {\n const reverseDiff: ColumnDefinitionDiff = {}\n\n if (changes.dataType !== undefined) {\n reverseDiff.dataType = oldColumn.dataType\n reverseDiff.length = oldColumn.length\n }\n\n if (changes.isPrimaryKey !== undefined) {\n reverseDiff.isPrimaryKey = oldColumn.isPrimaryKey\n }\n\n if (changes.notNull !== undefined) {\n reverseDiff.notNull = oldColumn.notNull\n }\n\n if (changes.hasDefault !== undefined) {\n reverseDiff.hasDefault = oldColumn.hasDefault\n reverseDiff.defaultValue = oldColumn.defaultValue\n }\n\n if (changes.isUnique !== undefined) {\n reverseDiff.isUnique = oldColumn.isUnique\n }\n\n return reverseDiff\n}\n\nfunction generateMigrationActions(stateDiff: StateDiff, newState: DatabaseState, oldState: DatabaseState) {\n const actions: MigrationAction[] = []\n const downActions: MigrationAction[] = []\n\n // Added actions\n for (const action of stateDiff.added) {\n actions.push(action)\n if (action instanceof CreateTableAction) {\n downActions.unshift(new DropTableAction(action.table))\n } else if (action instanceof AddColumnAction) {\n downActions.unshift(new DropColumnAction(action.table, action.column.name))\n }\n }\n\n // Removed actions\n for (const action of stateDiff.removed) {\n actions.push(action)\n if (action instanceof DropTableAction) {\n const tableDef = oldState.tables[action.table]\n downActions.unshift(\n new CreateTableAction(action.table, Object.values(tableDef.columns), {\n indexes: tableDef.indexes,\n uniqueConstraints: tableDef.uniqueConstraints,\n }),\n )\n } else if (action instanceof DropColumnAction) {\n const columnDef = oldState.tables[action.table].columns[action.columnName]\n downActions.unshift(new AddColumnAction(action.table, columnDef))\n }\n }\n\n // Modified actions\n for (const action of stateDiff.modified) {\n actions.push(action)\n // Generate reverse diff for down action\n if (action instanceof AlterColumnAction) {\n const reverseDiff = generateReverseColumnDefinitionDiff(\n action.changes,\n oldState.tables[action.table].columns[action.columnName],\n )\n downActions.unshift(new AlterColumnAction(action.table, action.columnName, reverseDiff))\n }\n }\n\n // Foreign key constraints\n for (const fkAction of stateDiff.foreignKeys) {\n actions.push(fkAction)\n if (fkAction instanceof AddForeignKeyConstraintAction) {\n downActions.unshift(new DropForeignKeyConstraintAction(fkAction.table, fkAction.columnName))\n } else if (fkAction instanceof DropForeignKeyConstraintAction) {\n const oldColumnDef = oldState.tables[fkAction.table].columns[fkAction.columnName]\n if (oldColumnDef.references) {\n const [referencedTable, referencedColumn] = oldColumnDef.references.split('.')\n downActions.unshift(\n new AddForeignKeyConstraintAction(fkAction.table, fkAction.columnName, referencedTable, referencedColumn, {\n onDelete: oldColumnDef.onDelete,\n onUpdate: oldColumnDef.onUpdate,\n }),\n )\n }\n }\n }\n\n // Indexes\n for (const indexAction of stateDiff.indexes.added) {\n actions.push(indexAction)\n downActions.unshift(new DropIndexAction(indexAction.table, indexAction.columns))\n }\n\n for (const indexAction of stateDiff.indexes.removed) {\n actions.push(indexAction)\n downActions.unshift(new CreateIndexAction(indexAction.table, indexAction.columns))\n }\n\n // Unique constraints\n for (const ucAction of stateDiff.uniqueConstraints.added) {\n actions.push(ucAction)\n downActions.unshift(new DropUniqueConstraintAction(ucAction.table, ucAction.columns))\n }\n\n for (const ucAction of stateDiff.uniqueConstraints.removed) {\n actions.push(ucAction)\n downActions.unshift(new AddUniqueConstraintAction(ucAction.table, ucAction.columns))\n }\n\n return { actions, downActions }\n}\n\nfunction generateMigrationFile(\n actions: MigrationAction[],\n downActions: MigrationAction[],\n timestamp: string,\n migrationsDir = 'migrations',\n) {\n if (!fs.existsSync(migrationsDir)) {\n fs.mkdirSync(migrationsDir)\n }\n\n const fileNameTimestamp = timestamp.replace(/[-: ]/g, '')\n const filePath = path.join(migrationsDir, `${fileNameTimestamp}_migration.ts`)\n\n const importStatements = `import { Kysely } from 'kysely';\nimport {\n MigrationAction,\n CreateTableAction,\n DropTableAction,\n AddColumnAction,\n DropColumnAction,\n AlterColumnAction,\n AddForeignKeyConstraintAction,\n DropForeignKeyConstraintAction,\n CreateIndexAction,\n DropIndexAction,\n AddUniqueConstraintAction,\n DropUniqueConstraintAction,\n executeActions\n} from 'gummy-cli';\n `\n\n const actionInstances = actions.map((action) => action.toCode())\n const downActionInstances = downActions.map((action) => action.toCode())\n\n const fileHeader = `// Generated by Gummy on ${timestamp}`\n\n const migrationFileContent = `${fileHeader}\n\n${importStatements}\n\nexport const actions: MigrationAction[] = [\n ${actionInstances.join(',\\n ')}\n];\n\nexport const downActions: MigrationAction[] = [\n ${downActionInstances.join(',\\n ')}\n];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function up(db: Kysely<any>): Promise<void> {\n await executeActions(actions, db);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function down(db: Kysely<any>): Promise<void> {\n await executeActions(downActions, db);\n}\n`\n\n fs.writeFileSync(filePath, migrationFileContent)\n}\n","import { Kysely, sql } from 'kysely'\nimport { ColumnDefinition, ColumnDefinitionDiff, DatabaseState, IndexDefinition } from './types.mjs'\nimport { ColumnDefinitionBuilder } from 'kysely'\nimport { areArrayEqual } from '../utils.mjs'\n\nexport abstract class MigrationAction {\n abstract applyToState(state: DatabaseState): void\n abstract execute(db: Kysely<any>): Promise<void>\n abstract toCode(): string\n}\n\n// Helper functions\nfunction mapColumnTypeToDataType(columnDef: ColumnDefinition): any {\n switch (columnDef.dataType) {\n case 'BigInteger':\n return 'bigint'\n case 'BigSerial':\n return 'bigserial'\n case 'Boolean':\n return 'boolean'\n case 'Date':\n return 'date'\n case 'Decimal':\n return 'decimal'\n case 'Email':\n case 'Varchar':\n return columnDef.length ? `varchar(${columnDef.length})` : 'varchar'\n case 'Integer':\n return 'integer'\n case 'Serial':\n return 'serial'\n case 'Text':\n return 'text'\n case 'Timestamp':\n return 'timestamp'\n case 'UUID':\n return 'uuid'\n case 'Json':\n return 'json'\n default:\n throw new Error(`Unsupported ColumnType: ${columnDef.dataType}`)\n }\n}\n\nfunction buildCol(col: ColumnDefinitionBuilder, columnDef: ColumnDefinition): ColumnDefinitionBuilder {\n if (columnDef.isPrimaryKey) {\n col = col.primaryKey()\n }\n if (columnDef.notNull) {\n col = col.notNull()\n }\n if (columnDef.isUnique) {\n col = col.unique()\n }\n if (columnDef.hasDefault && columnDef.defaultValue !== undefined) {\n if (typeof columnDef.defaultValue === 'string' && columnDef.defaultValue.startsWith('sql`')) {\n col = col.defaultTo(sql`${columnDef.defaultValue}`)\n } else {\n col = col.defaultTo(columnDef.defaultValue)\n }\n }\n // Foreign key handling is done separately\n return col\n}\n\n// Helper functions for constraint names\n\nfunction sortColumns(columns: string[]): string[] {\n return [...columns].sort()\n}\n\nexport function generateForeignKeyConstraintName(tableName: string, columnName: string): string {\n return `${tableName}_${columnName}_fk`\n}\n\nexport function generateUniqueConstraintName(tableName: string, columns: string[]): string {\n const sortedColumns = sortColumns(columns)\n return `${tableName}_${sortedColumns.join('_')}_unique`\n}\n\nexport function generateIndexName(tableName: string, columns: string[]): string {\n const sortedColumns = sortColumns(columns)\n return `${tableName}_${sortedColumns.join('_')}_idx`\n}\n\n// executeActions function\nexport async function executeActions(actions: MigrationAction[], db: Kysely<any>): Promise<void> {\n for (const action of actions) {\n await action.execute(db)\n }\n}\n\n// MigrationAction subclasses\n\nexport class CreateTableAction extends MigrationAction {\n table: string\n columns: ColumnDefinition[]\n ifNotExists: boolean\n indexes?: IndexDefinition[]\n uniqueConstraints?: string[][] // Array of column name arrays\n\n constructor(\n tableName: string,\n columns: ColumnDefinition[],\n options?: {\n ifNotExists?: boolean\n indexes?: IndexDefinition[]\n uniqueConstraints?: string[][]\n },\n ) {\n super()\n this.table = tableName\n this.columns = columns\n this.ifNotExists = options?.ifNotExists ?? false\n this.indexes = options?.indexes\n this.uniqueConstraints = options?.uniqueConstraints\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table]) {\n state.tables[this.table] = { columns: {} }\n }\n for (const column of this.columns) {\n state.tables[this.table].columns[column.name] = { ...column }\n }\n if (this.indexes) {\n state.tables[this.table].indexes = this.indexes\n }\n if (this.uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = this.uniqueConstraints\n }\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema.createTable(this.table)\n if (this.ifNotExists) {\n builder = builder.ifNotExists()\n }\n for (const column of this.columns) {\n const dataType = mapColumnTypeToDataType(column)\n builder = builder.addColumn(column.name, dataType, (col) => buildCol(col, column))\n }\n // Add unique constraints\n if (this.uniqueConstraints) {\n for (const columns of this.uniqueConstraints) {\n const constraintName = generateUniqueConstraintName(this.table, columns)\n builder = builder.addUniqueConstraint(constraintName, columns as any)\n }\n }\n await builder.execute()\n\n // Create indexes\n if (this.indexes) {\n for (const index of this.indexes) {\n await new CreateIndexAction(index.table, index.columns).execute(db)\n }\n }\n }\n\n toCode(): string {\n return `new CreateTableAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)}, ${JSON.stringify({\n ifNotExists: this.ifNotExists,\n indexes: this.indexes,\n uniqueConstraints: this.uniqueConstraints,\n })})`\n }\n}\n\nexport class DropTableAction extends MigrationAction {\n table: string\n ifExists: boolean\n\n constructor(tableName: string, ifExists: boolean = false) {\n super()\n this.table = tableName\n this.ifExists = ifExists\n }\n\n applyToState(state: DatabaseState): void {\n delete state.tables[this.table]\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema.dropTable(this.table)\n if (this.ifExists) {\n builder = builder.ifExists()\n }\n await builder.execute()\n }\n\n toCode(): string {\n return `new DropTableAction(${JSON.stringify(this.table)}, ${this.ifExists})`\n }\n}\n\nexport class AddColumnAction extends MigrationAction {\n table: string\n column: ColumnDefinition\n\n constructor(tableName: string, column: ColumnDefinition) {\n super()\n this.table = tableName\n this.column = column\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table]) {\n state.tables[this.table] = { columns: {} }\n }\n state.tables[this.table].columns[this.column.name] = { ...this.column }\n }\n\n async execute(db: Kysely<any>) {\n const dataType = mapColumnTypeToDataType(this.column)\n await db.schema\n .alterTable(this.table)\n .addColumn(this.column.name, dataType, (col) => buildCol(col, this.column))\n .execute()\n }\n\n toCode(): string {\n return `new AddColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.column)})`\n }\n}\n\n// 4. DropColumnAction\nexport class DropColumnAction extends MigrationAction {\n table: string\n columnName: string\n\n constructor(tableName: string, columnName: string) {\n super()\n this.table = tableName\n this.columnName = columnName\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table]) {\n delete state.tables[this.table].columns[this.columnName]\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropColumn(this.columnName).execute()\n }\n\n toCode(): string {\n return `new DropColumnAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`\n }\n}\n\nexport class AlterColumnAction extends MigrationAction {\n table: string\n columnName: string\n changes: ColumnDefinitionDiff\n\n constructor(tableName: string, columnName: string, changes: ColumnDefinitionDiff) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.changes = changes\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table] && state.tables[this.table].columns[this.columnName]) {\n const column = state.tables[this.table].columns[this.columnName]\n if (this.changes.dataType !== undefined) {\n column.dataType = this.changes.dataType\n }\n if (this.changes.length !== undefined) {\n column.length = this.changes.length\n }\n if (this.changes.isPrimaryKey !== undefined) {\n column.isPrimaryKey = this.changes.isPrimaryKey\n }\n if (this.changes.notNull !== undefined) {\n column.notNull = this.changes.notNull\n }\n if (this.changes.hasDefault !== undefined) {\n column.hasDefault = this.changes.hasDefault\n column.defaultValue = this.changes.defaultValue\n }\n if (this.changes.isUnique !== undefined) {\n column.isUnique = this.changes.isUnique\n }\n }\n }\n\n async execute(db: Kysely<any>) {\n if (this.changes.dataType !== undefined || this.changes.length !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) =>\n col.setDataType(\n mapColumnTypeToDataType({\n dataType: this.changes.dataType,\n length: this.changes.length,\n } as ColumnDefinition),\n ),\n )\n .execute()\n }\n\n if (this.changes.notNull !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) => (this.changes.notNull ? col.setNotNull() : col.dropNotNull()))\n .execute()\n }\n\n if (this.changes.hasDefault !== undefined) {\n await db.schema\n .alterTable(this.table)\n .alterColumn(this.columnName, (col) => {\n if (this.changes.hasDefault && this.changes.defaultValue !== undefined) {\n if (typeof this.changes.defaultValue === 'string' && this.changes.defaultValue.startsWith('sql`')) {\n return col.setDefault(sql`${this.changes.defaultValue}`)\n } else {\n return col.setDefault(this.changes.defaultValue)\n }\n } else {\n return col.dropDefault()\n }\n })\n .execute()\n }\n\n if (this.changes.isUnique !== undefined) {\n const constraintName = generateUniqueConstraintName(this.table, [this.columnName])\n if (this.changes.isUnique) {\n await db.schema.alterTable(this.table).addUniqueConstraint(constraintName, [this.columnName]).execute()\n } else {\n await db.schema.alterTable(this.table).dropConstraint(constraintName).execute()\n }\n }\n }\n\n toCode(): string {\n return `new AlterColumnAction(${JSON.stringify(\n this.table,\n )}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(this.changes)})`\n }\n}\n\nexport class AddForeignKeyConstraintAction extends MigrationAction {\n table: string\n columnName: string\n referencedTable: string\n referencedColumn: string\n constraintName: string\n onDelete?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n onUpdate?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n\n constructor(\n tableName: string,\n columnName: string,\n referencedTable: string,\n referencedColumn: string,\n options?: {\n onDelete?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n onUpdate?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default'\n },\n ) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.referencedTable = referencedTable\n this.referencedColumn = referencedColumn\n this.constraintName = generateForeignKeyConstraintName(tableName, columnName)\n this.onDelete = options?.onDelete\n this.onUpdate = options?.onUpdate\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table] && state.tables[this.table].columns[this.columnName]) {\n state.tables[this.table].columns[this.columnName].references = `${this.referencedTable}.${this.referencedColumn}`\n state.tables[this.table].columns[this.columnName].onDelete = this.onDelete\n state.tables[this.table].columns[this.columnName].onUpdate = this.onUpdate\n }\n }\n\n async execute(db: Kysely<any>) {\n let builder = db.schema\n .alterTable(this.table)\n .addForeignKeyConstraint(this.constraintName, [this.columnName], this.referencedTable, [this.referencedColumn])\n\n if (this.onDelete) {\n builder = builder.onDelete(this.onDelete)\n }\n if (this.onUpdate) {\n builder = builder.onUpdate(this.onUpdate)\n }\n\n await builder.execute()\n }\n\n toCode(): string {\n return `new AddForeignKeyConstraintAction(${JSON.stringify(\n this.table,\n )}, ${JSON.stringify(this.columnName)}, ${JSON.stringify(\n this.referencedTable,\n )}, ${JSON.stringify(this.referencedColumn)}, ${JSON.stringify({\n onDelete: this.onDelete,\n onUpdate: this.onUpdate,\n })})`\n }\n}\n\nexport class DropForeignKeyConstraintAction extends MigrationAction {\n table: string\n columnName: string\n constraintName: string\n\n constructor(tableName: string, columnName: string) {\n super()\n this.table = tableName\n this.columnName = columnName\n this.constraintName = generateForeignKeyConstraintName(tableName, columnName)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table]) {\n const column = state.tables[this.table].columns[this.columnName]\n if (column && column.references) {\n column.references = undefined\n column.onDelete = undefined\n column.onUpdate = undefined\n }\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()\n }\n\n toCode(): string {\n return `new DropForeignKeyConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columnName)})`\n }\n}\n\nexport class CreateIndexAction extends MigrationAction {\n table: string\n columns: string[]\n indexName: string\n\n constructor(table: string, columns: string[]) {\n super()\n this.table = table\n this.columns = columns\n this.indexName = generateIndexName(table, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table].indexes) {\n state.tables[this.table].indexes = []\n }\n state.tables[this.table].indexes!.push({\n table: this.table,\n columns: this.columns,\n })\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.createIndex(this.indexName).on(this.table).columns(this.columns).execute()\n }\n\n toCode(): string {\n return `new CreateIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class DropIndexAction extends MigrationAction {\n table: string\n columns: string[]\n indexName: string\n\n constructor(table: string, columns: string[]) {\n super()\n this.table = table\n this.columns = columns\n this.indexName = generateIndexName(table, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table].indexes) {\n state.tables[this.table].indexes = state.tables[this.table].indexes!.filter(\n (idx) => !areArrayEqual(idx.columns, this.columns),\n )\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.dropIndex(this.indexName).execute()\n }\n\n toCode(): string {\n return `new DropIndexAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class AddUniqueConstraintAction extends MigrationAction {\n table: string\n columns: string[]\n constraintName: string\n\n constructor(tableName: string, columns: string[]) {\n super()\n this.table = tableName\n this.columns = columns\n this.constraintName = generateUniqueConstraintName(tableName, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (!state.tables[this.table].uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = []\n }\n state.tables[this.table].uniqueConstraints!.push(this.columns)\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).addUniqueConstraint(this.constraintName, this.columns).execute()\n }\n\n toCode(): string {\n return `new AddUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n\nexport class DropUniqueConstraintAction extends MigrationAction {\n table: string\n columns: string[]\n constraintName: string\n\n constructor(tableName: string, columns: string[]) {\n super()\n this.table = tableName\n this.columns = columns\n this.constraintName = generateUniqueConstraintName(tableName, columns)\n }\n\n applyToState(state: DatabaseState): void {\n if (state.tables[this.table].uniqueConstraints) {\n state.tables[this.table].uniqueConstraints = state.tables[this.table].uniqueConstraints!.filter(\n (cols) => generateUniqueConstraintName(this.table, cols) !== this.constraintName,\n )\n }\n }\n\n async execute(db: Kysely<any>) {\n await db.schema.alterTable(this.table).dropConstraint(this.constraintName).execute()\n }\n\n toCode(): string {\n return `new DropUniqueConstraintAction(${JSON.stringify(this.table)}, ${JSON.stringify(this.columns)})`\n }\n}\n","export function areArrayEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n const sortedA = [...a].sort()\n const sortedB = [...b].sort()\n return sortedA.every((value, index) => value === sortedB[index])\n}\n","import { ColumnType } from 'gummy'\nimport { ColumnTypeStr, DatabaseState } from './types.mjs'\n\nexport function validateDatabaseState(state: DatabaseState): string[] {\n const errors: string[] = []\n\n const tables = state.tables\n for (const [tableName, tableState] of Object.entries(tables)) {\n // Collect primary keys\n const primaryKeys = []\n\n const columns = tableState.columns\n for (const [columnName, columnDef] of Object.entries(columns)) {\n // Check for primary keys\n if (columnDef.isPrimaryKey) {\n primaryKeys.push(columnName)\n // Primary key columns must be NOT NULL\n if (!columnDef.notNull) {\n errors.push(`Primary key column \"${columnName}\" in table \"${tableName}\" must be NOT NULL.`)\n }\n }\n\n // Check foreign key references\n if (columnDef.references) {\n const [referencedTable, referencedColumn] = columnDef.references.split('.')\n if (!state.tables[referencedTable]) {\n errors.push(\n `Referenced table \"${referencedTable}\" for foreign key on \"${tableName}.${columnName}\" does not exist.`,\n )\n } else if (!state.tables[referencedTable].columns[referencedColumn]) {\n errors.push(\n `Referenced column \"${referencedTable}.${referencedColumn}\" for foreign key on \"${tableName}.${columnName}\" does not exist.`,\n )\n } else {\n const foreignColumnDef = state.tables[referencedTable].columns[referencedColumn]\n // Check data type compatibility\n if (!areDataTypesCompatible(columnDef.dataType, foreignColumnDef.dataType)) {\n errors.push(\n `Data type incompatibility between foreign key column \"${tableName}.${columnName}\" (${ColumnType[columnDef.dataType]}) and referenced column \"${referencedTable}.${referencedColumn}\" (${ColumnType[foreignColumnDef.dataType]}).`,\n )\n }\n // Referenced column should be PRIMARY KEY or UNIQUE\n if (!foreignColumnDef.isPrimaryKey && !foreignColumnDef.isUnique) {\n errors.push(\n `Referenced column \"${referencedTable}.${referencedColumn}\" for foreign key on \"${tableName}.${columnName}\" is not PRIMARY KEY or UNIQUE.`,\n )\n }\n }\n }\n }\n }\n\n return errors\n}\n\nfunction areDataTypesCompatible(fkType: ColumnTypeStr, pkType: ColumnTypeStr): boolean {\n const compatibleTypes: { [key in ColumnTypeStr]?: ColumnTypeStr[] } = {\n [ColumnType.Integer]: [ColumnType.Integer, ColumnType.Serial, ColumnType.BigInteger, ColumnType.BigSerial],\n [ColumnType.BigInteger]: [ColumnType.BigInteger, ColumnType.BigSerial, ColumnType.Integer, ColumnType.Serial],\n [ColumnType.Serial]: [ColumnType.Integer, ColumnType.Serial],\n [ColumnType.BigSerial]: [ColumnType.BigInteger, ColumnType.BigSerial],\n [ColumnType.Varchar]: [ColumnType.Varchar, ColumnType.Text],\n [ColumnType.Text]: [ColumnType.Text, ColumnType.Varchar],\n [ColumnType.UUID]: [ColumnType.UUID],\n }\n\n if (fkType === pkType) {\n return true\n }\n\n if (compatibleTypes[fkType]?.includes(pkType)) {\n return true\n }\n\n return false\n}\n","import { loadConfig } from 'c12'\n\nexport type Config = {\n modelsDir?: string\n migrationsDir?: string\n}\n\nexport const getConfig = async () => {\n const loadedConfig = await loadConfig<Config>({\n name: 'gummy',\n rcFile: false,\n globalRc: false,\n dotenv: false,\n packageJson: false,\n })\n\n return loadedConfig.config\n}\n\nexport const defineConfig = (input: Config): Config => input\n"],"mappings":"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","names":["Command","Command","fs","path","globSync","chalk","isTable","Table","readPackageJSON","sql","areArrayEqual","a","b","sortedA","sortedB","value","index","MigrationAction","mapColumnTypeToDataType","columnDef","buildCol","col","sql","sortColumns","columns","generateForeignKeyConstraintName","tableName","columnName","generateUniqueConstraintName","sortedColumns","generateIndexName","CreateTableAction","MigrationAction","tableName","columns","options","state","column","db","builder","dataType","mapColumnTypeToDataType","col","buildCol","constraintName","generateUniqueConstraintName","index","CreateIndexAction","DropTableAction","ifExists","AddColumnAction","DropColumnAction","columnName","AlterColumnAction","changes","sql","AddForeignKeyConstraintAction","referencedTable","referencedColumn","generateForeignKeyConstraintName","DropForeignKeyConstraintAction","table","generateIndexName","DropIndexAction","idx","areArrayEqual","AddUniqueConstraintAction","DropUniqueConstraintAction","cols","ColumnType","validateDatabaseState","state","errors","tables","tableName","tableState","primaryKeys","columns","columnName","columnDef","referencedTable","referencedColumn","foreignColumnDef","areDataTypesCompatible","fkType","pkType","compatibleTypes","loadConfig","getConfig","info","chalk","error","makeMigrations","config","getConfig","tableInstances","extractTableInstances","newState","buildNewState","validationErrors","validateDatabaseState","errMsg","pastMigrationActions","loadPastMigrationActions","oldState","reconstructOldState","stateDiff","compareStates","actions","downActions","generateMigrationActions","timestamp","generateMigrationFile","importTSFile","path","readPackageJSON","tsImport","tsRequire","modelsDir","files","globSync","fileName","m","exported","isTable","defaultExported","_isWithLength","column","extractColumns","table","columns","Table","tableDefinition","_","foreignKeyConfigs","instance","tableName","migrationsDir","migrationFiles","allActions","file","migrationModule","migrationActions","state","action","newTableDef","oldTableDef","columnsWithoutFK","col","CreateTableAction","columnDef","referencedTable","referencedColumn","AddForeignKeyConstraintAction","columnName","newColumnDef","oldColumnDef","diff","generateColumnDefinitionDiff","AlterColumnAction","DropForeignKeyConstraintAction","columnWithoutFK","AddColumnAction","DropColumnAction","newIndexes","oldIndexes","addedIndexes","newIndex","oldIndex","areArrayEqual","removedIndexes","index","CreateIndexAction","DropIndexAction","newUniqueConstraints","oldUniqueConstraints","addedUniqueConstraints","newConstraint","oldConstraint","removedUniqueConstraints","AddUniqueConstraintAction","DropUniqueConstraintAction","DropTableAction","oldColumn","newColumn","hasChanges","oldDefault","newDefault","generateReverseColumnDefinitionDiff","changes","reverseDiff","tableDef","fkAction","indexAction","ucAction","fileNameTimestamp","filePath","importStatements","actionInstances","downActionInstances","migrationFileContent","makemigrations","Command","makeMigrations","main","program","Command","makemigrations"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gummy-cli",
3
- "version": "0.0.68",
3
+ "version": "0.0.71",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -23,7 +23,7 @@
23
23
  "cli": "^1.0.1",
24
24
  "commander": "^13.0.0",
25
25
  "glob": "^11.0.0",
26
- "gummy": "0.0.68",
26
+ "gummy": "0.0.71",
27
27
  "kysely": "^0.27.5",
28
28
  "pkg-types": "^1.2.1",
29
29
  "tsx": "^4.9.3",