@izumisy/kyrage 1.5.0 → 1.5.2

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.
Files changed (2) hide show
  1. package/dist/main.js +5 -5
  2. package/package.json +10 -10
package/dist/main.js CHANGED
@@ -1,4 +1,4 @@
1
- import{a as N,b as w}from"./chunk-EY62Q3Z2.js";import{defineCommand as Yn,runMain as Zn}from"citty";var qe="1.5.0";import{defineCommand as On}from"citty";import f from"zod";import{loadConfig as Et}from"c12";import b from"zod";var O=b.object({type:b.string()}).catchall(b.any()),h=b.object({table:b.string(),name:b.string()}),I=b.object({table:b.string(),column:b.string()}),G=b.object({...h.shape,columns:b.array(b.string()).readonly()}),J=b.object({...h.shape,columns:b.array(b.string()).readonly()}),L=b.enum(["cascade","set null","set default","restrict","no action"]),Y=b.object({...h.shape,columns:b.array(b.string()).readonly(),referencedTable:b.string(),referencedColumns:b.array(b.string()).readonly(),onDelete:L.optional(),onUpdate:L.optional(),inline:b.boolean().optional()});import{getContainerRuntimeClient as me}from"testcontainers";import Z from"zod";var k=e=>Z.object({container:Z.object({image:Z.string().default(e.defaultImage),name:Z.string().optional()})}),q=class{constructor(t,n){this.dialect=t;this.containerFactory=n}async setup(t,n){return new le({dialect:this.dialect,manageType:n,containerName:t.container.name,containerFactory:()=>this.containerFactory(t.container.image)})}async hasExisting(t){return t==="dev-start"?F(this.dialect):!1}async cleanup(){await $e()}},ce="kyrage.dialect",pe="kyrage.managed",ke="kyrage.managed-by",le=class{constructor(t){this.options=t;this.startedContainer=null;this.container=this.setupContainer()}setupContainer(){let t=this.options.containerFactory();return t.withLabels({[ce]:this.options.dialect,[pe]:"true",[ke]:this.options.manageType}),this.options.manageType==="dev-start"&&t.withReuse(),this.options.containerName&&t.withName(this.options.containerName),t}async start(){this.startedContainer=await this.container.start()}async stop(){this.startedContainer&&(await this.startedContainer.stop(),this.startedContainer=null)}async remove(){await $e(),this.startedContainer=null}getConnectionString(){if(!this.startedContainer)throw new Error("Container is not started");return this.startedContainer.getConnectionUri()}async getStatus(){let n=await(await me()).container.fetchByLabel(ce,this.options.dialect,{status:["running"]});if(n){let r=await n.inspect();return{type:"container",imageName:r.Config.Image,containerID:r.Id}}return{type:"unavailable"}}async isAvailable(){return(await this.getStatus()).type==="container"}},F=async e=>(await(await me()).container.list()).some(r=>r.Labels[pe]==="true"&&r.Labels[ke]==="dev-start"&&r.Labels[ce]===e&&r.State==="running"),$e=async()=>{let e=await me(),n=(await e.container.list()).filter(r=>r.Labels[pe]==="true").map(r=>r.Id);await Promise.allSettled(n.map(async r=>e.container.getById(r).remove({force:!0})))};var Kt=f.object({type:f.string(),primaryKey:f.boolean().optional().default(!1),notNull:f.boolean().optional().default(!1),unique:f.boolean().optional().default(!1),defaultSql:f.string().optional()}),Rt=f.object({tableName:f.string(),columns:f.record(f.string(),Kt)}),Pt=f.object({...h.shape,columns:f.array(f.string()).readonly(),unique:f.boolean().default(!1)}),It=f.enum(["postgres","cockroachdb"]),qt=f.object({dialect:It,connectionString:f.string()}),kt=f.union([k({defaultImage:""})]),$t=f.object({database:qt,dev:kt.optional(),tables:f.array(Rt).readonly(),indexes:f.array(Pt).readonly(),primaryKeyConstraints:f.array(G).readonly(),uniqueConstraints:f.array(J).readonly(),foreignKeyConstraints:f.array(Y).readonly()}),Me=async()=>{let e=await Et({name:"kyrage"});return $t.parse(e.config)};import{Kysely as Jt}from"kysely";import{PostgresDialect as Mt,sql as ue}from"kysely";import{Pool as Ut}from"pg";import{PostgreSqlContainer as jt}from"@testcontainers/postgresql";import*as v from"ramda";var Ue=(e,t)=>{let n=m=>i=>v.any(v.whereEq({name:i.name,table:i.table}),m),[r,o]=v.partition(n(e.uniqueConstraints),t.constraints.unique),[l,a]=v.partition(n(e.indexes),t.indexes),c=v.reject(n(l),o),s=v.reject(n(r),a);return{indexes:[...l,...s],uniqueConstraints:[...r,...c]}};var X=class{getName(){return"postgres"}createKyselyDialect(t){return new Mt({pool:new Ut({connectionString:t})})}createIntrospectionDriver(t){return{convertTypeName:ye,introspect:de(t)}}createDevDatabaseProvider(){return new q(this.getName(),t=>new jt(t))}parseDevDatabaseConfig(t){return k({defaultImage:"postgres:16"}).parse(t)}async hasReusableDevDatabase(){return F(this.getName())}},de=e=>async t=>{var s=[];try{let n=N(s,e.getDB(),!0);let[r,o,l]=await Promise.all([Lt(n),Ft(n),Bt(n)]);let{indexes:a,uniqueConstraints:c}=Ue(t.config,{indexes:o,constraints:l});return{tables:r,indexes:a,constraints:{...l,unique:c}}}catch(m){var i=m,p=!0}finally{var u=w(s,i,p);u&&await u}},ye=e=>({bool:"boolean",int2:"smallint",int4:"integer",int8:"bigint"})[e]??e,Lt=async e=>{let{rows:t}=await ue`
1
+ import{a as N,b as A}from"./chunk-EY62Q3Z2.js";import{defineCommand as Qn,runMain as Wn}from"citty";var qe="1.5.2";import{defineCommand as _n}from"citty";import f from"zod";import{loadConfig as Et}from"c12";import b from"zod";var O=b.object({type:b.string()}).catchall(b.any()),C=b.object({table:b.string(),name:b.string()}),I=b.object({table:b.string(),column:b.string()}),G=b.object({...C.shape,columns:b.array(b.string()).readonly()}),J=b.object({...C.shape,columns:b.array(b.string()).readonly()}),F=b.enum(["cascade","set null","set default","restrict","no action"]),Y=b.object({...C.shape,columns:b.array(b.string()).readonly(),referencedTable:b.string(),referencedColumns:b.array(b.string()).readonly(),onDelete:F.optional(),onUpdate:F.optional(),inline:b.boolean().optional()});import{getContainerRuntimeClient as me}from"testcontainers";import Z from"zod";var k=e=>Z.object({container:Z.object({image:Z.string().default(e.defaultImage),name:Z.string().optional()})}),q=class{constructor(t,n){this.dialect=t;this.containerFactory=n}async setup(t,n){return new le({dialect:this.dialect,manageType:n,containerName:t.container.name,containerFactory:()=>this.containerFactory(t.container.image)})}async hasExisting(t){return t==="dev-start"?L(this.dialect):!1}async cleanup(){await $e()}},ce="kyrage.dialect",pe="kyrage.managed",ke="kyrage.managed-by",le=class{constructor(t){this.options=t;this.startedContainer=null;this.container=this.setupContainer()}setupContainer(){let t=this.options.containerFactory();return t.withLabels({[ce]:this.options.dialect,[pe]:"true",[ke]:this.options.manageType}),this.options.manageType==="dev-start"&&t.withReuse(),this.options.containerName&&t.withName(this.options.containerName),t}async start(){this.startedContainer=await this.container.start()}async stop(){this.startedContainer&&(await this.startedContainer.stop(),this.startedContainer=null)}async remove(){await $e(),this.startedContainer=null}getConnectionString(){if(!this.startedContainer)throw new Error("Container is not started");return this.startedContainer.getConnectionUri()}async getStatus(){let n=await(await me()).container.fetchByLabel(ce,this.options.dialect,{status:["running"]});if(n){let r=await n.inspect();return{type:"container",imageName:r.Config.Image,containerID:r.Id}}return{type:"unavailable"}}async isAvailable(){return(await this.getStatus()).type==="container"}},L=async e=>(await(await me()).container.list()).some(r=>r.Labels[pe]==="true"&&r.Labels[ke]==="dev-start"&&r.Labels[ce]===e&&r.State==="running"),$e=async()=>{let e=await me(),n=(await e.container.list()).filter(r=>r.Labels[pe]==="true").map(r=>r.Id);await Promise.allSettled(n.map(async r=>e.container.getById(r).remove({force:!0})))};var Kt=f.object({type:f.string(),primaryKey:f.boolean().optional().default(!1),notNull:f.boolean().optional().default(!1),unique:f.boolean().optional().default(!1),defaultSql:f.string().optional()}),Pt=f.object({tableName:f.string(),columns:f.record(f.string(),Kt)}),Rt=f.object({...C.shape,columns:f.array(f.string()).readonly(),unique:f.boolean().default(!1)}),It=f.enum(["postgres","cockroachdb"]),qt=f.object({dialect:It,connectionString:f.string()}),kt=f.union([k({defaultImage:""})]),$t=f.object({database:qt,dev:kt.optional(),tables:f.array(Pt).readonly(),indexes:f.array(Rt).readonly(),primaryKeyConstraints:f.array(G).readonly(),uniqueConstraints:f.array(J).readonly(),foreignKeyConstraints:f.array(Y).readonly()}),Me=async()=>{let e=await Et({name:"kyrage"});return $t.parse(e.config)};import{Kysely as Jt}from"kysely";import{PostgresDialect as Mt,sql as ue}from"kysely";import{Pool as Ut}from"pg";import{PostgreSqlContainer as jt}from"@testcontainers/postgresql";import*as v from"ramda";var Ue=(e,t)=>{let n=m=>i=>v.any(v.whereEq({name:i.name,table:i.table}),m),[r,o]=v.partition(n(e.uniqueConstraints),t.constraints.unique),[l,a]=v.partition(n(e.indexes),t.indexes),c=v.reject(n(l),o),s=v.reject(n(r),a);return{indexes:[...l,...s],uniqueConstraints:[...r,...c]}};var X=class{getName(){return"postgres"}createKyselyDialect(t){return new Mt({pool:new Ut({connectionString:t})})}createIntrospectionDriver(t){return{convertTypeName:ye,introspect:de(t)}}createDevDatabaseProvider(){return new q(this.getName(),t=>new jt(t))}parseDevDatabaseConfig(t){return k({defaultImage:"postgres:16"}).parse(t)}async hasReusableDevDatabase(){return L(this.getName())}},de=e=>async t=>{var s=[];try{let n=N(s,e.getDB(),!0);let[r,o,l]=await Promise.all([Ft(n),Lt(n),Bt(n)]);let{indexes:a,uniqueConstraints:c}=Ue(t.config,{indexes:o,constraints:l});return{tables:r,indexes:a,constraints:{...l,unique:c}}}catch(m){var i=m,p=!0}finally{var u=A(s,i,p);u&&await u}},ye=e=>({bool:"boolean",int2:"smallint",int4:"integer",int8:"bigint"})[e]??e,Ft=async e=>{let{rows:t}=await ue`
2
2
  SELECT
3
3
  n.nspname AS table_schema,
4
4
  c.relname AS table_name,
@@ -18,7 +18,7 @@ import{a as N,b as w}from"./chunk-EY62Q3Z2.js";import{defineCommand as Yn,runMai
18
18
  AND a.attnum > 0
19
19
  AND NOT a.attisdropped
20
20
  ORDER BY c.relname, a.attnum;
21
- `.$castTo().execute(e);return t.map(n=>({schema:n.table_schema,table:n.table_name,name:n.column_name,default:n.column_default,characterMaximumLength:n.character_maximum_length?Number(n.character_maximum_length):null}))},Ft=async e=>{let{rows:t}=await ue`
21
+ `.$castTo().execute(e);return t.map(n=>({schema:n.table_schema,table:n.table_name,name:n.column_name,default:n.column_default,characterMaximumLength:n.character_maximum_length?Number(n.character_maximum_length):null}))},Lt=async e=>{let{rows:t}=await ue`
22
22
  SELECT
23
23
  t.relname AS table_name,
24
24
  c.relname AS index_name,
@@ -89,8 +89,8 @@ import{a as N,b as w}from"./chunk-EY62Q3Z2.js";import{defineCommand as Yn,runMai
89
89
  GROUP BY n.nspname, t.relname, c.conname, c.contype, c.oid, c.conkey, t.oid,
90
90
  rt.relname, c.confkey, c.confdeltype, c.confupdtype
91
91
  ORDER BY t.relname, c.conname;
92
- `.$castTo().execute(e);return{primaryKey:t.filter(n=>n.type==="PRIMARY KEY"),unique:t.filter(n=>n.type==="UNIQUE"),foreignKey:t.filter(n=>n.type==="FOREIGN KEY").map(n=>{let{referenced_table:r,referenced_columns:o,on_delete:l,on_update:a,...c}=n;return{...c,referencedTable:r,referencedColumns:o,onDelete:l,onUpdate:a}})}};import{CockroachDbContainer as zt}from"@testcontainers/cockroachdb";import{Pool as Ht}from"pg";import{PostgresAdapter as Vt,PostgresDialect as Qt}from"kysely";var ee=class{getName(){return"cockroachdb"}createKyselyDialect(t){return new ge({pool:new Ht({connectionString:t})})}createIntrospectionDriver(t){let n=["rowid"];return{convertTypeName:ye,introspect:async r=>{let o=await de(t)(r);return{tables:o.tables.filter(a=>!n.includes(a.name)),indexes:o.indexes,constraints:o.constraints}}}}createDevDatabaseProvider(){return new q(this.getName(),t=>new zt(t))}parseDevDatabaseConfig(t){return k({defaultImage:"cockroachdb/cockroach:latest-v24.3"}).parse(t)}async hasReusableDevDatabase(){return F(this.getName())}},fe=class extends Vt{async acquireMigrationLock(t,n){await t.selectFrom(n.lockTable).selectAll().forUpdate().execute()}},ge=class extends Qt{createAdapter(){return new fe}};var Wt={postgres:new X,cockroachdb:new ee},A=e=>{let t=Wt[e];if(!t)throw new Error(`Unsupported dialect: ${e}`);return t};import{DummyDriver as Gt}from"kysely";var te=class extends Gt{constructor(n){super();this.queries=n}async acquireConnection(){return new be(this.queries)}},be=class{constructor(t){this.queries=t}async executeQuery(t){let n=t.query.kind;if(n==="CreateTableNode"||n==="DropTableNode"||n==="AlterTableNode"){if(t.query.table.table.identifier.name.startsWith("kysely_"))return{rows:[]};this.queries.push(t)}else(n==="CreateIndexNode"||n==="DropIndexNode")&&this.queries.push(t);return{rows:[]}}async*streamQuery(){}};var ne=e=>new he({databaseProps:e.database,options:e.options}),he=class{constructor(t){this.constructorProps=t}getDB(t){let n=A(this.constructorProps.databaseProps.dialect).createKyselyDialect(this.constructorProps.databaseProps.connectionString);return new Ce({dialect:{createAdapter:()=>n.createAdapter(),createDriver:()=>n.createDriver(),createIntrospector:r=>n.createIntrospector(r),createQueryCompiler:()=>n.createQueryCompiler()}},{isPlan:t?.plan===!0})}getDialect(){return this.constructorProps.databaseProps.dialect}},Ce=class extends Jt{constructor(n,r){let o=[];super({dialect:{...n.dialect,createDriver:()=>r.isPlan?new te(o):n.dialect.createDriver()}});this.plannedQueries=[];this.plannedQueries=o}getPlannedQueries(){return this.plannedQueries}};import{createConsola as Yt}from"consola";var Zt=Yt({stdout:process.stderr}),T={stdout:e=>console.log(e),reporter:{...Zt}},xe={stdout:()=>{},reporter:{info:()=>{},warn:()=>{},success:()=>{},log:()=>{},error:()=>{}}};async function E(){let e=await Me();return{client:ne({database:e.database}),logger:T,config:e}}import{Migrator as Tn}from"kysely";import{DEFAULT_MIGRATION_TABLE as Dt}from"kysely";import{readdir as hn,readFile as Cn}from"fs/promises";import{join as xn}from"path";import V from"zod";import nn from"zod";import g from"zod";import B from"zod";import{sql as en}from"kysely";import{isColumnDataType as Xt}from"kysely";var $=e=>{if(!Xt(e))throw new Error(`Unsupported data type: ${e}`)};var y=e=>e;var je=y({typeName:"create_table",schema:B.object({type:B.literal("create_table"),table:B.string(),columns:B.record(B.string(),O)}),execute:async(e,t)=>{let n=e.schema.createTable(t.table);n=De(n,t.columns),await n.execute()}}),Le=(e,t)=>({type:"create_table",table:e,columns:t});function De(e,t){let n=e;for(let[r,o]of Object.entries(t)){let l=o.type;$(l),n=n.addColumn(r,l,a=>{let c=a;return o.notNull&&(c=c.notNull()),typeof o.defaultSql=="string"&&(c=c.defaultTo(en.raw(o.defaultSql))),c})}return n}var Fe=y({typeName:"create_table_with_constraints",schema:g.object({type:g.literal("create_table_with_constraints"),table:g.string(),columns:g.record(g.string(),O),constraints:g.object({primaryKey:g.object({name:g.string(),columns:g.array(g.string()).readonly()}).optional(),unique:g.array(g.object({name:g.string(),columns:g.array(g.string()).readonly()})).readonly().optional(),foreignKeys:g.array(g.object({name:g.string(),columns:g.array(g.string()).readonly(),referencedTable:g.string(),referencedColumns:g.array(g.string()).readonly(),onDelete:L.optional(),onUpdate:L.optional(),inline:g.boolean().optional()})).readonly().optional()}).optional()}),execute:async(e,t)=>{let n=e.schema.createTable(t.table);if(n=De(n,t.columns),t.constraints){let{primaryKey:r,unique:o,foreignKeys:l}=t.constraints;if(r&&(n=n.addPrimaryKeyConstraint(r.name,r.columns)),o)for(let a of o)n=n.addUniqueConstraint(a.name,a.columns);if(l)for(let a of l)n=n.addForeignKeyConstraint(a.name,a.columns,a.referencedTable,a.referencedColumns,c=>{let s=c;return a.onDelete&&(s=s.onDelete(a.onDelete)),a.onUpdate&&(s=s.onUpdate(a.onUpdate)),s})}await n.execute()}}),Be=(e,t,n)=>({type:"create_table_with_constraints",table:e,columns:t,constraints:{primaryKey:n?.primaryKey,unique:n?.unique??[],foreignKeys:n?.foreignKeys??[]}});import _e from"zod";var ze=y({typeName:"drop_table",schema:_e.object({type:_e.literal("drop_table"),table:_e.string()}),execute:async(e,t)=>{await e.schema.dropTable(t.table).execute()}}),He=e=>({type:"drop_table",table:e});import Ve from"zod";import{sql as tn}from"kysely";var Qe=y({typeName:"add_column",schema:Ve.object({...I.shape,type:Ve.literal("add_column"),attributes:O}),execute:async(e,t)=>{let n=t.attributes.type;$(n),await e.schema.alterTable(t.table).addColumn(t.column,n,r=>{let o=r;return t.attributes.notNull&&(o=o.notNull()),typeof t.attributes.defaultSql=="string"&&(o=o.defaultTo(tn.raw(t.attributes.defaultSql))),o}).execute()}}),We=(e,t)=>({...e,type:"add_column",attributes:t});import Ge from"zod";var Je=y({typeName:"drop_column",schema:Ge.object({...I.shape,type:Ge.literal("drop_column"),attributes:O}),execute:async(e,t)=>{await e.schema.alterTable(t.table).dropColumn(t.column).execute()}}),Ye=(e,t)=>({...e,type:"drop_column",attributes:t});import Ze from"zod";var Xe=y({typeName:"alter_column",schema:Ze.object({...I.shape,type:Ze.literal("alter_column"),before:O,after:O}),execute:async(e,t)=>{let{table:n,column:r,before:o,after:l}=t;if(o.type!==l.type){let a=l.type;$(a),await e.schema.alterTable(n).alterColumn(r,c=>c.setDataType(a)).execute()}l.notNull!==o.notNull&&(l.notNull?await e.schema.alterTable(n).alterColumn(r,a=>a.setNotNull()).execute():await e.schema.alterTable(n).alterColumn(r,a=>a.dropNotNull()).execute())}}),et=(e,t,n)=>({...e,type:"alter_column",before:t,after:n});import z from"zod";var tt=y({typeName:"create_index",schema:z.object({...h.shape,type:z.literal("create_index"),columns:z.array(z.string()).readonly(),unique:z.boolean()}),execute:async(e,t)=>{let n=e.schema.createIndex(t.name).on(t.table);for(let r of t.columns)n=n.column(r);t.unique&&(n=n.unique()),await n.execute()}}),Oe=e=>({...e,type:"create_index"});import nt from"zod";var rt=y({typeName:"drop_index",schema:nt.object({...h.shape,type:nt.literal("drop_index")}),execute:async(e,t)=>{await e.schema.dropIndex(t.name).execute()}}),Te=e=>({...e,type:"drop_index"});import at from"zod";var ot=y({typeName:"create_primary_key_constraint",schema:at.object({...G.shape,type:at.literal("create_primary_key_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).addPrimaryKeyConstraint(t.name,t.columns).execute()}}),Se=e=>({...e,type:"create_primary_key_constraint"});import it from"zod";var st=y({typeName:"drop_primary_key_constraint",schema:it.object({...h.shape,type:it.literal("drop_primary_key_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}}),ve=e=>({...e,type:"drop_primary_key_constraint"});import ct from"zod";var lt=y({typeName:"create_unique_constraint",schema:ct.object({...J.shape,type:ct.literal("create_unique_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).addUniqueConstraint(t.name,t.columns).execute()}}),Ne=e=>({...e,type:"create_unique_constraint"});import mt from"zod";var pt=y({typeName:"drop_unique_constraint",schema:mt.object({...h.shape,type:mt.literal("drop_unique_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}}),we=e=>({...e,type:"drop_unique_constraint"});import ut from"zod";var dt=y({typeName:"create_foreign_key_constraint",schema:ut.object({...Y.shape,type:ut.literal("create_foreign_key_constraint")}),execute:async(e,t)=>{let n=e.schema.alterTable(t.table).addForeignKeyConstraint(t.name,t.columns,t.referencedTable,t.referencedColumns);t.onDelete&&(n=n.onDelete(t.onDelete)),t.onUpdate&&(n=n.onUpdate(t.onUpdate)),await n.execute()}}),Ae=(e,t)=>({...e,...t,type:"create_foreign_key_constraint"});import yt from"zod";var ft=y({typeName:"drop_foreign_key_constraint",schema:yt.object({...h.shape,type:yt.literal("drop_foreign_key_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}}),Ee=e=>({...e,type:"drop_foreign_key_constraint"});var gt=[Fe,je,ze,Qe,Je,Xe,tt,rt,ot,st,lt,pt,dt,ft],bt=nn.union(gt.map(e=>e.schema));async function ht(e,t){return await rn(t.type)(e,t)}function rn(e){let t=gt.find(n=>n.typeName===e);if(!t)throw new Error(`Unknown operation type: ${e}`);return t.execute}import*as H from"ramda";import{Graph as an,topologicalSort as on,CycleError as sn}from"graph-data-structure";var cn=e=>{let t=new Set;return e.forEach(n=>{n.type==="drop_table"&&t.add(n.table)}),t.size===0?e:e.filter(n=>n.type==="drop_table"?!0:!t.has(n.table))},ln=e=>{let t=new Set;if(e.forEach(a=>{a.type==="create_table"&&t.add(a.table)}),t.size===0)return e;let n=new Map,r=new Map,o=[];e.forEach(a=>{a.type==="create_table"&&n.set(a.table,a)}),e.forEach(a=>{switch(a.type){case"create_table":return;case"create_primary_key_constraint":case"create_unique_constraint":if(t.has(a.table)){let c=r.get(a.table)||[];r.set(a.table,[...c,a])}else o.push(a);break;case"create_foreign_key_constraint":if(t.has(a.table)&&a.inline!==!1){let c=n.get(a.table),s=a.columns.filter(i=>!(i in c.columns));if(s.length>0)throw new Error(`Foreign key constraint "${a.name}" references non-existent columns: ${s.join(", ")}`);let m=r.get(a.table)||[];r.set(a.table,[...m,a])}else o.push(a);break;default:o.push(a);break}});let l=[];return n.forEach((a,c)=>{let s=r.get(c)||[];if(s.length===0){l.push(a);return}let m={unique:[],foreignKeys:[]};s.forEach(i=>{switch(i.type){case"create_primary_key_constraint":m.primaryKey=i;break;case"create_unique_constraint":m.unique.push(i);break;case"create_foreign_key_constraint":m.foreignKeys.push(i);break}}),l.push(Be(a.table,a.columns,m))}),[...l,...o]},mn=e=>{let t=new Set;return e.forEach(n=>{(n.type==="drop_unique_constraint"||n.type==="drop_primary_key_constraint")&&t.add(`${n.table}.${n.name}`)}),e.filter(n=>{if(n.type==="drop_index"){let r=`${n.table}.${n.name}`;if(t.has(r))return!1}return!0})},Ke=e=>"table"in e?e.table:null,pn=e=>{let t=new Set;return e.forEach(n=>{let r=Ke(n);r&&t.add(r)}),t},un=e=>{switch(e.type){case"create_foreign_key_constraint":return[{table:e.table,referencedTable:e.referencedTable}];case"create_table_with_constraints":return(e.constraints?.foreignKeys||[]).map(t=>({table:e.table,referencedTable:t.referencedTable}));default:return[]}},dn=e=>{let t=new an;return e.forEach(n=>un(n).forEach(r=>{r.table!==r.referencedTable&&(n.type!=="create_foreign_key_constraint"||n.inline!==!1)&&t.addEdge(r.referencedTable,r.table)})),t},yn=(e,t)=>{try{let n=dn(t),r=on(n),o=new Set(r);return[...Array.from(e).filter(a=>!o.has(a)).sort(),...r]}catch(n){throw n instanceof sn?new Error("Circular dependency detected in foreign key constraints. Please resolve this by setting 'inline: false' for one of the foreign key constraints in each circular relationship."):n}},fn=e=>new Map(e.map((t,n)=>[t,n])),gn=e=>(t,n)=>{let r=Ct[t.type],o=Ct[n.type];if(r!==o)return r-o;let l=Ke(t),a=Ke(n);if(l&&a){let c=e.get(l)??Number.MAX_SAFE_INTEGER,s=e.get(a)??Number.MAX_SAFE_INTEGER;if(c!==s)return c-s}return(l||"").localeCompare(a||"")},Ct={drop_foreign_key_constraint:0,drop_unique_constraint:1,drop_primary_key_constraint:2,drop_index:3,drop_column:4,drop_table:5,create_table_with_constraints:6,create_table:7,add_column:8,alter_column:9,create_index:10,create_primary_key_constraint:11,create_unique_constraint:12,create_foreign_key_constraint:13},bn=e=>H.sort(gn(H.pipe(pn,t=>yn(t,e),fn)(e)),e),xt=H.pipe(cn,ln,mn,bn);var _t=e=>({getMigrations:async()=>{let t=await e.migrationsResolver(),n={};return t.forEach(r=>{n[r.id]={up:async o=>{for(let l of xt(r.diff.operations))await ht(o,l)}}}),n}}),Dn=V.object({operations:V.array(bt).readonly()}),_n=V.object({id:V.string(),version:V.string(),diff:Dn}),M="migrations",Re=async()=>{try{let t=(await hn(M)).filter(n=>n.endsWith(".json")).map(async n=>_n.parse(JSON.parse(await Cn(xn(M,n),"utf-8"))));return await Promise.all(t)}catch(e){if(e instanceof Object&&"code"in e&&e.code==="ENOENT")return[];throw e}},K=async e=>{var l=[];try{let t=N(l,e.getDB(),!0);let n=await Re();let r=(await t.introspection.getTables({withInternalKyselyTables:!0})).map(i=>i.name);if(!r.includes(Dt))return n;let o=await t.selectFrom(Dt).select(["name","timestamp"]).$narrowType().execute();return n.filter(i=>!o.some(p=>p.name===i.id))}catch(a){var c=a,s=!0}finally{var m=w(l,c,s);m&&await m}};import{format as Sn}from"sql-formatter";async function Q(e,t){var p=[];try{let{client:n,logger:r}=e;let{reporter:o}=r;let l=N(p,n.getDB({plan:t.plan}),!0);let a=_t({migrationsResolver:async()=>t.plan?await K(n):await Re(),options:{plan:t.plan}});let c=new Tn({db:l,provider:a});let{results:s,error:m}=await c.migrateToLatest();let i=l.getPlannedQueries();if(i.length>0){i.forEach(_=>{r.stdout(t.pretty?Sn(_.sql):_.sql)});return}s&&s.length>0?s.forEach(_=>{_.status==="Error"?o.error(`Migration failed: ${_.migrationName}`):_.status==="Success"&&o.success(`Migration applied: ${_.migrationName}`)}):o.info("No migrations to run");if(m)throw m instanceof Error?m:new Error(`Migration error: ${m}`)}catch(u){var x=u,C=!0}finally{var D=w(p,x,C);D&&await D}}var Ot=On({meta:{name:"apply",description:"Run migrations to sync database schema"},args:{plan:{type:"boolean",description:"Plan the migration without applying it",default:!1},pretty:{type:"boolean",description:"Pretty print the migration SQL (only for --plan)",default:!1}},run:async e=>{try{let t=await E();await Q(t,{plan:e.args.plan,pretty:e.args.pretty})}catch(t){T.reporter.error(t),process.exit(1)}}});import{defineCommand as In}from"citty";import{mkdir as qn,writeFile as kn,unlink as $n}from"fs/promises";import{join as Mn}from"path";import*as d from"ramda";var U=()=>({added:(e,t,n)=>d.pipe(d.difference(t),d.map(n))(e),removed:(e,t,n)=>d.pipe(d.difference(e),d.map(n))(t),changed:(e,t,n,r)=>d.pipe(d.intersection(e),d.filter(n),d.map(r))(t)}),re=d.prop("name"),vn=d.eqBy(e=>[e.type,e.notNull??!1,e.primaryKey??!1,e.unique??!1]);function Nn(e,t){let n=[],r=U(),o=e.columns,l=t.columns,a=Object.keys(o),c=Object.keys(l);return r.added(a,c,s=>({column:s,attributes:l[s]})).forEach(s=>{n.push(We({table:e.name,column:s.column},s.attributes))}),r.removed(a,c,s=>({column:s,attributes:o[s]})).forEach(s=>{n.push(Ye({table:e.name,column:s.column},s.attributes))}),r.changed(a,c,s=>!vn(o[s],l[s]),s=>({column:s,before:o[s],after:l[s]})).forEach(s=>{n.push(et({table:e.name,column:s.column},s.before,s.after))}),n}function wn(e){let{current:t,ideal:n}=e,r=[],o=U(),l=d.map(re,t),a=d.map(re,n);return o.added(l,a,c=>n.find(m=>m.name===c)).forEach(c=>{r.push(Le(c.name,c.columns))}),o.removed(l,a,d.identity).forEach(c=>{r.push(He(c))}),d.filter(c=>n.some(s=>s.name===c.name))(t).forEach(c=>{let s=n.find(m=>m.name===c.name);r.push(...Nn(c,s))}),r}function An(e){let{current:t,ideal:n}=e,r=[],o=U(),l=i=>`${i.table}:${i.name}`,a=new Map(t.map(i=>[l(i),i])),c=new Map(n.map(i=>[l(i),i])),s=Array.from(a.keys()),m=Array.from(c.keys());return o.added(s,m,i=>c.get(i)).forEach(i=>{r.push(Oe(i))}),o.removed(s,m,i=>{let p=a.get(i);return{table:p.table,name:p.name}}).forEach(i=>{r.push(Te(i))}),o.changed(s,m,i=>{let p=a.get(i),u=c.get(i);return!d.equals(p.columns,u.columns)||p.unique!==u.unique},i=>{let p=a.get(i),u=c.get(i);return{current:p,ideal:u}}).forEach(({current:i,ideal:p})=>{r.push(Te(i)),r.push(Oe(p))}),r}function En(e){let{current:t,ideal:n}=e,r=[],o=U(),l=i=>`${i.table}:${i.name}`,a=new Map(t.map(i=>[l(i),i])),c=new Map(n.map(i=>[l(i),i])),s=Array.from(a.keys()),m=Array.from(c.keys());return o.added(s,m,i=>c.get(i)).forEach(i=>{r.push(Se(i))}),o.removed(s,m,i=>{let p=a.get(i);return{table:p.table,name:p.name}}).forEach(i=>{r.push(ve(i))}),o.changed(s,m,i=>{let p=a.get(i),u=c.get(i);return!d.equals(p.columns,u.columns)},i=>{let p=a.get(i),u=c.get(i);return{current:p,ideal:u}}).forEach(({current:i,ideal:p})=>{r.push(ve(i)),r.push(Se(p))}),r}function Kn(e){let{current:t,ideal:n}=e,r=[],o=U(),l=i=>`${i.table}:${i.name}`,a=new Map(t.map(i=>[l(i),i])),c=new Map(n.map(i=>[l(i),i])),s=Array.from(a.keys()),m=Array.from(c.keys());return o.added(s,m,i=>c.get(i)).forEach(i=>{r.push(Ne(i))}),o.removed(s,m,i=>{let p=a.get(i);return{table:p.table,name:p.name}}).forEach(i=>{r.push(we(i))}),o.changed(s,m,i=>{let p=a.get(i),u=c.get(i);return!d.equals(p.columns,u.columns)},i=>{let p=a.get(i),u=c.get(i);return{current:p,ideal:u}}).forEach(({current:i,ideal:p})=>{r.push(we(i)),r.push(Ne(p))}),r}function Rn(e){let t=[],n=U(),r=e.current.map(re),o=e.ideal.map(re);t.push(...n.added(r,o,a=>{let c=e.ideal.find(p=>p.name===a),{table:s,name:m,...i}=c;return Ae({table:s,name:m},i)})),t.push(...n.removed(r,o,a=>{let c=e.current.find(s=>s.name===a);return Ee(c)}));let l=a=>{let c=e.current.find(m=>m.name===a),s=e.ideal.find(m=>m.name===a);return!c||!s?!1:!(d.equals(c.columns,s.columns)&&c.referencedTable===s.referencedTable&&d.equals(c.referencedColumns,s.referencedColumns)&&c.onDelete===s.onDelete&&c.onUpdate===s.onUpdate)};return t.push(...n.changed(r,o,l,a=>{let c=e.current.find(u=>u.name===a),s=e.ideal.find(u=>u.name===a),{table:m,name:i,...p}=s;return[Ee(c),Ae({table:m,name:i},p)]}).flat()),t}function Tt(e){let t=wn({current:e.current.tables,ideal:e.ideal.tables}),n=An({current:e.current.indexes,ideal:e.ideal.indexes}),r=En({current:e.current.primaryKeyConstraints,ideal:e.ideal.primaryKeyConstraints}),o=Kn({current:e.current.uniqueConstraints,ideal:e.ideal.uniqueConstraints}),l=Rn({current:e.current.foreignKeyConstraints,ideal:e.ideal.foreignKeyConstraints});return{operations:[...t,...n,...r,...o,...l]}}var St=e=>{let n=A(e.getDialect()).createIntrospectionDriver(e);return{introspect:async o=>{var C=[];try{let l=N(C,e.getDB(),!0);let a=await l.introspection.getTables();let{tables:c,indexes:s,constraints:m}=await n.introspect({config:o});let i=()=>a.map(S=>{let P={};for(let j of S.columns){let se=c.find(Ie=>Ie.table===S.name&&Ie.name===j.name);se&&(P[j.name]={schema:S.schema,table:S.name,name:j.name,dataType:n.convertTypeName(j.dataType),default:se.default??null,characterMaximumLength:se.characterMaximumLength??null,notNull:!j.isNullable})}return{schema:S.schema,name:S.name,columns:P}});let p=S=>!S.table.startsWith("kysely_");let u=()=>s.filter(p);let x=()=>({primaryKey:m.primaryKey.filter(p),unique:m.unique.filter(p),foreignKey:m.foreignKey.filter(p)});return{tables:i(),indexes:u(),constraints:x()}}catch(D){var _=D,R=!0}finally{var ie=w(C,_,R);ie&&await ie}}}};var ae=async(e,t,n)=>{let r=A(t),o=await r.createDevDatabaseProvider().setup(r.parseDevDatabaseConfig(e),n);return{manageType:n,instance:o}};async function Pn(e,t){let{config:n}=e,r=A(n.database.dialect);switch(t.mode){case"dev-start":{let{instance:o,manageType:l}=await ae(n.dev,n.database.dialect,"dev-start");return{manageType:l,manager:o,result:{reused:await o.isAvailable()}}}case"generate-dev":{let o=await r.hasReusableDevDatabase(),{instance:l,manageType:a}=await ae(n.dev,n.database.dialect,o?"dev-start":"one-off");return{manageType:a,manager:l,result:{reused:o}}}}}async function oe(e,t){let{config:n}=e,r=t.logger||xe,{reporter:o}=r;if(!n.dev)throw new Error("Dev database configuration is required");let{manageType:l,manager:a,result:c}=await Pn(e,t);c.reused?o.info("\u{1F504} Reusing existing dev database..."):o.info("\u{1F680} Starting dev database..."),await a.start(),o.success(`Dev database started: ${n.database.dialect}`);let s=ne({database:{dialect:n.database.dialect,connectionString:a.getConnectionString()}}),m=await K(s);return m.length>0?(o.info(`\u{1F504} Applying ${m.length} pending migrations...`),await Q({client:s,logger:xe,config:n},{plan:!1,pretty:!1}),o.success(`Applied ${m.length} migrations`)):o.info("No pending migrations found"),{client:s,manager:a,cleanup:async()=>{switch(t.mode){case"dev-start":o.success("Persistent dev database ready: "+n.database.dialect);break;case"generate-dev":l==="dev-start"?o.info("Dev start container remains running"):(await a.stop(),o.success("Temporary dev database stopped"));break}}}}async function Un(e,t){let{logger:n,config:r}=e,{reporter:o}=n;t.squash&&await jn(e);let{client:l,cleanup:a}=t.dev?await oe(e,{mode:"generate-dev",logger:n}):{client:e.client,cleanup:async()=>{}};try{if(!t.ignorePending){let i=await K(l);if(i.length>0)if(t.dev)o.info(`Dev database has ${i.length} pending migrations. These will be applied automatically as baseline.`);else{o.warn([`There are pending migrations: ${i.map(p=>p.id).join(", ")}`,"Please apply them first before generating a new migration.","Otherwise, use --ignore-pending to skip this check."].join(`
93
- `));return}}let c=await Ln({client:l,config:r});if(!c){o.info("No changes detected, no migration needed.");return}Fn(n,c.diff);let s=`${M}/${c.id}.json`;await qn(M,{recursive:!0}),await kn(s,JSON.stringify(c,null,2));let m=t.squash?`Generated squashed migration: ${s}`:`Migration file generated: ${s}`;o.success(m),t.dev&&await Q({...e,client:l},{plan:!1,pretty:!1})}finally{await a()}}var jn=async e=>{let{client:t,logger:n}=e,{reporter:r}=n,o=await K(t);if(o.length===0){r.info("No pending migrations found, nothing to squash.");return}r.info(`Found ${o.length} pending migrations to squash:`),o.forEach(a=>{r.info(` - ${a.id}.json`)});let l=o.map(a=>Mn(M,`${a.id}.json`));try{await Promise.all(l.map(a=>$n(a))),r.success(`\u{1F5D1}\uFE0F Removed ${l.length} pending migration files`)}catch(a){throw new Error(`Failed to remove pending migration files: ${a}`)}},Ln=async e=>{let{client:t,config:n}=e,r=St(t),{tables:o,indexes:l,constraints:a}=await r.introspect(n),c=(u,x)=>C=>C.some(D=>D.table===u&&D.columns.length===1&&D.columns[0]===x),s=o.map(u=>({name:u.name,columns:Object.fromEntries(Object.entries(u.columns).map(([x,C])=>{let D=c(u.name,x),_=D(a.primaryKey),R=D(a.unique),S=a.primaryKey.some(P=>P.table===u.name&&P.columns.length>1&&P.columns.includes(x))?!0:C.notNull;return[x,{type:C.dataType,notNull:S,defaultSql:C.default??void 0,primaryKey:_,unique:R}]}))})),m=n.tables.map(u=>({name:u.tableName,columns:Object.fromEntries(Object.entries(u.columns).map(([x,C])=>{let D=(n.primaryKeyConstraints??[]).some(R=>R.table===u.tableName&&R.columns.includes(x)),_=C.primaryKey||C.notNull||D;return[x,{...C,notNull:_}]}))})),i=Tt({current:{tables:s,indexes:l,uniqueConstraints:a.unique,primaryKeyConstraints:a.primaryKey,foreignKeyConstraints:a.foreignKey},ideal:{...n,tables:m}});return i.operations.length===0?null:{version:"1",id:Date.now()+"",diff:i}},Fn=(e,t)=>{let n=[];t.operations.forEach(r=>{switch(r.type){case"create_table":n.push(`-- create_table: ${r.table}`),Object.entries(r.columns).forEach(([o,l])=>{n.push(` -> column: ${o} (${JSON.stringify(l)})`)});break;case"drop_table":n.push(`-- remove_table: ${r.table}`);break;case"add_column":n.push([`-- add_column: ${r.table}.${r.column}`,` -> to: ${JSON.stringify(r.attributes)}`].join(`
92
+ `.$castTo().execute(e);return{primaryKey:t.filter(n=>n.type==="PRIMARY KEY"),unique:t.filter(n=>n.type==="UNIQUE"),foreignKey:t.filter(n=>n.type==="FOREIGN KEY").map(n=>{let{referenced_table:r,referenced_columns:o,on_delete:l,on_update:a,...c}=n;return{...c,referencedTable:r,referencedColumns:o,onDelete:l,onUpdate:a}})}};import{CockroachDbContainer as zt}from"@testcontainers/cockroachdb";import{Pool as Ht}from"pg";import{PostgresAdapter as Vt,PostgresDialect as Qt}from"kysely";var ee=class{getName(){return"cockroachdb"}createKyselyDialect(t){return new ge({pool:new Ht({connectionString:t})})}createIntrospectionDriver(t){let n=["rowid"];return{convertTypeName:ye,introspect:async r=>{let o=await de(t)(r);return{tables:o.tables.filter(a=>!n.includes(a.name)),indexes:o.indexes,constraints:o.constraints}}}}createDevDatabaseProvider(){return new q(this.getName(),t=>new zt(t))}parseDevDatabaseConfig(t){return k({defaultImage:"cockroachdb/cockroach:latest-v24.3"}).parse(t)}async hasReusableDevDatabase(){return L(this.getName())}},fe=class extends Vt{async acquireMigrationLock(t,n){await t.selectFrom(n.lockTable).selectAll().forUpdate().execute()}},ge=class extends Qt{createAdapter(){return new fe}};var Wt={postgres:new X,cockroachdb:new ee},w=e=>{let t=Wt[e];if(!t)throw new Error(`Unsupported dialect: ${e}`);return t};import{DummyDriver as Gt}from"kysely";var te=class extends Gt{constructor(n){super();this.queries=n}async acquireConnection(){return new be(this.queries)}},be=class{constructor(t){this.queries=t}async executeQuery(t){let n=t.query.kind;if(n==="CreateTableNode"||n==="DropTableNode"||n==="AlterTableNode"){if(t.query.table.table.identifier.name.startsWith("kysely_"))return{rows:[]};this.queries.push(t)}else(n==="CreateIndexNode"||n==="DropIndexNode")&&this.queries.push(t);return{rows:[]}}async*streamQuery(){}};var ne=e=>new he({databaseProps:e.database,options:e.options}),he=class{constructor(t){this.constructorProps=t}getDB(t){let n=w(this.constructorProps.databaseProps.dialect).createKyselyDialect(this.constructorProps.databaseProps.connectionString);return new Ce({dialect:{createAdapter:()=>n.createAdapter(),createDriver:()=>n.createDriver(),createIntrospector:r=>n.createIntrospector(r),createQueryCompiler:()=>n.createQueryCompiler()}},{isPlan:t?.plan===!0})}getDialect(){return this.constructorProps.databaseProps.dialect}},Ce=class extends Jt{constructor(n,r){let o=[];super({dialect:{...n.dialect,createDriver:()=>r.isPlan?new te(o):n.dialect.createDriver()}});this.plannedQueries=[];this.plannedQueries=o}getPlannedQueries(){return this.plannedQueries}};import{createConsola as Yt}from"consola";var Zt=Yt({stdout:process.stderr}),S={stdout:e=>console.log(e),reporter:{...Zt}},xe={stdout:()=>{},reporter:{info:()=>{},warn:()=>{},success:()=>{},log:()=>{},error:()=>{}}};import*as Xt from"fs/promises";async function E(){let e=await Me();return{client:ne({database:e.database}),logger:S,fs:Xt,config:e}}import{Migrator as On}from"kysely";import{DEFAULT_MIGRATION_TABLE as Dt}from"kysely";import{join as Cn}from"path";import V from"zod";import rn from"zod";import g from"zod";import B from"zod";import{sql as tn}from"kysely";import{isColumnDataType as en}from"kysely";var $=e=>{if(!en(e))throw new Error(`Unsupported data type: ${e}`)};var y=e=>e;var je=y({typeName:"create_table",schema:B.object({type:B.literal("create_table"),table:B.string(),columns:B.record(B.string(),O)}),execute:async(e,t)=>{let n=e.schema.createTable(t.table);n=De(n,t.columns),await n.execute()}}),Fe=(e,t)=>({type:"create_table",table:e,columns:t});function De(e,t){let n=e;for(let[r,o]of Object.entries(t)){let l=o.type;$(l),n=n.addColumn(r,l,a=>{let c=a;return o.notNull&&(c=c.notNull()),typeof o.defaultSql=="string"&&(c=c.defaultTo(tn.raw(o.defaultSql))),c})}return n}var Le=y({typeName:"create_table_with_constraints",schema:g.object({type:g.literal("create_table_with_constraints"),table:g.string(),columns:g.record(g.string(),O),constraints:g.object({primaryKey:g.object({name:g.string(),columns:g.array(g.string()).readonly()}).optional(),unique:g.array(g.object({name:g.string(),columns:g.array(g.string()).readonly()})).readonly().optional(),foreignKeys:g.array(g.object({name:g.string(),columns:g.array(g.string()).readonly(),referencedTable:g.string(),referencedColumns:g.array(g.string()).readonly(),onDelete:F.optional(),onUpdate:F.optional(),inline:g.boolean().optional()})).readonly().optional()}).optional()}),execute:async(e,t)=>{let n=e.schema.createTable(t.table);if(n=De(n,t.columns),t.constraints){let{primaryKey:r,unique:o,foreignKeys:l}=t.constraints;if(r&&(n=n.addPrimaryKeyConstraint(r.name,r.columns)),o)for(let a of o)n=n.addUniqueConstraint(a.name,a.columns);if(l)for(let a of l)n=n.addForeignKeyConstraint(a.name,a.columns,a.referencedTable,a.referencedColumns,c=>{let s=c;return a.onDelete&&(s=s.onDelete(a.onDelete)),a.onUpdate&&(s=s.onUpdate(a.onUpdate)),s})}await n.execute()}}),Be=(e,t,n)=>({type:"create_table_with_constraints",table:e,columns:t,constraints:{primaryKey:n?.primaryKey,unique:n?.unique??[],foreignKeys:n?.foreignKeys??[]}});import _e from"zod";var ze=y({typeName:"drop_table",schema:_e.object({type:_e.literal("drop_table"),table:_e.string()}),execute:async(e,t)=>{await e.schema.dropTable(t.table).execute()}}),He=e=>({type:"drop_table",table:e});import Ve from"zod";import{sql as nn}from"kysely";var Qe=y({typeName:"add_column",schema:Ve.object({...I.shape,type:Ve.literal("add_column"),attributes:O}),execute:async(e,t)=>{let n=t.attributes.type;$(n),await e.schema.alterTable(t.table).addColumn(t.column,n,r=>{let o=r;return t.attributes.notNull&&(o=o.notNull()),typeof t.attributes.defaultSql=="string"&&(o=o.defaultTo(nn.raw(t.attributes.defaultSql))),o}).execute()}}),We=(e,t)=>({...e,type:"add_column",attributes:t});import Ge from"zod";var Je=y({typeName:"drop_column",schema:Ge.object({...I.shape,type:Ge.literal("drop_column"),attributes:O}),execute:async(e,t)=>{await e.schema.alterTable(t.table).dropColumn(t.column).execute()}}),Ye=(e,t)=>({...e,type:"drop_column",attributes:t});import Ze from"zod";var Xe=y({typeName:"alter_column",schema:Ze.object({...I.shape,type:Ze.literal("alter_column"),before:O,after:O}),execute:async(e,t)=>{let{table:n,column:r,before:o,after:l}=t;if(o.type!==l.type){let a=l.type;$(a),await e.schema.alterTable(n).alterColumn(r,c=>c.setDataType(a)).execute()}l.notNull!==o.notNull&&(l.notNull?await e.schema.alterTable(n).alterColumn(r,a=>a.setNotNull()).execute():await e.schema.alterTable(n).alterColumn(r,a=>a.dropNotNull()).execute())}}),et=(e,t,n)=>({...e,type:"alter_column",before:t,after:n});import z from"zod";var tt=y({typeName:"create_index",schema:z.object({...C.shape,type:z.literal("create_index"),columns:z.array(z.string()).readonly(),unique:z.boolean()}),execute:async(e,t)=>{let n=e.schema.createIndex(t.name).on(t.table);for(let r of t.columns)n=n.column(r);t.unique&&(n=n.unique()),await n.execute()}}),Oe=e=>({...e,type:"create_index"});import nt from"zod";var rt=y({typeName:"drop_index",schema:nt.object({...C.shape,type:nt.literal("drop_index")}),execute:async(e,t)=>{await e.schema.dropIndex(t.name).execute()}}),Se=e=>({...e,type:"drop_index"});import at from"zod";var ot=y({typeName:"create_primary_key_constraint",schema:at.object({...G.shape,type:at.literal("create_primary_key_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).addPrimaryKeyConstraint(t.name,t.columns).execute()}}),Te=e=>({...e,type:"create_primary_key_constraint"});import it from"zod";var st=y({typeName:"drop_primary_key_constraint",schema:it.object({...C.shape,type:it.literal("drop_primary_key_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}}),ve=e=>({...e,type:"drop_primary_key_constraint"});import ct from"zod";var lt=y({typeName:"create_unique_constraint",schema:ct.object({...J.shape,type:ct.literal("create_unique_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).addUniqueConstraint(t.name,t.columns).execute()}}),Ne=e=>({...e,type:"create_unique_constraint"});import mt from"zod";var pt=y({typeName:"drop_unique_constraint",schema:mt.object({...C.shape,type:mt.literal("drop_unique_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}}),Ae=e=>({...e,type:"drop_unique_constraint"});import ut from"zod";var dt=y({typeName:"create_foreign_key_constraint",schema:ut.object({...Y.shape,type:ut.literal("create_foreign_key_constraint")}),execute:async(e,t)=>{let n=e.schema.alterTable(t.table).addForeignKeyConstraint(t.name,t.columns,t.referencedTable,t.referencedColumns);t.onDelete&&(n=n.onDelete(t.onDelete)),t.onUpdate&&(n=n.onUpdate(t.onUpdate)),await n.execute()}}),we=(e,t)=>({...e,...t,type:"create_foreign_key_constraint"});import yt from"zod";var ft=y({typeName:"drop_foreign_key_constraint",schema:yt.object({...C.shape,type:yt.literal("drop_foreign_key_constraint")}),execute:async(e,t)=>{await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}}),Ee=e=>({...e,type:"drop_foreign_key_constraint"});var gt=[Le,je,ze,Qe,Je,Xe,tt,rt,ot,st,lt,pt,dt,ft],bt=rn.union(gt.map(e=>e.schema));async function ht(e,t){return await an(t.type)(e,t)}function an(e){let t=gt.find(n=>n.typeName===e);if(!t)throw new Error(`Unknown operation type: ${e}`);return t.execute}import*as H from"ramda";import{Graph as on,topologicalSort as sn,CycleError as cn}from"graph-data-structure";var ln=e=>{let t=new Set;return e.forEach(n=>{n.type==="drop_table"&&t.add(n.table)}),t.size===0?e:e.filter(n=>n.type==="drop_table"?!0:!t.has(n.table))},mn=e=>{let t=new Set;if(e.forEach(a=>{a.type==="create_table"&&t.add(a.table)}),t.size===0)return e;let n=new Map,r=new Map,o=[];e.forEach(a=>{a.type==="create_table"&&n.set(a.table,a)}),e.forEach(a=>{switch(a.type){case"create_table":return;case"create_primary_key_constraint":case"create_unique_constraint":if(t.has(a.table)){let c=r.get(a.table)||[];r.set(a.table,[...c,a])}else o.push(a);break;case"create_foreign_key_constraint":if(t.has(a.table)&&a.inline!==!1){let c=n.get(a.table),s=a.columns.filter(i=>!(i in c.columns));if(s.length>0)throw new Error(`Foreign key constraint "${a.name}" references non-existent columns: ${s.join(", ")}`);let m=r.get(a.table)||[];r.set(a.table,[...m,a])}else o.push(a);break;default:o.push(a);break}});let l=[];return n.forEach((a,c)=>{let s=r.get(c)||[];if(s.length===0){l.push(a);return}let m={unique:[],foreignKeys:[]};s.forEach(i=>{switch(i.type){case"create_primary_key_constraint":m.primaryKey=i;break;case"create_unique_constraint":m.unique.push(i);break;case"create_foreign_key_constraint":m.foreignKeys.push(i);break}}),l.push(Be(a.table,a.columns,m))}),[...l,...o]},pn=e=>{let t=new Set;return e.forEach(n=>{(n.type==="drop_unique_constraint"||n.type==="drop_primary_key_constraint")&&t.add(`${n.table}.${n.name}`)}),e.filter(n=>{if(n.type==="drop_index"){let r=`${n.table}.${n.name}`;if(t.has(r))return!1}return!0})},Ke=e=>"table"in e?e.table:null,un=e=>{let t=new Set;return e.forEach(n=>{let r=Ke(n);r&&t.add(r)}),t},dn=e=>{switch(e.type){case"create_foreign_key_constraint":return[{table:e.table,referencedTable:e.referencedTable}];case"create_table_with_constraints":return(e.constraints?.foreignKeys||[]).map(t=>({table:e.table,referencedTable:t.referencedTable}));default:return[]}},yn=e=>{let t=new on;return e.forEach(n=>dn(n).forEach(r=>{r.table!==r.referencedTable&&(n.type!=="create_foreign_key_constraint"||n.inline!==!1)&&t.addEdge(r.referencedTable,r.table)})),t},fn=(e,t)=>{try{let n=yn(t),r=sn(n),o=new Set(r);return[...Array.from(e).filter(a=>!o.has(a)).sort(),...r]}catch(n){throw n instanceof cn?new Error("Circular dependency detected in foreign key constraints. Please resolve this by setting 'inline: false' for one of the foreign key constraints in each circular relationship."):n}},gn=e=>new Map(e.map((t,n)=>[t,n])),bn=e=>(t,n)=>{let r=Ct[t.type],o=Ct[n.type];if(r!==o)return r-o;let l=Ke(t),a=Ke(n);if(l&&a){let c=e.get(l)??Number.MAX_SAFE_INTEGER,s=e.get(a)??Number.MAX_SAFE_INTEGER;if(c!==s)return c-s}return(l||"").localeCompare(a||"")},Ct={drop_foreign_key_constraint:0,drop_unique_constraint:1,drop_primary_key_constraint:2,drop_index:3,drop_column:4,drop_table:5,create_table_with_constraints:6,create_table:7,add_column:8,alter_column:9,create_index:10,create_primary_key_constraint:11,create_unique_constraint:12,create_foreign_key_constraint:13},hn=e=>H.sort(bn(H.pipe(un,t=>fn(t,e),gn)(e)),e),xt=H.pipe(ln,mn,pn,hn);var _t=e=>({getMigrations:async()=>{let t=await e.migrationsResolver(),n={};return t.forEach(r=>{n[r.id]={up:async o=>{for(let l of xt(r.diff.operations))await ht(o,l)}}}),n}}),xn=V.object({operations:V.array(bt).readonly()}),Dn=V.object({id:V.string(),version:V.string(),diff:xn}),M="migrations",Pe=async e=>{let{fs:t}=e;try{let r=(await t.readdir(M)).filter(o=>o.endsWith(".json")).map(async o=>Dn.parse(JSON.parse(await t.readFile(Cn(M,o),"utf-8"))));return await Promise.all(r)}catch(n){if(n instanceof Object&&"code"in n&&n.code==="ENOENT")return[];throw n}},K=async e=>{var c=[];try{let{client:t,fs:n}=e;let r=N(c,t.getDB(),!0);let o=await Pe({fs:n});let l=(await r.introspection.getTables({withInternalKyselyTables:!0})).map(u=>u.name);if(!l.includes(Dt))return o;let a=await r.selectFrom(Dt).select(["name","timestamp"]).$narrowType().execute();return o.filter(u=>!a.some(h=>h.name===u.id))}catch(s){var m=s,i=!0}finally{var p=A(c,m,i);p&&await p}};import{format as Sn}from"sql-formatter";async function Q(e,t){var p=[];try{let{client:n,logger:r}=e;let{reporter:o}=r;let l=N(p,n.getDB({plan:t.plan}),!0);let a=_t({migrationsResolver:async()=>t.plan?await K(e):await Pe(e),options:{plan:t.plan}});let c=new On({db:l,provider:a});let{results:s,error:m}=await c.migrateToLatest();let i=l.getPlannedQueries();if(i.length>0){i.forEach(_=>{r.stdout(t.pretty?Sn(_.sql):_.sql)});return}s&&s.length>0?s.forEach(_=>{_.status==="Error"?o.error(`Migration failed: ${_.migrationName}`):_.status==="Success"&&o.success(`Migration applied: ${_.migrationName}`)}):o.info("No migrations to run");if(m)throw m instanceof Error?m:new Error(`Migration error: ${m}`)}catch(u){var h=u,x=!0}finally{var D=A(p,h,x);D&&await D}}var Ot=_n({meta:{name:"apply",description:"Run migrations to sync database schema"},args:{plan:{type:"boolean",description:"Plan the migration without applying it",default:!1},pretty:{type:"boolean",description:"Pretty print the migration SQL (only for --plan)",default:!1}},run:async e=>{try{let t=await E();await Q(t,{plan:e.args.plan,pretty:e.args.pretty})}catch(t){S.reporter.error(t),process.exit(1)}}});import{defineCommand as Rn}from"citty";import{join as In}from"path";import*as d from"ramda";var U=()=>({added:(e,t,n)=>d.pipe(d.difference(t),d.map(n))(e),removed:(e,t,n)=>d.pipe(d.difference(e),d.map(n))(t),changed:(e,t,n,r)=>d.pipe(d.intersection(e),d.filter(n),d.map(r))(t)}),re=d.prop("name"),Tn=d.eqBy(e=>[e.type,e.notNull??!1,e.primaryKey??!1,e.unique??!1]);function vn(e,t){let n=[],r=U(),o=e.columns,l=t.columns,a=Object.keys(o),c=Object.keys(l);return r.added(a,c,s=>({column:s,attributes:l[s]})).forEach(s=>{n.push(We({table:e.name,column:s.column},s.attributes))}),r.removed(a,c,s=>({column:s,attributes:o[s]})).forEach(s=>{n.push(Ye({table:e.name,column:s.column},s.attributes))}),r.changed(a,c,s=>!Tn(o[s],l[s]),s=>({column:s,before:o[s],after:l[s]})).forEach(s=>{n.push(et({table:e.name,column:s.column},s.before,s.after))}),n}function Nn(e){let{current:t,ideal:n}=e,r=[],o=U(),l=d.map(re,t),a=d.map(re,n);return o.added(l,a,c=>n.find(m=>m.name===c)).forEach(c=>{r.push(Fe(c.name,c.columns))}),o.removed(l,a,d.identity).forEach(c=>{r.push(He(c))}),d.filter(c=>n.some(s=>s.name===c.name))(t).forEach(c=>{let s=n.find(m=>m.name===c.name);r.push(...vn(c,s))}),r}function An(e){let{current:t,ideal:n}=e,r=[],o=U(),l=i=>`${i.table}:${i.name}`,a=new Map(t.map(i=>[l(i),i])),c=new Map(n.map(i=>[l(i),i])),s=Array.from(a.keys()),m=Array.from(c.keys());return o.added(s,m,i=>c.get(i)).forEach(i=>{r.push(Oe(i))}),o.removed(s,m,i=>{let p=a.get(i);return{table:p.table,name:p.name}}).forEach(i=>{r.push(Se(i))}),o.changed(s,m,i=>{let p=a.get(i),u=c.get(i);return!d.equals(p.columns,u.columns)||p.unique!==u.unique},i=>{let p=a.get(i),u=c.get(i);return{current:p,ideal:u}}).forEach(({current:i,ideal:p})=>{r.push(Se(i)),r.push(Oe(p))}),r}function wn(e){let{current:t,ideal:n}=e,r=[],o=U(),l=i=>`${i.table}:${i.name}`,a=new Map(t.map(i=>[l(i),i])),c=new Map(n.map(i=>[l(i),i])),s=Array.from(a.keys()),m=Array.from(c.keys());return o.added(s,m,i=>c.get(i)).forEach(i=>{r.push(Te(i))}),o.removed(s,m,i=>{let p=a.get(i);return{table:p.table,name:p.name}}).forEach(i=>{r.push(ve(i))}),o.changed(s,m,i=>{let p=a.get(i),u=c.get(i);return!d.equals(p.columns,u.columns)},i=>{let p=a.get(i),u=c.get(i);return{current:p,ideal:u}}).forEach(({current:i,ideal:p})=>{r.push(ve(i)),r.push(Te(p))}),r}function En(e){let{current:t,ideal:n}=e,r=[],o=U(),l=i=>`${i.table}:${i.name}`,a=new Map(t.map(i=>[l(i),i])),c=new Map(n.map(i=>[l(i),i])),s=Array.from(a.keys()),m=Array.from(c.keys());return o.added(s,m,i=>c.get(i)).forEach(i=>{r.push(Ne(i))}),o.removed(s,m,i=>{let p=a.get(i);return{table:p.table,name:p.name}}).forEach(i=>{r.push(Ae(i))}),o.changed(s,m,i=>{let p=a.get(i),u=c.get(i);return!d.equals(p.columns,u.columns)},i=>{let p=a.get(i),u=c.get(i);return{current:p,ideal:u}}).forEach(({current:i,ideal:p})=>{r.push(Ae(i)),r.push(Ne(p))}),r}function Kn(e){let t=[],n=U(),r=e.current.map(re),o=e.ideal.map(re);t.push(...n.added(r,o,a=>{let c=e.ideal.find(p=>p.name===a),{table:s,name:m,...i}=c;return we({table:s,name:m},i)})),t.push(...n.removed(r,o,a=>{let c=e.current.find(s=>s.name===a);return Ee(c)}));let l=a=>{let c=e.current.find(m=>m.name===a),s=e.ideal.find(m=>m.name===a);return!c||!s?!1:!(d.equals(c.columns,s.columns)&&c.referencedTable===s.referencedTable&&d.equals(c.referencedColumns,s.referencedColumns)&&c.onDelete===s.onDelete&&c.onUpdate===s.onUpdate)};return t.push(...n.changed(r,o,l,a=>{let c=e.current.find(u=>u.name===a),s=e.ideal.find(u=>u.name===a),{table:m,name:i,...p}=s;return[Ee(c),we({table:m,name:i},p)]}).flat()),t}function St(e){let t=Nn({current:e.current.tables,ideal:e.ideal.tables}),n=An({current:e.current.indexes,ideal:e.ideal.indexes}),r=wn({current:e.current.primaryKeyConstraints,ideal:e.ideal.primaryKeyConstraints}),o=En({current:e.current.uniqueConstraints,ideal:e.ideal.uniqueConstraints}),l=Kn({current:e.current.foreignKeyConstraints,ideal:e.ideal.foreignKeyConstraints});return{operations:[...t,...n,...r,...o,...l]}}var Tt=e=>{let n=w(e.getDialect()).createIntrospectionDriver(e);return{introspect:async o=>{var x=[];try{let l=N(x,e.getDB(),!0);let a=await l.introspection.getTables();let{tables:c,indexes:s,constraints:m}=await n.introspect({config:o});let i=()=>a.map(T=>{let R={};for(let j of T.columns){let se=c.find(Ie=>Ie.table===T.name&&Ie.name===j.name);se&&(R[j.name]={schema:T.schema,table:T.name,name:j.name,dataType:n.convertTypeName(j.dataType),default:se.default??null,characterMaximumLength:se.characterMaximumLength??null,notNull:!j.isNullable})}return{schema:T.schema,name:T.name,columns:R}});let p=T=>!T.table.startsWith("kysely_");let u=()=>s.filter(p);let h=()=>({primaryKey:m.primaryKey.filter(p),unique:m.unique.filter(p),foreignKey:m.foreignKey.filter(p)});return{tables:i(),indexes:u(),constraints:h()}}catch(D){var _=D,P=!0}finally{var ie=A(x,_,P);ie&&await ie}}}};var ae=async(e,t,n)=>{let r=w(t),o=await r.createDevDatabaseProvider().setup(r.parseDevDatabaseConfig(e),n);return{manageType:n,instance:o}};async function Pn(e,t){let{config:n}=e,r=w(n.database.dialect);switch(t.mode){case"dev-start":{let{instance:o,manageType:l}=await ae(n.dev,n.database.dialect,"dev-start");return{manageType:l,manager:o,result:{reused:await o.isAvailable()}}}case"generate-dev":{let o=await r.hasReusableDevDatabase(),{instance:l,manageType:a}=await ae(n.dev,n.database.dialect,o?"dev-start":"one-off");return{manageType:a,manager:l,result:{reused:o}}}}}async function oe(e,t){let{config:n}=e,r=t.logger||xe,{reporter:o}=r;if(!n.dev)throw new Error("Dev database configuration is required");let{manageType:l,manager:a,result:c}=await Pn(e,t);c.reused?o.info("\u{1F504} Reusing existing dev database..."):o.info("\u{1F680} Starting dev database..."),await a.start(),o.success(`Dev database started: ${n.database.dialect}`);let s=ne({database:{dialect:n.database.dialect,connectionString:a.getConnectionString()}}),m=await K(e);return m.length>0?(o.info(`\u{1F504} Applying ${m.length} pending migrations...`),await Q({client:s,logger:xe,fs:e.fs,config:n},{plan:!1,pretty:!1}),o.success(`Applied ${m.length} migrations`)):o.info("No pending migrations found"),{client:s,manager:a,cleanup:async()=>{switch(t.mode){case"dev-start":o.success("Persistent dev database ready: "+n.database.dialect);break;case"generate-dev":l==="dev-start"?o.info("Dev start container remains running"):(await a.stop(),o.success("Temporary dev database stopped"));break}}}}async function qn(e,t){let{logger:n,config:r,fs:o}=e,{reporter:l}=n;t.squash&&await kn(e);let{client:a,cleanup:c}=t.dev?await oe(e,{mode:"generate-dev",logger:n}):{client:e.client,cleanup:async()=>{}};try{if(!t.ignorePending){let p=await K(e);if(p.length>0)if(t.dev)l.info(`Dev database has ${p.length} pending migrations. These will be applied automatically as baseline.`);else{l.warn([`There are pending migrations: ${p.map(u=>u.id).join(", ")}`,"Please apply them first before generating a new migration.","Otherwise, use --ignore-pending to skip this check."].join(`
93
+ `));return}}let s=await $n({client:a,config:r});if(!s){l.info("No changes detected, no migration needed.");return}Mn(n,s.diff);let m=`${M}/${s.id}.json`;await o.mkdir(M,{recursive:!0}),await o.writeFile(m,JSON.stringify(s,null,2));let i=t.squash?`Generated squashed migration: ${m}`:`Migration file generated: ${m}`;l.success(i),t.dev&&await Q({...e,client:a},{plan:!1,pretty:!1})}finally{await c()}}var kn=async e=>{let{logger:t,fs:n}=e,{reporter:r}=t,o=await K(e);if(o.length===0){r.info("No pending migrations found, nothing to squash.");return}r.info(`Found ${o.length} pending migrations to squash:`),o.forEach(a=>{r.info(` - ${a.id}.json`)});let l=o.map(a=>In(M,`${a.id}.json`));try{await Promise.all(l.map(a=>n.unlink(a))),r.success(`\u{1F5D1}\uFE0F Removed ${l.length} pending migration files`)}catch(a){throw new Error(`Failed to remove pending migration files: ${a}`)}},$n=async e=>{let{client:t,config:n}=e,r=Tt(t),{tables:o,indexes:l,constraints:a}=await r.introspect(n),c=(u,h)=>x=>x.some(D=>D.table===u&&D.columns.length===1&&D.columns[0]===h),s=o.map(u=>({name:u.name,columns:Object.fromEntries(Object.entries(u.columns).map(([h,x])=>{let D=c(u.name,h),_=D(a.primaryKey),P=D(a.unique),T=a.primaryKey.some(R=>R.table===u.name&&R.columns.length>1&&R.columns.includes(h))?!0:x.notNull;return[h,{type:x.dataType,notNull:T,defaultSql:x.default??void 0,primaryKey:_,unique:P}]}))})),m=n.tables.map(u=>({name:u.tableName,columns:Object.fromEntries(Object.entries(u.columns).map(([h,x])=>{let D=(n.primaryKeyConstraints??[]).some(P=>P.table===u.tableName&&P.columns.includes(h)),_=x.primaryKey||x.notNull||D;return[h,{...x,notNull:_}]}))})),i=St({current:{tables:s,indexes:l,uniqueConstraints:a.unique,primaryKeyConstraints:a.primaryKey,foreignKeyConstraints:a.foreignKey},ideal:{...n,tables:m}});return i.operations.length===0?null:{version:"1",id:Date.now()+"",diff:i}},Mn=(e,t)=>{let n=[];t.operations.forEach(r=>{switch(r.type){case"create_table":n.push(`-- create_table: ${r.table}`),Object.entries(r.columns).forEach(([o,l])=>{n.push(` -> column: ${o} (${JSON.stringify(l)})`)});break;case"drop_table":n.push(`-- remove_table: ${r.table}`);break;case"add_column":n.push([`-- add_column: ${r.table}.${r.column}`,` -> to: ${JSON.stringify(r.attributes)}`].join(`
94
94
  `));break;case"drop_column":n.push(`-- remove_column: ${r.table}.${r.column}`);break;case"alter_column":n.push([`-- change_column: ${r.table}.${r.column}`,` -> from: ${JSON.stringify(r.before)}`,` -> to: ${JSON.stringify(r.after)}`].join(`
95
95
  `));break;case"create_index":n.push(`-- create_index: ${r.table}.${r.name} (${r.columns.join(", ")})${r.unique?" [unique]":""}`);break;case"drop_index":n.push(`-- drop_index: ${r.table}.${r.name}`);break;case"create_primary_key_constraint":n.push(`-- create_primary_key_constraint: ${r.table}.${r.name} (${r.columns.join(", ")})`);break;case"drop_primary_key_constraint":n.push(`-- drop_primary_key_constraint: ${r.table}.${r.name}`);break;case"create_unique_constraint":n.push(`-- create_unique_constraint: ${r.table}.${r.name} (${r.columns.join(", ")})`);break;case"drop_unique_constraint":n.push(`-- drop_unique_constraint: ${r.table}.${r.name}`);break;case"create_foreign_key_constraint":n.push(`-- create_foreign_key_constraint: ${r.table}.${r.name} (${r.columns.join(", ")}) -> ${r.referencedTable} (${r.referencedColumns.join(", ")})${r.onDelete?` ON DELETE ${r.onDelete.toUpperCase()}`:""}${r.onUpdate?` ON UPDATE ${r.onUpdate.toUpperCase()}`:""}`);break;case"drop_foreign_key_constraint":n.push(`-- drop_foreign_key_constraint: ${r.table}.${r.name}`);break;default:break}}),e.reporter.log(n.join(`
96
- `))},vt=In({meta:{name:"generate",description:"Generate migration files based on the current schema"},args:{"ignore-pending":{type:"boolean",description:"Ignore pending migrations and generate a new one",default:!1},dev:{type:"boolean",description:"Use dev database for safe migration generation",default:!1},squash:{type:"boolean",description:"Consolidate pending migrations into a single migration file",default:!1}},run:async e=>{try{let t=await E();await Un(t,{ignorePending:e.args["ignore-pending"],dev:e.args.dev,squash:e.args.squash})}catch(t){T.reporter.error(t),process.exit(1)}}});import{defineCommand as W}from"citty";async function Bn(e){let{manager:t,logger:n}=e,r=await t.getStatus();if(!r||r.type!=="container"){n.reporter.info("No running dev containers found");return}n.reporter.info(`Running: ${r.containerID} (${r.imageName})`)}async function zn(e){let{manager:t,logger:n}=e;if(!await t.isAvailable()){n.reporter.info("No running dev containers found");return}await t.start(),console.log(t.getConnectionString())}async function Hn(e){let{manager:t,logger:n}=e;if(!await t.isAvailable()){n.reporter.info("No dev containers found");return}await t.remove(),n.reporter.success("Cleaned up dev containers")}async function Vn(e){let{logger:t}=e,{reporter:n}=t,{manager:r}=await oe(e,{mode:"dev-start",logger:t});n.success(`\u2728 Dev database ready: ${r.getConnectionString()}`)}async function Pe(){let e=await E();if(!e.config.dev)throw new Error("No dev database configuration found");let{instance:t}=await ae(e.config.dev,e.config.database.dialect,"dev-start");return{...e,manager:t}}var Qn=W({meta:{name:"start",description:"Start development database with migrations applied"},run:async()=>{try{let e=await E();await Vn(e)}catch(e){T.reporter.error(e),process.exit(1)}}}),Wn=W({meta:{name:"status",description:"Show status of kyrage dev container"},run:async()=>{try{let e=await Pe();await Bn(e)}catch(e){T.reporter.error(e),process.exit(1)}}}),Gn=W({meta:{name:"get-url",description:"Print connection URL for running dev container"},run:async()=>{try{let e=await Pe();await zn(e)}catch(e){T.reporter.error(e),process.exit(1)}}}),Jn=W({meta:{name:"clean",description:"Remove all kyrage dev containers"},run:async()=>{try{let e=await Pe();await Hn(e)}catch(e){T.reporter.error(e),process.exit(1)}}}),Nt=W({meta:{name:"dev",description:"Manage development database containers"},subCommands:{start:Qn,status:Wn,"get-url":Gn,clean:Jn}});var Xn=Yn({meta:{name:"kyrage",version:qe,description:"Kysely migration CLI with declarative schema"},subCommands:{apply:Ot,generate:vt,dev:Nt}});Zn(Xn);
96
+ `))},vt=Rn({meta:{name:"generate",description:"Generate migration files based on the current schema"},args:{"ignore-pending":{type:"boolean",description:"Ignore pending migrations and generate a new one",default:!1},dev:{type:"boolean",description:"Use dev database for safe migration generation",default:!1},squash:{type:"boolean",description:"Consolidate pending migrations into a single migration file",default:!1}},run:async e=>{try{let t=await E();await qn(t,{ignorePending:e.args["ignore-pending"],dev:e.args.dev,squash:e.args.squash})}catch(t){S.reporter.error(t),process.exit(1)}}});import{defineCommand as W}from"citty";async function Un(e){let{manager:t,logger:n}=e,r=await t.getStatus();if(!r||r.type!=="container"){n.reporter.info("No running dev containers found");return}n.reporter.info(`Running: ${r.containerID} (${r.imageName})`)}async function jn(e){let{manager:t,logger:n}=e;if(!await t.isAvailable()){n.reporter.info("No running dev containers found");return}await t.start(),console.log(t.getConnectionString())}async function Fn(e){let{manager:t,logger:n}=e;if(!await t.isAvailable()){n.reporter.info("No dev containers found");return}await t.remove(),n.reporter.success("Cleaned up dev containers")}async function Ln(e){let{logger:t}=e,{reporter:n}=t,{manager:r}=await oe(e,{mode:"dev-start",logger:t});n.success(`\u2728 Dev database ready: ${r.getConnectionString()}`)}async function Re(){let e=await E();if(!e.config.dev)throw new Error("No dev database configuration found");let{instance:t}=await ae(e.config.dev,e.config.database.dialect,"dev-start");return{...e,manager:t}}var Bn=W({meta:{name:"start",description:"Start development database with migrations applied"},run:async()=>{try{let e=await E();await Ln(e)}catch(e){S.reporter.error(e),process.exit(1)}}}),zn=W({meta:{name:"status",description:"Show status of kyrage dev container"},run:async()=>{try{let e=await Re();await Un(e)}catch(e){S.reporter.error(e),process.exit(1)}}}),Hn=W({meta:{name:"get-url",description:"Print connection URL for running dev container"},run:async()=>{try{let e=await Re();await jn(e)}catch(e){S.reporter.error(e),process.exit(1)}}}),Vn=W({meta:{name:"clean",description:"Remove all kyrage dev containers"},run:async()=>{try{let e=await Re();await Fn(e)}catch(e){S.reporter.error(e),process.exit(1)}}}),Nt=W({meta:{name:"dev",description:"Manage development database containers"},subCommands:{start:Bn,status:zn,"get-url":Hn,clean:Vn}});var Gn=Qn({meta:{name:"kyrage",version:qe,description:"Kysely migration CLI with declarative schema"},subCommands:{apply:Ot,generate:vt,dev:Nt}});Wn(Gn);
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@izumisy/kyrage",
3
3
  "private": false,
