@izumisy/kyrage 1.2.1 → 1.2.3

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/index.d.ts CHANGED
@@ -20,8 +20,6 @@ declare const databaseSchema: z.ZodObject<{
20
20
  dialect: z.ZodEnum<{
21
21
  postgres: "postgres";
22
22
  cockroachdb: "cockroachdb";
23
- mysql: "mysql";
24
- sqlite: "sqlite";
25
23
  }>;
26
24
  connectionString: z.ZodString;
27
25
  }, z.core.$strip>;
package/dist/main.js CHANGED
@@ -1,101 +1,96 @@
1
- import{a as ie,b as L}from"./chunk-3M6BYRKC.js";import{a as _,b as x}from"./chunk-EY62Q3Z2.js";import{defineCommand as Vt,runMain as zt}from"citty";var se="1.2.1";import{defineCommand as pt}from"citty";import y from"zod";import{loadConfig as we}from"c12";import u from"zod";var T=u.object({type:u.string()}).catchall(u.any()),D=u.object({table:u.string(),name:u.string()}),B=u.object({table:u.string(),column:u.string()}),F=u.object({...D.shape,columns:u.array(u.string()).readonly()}),H=u.object({...D.shape,columns:u.array(u.string()).readonly()}),ce=u.enum(["cascade","set null","set default","restrict","no action"]),W=u.object({...D.shape,columns:u.array(u.string()).readonly(),referencedTable:u.string(),referencedColumns:u.array(u.string()).readonly(),onDelete:ce.optional(),onUpdate:ce.optional()}),le=u.discriminatedUnion("type",[u.object({type:u.literal("create_table"),table:u.string(),columns:u.record(u.string(),T)}),u.object({type:u.literal("drop_table"),table:u.string()}),u.object({...B.shape,type:u.literal("add_column"),attributes:T}),u.object({...B.shape,type:u.literal("drop_column"),attributes:T}),u.object({...B.shape,type:u.literal("alter_column"),before:T,after:T}),u.object({...D.shape,type:u.literal("create_index"),columns:u.array(u.string()).readonly(),unique:u.boolean()}),u.object({...D.shape,type:u.literal("drop_index")}),u.object({...F.shape,type:u.literal("create_primary_key_constraint")}),u.object({...D.shape,type:u.literal("drop_primary_key_constraint")}),u.object({...H.shape,type:u.literal("create_unique_constraint")}),u.object({...D.shape,type:u.literal("drop_unique_constraint")}),u.object({...W.shape,type:u.literal("create_foreign_key_constraint")}),u.object({...D.shape,type:u.literal("drop_foreign_key_constraint")})]),f={createTable:(e,t)=>({type:"create_table",table:e,columns:t}),dropTable:e=>({type:"drop_table",table:e}),addColumn:(e,t)=>({...e,type:"add_column",attributes:t}),dropColumn:(e,t)=>({...e,type:"drop_column",attributes:t}),alterColumn:(e,t,n)=>({...e,type:"alter_column",before:t,after:n}),createIndex:e=>({...e,type:"create_index"}),dropIndex:e=>({...e,type:"drop_index"}),createPrimaryKeyConstraint:e=>({...e,type:"create_primary_key_constraint"}),dropPrimaryKeyConstraint:e=>({...e,type:"drop_primary_key_constraint"}),createUniqueConstraint:e=>({...e,type:"create_unique_constraint"}),dropUniqueConstraint:e=>({...e,type:"drop_unique_constraint"}),createForeignKeyConstraint:(e,t)=>({...e,...t,type:"create_foreign_key_constraint"}),dropForeignKeyConstraint:e=>({...e,type:"drop_foreign_key_constraint"})};var ve=y.object({type:y.string(),primaryKey:y.boolean().optional().default(!1),notNull:y.boolean().optional().default(!1),unique:y.boolean().optional().default(!1),defaultSql:y.string().optional()}),Te=y.object({tableName:y.string(),columns:y.record(y.string(),ve)}),Oe=y.object({...D.shape,columns:y.array(y.string()).readonly(),unique:y.boolean().default(!1)}),Ae=y.enum(["postgres","cockroachdb","mysql","sqlite"]),Ke=y.object({dialect:Ae,connectionString:y.string()}),Re=y.union([y.object({container:y.object({image:y.string(),name:y.string().optional()})}),y.object({connectionString:y.string()})]).optional(),qe=y.object({database:Ke,dev:Re,tables:y.array(Te).readonly(),indexes:y.array(Oe).readonly(),primaryKeyConstraints:y.array(F).readonly(),uniqueConstraints:y.array(H).readonly(),foreignKeyConstraints:y.array(W).readonly()}),me=async()=>{let e=await we({name:"kyrage"});return qe.parse(e.config)};import{Kysely as $e,MysqlDialect as Me,PostgresDialect as je,SqliteDialect as Ue}from"kysely";import{Pool as ue}from"pg";import{createPool as Le}from"mysql2";import Be from"better-sqlite3";import{PostgresAdapter as Pe,PostgresDialect as Ie}from"kysely";var Q=class extends Pe{async acquireMigrationLock(t,n){await t.selectFrom(n.lockTable).selectAll().forUpdate().execute()}},P=class extends Ie{createAdapter(){return new Q}};import{DummyDriver as ke}from"kysely";var I=class extends ke{constructor(n){super();this.queries=n}async acquireConnection(){return new V(this.queries)}},V=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 Fe=e=>{switch(e.dialect){case"cockroachdb":return new P({pool:new ue({connectionString:e.connectionString})});case"postgres":return new je({pool:new ue({connectionString:e.connectionString})});case"mysql":return new Me({pool:Le(e.connectionString)});case"sqlite":return new Ue({database:new Be(e.connectionString)});default:throw new Error(`Unsupported dialect: ${e.dialect}`)}},k=e=>new z({databaseProps:e.database,options:e.options}),z=class{constructor(t){this.constructorProps=t}getDB(t){let n=Fe(this.constructorProps.databaseProps);return new J({dialect:{createAdapter:()=>n.createAdapter(),createDriver:()=>n.createDriver(),createIntrospector:a=>n.createIntrospector(a),createQueryCompiler:()=>n.createQueryCompiler()}},{isPlan:t?.plan===!0})}getDialect(){return this.constructorProps.databaseProps.dialect}},J=class extends $e{constructor(n,a){let o=[];super({dialect:{...n.dialect,createDriver:()=>a.isPlan?new I(o):n.dialect.createDriver()}});this.plannedQueries=[];this.plannedQueries=o}getPlannedQueries(){return this.plannedQueries}};async function S(){let e=await me();return{client:k({database:e.database}),logger:ie,config:e}}import{Migrator as dt}from"kysely";import{DEFAULT_MIGRATION_TABLE as pe,isColumnDataType as He,sql as ye}from"kysely";import{readdir as We,readFile as Qe}from"fs/promises";import{join as Ve}from"path";import O from"zod";var w="migrations",ze=O.object({operations:O.array(le).readonly()}),Je=O.object({id:O.string(),version:O.string(),diff:ze}),Y=async()=>{try{let t=(await We(w)).filter(n=>n.endsWith(".json")).map(async n=>Je.parse(JSON.parse(await Qe(Ve(w,n),"utf-8"))));return await Promise.all(t)}catch(e){if(e instanceof Object&&"code"in e&&e.code==="ENOENT")return[];throw e}},E=async e=>{var l=[];try{let t=_(l,e.getDB(),!0);let n=await Y();let a=(await t.introspection.getTables({withInternalKyselyTables:!0})).map(r=>r.name);if(!a.includes(pe))return n;let o=await t.selectFrom(pe).select(["name","timestamp"]).$narrowType().execute();return n.filter(r=>!o.some(p=>p.name===r.id))}catch(c){var i=c,s=!0}finally{var d=x(l,i,s);d&&await d}},ge=e=>({getMigrations:async()=>{let t=await e.migrationsResolver(),n={};return t.forEach(a=>{n[a.id]={up:async()=>{await Ye(e.db,a.diff)}}}),n}});async function Ye(e,t){let n=ut(t.operations);for(let a of n)await Ge(e,a)}async function Ge(e,t){switch(t.type){case"create_table":return Xe(e,t);case"drop_table":return Ze(e,t);case"add_column":return et(e,t);case"drop_column":return tt(e,t);case"alter_column":return nt(e,t);case"create_index":return at(e,t);case"drop_index":return rt(e,t);case"create_primary_key_constraint":return ot(e,t);case"drop_primary_key_constraint":return it(e,t);case"create_unique_constraint":return st(e,t);case"drop_unique_constraint":return ct(e,t);case"create_foreign_key_constraint":return lt(e,t);case"drop_foreign_key_constraint":return mt(e,t);default:throw new Error(`Unknown operation type: ${t.type}`)}}async function Xe(e,t){let n=e.schema.createTable(t.table);for(let[a,o]of Object.entries(t.columns)){let l=o.type;G(l),n=n.addColumn(a,l,c=>{let i=c;return o.notNull&&(i=i.notNull()),typeof o.defaultSql=="string"&&(i=i.defaultTo(ye.raw(o.defaultSql))),i})}await n.execute()}async function Ze(e,t){await e.schema.dropTable(t.table).execute()}async function et(e,t){let n=t.attributes.type;G(n),await e.schema.alterTable(t.table).addColumn(t.column,n,a=>{let o=a;return t.attributes.notNull&&(o=o.notNull()),typeof t.attributes.defaultSql=="string"&&(o=o.defaultTo(ye.raw(t.attributes.defaultSql))),o}).execute()}async function tt(e,t){await e.schema.alterTable(t.table).dropColumn(t.column).execute()}async function nt(e,t){let{table:n,column:a,before:o,after:l}=t;if(o.type!==l.type){let c=l.type;G(c),await e.schema.alterTable(n).alterColumn(a,i=>i.setDataType(c)).execute()}l.notNull!==o.notNull&&(l.notNull?await e.schema.alterTable(n).alterColumn(a,c=>c.setNotNull()).execute():await e.schema.alterTable(n).alterColumn(a,c=>c.dropNotNull()).execute())}async function at(e,t){let n=e.schema.createIndex(t.name).on(t.table);for(let a of t.columns)n=n.column(a);t.unique&&(n=n.unique()),await n.execute()}async function rt(e,t){await e.schema.dropIndex(t.name).execute()}async function ot(e,t){await e.schema.alterTable(t.table).addPrimaryKeyConstraint(t.name,t.columns).execute()}async function it(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}async function st(e,t){await e.schema.alterTable(t.table).addUniqueConstraint(t.name,t.columns).execute()}async function ct(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}async function lt(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()}async function mt(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}var G=e=>{if(!He(e))throw new Error(`Unsupported data type: ${e}`)},de={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:6,add_column:7,alter_column:8,create_index:9,create_primary_key_constraint:10,create_unique_constraint:11,create_foreign_key_constraint:12},ut=e=>e.slice().sort((t,n)=>{let a=de[t.type],o=de[n.type];return a!==o?a-o:t.table.localeCompare(n.table)});import{format as yt}from"sql-formatter";async function A(e,t){var r=[];try{let{client:n,logger:a}=e;let{reporter:o}=a;let l=_(r,n.getDB({plan:t.plan}),!0);let c=new dt({db:l,provider:ge({db:l,migrationsResolver:async()=>t.plan?await E(n):await Y(),options:{plan:t.plan}})});let{results:i,error:s}=await c.migrateToLatest();let d=l.getPlannedQueries();if(d.length>0){d.forEach(b=>{a.stdout(t.pretty?yt(b.sql):b.sql)});return}i&&i.length>0?i.forEach(b=>{b.status==="Error"?o.error(`Migration failed: ${b.migrationName}`):b.status==="Success"&&o.success(`Migration applied: ${b.migrationName}`)}):o.info("No migrations to run");if(s)throw s instanceof Error?s:new Error(`Migration error: ${s}`)}catch(p){var m=p,h=!0}finally{var C=x(r,m,h);C&&await C}}var fe=pt({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 S();await A(t,{plan:e.args.plan,pretty:e.args.pretty})}catch(t){let{defaultConsolaLogger:n}=await import("./logger-SE7G5AMI.js");n.reporter.error(t),process.exit(1)}}});import{defineCommand as At}from"citty";import{mkdir as Kt,writeFile as Rt,unlink as qt}from"fs/promises";import{join as Pt}from"path";import*as g from"ramda";var v=()=>({added:(e,t,n)=>g.pipe(g.difference(t),g.map(n))(e),removed:(e,t,n)=>g.pipe(g.difference(e),g.map(n))(t),changed:(e,t,n,a)=>g.pipe(g.intersection(e),g.filter(n),g.map(a))(t)}),$=g.prop("name"),gt=g.eqBy(e=>[e.type,e.notNull??!1,e.primaryKey??!1,e.unique??!1]);function ft(e,t){let n=[],a=v(),o=e.columns,l=t.columns,c=Object.keys(o),i=Object.keys(l);return a.added(c,i,s=>({column:s,attributes:l[s]})).forEach(s=>{n.push(f.addColumn({table:e.name,column:s.column},s.attributes))}),a.removed(c,i,s=>({column:s,attributes:o[s]})).forEach(s=>{n.push(f.dropColumn({table:e.name,column:s.column},s.attributes))}),a.changed(c,i,s=>!gt(o[s],l[s]),s=>({column:s,before:o[s],after:l[s]})).forEach(s=>{n.push(f.alterColumn({table:e.name,column:s.column},s.before,s.after))}),n}function bt(e){let{current:t,ideal:n}=e,a=[],o=v(),l=g.map($,t),c=g.map($,n);return o.added(l,c,i=>n.find(d=>d.name===i)).forEach(i=>{a.push(f.createTable(i.name,i.columns))}),o.removed(l,c,g.identity).forEach(i=>{a.push(f.dropTable(i))}),g.filter(i=>n.some(s=>s.name===i.name))(t).forEach(i=>{let s=n.find(d=>d.name===i.name);a.push(...ft(i,s))}),a}function Ct(e){let{current:t,ideal:n}=e,a=[],o=v(),l=r=>`${r.table}:${r.name}`,c=new Map(t.map(r=>[l(r),r])),i=new Map(n.map(r=>[l(r),r])),s=Array.from(c.keys()),d=Array.from(i.keys());return o.added(s,d,r=>i.get(r)).forEach(r=>{a.push(f.createIndex(r))}),o.removed(s,d,r=>{let p=c.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropIndex(r))}),o.changed(s,d,r=>{let p=c.get(r),m=i.get(r);return!g.equals(p.columns,m.columns)||p.unique!==m.unique},r=>{let p=c.get(r),m=i.get(r);return{current:p,ideal:m}}).forEach(({current:r,ideal:p})=>{a.push(f.dropIndex(r)),a.push(f.createIndex(p))}),a}function ht(e){let{current:t,ideal:n}=e,a=[],o=v(),l=r=>`${r.table}:${r.name}`,c=new Map(t.map(r=>[l(r),r])),i=new Map(n.map(r=>[l(r),r])),s=Array.from(c.keys()),d=Array.from(i.keys());return o.added(s,d,r=>i.get(r)).forEach(r=>{a.push(f.createPrimaryKeyConstraint(r))}),o.removed(s,d,r=>{let p=c.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropPrimaryKeyConstraint(r))}),o.changed(s,d,r=>{let p=c.get(r),m=i.get(r);return!g.equals(p.columns,m.columns)},r=>{let p=c.get(r),m=i.get(r);return{current:p,ideal:m}}).forEach(({current:r,ideal:p})=>{a.push(f.dropPrimaryKeyConstraint(r)),a.push(f.createPrimaryKeyConstraint(p))}),a}function _t(e){let{current:t,ideal:n}=e,a=[],o=v(),l=r=>`${r.table}:${r.name}`,c=new Map(t.map(r=>[l(r),r])),i=new Map(n.map(r=>[l(r),r])),s=Array.from(c.keys()),d=Array.from(i.keys());return o.added(s,d,r=>i.get(r)).forEach(r=>{a.push(f.createUniqueConstraint(r))}),o.removed(s,d,r=>{let p=c.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropUniqueConstraint(r))}),o.changed(s,d,r=>{let p=c.get(r),m=i.get(r);return!g.equals(p.columns,m.columns)},r=>{let p=c.get(r),m=i.get(r);return{current:p,ideal:m}}).forEach(({current:r,ideal:p})=>{a.push(f.dropUniqueConstraint(r)),a.push(f.createUniqueConstraint(p))}),a}function xt(e){let t=[],n=v(),a=e.current.map($),o=e.ideal.map($);t.push(...n.added(a,o,c=>{let i=e.ideal.find(p=>p.name===c),{table:s,name:d,...r}=i;return f.createForeignKeyConstraint({table:s,name:d},r)})),t.push(...n.removed(a,o,c=>{let i=e.current.find(s=>s.name===c);return f.dropForeignKeyConstraint(i)}));let l=c=>{let i=e.current.find(d=>d.name===c),s=e.ideal.find(d=>d.name===c);return!i||!s?!1:!(g.equals(i.columns,s.columns)&&i.referencedTable===s.referencedTable&&g.equals(i.referencedColumns,s.referencedColumns)&&i.onDelete===s.onDelete&&i.onUpdate===s.onUpdate)};return t.push(...n.changed(a,o,l,c=>{let i=e.current.find(m=>m.name===c),s=e.ideal.find(m=>m.name===c),{table:d,name:r,...p}=s;return[f.dropForeignKeyConstraint(i),f.createForeignKeyConstraint({table:d,name:r},p)]}).flat()),t}function be(e){let t=bt({current:e.current.tables,ideal:e.ideal.tables}),n=Ct({current:e.current.indexes,ideal:e.ideal.indexes}),a=ht({current:e.current.primaryKeyConstraints,ideal:e.ideal.primaryKeyConstraints}),o=_t({current:e.current.uniqueConstraints,ideal:e.ideal.uniqueConstraints}),l=xt({current:e.current.foreignKeyConstraints,ideal:e.ideal.foreignKeyConstraints});return{operations:[...t,...n,...a,...o,...l]}}import{sql as X}from"kysely";var Dt={bool:"boolean",int2:"smallint",int4:"integer",int8:"bigint"},St=e=>Dt[e]??e,Ce=e=>({introspectTables:async()=>{var i=[];try{let o=e.client;let l=_(i,o.getDB(),!0);let{rows:c}=await X`
2
- SELECT
3
- n.nspname AS table_schema,
4
- c.relname AS table_name,
5
- a.attname AS column_name,
6
- pg_get_expr(d.adbin, d.adrelid) AS column_default,
7
- CASE
8
- WHEN t.typname = 'varchar' OR t.typname = 'char' THEN a.atttypmod - 4
1
+ import{a as ye,b as Q}from"./chunk-3M6BYRKC.js";import{a as N,b as E}from"./chunk-EY62Q3Z2.js";import{defineCommand as tn,runMain as nn}from"citty";var ge="1.2.3";import{defineCommand as Et}from"citty";import y from"zod";import{loadConfig as Pe}from"c12";import m from"zod";var P=m.object({type:m.string()}).catchall(m.any()),_=m.object({table:m.string(),name:m.string()}),V=m.object({table:m.string(),column:m.string()}),z=m.object({..._.shape,columns:m.array(m.string()).readonly()}),W=m.object({..._.shape,columns:m.array(m.string()).readonly()}),fe=m.enum(["cascade","set null","set default","restrict","no action"]),J=m.object({..._.shape,columns:m.array(m.string()).readonly(),referencedTable:m.string(),referencedColumns:m.array(m.string()).readonly(),onDelete:fe.optional(),onUpdate:fe.optional()}),be=m.discriminatedUnion("type",[m.object({type:m.literal("create_table"),table:m.string(),columns:m.record(m.string(),P)}),m.object({type:m.literal("drop_table"),table:m.string()}),m.object({...V.shape,type:m.literal("add_column"),attributes:P}),m.object({...V.shape,type:m.literal("drop_column"),attributes:P}),m.object({...V.shape,type:m.literal("alter_column"),before:P,after:P}),m.object({..._.shape,type:m.literal("create_index"),columns:m.array(m.string()).readonly(),unique:m.boolean()}),m.object({..._.shape,type:m.literal("drop_index")}),m.object({...z.shape,type:m.literal("create_primary_key_constraint")}),m.object({..._.shape,type:m.literal("drop_primary_key_constraint")}),m.object({...W.shape,type:m.literal("create_unique_constraint")}),m.object({..._.shape,type:m.literal("drop_unique_constraint")}),m.object({...J.shape,type:m.literal("create_foreign_key_constraint")}),m.object({..._.shape,type:m.literal("drop_foreign_key_constraint")})]),f={createTable:(e,t)=>({type:"create_table",table:e,columns:t}),dropTable:e=>({type:"drop_table",table:e}),addColumn:(e,t)=>({...e,type:"add_column",attributes:t}),dropColumn:(e,t)=>({...e,type:"drop_column",attributes:t}),alterColumn:(e,t,n)=>({...e,type:"alter_column",before:t,after:n}),createIndex:e=>({...e,type:"create_index"}),dropIndex:e=>({...e,type:"drop_index"}),createPrimaryKeyConstraint:e=>({...e,type:"create_primary_key_constraint"}),dropPrimaryKeyConstraint:e=>({...e,type:"drop_primary_key_constraint"}),createUniqueConstraint:e=>({...e,type:"create_unique_constraint"}),dropUniqueConstraint:e=>({...e,type:"drop_unique_constraint"}),createForeignKeyConstraint:(e,t)=>({...e,...t,type:"create_foreign_key_constraint"}),dropForeignKeyConstraint:e=>({...e,type:"drop_foreign_key_constraint"})};var qe=y.object({type:y.string(),primaryKey:y.boolean().optional().default(!1),notNull:y.boolean().optional().default(!1),unique:y.boolean().optional().default(!1),defaultSql:y.string().optional()}),Ie=y.object({tableName:y.string(),columns:y.record(y.string(),qe)}),ke=y.object({..._.shape,columns:y.array(y.string()).readonly(),unique:y.boolean().default(!1)}),$e=y.enum(["postgres","cockroachdb"]),Me=y.object({dialect:$e,connectionString:y.string()}),Ue=y.union([y.object({container:y.object({image:y.string(),name:y.string().optional()})}),y.object({connectionString:y.string()})]).optional(),je=y.object({database:Me,dev:Ue,tables:y.array(Ie).readonly(),indexes:y.array(ke).readonly(),primaryKeyConstraints:y.array(z).readonly(),uniqueConstraints:y.array(W).readonly(),foreignKeyConstraints:y.array(J).readonly()}),Ce=async()=>{let e=await Pe({name:"kyrage"});return je.parse(e.config)};import{Kysely as et}from"kysely";import{PostgresDialect as Le,sql as Y}from"kysely";import{Pool as Fe}from"pg";import{PostgreSqlContainer as Be}from"@testcontainers/postgresql";import*as D from"ramda";var M=class{getName(){return"postgres"}getDevDatabaseImageName(){return"postgres:16"}createKyselyDialect(t){return new Le({pool:new Fe({connectionString:t})})}createIntrospectionDriver(t){return{convertTypeName:X,introspect:G(t)}}createDevDatabaseContainer(t){return new Be(t)}},G=e=>async t=>{var i=[];try{let n=N(i,e.getDB(),!0);let[a,o,l]=await Promise.all([Qe(n),Ve(n),ze(n)]);let{indexes:c,uniqueConstraints:s}=He(t.config,{indexes:o,constraints:l});return{tables:a,indexes:c,constraints:{...l,unique:s}}}catch(u){var r=u,p=!0}finally{var d=E(i,r,p);d&&await d}},He=(e,t)=>{let n=u=>r=>D.any(D.whereEq({name:r.name,table:r.table}),u),[a,o]=D.partition(n(e.uniqueConstraints),t.constraints.unique),[l,c]=D.partition(n(e.indexes),t.indexes),s=D.reject(n(l),o),i=D.reject(n(a),c);return{indexes:[...l,...i],uniqueConstraints:[...a,...s]}},X=e=>({bool:"boolean",int2:"smallint",int4:"integer",int8:"bigint"})[e]??e,Qe=async e=>{let{rows:t}=await Y`
2
+ SELECT
3
+ n.nspname AS table_schema,
4
+ c.relname AS table_name,
5
+ a.attname AS column_name,
6
+ pg_get_expr(d.adbin, d.adrelid) AS column_default,
7
+ CASE
8
+ WHEN t.typname = 'varchar' OR t.typname = 'char' THEN a.atttypmod - 4
9
+ ELSE NULL
10
+ END AS character_maximum_length
11
+ FROM pg_class c
12
+ JOIN pg_namespace n ON n.oid = c.relnamespace
13
+ JOIN pg_attribute a ON a.attrelid = c.oid
14
+ LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum
15
+ JOIN pg_type t ON t.oid = a.atttypid
16
+ WHERE c.relkind = 'r'
17
+ AND n.nspname = 'public'
18
+ AND a.attnum > 0
19
+ AND NOT a.attisdropped
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}))},Ve=async e=>{let{rows:t}=await Y`
22
+ SELECT
23
+ t.relname AS table_name,
24
+ c.relname AS index_name,
25
+ i.indisunique AS is_unique,
26
+ jsonb_agg(a.attname ORDER BY array_position(i.indkey, a.attnum)) AS column_names
27
+ FROM pg_class t
28
+ JOIN pg_namespace n ON n.oid = t.relnamespace
29
+ JOIN pg_index i ON i.indrelid = t.oid
30
+ JOIN pg_class c ON c.oid = i.indexrelid
31
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY (i.indkey)
32
+ WHERE t.relkind = 'r'
33
+ AND n.nspname = 'public'
34
+ AND NOT i.indisprimary
35
+ GROUP BY t.relname, c.relname, i.indisunique, i.indisprimary, c.oid;
36
+ `.$castTo().execute(e);return t.map(n=>({table:n.table_name,name:n.index_name,columns:n.column_names,unique:n.is_unique}))},ze=async e=>{let{rows:t}=await Y`
37
+ SELECT
38
+ n.nspname AS schema,
39
+ t.relname AS table,
40
+ c.conname AS name,
41
+ CASE c.contype
42
+ WHEN 'p' THEN 'PRIMARY KEY'
43
+ WHEN 'u' THEN 'UNIQUE'
44
+ WHEN 'f' THEN 'FOREIGN KEY'
45
+ END AS type,
46
+ jsonb_agg(a.attname ORDER BY array_position(c.conkey, a.attnum)) AS columns,
47
+ -- Foreign Key専用の情報
48
+ CASE
49
+ WHEN c.contype = 'f' THEN rt.relname
9
50
  ELSE NULL
10
- END AS character_maximum_length
11
- FROM pg_class c
12
- JOIN pg_namespace n ON n.oid = c.relnamespace
13
- JOIN pg_attribute a ON a.attrelid = c.oid
14
- LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum
15
- JOIN pg_type t ON t.oid = a.atttypid
16
- WHERE c.relkind = 'r'
51
+ END AS referenced_table,
52
+ CASE
53
+ WHEN c.contype = 'f' THEN jsonb_agg(ra.attname ORDER BY array_position(c.confkey, ra.attnum))
54
+ ELSE NULL
55
+ END AS referenced_columns,
56
+ CASE
57
+ WHEN c.contype = 'f' THEN
58
+ CASE c.confdeltype
59
+ WHEN 'c' THEN 'cascade'
60
+ WHEN 'n' THEN 'set null'
61
+ WHEN 'd' THEN 'set default'
62
+ WHEN 'r' THEN 'restrict'
63
+ WHEN 'a' THEN 'no action'
64
+ END
65
+ ELSE NULL
66
+ END AS on_delete,
67
+ CASE
68
+ WHEN c.contype = 'f' THEN
69
+ CASE c.confupdtype
70
+ WHEN 'c' THEN 'cascade'
71
+ WHEN 'n' THEN 'set null'
72
+ WHEN 'd' THEN 'set default'
73
+ WHEN 'r' THEN 'restrict'
74
+ WHEN 'a' THEN 'no action'
75
+ END
76
+ ELSE NULL
77
+ END AS on_update
78
+ FROM pg_constraint c
79
+ JOIN pg_class t ON c.conrelid = t.oid
80
+ JOIN pg_namespace n ON t.relnamespace = n.oid
81
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey)
82
+ -- Foreign Key用のJOIN
83
+ LEFT JOIN pg_class rt ON c.confrelid = rt.oid
84
+ LEFT JOIN pg_attribute ra ON ra.attrelid = c.confrelid AND ra.attnum = ANY(c.confkey)
85
+ WHERE c.contype IN ('p', 'u', 'f') -- primary key, unique, foreign key constraints
17
86
  AND n.nspname = 'public'
18
- AND a.attnum > 0
19
87
  AND NOT a.attisdropped
20
- ORDER BY c.relname, a.attnum;
21
- `.$castTo().execute(l);return c.map(m=>({schema:m.table_schema,table:m.table_name,name:m.column_name,default:m.column_default,characterMaximumLength:m.character_maximum_length}))}catch(s){var d=s,r=!0}finally{var p=x(i,d,r);p&&await p}},introspectIndexes:async()=>{var i=[];try{let o=e.client;let l=_(i,o.getDB(),!0);let{rows:c}=await X`
22
- SELECT
23
- t.relname AS table_name,
24
- i.relname AS index_name,
25
- pg_index.indisunique AS is_unique,
26
- jsonb_agg(a.attname ORDER BY array_position(pg_index.indkey, a.attnum)) AS column_names
27
- FROM pg_class t
28
- JOIN pg_namespace n ON n.oid = t.relnamespace
29
- JOIN pg_index ON pg_index.indrelid = t.oid
30
- JOIN pg_class i ON i.oid = pg_index.indexrelid
31
- JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY (pg_index.indkey)
32
- WHERE t.relkind = 'r'
33
- AND n.nspname = 'public'
34
- AND NOT pg_index.indisprimary
35
- AND NOT EXISTS (
36
- SELECT 1 FROM pg_constraint con
37
- WHERE con.conindid = i.oid
38
- AND con.contype IN ('p', 'u')
39
- )
40
- GROUP BY t.relname, i.relname, pg_index.indisunique, pg_index.indisprimary, i.oid;
41
- `.$castTo().execute(l);return c.map(m=>({table:m.table_name,name:m.index_name,columns:m.column_names,unique:m.is_unique}))}catch(s){var d=s,r=!0}finally{var p=x(i,d,r);p&&await p}},introspectConstraints:async()=>{var i=[];try{let o=e.client;let l=_(i,o.getDB(),!0);let{rows:c}=await X`
42
- SELECT
43
- n.nspname AS schema,
44
- t.relname AS table,
45
- c.conname AS name,
46
- CASE c.contype
47
- WHEN 'p' THEN 'PRIMARY KEY'
48
- WHEN 'u' THEN 'UNIQUE'
49
- WHEN 'f' THEN 'FOREIGN KEY'
50
- END AS type,
51
- jsonb_agg(a.attname ORDER BY array_position(c.conkey, a.attnum)) AS columns,
52
- -- Foreign Key専用の情報
53
- CASE
54
- WHEN c.contype = 'f' THEN rt.relname
55
- ELSE NULL
56
- END AS referenced_table,
57
- CASE
58
- WHEN c.contype = 'f' THEN jsonb_agg(ra.attname ORDER BY array_position(c.confkey, ra.attnum))
59
- ELSE NULL
60
- END AS referenced_columns,
61
- CASE
62
- WHEN c.contype = 'f' THEN
63
- CASE c.confdeltype
64
- WHEN 'c' THEN 'cascade'
65
- WHEN 'n' THEN 'set null'
66
- WHEN 'd' THEN 'set default'
67
- WHEN 'r' THEN 'restrict'
68
- WHEN 'a' THEN 'no action'
69
- END
70
- ELSE NULL
71
- END AS on_delete,
72
- CASE
73
- WHEN c.contype = 'f' THEN
74
- CASE c.confupdtype
75
- WHEN 'c' THEN 'cascade'
76
- WHEN 'n' THEN 'set null'
77
- WHEN 'd' THEN 'set default'
78
- WHEN 'r' THEN 'restrict'
79
- WHEN 'a' THEN 'no action'
80
- END
81
- ELSE NULL
82
- END AS on_update
83
- FROM pg_constraint c
84
- JOIN pg_class t ON c.conrelid = t.oid
85
- JOIN pg_namespace n ON t.relnamespace = n.oid
86
- JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey)
87
- -- Foreign Key用のJOIN
88
- LEFT JOIN pg_class rt ON c.confrelid = rt.oid
89
- LEFT JOIN pg_attribute ra ON ra.attrelid = c.confrelid AND ra.attnum = ANY(c.confkey)
90
- WHERE c.contype IN ('p', 'u', 'f') -- primary key, unique, foreign key constraints
91
- AND n.nspname = 'public'
92
- AND NOT a.attisdropped
93
- AND (c.contype != 'f' OR NOT ra.attisdropped) -- Foreign Key用の条件
94
- GROUP BY n.nspname, t.relname, c.conname, c.contype, c.oid, c.conkey, t.oid,
95
- rt.relname, c.confkey, c.confdeltype, c.confupdtype
96
- ORDER BY t.relname, c.conname;
97
- `.$castTo().execute(l);return{primaryKey:c.filter(m=>m.type==="PRIMARY KEY"),unique:c.filter(m=>m.type==="UNIQUE"),foreignKey:c.filter(m=>m.type==="FOREIGN KEY").map(m=>{let{referenced_table:h,referenced_columns:C,on_delete:b,on_update:q,...N}=m;return{...N,referencedTable:h,referencedColumns:C,onDelete:b,onUpdate:q}})}}catch(s){var d=s,r=!0}finally{var p=x(i,d,r);p&&await p}},convertTypeName:St});var Et=e=>{let t=e.getDialect();switch(t){case"postgres":case"cockroachdb":return Ce({client:e});default:throw new Error(`Unsupported dialect: ${t}`)}},he=e=>{let t=Et(e);return{getTables:async()=>{var l=[];try{let n=_(l,e.getDB(),!0);let a=await n.introspection.getTables();let o=await t.introspectTables();return a.map(r=>{let p=Object.fromEntries(r.columns.map(m=>{let C=o.filter(b=>b.table===r.name&&b.name===m.name)[0]||{};return[m.name,{schema:r.schema,table:r.name,name:m.name,dataType:t.convertTypeName(m.dataType),default:C.default??null,characterMaximumLength:C.characterMaximumLength??null,notNull:!m.isNullable}]}));return{schema:r.schema,name:r.name,columns:p}})}catch(c){var i=c,s=!0}finally{var d=x(l,i,s);d&&await d}},getIndexes:async()=>(await t.introspectIndexes()).filter(n=>!n.table.startsWith("kysely_")),getConstraints:async()=>{let n=await t.introspectConstraints(),a=n.primaryKey.filter(c=>!c.table.startsWith("kysely_")),o=n.unique.filter(c=>!c.table.startsWith("kysely_")),l=n.foreignKey.filter(c=>!c.table.startsWith("kysely_"));return{primaryKey:a,unique:o,foreignKey:l}}}};import{PostgreSqlContainer as Nt}from"@testcontainers/postgresql";import{CockroachDbContainer as wt}from"@testcontainers/cockroachdb";import{getContainerRuntimeClient as ae}from"testcontainers";var Z="kyrage.dialect",re="kyrage.managed",_e="kyrage.managed-by",xe=async e=>(await(await ae()).container.list()).some(a=>a.Labels[re]==="true"&&a.Labels[_e]==="dev-start"&&a.Labels[Z]===e&&a.State==="running"),vt=async()=>{let e=await ae(),n=(await e.container.list()).filter(a=>a.Labels[re]==="true").map(a=>a.Id);await Promise.allSettled(n.map(async a=>e.container.getById(a).remove({force:!0})))},Tt=new Error("Dev database is not started or unavailable"),M=class{constructor(t,n){this.options=t;this.startedContainer=null;let a=n(),o=this.options.manageType||"one-off";a.withLabels({[Z]:this.options.dialect,[re]:"true",[_e]:o}),o==="dev-start"&&a.withReuse(),this.options.containerName&&a.withName(this.options.containerName),this.container=a}async findRunningContainer(){return(await ae()).container.fetchByLabel(Z,this.options.dialect,{status:["running"]})}async exists(){return!!await this.findRunningContainer()}async start(){this.startedContainer=await this.container.start()}getConnectionString(){if(!this.startedContainer)throw Tt;return this.startedContainer.getConnectionUri()}async stop(){this.startedContainer&&(await this.startedContainer.stop(),this.startedContainer=null)}async remove(){await vt(),this.startedContainer=null}async getStatus(){let t=await this.findRunningContainer();if(!t)return null;let n=await t.inspect();return{type:"container",imageName:n.Config.Image,containerID:n.Id}}},ee=class extends M{constructor(t){super(t,()=>new Nt(t.image))}},te=class extends M{constructor(t){super(t,()=>new wt(t.image))}},ne=class{constructor(t){this.connectionString=t}async start(){}async stop(){}async remove(){}async exists(){return!0}getConnectionString(){return this.connectionString}async getStatus(){return{type:"connectionString"}}},K=(e,t,n)=>{if("connectionString"in e)return new ne(e.connectionString);if("container"in e){let a={dialect:t,image:e.container.image,containerName:n==="dev-start"?e.container.name:void 0,manageType:n};switch(t){case"postgres":return new ee(a);case"cockroachdb":return new te(a);default:throw new Error(`Unsupported dialect for container: ${t}`)}}else throw new Error("Invalid dev database configuration")};async function Ot(e,t){let{config:n}=e,a=n.database.dialect;switch(t.mode){case"dev-start":{let o="dev-start",l=K(n.dev,a,o);return{manager:l,containerType:o,result:{reused:await l.exists()}}}case"generate-dev":{let o=await xe(a),l=o?"dev-start":"one-off";return{manager:K(n.dev,a,l),containerType:l,result:{reused:o}}}}}async function j(e,t){let{config:n}=e,a=t.logger||L,{reporter:o}=a;if(!n.dev)throw new Error("Dev database configuration is required");let{manager:l,containerType:c,result:i}=await Ot(e,t);i.reused?o.info("\u{1F504} Reusing existing dev database..."):o.info("\u{1F680} Starting dev database..."),await l.start(),o.success(`Dev database started: ${n.database.dialect}`);let s=k({database:{dialect:n.database.dialect,connectionString:l.getConnectionString()}}),d=await E(s);return d.length>0?(o.info(`\u{1F504} Applying ${d.length} pending migrations...`),await A({client:s,logger:L,config:n},{plan:!1,pretty:!1}),o.success(`Applied ${d.length} migrations`)):o.info("No pending migrations found"),{client:s,manager:l,cleanup:async()=>{switch(t.mode){case"dev-start":o.success("Persistent dev database ready: "+n.database.dialect);break;case"generate-dev":c==="dev-start"?o.info("Dev start container remains running"):(await l.stop(),o.success("Temporary dev database stopped"));break}}}}async function It(e,t){let{logger:n,config:a}=e,{reporter:o}=n;t.squash&&await kt(e);let{client:l,cleanup:c}=t.dev?await j(e,{mode:"generate-dev",logger:n}):{client:e.client,cleanup:async()=>{}};try{if(!t.ignorePending){let r=await E(l);if(r.length>0)if(t.dev)o.info(`Dev database has ${r.length} pending migrations. These will be applied automatically as baseline.`);else{o.warn([`There are pending migrations: ${r.map(p=>p.id).join(", ")}`,"Please apply them first before generating a new migration.","Otherwise, use --ignore-pending to skip this check."].join(`
98
- `));return}}let i=await $t({client:l,config:a});if(!i){o.info("No changes detected, no migration needed.");return}Mt(n,i.diff);let s=`${w}/${i.id}.json`;await Kt(w,{recursive:!0}),await Rt(s,JSON.stringify(i,null,2));let d=t.squash?`Generated squashed migration: ${s}`:`Migration file generated: ${s}`;o.success(d),t.dev&&await A({...e,client:l},{plan:!1,pretty:!1})}finally{await c()}}var kt=async e=>{let{client:t,logger:n}=e,{reporter:a}=n,o=await E(t);if(o.length===0){a.info("No pending migrations found, nothing to squash.");return}a.info(`Found ${o.length} pending migrations to squash:`),o.forEach(c=>{a.info(` - ${c.id}.json`)});let l=o.map(c=>Pt(w,`${c.id}.json`));try{await Promise.all(l.map(c=>qt(c))),a.success(`\u{1F5D1}\uFE0F Removed ${l.length} pending migration files`)}catch(c){throw new Error(`Failed to remove pending migration files: ${c}`)}},$t=async e=>{let{client:t,config:n}=e,a=he(t),o=await a.getTables(),l=await a.getConstraints(),c=(m,h)=>C=>C.some(b=>b.table===m&&b.columns.length===1&&b.columns[0]===h),i=o.map(m=>({name:m.name,columns:Object.fromEntries(Object.entries(m.columns).map(([h,C])=>{let b=c(m.name,h),N=l.primaryKey.some(U=>U.table===m.name&&U.columns.length>1&&U.columns.includes(h))?!0:C.notNull;return[h,{type:C.dataType,notNull:N,primaryKey:b(l.primaryKey),unique:b(l.unique),defaultSql:C.default??void 0}]}))})),s=n.tables.map(m=>({name:m.tableName,columns:Object.fromEntries(Object.entries(m.columns).map(([h,C])=>{let b=(n.primaryKeyConstraints??[]).some(N=>N.table===m.tableName&&N.columns.includes(h)),q=C.primaryKey||C.notNull||b;return[h,{...C,notNull:q}]}))})),d=await a.getIndexes(),r=be({current:{tables:i,indexes:d,primaryKeyConstraints:l.primaryKey,uniqueConstraints:l.unique,foreignKeyConstraints:l.foreignKey},ideal:{tables:s,indexes:n.indexes.map(m=>({table:m.table,name:m.name,columns:m.columns,unique:m.unique})),primaryKeyConstraints:n.primaryKeyConstraints||[],uniqueConstraints:n.uniqueConstraints||[],foreignKeyConstraints:n.foreignKeyConstraints||[]}});return r.operations.length===0?null:{version:"1",id:Date.now()+"",diff:r}},Mt=(e,t)=>{let n=[];t.operations.forEach(a=>{switch(a.type){case"create_table":n.push(`-- create_table: ${a.table}`),Object.entries(a.columns).forEach(([o,l])=>{n.push(` -> column: ${o} (${JSON.stringify(l)})`)});break;case"drop_table":n.push(`-- remove_table: ${a.table}`);break;case"add_column":n.push([`-- add_column: ${a.table}.${a.column}`,` -> to: ${JSON.stringify(a.attributes)}`].join(`
88
+ AND (c.contype != 'f' OR NOT ra.attisdropped) -- Foreign Key用の条件
89
+ GROUP BY n.nspname, t.relname, c.conname, c.contype, c.oid, c.conkey, t.oid,
90
+ rt.relname, c.confkey, c.confdeltype, c.confupdtype
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:a,referenced_columns:o,on_delete:l,on_update:c,...s}=n;return{...s,referencedTable:a,referencedColumns:o,onDelete:l,onUpdate:c}})}};import{CockroachDbContainer as We}from"@testcontainers/cockroachdb";import{Pool as Je}from"pg";import{PostgresAdapter as Ye,PostgresDialect as Ge}from"kysely";var U=class{getName(){return"cockroachdb"}getDevDatabaseImageName(){return"cockroachdb/cockroach:latest-v24.3"}createKyselyDialect(t){return new ee({pool:new Je({connectionString:t})})}createIntrospectionDriver(t){return{convertTypeName:X,introspect:G(t)}}createDevDatabaseContainer(t){return new We(t)}},Z=class extends Ye{async acquireMigrationLock(t,n){await t.selectFrom(n.lockTable).selectAll().forUpdate().execute()}},ee=class extends Ge{createAdapter(){return new Z}};var Xe={postgres:new M,cockroachdb:new U},A=e=>{let t=Xe[e];if(!t)throw new Error(`Unsupported dialect: ${e}`);return t};import{DummyDriver as Ze}from"kysely";var j=class extends Ze{constructor(n){super();this.queries=n}async acquireConnection(){return new te(this.queries)}},te=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 L=e=>new ne({databaseProps:e.database,options:e.options}),ne=class{constructor(t){this.constructorProps=t}getDB(t){let n=A(this.constructorProps.databaseProps.dialect).createKyselyDialect(this.constructorProps.databaseProps.connectionString);return new ae({dialect:{createAdapter:()=>n.createAdapter(),createDriver:()=>n.createDriver(),createIntrospector:a=>n.createIntrospector(a),createQueryCompiler:()=>n.createQueryCompiler()}},{isPlan:t?.plan===!0})}getDialect(){return this.constructorProps.databaseProps.dialect}},ae=class extends et{constructor(n,a){let o=[];super({dialect:{...n.dialect,createDriver:()=>a.isPlan?new j(o):n.dialect.createDriver()}});this.plannedQueries=[];this.plannedQueries=o}getPlannedQueries(){return this.plannedQueries}};async function v(){let e=await Ce();return{client:L({database:e.database}),logger:ye,config:e}}import{Migrator as vt}from"kysely";import{DEFAULT_MIGRATION_TABLE as he,isColumnDataType as tt,sql as _e}from"kysely";import{readdir as nt,readFile as at}from"fs/promises";import{join as rt}from"path";import q from"zod";import*as De from"ramda";var O="migrations",ot=q.object({operations:q.array(be).readonly()}),it=q.object({id:q.string(),version:q.string(),diff:ot}),re=async()=>{try{let t=(await nt(O)).filter(n=>n.endsWith(".json")).map(async n=>it.parse(JSON.parse(await at(rt(O,n),"utf-8"))));return await Promise.all(t)}catch(e){if(e instanceof Object&&"code"in e&&e.code==="ENOENT")return[];throw e}},w=async e=>{var l=[];try{let t=N(l,e.getDB(),!0);let n=await re();let a=(await t.introspection.getTables({withInternalKyselyTables:!0})).map(r=>r.name);if(!a.includes(he))return n;let o=await t.selectFrom(he).select(["name","timestamp"]).$narrowType().execute();return n.filter(r=>!o.some(p=>p.name===r.id))}catch(c){var s=c,i=!0}finally{var u=E(l,s,i);u&&await u}},Se=e=>({getMigrations:async()=>{let t=await e.migrationsResolver(),n={};return t.forEach(a=>{n[a.id]={up:async()=>{await st(e.db,a.diff)}}}),n}});async function st(e,t){let n=De.pipe(Dt,St,Nt);for(let a of n(t.operations))await ct(e,a)}async function ct(e,t){switch(t.type){case"create_table":return lt(e,t);case"drop_table":return mt(e,t);case"add_column":return ut(e,t);case"drop_column":return pt(e,t);case"alter_column":return dt(e,t);case"create_index":return yt(e,t);case"drop_index":return gt(e,t);case"create_primary_key_constraint":return ft(e,t);case"drop_primary_key_constraint":return bt(e,t);case"create_unique_constraint":return Ct(e,t);case"drop_unique_constraint":return ht(e,t);case"create_foreign_key_constraint":return xt(e,t);case"drop_foreign_key_constraint":return _t(e,t);default:throw new Error(`Unknown operation type: ${t.type}`)}}async function lt(e,t){let n=e.schema.createTable(t.table);for(let[a,o]of Object.entries(t.columns)){let l=o.type;oe(l),n=n.addColumn(a,l,c=>{let s=c;return o.notNull&&(s=s.notNull()),typeof o.defaultSql=="string"&&(s=s.defaultTo(_e.raw(o.defaultSql))),s})}await n.execute()}async function mt(e,t){await e.schema.dropTable(t.table).execute()}async function ut(e,t){let n=t.attributes.type;oe(n),await e.schema.alterTable(t.table).addColumn(t.column,n,a=>{let o=a;return t.attributes.notNull&&(o=o.notNull()),typeof t.attributes.defaultSql=="string"&&(o=o.defaultTo(_e.raw(t.attributes.defaultSql))),o}).execute()}async function pt(e,t){await e.schema.alterTable(t.table).dropColumn(t.column).execute()}async function dt(e,t){let{table:n,column:a,before:o,after:l}=t;if(o.type!==l.type){let c=l.type;oe(c),await e.schema.alterTable(n).alterColumn(a,s=>s.setDataType(c)).execute()}l.notNull!==o.notNull&&(l.notNull?await e.schema.alterTable(n).alterColumn(a,c=>c.setNotNull()).execute():await e.schema.alterTable(n).alterColumn(a,c=>c.dropNotNull()).execute())}async function yt(e,t){let n=e.schema.createIndex(t.name).on(t.table);for(let a of t.columns)n=n.column(a);t.unique&&(n=n.unique()),await n.execute()}async function gt(e,t){await e.schema.dropIndex(t.name).execute()}async function ft(e,t){await e.schema.alterTable(t.table).addPrimaryKeyConstraint(t.name,t.columns).execute()}async function bt(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}async function Ct(e,t){await e.schema.alterTable(t.table).addUniqueConstraint(t.name,t.columns).execute()}async function ht(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}async function xt(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()}async function _t(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}var oe=e=>{if(!tt(e))throw new Error(`Unsupported data type: ${e}`)},xe={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:6,add_column:7,alter_column:8,create_index:9,create_primary_key_constraint:10,create_unique_constraint:11,create_foreign_key_constraint:12},Dt=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))},St=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 a=`${n.table}.${n.name}`;if(t.has(a))return!1}return!0})},Nt=e=>e.slice().sort((t,n)=>{let a=xe[t.type],o=xe[n.type];return a!==o?a-o:t.table.localeCompare(n.table)});import{format as wt}from"sql-formatter";async function I(e,t){var r=[];try{let{client:n,logger:a}=e;let{reporter:o}=a;let l=N(r,n.getDB({plan:t.plan}),!0);let c=new vt({db:l,provider:Se({db:l,migrationsResolver:async()=>t.plan?await w(n):await re(),options:{plan:t.plan}})});let{results:s,error:i}=await c.migrateToLatest();let u=l.getPlannedQueries();if(u.length>0){u.forEach(b=>{a.stdout(t.pretty?wt(b.sql):b.sql)});return}s&&s.length>0?s.forEach(b=>{b.status==="Error"?o.error(`Migration failed: ${b.migrationName}`):b.status==="Success"&&o.success(`Migration applied: ${b.migrationName}`)}):o.info("No migrations to run");if(i)throw i instanceof Error?i:new Error(`Migration error: ${i}`)}catch(p){var d=p,h=!0}finally{var C=E(r,d,h);C&&await C}}var Ne=Et({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 v();await I(t,{plan:e.args.plan,pretty:e.args.pretty})}catch(t){let{defaultConsolaLogger:n}=await import("./logger-SE7G5AMI.js");n.reporter.error(t),process.exit(1)}}});import{defineCommand as Mt}from"citty";import{mkdir as Ut,writeFile as jt,unlink as Lt}from"fs/promises";import{join as Ft}from"path";import*as g from"ramda";var K=()=>({added:(e,t,n)=>g.pipe(g.difference(t),g.map(n))(e),removed:(e,t,n)=>g.pipe(g.difference(e),g.map(n))(t),changed:(e,t,n,a)=>g.pipe(g.intersection(e),g.filter(n),g.map(a))(t)}),F=g.prop("name"),Tt=g.eqBy(e=>[e.type,e.notNull??!1,e.primaryKey??!1,e.unique??!1]);function At(e,t){let n=[],a=K(),o=e.columns,l=t.columns,c=Object.keys(o),s=Object.keys(l);return a.added(c,s,i=>({column:i,attributes:l[i]})).forEach(i=>{n.push(f.addColumn({table:e.name,column:i.column},i.attributes))}),a.removed(c,s,i=>({column:i,attributes:o[i]})).forEach(i=>{n.push(f.dropColumn({table:e.name,column:i.column},i.attributes))}),a.changed(c,s,i=>!Tt(o[i],l[i]),i=>({column:i,before:o[i],after:l[i]})).forEach(i=>{n.push(f.alterColumn({table:e.name,column:i.column},i.before,i.after))}),n}function Ot(e){let{current:t,ideal:n}=e,a=[],o=K(),l=g.map(F,t),c=g.map(F,n);return o.added(l,c,s=>n.find(u=>u.name===s)).forEach(s=>{a.push(f.createTable(s.name,s.columns))}),o.removed(l,c,g.identity).forEach(s=>{a.push(f.dropTable(s))}),g.filter(s=>n.some(i=>i.name===s.name))(t).forEach(s=>{let i=n.find(u=>u.name===s.name);a.push(...At(s,i))}),a}function Kt(e){let{current:t,ideal:n}=e,a=[],o=K(),l=r=>`${r.table}:${r.name}`,c=new Map(t.map(r=>[l(r),r])),s=new Map(n.map(r=>[l(r),r])),i=Array.from(c.keys()),u=Array.from(s.keys());return o.added(i,u,r=>s.get(r)).forEach(r=>{a.push(f.createIndex(r))}),o.removed(i,u,r=>{let p=c.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropIndex(r))}),o.changed(i,u,r=>{let p=c.get(r),d=s.get(r);return!g.equals(p.columns,d.columns)||p.unique!==d.unique},r=>{let p=c.get(r),d=s.get(r);return{current:p,ideal:d}}).forEach(({current:r,ideal:p})=>{a.push(f.dropIndex(r)),a.push(f.createIndex(p))}),a}function Rt(e){let{current:t,ideal:n}=e,a=[],o=K(),l=r=>`${r.table}:${r.name}`,c=new Map(t.map(r=>[l(r),r])),s=new Map(n.map(r=>[l(r),r])),i=Array.from(c.keys()),u=Array.from(s.keys());return o.added(i,u,r=>s.get(r)).forEach(r=>{a.push(f.createPrimaryKeyConstraint(r))}),o.removed(i,u,r=>{let p=c.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropPrimaryKeyConstraint(r))}),o.changed(i,u,r=>{let p=c.get(r),d=s.get(r);return!g.equals(p.columns,d.columns)},r=>{let p=c.get(r),d=s.get(r);return{current:p,ideal:d}}).forEach(({current:r,ideal:p})=>{a.push(f.dropPrimaryKeyConstraint(r)),a.push(f.createPrimaryKeyConstraint(p))}),a}function Pt(e){let{current:t,ideal:n}=e,a=[],o=K(),l=r=>`${r.table}:${r.name}`,c=new Map(t.map(r=>[l(r),r])),s=new Map(n.map(r=>[l(r),r])),i=Array.from(c.keys()),u=Array.from(s.keys());return o.added(i,u,r=>s.get(r)).forEach(r=>{a.push(f.createUniqueConstraint(r))}),o.removed(i,u,r=>{let p=c.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropUniqueConstraint(r))}),o.changed(i,u,r=>{let p=c.get(r),d=s.get(r);return!g.equals(p.columns,d.columns)},r=>{let p=c.get(r),d=s.get(r);return{current:p,ideal:d}}).forEach(({current:r,ideal:p})=>{a.push(f.dropUniqueConstraint(r)),a.push(f.createUniqueConstraint(p))}),a}function qt(e){let t=[],n=K(),a=e.current.map(F),o=e.ideal.map(F);t.push(...n.added(a,o,c=>{let s=e.ideal.find(p=>p.name===c),{table:i,name:u,...r}=s;return f.createForeignKeyConstraint({table:i,name:u},r)})),t.push(...n.removed(a,o,c=>{let s=e.current.find(i=>i.name===c);return f.dropForeignKeyConstraint(s)}));let l=c=>{let s=e.current.find(u=>u.name===c),i=e.ideal.find(u=>u.name===c);return!s||!i?!1:!(g.equals(s.columns,i.columns)&&s.referencedTable===i.referencedTable&&g.equals(s.referencedColumns,i.referencedColumns)&&s.onDelete===i.onDelete&&s.onUpdate===i.onUpdate)};return t.push(...n.changed(a,o,l,c=>{let s=e.current.find(d=>d.name===c),i=e.ideal.find(d=>d.name===c),{table:u,name:r,...p}=i;return[f.dropForeignKeyConstraint(s),f.createForeignKeyConstraint({table:u,name:r},p)]}).flat()),t}function Ee(e){let t=Ot({current:e.current.tables,ideal:e.ideal.tables}),n=Kt({current:e.current.indexes,ideal:e.ideal.indexes}),a=Rt({current:e.current.primaryKeyConstraints,ideal:e.ideal.primaryKeyConstraints}),o=Pt({current:e.current.uniqueConstraints,ideal:e.ideal.uniqueConstraints}),l=qt({current:e.current.foreignKeyConstraints,ideal:e.ideal.foreignKeyConstraints});return{operations:[...t,...n,...a,...o,...l]}}var ve=e=>{let n=A(e.getDialect()).createIntrospectionDriver(e);return{introspect:async o=>{var C=[];try{let l=N(C,e.getDB(),!0);let c=await l.introspection.getTables();let{tables:s,indexes:i,constraints:u}=await n.introspect({config:o});let r=()=>c.map(x=>({schema:x.schema,name:x.name,columns:Object.fromEntries(x.columns.map(S=>{let pe=s.filter(de=>de.table===x.name&&de.name===S.name)[0]||{};return[S.name,{schema:x.schema,table:x.name,name:S.name,dataType:n.convertTypeName(S.dataType),default:pe.default??null,characterMaximumLength:pe.characterMaximumLength??null,notNull:!S.isNullable}]}))}));let p=x=>!x.table.startsWith("kysely_");let d=()=>i.filter(p);let h=()=>({primaryKey:u.primaryKey.filter(p),unique:u.unique.filter(p),foreignKey:u.foreignKey.filter(p)});return{tables:r(),indexes:d(),constraints:h()}}catch(b){var R=b,T=!0}finally{var H=E(C,R,T);H&&await H}}}};import{getContainerRuntimeClient as le}from"testcontainers";var ie="kyrage.dialect",me="kyrage.managed",we="kyrage.managed-by",Te=async e=>(await(await le()).container.list()).some(a=>a.Labels[me]==="true"&&a.Labels[we]==="dev-start"&&a.Labels[ie]===e&&a.State==="running"),It=async()=>{let e=await le(),n=(await e.container.list()).filter(a=>a.Labels[me]==="true").map(a=>a.Id);await Promise.allSettled(n.map(async a=>e.container.getById(a).remove({force:!0})))},kt=new Error("Dev database is not started or unavailable"),se=class{constructor(t,n){this.options=t;this.startedContainer=null;let a=n(),o=this.options.manageType||"one-off";a.withLabels({[ie]:this.options.dialect,[me]:"true",[we]:o}),o==="dev-start"&&a.withReuse(),this.options.containerName&&a.withName(this.options.containerName),this.container=a}async findRunningContainer(){return(await le()).container.fetchByLabel(ie,this.options.dialect,{status:["running"]})}async exists(){return!!await this.findRunningContainer()}async start(){this.startedContainer=await this.container.start()}getConnectionString(){if(!this.startedContainer)throw kt;return this.startedContainer.getConnectionUri()}async stop(){this.startedContainer&&(await this.startedContainer.stop(),this.startedContainer=null)}async remove(){await It(),this.startedContainer=null}async getStatus(){let t=await this.findRunningContainer();if(!t)return null;let n=await t.inspect();return{type:"container",imageName:n.Config.Image,containerID:n.Id}}},ce=class{constructor(t){this.connectionString=t}async start(){}async stop(){}async remove(){}async exists(){return!0}getConnectionString(){return this.connectionString}async getStatus(){return{type:"connectionString"}}},k=(e,t,n)=>{if("connectionString"in e)return new ce(e.connectionString);if("container"in e)return new se({dialect:t,containerName:n==="dev-start"?e.container.name:void 0,manageType:n},()=>A(t).createDevDatabaseContainer(e.container.image));throw new Error("Invalid dev database configuration")};async function $t(e,t){let{config:n}=e,a=n.database.dialect;switch(t.mode){case"dev-start":{let o="dev-start",l=k(n.dev,a,o);return{manager:l,containerType:o,result:{reused:await l.exists()}}}case"generate-dev":{let o=await Te(a),l=o?"dev-start":"one-off";return{manager:k(n.dev,a,l),containerType:l,result:{reused:o}}}}}async function B(e,t){let{config:n}=e,a=t.logger||Q,{reporter:o}=a;if(!n.dev)throw new Error("Dev database configuration is required");let{manager:l,containerType:c,result:s}=await $t(e,t);s.reused?o.info("\u{1F504} Reusing existing dev database..."):o.info("\u{1F680} Starting dev database..."),await l.start(),o.success(`Dev database started: ${n.database.dialect}`);let i=L({database:{dialect:n.database.dialect,connectionString:l.getConnectionString()}}),u=await w(i);return u.length>0?(o.info(`\u{1F504} Applying ${u.length} pending migrations...`),await I({client:i,logger:Q,config:n},{plan:!1,pretty:!1}),o.success(`Applied ${u.length} migrations`)):o.info("No pending migrations found"),{client:i,manager:l,cleanup:async()=>{switch(t.mode){case"dev-start":o.success("Persistent dev database ready: "+n.database.dialect);break;case"generate-dev":c==="dev-start"?o.info("Dev start container remains running"):(await l.stop(),o.success("Temporary dev database stopped"));break}}}}async function Bt(e,t){let{logger:n,config:a}=e,{reporter:o}=n;t.squash&&await Ht(e);let{client:l,cleanup:c}=t.dev?await B(e,{mode:"generate-dev",logger:n}):{client:e.client,cleanup:async()=>{}};try{if(!t.ignorePending){let r=await w(l);if(r.length>0)if(t.dev)o.info(`Dev database has ${r.length} pending migrations. These will be applied automatically as baseline.`);else{o.warn([`There are pending migrations: ${r.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 s=await Qt({client:l,config:a});if(!s){o.info("No changes detected, no migration needed.");return}Vt(n,s.diff);let i=`${O}/${s.id}.json`;await Ut(O,{recursive:!0}),await jt(i,JSON.stringify(s,null,2));let u=t.squash?`Generated squashed migration: ${i}`:`Migration file generated: ${i}`;o.success(u),t.dev&&await I({...e,client:l},{plan:!1,pretty:!1})}finally{await c()}}var Ht=async e=>{let{client:t,logger:n}=e,{reporter:a}=n,o=await w(t);if(o.length===0){a.info("No pending migrations found, nothing to squash.");return}a.info(`Found ${o.length} pending migrations to squash:`),o.forEach(c=>{a.info(` - ${c.id}.json`)});let l=o.map(c=>Ft(O,`${c.id}.json`));try{await Promise.all(l.map(c=>Lt(c))),a.success(`\u{1F5D1}\uFE0F Removed ${l.length} pending migration files`)}catch(c){throw new Error(`Failed to remove pending migration files: ${c}`)}},Qt=async e=>{let{client:t,config:n}=e,a=ve(t),{tables:o,indexes:l,constraints:c}=await a.introspect(n),s=(d,h)=>C=>C.some(b=>b.table===d&&b.columns.length===1&&b.columns[0]===h),i=o.map(d=>({name:d.name,columns:Object.fromEntries(Object.entries(d.columns).map(([h,C])=>{let b=s(d.name,h),R=b(c.primaryKey),T=b(c.unique),x=c.primaryKey.some(S=>S.table===d.name&&S.columns.length>1&&S.columns.includes(h))?!0:C.notNull;return[h,{type:C.dataType,notNull:x,defaultSql:C.default??void 0,primaryKey:R,unique:T}]}))})),u=n.tables.map(d=>({name:d.tableName,columns:Object.fromEntries(Object.entries(d.columns).map(([h,C])=>{let b=(n.primaryKeyConstraints??[]).some(T=>T.table===d.tableName&&T.columns.includes(h)),R=C.primaryKey||C.notNull||b;return[h,{...C,notNull:R}]}))})),r=Ee({current:{tables:i,indexes:l,uniqueConstraints:c.unique,primaryKeyConstraints:c.primaryKey,foreignKeyConstraints:c.foreignKey},ideal:{...n,tables:u}});return r.operations.length===0?null:{version:"1",id:Date.now()+"",diff:r}},Vt=(e,t)=>{let n=[];t.operations.forEach(a=>{switch(a.type){case"create_table":n.push(`-- create_table: ${a.table}`),Object.entries(a.columns).forEach(([o,l])=>{n.push(` -> column: ${o} (${JSON.stringify(l)})`)});break;case"drop_table":n.push(`-- remove_table: ${a.table}`);break;case"add_column":n.push([`-- add_column: ${a.table}.${a.column}`,` -> to: ${JSON.stringify(a.attributes)}`].join(`
99
94
  `));break;case"drop_column":n.push(`-- remove_column: ${a.table}.${a.column}`);break;case"alter_column":n.push([`-- change_column: ${a.table}.${a.column}`,` -> from: ${JSON.stringify(a.before)}`,` -> to: ${JSON.stringify(a.after)}`].join(`
100
95
  `));break;case"create_index":n.push(`-- create_index: ${a.table}.${a.name} (${a.columns.join(", ")})${a.unique?" [unique]":""}`);break;case"drop_index":n.push(`-- drop_index: ${a.table}.${a.name}`);break;case"create_primary_key_constraint":n.push(`-- create_primary_key_constraint: ${a.table}.${a.name} (${a.columns.join(", ")})`);break;case"drop_primary_key_constraint":n.push(`-- drop_primary_key_constraint: ${a.table}.${a.name}`);break;case"create_unique_constraint":n.push(`-- create_unique_constraint: ${a.table}.${a.name} (${a.columns.join(", ")})`);break;case"drop_unique_constraint":n.push(`-- drop_unique_constraint: ${a.table}.${a.name}`);break;case"create_foreign_key_constraint":n.push(`-- create_foreign_key_constraint: ${a.table}.${a.name} (${a.columns.join(", ")}) -> ${a.referencedTable} (${a.referencedColumns.join(", ")})${a.onDelete?` ON DELETE ${a.onDelete.toUpperCase()}`:""}${a.onUpdate?` ON UPDATE ${a.onUpdate.toUpperCase()}`:""}`);break;case"drop_foreign_key_constraint":n.push(`-- drop_foreign_key_constraint: ${a.table}.${a.name}`);break;default:break}}),e.reporter.log(n.join(`
101
- `))},De=At({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 S();await It(t,{ignorePending:e.args["ignore-pending"],dev:e.args.dev,squash:e.args.squash})}catch(t){let{defaultConsolaLogger:n}=await import("./logger-SE7G5AMI.js");n.reporter.error(t),process.exit(1)}}});import{defineCommand as R}from"citty";async function jt(e){let{manager:t,logger:n}=e,a=await t.getStatus();if(!a||a.type!=="container"){n.reporter.info("No running dev containers found");return}n.reporter.info(`Running: ${a.containerID} (${a.imageName})`)}async function Ut(e){let{manager:t,logger:n}=e;if(!await t.exists()){n.reporter.info("No running dev containers found");return}await t.start(),console.log(t.getConnectionString())}async function Lt(e){let{manager:t,logger:n}=e;if(!await t.exists()){n.reporter.info("No dev containers found");return}await t.remove(),n.reporter.success("Cleaned up dev containers")}async function Bt(e){let{logger:t}=e,{reporter:n}=t,{manager:a}=await j(e,{mode:"dev-start",logger:t});n.success(`\u2728 Dev database ready: ${a.getConnectionString()}`)}async function oe(){let e=await S();if(!e.config.dev||!("container"in e.config.dev))throw new Error("No dev database container configuration found");let t=K(e.config.dev,e.config.database.dialect,"dev-start");return{...e,manager:t}}var Ft=R({meta:{name:"start",description:"Start development database with migrations applied"},run:async()=>{try{let e=await S();await Bt(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),Ht=R({meta:{name:"status",description:"Show status of kyrage dev container"},run:async()=>{try{let e=await oe();await jt(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),Wt=R({meta:{name:"get-url",description:"Print connection URL for running dev container"},run:async()=>{try{let e=await oe();await Ut(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),Qt=R({meta:{name:"clean",description:"Remove all kyrage dev containers"},run:async()=>{try{let e=await oe();await Lt(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),Se=R({meta:{name:"dev",description:"Manage development database containers"},subCommands:{start:Ft,status:Ht,"get-url":Wt,clean:Qt}});var Jt=Vt({meta:{name:"kyrage",version:se,description:"Kysely migration CLI with declarative schema"},subCommands:{apply:fe,generate:De,dev:Se}});zt(Jt);
96
+ `))},Ae=Mt({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 v();await Bt(t,{ignorePending:e.args["ignore-pending"],dev:e.args.dev,squash:e.args.squash})}catch(t){let{defaultConsolaLogger:n}=await import("./logger-SE7G5AMI.js");n.reporter.error(t),process.exit(1)}}});import{defineCommand as $}from"citty";async function zt(e){let{manager:t,logger:n}=e,a=await t.getStatus();if(!a||a.type!=="container"){n.reporter.info("No running dev containers found");return}n.reporter.info(`Running: ${a.containerID} (${a.imageName})`)}async function Wt(e){let{manager:t,logger:n}=e;if(!await t.exists()){n.reporter.info("No running dev containers found");return}await t.start(),console.log(t.getConnectionString())}async function Jt(e){let{manager:t,logger:n}=e;if(!await t.exists()){n.reporter.info("No dev containers found");return}await t.remove(),n.reporter.success("Cleaned up dev containers")}async function Yt(e){let{logger:t}=e,{reporter:n}=t,{manager:a}=await B(e,{mode:"dev-start",logger:t});n.success(`\u2728 Dev database ready: ${a.getConnectionString()}`)}async function ue(){let e=await v();if(!e.config.dev||!("container"in e.config.dev))throw new Error("No dev database container configuration found");let t=k(e.config.dev,e.config.database.dialect,"dev-start");return{...e,manager:t}}var Gt=$({meta:{name:"start",description:"Start development database with migrations applied"},run:async()=>{try{let e=await v();await Yt(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),Xt=$({meta:{name:"status",description:"Show status of kyrage dev container"},run:async()=>{try{let e=await ue();await zt(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),Zt=$({meta:{name:"get-url",description:"Print connection URL for running dev container"},run:async()=>{try{let e=await ue();await Wt(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),en=$({meta:{name:"clean",description:"Remove all kyrage dev containers"},run:async()=>{try{let e=await ue();await Jt(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),Oe=$({meta:{name:"dev",description:"Manage development database containers"},subCommands:{start:Gt,status:Xt,"get-url":Zt,clean:en}});var an=tn({meta:{name:"kyrage",version:ge,description:"Kysely migration CLI with declarative schema"},subCommands:{apply:Ne,generate:Ae,dev:Oe}});nn(an);
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@izumisy/kyrage",
3
3
  "private": false,
4
4
  "type": "module",
5
- "version": "1.2.1",
5
+ "version": "1.2.3",
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",
@@ -47,13 +47,13 @@
47
47
  "devDependencies": {
48
48
  "@swc/core": "^1.13.5",
49
49
  "@types/better-sqlite3": "^7.6.13",
50
- "@types/node": "^24.3.1",
50
+ "@types/node": "^24",
51
51
  "@types/pg": "^8.15.5",
52
52
  "@types/ramda": "^0.31.0",
53
53
  "memfs": "^4.38.2",
54
- "prettier": "^3.6.2",
54
+ "prettier": "^3",
55
55
  "tsup": "^8.5.0",
56
- "typescript": "^5.9.2",
56
+ "typescript": "^5",
57
57
  "vitest": "^3.2.4"
58
58
  },
59
59
  "scripts": {