@elysiumjs/drizzle 0.1.0 → 0.1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @elysiumjs/drizzle
2
2
 
3
+ ## 0.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#114](https://github.com/na2axl/elysiumjs/pull/114) [`632a2d5`](https://github.com/na2axl/elysiumjs/commit/632a2d5accb18d06d273cafbffeebe7f5f1bde5d) Thanks [@na2axl](https://github.com/na2axl)! - `notificationsTable()`, `filesTable()`, `moiraiTables()` and `pgTable()` now declare their return types with Drizzle's own types (`PgTableWithColumns`, `PgBuildColumns`), through the new `BuiltPgTable` type. Their declarations no longer carry a copy of Drizzle's table shape, so the tables they build type-check against the Drizzle the app installs. `DrizzleConnectionProps` and `DrizzleDriverConfig` now take Drizzle relations (`defineRelations()`) as their type parameter, as `DrizzleConfig` does.
8
+
3
9
  ## 0.1.0
4
10
 
5
11
  ### Minor Changes
@@ -0,0 +1,17 @@
1
+ import type { AnyPgColumnBuilder, PgBuildColumns, PgTableWithColumns } from 'drizzle-orm/pg-core';
2
+ /**
3
+ * The table `pgTable()` builds from a name, a schema and column builders, spelled with Drizzle's
4
+ * own types. Functions that build tables return it, so that their declarations refer to Drizzle's
5
+ * types instead of carrying a copy of them, and keep matching the Drizzle the app installs.
6
+ * @author Axel Nana <ax.lnana@outlook.com>
7
+ * @template TName The name of the table.
8
+ * @template TSchema The Postgres schema of the table, or `undefined` for the search path.
9
+ * @template TColumns The column builders of the table.
10
+ */
11
+ export type BuiltPgTable<TName extends string, TSchema extends string | undefined, TColumns extends Record<string, AnyPgColumnBuilder>> = PgTableWithColumns<{
12
+ name: TName;
13
+ schema: TSchema;
14
+ columns: PgBuildColumns<TName, TColumns>;
15
+ dialect: 'pg';
16
+ isAlias: false;
17
+ }>;
@@ -1,5 +1,5 @@
1
1
  import type { DatabaseCacheConfig, DatabaseDriver } from '@elysiumjs/olympus/mnemosyne';
2
- import type { DrizzleConfig } from 'drizzle-orm';
2
+ import type { AnyRelations, DrizzleConfig, EmptyRelations } from 'drizzle-orm';
3
3
  import type { PgAsyncDatabase, PgQueryResultHKT } from 'drizzle-orm/pg-core';
4
4
  import type { DrizzleDriver } from './driver';
5
5
  import { ElysiumError } from '@elysiumjs/olympus';
@@ -12,9 +12,9 @@ export { DEFAULT_CACHE_TTL, DrizzleDatabaseCache } from './cache';
12
12
  * or `client` connect with Bun SQL, on Bun only.
13
13
  *
14
14
  * @author Axel Nana <ax.lnana@outlook.com>
15
- * @template TSchema The Drizzle schema type.
15
+ * @template TRelations The Drizzle relations of the connection, from `defineRelations()`.
16
16
  */
