@izumisy/kyrage 1.5.0 → 1.5.1
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/main.js +1 -1
- package/package.json +8 -8
package/dist/main.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as N,b as w}from"./chunk-EY62Q3Z2.js";import{defineCommand as Yn,runMain as Zn}from"citty";var qe="1.5.
|
|
1
|
+
import{a as N,b as w}from"./chunk-EY62Q3Z2.js";import{defineCommand as Yn,runMain as Zn}from"citty";var qe="1.5.1";import{defineCommand as On}from"citty";import f from"zod";import{loadConfig as Et}from"c12";import b from"zod";var O=b.object({type:b.string()}).catchall(b.any()),h=b.object({table:b.string(),name:b.string()}),I=b.object({table:b.string(),column:b.string()}),G=b.object({...h.shape,columns:b.array(b.string()).readonly()}),J=b.object({...h.shape,columns:b.array(b.string()).readonly()}),L=b.enum(["cascade","set null","set default","restrict","no action"]),Y=b.object({...h.shape,columns:b.array(b.string()).readonly(),referencedTable:b.string(),referencedColumns:b.array(b.string()).readonly(),onDelete:L.optional(),onUpdate:L.optional(),inline:b.boolean().optional()});import{getContainerRuntimeClient as me}from"testcontainers";import Z from"zod";var k=e=>Z.object({container:Z.object({image:Z.string().default(e.defaultImage),name:Z.string().optional()})}),q=class{constructor(t,n){this.dialect=t;this.containerFactory=n}async setup(t,n){return new le({dialect:this.dialect,manageType:n,containerName:t.container.name,containerFactory:()=>this.containerFactory(t.container.image)})}async hasExisting(t){return t==="dev-start"?F(this.dialect):!1}async cleanup(){await $e()}},ce="kyrage.dialect",pe="kyrage.managed",ke="kyrage.managed-by",le=class{constructor(t){this.options=t;this.startedContainer=null;this.container=this.setupContainer()}setupContainer(){let t=this.options.containerFactory();return t.withLabels({[ce]:this.options.dialect,[pe]:"true",[ke]:this.options.manageType}),this.options.manageType==="dev-start"&&t.withReuse(),this.options.containerName&&t.withName(this.options.containerName),t}async start(){this.startedContainer=await this.container.start()}async stop(){this.startedContainer&&(await this.startedContainer.stop(),this.startedContainer=null)}async remove(){await $e(),this.startedContainer=null}getConnectionString(){if(!this.startedContainer)throw new Error("Container is not started");return this.startedContainer.getConnectionUri()}async getStatus(){let n=await(await me()).container.fetchByLabel(ce,this.options.dialect,{status:["running"]});if(n){let r=await n.inspect();return{type:"container",imageName:r.Config.Image,containerID:r.Id}}return{type:"unavailable"}}async isAvailable(){return(await this.getStatus()).type==="container"}},F=async e=>(await(await me()).container.list()).some(r=>r.Labels[pe]==="true"&&r.Labels[ke]==="dev-start"&&r.Labels[ce]===e&&r.State==="running"),$e=async()=>{let e=await me(),n=(await e.container.list()).filter(r=>r.Labels[pe]==="true").map(r=>r.Id);await Promise.allSettled(n.map(async r=>e.container.getById(r).remove({force:!0})))};var Kt=f.object({type:f.string(),primaryKey:f.boolean().optional().default(!1),notNull:f.boolean().optional().default(!1),unique:f.boolean().optional().default(!1),defaultSql:f.string().optional()}),Rt=f.object({tableName:f.string(),columns:f.record(f.string(),Kt)}),Pt=f.object({...h.shape,columns:f.array(f.string()).readonly(),unique:f.boolean().default(!1)}),It=f.enum(["postgres","cockroachdb"]),qt=f.object({dialect:It,connectionString:f.string()}),kt=f.union([k({defaultImage:""})]),$t=f.object({database:qt,dev:kt.optional(),tables:f.array(Rt).readonly(),indexes:f.array(Pt).readonly(),primaryKeyConstraints:f.array(G).readonly(),uniqueConstraints:f.array(J).readonly(),foreignKeyConstraints:f.array(Y).readonly()}),Me=async()=>{let e=await Et({name:"kyrage"});return $t.parse(e.config)};import{Kysely as Jt}from"kysely";import{PostgresDialect as Mt,sql as ue}from"kysely";import{Pool as Ut}from"pg";import{PostgreSqlContainer as jt}from"@testcontainers/postgresql";import*as v from"ramda";var Ue=(e,t)=>{let n=m=>i=>v.any(v.whereEq({name:i.name,table:i.table}),m),[r,o]=v.partition(n(e.uniqueConstraints),t.constraints.unique),[l,a]=v.partition(n(e.indexes),t.indexes),c=v.reject(n(l),o),s=v.reject(n(r),a);return{indexes:[...l,...s],uniqueConstraints:[...r,...c]}};var X=class{getName(){return"postgres"}createKyselyDialect(t){return new Mt({pool:new Ut({connectionString:t})})}createIntrospectionDriver(t){return{convertTypeName:ye,introspect:de(t)}}createDevDatabaseProvider(){return new q(this.getName(),t=>new jt(t))}parseDevDatabaseConfig(t){return k({defaultImage:"postgres:16"}).parse(t)}async hasReusableDevDatabase(){return F(this.getName())}},de=e=>async t=>{var s=[];try{let n=N(s,e.getDB(),!0);let[r,o,l]=await Promise.all([Lt(n),Ft(n),Bt(n)]);let{indexes:a,uniqueConstraints:c}=Ue(t.config,{indexes:o,constraints:l});return{tables:r,indexes:a,constraints:{...l,unique:c}}}catch(m){var i=m,p=!0}finally{var u=w(s,i,p);u&&await u}},ye=e=>({bool:"boolean",int2:"smallint",int4:"integer",int8:"bigint"})[e]??e,Lt=async e=>{let{rows:t}=await ue`
|
|
2
2
|
SELECT
|
|
3
3
|
n.nspname AS table_schema,
|
|
4
4
|
c.relname AS table_name,
|
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.
|
|
5
|
+
"version": "1.5.1",
|
|
6
6
|
"description": "A minimal, schema-based declarative migration tool for Node.js ecosystem",
|
|
7
7
|
"author": "Seiya Izumi (https://github.com/IzumiSy)",
|
|
8
8
|
"license": "MIT",
|
|
@@ -30,19 +30,19 @@
|
|
|
30
30
|
"kyrage": "./dist/main.js"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@testcontainers/cockroachdb": "^11.
|
|
34
|
-
"@testcontainers/postgresql": "^11.
|
|
35
|
-
"better-sqlite3": "^12.
|
|
33
|
+
"@testcontainers/cockroachdb": "^11.7.1",
|
|
34
|
+
"@testcontainers/postgresql": "^11.7.1",
|
|
35
|
+
"better-sqlite3": "^12.4.1",
|
|
36
36
|
"c12": "^3.3.0",
|
|
37
37
|
"citty": "^0.1.6",
|
|
38
38
|
"consola": "^3.4.2",
|
|
39
39
|
"graph-data-structure": "^4.5.0",
|
|
40
40
|
"kysely": "^0.28.7",
|
|
41
|
-
"mysql2": "^3.15.
|
|
41
|
+
"mysql2": "^3.15.1",
|
|
42
42
|
"pg": "^8.16.3",
|
|
43
43
|
"ramda": "^0.31.3",
|
|
44
|
-
"sql-formatter": "^15.6.
|
|
45
|
-
"testcontainers": "^11.
|
|
44
|
+
"sql-formatter": "^15.6.10",
|
|
45
|
+
"testcontainers": "^11.7.1",
|
|
46
46
|
"zod": "^4.1.11"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"@types/node": "^24",
|
|
52
52
|
"@types/pg": "^8.15.5",
|
|
53
53
|
"@types/ramda": "^0.31.1",
|
|
54
|
-
"memfs": "^4.
|
|
54
|
+
"memfs": "^4.48.1",
|
|
55
55
|
"prettier": "^3",
|
|
56
56
|
"tsup": "^8.5.0",
|
|
57
57
|
"typescript": "^5",
|