@@ -151,6 +151,44 @@ type UnwrapPromiseArray<T> = T extends any[] ? {
151
151
[ k in keyof T ] : T [ k ] extends Promise < infer R > ? R : T [ k ]
152
152
} : T ;
153
153
154
+ type Keys = string
155
+
156
+ type SerializableObject < T , K extends any [ ] > =
157
+ number extends K [ 'length' ] ? { } :
158
+ Record < Keys & ( keyof T ) & ( K [ 'length' ] extends 0 ? string : K [ number ] ) , postgres . SerializableParameter >
159
+
160
+ type First < T , K extends any [ ] > =
161
+ // Tagged template string call
162
+ T extends TemplateStringsArray ? TemplateStringsArray :
163
+ // Identifiers helper
164
+ T extends string ? string :
165
+ // Dynamic values helper (depth 2)
166
+ T extends readonly any [ ] [ ] ? postgres . EscapableArray [ ] :
167
+ // Insert/update helper (depth 2)
168
+ T extends ( object & infer R ) [ ] ? SerializableObject < R , K > [ ] :
169
+ // Dynamic values helper (depth 1)
170
+ T extends readonly any [ ] ? postgres . EscapableArray :
171
+ // Insert/update helper (depth 1)
172
+ T extends object ? SerializableObject < T , K > :
173
+ // Unexpected type
174
+ never
175
+
176
+ type Rest < T > =
177
+ T extends TemplateStringsArray ? never : // force fallback to the tagged template function overload
178
+ T extends string ? string [ ] :
179
+ T extends readonly any [ ] [ ] ? [ ] :
180
+ T extends ( object & infer R ) [ ] ? ( Keys & keyof R ) [ ] :
181
+ T extends readonly any [ ] ? [ ] :
182
+ T extends object ? ( Keys & keyof T ) [ ] :
183
+ any
184
+
185
+ type Return < T , K extends any [ ] > =
186
+ [ T ] extends [ TemplateStringsArray ] ?
187
+ [ unknown ] extends [ T ] ? postgres . Helper < T , K > : // ensure no `PendingQuery` with `any` types
188
+ [ TemplateStringsArray ] extends [ T ] ? postgres . PendingQuery < postgres . Row [ ] > :
189
+ postgres . Helper < T , K > :
190
+ postgres . Helper < T , K >
191
+
154
192
declare namespace postgres {
155
193
class PostgresError extends Error {
156
194
name : 'PostgresError' ;
@@ -408,30 +446,23 @@ declare namespace postgres {
408
446
size ( ) : Promise < [ { position : bigint , size : bigint } ] > ;
409
447
}
410
448
411
- type Serializable = null
449
+ type EscapableArray = ( string | number ) [ ]
450
+
451
+ type Serializable = never
452
+ | null
412
453
| boolean
413
454
| number
414
455
| string
415
456
| Date
416
457
| Uint8Array ;
417
458
418
- type SerializableParameter = Serializable
459
+ type SerializableParameter = never
460
+ | Serializable
419
461
| Helper < any >
420
462
| Parameter < any >
421
463
| ArrayParameter
422
- | Record < string , any > // implicit JSON
423
464
| readonly SerializableParameter [ ] ;
424
465
425
- type HelperSerializable = { [ index : string ] : SerializableParameter } | { [ index : string ] : SerializableParameter } [ ] ;
426
-
427
- type SerializableKeys < T > = ( keyof T ) extends infer R
428
- ? R extends keyof T
429
- ? T [ R ] extends SerializableParameter
430
- ? R
431
- : never
432
- : keyof T
433
- : keyof T ;
434
-
435
466
interface Row {
436
467
[ column : string ] : any ;
437
468
}
@@ -526,30 +557,21 @@ declare namespace postgres {
526
557
}
527
558
528
559
interface Sql < TTypes extends JSToPostgresTypeMap > {
560
+ /**
561
+ * Query helper
562
+ * @param first Define how the helper behave
563
+ * @param rest Other optional arguments, depending on the helper type
564
+ * @returns An helper object usable as tagged template parameter in sql queries
565
+ */
566
+ < T , K extends Rest < T > > ( first : T & First < T , K > , ...rest : K ) : Return < T , K > ;
529
567
530
568
/**
531
569
* Execute the SQL query passed as a template string. Can only be used as template string tag.
532
570
* @param template The template generated from the template string
533
- * @param args Interpoled values of the template string
571
+ * @param parameters Interpoled values of the template string
534
572
* @returns A promise resolving to the result of your query
535
573
*/
536
- < T extends readonly any [ ] = Row [ ] > ( template : TemplateStringsArray , ...args : SerializableParameter [ ] ) : PendingQuery < AsRowList < T > > ;
537
-
538
- /**
539
- * Escape column names
540
- * @param columns Columns to escape
541
- * @returns A formated representation of the column names
542
- */
543
- ( columns : string [ ] ) : Helper < string > ;
544
- ( ...columns : string [ ] ) : Helper < string > ;
545
-
546
- /**
547
- * Extract properties from an object or from an array of objects
548
- * @param objOrArray An object or an array of objects to extract properties from
549
- * @param keys Keys to extract from the object or from objets inside the array
550
- * @returns A formated representation of the parameter
551
- */
552
- < T extends object | readonly object [ ] , U extends SerializableKeys < T extends readonly object [ ] ? T [ number ] : T > > ( objOrArray : T , ...keys : U [ ] ) : Helper < T , U [ ] > ;
574
+ < T extends readonly any [ ] = Row [ ] > ( template : TemplateStringsArray , ...parameters : ( SerializableParameter | PendingQuery < any > ) [ ] ) : PendingQuery < AsRowList < T > > ;
553
575
554
576
CLOSE : { } ;
555
577
END : this[ 'CLOSE' ] ;
0 commit comments