17
- export type DrizzleConnectionProps<TSchema extends Record<string, unknown> = Record<string, never>> = Omit<DrizzleConfig<TSchema>, 'cache'> & ({
17
+ export type DrizzleConnectionProps<TRelations extends AnyRelations = EmptyRelations> = Omit<DrizzleConfig<TRelations>, 'cache'> & ({
18
18
  driver: DrizzleDriver;
19
19
  } | {
20
20
  connection: string | ({
package/dist/driver.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { DrizzleConfig } from 'drizzle-orm';
1
+ import type { AnyRelations, DrizzleConfig } from 'drizzle-orm';
2
2
  import type { DrizzleDatabaseCache } from './cache';
3
3
  import type { DrizzleConnection } from './database';
4
4
  import type { MigrationConnection } from './migration';
@@ -7,7 +7,7 @@ import { ElysiumError } from '@elysiumjs/olympus';
7
7
  * What a driver connects with: the Drizzle options of the connection and its query cache.
8
8
  * @author Axel Nana <ax.lnana@outlook.com>
9
9
  */
10
- export type DrizzleDriverConfig = Omit<DrizzleConfig<Record<string, unknown>>, 'cache'> & {
10
+ export type DrizzleDriverConfig = Omit<DrizzleConfig<AnyRelations>, 'cache'> & {
11
11
  cache?: DrizzleDatabaseCache;
12
12
  };
13
13
  /**
package/dist/hermes.d.ts CHANGED
@@ -1,10 +1,22 @@
1
1
  import type { InboxOwner, InboxPage, InboxQuery, NotificationStoreDriver, StoredNotification } from '@elysiumjs/olympus/hermes';
2
+ import type { BuiltPgTable } from './built-table';
2
3
  import type { DrizzleStoreOptions, StoreTable } from './moirai';
3
4
  declare module '@elysiumjs/olympus' {
4
5
  interface PortDrivers {
5
6
  'notification-store:drizzle': typeof DrizzleNotificationStore;
6
7
  }
7
8
  }
9
+ /** The columns of the notifications table. */
10
+ declare const notificationColumns: () => {
11
+ id: import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
12
+ deliveryId: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
13
+ notifiableType: import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>;
14
+ notifiableId: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
15
+ type: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
16
+ data: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").PgJsonbBuilder, Record<string, unknown>>>;
17
+ readAt: import("drizzle-orm/pg-core").PgTimestampBuilder;
18
+ createdAt: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>;
19
+ };
8
20
  /**
9
21
  * Builds the table of the notification store, in a schema when one is given. Export it from the
10
22
  * Drizzle schema so that `migration:generate` creates it.
@@ -18,135 +30,9 @@ declare module '@elysiumjs/olympus' {
18
30
  * HermesModule.with({ store: () => new DrizzleNotificationStore({ table: notifications }) });
19
31
  * ```
20
32
  */
21
- export declare const notificationsTable: (name?: string, schema?: string) => import("drizzle-orm/pg-core").PgTableWithColumns<{
22
- name: string;
23
- schema: undefined;
24
- columns: {
25
- id: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
26
- name: string;
27
- tableName: string;
28
- dataType: "string";
29
- data: string;
30
- driverParam: string;
31
- notNull: true;
32
- hasDefault: false;
33
- isPrimaryKey: false;
34
- isAutoincrement: false;
35
- hasRuntimeDefault: false;
36
- enumValues: undefined;
37
- identity: undefined;
38
- generated: undefined;
39
- }>;
40
- deliveryId: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
41
- name: string;
42
- tableName: string;
43
- dataType: "string";
44
- data: string;
45
- driverParam: string;
46
- notNull: true;
47
- hasDefault: false;
48
- isPrimaryKey: false;
49
- isAutoincrement: false;
50
- hasRuntimeDefault: false;
51
- enumValues: undefined;
52
- identity: undefined;
53
- generated: undefined;
54
- }>;
55
- notifiableType: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
56
- name: string;
57
- tableName: string;
58
- dataType: "string";
59
- data: string;
60
- driverParam: string;
61
- notNull: false;
62
- hasDefault: false;
63
- isPrimaryKey: false;
64
- isAutoincrement: false;
65
- hasRuntimeDefault: false;
66
- enumValues: undefined;
67
- identity: undefined;
68
- generated: undefined;
69
- }>;
70
- notifiableId: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
71
- name: string;
72
- tableName: string;
73
- dataType: "string";
74
- data: string;
75
- driverParam: string;
76
- notNull: true;
77
- hasDefault: false;
78
- isPrimaryKey: false;
79
- isAutoincrement: false;
80
- hasRuntimeDefault: false;
81
- enumValues: undefined;
82
- identity: undefined;
83
- generated: undefined;
84
- }>;
85
- type: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
86
- name: string;
87
- tableName: string;
88
- dataType: "string";
89
- data: string;
90
- driverParam: string;
91
- notNull: true;
92
- hasDefault: false;
93
- isPrimaryKey: false;
94
- isAutoincrement: false;
95
- hasRuntimeDefault: false;
96
- enumValues: undefined;
97
- identity: undefined;
98
- generated: undefined;
99
- }>;
100
- data: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").PgJsonbBuilder, Record<string, unknown>>>, {
101
- name: string;
102
- tableName: string;
103
- dataType: "object json";
104
- data: Record<string, unknown>;
105
- driverParam: unknown;
106
- notNull: true;
107
- hasDefault: false;
108
- isPrimaryKey: false;
109
- isAutoincrement: false;
110
- hasRuntimeDefault: false;
111
- enumValues: undefined;
112
- identity: undefined;
113
- generated: undefined;
114
- }>;
115
- readAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTimestampBuilder, {
116
- name: string;
117
- tableName: string;
118
- dataType: "object date";
119
- data: Date;
120
- driverParam: string;
121
- notNull: false;
122
- hasDefault: false;
123
- isPrimaryKey: false;
124
- isAutoincrement: false;
125
- hasRuntimeDefault: false;
126
- enumValues: undefined;
127
- identity: undefined;
128
- generated: undefined;
129
- }>;
130
- createdAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>, {
131
- name: string;
132
- tableName: string;
133
- dataType: "object date";
134
- data: Date;
135
- driverParam: string;
136
- notNull: true;
137
- hasDefault: false;
138
- isPrimaryKey: false;
139
- isAutoincrement: false;
140
- hasRuntimeDefault: false;
141
- enumValues: undefined;
142
- identity: undefined;
143
- generated: undefined;
144
- }>;
145
- };
146
- dialect: 'pg';
147
- }>;
33
+ export declare const notificationsTable: (name?: string, schema?: string) => NotificationsTable;
148
34
  /** The table `notificationsTable()` builds. */
149
- export type NotificationsTable = ReturnType<typeof notificationsTable>;
35
+ export type NotificationsTable = BuiltPgTable<string, undefined, ReturnType<typeof notificationColumns>>;
150
36
  /**
151
37
  * Keeps the notifications of the `inbox` channel in a Postgres table, built with
152
38
  * `notificationsTable()` or any table with its columns.
@@ -168,3 +54,4 @@ export declare class DrizzleNotificationStore implements NotificationStoreDriver
168
54
  delete(owner: InboxOwner, ids: readonly string[]): Promise<number>;
169
55
  private read;
170
56
  }
57
+ export {};
package/dist/index.js CHANGED
@@ -13,4 +13,4 @@ ${text.trim().replace(/;?$/,";")}`}output=output.slice(0,match.index)+statement+
13
13
  SELECT schema_name
14
14
  FROM information_schema.schemata
15
15
  WHERE schema_name = ${this.tenant}
16
- ) AS schema_exists`);if(schema_exists||this.createSchema)return!0;if(!process.stdin.isTTY)return this.error(`Schema ${this.bold(this.tenant)} does not exist. Run again with --create-schema to create it.`),!1;let{default:prompts}=await import("prompts");if(!(await prompts([{type:"confirm",name:"create",message:`Schema ${this.tenant} does not exist. Do you want to create it?`,initial:!0}],{onCancel:()=>{this.error("Operation cancelled."),process.exit(0)}})).create)return this.error(`Schema ${this.bold(this.tenant)} creation cancelled.`),!1;return!0}}__legacyDecorateClassTS([Command2.arg({description:"The name of the tenant in which the migrations will be executed.",type:CommandArgumentType2.STRING,required:!0}),__legacyMetadataTS("design:type",String)],MigrationRunCommand.prototype,"tenant",void 0),__legacyDecorateClassTS([Command2.arg({description:"The name of the connection to use.",type:CommandArgumentType2.STRING,default:"default"}),__legacyMetadataTS("design:type",String)],MigrationRunCommand.prototype,"connection",void 0),__legacyDecorateClassTS([Command2.arg({description:"Drop the entire schema before running the migrations.",type:CommandArgumentType2.BOOLEAN,default:!1}),__legacyMetadataTS("design:type",Boolean)],MigrationRunCommand.prototype,"fresh",void 0),__legacyDecorateClassTS([Command2.arg({name:"create-schema",description:"Create the tenant schema without asking when it does not exist.",type:CommandArgumentType2.BOOLEAN,default:!1}),__legacyMetadataTS("design:type",Boolean)],MigrationRunCommand.prototype,"createSchema",void 0),MigrationRunCommand=__legacyDecorateClassTS([Command2.register()],MigrationRunCommand);class DrizzleModule extends Module.configurable({defaults:{default:"default"},required:["connections"]}){async onDestroy(){let names=Object.keys(this.config.connections).map(AbstractDatabase2.getConnectionName);await runAll(names.filter((name)=>Service4.isConstructed(name)).map((name)=>()=>closeConnection(Service4.get(name))))}}DrizzleModule=__legacyDecorateClassTS([Module.register({imports:[MnemosyneModule],commands:[MigrationGenerateCommand,MigrationRunCommand],services:(config)=>{let alias=needsDefaultAlias("DrizzleModule",config),tenancy=config.tenancy??{mode:"schema"};return[...Object.entries(config.connections).map(([name,props])=>({name:AbstractDatabase2.getConnectionName(name),global:!0,factory:()=>Database.createConnection(props,name)})),...alias?[{name:AbstractDatabase2.getConnectionName("default"),global:!0,factory:(_config,get)=>get(AbstractDatabase2.getConnectionName(config.default))}]:[],{name:DATABASE_TRANSACTION_SERVICE,global:!0,factory:()=>withUnitOfWork((callback,connection)=>Database.transaction(()=>callback(),connection))},{name:TENANCY_CONFIG_SERVICE,global:!0,factory:()=>tenancy},{name:TENANCY_STRATEGY_SERVICE,global:!0,factory:()=>tenancy.mode==="rls"?new DrizzleRLSTenancy:new DrizzleSchemaTenancy}]}})],DrizzleModule);import{Lock,LockDriver}from"@elysiumjs/olympus";import{sql as sql6}from"drizzle-orm";class PgAdvisoryLock extends LockDriver{options;constructor(options={}){super();this.options=options}async acquire(key,_ttl,options={}){let db=Database.getConnection(this.options.connection),wait=Math.max(0,options.wait??0);if(wait===1/0)return await db.execute(sql6`select pg_advisory_xact_lock(hashtextextended(${key}, 0))`),{key,token:crypto.randomUUID()};let deadline=Date.now()+wait;for(;;){let result=await db.execute(sql6`select pg_try_advisory_xact_lock(hashtextextended(${key}, 0)) as taken`);if(((Array.isArray(result)?result:result.rows)??[])[0]?.taken)return{key,token:crypto.randomUUID()};let left=deadline-Date.now();if(left<=0)return null;await new Promise((resolve)=>setTimeout(resolve,Math.min(left,this.options.retryDelay??50)))}}async release(_handle){return!0}async extend(_handle,_ttl){return!0}}PgAdvisoryLock=__legacyDecorateClassTS([Lock.driver("postgres"),__legacyMetadataTS("design:paramtypes",[Object])],PgAdvisoryLock);import{Clock}from"@elysiumjs/olympus";import{DEFAULT_INBOX_LIMIT,NotificationStore}from"@elysiumjs/olympus/hermes";import{and as and4,count,desc as desc2,eq as eq4,inArray as inArray4,isNull as isNull3,lt as lt3}from"drizzle-orm";import{index,jsonb,pgSchema as pgSchema2,pgTable as pgTable3,text,timestamp,uniqueIndex}from"drizzle-orm/pg-core";var at=(name)=>timestamp(name,{withTimezone:!0,mode:"date"}),notificationsTable=(name="notifications",schema)=>(schema?pgSchema2(schema).table:pgTable3)(name,{id:text("id").primaryKey(),deliveryId:text("delivery_id").notNull(),notifiableType:text("notifiable_type"),notifiableId:text("notifiable_id").notNull(),type:text("type").notNull(),data:jsonb("data").$type().notNull(),readAt:at("read_at"),createdAt:at("created_at").notNull()},(t)=>[uniqueIndex(`${name}_delivery_uq`).on(t.deliveryId),index(`${name}_notifiable_idx`).on(t.notifiableId,t.notifiableType,t.id),index(`${name}_unread_idx`).on(t.notifiableId,t.notifiableType).where(isNull3(t.readAt))]);class DrizzleNotificationStore{options;constructor(options){this.options=options}get table(){return this.options.table}owned(owner){let t=this.table;return and4(eq4(t.notifiableId,owner.notifiableId),owner.notifiableType===void 0?isNull3(t.notifiableType):eq4(t.notifiableType,owner.notifiableType))}get db(){return Database.getConnection(this.options.connection)}async save(notification){await this.db.insert(this.table).values(notification).onConflictDoNothing()}async list(owner,query={}){let t=this.table,limit=query.limit??DEFAULT_INBOX_LIMIT,rows=await this.db.select().from(t).where(and4(this.owned(owner),query.unread?isNull3(t.readAt):void 0,query.cursor===void 0?void 0:lt3(t.id,query.cursor))).orderBy(desc2(t.id)).limit(limit+1),items=rows.slice(0,limit);return{items,nextCursor:rows.length>limit?items[items.length-1].id:null}}async unreadCount(owner){let t=this.table,[row]=await this.db.select({total:count()}).from(t).where(and4(this.owned(owner),isNull3(t.readAt)));return Number(row?.total??0)}async markAsRead(owner,ids){if(ids.length===0)return 0;return this.read(inArray4(this.table.id,[...ids]),owner)}async markAllAsRead(owner){return this.read(void 0,owner)}async delete(owner,ids){if(ids.length===0)return 0;let t=this.table;return(await this.db.delete(t).where(and4(this.owned(owner),inArray4(t.id,[...ids]))).returning({id:t.id})).length}async read(filter,owner){let t=this.table;return(await this.db.update(t).set({readAt:Clock.now()}).where(and4(this.owned(owner),isNull3(t.readAt),filter)).returning({id:t.id})).length}}DrizzleNotificationStore=__legacyDecorateClassTS([NotificationStore.driver("drizzle"),__legacyMetadataTS("design:paramtypes",[typeof DrizzleStoreOptions==="undefined"?Object:DrizzleStoreOptions])],DrizzleNotificationStore);import{FileStore}from"@elysiumjs/olympus/pithos";import{and as and5,asc as asc2,count as count2,eq as eq5,gt as gt3,inArray as inArray5,isNotNull as isNotNull3,isNull as isNull4,lte as lte3,or as or4,sql as sql7}from"drizzle-orm";import{bigint,index as index2,pgSchema as pgSchema3,pgTable as pgTable4,text as text2,timestamp as timestamp2}from"drizzle-orm/pg-core";var at2=(name)=>timestamp2(name,{withTimezone:!0,mode:"date"}),filesTable=(name="files",schema)=>(schema?pgSchema3(schema).table:pgTable4)(name,{id:text2("id").primaryKey(),purpose:text2("purpose").notNull(),disk:text2("disk").notNull(),key:text2("key").notNull(),contentType:text2("content_type").notNull(),size:bigint("size",{mode:"number"}).notNull(),ownerType:text2("owner_type").notNull(),ownerId:text2("owner_id").notNull(),createdBy:text2("created_by"),status:text2("status").$type().notNull(),createdAt:at2("created_at").notNull(),readyAt:at2("ready_at"),claimedAt:at2("claimed_at"),releasedAt:at2("released_at"),expiresAt:at2("expires_at"),deletedAt:at2("deleted_at"),rejection:text2("rejection")},(t)=>[index2(`${name}_owner_idx`).on(t.ownerType,t.ownerId),index2(`${name}_pending_idx`).on(t.createdBy,t.expiresAt).where(sql7`${t.status} = 'pending'`),index2(`${name}_due_idx`).on(t.expiresAt).where(sql7`${t.status} in ('pending', 'finishing', 'ready') and ${t.expiresAt} is not null`)]),toRecord=({ownerType,ownerId,...row})=>({...row,owner:{type:ownerType,id:ownerId}});class DrizzleFileStore{options;constructor(options){this.options=options}get table(){return this.options.table}get db(){return Database.getConnection(this.options.connection)}async insert({owner,...record}){await this.db.insert(this.table).values({...record,ownerType:owner.type,ownerId:owner.id})}async find(id){let[row]=await this.db.select().from(this.table).where(eq5(this.table.id,id)).limit(1);return row?toRecord(row):null}async transition(id,when,patch){let t=this.table,condition=and5(eq5(t.id,id),inArray5(t.status,[...when.status]),when.due===void 0?void 0:lte3(t.expiresAt,when.due),when.live===void 0?void 0:or4(isNull4(t.expiresAt),gt3(t.expiresAt,when.live))),[row]=Object.keys(patch).length===0?await this.db.select().from(t).where(condition).limit(1):await this.db.update(t).set(patch).where(condition).returning();return row?toRecord(row):null}async countPending(createdBy,now){let t=this.table,[row]=await this.db.select({total:count2()}).from(t).where(and5(eq5(t.createdBy,createdBy),sql7`${t.status} = 'pending'`,gt3(t.expiresAt,now)));return Number(row?.total??0)}async due(now,limit){let t=this.table;return(await this.db.select().from(t).where(and5(sql7`${t.status} in ('pending', 'finishing', 'ready')`,isNotNull3(t.expiresAt),lte3(t.expiresAt,now))).orderBy(asc2(t.expiresAt)).limit(limit)).map(toRecord)}}DrizzleFileStore=__legacyDecorateClassTS([FileStore.driver("drizzle"),__legacyMetadataTS("design:paramtypes",[typeof DrizzleStoreOptions==="undefined"?Object:DrizzleStoreOptions])],DrizzleFileStore);import{Clock as Clock2}from"@elysiumjs/olympus";import{ConcurrencyConflictError,IdempotencyConflictError}from"@elysiumjs/olympus/moirai";import{and as and6,asc as asc3,eq as eq6,gt as gt4,inArray as inArray6,is as is4,isNull as isNull5,lt as lt4,lte as lte4,max,sql as sql8}from"drizzle-orm";import{bigserial,customType,index as index3,integer,jsonb as jsonb2,pgSchema as pgSchema4,PgTable as PgTable2,pgTable as pgTable5,primaryKey,text as text3,timestamp as timestamp3,unique,uuid}from"drizzle-orm/pg-core";var at3=(name)=>timestamp3(name,{withTimezone:!0,mode:"date"}),xid8=customType({dataType:()=>"xid8"}),moiraiTables=(schema,options={})=>{let table=schema?pgSchema4(schema).table:pgTable5,partitioned=options.partitioned??!1,partition=(range,target)=>partitioned?DrizzleTable.define(DrizzleTable.partitioned({range}))(target):target;return{idempotencyKeys:table("idempotency_keys",{key:text3("key").primaryKey(),action:text3("action").notNull(),requestHash:text3("request_hash").notNull(),response:jsonb2("response"),createdAt:at3("created_at").notNull().defaultNow()}),outbox:partition("created_at",table("outbox",{id:partitioned?uuid("id").notNull():uuid("id").primaryKey(),kind:text3("kind").notNull(),payload:jsonb2("payload").notNull(),createdAt:at3("created_at").notNull().defaultNow(),availableAt:at3("available_at").notNull().defaultNow(),attempts:integer("attempts").notNull().default(0),lastError:text3("last_error"),dispatchedAt:at3("dispatched_at"),deadAt:at3("dead_at")},(t)=>[...partitioned?[primaryKey({columns:[t.id,t.createdAt]})]:[],index3("outbox_due_idx").on(t.availableAt).where(sql8`${t.dispatchedAt} is null and ${t.deadAt} is null`)])),inbox:table("inbox",{messageId:text3("message_id").notNull(),consumer:text3("consumer").notNull(),recordedAt:at3("recorded_at").notNull().defaultNow()},(t)=>[primaryKey({columns:[t.messageId,t.consumer]})]),events:partition("occurred_at",table("events",{position:partitioned?bigserial("position",{mode:"bigint"}).notNull():bigserial("position",{mode:"bigint"}).primaryKey(),transactionId:xid8("transaction_id").notNull().default(sql8`pg_current_xact_id()`),aggregateId:text3("aggregate_id").notNull(),aggregateType:text3("aggregate_type").notNull(),version:integer("version").notNull(),type:text3("type").notNull(),schemaVersion:integer("schema_version").notNull().default(1),data:jsonb2("data").notNull(),metadata:jsonb2("metadata").notNull(),occurredAt:at3("occurred_at").notNull()},(t)=>partitioned?[primaryKey({columns:[t.position,t.occurredAt]}),unique("events_aggregate_version_uq").on(t.aggregateId,t.version,t.occurredAt)]:[unique("events_aggregate_version_uq").on(t.aggregateId,t.version)])),projections:table("projections",{name:text3("name").primaryKey(),version:integer("version").notNull(),builtAt:at3("built_at").notNull().defaultNow()})}},isUniqueViolation=(error)=>{for(let e=error;e;e=e.cause){if(e.code==="23505"||e.errno==="23505")return!0;if(e.cause===e)break}return!1};class DrizzleIdempotencyStore{options;constructor(options){this.options=options}get table(){return this.options.table}async get(key){let t=this.table,[row]=await Database.getConnection(this.options.connection).select().from(t).where(eq6(t.key,key)).limit(1);return row?{...row,response:row.response??null}:void 0}async put(record){try{await Database.getConnection(this.options.connection).insert(this.table).values(record)}catch(error){if(isUniqueViolation(error))throw new IdempotencyConflictError(record.key);throw error}}}class DrizzleOutboxStore{options;constructor(options){this.options=options}get table(){return this.options.table}get db(){return Database.getConnection(this.options.connection)}async insert(rows){if(rows.length===0)return;await this.db.insert(this.table).values(rows.map((row)=>({...row})))}async claimDue(claim){let{now,leaseUntil,limit,kinds,ids}=claim;if(kinds?.length===0||ids?.length===0)return[];let t=this.table,due=this.db.select({id:t.id}).from(t).where(and6(isNull5(t.dispatchedAt),isNull5(t.deadAt),lte4(t.availableAt,now),kinds?inArray6(t.kind,[...kinds]):void 0,ids?inArray6(t.id,[...ids]):void 0)).orderBy(asc3(t.availableAt)).limit(limit).for("update",{skipLocked:!0});return(await this.db.update(t).set({availableAt:leaseUntil}).where(inArray6(t.id,due)).returning()).sort((a,b)=>a.id<b.id?-1:a.id>b.id?1:0)}async markDispatched(id,dispatchedAt){await this.#update(id,{dispatchedAt})}async markFailed(id,update){await this.#update(id,update)}async markDead(id,update){await this.#update(id,update)}async replacePayload(id,payload){await this.#update(id,{payload})}async#update(id,values){let t=this.table;await this.db.update(t).set(values).where(eq6(t.id,id))}}class DrizzleInboxStore{options;constructor(options){this.options=options}get table(){return this.options.table}async record(messageId,consumer){let t=this.table;return(await Database.getConnection(this.options.connection).insert(t).values({messageId,consumer}).onConflictDoNothing().returning({messageId:t.messageId})).length>0}async pruneBefore(cutoff){let t=this.table;return(await Database.getConnection(this.options.connection).delete(t).where(lt4(t.recordedAt,cutoff)).returning({messageId:t.messageId})).length}}var toRecord2=(row)=>({position:row.position,aggregateId:row.aggregateId,aggregateType:row.aggregateType,version:row.version,type:row.type,schemaVersion:row.schemaVersion,data:row.data,metadata:row.metadata,occurredAt:row.occurredAt});class DrizzleEventStore{options;constructor(options){this.options=options}get table(){return this.options.table}get db(){return Database.getConnection(this.options.connection)}async load(aggregateId,afterVersion=0){let t=this.table;return(await this.db.select().from(t).where(and6(eq6(t.aggregateId,aggregateId),gt4(t.version,afterVersion))).orderBy(asc3(t.version))).map(toRecord2)}async readAll(filter){let{types,afterPosition,limit}=filter;if(types?.length===0)return[];let t=this.table;return(await this.db.select().from(t).where(and6(afterPosition===void 0?void 0:gt4(t.position,afterPosition),types?inArray6(t.type,[...types]):void 0)).orderBy(asc3(t.position)).limit(limit)).map(toRecord2)}async append(records){if(records.length===0)return;let t=this.table,first=new Map;for(let record of records){let known=first.get(record.aggregateId);if(!known||record.version<known.version)first.set(record.aggregateId,record)}try{for(let[aggregateId,record]of[...first].sort(([a],[b])=>a.localeCompare(b))){await this.db.execute(sql8`select pg_advisory_xact_lock(hashtextextended(${aggregateId}::text, 0))`);let[head]=await this.db.select({version:max(t.version)}).from(t).where(eq6(t.aggregateId,aggregateId));if((head?.version??0)!==record.version-1)throw new ConcurrencyConflictError(record.aggregateType,aggregateId)}await this.db.insert(t).values(records.map((record)=>({aggregateId:record.aggregateId,aggregateType:record.aggregateType,version:record.version,type:record.type,schemaVersion:record.schemaVersion,data:record.data,metadata:record.metadata,occurredAt:record.occurredAt})))}catch(error){if(isUniqueViolation(error))throw new ConcurrencyConflictError(records[0].aggregateType,records[0].aggregateId);throw error}}}var tableOf2=(model)=>{if(is4(model,PgTable2))return model;let table=model.table;if(table&&is4(table,PgTable2))return table;throw TypeError(`${model.name??"This model"} has no Drizzle table to reset. Pass a DrizzleModel or a Drizzle table in the models of the projection.`)};class DrizzleProjectionStorage{options;constructor(options){this.options=options}get table(){return this.options.table}get db(){return Database.getConnection(this.options.connection)}async reset(models){for(let model of models)await this.db.delete(tableOf2(model))}async version(name){let t=this.table,[row]=await this.db.select({version:t.version}).from(t).where(eq6(t.name,name)).limit(1);return row?.version}async built(name,version){let t=this.table,builtAt=Clock2.now();await this.db.insert(t).values({name,version,builtAt}).onConflictDoUpdate({target:t.name,set:{version,builtAt}})}}export{DEFAULT_CACHE_TTL,Database,DrizzleDatabaseCache,DrizzleEventStore,DrizzleFileStore,DrizzleIdempotencyStore,DrizzleInboxStore,DrizzleModel,DrizzleModule,DrizzleNotificationStore,DrizzleOutboxStore,DrizzleProjectionStorage,DrizzleRLSTenancy,DrizzleSchemaTenancy,DrizzleTable,Migration,MissingDriverError,MissingMigrationsError,PgAdvisoryLock,TenantMismatchError,UntranslatableRuleError,applyTableMarkers,compileAfter,compileFilter,compileQuery,createRLSPolicy,createSchemaFromDrizzle,drizzleAdapter,drizzleRepositoryAdapter,filesTable,getSessionTenant,getTableBuilders,getTableMarker,getTenantSchema,moiraiTables,nodePostgresMigrations,notificationsTable,pgTable,registerTenantSchema,rulesToDrizzle,templateClientMigrations,withRLS,wrapTenantSchema};
16
+ ) AS schema_exists`);if(schema_exists||this.createSchema)return!0;if(!process.stdin.isTTY)return this.error(`Schema ${this.bold(this.tenant)} does not exist. Run again with --create-schema to create it.`),!1;let{default:prompts}=await import("prompts");if(!(await prompts([{type:"confirm",name:"create",message:`Schema ${this.tenant} does not exist. Do you want to create it?`,initial:!0}],{onCancel:()=>{this.error("Operation cancelled."),process.exit(0)}})).create)return this.error(`Schema ${this.bold(this.tenant)} creation cancelled.`),!1;return!0}}__legacyDecorateClassTS([Command2.arg({description:"The name of the tenant in which the migrations will be executed.",type:CommandArgumentType2.STRING,required:!0}),__legacyMetadataTS("design:type",String)],MigrationRunCommand.prototype,"tenant",void 0),__legacyDecorateClassTS([Command2.arg({description:"The name of the connection to use.",type:CommandArgumentType2.STRING,default:"default"}),__legacyMetadataTS("design:type",String)],MigrationRunCommand.prototype,"connection",void 0),__legacyDecorateClassTS([Command2.arg({description:"Drop the entire schema before running the migrations.",type:CommandArgumentType2.BOOLEAN,default:!1}),__legacyMetadataTS("design:type",Boolean)],MigrationRunCommand.prototype,"fresh",void 0),__legacyDecorateClassTS([Command2.arg({name:"create-schema",description:"Create the tenant schema without asking when it does not exist.",type:CommandArgumentType2.BOOLEAN,default:!1}),__legacyMetadataTS("design:type",Boolean)],MigrationRunCommand.prototype,"createSchema",void 0),MigrationRunCommand=__legacyDecorateClassTS([Command2.register()],MigrationRunCommand);class DrizzleModule extends Module.configurable({defaults:{default:"default"},required:["connections"]}){async onDestroy(){let names=Object.keys(this.config.connections).map(AbstractDatabase2.getConnectionName);await runAll(names.filter((name)=>Service4.isConstructed(name)).map((name)=>()=>closeConnection(Service4.get(name))))}}DrizzleModule=__legacyDecorateClassTS([Module.register({imports:[MnemosyneModule],commands:[MigrationGenerateCommand,MigrationRunCommand],services:(config)=>{let alias=needsDefaultAlias("DrizzleModule",config),tenancy=config.tenancy??{mode:"schema"};return[...Object.entries(config.connections).map(([name,props])=>({name:AbstractDatabase2.getConnectionName(name),global:!0,factory:()=>Database.createConnection(props,name)})),...alias?[{name:AbstractDatabase2.getConnectionName("default"),global:!0,factory:(_config,get)=>get(AbstractDatabase2.getConnectionName(config.default))}]:[],{name:DATABASE_TRANSACTION_SERVICE,global:!0,factory:()=>withUnitOfWork((callback,connection)=>Database.transaction(()=>callback(),connection))},{name:TENANCY_CONFIG_SERVICE,global:!0,factory:()=>tenancy},{name:TENANCY_STRATEGY_SERVICE,global:!0,factory:()=>tenancy.mode==="rls"?new DrizzleRLSTenancy:new DrizzleSchemaTenancy}]}})],DrizzleModule);import{Lock,LockDriver}from"@elysiumjs/olympus";import{sql as sql6}from"drizzle-orm";class PgAdvisoryLock extends LockDriver{options;constructor(options={}){super();this.options=options}async acquire(key,_ttl,options={}){let db=Database.getConnection(this.options.connection),wait=Math.max(0,options.wait??0);if(wait===1/0)return await db.execute(sql6`select pg_advisory_xact_lock(hashtextextended(${key}, 0))`),{key,token:crypto.randomUUID()};let deadline=Date.now()+wait;for(;;){let result=await db.execute(sql6`select pg_try_advisory_xact_lock(hashtextextended(${key}, 0)) as taken`);if(((Array.isArray(result)?result:result.rows)??[])[0]?.taken)return{key,token:crypto.randomUUID()};let left=deadline-Date.now();if(left<=0)return null;await new Promise((resolve)=>setTimeout(resolve,Math.min(left,this.options.retryDelay??50)))}}async release(_handle){return!0}async extend(_handle,_ttl){return!0}}PgAdvisoryLock=__legacyDecorateClassTS([Lock.driver("postgres"),__legacyMetadataTS("design:paramtypes",[Object])],PgAdvisoryLock);import{Clock}from"@elysiumjs/olympus";import{DEFAULT_INBOX_LIMIT,NotificationStore}from"@elysiumjs/olympus/hermes";import{and as and4,count,desc as desc2,eq as eq4,inArray as inArray4,isNull as isNull3,lt as lt3}from"drizzle-orm";import{index,jsonb,pgSchema as pgSchema2,pgTable as pgTable3,text,timestamp,uniqueIndex}from"drizzle-orm/pg-core";var at=(name)=>timestamp(name,{withTimezone:!0,mode:"date"}),notificationColumns=()=>({id:text("id").primaryKey(),deliveryId:text("delivery_id").notNull(),notifiableType:text("notifiable_type"),notifiableId:text("notifiable_id").notNull(),type:text("type").notNull(),data:jsonb("data").$type().notNull(),readAt:at("read_at"),createdAt:at("created_at").notNull()}),notificationsTable=(name="notifications",schema)=>(schema?pgSchema2(schema).table:pgTable3)(name,notificationColumns(),(t)=>[uniqueIndex(`${name}_delivery_uq`).on(t.deliveryId),index(`${name}_notifiable_idx`).on(t.notifiableId,t.notifiableType,t.id),index(`${name}_unread_idx`).on(t.notifiableId,t.notifiableType).where(isNull3(t.readAt))]);class DrizzleNotificationStore{options;constructor(options){this.options=options}get table(){return this.options.table}owned(owner){let t=this.table;return and4(eq4(t.notifiableId,owner.notifiableId),owner.notifiableType===void 0?isNull3(t.notifiableType):eq4(t.notifiableType,owner.notifiableType))}get db(){return Database.getConnection(this.options.connection)}async save(notification){await this.db.insert(this.table).values(notification).onConflictDoNothing()}async list(owner,query={}){let t=this.table,limit=query.limit??DEFAULT_INBOX_LIMIT,rows=await this.db.select().from(t).where(and4(this.owned(owner),query.unread?isNull3(t.readAt):void 0,query.cursor===void 0?void 0:lt3(t.id,query.cursor))).orderBy(desc2(t.id)).limit(limit+1),items=rows.slice(0,limit);return{items,nextCursor:rows.length>limit?items[items.length-1].id:null}}async unreadCount(owner){let t=this.table,[row]=await this.db.select({total:count()}).from(t).where(and4(this.owned(owner),isNull3(t.readAt)));return Number(row?.total??0)}async markAsRead(owner,ids){if(ids.length===0)return 0;return this.read(inArray4(this.table.id,[...ids]),owner)}async markAllAsRead(owner){return this.read(void 0,owner)}async delete(owner,ids){if(ids.length===0)return 0;let t=this.table;return(await this.db.delete(t).where(and4(this.owned(owner),inArray4(t.id,[...ids]))).returning({id:t.id})).length}async read(filter,owner){let t=this.table;return(await this.db.update(t).set({readAt:Clock.now()}).where(and4(this.owned(owner),isNull3(t.readAt),filter)).returning({id:t.id})).length}}DrizzleNotificationStore=__legacyDecorateClassTS([NotificationStore.driver("drizzle"),__legacyMetadataTS("design:paramtypes",[typeof DrizzleStoreOptions==="undefined"?Object:DrizzleStoreOptions])],DrizzleNotificationStore);import{FileStore}from"@elysiumjs/olympus/pithos";import{and as and5,asc as asc2,count as count2,eq as eq5,gt as gt3,inArray as inArray5,isNotNull as isNotNull3,isNull as isNull4,lte as lte3,or as or4,sql as sql7}from"drizzle-orm";import{bigint,index as index2,pgSchema as pgSchema3,pgTable as pgTable4,text as text2,timestamp as timestamp2}from"drizzle-orm/pg-core";var at2=(name)=>timestamp2(name,{withTimezone:!0,mode:"date"}),fileColumns=()=>({id:text2("id").primaryKey(),purpose:text2("purpose").notNull(),disk:text2("disk").notNull(),key:text2("key").notNull(),contentType:text2("content_type").notNull(),size:bigint("size",{mode:"number"}).notNull(),ownerType:text2("owner_type").notNull(),ownerId:text2("owner_id").notNull(),createdBy:text2("created_by"),status:text2("status").$type().notNull(),createdAt:at2("created_at").notNull(),readyAt:at2("ready_at"),claimedAt:at2("claimed_at"),releasedAt:at2("released_at"),expiresAt:at2("expires_at"),deletedAt:at2("deleted_at"),rejection:text2("rejection")}),filesTable=(name="files",schema)=>(schema?pgSchema3(schema).table:pgTable4)(name,fileColumns(),(t)=>[index2(`${name}_owner_idx`).on(t.ownerType,t.ownerId),index2(`${name}_pending_idx`).on(t.createdBy,t.expiresAt).where(sql7`${t.status} = 'pending'`),index2(`${name}_due_idx`).on(t.expiresAt).where(sql7`${t.status} in ('pending', 'finishing', 'ready') and ${t.expiresAt} is not null`)]),toRecord=({ownerType,ownerId,...row})=>({...row,owner:{type:ownerType,id:ownerId}});class DrizzleFileStore{options;constructor(options){this.options=options}get table(){return this.options.table}get db(){return Database.getConnection(this.options.connection)}async insert({owner,...record}){await this.db.insert(this.table).values({...record,ownerType:owner.type,ownerId:owner.id})}async find(id){let[row]=await this.db.select().from(this.table).where(eq5(this.table.id,id)).limit(1);return row?toRecord(row):null}async transition(id,when,patch){let t=this.table,condition=and5(eq5(t.id,id),inArray5(t.status,[...when.status]),when.due===void 0?void 0:lte3(t.expiresAt,when.due),when.live===void 0?void 0:or4(isNull4(t.expiresAt),gt3(t.expiresAt,when.live))),[row]=Object.keys(patch).length===0?await this.db.select().from(t).where(condition).limit(1):await this.db.update(t).set(patch).where(condition).returning();return row?toRecord(row):null}async countPending(createdBy,now){let t=this.table,[row]=await this.db.select({total:count2()}).from(t).where(and5(eq5(t.createdBy,createdBy),sql7`${t.status} = 'pending'`,gt3(t.expiresAt,now)));return Number(row?.total??0)}async due(now,limit){let t=this.table;return(await this.db.select().from(t).where(and5(sql7`${t.status} in ('pending', 'finishing', 'ready')`,isNotNull3(t.expiresAt),lte3(t.expiresAt,now))).orderBy(asc2(t.expiresAt)).limit(limit)).map(toRecord)}}DrizzleFileStore=__legacyDecorateClassTS([FileStore.driver("drizzle"),__legacyMetadataTS("design:paramtypes",[typeof DrizzleStoreOptions==="undefined"?Object:DrizzleStoreOptions])],DrizzleFileStore);import{Clock as Clock2}from"@elysiumjs/olympus";import{ConcurrencyConflictError,IdempotencyConflictError}from"@elysiumjs/olympus/moirai";import{and as and6,asc as asc3,eq as eq6,gt as gt4,inArray as inArray6,is as is4,isNull as isNull5,lt as lt4,lte as lte4,max,sql as sql8}from"drizzle-orm";import{bigserial,customType,index as index3,integer,jsonb as jsonb2,pgSchema as pgSchema4,PgTable as PgTable2,pgTable as pgTable5,primaryKey,text as text3,timestamp as timestamp3,unique,uuid}from"drizzle-orm/pg-core";var at3=(name)=>timestamp3(name,{withTimezone:!0,mode:"date"}),xid8=customType({dataType:()=>"xid8"}),idempotencyKeyColumns=()=>({key:text3("key").primaryKey(),action:text3("action").notNull(),requestHash:text3("request_hash").notNull(),response:jsonb2("response"),createdAt:at3("created_at").notNull().defaultNow()}),outboxColumns=(partitioned)=>({id:partitioned?uuid("id").notNull():uuid("id").primaryKey(),kind:text3("kind").notNull(),payload:jsonb2("payload").notNull(),createdAt:at3("created_at").notNull().defaultNow(),availableAt:at3("available_at").notNull().defaultNow(),attempts:integer("attempts").notNull().default(0),lastError:text3("last_error"),dispatchedAt:at3("dispatched_at"),deadAt:at3("dead_at")}),inboxColumns=()=>({messageId:text3("message_id").notNull(),consumer:text3("consumer").notNull(),recordedAt:at3("recorded_at").notNull().defaultNow()}),eventColumns=(partitioned)=>({position:partitioned?bigserial("position",{mode:"bigint"}).notNull():bigserial("position",{mode:"bigint"}).primaryKey(),transactionId:xid8("transaction_id").notNull().default(sql8`pg_current_xact_id()`),aggregateId:text3("aggregate_id").notNull(),aggregateType:text3("aggregate_type").notNull(),version:integer("version").notNull(),type:text3("type").notNull(),schemaVersion:integer("schema_version").notNull().default(1),data:jsonb2("data").notNull(),metadata:jsonb2("metadata").notNull(),occurredAt:at3("occurred_at").notNull()}),projectionColumns=()=>({name:text3("name").primaryKey(),version:integer("version").notNull(),builtAt:at3("built_at").notNull().defaultNow()}),moiraiTables=(schema,options={})=>{let table=schema?pgSchema4(schema).table:pgTable5,partitioned=options.partitioned??!1,partition=(range,target)=>partitioned?DrizzleTable.define(DrizzleTable.partitioned({range}))(target):target;return{idempotencyKeys:table("idempotency_keys",idempotencyKeyColumns()),outbox:partition("created_at",table("outbox",outboxColumns(partitioned),(t)=>[...partitioned?[primaryKey({columns:[t.id,t.createdAt]})]:[],index3("outbox_due_idx").on(t.availableAt).where(sql8`${t.dispatchedAt} is null and ${t.deadAt} is null`)])),inbox:table("inbox",inboxColumns(),(t)=>[primaryKey({columns:[t.messageId,t.consumer]})]),events:partition("occurred_at",table("events",eventColumns(partitioned),(t)=>partitioned?[primaryKey({columns:[t.position,t.occurredAt]}),unique("events_aggregate_version_uq").on(t.aggregateId,t.version,t.occurredAt)]:[unique("events_aggregate_version_uq").on(t.aggregateId,t.version)])),projections:table("projections",projectionColumns())}},isUniqueViolation=(error)=>{for(let e=error;e;e=e.cause){if(e.code==="23505"||e.errno==="23505")return!0;if(e.cause===e)break}return!1};class DrizzleIdempotencyStore{options;constructor(options){this.options=options}get table(){return this.options.table}async get(key){let t=this.table,[row]=await Database.getConnection(this.options.connection).select().from(t).where(eq6(t.key,key)).limit(1);return row?{...row,response:row.response??null}:void 0}async put(record){try{await Database.getConnection(this.options.connection).insert(this.table).values(record)}catch(error){if(isUniqueViolation(error))throw new IdempotencyConflictError(record.key);throw error}}}class DrizzleOutboxStore{options;constructor(options){this.options=options}get table(){return this.options.table}get db(){return Database.getConnection(this.options.connection)}async insert(rows){if(rows.length===0)return;await this.db.insert(this.table).values(rows.map((row)=>({...row})))}async claimDue(claim){let{now,leaseUntil,limit,kinds,ids}=claim;if(kinds?.length===0||ids?.length===0)return[];let t=this.table,due=this.db.select({id:t.id}).from(t).where(and6(isNull5(t.dispatchedAt),isNull5(t.deadAt),lte4(t.availableAt,now),kinds?inArray6(t.kind,[...kinds]):void 0,ids?inArray6(t.id,[...ids]):void 0)).orderBy(asc3(t.availableAt)).limit(limit).for("update",{skipLocked:!0});return(await this.db.update(t).set({availableAt:leaseUntil}).where(inArray6(t.id,due)).returning()).sort((a,b)=>a.id<b.id?-1:a.id>b.id?1:0)}async markDispatched(id,dispatchedAt){await this.#update(id,{dispatchedAt})}async markFailed(id,update){await this.#update(id,update)}async markDead(id,update){await this.#update(id,update)}async replacePayload(id,payload){await this.#update(id,{payload})}async#update(id,values){let t=this.table;await this.db.update(t).set(values).where(eq6(t.id,id))}}class DrizzleInboxStore{options;constructor(options){this.options=options}get table(){return this.options.table}async record(messageId,consumer){let t=this.table;return(await Database.getConnection(this.options.connection).insert(t).values({messageId,consumer}).onConflictDoNothing().returning({messageId:t.messageId})).length>0}async pruneBefore(cutoff){let t=this.table;return(await Database.getConnection(this.options.connection).delete(t).where(lt4(t.recordedAt,cutoff)).returning({messageId:t.messageId})).length}}var toRecord2=(row)=>({position:row.position,aggregateId:row.aggregateId,aggregateType:row.aggregateType,version:row.version,type:row.type,schemaVersion:row.schemaVersion,data:row.data,metadata:row.metadata,occurredAt:row.occurredAt});class DrizzleEventStore{options;constructor(options){this.options=options}get table(){return this.options.table}get db(){return Database.getConnection(this.options.connection)}async load(aggregateId,afterVersion=0){let t=this.table;return(await this.db.select().from(t).where(and6(eq6(t.aggregateId,aggregateId),gt4(t.version,afterVersion))).orderBy(asc3(t.version))).map(toRecord2)}async readAll(filter){let{types,afterPosition,limit}=filter;if(types?.length===0)return[];let t=this.table;return(await this.db.select().from(t).where(and6(afterPosition===void 0?void 0:gt4(t.position,afterPosition),types?inArray6(t.type,[...types]):void 0)).orderBy(asc3(t.position)).limit(limit)).map(toRecord2)}async append(records){if(records.length===0)return;let t=this.table,first=new Map;for(let record of records){let known=first.get(record.aggregateId);if(!known||record.version<known.version)first.set(record.aggregateId,record)}try{for(let[aggregateId,record]of[...first].sort(([a],[b])=>a.localeCompare(b))){await this.db.execute(sql8`select pg_advisory_xact_lock(hashtextextended(${aggregateId}::text, 0))`);let[head]=await this.db.select({version:max(t.version)}).from(t).where(eq6(t.aggregateId,aggregateId));if((head?.version??0)!==record.version-1)throw new ConcurrencyConflictError(record.aggregateType,aggregateId)}await this.db.insert(t).values(records.map((record)=>({aggregateId:record.aggregateId,aggregateType:record.aggregateType,version:record.version,type:record.type,schemaVersion:record.schemaVersion,data:record.data,metadata:record.metadata,occurredAt:record.occurredAt})))}catch(error){if(isUniqueViolation(error))throw new ConcurrencyConflictError(records[0].aggregateType,records[0].aggregateId);throw error}}}var tableOf2=(model)=>{if(is4(model,PgTable2))return model;let table=model.table;if(table&&is4(table,PgTable2))return table;throw TypeError(`${model.name??"This model"} has no Drizzle table to reset. Pass a DrizzleModel or a Drizzle table in the models of the projection.`)};class DrizzleProjectionStorage{options;constructor(options){this.options=options}get table(){return this.options.table}get db(){return Database.getConnection(this.options.connection)}async reset(models){for(let model of models)await this.db.delete(tableOf2(model))}async version(name){let t=this.table,[row]=await this.db.select({version:t.version}).from(t).where(eq6(t.name,name)).limit(1);return row?.version}async built(name,version){let t=this.table,builtAt=Clock2.now();await this.db.insert(t).values({name,version,builtAt}).onConflictDoUpdate({target:t.name,set:{version,builtAt}})}}export{DEFAULT_CACHE_TTL,Database,DrizzleDatabaseCache,DrizzleEventStore,DrizzleFileStore,DrizzleIdempotencyStore,DrizzleInboxStore,DrizzleModel,DrizzleModule,DrizzleNotificationStore,DrizzleOutboxStore,DrizzleProjectionStorage,DrizzleRLSTenancy,DrizzleSchemaTenancy,DrizzleTable,Migration,MissingDriverError,MissingMigrationsError,PgAdvisoryLock,TenantMismatchError,UntranslatableRuleError,applyTableMarkers,compileAfter,compileFilter,compileQuery,createRLSPolicy,createSchemaFromDrizzle,drizzleAdapter,drizzleRepositoryAdapter,filesTable,getSessionTenant,getTableBuilders,getTableMarker,getTenantSchema,moiraiTables,nodePostgresMigrations,notificationsTable,pgTable,registerTenantSchema,rulesToDrizzle,templateClientMigrations,withRLS,wrapTenantSchema};
package/dist/moirai.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { EventReadFilter, EventStore, IdempotencyRecord, IdempotencyStore, InboxStore, OutboxClaim, OutboxRow, OutboxStore, ProjectionStorage, StoredEventRecord } from '@elysiumjs/olympus/moirai';
2
+ import type { BuiltPgTable } from './built-table';
2
3
  import { PgColumn, PgTable } from 'drizzle-orm/pg-core';
3
4
  /**
4
5
  * How `moiraiTables()` builds the tables.
@@ -13,6 +14,66 @@ export type MoiraiTablesOptions = {
13
14
  */
14
15
  partitioned?: boolean;
15
16
  };
