@izumisy/kyrage 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-3M6BYRKC.js +1 -0
- package/dist/index.d.ts +8 -4
- package/dist/index.js +1 -1
- package/dist/logger-SE7G5AMI.js +1 -0
- package/dist/main.js +6 -6
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createConsola as r}from"consola";var s=r({stdout:process.stderr}),e={stdout:o=>console.log(o),reporter:{...s}},g={stdout:()=>{},reporter:{info:()=>{},warn:()=>{},success:()=>{},log:()=>{},error:()=>{}}};export{e as a,g as b};
|
package/dist/index.d.ts
CHANGED
|
@@ -29,6 +29,8 @@ type DatabaseValue = z.infer<typeof databaseSchema>;
|
|
|
29
29
|
declare const devDatabaseSchema: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
|
|
30
30
|
container: z.ZodObject<{
|
|
31
31
|
image: z.ZodString;
|
|
32
|
+
reuse: z.ZodOptional<z.ZodBoolean>;
|
|
33
|
+
name: z.ZodOptional<z.ZodString>;
|
|
32
34
|
}, z.core.$strip>;
|
|
33
35
|
}, z.core.$strip>, z.ZodObject<{
|
|
34
36
|
connectionString: z.ZodString;
|
|
@@ -149,10 +151,10 @@ tableExpBuilder?: (builder: ExpressionBuilders<T>) => ReadonlyArray<ReturnType<E
|
|
|
149
151
|
foreignKeys: DefinedForeignKeyConstraint[];
|
|
150
152
|
};
|
|
151
153
|
type DefinedTable = ReturnType<typeof defineTable> & {
|
|
152
|
-
indexes: DefinedIndex
|
|
153
|
-
primaryKeys: DefinedPrimaryKeyConstraint
|
|
154
|
-
uniques: DefinedUniqueConstraint
|
|
155
|
-
foreignKeys: DefinedForeignKeyConstraint
|
|
154
|
+
indexes: ReadonlyArray<DefinedIndex>;
|
|
155
|
+
primaryKeys: ReadonlyArray<DefinedPrimaryKeyConstraint>;
|
|
156
|
+
uniques: ReadonlyArray<DefinedUniqueConstraint>;
|
|
157
|
+
foreignKeys: ReadonlyArray<DefinedForeignKeyConstraint>;
|
|
156
158
|
};
|
|
157
159
|
type DefinedTables = ReadonlyArray<DefinedTable>;
|
|
158
160
|
type DefineConfigProp = {
|
|
@@ -164,6 +166,8 @@ declare const defineConfig: (config: DefineConfigProp) => {
|
|
|
164
166
|
readonly dev: {
|
|
165
167
|
container: {
|
|
166
168
|
image: string;
|
|
169
|
+
reuse?: boolean | undefined;
|
|
170
|
+
name?: string | undefined;
|
|
167
171
|
};
|
|
168
172
|
} | {
|
|
169
173
|
connectionString: string;
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./chunk-EY62Q3Z2.js";var f=(t,r)=>r.length===1?`${t}_${r[0]}_primary_key`:`pk_${t}_${r.join("_")}`,c=(t,r)=>r.length===1?`${t}_${r[0]}_unique`:`uq_${t}_${r.join("_")}`,p=(t,r)=>`idx_${t}_${r.join("_")}`,g=(t,r)=>`fk_${t}_${r.join("_")}`,
|
|
1
|
+
import"./chunk-EY62Q3Z2.js";var f=(t,r)=>r.length===1?`${t}_${r[0]}_primary_key`:`pk_${t}_${r.join("_")}`,c=(t,r)=>r.length===1?`${t}_${r[0]}_unique`:`uq_${t}_${r.join("_")}`,p=(t,r)=>`idx_${t}_${r.join("_")}`,g=(t,r)=>`fk_${t}_${r.join("_")}`,m={primaryKey:f,unique:c,index:p,foreignKey:g};var D=(t,r)=>({type:t,notNull:r?.notNull,primaryKey:r?.primaryKey,unique:r?.unique,defaultSql:r?.defaultSql}),K=(t,r,y)=>{let i=e=>{if(e.length===0)throw new Error("At least one column must be specified.")},l=(e,n)=>`${e}_${t}_${n.join("_")}`,a=y?y({index:(e,n)=>(i(e),{kind:"index",name:n?.name??l("idx",e),columns:e,unique:n?.unique??!1}),primaryKey:(e,n)=>(i(e),{kind:"primaryKey",name:n?.name??l("pk",e),columns:e}),unique:(e,n)=>(i(e),{kind:"unique",name:n?.name??l("uq",e),columns:e}),reference:(e,n,u,o)=>{let s=Array.isArray(e)?e:[e],d=Array.isArray(u)?u:[u];return i(s),i(d),{kind:"foreignKey",name:o?.name??m.foreignKey(t,s),columns:s,referencedTable:n.tableName,referencedColumns:d,onDelete:o?.onDelete,onUpdate:o?.onUpdate}}}):[];return{tableName:t,columns:r,indexes:a.filter(e=>e.kind==="index"),primaryKeys:a.filter(e=>e.kind==="primaryKey"),uniques:a.filter(e=>e.kind==="unique"),foreignKeys:a.filter(e=>e.kind==="foreignKey")}},R=t=>{let r=new Map,y=new Map,i=new Map,l=new Map;for(let a of t.tables){let e=a.tableName;for(let n of a.indexes??[])r.set(`${e}:${n.name}`,{table:e,name:n.name,columns:n.columns,unique:n.unique});for(let n of a.primaryKeys??[])y.set(`${e}:${n.name}`,{table:e,name:n.name,columns:n.columns});for(let n of a.uniques??[])i.set(`${e}:${n.name}`,{table:e,name:n.name,columns:n.columns});for(let n of a.foreignKeys??[])l.set(`${e}:${n.name}`,{table:e,name:n.name,columns:n.columns,referencedTable:n.referencedTable,referencedColumns:n.referencedColumns,onDelete:n.onDelete,onUpdate:n.onUpdate});for(let[n,u]of Object.entries(a.columns)){if(u.primaryKey){let o=m.primaryKey(e,[n]),s=`${e}:${o}`;y.has(s)||y.set(s,{table:e,name:o,columns:[n]})}if(u.unique){let o=m.unique(e,[n]),s=`${e}:${o}`;i.has(s)||i.set(s,{table:e,name:o,columns:[n]})}}}return{...t,dev:t.dev,indexes:Array.from(r.values()),primaryKeyConstraints:Array.from(y.values()),uniqueConstraints:Array.from(i.values()),foreignKeyConstraints:Array.from(l.values())}};export{D as column,R as defineConfig,K as defineTable};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a,b}from"./chunk-3M6BYRKC.js";import"./chunk-EY62Q3Z2.js";export{a as defaultConsolaLogger,b as nullLogger};
|
package/dist/main.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as C,b as x}from"./chunk-EY62Q3Z2.js";import{defineCommand as z,runMain as Et}from"citty";import{Kysely as fe,MysqlDialect as be,PostgresDialect as he,SqliteDialect as _e}from"kysely";import{Pool as J}from"pg";import{createPool as Ce}from"mysql2";import xe from"better-sqlite3";import{PostgresAdapter as de,PostgresDialect as ye}from"kysely";var q=class extends de{async acquireMigrationLock(t,n){await t.selectFrom(n.lockTable).selectAll().forUpdate().execute()}},K=class extends ye{createAdapter(){return new q}};import{DummyDriver as ge}from"kysely";var A=class extends ge{constructor(n){super();this.queries=n}async acquireConnection(){return new k(this.queries)}},k=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 Ee=e=>{switch(e.dialect){case"cockroachdb":return new K({pool:new J({connectionString:e.connectionString})});case"postgres":return new he({pool:new J({connectionString:e.connectionString})});case"mysql":return new be({pool:Ce(e.connectionString)});case"sqlite":return new _e({database:new xe(e.connectionString)});default:throw new Error(`Unsupported dialect: ${e.dialect}`)}},D=e=>new I({databaseProps:e.database,options:e.options}),I=class{constructor(t){this.constructorProps=t}getDB(t){let n=Ee(this.constructorProps.databaseProps);return new $({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}},$=class extends fe{constructor(n,a){let o=[];super({dialect:{...n.dialect,createDriver:()=>a.isPlan?new A(o):n.dialect.createDriver()}});this.plannedQueries=[];this.plannedQueries=o}getPlannedQueries(){return this.plannedQueries}};var Y="1.0.0";import{Migrator as Qe}from"kysely";import{DEFAULT_MIGRATION_TABLE as Z,isColumnDataType as Se,sql as ne}from"kysely";import{readdir as Te,readFile as Oe}from"fs/promises";import{join as we}from"path";import T from"zod";import u from"zod";var S=u.object({type:u.string()}).catchall(u.any()),E=u.object({table:u.string(),name:u.string()}),j=u.object({table:u.string(),column:u.string()}),M=u.object({...E.shape,columns:u.array(u.string()).readonly()}),U=u.object({...E.shape,columns:u.array(u.string()).readonly()}),G=u.enum(["cascade","set null","set default","restrict","no action"]),L=u.object({...E.shape,columns:u.array(u.string()).readonly(),referencedTable:u.string(),referencedColumns:u.array(u.string()).readonly(),onDelete:G.optional(),onUpdate:G.optional()}),X=u.discriminatedUnion("type",[u.object({type:u.literal("create_table"),table:u.string(),columns:u.record(u.string(),S)}),u.object({type:u.literal("drop_table"),table:u.string()}),u.object({...j.shape,type:u.literal("add_column"),attributes:S}),u.object({...j.shape,type:u.literal("drop_column"),attributes:S}),u.object({...j.shape,type:u.literal("alter_column"),before:S,after:S}),u.object({...E.shape,type:u.literal("create_index"),columns:u.array(u.string()).readonly(),unique:u.boolean()}),u.object({...E.shape,type:u.literal("drop_index")}),u.object({...M.shape,type:u.literal("create_primary_key_constraint")}),u.object({...E.shape,type:u.literal("drop_primary_key_constraint")}),u.object({...U.shape,type:u.literal("create_unique_constraint")}),u.object({...E.shape,type:u.literal("drop_unique_constraint")}),u.object({...L.shape,type:u.literal("create_foreign_key_constraint")}),u.object({...E.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 O="migrations",Ke=T.object({operations:T.array(X).readonly()}),Ae=T.object({id:T.string(),version:T.string(),diff:Ke}),F=async()=>{try{let t=(await Te(O)).filter(n=>n.endsWith(".json")).map(async n=>Ae.parse(JSON.parse(await Oe(we(O,n),"utf-8"))));return await Promise.all(t)}catch(e){if(e instanceof Object&&"code"in e&&e.code==="ENOENT")return[];throw e}},v=async e=>{var m=[];try{let t=C(m,e.getDB(),!0);let n=await F();let a=(await t.introspection.getTables({withInternalKyselyTables:!0})).map(r=>r.name);if(!a.includes(Z))return n;let o=await t.selectFrom(Z).select(["name","timestamp"]).$narrowType().execute();return n.filter(r=>!o.some(p=>p.name===r.id))}catch(s){var i=s,c=!0}finally{var d=x(m,i,c);d&&await d}},ae=e=>({getMigrations:async()=>{let t=await e.migrationsResolver(),n={};return t.forEach(a=>{n[a.id]={up:async()=>{await ve(e.db,a.diff)}}}),n}});async function ve(e,t){let n=We(t.operations);for(let a of n)await Pe(e,a)}async function Pe(e,t){switch(t.type){case"create_table":return Re(e,t);case"drop_table":return qe(e,t);case"add_column":return ke(e,t);case"drop_column":return Ie(e,t);case"alter_column":return $e(e,t);case"create_index":return je(e,t);case"drop_index":return Me(e,t);case"create_primary_key_constraint":return Ue(e,t);case"drop_primary_key_constraint":return Le(e,t);case"create_unique_constraint":return Fe(e,t);case"drop_unique_constraint":return Be(e,t);case"create_foreign_key_constraint":return He(e,t);case"drop_foreign_key_constraint":return Ve(e,t);default:throw new Error(`Unknown operation type: ${t.type}`)}}async function Re(e,t){let n=e.schema.createTable(t.table);for(let[a,o]of Object.entries(t.columns)){let m=o.type;B(m),n=n.addColumn(a,m,s=>{let i=s;return o.notNull&&(i=i.notNull()),typeof o.defaultSql=="string"&&(i=i.defaultTo(ne.raw(o.defaultSql))),i})}await n.execute()}async function qe(e,t){await e.schema.dropTable(t.table).execute()}async function ke(e,t){let n=t.attributes.type;B(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(ne.raw(t.attributes.defaultSql))),o}).execute()}async function Ie(e,t){await e.schema.alterTable(t.table).dropColumn(t.column).execute()}async function $e(e,t){let{table:n,column:a,before:o,after:m}=t;if(o.type!==m.type){let s=m.type;B(s),await e.schema.alterTable(n).alterColumn(a,i=>i.setDataType(s)).execute()}m.notNull!==o.notNull&&(m.notNull?await e.schema.alterTable(n).alterColumn(a,s=>s.setNotNull()).execute():await e.schema.alterTable(n).alterColumn(a,s=>s.dropNotNull()).execute())}async function je(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 Me(e,t){await e.schema.dropIndex(t.name).execute()}async function Ue(e,t){await e.schema.alterTable(t.table).addPrimaryKeyConstraint(t.name,t.columns).execute()}async function Le(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}async function Fe(e,t){await e.schema.alterTable(t.table).addUniqueConstraint(t.name,t.columns).execute()}async function Be(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}async function He(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 Ve(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}var B=e=>{if(!Se(e))throw new Error(`Unsupported data type: ${e}`)},ee={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},We=e=>e.slice().sort((t,n)=>{let a=ee[t.type],o=ee[n.type];return a!==o?a-o:te(t).localeCompare(te(n))});function te(e){return e.table}import{format as ze}from"sql-formatter";var w=async e=>{var i=[];try{let{reporter:t}=e.logger;let n=C(i,e.client.getDB({plan:e.options.plan}),!0);let a=new Qe({db:n,provider:ae({db:n,migrationsResolver:async()=>e.options.plan?await v(e.client):await F(),options:{plan:e.options.plan}})});let{results:o,error:m}=await a.migrateToLatest();let s=n.getPlannedQueries();if(s.length>0){s.forEach(l=>{e.logger.stdout(e.options.pretty?ze(l.sql):l.sql)});return}o&&o.length>0?o.forEach(l=>{l.status==="Error"?t.error(`Migration failed: ${l.migrationName}`):l.status==="Success"&&t.success(`Migration applied: ${l.migrationName}`)}):t.info("No migrations to run");if(m)throw m instanceof Error?m:new Error(`Migration error: ${m}`)}catch(c){var d=c,r=!0}finally{var p=x(i,d,r);p&&await p}};import{createConsola as Je}from"consola";var Ye=Je({stdout:process.stderr}),re={stdout:e=>console.log(e),reporter:{...Ye}},oe={stdout:()=>{},reporter:{info:()=>{},warn:()=>{},success:()=>{},log:()=>{},error:()=>{}}};import{mkdir as lt,writeFile as mt}from"fs/promises";import*as y from"ramda";var N=()=>({added:(e,t,n)=>y.pipe(y.difference(t),y.map(n))(e),removed:(e,t,n)=>y.pipe(y.difference(e),y.map(n))(t),changed:(e,t,n,a)=>y.pipe(y.intersection(e),y.filter(n),y.map(a))(t)}),P=y.prop("name"),Ge=y.eqBy(e=>[e.type,e.notNull??!1,e.primaryKey??!1,e.unique??!1]);function Xe(e,t){let n=[],a=N(),o=e.columns,m=t.columns,s=Object.keys(o),i=Object.keys(m);return a.added(s,i,c=>({column:c,attributes:m[c]})).forEach(c=>{n.push(f.addColumn({table:e.name,column:c.column},c.attributes))}),a.removed(s,i,c=>({column:c,attributes:o[c]})).forEach(c=>{n.push(f.dropColumn({table:e.name,column:c.column},c.attributes))}),a.changed(s,i,c=>!Ge(o[c],m[c]),c=>({column:c,before:o[c],after:m[c]})).forEach(c=>{n.push(f.alterColumn({table:e.name,column:c.column},c.before,c.after))}),n}function Ze(e){let{current:t,ideal:n}=e,a=[],o=N(),m=y.map(P,t),s=y.map(P,n);return o.added(m,s,i=>n.find(d=>d.name===i)).forEach(i=>{a.push(f.createTable(i.name,i.columns))}),o.removed(m,s,y.identity).forEach(i=>{a.push(f.dropTable(i))}),y.filter(i=>n.some(c=>c.name===i.name))(t).forEach(i=>{let c=n.find(d=>d.name===i.name);a.push(...Xe(i,c))}),a}function et(e){let{current:t,ideal:n}=e,a=[],o=N(),m=r=>`${r.table}:${r.name}`,s=new Map(t.map(r=>[m(r),r])),i=new Map(n.map(r=>[m(r),r])),c=Array.from(s.keys()),d=Array.from(i.keys());return o.added(c,d,r=>i.get(r)).forEach(r=>{a.push(f.createIndex(r))}),o.removed(c,d,r=>{let p=s.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropIndex(r))}),o.changed(c,d,r=>{let p=s.get(r),l=i.get(r);return!y.equals(p.columns,l.columns)||p.unique!==l.unique},r=>{let p=s.get(r),l=i.get(r);return{current:p,ideal:l}}).forEach(({current:r,ideal:p})=>{a.push(f.dropIndex(r)),a.push(f.createIndex(p))}),a}function tt(e){let{current:t,ideal:n}=e,a=[],o=N(),m=r=>`${r.table}:${r.name}`,s=new Map(t.map(r=>[m(r),r])),i=new Map(n.map(r=>[m(r),r])),c=Array.from(s.keys()),d=Array.from(i.keys());return o.added(c,d,r=>i.get(r)).forEach(r=>{a.push(f.createPrimaryKeyConstraint(r))}),o.removed(c,d,r=>{let p=s.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropPrimaryKeyConstraint(r))}),o.changed(c,d,r=>{let p=s.get(r),l=i.get(r);return!y.equals(p.columns,l.columns)},r=>{let p=s.get(r),l=i.get(r);return{current:p,ideal:l}}).forEach(({current:r,ideal:p})=>{a.push(f.dropPrimaryKeyConstraint(r)),a.push(f.createPrimaryKeyConstraint(p))}),a}function nt(e){let{current:t,ideal:n}=e,a=[],o=N(),m=r=>`${r.table}:${r.name}`,s=new Map(t.map(r=>[m(r),r])),i=new Map(n.map(r=>[m(r),r])),c=Array.from(s.keys()),d=Array.from(i.keys());return o.added(c,d,r=>i.get(r)).forEach(r=>{a.push(f.createUniqueConstraint(r))}),o.removed(c,d,r=>{let p=s.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropUniqueConstraint(r))}),o.changed(c,d,r=>{let p=s.get(r),l=i.get(r);return!y.equals(p.columns,l.columns)},r=>{let p=s.get(r),l=i.get(r);return{current:p,ideal:l}}).forEach(({current:r,ideal:p})=>{a.push(f.dropUniqueConstraint(r)),a.push(f.createUniqueConstraint(p))}),a}function at(e){let t=[],n=N(),a=e.current.map(P),o=e.ideal.map(P);t.push(...n.added(a,o,s=>{let i=e.ideal.find(p=>p.name===s),{table:c,name:d,...r}=i;return f.createForeignKeyConstraint({table:c,name:d},r)})),t.push(...n.removed(a,o,s=>{let i=e.current.find(c=>c.name===s);return f.dropForeignKeyConstraint(i)}));let m=s=>{let i=e.current.find(d=>d.name===s),c=e.ideal.find(d=>d.name===s);return!i||!c?!1:!(y.equals(i.columns,c.columns)&&i.referencedTable===c.referencedTable&&y.equals(i.referencedColumns,c.referencedColumns)&&i.onDelete===c.onDelete&&i.onUpdate===c.onUpdate)};return t.push(...n.changed(a,o,m,s=>{let i=e.current.find(l=>l.name===s),c=e.ideal.find(l=>l.name===s),{table:d,name:r,...p}=c;return[f.dropForeignKeyConstraint(i),f.createForeignKeyConstraint({table:d,name:r},p)]}).flat()),t}function ie(e){let t=Ze({current:e.current.tables,ideal:e.ideal.tables}),n=et({current:e.current.indexes,ideal:e.ideal.indexes}),a=tt({current:e.current.primaryKeyConstraints,ideal:e.ideal.primaryKeyConstraints}),o=nt({current:e.current.uniqueConstraints,ideal:e.ideal.uniqueConstraints}),m=at({current:e.current.foreignKeyConstraints,ideal:e.ideal.foreignKeyConstraints});return{operations:[...t,...n,...a,...o,...m]}}import{sql as H}from"kysely";var rt={bool:"boolean",int2:"smallint",int4:"integer",int8:"bigint"},ot=e=>rt[e]??e,se=e=>({introspectTables:async()=>{var i=[];try{let o=e.client;let m=C(i,o.getDB(),!0);let{rows:s}=await H`
|
|
1
|
+
import{a as ne,b as ae}from"./chunk-3M6BYRKC.js";import{a as _,b as x}from"./chunk-EY62Q3Z2.js";import{defineCommand as Mt,runMain as jt}from"citty";var re="1.1.0";import{defineCommand as lt}from"citty";import y from"zod";import{loadConfig as Ee}from"c12";import u from"zod";var w=u.object({type:u.string()}).catchall(u.any()),N=u.object({table:u.string(),name:u.string()}),j=u.object({table:u.string(),column:u.string()}),L=u.object({...N.shape,columns:u.array(u.string()).readonly()}),F=u.object({...N.shape,columns:u.array(u.string()).readonly()}),oe=u.enum(["cascade","set null","set default","restrict","no action"]),B=u.object({...N.shape,columns:u.array(u.string()).readonly(),referencedTable:u.string(),referencedColumns:u.array(u.string()).readonly(),onDelete:oe.optional(),onUpdate:oe.optional()}),ie=u.discriminatedUnion("type",[u.object({type:u.literal("create_table"),table:u.string(),columns:u.record(u.string(),w)}),u.object({type:u.literal("drop_table"),table:u.string()}),u.object({...j.shape,type:u.literal("add_column"),attributes:w}),u.object({...j.shape,type:u.literal("drop_column"),attributes:w}),u.object({...j.shape,type:u.literal("alter_column"),before:w,after:w}),u.object({...N.shape,type:u.literal("create_index"),columns:u.array(u.string()).readonly(),unique:u.boolean()}),u.object({...N.shape,type:u.literal("drop_index")}),u.object({...L.shape,type:u.literal("create_primary_key_constraint")}),u.object({...N.shape,type:u.literal("drop_primary_key_constraint")}),u.object({...F.shape,type:u.literal("create_unique_constraint")}),u.object({...N.shape,type:u.literal("drop_unique_constraint")}),u.object({...B.shape,type:u.literal("create_foreign_key_constraint")}),u.object({...N.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 Se=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()}),De=y.object({tableName:y.string(),columns:y.record(y.string(),Se)}),we=y.object({...N.shape,columns:y.array(y.string()).readonly(),unique:y.boolean().default(!1)}),Oe=y.enum(["postgres","cockroachdb","mysql","sqlite"]),Te=y.object({dialect:Oe,connectionString:y.string()}),Ae=y.union([y.object({container:y.object({image:y.string(),reuse:y.boolean().optional(),name:y.string().optional()})}),y.object({connectionString:y.string()})]).optional(),Ke=y.object({database:Te,dev:Ae,tables:y.array(De).readonly(),indexes:y.array(we).readonly(),primaryKeyConstraints:y.array(L).readonly(),uniqueConstraints:y.array(F).readonly(),foreignKeyConstraints:y.array(B).readonly()}),se=async()=>{let e=await Ee({name:"kyrage"});return Ke.parse(e.config)};import{Kysely as qe,MysqlDialect as Pe,PostgresDialect as ke,SqliteDialect as $e}from"kysely";import{Pool as ce}from"pg";import{createPool as Ue}from"mysql2";import Me from"better-sqlite3";import{PostgresAdapter as ve,PostgresDialect as Re}from"kysely";var H=class extends ve{async acquireMigrationLock(t,n){await t.selectFrom(n.lockTable).selectAll().forUpdate().execute()}},K=class extends Re{createAdapter(){return new H}};import{DummyDriver as Ie}from"kysely";var v=class extends Ie{constructor(n){super();this.queries=n}async acquireConnection(){return new W(this.queries)}},W=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 je=e=>{switch(e.dialect){case"cockroachdb":return new K({pool:new ce({connectionString:e.connectionString})});case"postgres":return new ke({pool:new ce({connectionString:e.connectionString})});case"mysql":return new Pe({pool:Ue(e.connectionString)});case"sqlite":return new $e({database:new Me(e.connectionString)});default:throw new Error(`Unsupported dialect: ${e.dialect}`)}},R=e=>new Q({databaseProps:e.database,options:e.options}),Q=class{constructor(t){this.constructorProps=t}getDB(t){let n=je(this.constructorProps.databaseProps);return new V({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}},V=class extends qe{constructor(n,a){let s=[];super({dialect:{...n.dialect,createDriver:()=>a.isPlan?new v(s):n.dialect.createDriver()}});this.plannedQueries=[];this.plannedQueries=s}getPlannedQueries(){return this.plannedQueries}};async function S(){let e=await se();return{client:R({database:e.database}),logger:ne,config:e}}import{Migrator as mt}from"kysely";import{DEFAULT_MIGRATION_TABLE as le,isColumnDataType as Le,sql as ue}from"kysely";import{readdir as Fe,readFile as Be}from"fs/promises";import{join as He}from"path";import O from"zod";var T="migrations",We=O.object({operations:O.array(ie).readonly()}),Qe=O.object({id:O.string(),version:O.string(),diff:We}),z=async()=>{try{let t=(await Fe(T)).filter(n=>n.endsWith(".json")).map(async n=>Qe.parse(JSON.parse(await Be(He(T,n),"utf-8"))));return await Promise.all(t)}catch(e){if(e instanceof Object&&"code"in e&&e.code==="ENOENT")return[];throw e}},I=async e=>{var l=[];try{let t=_(l,e.getDB(),!0);let n=await z();let a=(await t.introspection.getTables({withInternalKyselyTables:!0})).map(r=>r.name);if(!a.includes(le))return n;let s=await t.selectFrom(le).select(["name","timestamp"]).$narrowType().execute();return n.filter(r=>!s.some(p=>p.name===r.id))}catch(c){var o=c,i=!0}finally{var d=x(l,o,i);d&&await d}},pe=e=>({getMigrations:async()=>{let t=await e.migrationsResolver(),n={};return t.forEach(a=>{n[a.id]={up:async()=>{await Ve(e.db,a.diff)}}}),n}});async function Ve(e,t){let n=ct(t.operations);for(let a of n)await ze(e,a)}async function ze(e,t){switch(t.type){case"create_table":return Je(e,t);case"drop_table":return Ye(e,t);case"add_column":return Ge(e,t);case"drop_column":return Xe(e,t);case"alter_column":return Ze(e,t);case"create_index":return et(e,t);case"drop_index":return tt(e,t);case"create_primary_key_constraint":return nt(e,t);case"drop_primary_key_constraint":return at(e,t);case"create_unique_constraint":return rt(e,t);case"drop_unique_constraint":return ot(e,t);case"create_foreign_key_constraint":return it(e,t);case"drop_foreign_key_constraint":return st(e,t);default:throw new Error(`Unknown operation type: ${t.type}`)}}async function Je(e,t){let n=e.schema.createTable(t.table);for(let[a,s]of Object.entries(t.columns)){let l=s.type;J(l),n=n.addColumn(a,l,c=>{let o=c;return s.notNull&&(o=o.notNull()),typeof s.defaultSql=="string"&&(o=o.defaultTo(ue.raw(s.defaultSql))),o})}await n.execute()}async function Ye(e,t){await e.schema.dropTable(t.table).execute()}async function Ge(e,t){let n=t.attributes.type;J(n),await e.schema.alterTable(t.table).addColumn(t.column,n,a=>{let s=a;return t.attributes.notNull&&(s=s.notNull()),typeof t.attributes.defaultSql=="string"&&(s=s.defaultTo(ue.raw(t.attributes.defaultSql))),s}).execute()}async function Xe(e,t){await e.schema.alterTable(t.table).dropColumn(t.column).execute()}async function Ze(e,t){let{table:n,column:a,before:s,after:l}=t;if(s.type!==l.type){let c=l.type;J(c),await e.schema.alterTable(n).alterColumn(a,o=>o.setDataType(c)).execute()}l.notNull!==s.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 et(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 tt(e,t){await e.schema.dropIndex(t.name).execute()}async function nt(e,t){await e.schema.alterTable(t.table).addPrimaryKeyConstraint(t.name,t.columns).execute()}async function at(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}async function rt(e,t){await e.schema.alterTable(t.table).addUniqueConstraint(t.name,t.columns).execute()}async function ot(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}async function it(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 st(e,t){await e.schema.alterTable(t.table).dropConstraint(t.name).execute()}var J=e=>{if(!Le(e))throw new Error(`Unsupported data type: ${e}`)},me={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},ct=e=>e.slice().sort((t,n)=>{let a=me[t.type],s=me[n.type];return a!==s?a-s:t.table.localeCompare(n.table)});import{format as ut}from"sql-formatter";async function q(e,t){var r=[];try{let{client:n,logger:a}=e;let{reporter:s}=a;let l=_(r,n.getDB({plan:t.plan}),!0);let c=new mt({db:l,provider:pe({db:l,migrationsResolver:async()=>t.plan?await I(n):await z(),options:{plan:t.plan}})});let{results:o,error:i}=await c.migrateToLatest();let d=l.getPlannedQueries();if(d.length>0){d.forEach(b=>{a.stdout(t.pretty?ut(b.sql):b.sql)});return}o&&o.length>0?o.forEach(b=>{b.status==="Error"?s.error(`Migration failed: ${b.migrationName}`):b.status==="Success"&&s.success(`Migration applied: ${b.migrationName}`)}):s.info("No migrations to run");if(i)throw i instanceof Error?i:new Error(`Migration error: ${i}`)}catch(p){var m=p,h=!0}finally{var C=x(r,m,h);C&&await C}}var de=lt({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 q(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 wt}from"citty";import{mkdir as Ot,writeFile as Tt}from"fs/promises";import*as g from"ramda";var D=()=>({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)}),P=g.prop("name"),pt=g.eqBy(e=>[e.type,e.notNull??!1,e.primaryKey??!1,e.unique??!1]);function dt(e,t){let n=[],a=D(),s=e.columns,l=t.columns,c=Object.keys(s),o=Object.keys(l);return a.added(c,o,i=>({column:i,attributes:l[i]})).forEach(i=>{n.push(f.addColumn({table:e.name,column:i.column},i.attributes))}),a.removed(c,o,i=>({column:i,attributes:s[i]})).forEach(i=>{n.push(f.dropColumn({table:e.name,column:i.column},i.attributes))}),a.changed(c,o,i=>!pt(s[i],l[i]),i=>({column:i,before:s[i],after:l[i]})).forEach(i=>{n.push(f.alterColumn({table:e.name,column:i.column},i.before,i.after))}),n}function yt(e){let{current:t,ideal:n}=e,a=[],s=D(),l=g.map(P,t),c=g.map(P,n);return s.added(l,c,o=>n.find(d=>d.name===o)).forEach(o=>{a.push(f.createTable(o.name,o.columns))}),s.removed(l,c,g.identity).forEach(o=>{a.push(f.dropTable(o))}),g.filter(o=>n.some(i=>i.name===o.name))(t).forEach(o=>{let i=n.find(d=>d.name===o.name);a.push(...dt(o,i))}),a}function gt(e){let{current:t,ideal:n}=e,a=[],s=D(),l=r=>`${r.table}:${r.name}`,c=new Map(t.map(r=>[l(r),r])),o=new Map(n.map(r=>[l(r),r])),i=Array.from(c.keys()),d=Array.from(o.keys());return s.added(i,d,r=>o.get(r)).forEach(r=>{a.push(f.createIndex(r))}),s.removed(i,d,r=>{let p=c.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropIndex(r))}),s.changed(i,d,r=>{let p=c.get(r),m=o.get(r);return!g.equals(p.columns,m.columns)||p.unique!==m.unique},r=>{let p=c.get(r),m=o.get(r);return{current:p,ideal:m}}).forEach(({current:r,ideal:p})=>{a.push(f.dropIndex(r)),a.push(f.createIndex(p))}),a}function ft(e){let{current:t,ideal:n}=e,a=[],s=D(),l=r=>`${r.table}:${r.name}`,c=new Map(t.map(r=>[l(r),r])),o=new Map(n.map(r=>[l(r),r])),i=Array.from(c.keys()),d=Array.from(o.keys());return s.added(i,d,r=>o.get(r)).forEach(r=>{a.push(f.createPrimaryKeyConstraint(r))}),s.removed(i,d,r=>{let p=c.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropPrimaryKeyConstraint(r))}),s.changed(i,d,r=>{let p=c.get(r),m=o.get(r);return!g.equals(p.columns,m.columns)},r=>{let p=c.get(r),m=o.get(r);return{current:p,ideal:m}}).forEach(({current:r,ideal:p})=>{a.push(f.dropPrimaryKeyConstraint(r)),a.push(f.createPrimaryKeyConstraint(p))}),a}function bt(e){let{current:t,ideal:n}=e,a=[],s=D(),l=r=>`${r.table}:${r.name}`,c=new Map(t.map(r=>[l(r),r])),o=new Map(n.map(r=>[l(r),r])),i=Array.from(c.keys()),d=Array.from(o.keys());return s.added(i,d,r=>o.get(r)).forEach(r=>{a.push(f.createUniqueConstraint(r))}),s.removed(i,d,r=>{let p=c.get(r);return{table:p.table,name:p.name}}).forEach(r=>{a.push(f.dropUniqueConstraint(r))}),s.changed(i,d,r=>{let p=c.get(r),m=o.get(r);return!g.equals(p.columns,m.columns)},r=>{let p=c.get(r),m=o.get(r);return{current:p,ideal:m}}).forEach(({current:r,ideal:p})=>{a.push(f.dropUniqueConstraint(r)),a.push(f.createUniqueConstraint(p))}),a}function Ct(e){let t=[],n=D(),a=e.current.map(P),s=e.ideal.map(P);t.push(...n.added(a,s,c=>{let o=e.ideal.find(p=>p.name===c),{table:i,name:d,...r}=o;return f.createForeignKeyConstraint({table:i,name:d},r)})),t.push(...n.removed(a,s,c=>{let o=e.current.find(i=>i.name===c);return f.dropForeignKeyConstraint(o)}));let l=c=>{let o=e.current.find(d=>d.name===c),i=e.ideal.find(d=>d.name===c);return!o||!i?!1:!(g.equals(o.columns,i.columns)&&o.referencedTable===i.referencedTable&&g.equals(o.referencedColumns,i.referencedColumns)&&o.onDelete===i.onDelete&&o.onUpdate===i.onUpdate)};return t.push(...n.changed(a,s,l,c=>{let o=e.current.find(m=>m.name===c),i=e.ideal.find(m=>m.name===c),{table:d,name:r,...p}=i;return[f.dropForeignKeyConstraint(o),f.createForeignKeyConstraint({table:d,name:r},p)]}).flat()),t}function ye(e){let t=yt({current:e.current.tables,ideal:e.ideal.tables}),n=gt({current:e.current.indexes,ideal:e.ideal.indexes}),a=ft({current:e.current.primaryKeyConstraints,ideal:e.ideal.primaryKeyConstraints}),s=bt({current:e.current.uniqueConstraints,ideal:e.ideal.uniqueConstraints}),l=Ct({current:e.current.foreignKeyConstraints,ideal:e.ideal.foreignKeyConstraints});return{operations:[...t,...n,...a,...s,...l]}}import{sql as Y}from"kysely";var ht={bool:"boolean",int2:"smallint",int4:"integer",int8:"bigint"},_t=e=>ht[e]??e,ge=e=>({introspectTables:async()=>{var o=[];try{let s=e.client;let l=_(o,s.getDB(),!0);let{rows:c}=await Y`
|
|
2
2
|
SELECT
|
|
3
3
|
n.nspname AS table_schema,
|
|
4
4
|
c.relname AS table_name,
|
|
@@ -18,7 +18,7 @@ import{a as C,b as x}from"./chunk-EY62Q3Z2.js";import{defineCommand as z,runMain
|
|
|
18
18
|
AND a.attnum > 0
|
|
19
19
|
AND NOT a.attisdropped
|
|
20
20
|
ORDER BY c.relname, a.attnum;
|
|
21
|
-
`.$castTo().execute(
|
|
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(i){var d=i,r=!0}finally{var p=x(o,d,r);p&&await p}},introspectIndexes:async()=>{var o=[];try{let s=e.client;let l=_(o,s.getDB(),!0);let{rows:c}=await Y`
|
|
22
22
|
SELECT
|
|
23
23
|
t.relname AS table_name,
|
|
24
24
|
i.relname AS index_name,
|
|
@@ -38,7 +38,7 @@ import{a as C,b as x}from"./chunk-EY62Q3Z2.js";import{defineCommand as z,runMain
|
|
|
38
38
|
AND con.contype IN ('p', 'u')
|
|
39
39
|
)
|
|
40
40
|
GROUP BY t.relname, i.relname, pg_index.indisunique, pg_index.indisprimary, i.oid;
|
|
41
|
-
`.$castTo().execute(
|
|
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(i){var d=i,r=!0}finally{var p=x(o,d,r);p&&await p}},introspectConstraints:async()=>{var o=[];try{let s=e.client;let l=_(o,s.getDB(),!0);let{rows:c}=await Y`
|
|
42
42
|
SELECT
|
|
43
43
|
n.nspname AS schema,
|
|
44
44
|
t.relname AS table,
|
|
@@ -94,8 +94,8 @@ import{a as C,b as x}from"./chunk-EY62Q3Z2.js";import{defineCommand as z,runMain
|
|
|
94
94
|
GROUP BY n.nspname, t.relname, c.conname, c.contype, c.oid, c.conkey, t.oid,
|
|
95
95
|
rt.relname, c.confkey, c.confdeltype, c.confupdtype
|
|
96
96
|
ORDER BY t.relname, c.conname;
|
|
97
|
-
`.$castTo().execute(
|
|
98
|
-
`));return}}let
|
|
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:A,...E}=m;return{...E,referencedTable:h,referencedColumns:C,onDelete:b,onUpdate:A}})}}catch(i){var d=i,r=!0}finally{var p=x(o,d,r);p&&await p}},convertTypeName:_t});var xt=e=>{let t=e.getDialect();switch(t){case"postgres":case"cockroachdb":return ge({client:e});default:throw new Error(`Unsupported dialect: ${t}`)}},fe=e=>{let t=xt(e);return{getTables:async()=>{var l=[];try{let n=_(l,e.getDB(),!0);let a=await n.introspection.getTables();let s=await t.introspectTables();return a.map(r=>{let p=Object.fromEntries(r.columns.map(m=>{let C=s.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 o=c,i=!0}finally{var d=x(l,o,i);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_")),s=n.unique.filter(c=>!c.table.startsWith("kysely_")),l=n.foreignKey.filter(c=>!c.table.startsWith("kysely_"));return{primaryKey:a,unique:s,foreignKey:l}}}};import{PostgreSqlContainer as Nt}from"@testcontainers/postgresql";import{CockroachDbContainer as Et}from"@testcontainers/cockroachdb";import{getContainerRuntimeClient as ee}from"testcontainers";var be="kyrage.dialect",Ce="kyrage.managed",St=async()=>(await(await ee()).container.list()).filter(n=>n.Labels[Ce]==="true").map(n=>n.Id),Dt=async e=>{let t=await ee();await Promise.allSettled(e.map(async n=>t.container.getById(n).remove({force:!0})))},k=class{constructor(t,n){this.options=t;this.startedContainer=null;let a=n();a.withLabels({[be]:this.options.dialect,[Ce]:"true"}),this.options.reuse&&a.withReuse(),this.options.containerName&&a.withName(this.options.containerName),this.container=a}async findRunningContainer(){return(await ee()).container.fetchByLabel(be,this.options.dialect,{status:["running"]})}async exists(){return!!await this.findRunningContainer()}async start(){this.startedContainer=await this.container.start()}getConnectionString(){return this.startedContainer?this.startedContainer.getConnectionUri():null}async stop(){this.startedContainer&&(await this.startedContainer.stop(),this.startedContainer=null)}async remove(){let t=await St();await Dt(t),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}}},G=class extends k{constructor(t){super(t,()=>new Nt(t.image))}},X=class extends k{constructor(t){super(t,()=>new Et(t.image))}},Z=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"}}},$=(e,t)=>{if("connectionString"in e)return new Z(e.connectionString);if("container"in e){let n={dialect:t,image:e.container.image,reuse:e.container.reuse||!1,containerName:e.container.name};switch(t){case"postgres":return new G(n);case"cockroachdb":return new X(n);default:throw new Error(`Unsupported dialect for container: ${t}`)}}else throw new Error("Invalid dev database configuration")};async function At(e,t){let{client:n,logger:a,config:s}=e,{reporter:l}=a,{client:c,cleanup:o}=await Kt(e,t);try{if(!t.dev&&!t.ignorePending){let r=await I(n);if(r.length>0){l.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 vt({client:c,config:s});if(!i){l.info("No changes detected, no migration needed.");return}Rt(a,i.diff);let d=`${T}/${i.id}.json`;await Ot(T,{recursive:!0}),await Tt(d,JSON.stringify(i,null,2)),l.success(`Migration file generated: ${d}`),t.apply&&(t.dev?l.warn("--apply flag is ignored when using --dev. Use 'kyrage apply' to apply to production database."):await q(e,{plan:t.plan,pretty:!1}))}finally{await o()}}var Kt=async(e,t)=>{let{client:n,logger:a,config:s}=e,{reporter:l}=a;if(!t.dev)return{client:n,cleanup:async()=>{}};if(!s.dev)throw new Error("Dev database configuration is required when using --dev flag");let c=s.database.dialect,o=$(s.dev,c),i="container"in s.dev&&s.dev.container.reuse;i&&await o.exists()?l.info("\u{1F504} Reusing existing dev database..."):l.info("\u{1F680} Starting dev database for migration generation..."),await o.start(),l.success(`Dev database started: ${c}`);let d=o.getConnectionString();if(!d)throw new Error("Failed to get connection string for dev database");let r=R({database:{dialect:c,connectionString:d}});return await q({client:r,logger:ae,config:s},{plan:!1,pretty:!1}),{client:r,cleanup:async()=>{i?l.success("\u2728 Persistent dev database ready: "+c):(await o.stop(),l.success("Dev database stopped"))}}},vt=async e=>{let{client:t,config:n}=e,a=fe(t),s=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),o=s.map(m=>({name:m.name,columns:Object.fromEntries(Object.entries(m.columns).map(([h,C])=>{let b=c(m.name,h),E=l.primaryKey.some(M=>M.table===m.name&&M.columns.length>1&&M.columns.includes(h))?!0:C.notNull;return[h,{type:C.dataType,notNull:E,primaryKey:b(l.primaryKey),unique:b(l.unique),defaultSql:C.default??void 0}]}))})),i=n.tables.map(m=>({name:m.tableName,columns:Object.fromEntries(Object.entries(m.columns).map(([h,C])=>{let b=(n.primaryKeyConstraints??[]).some(E=>E.table===m.tableName&&E.columns.includes(h)),A=C.primaryKey||C.notNull||b;return[h,{...C,notNull:A}]}))})),d=await a.getIndexes(),r=ye({current:{tables:o,indexes:d,primaryKeyConstraints:l.primaryKey,uniqueConstraints:l.unique,foreignKeyConstraints:l.foreignKey},ideal:{tables:i,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}},Rt=(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(([s,l])=>{n.push(` -> column: ${s} (${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
99
|
`));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
100
|
`));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
|
-
`))}
|
|
101
|
+
`))},he=wt({meta:{name:"generate",description:"Generate migration files based on the current schema"},args:{apply:{type:"boolean",description:"Apply the migration after generating it",default:!1},plan:{type:"boolean",description:"Plan the migration without applying it (only for --apply)",default:!1},"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}},run:async e=>{try{let t=await S();await At(t,{ignorePending:e.args["ignore-pending"],apply:e.args.apply,plan:e.args.plan,dev:e.args.dev})}catch(t){let{defaultConsolaLogger:n}=await import("./logger-SE7G5AMI.js");n.reporter.error(t),process.exit(1)}}});import{defineCommand as U}from"citty";async function It(e){let{manager:t}=e,n=await t.getStatus();if(!n||n.type!=="container"){console.log("No running dev containers found");return}console.log(`Running: ${n.containerID} (${n.imageName})`)}async function qt(e){let{manager:t}=e;if(!await t.exists()){console.log("No running dev containers found");return}await t.start();let n=t.getConnectionString();if(n)console.log(n);else throw new Error("Failed to get connection string")}async function Pt(e){let{manager:t,logger:n}=e;if(!await t.exists()){console.log("No dev containers found");return}await t.remove(),n.reporter.success("Cleaned up dev containers")}async function te(){let e=await S();if(!e.config.dev||!("container"in e.config.dev))throw new Error("No dev database container configuration found");let t=$(e.config.dev,e.config.database.dialect);return{...e,manager:t}}var kt=U({meta:{name:"status",description:"Show status of kyrage dev container"},run:async()=>{try{let e=await te();await It(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),$t=U({meta:{name:"get-url",description:"Print connection URL for running dev container"},run:async()=>{try{let e=await te();await qt(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),Ut=U({meta:{name:"clean",description:"Remove all kyrage dev containers"},run:async()=>{try{let e=await te();await Pt(e)}catch(e){let{defaultConsolaLogger:t}=await import("./logger-SE7G5AMI.js");t.reporter.error(e),process.exit(1)}}}),_e=U({meta:{name:"dev",description:"Manage development database containers"},subCommands:{status:kt,"get-url":$t,clean:Ut}});var Lt=Mt({meta:{name:"kyrage",version:re,description:"Kysely migration CLI with declarative schema"},subCommands:{apply:de,generate:he,dev:_e}});jt(Lt);
|
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
|
+
"version": "1.1.0",
|
|
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",
|
|
@@ -43,15 +43,15 @@
|
|
|
43
43
|
"ramda": "^0.31.3",
|
|
44
44
|
"sql-formatter": "^15.6.6",
|
|
45
45
|
"testcontainers": "^11.5.1",
|
|
46
|
-
"zod": "^4.
|
|
46
|
+
"zod": "^4.1.1"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@swc/core": "^1.13.
|
|
49
|
+
"@swc/core": "^1.13.5",
|
|
50
50
|
"@types/better-sqlite3": "^7.6.13",
|
|
51
51
|
"@types/node": "^24.3.0",
|
|
52
52
|
"@types/pg": "^8.15.5",
|
|
53
53
|
"@types/ramda": "^0.31.0",
|
|
54
|
-
"memfs": "^4.
|
|
54
|
+
"memfs": "^4.38.1",
|
|
55
55
|
"prettier": "^3.6.2",
|
|
56
56
|
"tsup": "^8.5.0",
|
|
57
57
|
"typescript": "^5.9.2",
|