@izumisy/kyrage 1.5.5 → 1.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.mjs +1 -1
  2. package/package.json +4 -4
package/dist/main.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{defineCommand as e,runMain as t}from"citty";import n from"zod";import{loadConfig as r}from"c12";import{getContainerRuntimeClient as i}from"testcontainers";import{DEFAULT_MIGRATION_TABLE as a,DummyDriver as o,Kysely as s,Migrator as c,PostgresAdapter as l,PostgresDialect as u,isColumnDataType as ee,sql as d}from"kysely";import{Pool as f}from"pg";import{PostgreSqlContainer as te}from"@testcontainers/postgresql";import*as p from"ramda";import{CockroachDbContainer as ne}from"@testcontainers/cockroachdb";import{createConsola as re}from"consola";import*as ie from"fs/promises";import{join as m}from"path";import{CycleError as ae,Graph as oe,topologicalSort as se}from"graph-data-structure";import{format as ce}from"sql-formatter";var le=`1.5.5`;const h=n.object({type:n.string()}).catchall(n.any()),g=n.object({table:n.string(),name:n.string()}),_=n.object({table:n.string(),column:n.string()}),ue=n.object({...g.shape,columns:n.array(n.string()).readonly()}),de=n.object({...g.shape,columns:n.array(n.string()).readonly()}),v=n.enum([`cascade`,`set null`,`set default`,`restrict`,`no action`]),fe=n.object({...g.shape,columns:n.array(n.string()).readonly(),referencedTable:n.string(),referencedColumns:n.array(n.string()).readonly(),onDelete:v.optional(),onUpdate:v.optional(),inline:n.boolean().optional()}),y=e=>n.object({container:n.object({image:n.string().default(e.defaultImage),name:n.string().optional()})});var b=class{constructor(e,t){this.dialect=e,this.containerFactory=t}async setup(e,t){return new pe({dialect:this.dialect,manageType:t,containerName:e.container.name,containerFactory:()=>this.containerFactory(e.container.image)})}async hasExisting(e){return e===`dev-start`?w(this.dialect):!1}async cleanup(){await T()}};const x=`kyrage.dialect`,S=`kyrage.managed`,C=`kyrage.managed-by`;var pe=class{constructor(e){this.options=e,this.startedContainer=null,this.container=this.setupContainer()}setupContainer(){let e=this.options.containerFactory();return e.withLabels({[x]:this.options.dialect,[S]:`true`,[C]:this.options.manageType}),this.options.manageType===`dev-start`&&e.withReuse(),this.options.containerName&&e.withName(this.options.containerName),e}async start(){this.startedContainer=await this.container.start()}async stop(){this.startedContainer&&=(await this.startedContainer.stop(),null)}async remove(){await T(),this.startedContainer=null}getConnectionString(){if(!this.startedContainer)throw Error(`Container is not started`);return this.startedContainer.getConnectionUri()}async getStatus(){let e=await(await i()).container.fetchByLabel(x,this.options.dialect,{status:[`running`]});if(e){let t=await e.inspect();return{type:`container`,imageName:t.Config.Image,containerID:t.Id}}return{type:`unavailable`}}async isAvailable(){return(await this.getStatus()).type===`container`}};const w=async e=>(await(await i()).container.list()).some(t=>t.Labels[S]===`true`&&t.Labels[C]===`dev-start`&&t.Labels[x]===e&&t.State===`running`),T=async()=>{let e=await i(),t=(await e.container.list()).filter(e=>e.Labels[S]===`true`).map(e=>e.Id);await Promise.allSettled(t.map(async t=>e.container.getById(t).remove({force:!0})))},me=n.object({type:n.string(),primaryKey:n.boolean().optional().default(!1),notNull:n.boolean().optional().default(!1),unique:n.boolean().optional().default(!1),defaultSql:n.string().optional()}),he=n.object({tableName:n.string(),columns:n.record(n.string(),me)}),ge=n.object({...g.shape,columns:n.array(n.string()).readonly(),unique:n.boolean().default(!1)}),_e=n.enum([`postgres`,`cockroachdb`]),ve=n.object({dialect:_e,connectionString:n.string()}),ye=n.union([y({defaultImage:``})]),be=n.object({database:ve,dev:ye.optional(),tables:n.array(he).readonly(),indexes:n.array(ge).readonly(),primaryKeyConstraints:n.array(ue).readonly(),uniqueConstraints:n.array(de).readonly(),foreignKeyConstraints:n.array(fe).readonly()}),xe=async()=>{let e=await r({name:`kyrage`});return be.parse(e.config)},Se=(e,t)=>{let n=e=>t=>p.any(p.whereEq({name:t.name,table:t.table}),e),[r,i]=p.partition(n(e.uniqueConstraints),t.constraints.unique),[a,o]=p.partition(n(e.indexes),t.indexes),s=p.reject(n(a),i),c=p.reject(n(r),o);return{indexes:[...a,...c],uniqueConstraints:[...r,...s]}};var Ce=class{getName(){return`postgres`}createKyselyDialect(e){return new u({pool:new f({connectionString:e})})}createIntrospectionDriver(e){return{convertTypeName:D,introspect:E(e)}}createDevDatabaseProvider(){return new b(this.getName(),e=>new te(e))}parseDevDatabaseConfig(e){return y({defaultImage:`postgres:16`}).parse(e)}async hasReusableDevDatabase(){return w(this.getName())}};const E=e=>async t=>{await using n=e.getDB();let[r,i,a]=await Promise.all([we(n),Te(n),Ee(n)]),{indexes:o,uniqueConstraints:s}=Se(t.config,{indexes:i,constraints:a});return{tables:r,indexes:o,constraints:{...a,unique:s}}},D=e=>({bool:`boolean`,int2:`smallint`,int4:`integer`,int8:`bigint`})[e]??e,we=async e=>{let{rows:t}=await d`
1
+ import{defineCommand as e,runMain as t}from"citty";import n from"zod";import{loadConfig as r}from"c12";import{getContainerRuntimeClient as i}from"testcontainers";import{DEFAULT_MIGRATION_TABLE as a,DummyDriver as o,Kysely as s,Migrator as c,PostgresAdapter as l,PostgresDialect as u,isColumnDataType as ee,sql as d}from"kysely";import{Pool as f}from"pg";import{PostgreSqlContainer as te}from"@testcontainers/postgresql";import*as p from"ramda";import{CockroachDbContainer as ne}from"@testcontainers/cockroachdb";import{createConsola as re}from"consola";import*as ie from"fs/promises";import{join as m}from"path";import{CycleError as ae,Graph as oe,topologicalSort as se}from"graph-data-structure";import{format as ce}from"sql-formatter";var le=`1.5.6`;const h=n.object({type:n.string()}).catchall(n.any()),g=n.object({table:n.string(),name:n.string()}),_=n.object({table:n.string(),column:n.string()}),ue=n.object({...g.shape,columns:n.array(n.string()).readonly()}),de=n.object({...g.shape,columns:n.array(n.string()).readonly()}),v=n.enum([`cascade`,`set null`,`set default`,`restrict`,`no action`]),fe=n.object({...g.shape,columns:n.array(n.string()).readonly(),referencedTable:n.string(),referencedColumns:n.array(n.string()).readonly(),onDelete:v.optional(),onUpdate:v.optional(),inline:n.boolean().optional()}),y=e=>n.object({container:n.object({image:n.string().default(e.defaultImage),name:n.string().optional()})});var b=class{constructor(e,t){this.dialect=e,this.containerFactory=t}async setup(e,t){return new pe({dialect:this.dialect,manageType:t,containerName:e.container.name,containerFactory:()=>this.containerFactory(e.container.image)})}async hasExisting(e){return e===`dev-start`?w(this.dialect):!1}async cleanup(){await T()}};const x=`kyrage.dialect`,S=`kyrage.managed`,C=`kyrage.managed-by`;var pe=class{constructor(e){this.options=e,this.startedContainer=null,this.container=this.setupContainer()}setupContainer(){let e=this.options.containerFactory();return e.withLabels({[x]:this.options.dialect,[S]:`true`,[C]:this.options.manageType}),this.options.manageType===`dev-start`&&e.withReuse(),this.options.containerName&&e.withName(this.options.containerName),e}async start(){this.startedContainer=await this.container.start()}async stop(){this.startedContainer&&=(await this.startedContainer.stop(),null)}async remove(){await T(),this.startedContainer=null}getConnectionString(){if(!this.startedContainer)throw Error(`Container is not started`);return this.startedContainer.getConnectionUri()}async getStatus(){let e=await(await i()).container.fetchByLabel(x,this.options.dialect,{status:[`running`]});if(e){let t=await e.inspect();return{type:`container`,imageName:t.Config.Image,containerID:t.Id}}return{type:`unavailable`}}async isAvailable(){return(await this.getStatus()).type===`container`}};const w=async e=>(await(await i()).container.list()).some(t=>t.Labels[S]===`true`&&t.Labels[C]===`dev-start`&&t.Labels[x]===e&&t.State===`running`),T=async()=>{let e=await i(),t=(await e.container.list()).filter(e=>e.Labels[S]===`true`).map(e=>e.Id);await Promise.allSettled(t.map(async t=>e.container.getById(t).remove({force:!0})))},me=n.object({type:n.string(),primaryKey:n.boolean().optional().default(!1),notNull:n.boolean().optional().default(!1),unique:n.boolean().optional().default(!1),defaultSql:n.string().optional()}),he=n.object({tableName:n.string(),columns:n.record(n.string(),me)}),ge=n.object({...g.shape,columns:n.array(n.string()).readonly(),unique:n.boolean().default(!1)}),_e=n.enum([`postgres`,`cockroachdb`]),ve=n.object({dialect:_e,connectionString:n.string()}),ye=n.union([y({defaultImage:``})]),be=n.object({database:ve,dev:ye.optional(),tables:n.array(he).readonly(),indexes:n.array(ge).readonly(),primaryKeyConstraints:n.array(ue).readonly(),uniqueConstraints:n.array(de).readonly(),foreignKeyConstraints:n.array(fe).readonly()}),xe=async()=>{let e=await r({name:`kyrage`});return be.parse(e.config)},Se=(e,t)=>{let n=e=>t=>p.any(p.whereEq({name:t.name,table:t.table}),e),[r,i]=p.partition(n(e.uniqueConstraints),t.constraints.unique),[a,o]=p.partition(n(e.indexes),t.indexes),s=p.reject(n(a),i),c=p.reject(n(r),o);return{indexes:[...a,...c],uniqueConstraints:[...r,...s]}};var Ce=class{getName(){return`postgres`}createKyselyDialect(e){return new u({pool:new f({connectionString:e})})}createIntrospectionDriver(e){return{convertTypeName:D,introspect:E(e)}}createDevDatabaseProvider(){return new b(this.getName(),e=>new te(e))}parseDevDatabaseConfig(e){return y({defaultImage:`postgres:16`}).parse(e)}async hasReusableDevDatabase(){return w(this.getName())}};const E=e=>async t=>{await using n=e.getDB();let[r,i,a]=await Promise.all([we(n),Te(n),Ee(n)]),{indexes:o,uniqueConstraints:s}=Se(t.config,{indexes:i,constraints:a});return{tables:r,indexes:o,constraints:{...a,unique:s}}},D=e=>({bool:`boolean`,int2:`smallint`,int4:`integer`,int8:`bigint`})[e]??e,we=async e=>{let{rows:t}=await d`
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",
5
+ "version": "1.5.6",
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,19 +43,19 @@
43
43
  "ramda": "^0.32.0",
44
44
  "sql-formatter": "^15.6.10",
45
45
  "testcontainers": "^11.11.0",
46
- "zod": "^4.1.12"
46
+ "zod": "^4.3.5"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@swc/core": "^1.13.5",
50
50
  "@types/better-sqlite3": "^7.6.13",
51
51
  "@types/node": "^25",
52
- "@types/pg": "^8.15.5",
52
+ "@types/pg": "^8.16.0",
53
53
  "@types/ramda": "^0.31.1",
54
54
  "memfs": "^4.49.0",
55
55
  "prettier": "^3",
56
56
  "tsdown": "^0.18.4",
57
57
  "typescript": "^5",
58
- "vitest": "^3.2.4"
58
+ "vitest": "^4.0.16"
59
59
  },
60
60
  "scripts": {
61
61
  "dev": "NODE_ENV=development tsdown --watch",