17
+ /** The columns of `idempotency_keys`. */
18
+ declare const idempotencyKeyColumns: () => {
19
+ key: import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
20
+ action: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
21
+ requestHash: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
22
+ response: import("drizzle-orm/pg-core").PgJsonbBuilder;
23
+ createdAt: import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>;
24
+ };
25
+ /** The columns of `outbox`; a partitioned table keys its rows with `created_at` too. */
26
+ declare const outboxColumns: (partitioned: boolean) => {
27
+ id: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgUUIDBuilder>;
28
+ kind: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
29
+ payload: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgJsonbBuilder>;
30
+ createdAt: import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>;
31
+ availableAt: import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>;
32
+ attempts: import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>>;
33
+ lastError: import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>;
34
+ dispatchedAt: import("drizzle-orm/pg-core").PgTimestampBuilder;
35
+ deadAt: import("drizzle-orm/pg-core").PgTimestampBuilder;
36
+ };
37
+ /** The columns of `inbox`. */
38
+ declare const inboxColumns: () => {
39
+ messageId: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
40
+ consumer: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
41
+ recordedAt: import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>;
42
+ };
43
+ /** The columns of `events`; a partitioned table keys its rows with `occurred_at` too. */
44
+ declare const eventColumns: (partitioned: boolean) => {
45
+ position: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigSerial64Builder>;
46
+ transactionId: import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
47
+ dataType: 'custom';
48
+ data: string;
49
+ driverParam: unknown;
50
+ }>>>;
51
+ aggregateId: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
52
+ aggregateType: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
53
+ version: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>;
54
+ type: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
55
+ schemaVersion: import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>>;
56
+ data: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgJsonbBuilder>;
57
+ metadata: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgJsonbBuilder>;
58
+ occurredAt: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>;
59
+ };
60
+ /** The columns of `projections`. */
61
+ declare const projectionColumns: () => {
62
+ name: import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
63
+ version: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>;
64
+ builtAt: import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>;
65
+ };
66
+ /**
67
+ * The tables `moiraiTables()` builds.
68
+ * @author Axel Nana <ax.lnana@outlook.com>
69
+ */
70
+ export type MoiraiTables = {
71
+ idempotencyKeys: BuiltPgTable<'idempotency_keys', undefined, ReturnType<typeof idempotencyKeyColumns>>;
72
+ outbox: BuiltPgTable<'outbox', undefined, ReturnType<typeof outboxColumns>>;
73
+ inbox: BuiltPgTable<'inbox', undefined, ReturnType<typeof inboxColumns>>;
74
+ events: BuiltPgTable<'events', undefined, ReturnType<typeof eventColumns>>;
75
+ projections: BuiltPgTable<'projections', undefined, ReturnType<typeof projectionColumns>>;
76
+ };
16
77
  /**
17
78
  * Builds the tables of the moirai stores: `idempotency_keys`, `outbox`, `inbox` and `events`, in a schema
18
79
  * when one is given (one set of tables per domain schema, for example). Export them from the
@@ -21,498 +82,7 @@ export type MoiraiTablesOptions = {
21
82
  * @param schema The Postgres schema of the tables. Defaults to the search path.
22
83
  * @param options How the tables are built.
23
84
  */
