@murumets-ee/db 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +171 -132
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.map +1 -1
- package/dist/test-utils.mjs +1 -1
- package/dist/test-utils.mjs.map +1 -1
- package/package.json +4 -1
package/dist/index.d.mts
CHANGED
|
@@ -3,6 +3,7 @@ import * as _$drizzle_orm0 from "drizzle-orm";
|
|
|
3
3
|
import { InferInsertModel, SQL } from "drizzle-orm";
|
|
4
4
|
import * as _$drizzle_orm_pg_core0 from "drizzle-orm/pg-core";
|
|
5
5
|
import { AnyPgColumn, PgColumnBuilderBase, PgTable, PgTableWithColumns, TableConfig } from "drizzle-orm/pg-core";
|
|
6
|
+
import { Logger } from "drizzle-orm/logger";
|
|
6
7
|
|
|
7
8
|
//#region src/client.d.ts
|
|
8
9
|
interface DbConfig {
|
|
@@ -12,12 +13,22 @@ interface DbConfig {
|
|
|
12
13
|
poolMax?: number;
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
|
-
* Create a full read-write database client
|
|
16
|
+
* Create a full read-write database client.
|
|
16
17
|
*/
|
|
17
18
|
declare function createDbClient(config: DbConfig): PostgresJsDatabase;
|
|
18
19
|
/**
|
|
19
|
-
* Create a read-only database client
|
|
20
|
-
*
|
|
20
|
+
* Create a read-only database client.
|
|
21
|
+
*
|
|
22
|
+
* Sets `default_transaction_read_only = on` as a startup parameter on every
|
|
23
|
+
* connection in the pool, so any implicit transaction issued through this
|
|
24
|
+
* client is read-only at the PostgreSQL level. This is the defense-in-depth
|
|
25
|
+
* layer beneath the application's own routing of writes through `AdminClient`
|
|
26
|
+
* — even if a write somehow reaches a read-only client, Postgres rejects it.
|
|
27
|
+
*
|
|
28
|
+
* Implementation note: postgres-js's `connection` config object is sent in
|
|
29
|
+
* the PostgreSQL startup packet for every new pool connection, so the GUC is
|
|
30
|
+
* applied uniformly across the whole pool — not just whichever connection
|
|
31
|
+
* happened to run a one-off `SET` statement.
|
|
21
32
|
*/
|
|
22
33
|
declare function createReadOnlyClient(config: DbConfig): PostgresJsDatabase;
|
|
23
34
|
//#endregion
|
|
@@ -66,17 +77,6 @@ interface MigrationStatus {
|
|
|
66
77
|
* pay the loader cost.
|
|
67
78
|
*/
|
|
68
79
|
type MigrationLoader = (absolutePath: string) => Promise<MigrationModule>;
|
|
69
|
-
/**
|
|
70
|
-
* Discover all migration files under `projectRoot/migrations`.
|
|
71
|
-
*
|
|
72
|
-
* Layout:
|
|
73
|
-
* migrations/
|
|
74
|
-
* 20260411_180000_add_articles.ts ← user migrations (sort chronologically)
|
|
75
|
-
* 20260411_180000_add_articles.snapshot.json
|
|
76
|
-
* .toolkit/
|
|
77
|
-
* 0001_initial_schema.ts ← toolkit-owned migrations (sort numerically)
|
|
78
|
-
*/
|
|
79
|
-
declare function discoverMigrations(projectRoot: string): Promise<MigrationSource[]>;
|
|
80
80
|
/** Split discovered migrations into applied vs pending by consulting the tracking table. */
|
|
81
81
|
declare function getMigrationStatus(db: PostgresJsDatabase, projectRoot: string): Promise<MigrationStatus>;
|
|
82
82
|
/**
|
|
@@ -101,6 +101,28 @@ declare function runMigrations(db: PostgresJsDatabase, projectRoot: string, load
|
|
|
101
101
|
*/
|
|
102
102
|
declare function rollbackMigrations(db: PostgresJsDatabase, projectRoot: string, loader: MigrationLoader, count?: number): Promise<void>;
|
|
103
103
|
//#endregion
|
|
104
|
+
//#region src/query-counter.d.ts
|
|
105
|
+
/**
|
|
106
|
+
* Per-request DB query counter — opt-in, off by default.
|
|
107
|
+
*
|
|
108
|
+
* Wired into the Drizzle client when `LUMI_DB_QUERY_COUNTER=1`. The harness
|
|
109
|
+
* (apps/perf-harness) wraps each HTTP request in `runWithQueryStats` and emits
|
|
110
|
+
* the count as an `x-db-query-count` response header, so k6 scenarios can
|
|
111
|
+
* assert per-endpoint query budgets like:
|
|
112
|
+
*
|
|
113
|
+
* checks: { 'findById ≤ 2 queries': (r) => r.headers['X-Db-Query-Count'] <= '2' }
|
|
114
|
+
*
|
|
115
|
+
* No-op for any code path that does not enter `runWithQueryStats` — the ALS
|
|
116
|
+
* store is undefined and `logQuery` returns immediately.
|
|
117
|
+
*/
|
|
118
|
+
interface QueryStats {
|
|
119
|
+
count: number;
|
|
120
|
+
}
|
|
121
|
+
declare function getQueryStats(): QueryStats | undefined;
|
|
122
|
+
declare function runWithQueryStats<T>(fn: (stats: QueryStats) => Promise<T>): Promise<T>;
|
|
123
|
+
declare const queryCountingLogger: Logger;
|
|
124
|
+
declare function isQueryCounterEnabled(): boolean;
|
|
125
|
+
//#endregion
|
|
104
126
|
//#region src/schema-registry.d.ts
|
|
105
127
|
/**
|
|
106
128
|
* Schema registry for storing Drizzle schemas
|
|
@@ -129,10 +151,6 @@ declare class SchemaRegistryImpl implements SchemaRegistry {
|
|
|
129
151
|
* Entities will register their schemas here when they are defined
|
|
130
152
|
*/
|
|
131
153
|
declare const schemaRegistry: SchemaRegistryImpl;
|
|
132
|
-
/**
|
|
133
|
-
* Create a new isolated schema registry (useful for testing)
|
|
134
|
-
*/
|
|
135
|
-
declare function createSchemaRegistry(): SchemaRegistry;
|
|
136
154
|
//#endregion
|
|
137
155
|
//#region src/table/types.d.ts
|
|
138
156
|
/**
|
|
@@ -177,7 +195,7 @@ interface ColumnFactory<TType = unknown, TKind extends ColumnKind = ColumnKind,
|
|
|
177
195
|
* - `notNull: true` → `T`
|
|
178
196
|
* - `notNull: false` → `T | null`
|
|
179
197
|
*/
|
|
180
|
-
type ColumnValue<C> = C extends ColumnFactory<infer T, ColumnKind, infer N> ? N extends true ? T : T | null : never;
|
|
198
|
+
type ColumnValue<C> = C extends ColumnFactory<infer T, ColumnKind, infer N> ? (N extends true ? T : T | null) : never;
|
|
181
199
|
/**
|
|
182
200
|
* Map a columns record to its row shape (the result of a SELECT).
|
|
183
201
|
*/
|
|
@@ -334,113 +352,6 @@ interface TableDefinition<TCols extends Record<string, ColumnFactory>> {
|
|
|
334
352
|
indexes?: IndexDefinition<TCols>[];
|
|
335
353
|
}
|
|
336
354
|
//#endregion
|
|
337
|
-
//#region src/table/columns.d.ts
|
|
338
|
-
/**
|
|
339
|
-
* Type interface for the `column` builder namespace.
|
|
340
|
-
*
|
|
341
|
-
* Overloads discriminate on whether `default` is present, so
|
|
342
|
-
* `THasDefault` is inferred correctly:
|
|
343
|
-
*
|
|
344
|
-
* - `column.varchar({ length: 20, default: 'x' })` → `hasDefault = true`
|
|
345
|
-
* - `column.varchar({ length: 20 })` → `hasDefault = false`
|
|
346
|
-
*
|
|
347
|
-
* Object-literal methods don't support overloads in TypeScript, so we
|
|
348
|
-
* declare the overloaded signatures on an interface and cast the
|
|
349
|
-
* implementation object.
|
|
350
|
-
*/
|
|
351
|
-
interface ColumnBuilders {
|
|
352
|
-
uuid<TPrimaryKey extends boolean = false, TNotNull extends boolean = false, THasDefault extends boolean = false>(opts?: {
|
|
353
|
-
primaryKey?: TPrimaryKey;
|
|
354
|
-
notNull?: TNotNull;
|
|
355
|
-
defaultRandom?: THasDefault;
|
|
356
|
-
pgName?: string;
|
|
357
|
-
}): ColumnFactory<string, 'uuid', TPrimaryKey extends true ? true : TNotNull extends true ? true : false, TPrimaryKey extends true ? true : THasDefault extends true ? true : false>;
|
|
358
|
-
varchar<TNotNull extends boolean = false>(opts: {
|
|
359
|
-
length: number;
|
|
360
|
-
notNull?: TNotNull;
|
|
361
|
-
default: string;
|
|
362
|
-
pgName?: string;
|
|
363
|
-
}): ColumnFactory<string, 'varchar', TNotNull extends true ? true : false, true>;
|
|
364
|
-
varchar<TNotNull extends boolean = false>(opts: {
|
|
365
|
-
length: number;
|
|
366
|
-
notNull?: TNotNull;
|
|
367
|
-
pgName?: string;
|
|
368
|
-
}): ColumnFactory<string, 'varchar', TNotNull extends true ? true : false, false>;
|
|
369
|
-
text<TNotNull extends boolean = false>(opts: {
|
|
370
|
-
notNull?: TNotNull;
|
|
371
|
-
default: string;
|
|
372
|
-
pgName?: string;
|
|
373
|
-
}): ColumnFactory<string, 'text', TNotNull extends true ? true : false, true>;
|
|
374
|
-
text<TNotNull extends boolean = false>(opts?: {
|
|
375
|
-
notNull?: TNotNull;
|
|
376
|
-
pgName?: string;
|
|
377
|
-
}): ColumnFactory<string, 'text', TNotNull extends true ? true : false, false>;
|
|
378
|
-
integer<TNotNull extends boolean = false>(opts: {
|
|
379
|
-
notNull?: TNotNull;
|
|
380
|
-
default: number;
|
|
381
|
-
pgName?: string;
|
|
382
|
-
}): ColumnFactory<number, 'integer', TNotNull extends true ? true : false, true>;
|
|
383
|
-
integer<TNotNull extends boolean = false>(opts?: {
|
|
384
|
-
notNull?: TNotNull;
|
|
385
|
-
pgName?: string;
|
|
386
|
-
}): ColumnFactory<number, 'integer', TNotNull extends true ? true : false, false>;
|
|
387
|
-
bigint<TMode extends 'number' | 'bigint' = 'number', TNotNull extends boolean = false>(opts: {
|
|
388
|
-
mode?: TMode;
|
|
389
|
-
notNull?: TNotNull;
|
|
390
|
-
default: TMode extends 'bigint' ? bigint : number;
|
|
391
|
-
pgName?: string;
|
|
392
|
-
}): ColumnFactory<TMode extends 'bigint' ? bigint : number, 'bigint', TNotNull extends true ? true : false, true>;
|
|
393
|
-
bigint<TMode extends 'number' | 'bigint' = 'number', TNotNull extends boolean = false>(opts?: {
|
|
394
|
-
mode?: TMode;
|
|
395
|
-
notNull?: TNotNull;
|
|
396
|
-
pgName?: string;
|
|
397
|
-
}): ColumnFactory<TMode extends 'bigint' ? bigint : number, 'bigint', TNotNull extends true ? true : false, false>;
|
|
398
|
-
double<TNotNull extends boolean = false>(opts: {
|
|
399
|
-
notNull?: TNotNull;
|
|
400
|
-
default: number;
|
|
401
|
-
pgName?: string;
|
|
402
|
-
}): ColumnFactory<number, 'double', TNotNull extends true ? true : false, true>;
|
|
403
|
-
double<TNotNull extends boolean = false>(opts?: {
|
|
404
|
-
notNull?: TNotNull;
|
|
405
|
-
pgName?: string;
|
|
406
|
-
}): ColumnFactory<number, 'double', TNotNull extends true ? true : false, false>;
|
|
407
|
-
boolean<TNotNull extends boolean = false>(opts: {
|
|
408
|
-
notNull?: TNotNull;
|
|
409
|
-
default: boolean;
|
|
410
|
-
pgName?: string;
|
|
411
|
-
}): ColumnFactory<boolean, 'boolean', TNotNull extends true ? true : false, true>;
|
|
412
|
-
boolean<TNotNull extends boolean = false>(opts?: {
|
|
413
|
-
notNull?: TNotNull;
|
|
414
|
-
pgName?: string;
|
|
415
|
-
}): ColumnFactory<boolean, 'boolean', TNotNull extends true ? true : false, false>;
|
|
416
|
-
timestamp<TNotNull extends boolean = false, THasDefault extends boolean = false>(opts?: {
|
|
417
|
-
notNull?: TNotNull;
|
|
418
|
-
defaultNow?: THasDefault;
|
|
419
|
-
withTimezone?: boolean;
|
|
420
|
-
pgName?: string;
|
|
421
|
-
}): ColumnFactory<Date, 'timestamp', TNotNull extends true ? true : false, THasDefault extends true ? true : false>;
|
|
422
|
-
jsonb<T = unknown, TNotNull extends boolean = false>(opts: {
|
|
423
|
-
notNull?: TNotNull;
|
|
424
|
-
default: T;
|
|
425
|
-
pgName?: string;
|
|
426
|
-
}): ColumnFactory<T, 'jsonb', TNotNull extends true ? true : false, true>;
|
|
427
|
-
jsonb<T = unknown, TNotNull extends boolean = false>(opts?: {
|
|
428
|
-
notNull?: TNotNull;
|
|
429
|
-
pgName?: string;
|
|
430
|
-
}): ColumnFactory<T, 'jsonb', TNotNull extends true ? true : false, false>;
|
|
431
|
-
uuidArray<TNotNull extends boolean = false>(opts?: {
|
|
432
|
-
notNull?: TNotNull;
|
|
433
|
-
pgName?: string;
|
|
434
|
-
}): ColumnFactory<string[], 'uuidArray', TNotNull extends true ? true : false, false>;
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* Column builder namespace — overloaded interface applied via single
|
|
438
|
-
* assertion. Each builder's implementation returns `makeFactory(...)` with
|
|
439
|
-
* widened boolean params; the `ColumnBuilders` overloads narrow them for
|
|
440
|
-
* callers based on whether `default`/`primaryKey` etc. are present.
|
|
441
|
-
*/
|
|
442
|
-
declare const column: ColumnBuilders;
|
|
443
|
-
//#endregion
|
|
444
355
|
//#region src/table/client.d.ts
|
|
445
356
|
/**
|
|
446
357
|
* Default page size for `findMany` when no `limit` is supplied.
|
|
@@ -589,6 +500,32 @@ declare class TableClient<TCols extends Record<string, ColumnFactory>, TTable ex
|
|
|
589
500
|
* `.returning()`.
|
|
590
501
|
*/
|
|
591
502
|
private get _selectTable();
|
|
503
|
+
/**
|
|
504
|
+
* Look up a Drizzle column by its JS property name, throwing
|
|
505
|
+
* `TableClientError` with the supplied `context` if no such column exists.
|
|
506
|
+
* Wraps `getTableColumns(this.table)` — uses Drizzle's typed column map
|
|
507
|
+
* instead of an indexed cast on the table object.
|
|
508
|
+
*/
|
|
509
|
+
private getColumnOrThrow;
|
|
510
|
+
/**
|
|
511
|
+
* Build an array of ORDER BY SQL expressions from an `OrderBySpec[]`.
|
|
512
|
+
* Used by `findMany`, `distinct`, `claim`, and `aggregate`.
|
|
513
|
+
*/
|
|
514
|
+
private buildOrderBy;
|
|
515
|
+
/**
|
|
516
|
+
* Throw `TableClientError` if the where clause has no top-level keys.
|
|
517
|
+
* Used by every method that mutates or reads-by-key (`update`, `delete`,
|
|
518
|
+
* `findOne`, `exists`, `claim`, ...) — none of them have a sane
|
|
519
|
+
* "everything" path, so empty wheres are always a caller mistake.
|
|
520
|
+
*/
|
|
521
|
+
private requireNonEmptyWhere;
|
|
522
|
+
/**
|
|
523
|
+
* Verify every key in `patch` names a real column on this table. Used by
|
|
524
|
+
* `update`, `updateMany`, `upsert`, and `claim` so a typo'd or hostile
|
|
525
|
+
* patch key surfaces a clear error instead of being silently dropped by
|
|
526
|
+
* Drizzle's set logic.
|
|
527
|
+
*/
|
|
528
|
+
private validateColumnKeys;
|
|
592
529
|
/**
|
|
593
530
|
* Find a single row matching the given where clause, or `null` if no row
|
|
594
531
|
* matches. Throws if the where is empty.
|
|
@@ -842,6 +779,113 @@ declare class TableClient<TCols extends Record<string, ColumnFactory>, TTable ex
|
|
|
842
779
|
private validateLimit;
|
|
843
780
|
}
|
|
844
781
|
//#endregion
|
|
782
|
+
//#region src/table/columns.d.ts
|
|
783
|
+
/**
|
|
784
|
+
* Type interface for the `column` builder namespace.
|
|
785
|
+
*
|
|
786
|
+
* Overloads discriminate on whether `default` is present, so
|
|
787
|
+
* `THasDefault` is inferred correctly:
|
|
788
|
+
*
|
|
789
|
+
* - `column.varchar({ length: 20, default: 'x' })` → `hasDefault = true`
|
|
790
|
+
* - `column.varchar({ length: 20 })` → `hasDefault = false`
|
|
791
|
+
*
|
|
792
|
+
* Object-literal methods don't support overloads in TypeScript, so we
|
|
793
|
+
* declare the overloaded signatures on an interface and cast the
|
|
794
|
+
* implementation object.
|
|
795
|
+
*/
|
|
796
|
+
interface ColumnBuilders {
|
|
797
|
+
uuid<TPrimaryKey extends boolean = false, TNotNull extends boolean = false, THasDefault extends boolean = false>(opts?: {
|
|
798
|
+
primaryKey?: TPrimaryKey;
|
|
799
|
+
notNull?: TNotNull;
|
|
800
|
+
defaultRandom?: THasDefault;
|
|
801
|
+
pgName?: string;
|
|
802
|
+
}): ColumnFactory<string, 'uuid', TPrimaryKey extends true ? true : TNotNull extends true ? true : false, TPrimaryKey extends true ? true : THasDefault extends true ? true : false>;
|
|
803
|
+
varchar<TNotNull extends boolean = false>(opts: {
|
|
804
|
+
length: number;
|
|
805
|
+
notNull?: TNotNull;
|
|
806
|
+
default: string;
|
|
807
|
+
pgName?: string;
|
|
808
|
+
}): ColumnFactory<string, 'varchar', TNotNull extends true ? true : false, true>;
|
|
809
|
+
varchar<TNotNull extends boolean = false>(opts: {
|
|
810
|
+
length: number;
|
|
811
|
+
notNull?: TNotNull;
|
|
812
|
+
pgName?: string;
|
|
813
|
+
}): ColumnFactory<string, 'varchar', TNotNull extends true ? true : false, false>;
|
|
814
|
+
text<TNotNull extends boolean = false>(opts: {
|
|
815
|
+
notNull?: TNotNull;
|
|
816
|
+
default: string;
|
|
817
|
+
pgName?: string;
|
|
818
|
+
}): ColumnFactory<string, 'text', TNotNull extends true ? true : false, true>;
|
|
819
|
+
text<TNotNull extends boolean = false>(opts?: {
|
|
820
|
+
notNull?: TNotNull;
|
|
821
|
+
pgName?: string;
|
|
822
|
+
}): ColumnFactory<string, 'text', TNotNull extends true ? true : false, false>;
|
|
823
|
+
integer<TNotNull extends boolean = false>(opts: {
|
|
824
|
+
notNull?: TNotNull;
|
|
825
|
+
default: number;
|
|
826
|
+
pgName?: string;
|
|
827
|
+
}): ColumnFactory<number, 'integer', TNotNull extends true ? true : false, true>;
|
|
828
|
+
integer<TNotNull extends boolean = false>(opts?: {
|
|
829
|
+
notNull?: TNotNull;
|
|
830
|
+
pgName?: string;
|
|
831
|
+
}): ColumnFactory<number, 'integer', TNotNull extends true ? true : false, false>;
|
|
832
|
+
bigint<TMode extends 'number' | 'bigint' = 'number', TNotNull extends boolean = false>(opts: {
|
|
833
|
+
mode?: TMode;
|
|
834
|
+
notNull?: TNotNull;
|
|
835
|
+
default: TMode extends 'bigint' ? bigint : number;
|
|
836
|
+
pgName?: string;
|
|
837
|
+
}): ColumnFactory<TMode extends 'bigint' ? bigint : number, 'bigint', TNotNull extends true ? true : false, true>;
|
|
838
|
+
bigint<TMode extends 'number' | 'bigint' = 'number', TNotNull extends boolean = false>(opts?: {
|
|
839
|
+
mode?: TMode;
|
|
840
|
+
notNull?: TNotNull;
|
|
841
|
+
pgName?: string;
|
|
842
|
+
}): ColumnFactory<TMode extends 'bigint' ? bigint : number, 'bigint', TNotNull extends true ? true : false, false>;
|
|
843
|
+
double<TNotNull extends boolean = false>(opts: {
|
|
844
|
+
notNull?: TNotNull;
|
|
845
|
+
default: number;
|
|
846
|
+
pgName?: string;
|
|
847
|
+
}): ColumnFactory<number, 'double', TNotNull extends true ? true : false, true>;
|
|
848
|
+
double<TNotNull extends boolean = false>(opts?: {
|
|
849
|
+
notNull?: TNotNull;
|
|
850
|
+
pgName?: string;
|
|
851
|
+
}): ColumnFactory<number, 'double', TNotNull extends true ? true : false, false>;
|
|
852
|
+
boolean<TNotNull extends boolean = false>(opts: {
|
|
853
|
+
notNull?: TNotNull;
|
|
854
|
+
default: boolean;
|
|
855
|
+
pgName?: string;
|
|
856
|
+
}): ColumnFactory<boolean, 'boolean', TNotNull extends true ? true : false, true>;
|
|
857
|
+
boolean<TNotNull extends boolean = false>(opts?: {
|
|
858
|
+
notNull?: TNotNull;
|
|
859
|
+
pgName?: string;
|
|
860
|
+
}): ColumnFactory<boolean, 'boolean', TNotNull extends true ? true : false, false>;
|
|
861
|
+
timestamp<TNotNull extends boolean = false, THasDefault extends boolean = false>(opts?: {
|
|
862
|
+
notNull?: TNotNull;
|
|
863
|
+
defaultNow?: THasDefault;
|
|
864
|
+
withTimezone?: boolean;
|
|
865
|
+
pgName?: string;
|
|
866
|
+
}): ColumnFactory<Date, 'timestamp', TNotNull extends true ? true : false, THasDefault extends true ? true : false>;
|
|
867
|
+
jsonb<T = unknown, TNotNull extends boolean = false>(opts: {
|
|
868
|
+
notNull?: TNotNull;
|
|
869
|
+
default: T;
|
|
870
|
+
pgName?: string;
|
|
871
|
+
}): ColumnFactory<T, 'jsonb', TNotNull extends true ? true : false, true>;
|
|
872
|
+
jsonb<T = unknown, TNotNull extends boolean = false>(opts?: {
|
|
873
|
+
notNull?: TNotNull;
|
|
874
|
+
pgName?: string;
|
|
875
|
+
}): ColumnFactory<T, 'jsonb', TNotNull extends true ? true : false, false>;
|
|
876
|
+
uuidArray<TNotNull extends boolean = false>(opts?: {
|
|
877
|
+
notNull?: TNotNull;
|
|
878
|
+
pgName?: string;
|
|
879
|
+
}): ColumnFactory<string[], 'uuidArray', TNotNull extends true ? true : false, false>;
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Column builder namespace — overloaded interface applied via single
|
|
883
|
+
* assertion. Each builder's implementation returns `makeFactory(...)` with
|
|
884
|
+
* widened boolean params; the `ColumnBuilders` overloads narrow them for
|
|
885
|
+
* callers based on whether `default`/`primaryKey` etc. are present.
|
|
886
|
+
*/
|
|
887
|
+
declare const column: ColumnBuilders;
|
|
888
|
+
//#endregion
|
|
845
889
|
//#region src/table/define.d.ts
|
|
846
890
|
/**
|
|
847
891
|
* The result of `defineTable()`.
|
|
@@ -996,11 +1040,6 @@ declare class TableRegistryImpl {
|
|
|
996
1040
|
* consistent view of all defined tables across packages.
|
|
997
1041
|
*/
|
|
998
1042
|
declare const tableRegistry: TableRegistryImpl;
|
|
999
|
-
/**
|
|
1000
|
-
* Create an isolated registry — useful for unit tests that want to
|
|
1001
|
-
* verify registration behaviour without polluting the global registry.
|
|
1002
|
-
*/
|
|
1003
|
-
declare function createTableRegistry(): TableRegistryImpl;
|
|
1004
1043
|
//#endregion
|
|
1005
1044
|
//#region src/table/where-builder.d.ts
|
|
1006
1045
|
/**
|
|
@@ -1022,5 +1061,5 @@ declare class WhereBuilderError extends Error {
|
|
|
1022
1061
|
*/
|
|
1023
1062
|
declare function isNonEmptyWhere(clause: unknown): boolean;
|
|
1024
1063
|
//#endregion
|
|
1025
|
-
export { type AnyPgColumn, type ClaimOptions, type ColumnFactory, type ColumnKind, type ColumnOperators, type ColumnValue, DEFAULT_LIMIT, type DbConfig, type DefinedTable, type FindManyOptions, type IndexDefinition, type InsertRow, MAX_BATCH, MAX_LIMIT, type MigrateArgs, type MigrationLoader, type MigrationModule, type MigrationSource, type MigrationStatus, type OrderBySpec, type Row, type SchemaRegistry, TableClient, TableClientError, type TableDefinition, type UniqueDefinition, WhereBuilderError, type WhereClause, column, createDbClient, createReadOnlyClient,
|
|
1064
|
+
export { type AnyPgColumn, type ClaimOptions, type ColumnFactory, type ColumnKind, type ColumnOperators, type ColumnValue, DEFAULT_LIMIT, type DbConfig, type DefinedTable, type FindManyOptions, type IndexDefinition, type InsertRow, MAX_BATCH, MAX_LIMIT, type MigrateArgs, type MigrationLoader, type MigrationModule, type MigrationSource, type MigrationStatus, type OrderBySpec, type QueryStats, type Row, type SchemaRegistry, TableClient, TableClientError, type TableDefinition, type UniqueDefinition, WhereBuilderError, type WhereClause, column, createDbClient, createReadOnlyClient, defineTable, getMigrationStatus, getQueryStats, isNonEmptyWhere, isQueryCounterEnabled, queryCountingLogger, rollbackMigrations, runMigrations, runWithQueryStats, schemaRegistry, tableRegistry };
|
|
1026
1065
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/client.ts","../src/migrate.ts","../src/schema-registry.ts","../src/table/types.ts","../src/table/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/client.ts","../src/migrate.ts","../src/query-counter.ts","../src/schema-registry.ts","../src/table/types.ts","../src/table/client.ts","../src/table/columns.ts","../src/table/define.ts","../src/table/registry.ts","../src/table/where-builder.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{drizzle as e}from"drizzle-orm/postgres-js";import t from"postgres";import{
|
|
1
|
+
import{drizzle as e}from"drizzle-orm/postgres-js";import t from"postgres";import{AsyncLocalStorage as n}from"node:async_hooks";import{readdir as r}from"node:fs/promises";import{join as i}from"node:path";import{and as a,count as o,eq as s,getTableColumns as c,getTableName as l,gt as u,gte as ee,ilike as d,inArray as f,isNotNull as p,isNull as m,lt as te,lte as ne,ne as re,not as ie,notInArray as ae,or as oe,sql as h}from"drizzle-orm";import{bigint as se,boolean as ce,doublePrecision as g,index as le,integer as _,jsonb as v,pgTable as y,primaryKey as ue,real as de,text as b,timestamp as x,unique as S,uuid as C,varchar as w}from"drizzle-orm/pg-core";const T=new n;function fe(){return T.getStore()}function pe(e){let t={count:0};return T.run(t,()=>e(t))}const E=new class{logQuery(e,t){let n=T.getStore();n&&n.count++}};function D(){return process.env.LUMI_DB_QUERY_COUNTER===`1`}function O(){return D()?{logger:E}:void 0}function k(n){let r=t(n.url,{max:n.poolMax||10,idle_timeout:20,max_lifetime:1800}),i=O();return i?e(r,i):e(r)}function A(n){let r=t(n.readOnlyUrl||n.url,{max:n.poolMax||10,idle_timeout:20,max_lifetime:1800,connection:{application_name:`toolkit_readonly`,default_transaction_read_only:!0},onnotice:()=>{}}),i=O();return i?e(r,i):e(r)}async function j(e){try{return(await r(e)).filter(e=>e.endsWith(`.ts`))}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function M(e){await e.execute(h`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS _toolkit_migrations (
|
|
3
3
|
id SERIAL PRIMARY KEY,
|
|
4
4
|
namespace VARCHAR(50) NOT NULL,
|
|
@@ -6,15 +6,15 @@ import{drizzle as e}from"drizzle-orm/postgres-js";import t from"postgres";import
|
|
|
6
6
|
applied_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
7
7
|
UNIQUE(namespace, name)
|
|
8
8
|
)
|
|
9
|
-
`)}async function
|
|
9
|
+
`)}async function N(e){let t=i(e,`migrations`),n=i(t,`.toolkit`),[r,a]=await Promise.all([j(n),j(t)]),o=r.map(e=>({path:i(n,e),namespace:`toolkit`,name:e})).sort((e,t)=>e.name.localeCompare(t.name)),s=a.filter(e=>e!==`.toolkit`).map(e=>({path:i(t,e),namespace:`project`,name:e})).sort((e,t)=>e.name.localeCompare(t.name));return[...o,...s]}async function P(e,t){await M(e);let n=await N(t),r=await e.execute(h`
|
|
10
10
|
SELECT namespace, name FROM _toolkit_migrations
|
|
11
11
|
ORDER BY applied_at ASC
|
|
12
|
-
`),i=new Set(r.map(e=>`${e.namespace}:${e.name}`)),a=[],o=[];for(let e of n)i.has(`${e.namespace}:${e.name}`)?a.push(e):o.push(e);return{applied:a,pending:o}}async function
|
|
12
|
+
`),i=new Set(r.map(e=>`${e.namespace}:${e.name}`)),a=[],o=[];for(let e of n)i.has(`${e.namespace}:${e.name}`)?a.push(e):o.push(e);return{applied:a,pending:o}}async function F(e,t,n){await M(e);let{pending:r}=await P(e,t);if(r.length===0){console.log(`No pending migrations`);return}console.log(`Running ${r.length} pending migration${r.length===1?``:`s`}...`);for(let t of r){console.log(` Applying ${t.namespace}/${t.name}...`);let r=await n(t.path);if(typeof r.up!=`function`)throw Error(`Migration ${t.namespace}/${t.name} has no \`up\` export. Every migration file must export an async \`up({ db })\` function.`);try{await e.transaction(async e=>{await r.up({db:e}),await e.execute(h`
|
|
13
13
|
INSERT INTO _toolkit_migrations (namespace, name)
|
|
14
14
|
VALUES (${t.namespace}, ${t.name})
|
|
15
|
-
`)}),console.log(` ✓ Applied ${t.namespace}/${t.name}`)}catch(e){throw console.error(` ✗ Failed to apply ${t.namespace}/${t.name}:`,e),e}}console.log(`Successfully applied ${r.length} migration${r.length===1?``:`s`}`)}async function
|
|
15
|
+
`)}),console.log(` ✓ Applied ${t.namespace}/${t.name}`)}catch(e){throw console.error(` ✗ Failed to apply ${t.namespace}/${t.name}:`,e),e}}console.log(`Successfully applied ${r.length} migration${r.length===1?``:`s`}`)}async function I(e,t,n,r=1){await M(e);let{applied:i}=await P(e,t);if(i.length===0){console.log(`No applied migrations to roll back`);return}let a=i.slice(-r).reverse(),o=await Promise.all(a.map(async e=>({meta:e,mod:await n(e.path)})));for(let{meta:e,mod:t}of o)if(typeof t.down!=`function`)throw Error(`Migration ${e.namespace}/${e.name} has no \`down\` export — cannot roll back. Add an async \`down({ db })\` function to the migration file.`);for(let{meta:t,mod:n}of o){console.log(` Rolling back ${t.namespace}/${t.name}...`);try{await e.transaction(async e=>{await n.down({db:e}),await e.execute(h`
|
|
16
16
|
DELETE FROM _toolkit_migrations
|
|
17
17
|
WHERE namespace = ${t.namespace} AND name = ${t.name}
|
|
18
|
-
`)}),console.log(` ✓ Rolled back ${t.namespace}/${t.name}`)}catch(e){throw console.error(` ✗ Failed to roll back ${t.namespace}/${t.name}:`,e),e}}console.log(`Successfully rolled back ${o.length} migration${o.length===1?``:`s`}`)}var N=class{schemas=new Map;register(e,t){this.schemas.set(e,t)}get(e){return this.schemas.get(e)}all(){let e={};for(let[t,n]of this.schemas.entries())e[t]=n;return e}has(e){return this.schemas.has(e)}};const P=new N;function F(){return new N}function I(e,t){let n=e;return Object.defineProperty(n,`__kind`,{value:t.kind,enumerable:!1}),Object.defineProperty(n,`__notNull`,{value:t.notNull,enumerable:!1}),Object.defineProperty(n,`__hasDefault`,{value:t.hasDefault,enumerable:!1}),Object.defineProperty(n,`__type`,{value:void 0,enumerable:!1}),t.pgName&&Object.defineProperty(n,`__pgName`,{value:t.pgName,enumerable:!1}),t.primaryKey&&Object.defineProperty(n,`__primaryKey`,{value:!0,enumerable:!1}),n}const L={uuid(e){let t=e?.notNull??!1,n=e?.defaultRandom??!1,r=e?.primaryKey??!1;return I(n=>{let i=T(n);return r&&(i=i.primaryKey()),e?.defaultRandom&&(i=i.defaultRandom()),t&&!r&&(i=i.notNull()),i},{kind:`uuid`,notNull:t||r,hasDefault:n||r,pgName:e?.pgName,primaryKey:r||void 0})},varchar(e){if(!Number.isInteger(e.length)||e.length<1||e.length>1073741823)throw Error(`column.varchar: length must be an integer between 1 and 1073741823, got ${e.length}`);let t=e.notNull??!1;return I(n=>{let r=E(n,{length:e.length});return t&&(r=r.notNull()),e.default!==void 0&&(r=r.default(e.default)),r},{kind:`varchar`,notNull:t,hasDefault:e.default!==void 0,pgName:e.pgName})},text(e){let t=e?.notNull??!1;return I(n=>{let r=se(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`text`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},integer(e){let t=e?.notNull??!1;return I(n=>{let r=S(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`integer`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},bigint(e){let t=e?.mode??`number`,n=e?.notNull??!1;return I(r=>{let i=ie(r,{mode:t});return n&&(i=i.notNull()),e?.default!==void 0&&(i=i.default(e.default)),i},{kind:`bigint`,notNull:n,hasDefault:e?.default!==void 0,pgName:e?.pgName})},double(e){let t=e?.notNull??!1;return I(n=>{let r=b(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`double`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},boolean(e){let t=e?.notNull??!1;return I(n=>{let r=y(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`boolean`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},timestamp(e){let t=e?.notNull??!1,n=e?.defaultNow??!1,r=e?.withTimezone??!0;return I(n=>{let i=ce(n,{withTimezone:r});return t&&(i=i.notNull()),e?.defaultNow&&(i=i.defaultNow()),i},{kind:`timestamp`,notNull:t,hasDefault:n,pgName:e?.pgName})},jsonb(e){let t=e?.notNull??!1;return I(n=>{let r=C(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`jsonb`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},uuidArray(e){let t=e?.notNull??!1;return I(e=>{let n=T(e).array();return t&&(n=n.notNull()),n},{kind:`uuidArray`,notNull:t,hasDefault:!1,pgName:e?.pgName})}},R=/^[a-zA-Z_][a-zA-Z0-9_-]*$|^\d+$/,z=new Set([`$and`,`$or`,`$not`]),B=new Set([`eq`,`ne`,`in`,`notIn`,`gt`,`gte`,`lt`,`lte`,`isNull`,`isNotNull`,`ilike`,`startsWith`]);var V=class extends Error{constructor(e){super(`WhereBuilder: ${e}`),this.name=`WhereBuilderError`}};function H(e){return e.replace(/[\\%_]/g,`\\$&`)}function U(e,t,n){if(!n.includes(`.`)){let t=e[n];if(!t)throw new V(`unknown column "${n}"`);return t}let[r,...i]=n.split(`.`);if(!r||i.length===0)throw new V(`malformed dotted key "${n}"`);let a=t[r];if(!a)throw new V(`unknown column "${r}" in dotted key "${n}"`);if(a!==`jsonb`)throw new V(`dotted-path access is only supported on jsonb columns, but "${r}" is ${a}`);for(let e of i)if(!R.test(e))throw new V(`invalid jsonb path segment "${e}" — must match [a-zA-Z_][a-zA-Z0-9_-]* or be a non-negative integer`);let o=e[r];if(!o)throw new V(`unknown column "${r}"`);let s=v`${o}`;for(let e=0;e<i.length;e++){let t=i[e],n=e===i.length-1;if(/^\d+$/.test(t)){if(t.length>10)throw new V(`jsonb path index "${t}" is too large`);let e=v.raw(t);s=n?v`${s}->>${e}`:v`${s}->${e}`}else s=n?v`${s}->>${t}`:v`${s}->${t}`}return s}function de(e,t){if(t===null)return m(e);if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`||typeof t==`bigint`||t instanceof Date)return s(e,t);if(Array.isArray(t))throw new V(`arrays must be wrapped in an operator (e.g. { in: [...] }) — bare arrays are not allowed`);if(typeof t!=`object`)throw new V(`unsupported value type: ${typeof t}`);let n=t,r=Object.keys(n);if(r.length===0)throw new V(`empty operator object`);let i=[];for(let t of r){if(!B.has(t))throw new V(`unknown operator "${t}"`);let r=n[t];switch(t){case`eq`:i.push(s(e,r));break;case`ne`:i.push(re(e,r));break;case`in`:if(!Array.isArray(r))throw new V(`"in" operator requires an array`);r.length===0?i.push(v`false`):i.push(f(e,r));break;case`notIn`:if(!Array.isArray(r))throw new V(`"notIn" operator requires an array`);r.length===0?i.push(v`true`):i.push(g(e,r));break;case`gt`:i.push(u(e,r));break;case`gte`:i.push(ee(e,r));break;case`lt`:i.push(te(e,r));break;case`lte`:i.push(ne(e,r));break;case`isNull`:if(r!==!0)throw new V('"isNull" operator must be `true`');i.push(m(e));break;case`isNotNull`:if(r!==!0)throw new V('"isNotNull" operator must be `true`');i.push(p(e));break;case`ilike`:if(typeof r!=`string`)throw new V(`"ilike" operator requires a string`);i.push(d(e,`%${H(r)}%`));break;case`startsWith`:if(typeof r!=`string`)throw new V(`"startsWith" operator requires a string`);i.push(d(e,`${H(r)}%`));break}}if(i.length!==0)return i.length===1?i[0]:a(...i)}function W(e,t,n,r=0){if(!n)return;if(typeof n!=`object`||Array.isArray(n))throw new V(`where clause must be a plain object`);if(r>16)throw new V(`where clause exceeds maximum nesting depth of 16 — real queries should not need this much nesting; if yours does, reconsider whether it should be expressed differently`);let i=[];for(let o of Object.keys(n)){let s=n[o];if(o===`$and`){if(!Array.isArray(s))throw new V(`$and must be an array`);if(s.length===0)throw new V(`$and must contain at least one clause`);let n=s.map(n=>W(e,t,n,r+1)).filter(e=>e!==void 0);n.length>0&&i.push(a(...n));continue}if(o===`$or`){if(!Array.isArray(s))throw new V(`$or must be an array`);if(s.length===0)throw new V(`$or must contain at least one clause`);let n=s.map(n=>W(e,t,n,r+1)).filter(e=>e!==void 0);n.length>0&&i.push(_(...n));continue}if(o===`$not`){if(!G(s))throw new V(`$not must contain a non-empty clause`);let n=W(e,t,s,r+1);n&&i.push(h(n));continue}if(z.has(o))continue;let c=de(U(e,t,o),s);c&&i.push(c)}if(i.length!==0)return i.length===1?i[0]:a(...i)}function G(e){return typeof e!=`object`||!e||Array.isArray(e)?!1:Object.keys(e).length>0}const K=w(`pg_class`,{relname:E(`relname`,{length:63}).notNull(),reltuples:oe(`reltuples`).notNull()}),fe=100,q=1e3,J=1e3;var Y=class extends Error{constructor(e){super(`TableClient: ${e}`),this.name=`TableClientError`}},X=class e{constructor(e,t,n,r=[]){this.table=e,this.columnKinds=t,this.db=n,this.primaryKeyColumns=r}get _selectTable(){return this.table}async findOne(e){if(!G(e))throw new Y(`findOne requires a non-empty where clause`);let t=this.buildWhereOrThrow(e);return(await this.db.select().from(this._selectTable).where(t).limit(1))[0]??null}async findMany(e={}){let t=this.validateLimit(e.limit);if(e.offset!==void 0&&(!Number.isInteger(e.offset)||e.offset<0))throw new Y(`offset must be a non-negative integer, got ${e.offset}`);let n=e.orderBy&&e.orderBy.length>0?e.orderBy.map(e=>{let t=this.table[e.column];if(!t)throw new Y(`unknown orderBy column "${e.column}"`);return e.dir===`desc`?v`${t} DESC`:v`${t} ASC`}):void 0,r=e.where?this.buildWhereOrThrow(e.where):void 0,i=this.db.select().from(this._selectTable).$dynamic();return r&&(i=i.where(r)),n&&(i=i.orderBy(...n)),i=i.limit(t),e.offset!==void 0&&(i=i.offset(e.offset)),await i}async count(e){let t=e?this.buildWhereOrThrow(e):void 0,n=this.db.select({value:o()}).from(this._selectTable).$dynamic();t&&(n=n.where(t));let r=await n;return Number(r[0]?.value??0)}async exists(e){if(!G(e))throw new Y(`exists requires a non-empty where clause`);let t=this.buildWhereOrThrow(e);return(await this.db.select({one:v`1`}).from(this._selectTable).where(t).limit(1)).length>0}async distinct(e,t){let n=this.table[e];if(!n)throw new Y(`distinct: unknown column "${e}"`);let r=[];if(t?.includeNull||r.push(p(n)),t?.where){let e=this.buildWhereOrThrow(t.where);r.push(e)}let i=this.db.selectDistinct({value:n}).from(this._selectTable).$dynamic();if(r.length===1?i=i.where(r[0]):r.length>1&&(i=i.where(a(...r))),t?.orderBy){let e=t.orderBy===`desc`?v`${n} DESC`:v`${n} ASC`;i=i.orderBy(e)}return(await i).map(e=>e.value)}async insert(e){return(await this.db.insert(this.table).values(e).returning())[0]}async upsert(e,t){let n=Array.isArray(t.target)?t.target:[t.target];if(n.length===0)throw new Y(`upsert requires at least one target column`);let r=c(this.table),i=n.map(e=>{let t=r[e];if(!t)throw new Y(`upsert target references unknown column "${e}"`);return t}),a=t.set??e,o=t.setWhere&&G(t.setWhere)?this.buildWhereOrThrow(t.setWhere):void 0,s=await this.db.insert(this.table).values(e).onConflictDoUpdate({target:i,set:a,...o?{setWhere:o}:{}}).returning();if(s.length>0)return s[0];let l={};for(let t of n)l[t]=e[t];let u=await this.findOne(l);if(!u)throw new Y(`upsert with setWhere: conflict row not found after blocked update — this should not happen`);return u}async insertMany(e){if(!Array.isArray(e))throw new Y(`insertMany requires an array of rows`);if(e.length===0)return[];if(e.length>1e3)throw new Y(`insertMany batch too large: ${e.length} > ${J}`);return await this.db.insert(this.table).values(e).returning()}async update(e,t){if(!G(e))throw new Y(`update requires a non-empty where clause`);let n=this.buildWhereOrThrow(e),r=await this.db.update(this.table).set(t).where(n).returning();if(r.length>1)throw new Y(`update matched ${r.length} rows but is expected to match at most one — use updateMany for bulk updates. WARNING: the update has already been applied; wrap in a transaction if you need rollback.`);return r[0]??null}async updateMany(e,t){if(!G(e))throw new Y(`updateMany requires a non-empty where clause`);let n=this.buildWhereOrThrow(e);return await this.db.update(this.table).set(t).where(n).returning()}async delete(e){if(!G(e))throw new Y(`delete requires a non-empty where clause`);let t=this.buildWhereOrThrow(e),n=await this.db.delete(this.table).where(t).returning();if(n.length>1)throw new Y(`delete matched ${n.length} rows but is expected to match at most one — use deleteMany for bulk deletes. WARNING: the delete has already been applied; wrap in a transaction if you need rollback.`);return n[0]??null}async deleteMany(e){if(!G(e))throw new Y(`deleteMany requires a non-empty where clause`);let t=this.buildWhereOrThrow(e);return await this.db.delete(this.table).where(t).returning()}async transaction(t){return await this.db.transaction(async n=>await t(new e(this.table,this.columnKinds,n,this.primaryKeyColumns)))}async claim(e){if(this.primaryKeyColumns.length===0)throw new Y(`claim() requires the table to have a primary key — declare primaryKey in defineTable() or use column.uuid({ primaryKey: true })`);if(this.primaryKeyColumns.length>1)throw new Y(`claim() does not support composite primary keys — use a single-column primary key or call transaction() with FOR UPDATE directly`);if(!G(e.where))throw new Y(`claim requires a non-empty where clause`);if(!Number.isInteger(e.limit)||e.limit<1)throw new Y(`claim limit must be a positive integer, got ${e.limit}`);if(e.limit>1e3)throw new Y(`claim limit ${e.limit} exceeds MAX_LIMIT ${q}`);let t=Object.keys(e.set??{}),n=Object.keys(e.setSql??{});if(t.length===0&&n.length===0)throw new Y(`claim requires at least one field in set or setSql`);for(let e of t)if(!this.table[e])throw new Y(`claim set: unknown column "${e}"`);for(let e of n)if(!this.table[e])throw new Y(`claim setSql: unknown column "${e}"`);let r=this.buildWhereOrThrow(e.where),i=e.orderBy&&e.orderBy.length>0?e.orderBy.map(e=>{let t=this.table[e.column];if(!t)throw new Y(`claim: unknown orderBy column "${e.column}"`);return e.dir===`desc`?v`${t} DESC`:v`${t} ASC`}):void 0,a=this.primaryKeyColumns[0],o=this.table[a];return await this.db.transaction(async t=>{let n=t.select({_pk:o}).from(this._selectTable).where(r).limit(e.limit).for(`update`,{skipLocked:!0}).$dynamic();i&&(n=n.orderBy(...i));let a=await n;if(a.length===0)return[];let s=a.map(e=>e._pk),c={...e.set??{}};if(e.setSql)for(let[t,n]of Object.entries(e.setSql))c[t]=n;return await t.update(this.table).set(c).where(f(o,s)).returning()})}async aggregate(e){let t=Object.entries(e.select);if(t.length===0)throw new Y(`aggregate requires at least one select field`);let n=c(this.table),r={};if(e.groupBy)for(let t of e.groupBy){let e=n[t];if(!e)throw new Y(`aggregate groupBy: unknown column "${t}"`);r[t]=e}for(let[e,i]of t)r[e]=this.buildAggregateExpr(i,n);let i=this.db.select(r).from(this._selectTable).$dynamic();if(e.where){let t=this.buildWhereOrThrow(e.where);i=i.where(t)}if(e.groupBy&&e.groupBy.length>0){let t=e.groupBy.map(e=>{let t=n[e];if(!t)throw new Y(`aggregate groupBy: unknown column "${e}"`);return t});i=i.groupBy(...t)}if(e.orderBy&&e.orderBy.length>0){let t=e.orderBy.map(e=>{let t=this.table[e.column];if(!t)throw new Y(`aggregate orderBy: unknown column "${e.column}"`);return e.dir===`desc`?v`${t} DESC`:v`${t} ASC`});i=i.orderBy(...t)}if(e.limit!==void 0){let t=this.validateLimit(e.limit);i=i.limit(t)}return await i}async countEstimate(){let e=l(this.table),[t]=await this.db.select({estimate:v`greatest(${K.reltuples}::bigint, 0)`}).from(K).where(s(K.relname,e)).limit(1);return t?Number(t.estimate):0}buildAggregateExpr(e,t){if(`column`in e&&e.column){let n=t[e.column];if(!n)throw new Y(`aggregate: unknown column "${String(e.column)}"`);switch(e.fn){case`count`:return v`count(${n})::int`;case`sum`:return v`sum(${n})`;case`avg`:return v`avg(${n})`;case`min`:return v`min(${n})`;case`max`:return v`max(${n})`;default:throw new Y(`aggregate: unknown function "${e.fn}"`)}}if(e.fn===`count`)return v`count(*)::int`;throw new Y(`aggregate: ${e.fn} requires a column`)}buildWhereOrThrow(e){try{let t=W(this.table,this.columnKinds,e);if(!t)throw new Y(`where clause produced no SQL predicate`);return t}catch(e){throw e instanceof V?new Y(e.message.replace(/^WhereBuilder: /,``)):e}}validateLimit(e){if(e===void 0)return 100;if(!Number.isInteger(e)||e<1)throw new Y(`limit must be a positive integer, got ${e}`);if(e>1e3)throw new Y(`limit ${e} exceeds MAX_LIMIT ${q} — paginate or use claim() for batch processing`);return e}},Z=class{byName=new Map;register(e,t,n){let r=this.byName.get(e);if(r){if(r.table===t||r.source&&n&&r.source===n)return;throw Error(`tableRegistry: a different table is already registered under name "${e}". Did you call defineTable twice? First registered from ${r.source??`<unknown>`}, now from ${n??`<unknown>`}.`)}this.byName.set(e,{name:e,table:t,source:n})}get(e){return this.byName.get(e)?.table}has(e){return this.byName.has(e)}allTables(){let e={};for(let t of this.byName.values())e[t.name]=t.table;return e}clear(){if(process.env.NODE_ENV===`production`)throw Error(`tableRegistry.clear() is not allowed when NODE_ENV=production — this is a test-only utility. If you reached this from production code, you have a bug.`);this.byName.clear()}};const Q=new Z;function pe(){return new Z}const me=/^[a-z][a-z0-9_]*$/;function $(e,t,n){if(e.length>63)throw Error(`defineTable: ${t} "${e}" is ${e.length} characters — Postgres truncates identifiers at 63 chars silently, which can cause name collisions${n?`. ${n}`:``}`)}function he(e){if(!me.test(e.name))throw Error(`defineTable: invalid table name "${e.name}" — must match /^[a-z][a-z0-9_]*$/`);$(e.name,`table name`);let t={},n={};for(let[r,i]of Object.entries(e.columns)){if(typeof i!=`function`)throw Error(`defineTable: column "${r}" is not a column factory — did you call e.g. column.uuid() with parens?`);$(r,`column name in table "${e.name}"`);let a=i.__pgName;a&&$(a,`pgName for column "${r}" in table "${e.name}"`),t[r]=i(a??r),n[r]=i.__kind}let r=new Set(Object.keys(t));if(e.primaryKey!==void 0){let t=Array.isArray(e.primaryKey)?e.primaryKey:[e.primaryKey];for(let e of t)if(!r.has(String(e)))throw Error(`defineTable: primaryKey references unknown column "${String(e)}"`)}if(e.unique)for(let t of e.unique){for(let e of t.on)if(!r.has(String(e)))throw Error(`defineTable: unique constraint references unknown column "${String(e)}"`);$(t.name??`uq_${e.name}_${t.on.map(String).join(`_`)}`,t.name?`unique constraint name`:`auto-generated unique constraint name`,t.name?void 0:"Supply a shorter explicit `name` to the unique definition.")}if(e.indexes)for(let t of e.indexes){for(let e of t.on)if(!r.has(String(e)))throw Error(`defineTable: index references unknown column "${String(e)}"`);$(t.name??`idx_${e.name}_${t.on.map(String).join(`_`)}`,t.name?`index name`:`auto-generated index name`,t.name?void 0:"Supply a shorter explicit `name` to the index definition.")}let i=e.primaryKey!==void 0||e.unique&&e.unique.length>0||e.indexes&&e.indexes.length>0;function a(e,t,n){let r=e[t];if(!r)throw Error(`defineTable: ${n} references unknown column "${t}"`);return r}let o=i?w(e.name,t,t=>{let n=t,r=[];if(e.primaryKey!==void 0){let t=Array.isArray(e.primaryKey)?e.primaryKey:[e.primaryKey],i=a(n,String(t[0]),`primaryKey`),o=t.slice(1).map(e=>a(n,String(e),`primaryKey`));r.push(ae({columns:[i,...o]}))}if(e.unique)for(let t of e.unique){let e=a(n,String(t.on[0]),`unique constraint`),i=t.on.slice(1).map(e=>a(n,String(e),`unique constraint`));r.push(le().on(e,...i))}if(e.indexes)for(let t of e.indexes){let i=a(n,String(t.on[0]),`index`),o=t.on.slice(1).map(e=>a(n,String(e),`index`));r.push(x(t.name??`idx_${e.name}_${t.on.map(String).join(`_`)}`).on(i,...o))}return r}):w(e.name,t),s=ge();Q.register(e.name,o,s);let c=Object.freeze({...n}),l;if(e.primaryKey!==void 0)l=Array.isArray(e.primaryKey)?e.primaryKey.map(String):[String(e.primaryKey)];else{l=[];for(let[t,n]of Object.entries(e.columns))n.__primaryKey&&l.push(t)}let u=Object.freeze([...l]);return{table:o,schema:e,columnKinds:c,primaryKeyColumns:u,makeClient:e=>new X(o,c,e,u)}}function ge(){let e=Error().stack;if(!e)return;let t=e.split(`
|
|
19
|
-
`).slice(1);for(let e of t){if(e.includes(`/table/define.`)||e.includes(`/table/registry.`))continue;let t=e.match(/\(([^)]+)\)/)??e.match(/at (.+)$/);if(t)return t[1].trim()}}export{
|
|
18
|
+
`)}),console.log(` ✓ Rolled back ${t.namespace}/${t.name}`)}catch(e){throw console.error(` ✗ Failed to roll back ${t.namespace}/${t.name}:`,e),e}}console.log(`Successfully rolled back ${o.length} migration${o.length===1?``:`s`}`)}const L=new class{schemas=new Map;register(e,t){this.schemas.set(e,t)}get(e){return this.schemas.get(e)}all(){let e={};for(let[t,n]of this.schemas.entries())e[t]=n;return e}has(e){return this.schemas.has(e)}},R=/^[a-zA-Z_][a-zA-Z0-9_-]*$|^\d+$/,z=new Set([`$and`,`$or`,`$not`]),B=new Set([`eq`,`ne`,`in`,`notIn`,`gt`,`gte`,`lt`,`lte`,`isNull`,`isNotNull`,`ilike`,`startsWith`]);var V=class extends Error{constructor(e){super(`WhereBuilder: ${e}`),this.name=`WhereBuilderError`}};function H(e){return e.replace(/[\\%_]/g,`\\$&`)}function me(e,t,n){let r=c(e);if(!n.includes(`.`)){let e=r[n];if(!e)throw new V(`unknown column "${n}"`);return e}let[i,...a]=n.split(`.`);if(!i||a.length===0)throw new V(`malformed dotted key "${n}"`);let o=t[i];if(!o)throw new V(`unknown column "${i}" in dotted key "${n}"`);if(o!==`jsonb`)throw new V(`dotted-path access is only supported on jsonb columns, but "${i}" is ${o}`);for(let e of a)if(!R.test(e))throw new V(`invalid jsonb path segment "${e}" — must match [a-zA-Z_][a-zA-Z0-9_-]* or be a non-negative integer`);let s=r[i];if(!s)throw new V(`unknown column "${i}"`);let l=h`${s}`;for(let e=0;e<a.length;e++){let t=a[e],n=e===a.length-1;if(/^\d+$/.test(t)){if(t.length>10)throw new V(`jsonb path index "${t}" is too large`);let e=h.raw(t);l=n?h`${l}->>${e}`:h`${l}->${e}`}else l=n?h`${l}->>${t}`:h`${l}->${t}`}return l}function he(e,t){if(t===null)return m(e);if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`||typeof t==`bigint`||t instanceof Date)return s(e,t);if(Array.isArray(t))throw new V(`arrays must be wrapped in an operator (e.g. { in: [...] }) — bare arrays are not allowed`);if(typeof t!=`object`)throw new V(`unsupported value type: ${typeof t}`);let n=t,r=Object.keys(n);if(r.length===0)throw new V(`empty operator object`);let i=[];for(let t of r){if(!B.has(t))throw new V(`unknown operator "${t}"`);let r=n[t];switch(t){case`eq`:i.push(s(e,r));break;case`ne`:i.push(re(e,r));break;case`in`:if(!Array.isArray(r))throw new V(`"in" operator requires an array`);r.length===0?i.push(h`false`):i.push(f(e,r));break;case`notIn`:if(!Array.isArray(r))throw new V(`"notIn" operator requires an array`);r.length===0?i.push(h`true`):i.push(ae(e,r));break;case`gt`:i.push(u(e,r));break;case`gte`:i.push(ee(e,r));break;case`lt`:i.push(te(e,r));break;case`lte`:i.push(ne(e,r));break;case`isNull`:if(r!==!0)throw new V('"isNull" operator must be `true`');i.push(m(e));break;case`isNotNull`:if(r!==!0)throw new V('"isNotNull" operator must be `true`');i.push(p(e));break;case`ilike`:if(typeof r!=`string`)throw new V(`"ilike" operator requires a string`);i.push(d(e,`%${H(r)}%`));break;case`startsWith`:if(typeof r!=`string`)throw new V(`"startsWith" operator requires a string`);i.push(d(e,`${H(r)}%`));break}}if(i.length!==0)return i.length===1?i[0]:a(...i)}function U(e,t,n,r=0){if(!n)return;if(typeof n!=`object`||Array.isArray(n))throw new V(`where clause must be a plain object`);if(r>16)throw new V(`where clause exceeds maximum nesting depth of 16 — real queries should not need this much nesting; if yours does, reconsider whether it should be expressed differently`);let i=[];for(let o of Object.keys(n)){let s=n[o];if(o===`$and`){if(!Array.isArray(s))throw new V(`$and must be an array`);if(s.length===0)throw new V(`$and must contain at least one clause`);let n=s.map(n=>U(e,t,n,r+1)).filter(e=>e!==void 0);n.length>0&&i.push(a(...n));continue}if(o===`$or`){if(!Array.isArray(s))throw new V(`$or must be an array`);if(s.length===0)throw new V(`$or must contain at least one clause`);let n=s.map(n=>U(e,t,n,r+1)).filter(e=>e!==void 0);n.length>0&&i.push(oe(...n));continue}if(o===`$not`){if(!W(s))throw new V(`$not must contain a non-empty clause`);let n=U(e,t,s,r+1);n&&i.push(ie(n));continue}if(z.has(o))continue;let c=he(me(e,t,o),s);c&&i.push(c)}if(i.length!==0)return i.length===1?i[0]:a(...i)}function W(e){return typeof e!=`object`||!e||Array.isArray(e)?!1:Object.keys(e).length>0}const G=/^[a-zA-Z_][a-zA-Z0-9_]*$/,K=y(`pg_class`,{relname:w(`relname`,{length:63}).notNull(),reltuples:de(`reltuples`).notNull()}),ge=100,q=1e3,J=1e3;var Y=class extends Error{constructor(e){super(`TableClient: ${e}`),this.name=`TableClientError`}},X=class e{constructor(e,t,n,r=[]){this.table=e,this.columnKinds=t,this.db=n,this.primaryKeyColumns=r}get _selectTable(){return this.table}getColumnOrThrow(e,t){let n=c(this.table)[e];if(!n)throw new Y(`${t}: unknown column "${e}"`);return n}buildOrderBy(e,t){return e.map(e=>{let n=this.getColumnOrThrow(e.column,`${t}: orderBy`);return e.dir===`desc`?h`${n} DESC`:h`${n} ASC`})}requireNonEmptyWhere(e,t){if(!W(e))throw new Y(`${t} requires a non-empty where clause`)}validateColumnKeys(e,t){if(e.length===0)return;let n=c(this.table);for(let r of e)if(!Object.hasOwn(n,r))throw new Y(`${t}: unknown column "${r}"`)}async findOne(e){this.requireNonEmptyWhere(e,`findOne`);let t=this.buildWhereOrThrow(e);return(await this.db.select().from(this._selectTable).where(t).limit(1))[0]??null}async findMany(e={}){let t=this.validateLimit(e.limit);if(e.offset!==void 0&&(!Number.isInteger(e.offset)||e.offset<0))throw new Y(`offset must be a non-negative integer, got ${e.offset}`);let n=e.orderBy&&e.orderBy.length>0?this.buildOrderBy(e.orderBy,`findMany`):void 0,r=e.where?this.buildWhereOrThrow(e.where):void 0,i=this.db.select().from(this._selectTable).$dynamic();return r&&(i=i.where(r)),n&&(i=i.orderBy(...n)),i=i.limit(t),e.offset!==void 0&&(i=i.offset(e.offset)),await i}async count(e){let t=e?this.buildWhereOrThrow(e):void 0,n=this.db.select({value:o()}).from(this._selectTable).$dynamic();t&&(n=n.where(t));let r=await n;return Number(r[0]?.value??0)}async exists(e){this.requireNonEmptyWhere(e,`exists`);let t=this.buildWhereOrThrow(e);return(await this.db.select({one:h`1`}).from(this._selectTable).where(t).limit(1)).length>0}async distinct(e,t){let n=this.getColumnOrThrow(e,`distinct`),r=[];t?.includeNull||r.push(p(n)),t?.where&&r.push(this.buildWhereOrThrow(t.where));let i=this.db.selectDistinct({value:n}).from(this._selectTable).$dynamic();if(r.length===1?i=i.where(r[0]):r.length>1&&(i=i.where(a(...r))),t?.orderBy){let e=t.orderBy===`desc`?h`${n} DESC`:h`${n} ASC`;i=i.orderBy(e)}return(await i).map(e=>e.value)}async insert(e){return(await this.db.insert(this.table).values(e).returning())[0]}async upsert(e,t){let n=Array.isArray(t.target)?t.target:[t.target];if(n.length===0)throw new Y(`upsert requires at least one target column`);let r=n.map(e=>this.getColumnOrThrow(e,`upsert target`)),i=t.set??e;t.set&&this.validateColumnKeys(Object.keys(t.set),`upsert set`);let a=t.setWhere&&W(t.setWhere)?this.buildWhereOrThrow(t.setWhere):void 0,o=await this.db.insert(this.table).values(e).onConflictDoUpdate({target:r,set:i,...a?{setWhere:a}:{}}).returning();if(o.length>0)return o[0];let s={};for(let t of n)s[t]=e[t];let c=await this.findOne(s);if(!c)throw new Y(`upsert with setWhere: conflict row not found after blocked update — this should not happen`);return c}async insertMany(e){if(!Array.isArray(e))throw new Y(`insertMany requires an array of rows`);if(e.length===0)return[];if(e.length>1e3)throw new Y(`insertMany batch too large: ${e.length} > ${J}`);return await this.db.insert(this.table).values(e).returning()}async update(e,t){this.requireNonEmptyWhere(e,`update`),this.validateColumnKeys(Object.keys(t),`update`);let n=this.buildWhereOrThrow(e),r=await this.db.update(this.table).set(t).where(n).returning();if(r.length>1)throw new Y(`update matched ${r.length} rows but is expected to match at most one — use updateMany for bulk updates. WARNING: the update has already been applied; wrap in a transaction if you need rollback.`);return r[0]??null}async updateMany(e,t){this.requireNonEmptyWhere(e,`updateMany`),this.validateColumnKeys(Object.keys(t),`updateMany`);let n=this.buildWhereOrThrow(e);return await this.db.update(this.table).set(t).where(n).returning()}async delete(e){this.requireNonEmptyWhere(e,`delete`);let t=this.buildWhereOrThrow(e),n=await this.db.delete(this.table).where(t).returning();if(n.length>1)throw new Y(`delete matched ${n.length} rows but is expected to match at most one — use deleteMany for bulk deletes. WARNING: the delete has already been applied; wrap in a transaction if you need rollback.`);return n[0]??null}async deleteMany(e){this.requireNonEmptyWhere(e,`deleteMany`);let t=this.buildWhereOrThrow(e);return await this.db.delete(this.table).where(t).returning()}async transaction(t){return await this.db.transaction(async n=>await t(new e(this.table,this.columnKinds,n,this.primaryKeyColumns)))}async claim(e){if(this.primaryKeyColumns.length===0)throw new Y(`claim() requires the table to have a primary key — declare primaryKey in defineTable() or use column.uuid({ primaryKey: true })`);if(this.primaryKeyColumns.length>1)throw new Y(`claim() does not support composite primary keys — use a single-column primary key or call transaction() with FOR UPDATE directly`);if(this.requireNonEmptyWhere(e.where,`claim`),!Number.isInteger(e.limit)||e.limit<1)throw new Y(`claim limit must be a positive integer, got ${e.limit}`);if(e.limit>1e3)throw new Y(`claim limit ${e.limit} exceeds MAX_LIMIT ${q}`);let t=Object.keys(e.set??{}),n=Object.keys(e.setSql??{});if(t.length===0&&n.length===0)throw new Y(`claim requires at least one field in set or setSql`);this.validateColumnKeys(t,`claim set`),this.validateColumnKeys(n,`claim setSql`);let r=this.buildWhereOrThrow(e.where),i=e.orderBy&&e.orderBy.length>0?this.buildOrderBy(e.orderBy,`claim`):void 0,a=this.primaryKeyColumns[0],o=this.getColumnOrThrow(a,`claim primary key`);return await this.db.transaction(async t=>{let n=t.select({_pk:o}).from(this._selectTable).where(r).limit(e.limit).for(`update`,{skipLocked:!0}).$dynamic();i&&(n=n.orderBy(...i));let a=await n;if(a.length===0)return[];let s=a.map(e=>e._pk),c={...e.set??{}};if(e.setSql)for(let[t,n]of Object.entries(e.setSql))c[t]=n;return await t.update(this.table).set(c).where(f(o,s)).returning()})}async aggregate(e){let t=Object.entries(e.select);if(t.length===0)throw new Y(`aggregate requires at least one select field`);for(let[e]of t)if(!G.test(e))throw new Y(`aggregate: invalid output alias "${e}" — must match ${G.source}`);let n={};if(e.groupBy)for(let t of e.groupBy)n[t]=this.getColumnOrThrow(t,`aggregate groupBy`);for(let[e,r]of t)n[e]=this.buildAggregateExpr(r);let r=this.db.select(n).from(this._selectTable).$dynamic();if(e.where&&(r=r.where(this.buildWhereOrThrow(e.where))),e.groupBy&&e.groupBy.length>0){let t=e.groupBy.map(e=>this.getColumnOrThrow(e,`aggregate groupBy`));r=r.groupBy(...t)}return e.orderBy&&e.orderBy.length>0&&(r=r.orderBy(...this.buildOrderBy(e.orderBy,`aggregate`))),e.limit!==void 0&&(r=r.limit(this.validateLimit(e.limit))),await r}async countEstimate(){let e=l(this.table),[t]=await this.db.select({estimate:h`greatest(${K.reltuples}::bigint, 0)`}).from(K).where(s(K.relname,e)).limit(1);return t?Number(t.estimate):0}buildAggregateExpr(e){if(`column`in e&&e.column){let t=this.getColumnOrThrow(e.column,`aggregate`);switch(e.fn){case`count`:return h`count(${t})::int`;case`sum`:return h`sum(${t})`;case`avg`:return h`avg(${t})`;case`min`:return h`min(${t})`;case`max`:return h`max(${t})`;default:throw new Y(`aggregate: unknown function "${e.fn}"`)}}if(e.fn===`count`)return h`count(*)::int`;throw new Y(`aggregate: ${e.fn} requires a column`)}buildWhereOrThrow(e){try{let t=U(this.table,this.columnKinds,e);if(!t)throw new Y(`where clause produced no SQL predicate`);return t}catch(e){throw e instanceof V?new Y(e.message.replace(/^WhereBuilder: /,``)):e}}validateLimit(e){if(e===void 0)return 100;if(!Number.isInteger(e)||e<1)throw new Y(`limit must be a positive integer, got ${e}`);if(e>1e3)throw new Y(`limit ${e} exceeds MAX_LIMIT ${q} — paginate or use claim() for batch processing`);return e}};function Z(e,t){let n=e;return Object.defineProperty(n,`__kind`,{value:t.kind,enumerable:!1}),Object.defineProperty(n,`__notNull`,{value:t.notNull,enumerable:!1}),Object.defineProperty(n,`__hasDefault`,{value:t.hasDefault,enumerable:!1}),Object.defineProperty(n,`__type`,{value:void 0,enumerable:!1}),t.pgName&&Object.defineProperty(n,`__pgName`,{value:t.pgName,enumerable:!1}),t.primaryKey&&Object.defineProperty(n,`__primaryKey`,{value:!0,enumerable:!1}),n}const _e={uuid(e){let t=e?.notNull??!1,n=e?.defaultRandom??!1,r=e?.primaryKey??!1;return Z(n=>{let i=C(n);return r&&(i=i.primaryKey()),e?.defaultRandom&&(i=i.defaultRandom()),t&&!r&&(i=i.notNull()),i},{kind:`uuid`,notNull:t||r,hasDefault:n||r,pgName:e?.pgName,primaryKey:r||void 0})},varchar(e){if(!Number.isInteger(e.length)||e.length<1||e.length>1073741823)throw Error(`column.varchar: length must be an integer between 1 and 1073741823, got ${e.length}`);let t=e.notNull??!1;return Z(n=>{let r=w(n,{length:e.length});return t&&(r=r.notNull()),e.default!==void 0&&(r=r.default(e.default)),r},{kind:`varchar`,notNull:t,hasDefault:e.default!==void 0,pgName:e.pgName})},text(e){let t=e?.notNull??!1;return Z(n=>{let r=b(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`text`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},integer(e){let t=e?.notNull??!1;return Z(n=>{let r=_(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`integer`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},bigint(e){let t=e?.mode??`number`,n=e?.notNull??!1;return Z(r=>{let i=se(r,{mode:t});return n&&(i=i.notNull()),e?.default!==void 0&&(i=i.default(e.default)),i},{kind:`bigint`,notNull:n,hasDefault:e?.default!==void 0,pgName:e?.pgName})},double(e){let t=e?.notNull??!1;return Z(n=>{let r=g(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`double`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},boolean(e){let t=e?.notNull??!1;return Z(n=>{let r=ce(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`boolean`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},timestamp(e){let t=e?.notNull??!1,n=e?.defaultNow??!1,r=e?.withTimezone??!0;return Z(n=>{let i=x(n,{withTimezone:r});return t&&(i=i.notNull()),e?.defaultNow&&(i=i.defaultNow()),i},{kind:`timestamp`,notNull:t,hasDefault:n,pgName:e?.pgName})},jsonb(e){let t=e?.notNull??!1;return Z(n=>{let r=v(n);return t&&(r=r.notNull()),e?.default!==void 0&&(r=r.default(e.default)),r},{kind:`jsonb`,notNull:t,hasDefault:e?.default!==void 0,pgName:e?.pgName})},uuidArray(e){let t=e?.notNull??!1;return Z(e=>{let n=C(e).array();return t?n.notNull():n},{kind:`uuidArray`,notNull:t,hasDefault:!1,pgName:e?.pgName})}},Q=new class{byName=new Map;register(e,t,n){let r=this.byName.get(e);if(r){if(r.table===t||r.source&&n&&r.source===n)return;throw Error(`tableRegistry: a different table is already registered under name "${e}". Did you call defineTable twice? First registered from ${r.source??`<unknown>`}, now from ${n??`<unknown>`}.`)}this.byName.set(e,{name:e,table:t,source:n})}get(e){return this.byName.get(e)?.table}has(e){return this.byName.has(e)}allTables(){let e={};for(let t of this.byName.values())e[t.name]=t.table;return e}clear(){if(process.env.NODE_ENV===`production`)throw Error(`tableRegistry.clear() is not allowed when NODE_ENV=production — this is a test-only utility. If you reached this from production code, you have a bug.`);this.byName.clear()}},ve=/^[a-z][a-z0-9_]*$/;function $(e,t,n){if(e.length>63)throw Error(`defineTable: ${t} "${e}" is ${e.length} characters — Postgres truncates identifiers at 63 chars silently, which can cause name collisions${n?`. ${n}`:``}`)}function ye(e){if(!ve.test(e.name))throw Error(`defineTable: invalid table name "${e.name}" — must match /^[a-z][a-z0-9_]*$/`);$(e.name,`table name`);let t={},n={};for(let[r,i]of Object.entries(e.columns)){if(typeof i!=`function`)throw Error(`defineTable: column "${r}" is not a column factory — did you call e.g. column.uuid() with parens?`);$(r,`column name in table "${e.name}"`);let a=i.__pgName;a&&$(a,`pgName for column "${r}" in table "${e.name}"`),t[r]=i(a??r),n[r]=i.__kind}let r=new Set(Object.keys(t));if(e.primaryKey!==void 0){let t=Array.isArray(e.primaryKey)?e.primaryKey:[e.primaryKey];for(let e of t)if(!r.has(String(e)))throw Error(`defineTable: primaryKey references unknown column "${String(e)}"`)}if(e.unique)for(let t of e.unique){for(let e of t.on)if(!r.has(String(e)))throw Error(`defineTable: unique constraint references unknown column "${String(e)}"`);$(t.name??`uq_${e.name}_${t.on.map(String).join(`_`)}`,t.name?`unique constraint name`:`auto-generated unique constraint name`,t.name?void 0:"Supply a shorter explicit `name` to the unique definition.")}if(e.indexes)for(let t of e.indexes){for(let e of t.on)if(!r.has(String(e)))throw Error(`defineTable: index references unknown column "${String(e)}"`);$(t.name??`idx_${e.name}_${t.on.map(String).join(`_`)}`,t.name?`index name`:`auto-generated index name`,t.name?void 0:"Supply a shorter explicit `name` to the index definition.")}let i=e.primaryKey!==void 0||e.unique&&e.unique.length>0||e.indexes&&e.indexes.length>0;function a(e,t,n){let r=e[t];if(!r)throw Error(`defineTable: ${n} references unknown column "${t}"`);return r}let o=i?y(e.name,t,t=>{let n=t,r=[];if(e.primaryKey!==void 0){let t=Array.isArray(e.primaryKey)?e.primaryKey:[e.primaryKey],i=a(n,String(t[0]),`primaryKey`),o=t.slice(1).map(e=>a(n,String(e),`primaryKey`));r.push(ue({columns:[i,...o]}))}if(e.unique)for(let t of e.unique){let e=a(n,String(t.on[0]),`unique constraint`),i=t.on.slice(1).map(e=>a(n,String(e),`unique constraint`));r.push(S().on(e,...i))}if(e.indexes)for(let t of e.indexes){let i=a(n,String(t.on[0]),`index`),o=t.on.slice(1).map(e=>a(n,String(e),`index`));r.push(le(t.name??`idx_${e.name}_${t.on.map(String).join(`_`)}`).on(i,...o))}return r}):y(e.name,t),s=be();Q.register(e.name,o,s);let c=Object.freeze({...n}),l;if(e.primaryKey!==void 0)l=Array.isArray(e.primaryKey)?e.primaryKey.map(String):[String(e.primaryKey)];else{l=[];for(let[t,n]of Object.entries(e.columns))n.__primaryKey&&l.push(t)}let u=Object.freeze([...l]);return{table:o,schema:e,columnKinds:c,primaryKeyColumns:u,makeClient:e=>new X(o,c,e,u)}}function be(){let e=Error().stack;if(!e)return;let t=e.split(`
|
|
19
|
+
`).slice(1);for(let e of t){if(e.includes(`/table/define.`)||e.includes(`/table/registry.`))continue;let t=e.match(/\(([^)]+)\)/)??e.match(/at (.+)$/);if(t)return t[1].trim()}}export{ge as DEFAULT_LIMIT,J as MAX_BATCH,q as MAX_LIMIT,X as TableClient,Y as TableClientError,V as WhereBuilderError,_e as column,k as createDbClient,A as createReadOnlyClient,ye as defineTable,P as getMigrationStatus,fe as getQueryStats,W as isNonEmptyWhere,D as isQueryCounterEnabled,E as queryCountingLogger,I as rollbackMigrations,F as runMigrations,pe as runWithQueryStats,L as schemaRegistry,Q as tableRegistry};
|
|
20
20
|
//# sourceMappingURL=index.mjs.map
|