4
4
  "type": "module",
5
- "version": "1.5.0",
5
+ "version": "1.5.2",
6
6
  "description": "A minimal, schema-based declarative migration tool for Node.js ecosystem",
7
7
  "author": "Seiya Izumi (https://github.com/IzumiSy)",
8
8
  "license": "MIT",
@@ -30,20 +30,20 @@
30
30
  "kyrage": "./dist/main.js"
31
31
  },
32
32
  "dependencies": {
33
- "@testcontainers/cockroachdb": "^11.5.1",
34
- "@testcontainers/postgresql": "^11.5.1",
35
- "better-sqlite3": "^12.2.0",
33
+ "@testcontainers/cockroachdb": "^11.7.1",
34
+ "@testcontainers/postgresql": "^11.7.1",
35
+ "better-sqlite3": "^12.4.1",
36
36
  "c12": "^3.3.0",
37
37
  "citty": "^0.1.6",
38
38
  "consola": "^3.4.2",
39
39
  "graph-data-structure": "^4.5.0",
40
- "kysely": "^0.28.7",
41
- "mysql2": "^3.15.0",
40
+ "kysely": "^0.28.8",
41
+ "mysql2": "^3.15.2",
42
42
  "pg": "^8.16.3",
43
43
  "ramda": "^0.31.3",
44
- "sql-formatter": "^15.6.9",
45
- "testcontainers": "^11.5.1",
46
- "zod": "^4.1.11"
44
+ "sql-formatter": "^15.6.10",
45
+ "testcontainers": "^11.7.1",
46
+ "zod": "^4.1.12"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@swc/core": "^1.13.5",
@@ -51,7 +51,7 @@
51
51
  "@types/node": "^24",
52
52
  "@types/pg": "^8.15.5",
53
53
  "@types/ramda": "^0.31.1",
54
- "memfs": "^4.39.0",
54
+ "memfs": "^4.49.0",
55
55
  "prettier": "^3",
56
56
  "tsup": "^8.5.0",
57
57
  "typescript": "^5",