24
- export declare const moiraiTables: (schema?: string, options?: MoiraiTablesOptions) => {
25
- idempotencyKeys: import("drizzle-orm/pg-core").PgTableWithColumns<{
26
- name: "idempotency_keys";
27
- schema: undefined;
28
- columns: {
29
- key: import("drizzle-orm/pg-core").PgBuildColumn<"idempotency_keys", import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
30
- name: string;
31
- tableName: "idempotency_keys";
32
- dataType: "string";
33
- data: string;
34
- driverParam: string;
35
- notNull: true;
36
- hasDefault: false;
37
- isPrimaryKey: false;
38
- isAutoincrement: false;
39
- hasRuntimeDefault: false;
40
- enumValues: undefined;
41
- identity: undefined;
42
- generated: undefined;
43
- }>;
44
- action: import("drizzle-orm/pg-core").PgBuildColumn<"idempotency_keys", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
45
- name: string;
46
- tableName: "idempotency_keys";
47
- dataType: "string";
48
- data: string;
49
- driverParam: string;
50
- notNull: true;
51
- hasDefault: false;
52
- isPrimaryKey: false;
53
- isAutoincrement: false;
54
- hasRuntimeDefault: false;
55
- enumValues: undefined;
56
- identity: undefined;
57
- generated: undefined;
58
- }>;
59
- requestHash: import("drizzle-orm/pg-core").PgBuildColumn<"idempotency_keys", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
60
- name: string;
61
- tableName: "idempotency_keys";
62
- dataType: "string";
63
- data: string;
64
- driverParam: string;
65
- notNull: true;
66
- hasDefault: false;
67
- isPrimaryKey: false;
68
- isAutoincrement: false;
69
- hasRuntimeDefault: false;
70
- enumValues: undefined;
71
- identity: undefined;
72
- generated: undefined;
73
- }>;
74
- response: import("drizzle-orm/pg-core").PgBuildColumn<"idempotency_keys", import("drizzle-orm/pg-core").PgJsonbBuilder, {
75
- name: string;
76
- tableName: "idempotency_keys";
77
- dataType: "object json";
78
- data: unknown;
79
- driverParam: unknown;
80
- notNull: false;
81
- hasDefault: false;
82
- isPrimaryKey: false;
83
- isAutoincrement: false;
84
- hasRuntimeDefault: false;
85
- enumValues: undefined;
86
- identity: undefined;
87
- generated: undefined;
88
- }>;
89
- createdAt: import("drizzle-orm/pg-core").PgBuildColumn<"idempotency_keys", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>, {
90
- name: string;
91
- tableName: "idempotency_keys";
92
- dataType: "object date";
93
- data: Date;
94
- driverParam: string;
95
- notNull: true;
96
- hasDefault: true;
97
- isPrimaryKey: false;
98
- isAutoincrement: false;
99
- hasRuntimeDefault: false;
100
- enumValues: undefined;
101
- identity: undefined;
102
- generated: undefined;
103
- }>;
104
- };
105
- dialect: 'pg';
106
- }>;
107
- outbox: import("drizzle-orm/pg-core").PgTableWithColumns<{
108
- name: "outbox";
109
- schema: undefined;
110
- columns: {
111
- id: import("drizzle-orm/pg-core").PgBuildColumn<"outbox", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgUUIDBuilder>, {
112
- name: string;
113
- tableName: "outbox";
114
- dataType: "string uuid";
115
- data: string;
116
- driverParam: string;
117
- notNull: true;
118
- hasDefault: false;
119
- isPrimaryKey: false;
120
- isAutoincrement: false;
121
- hasRuntimeDefault: false;
122
- enumValues: undefined;
123
- identity: undefined;
124
- generated: undefined;
125
- }>;
126
- kind: import("drizzle-orm/pg-core").PgBuildColumn<"outbox", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
127
- name: string;
128
- tableName: "outbox";
129
- dataType: "string";
130
- data: string;
131
- driverParam: string;
132
- notNull: true;
133
- hasDefault: false;
134
- isPrimaryKey: false;
135
- isAutoincrement: false;
136
- hasRuntimeDefault: false;
137
- enumValues: undefined;
138
- identity: undefined;
139
- generated: undefined;
140
- }>;
141
- payload: import("drizzle-orm/pg-core").PgBuildColumn<"outbox", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgJsonbBuilder>, {
142
- name: string;
143
- tableName: "outbox";
144
- dataType: "object json";
145
- data: unknown;
146
- driverParam: unknown;
147
- notNull: true;
148
- hasDefault: false;
149
- isPrimaryKey: false;
150
- isAutoincrement: false;
151
- hasRuntimeDefault: false;
152
- enumValues: undefined;
153
- identity: undefined;
154
- generated: undefined;
155
- }>;
156
- createdAt: import("drizzle-orm/pg-core").PgBuildColumn<"outbox", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>, {
157
- name: string;
158
- tableName: "outbox";
159
- dataType: "object date";
160
- data: Date;
161
- driverParam: string;
162
- notNull: true;
163
- hasDefault: true;
164
- isPrimaryKey: false;
165
- isAutoincrement: false;
166
- hasRuntimeDefault: false;
167
- enumValues: undefined;
168
- identity: undefined;
169
- generated: undefined;
170
- }>;
171
- availableAt: import("drizzle-orm/pg-core").PgBuildColumn<"outbox", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>, {
172
- name: string;
173
- tableName: "outbox";
174
- dataType: "object date";
175
- data: Date;
176
- driverParam: string;
177
- notNull: true;
178
- hasDefault: true;
179
- isPrimaryKey: false;
180
- isAutoincrement: false;
181
- hasRuntimeDefault: false;
182
- enumValues: undefined;
183
- identity: undefined;
184
- generated: undefined;
185
- }>;
186
- attempts: import("drizzle-orm/pg-core").PgBuildColumn<"outbox", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>>, {
187
- name: string;
188
- tableName: "outbox";
189
- dataType: "number int32";
190
- data: number;
191
- driverParam: string | number;
192
- notNull: true;
193
- hasDefault: true;
194
- isPrimaryKey: false;
195
- isAutoincrement: false;
196
- hasRuntimeDefault: false;
197
- enumValues: undefined;
198
- identity: undefined;
199
- generated: undefined;
200
- }>;
201
- lastError: import("drizzle-orm/pg-core").PgBuildColumn<"outbox", import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
202
- name: string;
203
- tableName: "outbox";
204
- dataType: "string";
205
- data: string;
206
- driverParam: string;
207
- notNull: false;
208
- hasDefault: false;
209
- isPrimaryKey: false;
210
- isAutoincrement: false;
211
- hasRuntimeDefault: false;
212
- enumValues: undefined;
213
- identity: undefined;
214
- generated: undefined;
215
- }>;
216
- dispatchedAt: import("drizzle-orm/pg-core").PgBuildColumn<"outbox", import("drizzle-orm/pg-core").PgTimestampBuilder, {
217
- name: string;
218
- tableName: "outbox";
219
- dataType: "object date";
220
- data: Date;
221
- driverParam: string;
222
- notNull: false;
223
- hasDefault: false;
224
- isPrimaryKey: false;
225
- isAutoincrement: false;
226
- hasRuntimeDefault: false;
227
- enumValues: undefined;
228
- identity: undefined;
229
- generated: undefined;
230
- }>;
231
- deadAt: import("drizzle-orm/pg-core").PgBuildColumn<"outbox", import("drizzle-orm/pg-core").PgTimestampBuilder, {
232
- name: string;
233
- tableName: "outbox";
234
- dataType: "object date";
235
- data: Date;
236
- driverParam: string;
237
- notNull: false;
238
- hasDefault: false;
239
- isPrimaryKey: false;
240
- isAutoincrement: false;
241
- hasRuntimeDefault: false;
242
- enumValues: undefined;
243
- identity: undefined;
244
- generated: undefined;
245
- }>;
246
- };
247
- dialect: 'pg';
248
- }>;
249
- inbox: import("drizzle-orm/pg-core").PgTableWithColumns<{
250
- name: "inbox";
251
- schema: undefined;
252
- columns: {
253
- messageId: import("drizzle-orm/pg-core").PgBuildColumn<"inbox", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
254
- name: string;
255
- tableName: "inbox";
256
- dataType: "string";
257
- data: string;
258
- driverParam: string;
259
- notNull: true;
260
- hasDefault: false;
261
- isPrimaryKey: false;
262
- isAutoincrement: false;
263
- hasRuntimeDefault: false;
264
- enumValues: undefined;
265
- identity: undefined;
266
- generated: undefined;
267
- }>;
268
- consumer: import("drizzle-orm/pg-core").PgBuildColumn<"inbox", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
269
- name: string;
270
- tableName: "inbox";
271
- dataType: "string";
272
- data: string;
273
- driverParam: string;
274
- notNull: true;
275
- hasDefault: false;
276
- isPrimaryKey: false;
277
- isAutoincrement: false;
278
- hasRuntimeDefault: false;
279
- enumValues: undefined;
280
- identity: undefined;
281
- generated: undefined;
282
- }>;
283
- recordedAt: import("drizzle-orm/pg-core").PgBuildColumn<"inbox", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>, {
284
- name: string;
285
- tableName: "inbox";
286
- dataType: "object date";
287
- data: Date;
288
- driverParam: string;
289
- notNull: true;
290
- hasDefault: true;
291
- isPrimaryKey: false;
292
- isAutoincrement: false;
293
- hasRuntimeDefault: false;
294
- enumValues: undefined;
295
- identity: undefined;
296
- generated: undefined;
297
- }>;
298
- };
299
- dialect: 'pg';
300
- }>;
301
- events: import("drizzle-orm/pg-core").PgTableWithColumns<{
302
- name: "events";
303
- schema: undefined;
304
- columns: {
305
- position: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigSerial64Builder>, {
306
- name: string;
307
- tableName: "events";
308
- dataType: "bigint int64";
309
- data: bigint;
310
- driverParam: string;
311
- notNull: true;
312
- hasDefault: true;
313
- isPrimaryKey: false;
314
- isAutoincrement: false;
315
- hasRuntimeDefault: false;
316
- enumValues: undefined;
317
- identity: undefined;
318
- generated: undefined;
319
- }>;
320
- transactionId: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
321
- dataType: 'custom';
322
- data: string;
323
- driverParam: unknown;
324
- }>>>, {
325
- name: string;
326
- tableName: "events";
327
- dataType: "custom";
328
- data: string;
329
- driverParam: unknown;
330
- notNull: true;
331
- hasDefault: true;
332
- isPrimaryKey: false;
333
- isAutoincrement: false;
334
- hasRuntimeDefault: false;
335
- enumValues: undefined;
336
- identity: undefined;
337
- generated: undefined;
338
- }>;
339
- aggregateId: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
340
- name: string;
341
- tableName: "events";
342
- dataType: "string";
343
- data: string;
344
- driverParam: string;
345
- notNull: true;
346
- hasDefault: false;
347
- isPrimaryKey: false;
348
- isAutoincrement: false;
349
- hasRuntimeDefault: false;
350
- enumValues: undefined;
351
- identity: undefined;
352
- generated: undefined;
353
- }>;
354
- aggregateType: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
355
- name: string;
356
- tableName: "events";
357
- dataType: "string";
358
- data: string;
359
- driverParam: string;
360
- notNull: true;
361
- hasDefault: false;
362
- isPrimaryKey: false;
363
- isAutoincrement: false;
364
- hasRuntimeDefault: false;
365
- enumValues: undefined;
366
- identity: undefined;
367
- generated: undefined;
368
- }>;
369
- version: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>, {
370
- name: string;
371
- tableName: "events";
372
- dataType: "number int32";
373
- data: number;
374
- driverParam: string | number;
375
- notNull: true;
376
- hasDefault: false;
377
- isPrimaryKey: false;
378
- isAutoincrement: false;
379
- hasRuntimeDefault: false;
380
- enumValues: undefined;
381
- identity: undefined;
382
- generated: undefined;
383
- }>;
384
- type: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
385
- name: string;
386
- tableName: "events";
387
- dataType: "string";
388
- data: string;
389
- driverParam: string;
390
- notNull: true;
391
- hasDefault: false;
392
- isPrimaryKey: false;
393
- isAutoincrement: false;
394
- hasRuntimeDefault: false;
395
- enumValues: undefined;
396
- identity: undefined;
397
- generated: undefined;
398
- }>;
399
- schemaVersion: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>>, {
400
- name: string;
401
- tableName: "events";
402
- dataType: "number int32";
403
- data: number;
404
- driverParam: string | number;
405
- notNull: true;
406
- hasDefault: true;
407
- isPrimaryKey: false;
408
- isAutoincrement: false;
409
- hasRuntimeDefault: false;
410
- enumValues: undefined;
411
- identity: undefined;
412
- generated: undefined;
413
- }>;
414
- data: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgJsonbBuilder>, {
415
- name: string;
416
- tableName: "events";
417
- dataType: "object json";
418
- data: unknown;
419
- driverParam: unknown;
420
- notNull: true;
421
- hasDefault: false;
422
- isPrimaryKey: false;
423
- isAutoincrement: false;
424
- hasRuntimeDefault: false;
425
- enumValues: undefined;
426
- identity: undefined;
427
- generated: undefined;
428
- }>;
429
- metadata: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgJsonbBuilder>, {
430
- name: string;
431
- tableName: "events";
432
- dataType: "object json";
433
- data: unknown;
434
- driverParam: unknown;
435
- notNull: true;
436
- hasDefault: false;
437
- isPrimaryKey: false;
438
- isAutoincrement: false;
439
- hasRuntimeDefault: false;
440
- enumValues: undefined;
441
- identity: undefined;
442
- generated: undefined;
443
- }>;
444
- occurredAt: import("drizzle-orm/pg-core").PgBuildColumn<"events", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>, {
445
- name: string;
446
- tableName: "events";
447
- dataType: "object date";
448
- data: Date;
449
- driverParam: string;
450
- notNull: true;
451
- hasDefault: false;
452
- isPrimaryKey: false;
453
- isAutoincrement: false;
454
- hasRuntimeDefault: false;
455
- enumValues: undefined;
456
- identity: undefined;
457
- generated: undefined;
458
- }>;
459
- };
460
- dialect: 'pg';
461
- }>;
462
- projections: import("drizzle-orm/pg-core").PgTableWithColumns<{
463
- name: "projections";
464
- schema: undefined;
465
- columns: {
466
- name: import("drizzle-orm/pg-core").PgBuildColumn<"projections", import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
467
- name: string;
468
- tableName: "projections";
469
- dataType: "string";
470
- data: string;
471
- driverParam: string;
472
- notNull: true;
473
- hasDefault: false;
474
- isPrimaryKey: false;
475
- isAutoincrement: false;
476
- hasRuntimeDefault: false;
477
- enumValues: undefined;
478
- identity: undefined;
479
- generated: undefined;
480
- }>;
481
- version: import("drizzle-orm/pg-core").PgBuildColumn<"projections", import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>, {
482
- name: string;
483
- tableName: "projections";
484
- dataType: "number int32";
485
- data: number;
486
- driverParam: string | number;
487
- notNull: true;
488
- hasDefault: false;
489
- isPrimaryKey: false;
490
- isAutoincrement: false;
491
- hasRuntimeDefault: false;
492
- enumValues: undefined;
493
- identity: undefined;
494
- generated: undefined;
495
- }>;
496
- builtAt: import("drizzle-orm/pg-core").PgBuildColumn<"projections", import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>>, {
497
- name: string;
498
- tableName: "projections";
499
- dataType: "object date";
500
- data: Date;
501
- driverParam: string;
502
- notNull: true;
503
- hasDefault: true;
504
- isPrimaryKey: false;
505
- isAutoincrement: false;
506
- hasRuntimeDefault: false;
507
- enumValues: undefined;
508
- identity: undefined;
509
- generated: undefined;
510
- }>;
511
- };
512
- dialect: 'pg';
513
- }>;
514
- };
515
- export type MoiraiTables = ReturnType<typeof moiraiTables>;
85
+ export declare const moiraiTables: (schema?: string, options?: MoiraiTablesOptions) => MoiraiTables;
516
86
  /**
517
87
  * Where a Drizzle store works: its table, and the connection whose open transaction it joins.
518
88
  * @author Axel Nana <ax.lnana@outlook.com>
@@ -620,3 +190,4 @@ export declare class DrizzleProjectionStorage implements ProjectionStorage {
620
190
  version(name: string): Promise<number | undefined>;
621
191
  built(name: string, version: number): Promise<void>;
622
192
  }
193
+ export {};
package/dist/pithos.d.ts CHANGED
@@ -1,10 +1,31 @@
1
1
  import type { FileCondition, FilePatch, FileRecord, FileStatus, FileStoreDriver } from '@elysiumjs/olympus/pithos';
2
+ import type { BuiltPgTable } from './built-table';
2
3
  import type { DrizzleStoreOptions, StoreTable } from './moirai';
3
4
  declare module '@elysiumjs/olympus' {
4
5
  interface PortDrivers {
5
6
  'file-store:drizzle': typeof DrizzleFileStore;
6
7
  }
7
8
  }
9
+ /** The columns of the files table. */
10
+ declare const fileColumns: () => {
11
+ id: import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
12
+ purpose: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
13
+ disk: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
14
+ key: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
15
+ contentType: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
16
+ size: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigInt53Builder>;
17
+ ownerType: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
18
+ ownerId: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>;
19
+ createdBy: import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>;
20
+ status: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, FileStatus>>;
21
+ createdAt: import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>;
22
+ readyAt: import("drizzle-orm/pg-core").PgTimestampBuilder;
23
+ claimedAt: import("drizzle-orm/pg-core").PgTimestampBuilder;
24
+ releasedAt: import("drizzle-orm/pg-core").PgTimestampBuilder;
25
+ expiresAt: import("drizzle-orm/pg-core").PgTimestampBuilder;
26
+ deletedAt: import("drizzle-orm/pg-core").PgTimestampBuilder;
27
+ rejection: import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>;
28
+ };
8
29
  /**
9
30
  * Builds the table of the file store, in a schema when one is given. Export it from the Drizzle
10
31
  * schema so that `migration:generate` creates it.
@@ -18,270 +39,9 @@ declare module '@elysiumjs/olympus' {
18
39
  * PithosModule.with({ disks, files: { store: () => FileStore.for('drizzle', { table: files }) } });
19
40
  * ```
20
41
  */
