@@ -5,19 +5,25 @@ import { Readable, Writable } from 'node:stream'
5
5
* @param options Connection options - default to the same as psql
6
6
* @returns An utility function to make queries to the server
7
7
*/
8
- declare function postgres < T extends JSToPostgresTypeMap > ( options ?: postgres . Options < T > ) : postgres . Sql < JSToPostgresTypeMap extends T ? { } : T >
8
+ declare function postgres < T extends PostgresTypeList > ( options ?: postgres . Options < T > ) : postgres . Sql < PostgresTypeList extends T ? { } : { [ type in keyof T ] : T [ type ] extends {
9
+ serialize : ( value : infer R ) => any ,
10
+ parse : ( raw : any ) => infer R
11
+ } ? R : never } >
9
12
/**
10
13
* Establish a connection to a PostgreSQL server.
11
14
* @param url Connection string used for authentication
12
15
* @param options Connection options - default to the same as psql
13
16
* @returns An utility function to make queries to the server
14
17
*/
15
- declare function postgres < T extends JSToPostgresTypeMap > ( url : string , options ?: postgres . Options < T > ) : postgres . Sql < JSToPostgresTypeMap extends T ? { } : T >
18
+ declare function postgres < T extends PostgresTypeList > ( url : string , options ?: postgres . Options < T > ) : postgres . Sql < PostgresTypeList extends T ? { } : { [ type in keyof T ] : T [ type ] extends {
19
+ serialize : ( value : infer R ) => any ,
20
+ parse : ( raw : any ) => infer R
21
+ } ? R : never } >
16
22
17
23
/**
18
24
* Connection options of Postgres.
19
25
*/
20
- interface BaseOptions < T extends JSToPostgresTypeMap > {
26
+ interface BaseOptions < T extends PostgresTypeList > {
21
27
/** Postgres ip address[s] or domain name[s] */
22
28
host : string | string [ ] ;
23
29
/** Postgres server[s] port[s] */
@@ -35,10 +41,10 @@ interface BaseOptions<T extends JSToPostgresTypeMap> {
35
41
*/
36
42
user : string ;
37
43
/**
38
- * true, prefer, require or tls.connect options
44
+ * How to deal with ssl (can be a tls.connect option object)
39
45
* @default false
40
46
*/
41
- ssl : 'require' | 'allow' | 'prefer' | boolean | object ;
47
+ ssl : 'require' | 'allow' | 'prefer' | 'verify-full' | boolean | object ;
42
48
/**
43
49
* Max number of connections
44
50
* @default 10
@@ -54,8 +60,8 @@ interface BaseOptions<T extends JSToPostgresTypeMap> {
54
60
* @default process.env['PGCONNECT_TIMEOUT']
55
61
*/
56
62
connect_timeout : number ;
57
- /** Array of custom types; see more below */
58
- types : PostgresTypeList < T > ;
63
+ /** Array of custom types; see more in the README */
64
+ types : T ;
59
65
/**
60
66
* Enables prepare mode.
61
67
* @default true
@@ -117,11 +123,9 @@ interface BaseOptions<T extends JSToPostgresTypeMap> {
117
123
keep_alive : number | null ;
118
124
}
119
125
120
- type PostgresTypeList < T > = {
121
- [ name in keyof T ] : T [ name ] extends ( ...args : any ) => postgres . SerializableParameter
122
- ? postgres . PostgresType < T [ name ] >
123
- : postgres . PostgresType < ( ...args : any ) => postgres . SerializableParameter > ;
124
- } ;
126
+ interface PostgresTypeList {
127
+ [ name : string ] : postgres . PostgresType ;
128
+ }
125
129
126
130
interface JSToPostgresTypeMap {
127
131
[ name : string ] : unknown ;
@@ -155,17 +159,17 @@ type UnwrapPromiseArray<T> = T extends any[] ? {
155
159
156
160
type Keys = string
157
161
158
- type SerializableObject < T , K extends any [ ] > =
162
+ type SerializableObject < T , K extends readonly any [ ] > =
159
163
number extends K [ 'length' ] ? { } :
160
164
( Record < Keys & ( keyof T ) & ( K [ 'length' ] extends 0 ? string : K [ number ] ) , postgres . SerializableParameter | postgres . JSONValue > & Record < string , any > )
161
165
162
- type First < T , K extends any [ ] > =
166
+ type First < T , K extends readonly any [ ] > =
163
167
// Tagged template string call
164
168
T extends TemplateStringsArray ? TemplateStringsArray :
165
169
// Identifiers helper
166
170
T extends string ? string :
167
171
// Dynamic values helper (depth 2)
168
- T extends readonly any [ ] [ ] ? postgres . EscapableArray [ ] :
172
+ T extends readonly any [ ] [ ] ? readonly postgres . EscapableArray [ ] :
169
173
// Insert/update helper (depth 2)
170
174
T extends readonly ( object & infer R ) [ ] ? ( R extends postgres . SerializableParameter ? readonly postgres . SerializableParameter [ ] : readonly SerializableObject < R , K > [ ] ) :
171
175
// Dynamic values/ANY helper (depth 1)
@@ -177,14 +181,14 @@ type First<T, K extends any[]> =
177
181
178
182
type Rest < T > =
179
183
T extends TemplateStringsArray ? never : // force fallback to the tagged template function overload
180
- T extends string ? string [ ] :
181
- T extends readonly any [ ] [ ] ? [ ] :
182
- T extends readonly ( object & infer R ) [ ] ? ( Keys & keyof R ) [ ] :
183
- T extends readonly any [ ] ? [ ] :
184
- T extends object ? ( Keys & keyof T ) [ ] :
184
+ T extends string ? readonly string [ ] :
185
+ T extends readonly any [ ] [ ] ? readonly [ ] :
186
+ T extends readonly ( object & infer R ) [ ] ? readonly ( Keys & keyof R ) [ ] :
187
+ T extends readonly any [ ] ? readonly [ ] :
188
+ T extends object ? readonly ( Keys & keyof T ) [ ] :
185
189
any
186
190
187
- type Return < T , K extends any [ ] > =
191
+ type Return < T , K extends readonly any [ ] > =
188
192
[ T ] extends [ TemplateStringsArray ] ?
189
193
[ unknown ] extends [ T ] ? postgres . Helper < T , K > : // ensure no `PendingQuery` with `any` types
190
194
[ TemplateStringsArray ] extends [ T ] ? postgres . PendingQuery < postgres . Row [ ] > :
@@ -260,13 +264,13 @@ declare namespace postgres {
260
264
*/
261
265
function fromKebab ( str : string ) : string ;
262
266
263
- const BigInt : PostgresType < ( number : bigint ) => string > ;
267
+ const BigInt : PostgresType < bigint > ;
264
268
265
- interface PostgresType < T extends ( ... args : any [ ] ) => unknown > {
269
+ interface PostgresType < T = any > {
266
270
to : number ;
267
271
from : number [ ] ;
268
- serialize : T ;
269
- parse : ( raw : string ) => unknown ;
272
+ serialize : ( value : T ) => unknown ;
273
+ parse : ( raw : any ) => T ;
270
274
}
271
275
272
276
interface ConnectionParameters {
@@ -279,7 +283,7 @@ declare namespace postgres {
279
283
[ name : string ] : string ;
280
284
}
281
285
282
- interface Options < T extends JSToPostgresTypeMap > extends Partial < BaseOptions < T > > {
286
+ interface Options < T extends PostgresTypeList > extends Partial < BaseOptions < T > > {
283
287
/** @inheritdoc */
284
288
host ?: string ;
285
289
/** @inheritdoc */
@@ -311,7 +315,7 @@ declare namespace postgres {
311
315
timeout ?: Options < T > [ 'idle_timeout' ] ;
312
316
}
313
317
314
- interface ParsedOptions < T extends JSToPostgresTypeMap > extends BaseOptions < T > {
318
+ interface ParsedOptions < T extends JSToPostgresTypeMap > extends BaseOptions < { [ name in keyof T ] : PostgresType < T [ name ] > } > {
315
319
/** @inheritdoc */
316
320
host : string [ ] ;
317
321
/** @inheritdoc */
@@ -320,8 +324,8 @@ declare namespace postgres {
320
324
pass : null ;
321
325
/** @inheritdoc */
322
326
transform : Transform ;
323
- serializers : Record < number , ( ... args : any ) => SerializableParameter > ;
324
- parsers : Record < number , ( value : string ) => unknown > ;
327
+ serializers : Record < number , ( value : any ) => unknown > ;
328
+ parsers : Record < number , ( value : any ) => unknown > ;
325
329
}
326
330
327
331
interface Transform {
@@ -471,10 +475,10 @@ declare namespace postgres {
471
475
| string
472
476
| number
473
477
| Date // serialized as `string`
474
- | JSONValue [ ]
478
+ | readonly JSONValue [ ]
475
479
| { toJSON ( ) : any } // `toJSON` called by `JSON.stringify`; not typing the return type, typings is strict enough anyway
476
480
| {
477
- [ prop : string | number ] :
481
+ readonly [ prop : string | number ] :
478
482
| undefined
479
483
| JSONValue
480
484
| ( ( ...args : any ) => any ) // serialized as `undefined`
@@ -568,7 +572,7 @@ declare namespace postgres {
568
572
unlisten ( ) : Promise < void >
569
573
}
570
574
571
- interface Helper < T , U extends any [ ] = T [ ] > extends NotAPromise {
575
+ interface Helper < T , U extends readonly any [ ] = T [ ] > extends NotAPromise {
572
576
first : T ;
573
577
rest : U ;
574
578
}
@@ -588,18 +592,17 @@ declare namespace postgres {
588
592
* @param parameters Interpoled values of the template string
589
593
* @returns A promise resolving to the result of your query
590
594
*/
591
- < T extends readonly object [ ] = Row [ ] > ( template : TemplateStringsArray , ...parameters : ( SerializableParameter | PendingQuery < any > ) [ ] ) : PendingQuery < AsRowList < T > > ;
595
+ < T extends readonly ( object | undefined ) [ ] = Row [ ] > ( template : TemplateStringsArray , ...parameters : readonly ( SerializableParameter | PendingQuery < any > ) [ ] ) : PendingQuery < AsRowList < T > > ;
592
596
593
597
CLOSE : { } ;
594
598
END : this[ 'CLOSE' ] ;
595
599
PostgresError : typeof PostgresError ;
596
600
597
601
options : ParsedOptions < TTypes > ;
598
602
parameters : ConnectionParameters ;
599
- types : {
600
- [ name in keyof TTypes ] : TTypes [ name ] extends ( ...args : any ) => any
601
- ? ( ...args : Parameters < TTypes [ name ] > ) => postgres . Parameter < ReturnType < TTypes [ name ] > >
602
- : ( ...args : any ) => postgres . Parameter < any > ;
603
+ types : this[ 'typed' ] ;
604
+ typed : ( < T > ( value : T , oid : number ) => Parameter < T > ) & {
605
+ [ name in keyof TTypes ] : ( value : TTypes [ name ] ) => postgres . Parameter < TTypes [ name ] >
603
606
} ;
604
607
605
608
unsafe < T extends any [ ] = ( Row & Iterable < Row > ) [ ] > ( query : string , parameters ?: SerializableParameter [ ] , queryOptions ?: UnsafeQueryOptions ) : PendingQuery < AsRowList < T > > ;
0 commit comments