21
- export declare const filesTable: (name?: string, schema?: string) => import("drizzle-orm/pg-core").PgTableWithColumns<{
22
- name: string;
23
- schema: undefined;
24
- columns: {
25
- id: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
26
- name: string;
27
- tableName: string;
28
- dataType: "string";
29
- data: string;
30
- driverParam: string;
31
- notNull: true;
32
- hasDefault: false;
33
- isPrimaryKey: false;
34
- isAutoincrement: false;
35
- hasRuntimeDefault: false;
36
- enumValues: undefined;
37
- identity: undefined;
38
- generated: undefined;
39
- }>;
40
- purpose: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
41
- name: string;
42
- tableName: string;
43
- dataType: "string";
44
- data: string;
45
- driverParam: string;
46
- notNull: true;
47
- hasDefault: false;
48
- isPrimaryKey: false;
49
- isAutoincrement: false;
50
- hasRuntimeDefault: false;
51
- enumValues: undefined;
52
- identity: undefined;
53
- generated: undefined;
54
- }>;
55
- disk: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
56
- name: string;
57
- tableName: string;
58
- dataType: "string";
59
- data: string;
60
- driverParam: string;
61
- notNull: true;
62
- hasDefault: false;
63
- isPrimaryKey: false;
64
- isAutoincrement: false;
65
- hasRuntimeDefault: false;
66
- enumValues: undefined;
67
- identity: undefined;
68
- generated: undefined;
69
- }>;
70
- key: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
71
- name: string;
72
- tableName: string;
73
- dataType: "string";
74
- data: string;
75
- driverParam: string;
76
- notNull: true;
77
- hasDefault: false;
78
- isPrimaryKey: false;
79
- isAutoincrement: false;
80
- hasRuntimeDefault: false;
81
- enumValues: undefined;
82
- identity: undefined;
83
- generated: undefined;
84
- }>;
85
- contentType: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
86
- name: string;
87
- tableName: string;
88
- dataType: "string";
89
- data: string;
90
- driverParam: string;
91
- notNull: true;
92
- hasDefault: false;
93
- isPrimaryKey: false;
94
- isAutoincrement: false;
95
- hasRuntimeDefault: false;
96
- enumValues: undefined;
97
- identity: undefined;
98
- generated: undefined;
99
- }>;
100
- size: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigInt53Builder>, {
101
- name: string;
102
- tableName: string;
103
- dataType: "number int53";
104
- data: number;
105
- driverParam: string | number;
106
- notNull: true;
107
- hasDefault: false;
108
- isPrimaryKey: false;
109
- isAutoincrement: false;
110
- hasRuntimeDefault: false;
111
- enumValues: undefined;
112
- identity: undefined;
113
- generated: undefined;
114
- }>;
115
- ownerType: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
116
- name: string;
117
- tableName: string;
118
- dataType: "string";
119
- data: string;
120
- driverParam: string;
121
- notNull: true;
122
- hasDefault: false;
123
- isPrimaryKey: false;
124
- isAutoincrement: false;
125
- hasRuntimeDefault: false;
126
- enumValues: undefined;
127
- identity: undefined;
128
- generated: undefined;
129
- }>;
130
- ownerId: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
131
- name: string;
132
- tableName: string;
133
- dataType: "string";
134
- data: string;
135
- driverParam: string;
136
- notNull: true;
137
- hasDefault: false;
138
- isPrimaryKey: false;
139
- isAutoincrement: false;
140
- hasRuntimeDefault: false;
141
- enumValues: undefined;
142
- identity: undefined;
143
- generated: undefined;
144
- }>;
145
- createdBy: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
146
- name: string;
147
- tableName: string;
148
- dataType: "string";
149
- data: string;
150
- driverParam: string;
151
- notNull: false;
152
- hasDefault: false;
153
- isPrimaryKey: false;
154
- isAutoincrement: false;
155
- hasRuntimeDefault: false;
156
- enumValues: undefined;
157
- identity: undefined;
158
- generated: undefined;
159
- }>;
160
- status: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, FileStatus>>, {
161
- name: string;
162
- tableName: string;
163
- dataType: "string";
164
- data: FileStatus;
165
- driverParam: string;
166
- notNull: true;
167
- hasDefault: false;
168
- isPrimaryKey: false;
169
- isAutoincrement: false;
170
- hasRuntimeDefault: false;
171
- enumValues: undefined;
172
- identity: undefined;
173
- generated: undefined;
174
- }>;
175
- createdAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTimestampBuilder>, {
176
- name: string;
177
- tableName: string;
178
- dataType: "object date";
179
- data: Date;
180
- driverParam: string;
181
- notNull: true;
182
- hasDefault: false;
183
- isPrimaryKey: false;
184
- isAutoincrement: false;
185
- hasRuntimeDefault: false;
186
- enumValues: undefined;
187
- identity: undefined;
188
- generated: undefined;
189
- }>;
190
- readyAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTimestampBuilder, {
191
- name: string;
192
- tableName: string;
193
- dataType: "object date";
194
- data: Date;
195
- driverParam: string;
196
- notNull: false;
197
- hasDefault: false;
198
- isPrimaryKey: false;
199
- isAutoincrement: false;
200
- hasRuntimeDefault: false;
201
- enumValues: undefined;
202
- identity: undefined;
203
- generated: undefined;
204
- }>;
205
- claimedAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTimestampBuilder, {
206
- name: string;
207
- tableName: string;
208
- dataType: "object date";
209
- data: Date;
210
- driverParam: string;
211
- notNull: false;
212
- hasDefault: false;
213
- isPrimaryKey: false;
214
- isAutoincrement: false;
215
- hasRuntimeDefault: false;
216
- enumValues: undefined;
217
- identity: undefined;
218
- generated: undefined;
219
- }>;
220
- releasedAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTimestampBuilder, {
221
- name: string;
222
- tableName: string;
223
- dataType: "object date";
224
- data: Date;
225
- driverParam: string;
226
- notNull: false;
227
- hasDefault: false;
228
- isPrimaryKey: false;
229
- isAutoincrement: false;
230
- hasRuntimeDefault: false;
231
- enumValues: undefined;
232
- identity: undefined;
233
- generated: undefined;
234
- }>;
235
- expiresAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTimestampBuilder, {
236
- name: string;
237
- tableName: string;
238
- dataType: "object date";
239
- data: Date;
240
- driverParam: string;
241
- notNull: false;
242
- hasDefault: false;
243
- isPrimaryKey: false;
244
- isAutoincrement: false;
245
- hasRuntimeDefault: false;
246
- enumValues: undefined;
247
- identity: undefined;
248
- generated: undefined;
249
- }>;
250
- deletedAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTimestampBuilder, {
251
- name: string;
252
- tableName: string;
253
- dataType: "object date";
254
- data: Date;
255
- driverParam: string;
256
- notNull: false;
257
- hasDefault: false;
258
- isPrimaryKey: false;
259
- isAutoincrement: false;
260
- hasRuntimeDefault: false;
261
- enumValues: undefined;
262
- identity: undefined;
263
- generated: undefined;
264
- }>;
265
- rejection: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
266
- name: string;
267
- tableName: string;
268
- dataType: "string";
269
- data: string;
270
- driverParam: string;
271
- notNull: false;
272
- hasDefault: false;
273
- isPrimaryKey: false;
274
- isAutoincrement: false;
275
- hasRuntimeDefault: false;
276
- enumValues: undefined;
277
- identity: undefined;
278
- generated: undefined;
279
- }>;
280
- };
281
- dialect: 'pg';
282
- }>;
42
+ export declare const filesTable: (name?: string, schema?: string) => FilesTable;
283
43
  /** The table `filesTable()` builds. */
284
- export type FilesTable = ReturnType<typeof filesTable>;
44
+ export type FilesTable = BuiltPgTable<string, undefined, ReturnType<typeof fileColumns>>;
285
45
  /**
286
46
  * Keeps file records in a Postgres table, built with `filesTable()` or any table with its
287
47
  * columns. Each transition is one conditional `UPDATE`, so only one of two racing requests wins.
@@ -299,3 +59,4 @@ export declare class DrizzleFileStore implements FileStoreDriver {
299
59
  countPending(createdBy: string, now: Date): Promise<number>;
300
60
  due(now: Date, limit: number): Promise<FileRecord[]>;
301
61
  }
62
+ export {};
package/dist/table.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { AnyPgColumnBuilder, PgTableWithColumns } from 'drizzle-orm/pg-core';
2
+ import type { BuiltPgTable } from './built-table';
2
3
  /**
3
4
  * Retrieves the original column builders for a table.
4
5
  * @param table The table created with enhanced pgTable.
@@ -17,53 +18,4 @@ export declare const getTableBuilders: (table: PgTableWithColumns<any>) => Recor
17
18
  * @param extraConfig Optional extra Drizzle table configuration.
18
19
  * @returns A Drizzle PostgreSQL table with registered column builders.
19
20
  */
20
- export declare const pgTable: <TTableName extends string, TColumns extends Record<string, AnyPgColumnBuilder>>(tableName: TTableName, columns: TColumns, extraConfig?: (table: any) => any) => PgTableWithColumns<{
21
- name: TTableName;
22
- schema: undefined;
23
- columns: { [Key in keyof TColumns]: import("drizzle-orm/pg-core").PgBuildColumn<TTableName, TColumns[Key], {
24
- name: string;
25
- tableName: TTableName;
26
- dataType: TColumns[Key]["_"]["dataType"];
27
- data: TColumns[Key]["_"]["dimensions"] extends 1 | 2 | 3 | 4 | 5 ? TColumns[Key]["_"]["dimensions"] extends infer T ? T extends TColumns[Key]["_"]["dimensions"] ? T extends 1 ? (TColumns[Key]["_"] extends infer T_1 ? T_1 extends TColumns[Key]["_"] ? T_1 extends {
28
- $type: infer U;
29
- } ? U : T_1 extends {
30
- data: infer D;
31
- } ? D : unknown : never : never)[] : T extends 2 ? (TColumns[Key]["_"] extends infer T_1 ? T_1 extends TColumns[Key]["_"] ? T_1 extends {
32
- $type: infer U;
33
- } ? U : T_1 extends {
34
- data: infer D;
35
- } ? D : unknown : never : never)[][] : T extends 3 ? (TColumns[Key]["_"] extends infer T_1 ? T_1 extends TColumns[Key]["_"] ? T_1 extends {
36
- $type: infer U;
37
- } ? U : T_1 extends {
38
- data: infer D;
39
- } ? D : unknown : never : never)[][][] : T extends 4 ? (TColumns[Key]["_"] extends infer T_1 ? T_1 extends TColumns[Key]["_"] ? T_1 extends {
40
- $type: infer U;
41
- } ? U : T_1 extends {
42
- data: infer D;
43
- } ? D : unknown : never : never)[][][][] : T extends 5 ? (TColumns[Key]["_"] extends infer T_1 ? T_1 extends TColumns[Key]["_"] ? T_1 extends {
44
- $type: infer U;
45
- } ? U : T_1 extends {
46
- data: infer D;
47
- } ? D : unknown : never : never)[][][][][] : TColumns[Key]["_"] extends infer T_1 ? T_1 extends TColumns[Key]["_"] ? T_1 extends {
48
- $type: infer U;
49
- } ? U : T_1 extends {
50
- data: infer D;
51
- } ? D : unknown : never : never : never : never : TColumns[Key]["_"] extends infer T_1 ? T_1 extends TColumns[Key]["_"] ? T_1 extends {
52
- $type: infer U;
53
- } ? U : T_1 extends {
54
- data: infer D;
55
- } ? D : unknown : never : never;
56
- driverParam: TColumns[Key]["_"]["dimensions"] extends 1 | 2 | 3 | 4 | 5 ? string | (TColumns[Key]["_"]["dimensions"] extends infer T_2 ? T_2 extends TColumns[Key]["_"]["dimensions"] ? T_2 extends 1 ? TColumns[Key]["_"]["driverParam"][] : T_2 extends 2 ? TColumns[Key]["_"]["driverParam"][][] : T_2 extends 3 ? TColumns[Key]["_"]["driverParam"][][][] : T_2 extends 4 ? TColumns[Key]["_"]["driverParam"][][][][] : T_2 extends 5 ? TColumns[Key]["_"]["driverParam"][][][][][] : TColumns[Key]["_"]["driverParam"] : never : never) : TColumns[Key]["_"]["driverParam"];
57
- notNull: TColumns[Key]["_"]["notNull"] extends true ? true : false;
58
- hasDefault: TColumns[Key]["_"]["hasDefault"] extends true ? true : false;
59
- isPrimaryKey: false;
60
- isAutoincrement: false;
61
- hasRuntimeDefault: false;
62
- enumValues: TColumns[Key]["_"] extends infer T_3 ? T_3 extends TColumns[Key]["_"] ? T_3 extends {
63
- enumValues: infer E extends string[];
64
- } ? E : undefined : never : never;
65
- identity: TColumns[Key]["_"]["identity"] extends "always" | "byDefault" ? TColumns[Key]["_"]["identity"] : undefined;
66
- generated: TColumns[Key]["_"]["generated"] extends true ? true : undefined;
67
- }>; };
68
- dialect: 'pg';
69
- }>;
21
+ export declare const pgTable: <TTableName extends string, TColumns extends Record<string, AnyPgColumnBuilder>>(tableName: TTableName, columns: TColumns, extraConfig?: (table: any) => any) => BuiltPgTable<TTableName, undefined, TColumns>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elysiumjs/drizzle",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Drizzle ORM backend for the Elysium.js framework: database drivers, models, repositories, queries, migrations, tenancy, the moirai stores, the notification and file stores, abilities as SQL, and the postgres lock.",
6
6
  "private": false,