kysely 0.24.2 → 0.25.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/README.md +30 -13
- package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +2 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +4 -1
- package/dist/cjs/driver/runtime-driver.js +6 -6
- package/dist/cjs/dynamic/dynamic.d.ts +1 -1
- package/dist/cjs/dynamic/dynamic.js +1 -1
- package/dist/cjs/expression/expression-builder.d.ts +56 -1
- package/dist/cjs/expression/expression-builder.js +10 -0
- package/dist/cjs/helpers/mysql.d.ts +3 -3
- package/dist/cjs/helpers/mysql.js +2 -2
- package/dist/cjs/helpers/postgres.d.ts +1 -1
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/kysely.d.ts +19 -2
- package/dist/cjs/kysely.js +28 -1
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +3 -7
- package/dist/cjs/operation-node/aggregate-function-node.js +1 -1
- package/dist/cjs/operation-node/alter-column-node.d.ts +1 -2
- package/dist/cjs/operation-node/alter-table-node.d.ts +1 -1
- package/dist/cjs/operation-node/alter-table-node.js +1 -2
- package/dist/cjs/operation-node/case-node.d.ts +19 -0
- package/dist/cjs/operation-node/case-node.js +42 -0
- package/dist/cjs/operation-node/create-index-node.d.ts +2 -1
- package/dist/cjs/operation-node/create-index-node.js +6 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +20 -2
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/when-node.d.ts +14 -0
- package/dist/cjs/operation-node/when-node.js +24 -0
- package/dist/cjs/parser/binary-operation-parser.d.ts +1 -0
- package/dist/cjs/parser/binary-operation-parser.js +18 -2
- package/dist/cjs/parser/expression-parser.d.ts +2 -1
- package/dist/cjs/parser/order-by-parser.d.ts +1 -0
- package/dist/cjs/parser/order-by-parser.js +5 -1
- package/dist/cjs/parser/reference-parser.d.ts +6 -2
- package/dist/cjs/parser/reference-parser.js +16 -1
- package/dist/cjs/parser/select-parser.d.ts +4 -4
- package/dist/cjs/parser/table-parser.d.ts +5 -4
- package/dist/cjs/parser/with-parser.d.ts +4 -3
- package/dist/cjs/query-builder/case-builder.d.ts +111 -0
- package/dist/cjs/query-builder/case-builder.js +75 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +55 -13
- package/dist/cjs/query-builder/delete-query-builder.js +44 -0
- package/dist/cjs/query-builder/function-module.d.ts +36 -5
- package/dist/cjs/query-builder/function-module.js +12 -16
- package/dist/cjs/query-builder/insert-query-builder.d.ts +44 -3
- package/dist/cjs/query-builder/insert-query-builder.js +49 -1
- package/dist/cjs/query-builder/select-query-builder.d.ts +54 -13
- package/dist/cjs/query-builder/select-query-builder.js +43 -0
- package/dist/cjs/query-builder/update-query-builder.d.ts +65 -20
- package/dist/cjs/query-builder/update-query-builder.js +47 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +30 -3
- package/dist/cjs/schema/alter-column-builder.d.ts +2 -2
- package/dist/cjs/schema/alter-column-builder.js +2 -2
- package/dist/cjs/schema/create-index-builder.d.ts +49 -7
- package/dist/cjs/schema/create-index-builder.js +51 -13
- package/dist/cjs/schema/schema.js +1 -1
- package/dist/cjs/util/column-type.d.ts +3 -2
- package/dist/cjs/util/log.d.ts +3 -3
- package/dist/cjs/util/log.js +4 -4
- package/dist/cjs/util/object-utils.d.ts +2 -1
- package/dist/cjs/util/type-utils.d.ts +43 -29
- package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +2 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +4 -1
- package/dist/esm/driver/runtime-driver.js +6 -6
- package/dist/esm/dynamic/dynamic.d.ts +1 -1
- package/dist/esm/dynamic/dynamic.js +1 -1
- package/dist/esm/expression/expression-builder.d.ts +56 -1
- package/dist/esm/expression/expression-builder.js +11 -1
- package/dist/esm/helpers/mysql.d.ts +3 -3
- package/dist/esm/helpers/mysql.js +2 -2
- package/dist/esm/helpers/postgres.d.ts +1 -1
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/kysely.d.ts +19 -2
- package/dist/esm/kysely.js +29 -2
- package/dist/esm/operation-node/aggregate-function-node.d.ts +3 -7
- package/dist/esm/operation-node/aggregate-function-node.js +1 -1
- package/dist/esm/operation-node/alter-column-node.d.ts +1 -2
- package/dist/esm/operation-node/alter-table-node.d.ts +1 -1
- package/dist/esm/operation-node/alter-table-node.js +1 -2
- package/dist/esm/operation-node/case-node.d.ts +19 -0
- package/dist/esm/operation-node/case-node.js +40 -0
- package/dist/esm/operation-node/create-index-node.d.ts +2 -1
- package/dist/esm/operation-node/create-index-node.js +6 -0
- package/dist/esm/operation-node/data-type-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-transformer.js +20 -2
- package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-visitor.js +2 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/when-node.d.ts +14 -0
- package/dist/esm/operation-node/when-node.js +22 -0
- package/dist/esm/parser/binary-operation-parser.d.ts +1 -0
- package/dist/esm/parser/binary-operation-parser.js +16 -1
- package/dist/esm/parser/expression-parser.d.ts +2 -1
- package/dist/esm/parser/order-by-parser.d.ts +1 -0
- package/dist/esm/parser/order-by-parser.js +3 -0
- package/dist/esm/parser/reference-parser.d.ts +6 -2
- package/dist/esm/parser/reference-parser.js +14 -0
- package/dist/esm/parser/select-parser.d.ts +4 -4
- package/dist/esm/parser/table-parser.d.ts +5 -4
- package/dist/esm/parser/with-parser.d.ts +4 -3
- package/dist/esm/query-builder/case-builder.d.ts +111 -0
- package/dist/esm/query-builder/case-builder.js +69 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +55 -13
- package/dist/esm/query-builder/delete-query-builder.js +44 -0
- package/dist/esm/query-builder/function-module.d.ts +36 -5
- package/dist/esm/query-builder/function-module.js +13 -17
- package/dist/esm/query-builder/insert-query-builder.d.ts +44 -3
- package/dist/esm/query-builder/insert-query-builder.js +49 -1
- package/dist/esm/query-builder/select-query-builder.d.ts +54 -13
- package/dist/esm/query-builder/select-query-builder.js +43 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +65 -20
- package/dist/esm/query-builder/update-query-builder.js +47 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/esm/query-compiler/default-query-compiler.js +30 -3
- package/dist/esm/schema/alter-column-builder.d.ts +2 -2
- package/dist/esm/schema/alter-column-builder.js +2 -2
- package/dist/esm/schema/create-index-builder.d.ts +49 -7
- package/dist/esm/schema/create-index-builder.js +52 -14
- package/dist/esm/schema/schema.js +1 -1
- package/dist/esm/util/column-type.d.ts +3 -2
- package/dist/esm/util/log.d.ts +3 -3
- package/dist/esm/util/log.js +4 -4
- package/dist/esm/util/object-utils.d.ts +2 -1
- package/dist/esm/util/type-utils.d.ts +43 -29
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ import { SelectExpression, SelectArg } from '../parser/select-parser.js';
|
|
|
6
6
|
import { ReturningRow } from '../parser/returning-parser.js';
|
|
7
7
|
import { ReferenceExpression } from '../parser/reference-parser.js';
|
|
8
8
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
9
|
-
import {
|
|
9
|
+
import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, SimplifyResult, SimplifySingleResult } from '../util/type-utils.js';
|
|
10
10
|
import { UpdateQueryNode } from '../operation-node/update-query-node.js';
|
|
11
11
|
import { UpdateObject, UpdateObjectFactory } from '../parser/update-set-parser.js';
|
|
12
12
|
import { Compilable } from '../util/compilable.js';
|
|
@@ -533,10 +533,10 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
533
533
|
*
|
|
534
534
|
* const result = await db
|
|
535
535
|
* .updateTable('person')
|
|
536
|
-
* .set(({ selectFrom, ref, fn }) => ({
|
|
537
|
-
* first_name: '
|
|
536
|
+
* .set(({ selectFrom, ref, fn, bxp }) => ({
|
|
537
|
+
* first_name: selectFrom('person').select('first_name').limit(1),
|
|
538
538
|
* middle_name: ref('first_name'),
|
|
539
|
-
* age:
|
|
539
|
+
* age: bxp('age', '+', 1),
|
|
540
540
|
* last_name: sql`${'Ani'} || ${'ston'}`,
|
|
541
541
|
* }))
|
|
542
542
|
* .where('id', '=', 1)
|
|
@@ -549,11 +549,11 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
549
549
|
*
|
|
550
550
|
* ```sql
|
|
551
551
|
* update "person" set
|
|
552
|
-
* "first_name" = $1,
|
|
552
|
+
* "first_name" = (select "first_name" from "person" limit $1),
|
|
553
553
|
* "middle_name" = "first_name",
|
|
554
|
-
* "age" =
|
|
555
|
-
* "last_name" = $
|
|
556
|
-
* where "id" = $
|
|
554
|
+
* "age" = "age" + $2,
|
|
555
|
+
* "last_name" = $3 || $4
|
|
556
|
+
* where "id" = $5
|
|
557
557
|
* ```
|
|
558
558
|
*/
|
|
559
559
|
set(update: UpdateObject<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
|
|
@@ -687,11 +687,11 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
687
687
|
* }
|
|
688
688
|
* ```
|
|
689
689
|
*/
|
|
690
|
-
$if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): UpdateQueryBuilder<DB, UT, TB, O2 extends
|
|
690
|
+
$if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): O2 extends UpdateResult ? UpdateQueryBuilder<DB, UT, TB, UpdateResult> : O2 extends O & infer E ? UpdateQueryBuilder<DB, UT, TB, O & Partial<E>> : UpdateQueryBuilder<DB, UT, TB, Partial<O2>>;
|
|
691
691
|
/**
|
|
692
692
|
* @deprecated Use `$if` instead
|
|
693
693
|
*/
|
|
694
|
-
if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): UpdateQueryBuilder<DB, UT, TB, O2 extends
|
|
694
|
+
if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): O2 extends UpdateResult ? UpdateQueryBuilder<DB, UT, TB, UpdateResult> : O2 extends O & infer E ? UpdateQueryBuilder<DB, UT, TB, O & Partial<E>> : UpdateQueryBuilder<DB, UT, TB, Partial<O2>>;
|
|
695
695
|
/**
|
|
696
696
|
* Change the output type of the query.
|
|
697
697
|
*
|
|
@@ -703,6 +703,51 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
|
|
|
703
703
|
* @deprecated Use `$castTo` instead.
|
|
704
704
|
*/
|
|
705
705
|
castTo<T>(): UpdateQueryBuilder<DB, UT, TB, T>;
|
|
706
|
+
/**
|
|
707
|
+
* Narrows (parts of) the output type of the query.
|
|
708
|
+
*
|
|
709
|
+
* Kysely tries to be as type-safe as possible, but in some cases we have to make
|
|
710
|
+
* compromises for better maintainability and compilation performance. At present,
|
|
711
|
+
* Kysely doesn't narrow the output type of the query based on {@link set} input
|
|
712
|
+
* when using {@link where} and/or {@link returning} or {@link returningAll}.
|
|
713
|
+
*
|
|
714
|
+
* This utility method is very useful for these situations, as it removes unncessary
|
|
715
|
+
* runtime assertion/guard code. Its input type is limited to the output type
|
|
716
|
+
* of the query, so you can't add a column that doesn't exist, or change a column's
|
|
717
|
+
* type to something that doesn't exist in its union type.
|
|
718
|
+
*
|
|
719
|
+
* ### Examples
|
|
720
|
+
*
|
|
721
|
+
* Turn this code:
|
|
722
|
+
*
|
|
723
|
+
* ```ts
|
|
724
|
+
* const person = await db.updateTable('person')
|
|
725
|
+
* .set({ deletedAt: now })
|
|
726
|
+
* .where('id', '=', id)
|
|
727
|
+
* .where('nullable_column', 'is not', null)
|
|
728
|
+
* .returningAll()
|
|
729
|
+
* .executeTakeFirstOrThrow()
|
|
730
|
+
*
|
|
731
|
+
* if (person.nullable_column) {
|
|
732
|
+
* functionThatExpectsPersonWithNonNullValue(person)
|
|
733
|
+
* }
|
|
734
|
+
* ```
|
|
735
|
+
*
|
|
736
|
+
* Into this:
|
|
737
|
+
*
|
|
738
|
+
* ```ts
|
|
739
|
+
* const person = await db.updateTable('person')
|
|
740
|
+
* .set({ deletedAt: now })
|
|
741
|
+
* .where('id', '=', id)
|
|
742
|
+
* .where('nullable_column', 'is not', null)
|
|
743
|
+
* .returningAll()
|
|
744
|
+
* .$narrowType<{ deletedAt: Date; nullable_column: string }>()
|
|
745
|
+
* .executeTakeFirstOrThrow()
|
|
746
|
+
*
|
|
747
|
+
* functionThatExpectsPersonWithNonNullValue(person)
|
|
748
|
+
* ```
|
|
749
|
+
*/
|
|
750
|
+
$narrowType<T>(): UpdateQueryBuilder<DB, UT, TB, NarrowPartial<O, T>>;
|
|
706
751
|
/**
|
|
707
752
|
* Asserts that query's output row type equals the given type `T`.
|
|
708
753
|
*
|
|
@@ -847,23 +892,23 @@ export interface UpdateQueryBuilderProps {
|
|
|
847
892
|
readonly executor: QueryExecutor;
|
|
848
893
|
}
|
|
849
894
|
export declare type UpdateQueryBuilderWithInnerJoin<DB, UT extends keyof DB, TB extends keyof DB, O, TE extends TableExpression<DB, TB>> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? InnerJoinedBuilder<DB, UT, TB, O, A, DB[T]> : never : TE extends keyof DB ? UpdateQueryBuilder<DB, UT, TB | TE, O> : TE extends AliasedExpression<infer QO, infer QA> ? InnerJoinedBuilder<DB, UT, TB, O, QA, QO> : TE extends (qb: any) => AliasedExpression<infer QO, infer QA> ? InnerJoinedBuilder<DB, UT, TB, O, QA, QO> : never;
|
|
850
|
-
declare type InnerJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends string, R> = A extends keyof DB ? UpdateQueryBuilder<InnerJoinedDB<DB, A, R>, UT, TB | A, O> : UpdateQueryBuilder<DB &
|
|
851
|
-
declare type InnerJoinedDB<DB, A extends string, R> = {
|
|
895
|
+
declare type InnerJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends string, R> = A extends keyof DB ? UpdateQueryBuilder<InnerJoinedDB<DB, A, R>, UT, TB | A, O> : UpdateQueryBuilder<DB & ShallowRecord<A, R>, UT, TB | A, O>;
|
|
896
|
+
declare type InnerJoinedDB<DB, A extends string, R> = DrainOuterGeneric<{
|
|
852
897
|
[C in keyof DB | A]: C extends A ? R : C extends keyof DB ? DB[C] : never;
|
|
853
|
-
}
|
|
898
|
+
}>;
|
|
854
899
|
export declare type UpdateQueryBuilderWithLeftJoin<DB, UT extends keyof DB, TB extends keyof DB, O, TE extends TableExpression<DB, TB>> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? LeftJoinedBuilder<DB, UT, TB, O, A, DB[T]> : never : TE extends keyof DB ? LeftJoinedBuilder<DB, UT, TB, O, TE, DB[TE]> : TE extends AliasedExpression<infer QO, infer QA> ? LeftJoinedBuilder<DB, UT, TB, O, QA, QO> : TE extends (qb: any) => AliasedExpression<infer QO, infer QA> ? LeftJoinedBuilder<DB, UT, TB, O, QA, QO> : never;
|
|
855
|
-
declare type LeftJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends keyof any, R> = A extends keyof DB ? UpdateQueryBuilder<LeftJoinedDB<DB, A, R>, UT, TB | A, O> : UpdateQueryBuilder<DB &
|
|
856
|
-
declare type LeftJoinedDB<DB, A extends keyof any, R> = {
|
|
900
|
+
declare type LeftJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends keyof any, R> = A extends keyof DB ? UpdateQueryBuilder<LeftJoinedDB<DB, A, R>, UT, TB | A, O> : UpdateQueryBuilder<DB & ShallowRecord<A, Nullable<R>>, UT, TB | A, O>;
|
|
901
|
+
declare type LeftJoinedDB<DB, A extends keyof any, R> = DrainOuterGeneric<{
|
|
857
902
|
[C in keyof DB | A]: C extends A ? Nullable<R> : C extends keyof DB ? DB[C] : never;
|
|
858
|
-
}
|
|
903
|
+
}>;
|
|
859
904
|
export declare type UpdateQueryBuilderWithRightJoin<DB, UT extends keyof DB, TB extends keyof DB, O, TE extends TableExpression<DB, TB>> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? RightJoinedBuilder<DB, UT, TB, O, A, DB[T]> : never : TE extends keyof DB ? RightJoinedBuilder<DB, UT, TB, O, TE, DB[TE]> : TE extends AliasedExpression<infer QO, infer QA> ? RightJoinedBuilder<DB, UT, TB, O, QA, QO> : TE extends (qb: any) => AliasedExpression<infer QO, infer QA> ? RightJoinedBuilder<DB, UT, TB, O, QA, QO> : never;
|
|
860
905
|
declare type RightJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends keyof any, R> = UpdateQueryBuilder<RightJoinedDB<DB, TB, A, R>, UT, TB | A, O>;
|
|
861
|
-
declare type RightJoinedDB<DB, TB extends keyof DB, A extends keyof any, R> = {
|
|
906
|
+
declare type RightJoinedDB<DB, TB extends keyof DB, A extends keyof any, R> = DrainOuterGeneric<{
|
|
862
907
|
[C in keyof DB | A]: C extends A ? R : C extends TB ? Nullable<DB[C]> : C extends keyof DB ? DB[C] : never;
|
|
863
|
-
}
|
|
908
|
+
}>;
|
|
864
909
|
export declare type UpdateQueryBuilderWithFullJoin<DB, UT extends keyof DB, TB extends keyof DB, O, TE extends TableExpression<DB, TB>> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? OuterJoinedBuilder<DB, UT, TB, O, A, DB[T]> : never : TE extends keyof DB ? OuterJoinedBuilder<DB, UT, TB, O, TE, DB[TE]> : TE extends AliasedExpression<infer QO, infer QA> ? OuterJoinedBuilder<DB, UT, TB, O, QA, QO> : TE extends (qb: any) => AliasedExpression<infer QO, infer QA> ? OuterJoinedBuilder<DB, UT, TB, O, QA, QO> : never;
|
|
865
910
|
declare type OuterJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends keyof any, R> = UpdateQueryBuilder<OuterJoinedBuilderDB<DB, TB, A, R>, UT, TB | A, O>;
|
|
866
|
-
declare type OuterJoinedBuilderDB<DB, TB extends keyof DB, A extends keyof any, R> = {
|
|
911
|
+
declare type OuterJoinedBuilderDB<DB, TB extends keyof DB, A extends keyof any, R> = DrainOuterGeneric<{
|
|
867
912
|
[C in keyof DB | A]: C extends A ? Nullable<R> : C extends TB ? Nullable<DB[C]> : C extends keyof DB ? DB[C] : never;
|
|
868
|
-
}
|
|
913
|
+
}>;
|
|
869
914
|
export {};
|
|
@@ -215,6 +215,53 @@ export class UpdateQueryBuilder {
|
|
|
215
215
|
castTo() {
|
|
216
216
|
return this.$castTo();
|
|
217
217
|
}
|
|
218
|
+
/**
|
|
219
|
+
* Narrows (parts of) the output type of the query.
|
|
220
|
+
*
|
|
221
|
+
* Kysely tries to be as type-safe as possible, but in some cases we have to make
|
|
222
|
+
* compromises for better maintainability and compilation performance. At present,
|
|
223
|
+
* Kysely doesn't narrow the output type of the query based on {@link set} input
|
|
224
|
+
* when using {@link where} and/or {@link returning} or {@link returningAll}.
|
|
225
|
+
*
|
|
226
|
+
* This utility method is very useful for these situations, as it removes unncessary
|
|
227
|
+
* runtime assertion/guard code. Its input type is limited to the output type
|
|
228
|
+
* of the query, so you can't add a column that doesn't exist, or change a column's
|
|
229
|
+
* type to something that doesn't exist in its union type.
|
|
230
|
+
*
|
|
231
|
+
* ### Examples
|
|
232
|
+
*
|
|
233
|
+
* Turn this code:
|
|
234
|
+
*
|
|
235
|
+
* ```ts
|
|
236
|
+
* const person = await db.updateTable('person')
|
|
237
|
+
* .set({ deletedAt: now })
|
|
238
|
+
* .where('id', '=', id)
|
|
239
|
+
* .where('nullable_column', 'is not', null)
|
|
240
|
+
* .returningAll()
|
|
241
|
+
* .executeTakeFirstOrThrow()
|
|
242
|
+
*
|
|
243
|
+
* if (person.nullable_column) {
|
|
244
|
+
* functionThatExpectsPersonWithNonNullValue(person)
|
|
245
|
+
* }
|
|
246
|
+
* ```
|
|
247
|
+
*
|
|
248
|
+
* Into this:
|
|
249
|
+
*
|
|
250
|
+
* ```ts
|
|
251
|
+
* const person = await db.updateTable('person')
|
|
252
|
+
* .set({ deletedAt: now })
|
|
253
|
+
* .where('id', '=', id)
|
|
254
|
+
* .where('nullable_column', 'is not', null)
|
|
255
|
+
* .returningAll()
|
|
256
|
+
* .$narrowType<{ deletedAt: Date; nullable_column: string }>()
|
|
257
|
+
* .executeTakeFirstOrThrow()
|
|
258
|
+
*
|
|
259
|
+
* functionThatExpectsPersonWithNonNullValue(person)
|
|
260
|
+
* ```
|
|
261
|
+
*/
|
|
262
|
+
$narrowType() {
|
|
263
|
+
return new UpdateQueryBuilder(this.#props);
|
|
264
|
+
}
|
|
218
265
|
/**
|
|
219
266
|
* Asserts that query's output row type equals the given type `T`.
|
|
220
267
|
*
|
|
@@ -81,6 +81,8 @@ import { BinaryOperationNode } from '../operation-node/binary-operation-node.js'
|
|
|
81
81
|
import { UnaryOperationNode } from '../operation-node/unary-operation-node.js';
|
|
82
82
|
import { UsingNode } from '../operation-node/using-node.js';
|
|
83
83
|
import { FunctionNode } from '../operation-node/function-node.js';
|
|
84
|
+
import { CaseNode } from '../operation-node/case-node.js';
|
|
85
|
+
import { WhenNode } from '../operation-node/when-node.js';
|
|
84
86
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
85
87
|
#private;
|
|
86
88
|
protected get numParameters(): number;
|
|
@@ -170,6 +172,8 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
170
172
|
protected isMinusOperator(node: OperationNode): node is OperatorNode;
|
|
171
173
|
protected visitUsing(node: UsingNode): void;
|
|
172
174
|
protected visitFunction(node: FunctionNode): void;
|
|
175
|
+
protected visitCase(node: CaseNode): void;
|
|
176
|
+
protected visitWhen(node: WhenNode): void;
|
|
173
177
|
protected append(str: string): void;
|
|
174
178
|
protected appendValue(parameter: unknown): void;
|
|
175
179
|
protected getLeftIdentifierWrapper(): string;
|
|
@@ -546,9 +546,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
546
546
|
this.append(' using ');
|
|
547
547
|
this.visitNode(node.using);
|
|
548
548
|
}
|
|
549
|
-
if (node.
|
|
549
|
+
if (node.columns) {
|
|
550
550
|
this.append(' (');
|
|
551
|
-
this.
|
|
551
|
+
this.compileList(node.columns);
|
|
552
552
|
this.append(')');
|
|
553
553
|
}
|
|
554
554
|
if (node.where) {
|
|
@@ -867,7 +867,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
867
867
|
if (node.distinct) {
|
|
868
868
|
this.append('distinct ');
|
|
869
869
|
}
|
|
870
|
-
this.
|
|
870
|
+
this.compileList(node.aggregated);
|
|
871
871
|
this.append(')');
|
|
872
872
|
if (node.filter) {
|
|
873
873
|
this.append(' filter(');
|
|
@@ -926,6 +926,33 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
926
926
|
this.compileList(node.arguments);
|
|
927
927
|
this.append(')');
|
|
928
928
|
}
|
|
929
|
+
visitCase(node) {
|
|
930
|
+
this.append('case');
|
|
931
|
+
if (node.value) {
|
|
932
|
+
this.append(' ');
|
|
933
|
+
this.visitNode(node.value);
|
|
934
|
+
}
|
|
935
|
+
if (node.when) {
|
|
936
|
+
this.append(' ');
|
|
937
|
+
this.compileList(node.when, ' ');
|
|
938
|
+
}
|
|
939
|
+
if (node.else) {
|
|
940
|
+
this.append(' else ');
|
|
941
|
+
this.visitNode(node.else);
|
|
942
|
+
}
|
|
943
|
+
this.append(' end');
|
|
944
|
+
if (node.isStatement) {
|
|
945
|
+
this.append(' case');
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
visitWhen(node) {
|
|
949
|
+
this.append('when ');
|
|
950
|
+
this.visitNode(node.condition);
|
|
951
|
+
if (node.result) {
|
|
952
|
+
this.append(' then ');
|
|
953
|
+
this.visitNode(node.result);
|
|
954
|
+
}
|
|
955
|
+
}
|
|
929
956
|
append(str) {
|
|
930
957
|
this.#sql += str;
|
|
931
958
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { AlterColumnNode } from '../operation-node/alter-column-node.js';
|
|
2
|
-
import { ColumnDataType } from '../operation-node/data-type-node.js';
|
|
3
2
|
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
3
|
+
import { DataTypeExpression } from '../parser/data-type-parser.js';
|
|
4
4
|
import { DefaultValueExpression } from '../parser/default-value-parser.js';
|
|
5
5
|
export declare class AlterColumnBuilder {
|
|
6
6
|
protected readonly alterColumnNode: AlterColumnNode;
|
|
7
7
|
constructor(alterColumnNode: AlterColumnNode);
|
|
8
|
-
setDataType(dataType:
|
|
8
|
+
setDataType(dataType: DataTypeExpression): AlteredColumnBuilder;
|
|
9
9
|
setDefault(value: DefaultValueExpression): AlteredColumnBuilder;
|
|
10
10
|
dropDefault(): AlteredColumnBuilder;
|
|
11
11
|
setNotNull(): AlteredColumnBuilder;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="./alter-column-builder.d.ts" />
|
|
2
2
|
import { AlterColumnNode } from '../operation-node/alter-column-node.js';
|
|
3
|
-
import {
|
|
3
|
+
import { parseDataTypeExpression, } from '../parser/data-type-parser.js';
|
|
4
4
|
import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
|
|
5
5
|
export class AlterColumnBuilder {
|
|
6
6
|
alterColumnNode;
|
|
@@ -9,7 +9,7 @@ export class AlterColumnBuilder {
|
|
|
9
9
|
}
|
|
10
10
|
setDataType(dataType) {
|
|
11
11
|
return new AlteredColumnBuilder(AlterColumnNode.cloneWith(this.alterColumnNode, {
|
|
12
|
-
dataType:
|
|
12
|
+
dataType: parseDataTypeExpression(dataType),
|
|
13
13
|
}));
|
|
14
14
|
}
|
|
15
15
|
setDefault(value) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CreateIndexNode, IndexType } from '../operation-node/create-index-node.js';
|
|
2
2
|
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
3
|
+
import { ExtractColumnNameFromOrderedColumnName, OrderedColumnName } from '../parser/reference-parser.js';
|
|
3
4
|
import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
4
5
|
import { Compilable } from '../util/compilable.js';
|
|
5
6
|
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
@@ -7,7 +8,7 @@ import { QueryId } from '../util/query-id.js';
|
|
|
7
8
|
import { Expression } from '../expression/expression.js';
|
|
8
9
|
import { ComparisonOperatorExpression } from '../parser/binary-operation-parser.js';
|
|
9
10
|
import { ExpressionBuilder } from '../expression/expression-builder.js';
|
|
10
|
-
import { SqlBool } from '../util/type-utils.js';
|
|
11
|
+
import { ShallowRecord, SqlBool } from '../util/type-utils.js';
|
|
11
12
|
export declare class CreateIndexBuilder<C = never> implements OperationNodeSource, Compilable {
|
|
12
13
|
#private;
|
|
13
14
|
constructor(props: CreateIndexBuilderProps);
|
|
@@ -26,17 +27,52 @@ export declare class CreateIndexBuilder<C = never> implements OperationNodeSourc
|
|
|
26
27
|
*/
|
|
27
28
|
on(table: string): CreateIndexBuilder<C>;
|
|
28
29
|
/**
|
|
29
|
-
*
|
|
30
|
+
* Adds a column to the index.
|
|
30
31
|
*
|
|
31
|
-
* Also see
|
|
32
|
+
* Also see {@link columns} for adding multiple columns at once or {@link expression}
|
|
33
|
+
* for specifying an arbitrary expression.
|
|
34
|
+
*
|
|
35
|
+
* ### Examples
|
|
36
|
+
*
|
|
37
|
+
* ```ts
|
|
38
|
+
* await db.schema
|
|
39
|
+
* .createIndex('person_first_name_and_age_index')
|
|
40
|
+
* .on('person')
|
|
41
|
+
* .column('first_name')
|
|
42
|
+
* .column('age desc')
|
|
43
|
+
* .execute()
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* The generated SQL (PostgreSQL):
|
|
47
|
+
*
|
|
48
|
+
* ```sql
|
|
49
|
+
* create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
|
|
50
|
+
* ```
|
|
32
51
|
*/
|
|
33
|
-
column<CL extends string>(column: CL): CreateIndexBuilder<C | CL
|
|
52
|
+
column<CL extends string>(column: OrderedColumnName<CL>): CreateIndexBuilder<C | ExtractColumnNameFromOrderedColumnName<CL>>;
|
|
34
53
|
/**
|
|
35
54
|
* Specifies a list of columns for the index.
|
|
36
55
|
*
|
|
37
|
-
* Also see
|
|
56
|
+
* Also see {@link column} for adding a single column or {@link expression} for
|
|
57
|
+
* specifying an arbitrary expression.
|
|
58
|
+
*
|
|
59
|
+
* ### Examples
|
|
60
|
+
*
|
|
61
|
+
* ```ts
|
|
62
|
+
* await db.schema
|
|
63
|
+
* .createIndex('person_first_name_and_age_index')
|
|
64
|
+
* .on('person')
|
|
65
|
+
* .columns(['first_name', 'age desc'])
|
|
66
|
+
* .execute()
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* The generated SQL (PostgreSQL):
|
|
70
|
+
*
|
|
71
|
+
* ```sql
|
|
72
|
+
* create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
|
|
73
|
+
* ```
|
|
38
74
|
*/
|
|
39
|
-
columns<CL extends string>(columns: CL[]): CreateIndexBuilder<C | CL
|
|
75
|
+
columns<CL extends string>(columns: OrderedColumnName<CL>[]): CreateIndexBuilder<C | ExtractColumnNameFromOrderedColumnName<CL>>;
|
|
40
76
|
/**
|
|
41
77
|
* Specifies an arbitrary expression for the index.
|
|
42
78
|
*
|
|
@@ -51,6 +87,12 @@ export declare class CreateIndexBuilder<C = never> implements OperationNodeSourc
|
|
|
51
87
|
* .expression(sql`first_name COLLATE "fi_FI"`)
|
|
52
88
|
* .execute()
|
|
53
89
|
* ```
|
|
90
|
+
*
|
|
91
|
+
* The generated SQL (PostgreSQL):
|
|
92
|
+
*
|
|
93
|
+
* ```sql
|
|
94
|
+
* create index "person_first_name_index" on "person" (first_name COLLATE "fi_FI")
|
|
95
|
+
* ```
|
|
54
96
|
*/
|
|
55
97
|
expression(expression: Expression<any>): CreateIndexBuilder<C>;
|
|
56
98
|
/**
|
|
@@ -90,7 +132,7 @@ export declare class CreateIndexBuilder<C = never> implements OperationNodeSourc
|
|
|
90
132
|
* Parameters are always sent as literals due to database restrictions.
|
|
91
133
|
*/
|
|
92
134
|
where(lhs: C | Expression<any>, op: ComparisonOperatorExpression, rhs: unknown): CreateIndexBuilder<C>;
|
|
93
|
-
where(factory: (qb: ExpressionBuilder<
|
|
135
|
+
where(factory: (qb: ExpressionBuilder<ShallowRecord<string, ShallowRecord<C & string, any>>, string>) => Expression<SqlBool>): CreateIndexBuilder<C>;
|
|
94
136
|
where(expression: Expression<any>): CreateIndexBuilder<C>;
|
|
95
137
|
/**
|
|
96
138
|
* Simply calls the provided function passing `this` as the only argument. `$call` returns
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/// <reference types="./create-index-builder.d.ts" />
|
|
2
2
|
import { CreateIndexNode, } from '../operation-node/create-index-node.js';
|
|
3
|
-
import { ListNode } from '../operation-node/list-node.js';
|
|
4
3
|
import { RawNode } from '../operation-node/raw-node.js';
|
|
5
|
-
import {
|
|
4
|
+
import { parseOrderedColumnName, } from '../parser/reference-parser.js';
|
|
6
5
|
import { parseTable } from '../parser/table-parser.js';
|
|
7
6
|
import { preventAwait } from '../util/prevent-await.js';
|
|
8
7
|
import { freeze } from '../util/object-utils.js';
|
|
@@ -50,29 +49,62 @@ export class CreateIndexBuilder {
|
|
|
50
49
|
});
|
|
51
50
|
}
|
|
52
51
|
/**
|
|
53
|
-
*
|
|
52
|
+
* Adds a column to the index.
|
|
54
53
|
*
|
|
55
|
-
* Also see
|
|
54
|
+
* Also see {@link columns} for adding multiple columns at once or {@link expression}
|
|
55
|
+
* for specifying an arbitrary expression.
|
|
56
|
+
*
|
|
57
|
+
* ### Examples
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* await db.schema
|
|
61
|
+
* .createIndex('person_first_name_and_age_index')
|
|
62
|
+
* .on('person')
|
|
63
|
+
* .column('first_name')
|
|
64
|
+
* .column('age desc')
|
|
65
|
+
* .execute()
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* The generated SQL (PostgreSQL):
|
|
69
|
+
*
|
|
70
|
+
* ```sql
|
|
71
|
+
* create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
|
|
72
|
+
* ```
|
|
56
73
|
*/
|
|
57
74
|
column(column) {
|
|
58
75
|
return new CreateIndexBuilder({
|
|
59
76
|
...this.#props,
|
|
60
|
-
node: CreateIndexNode.
|
|
61
|
-
|
|
62
|
-
|
|
77
|
+
node: CreateIndexNode.cloneWithColumns(this.#props.node, [
|
|
78
|
+
parseOrderedColumnName(column),
|
|
79
|
+
]),
|
|
63
80
|
});
|
|
64
81
|
}
|
|
65
82
|
/**
|
|
66
83
|
* Specifies a list of columns for the index.
|
|
67
84
|
*
|
|
68
|
-
* Also see
|
|
85
|
+
* Also see {@link column} for adding a single column or {@link expression} for
|
|
86
|
+
* specifying an arbitrary expression.
|
|
87
|
+
*
|
|
88
|
+
* ### Examples
|
|
89
|
+
*
|
|
90
|
+
* ```ts
|
|
91
|
+
* await db.schema
|
|
92
|
+
* .createIndex('person_first_name_and_age_index')
|
|
93
|
+
* .on('person')
|
|
94
|
+
* .columns(['first_name', 'age desc'])
|
|
95
|
+
* .execute()
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* The generated SQL (PostgreSQL):
|
|
99
|
+
*
|
|
100
|
+
* ```sql
|
|
101
|
+
* create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
|
|
102
|
+
* ```
|
|
69
103
|
*/
|
|
70
104
|
columns(columns) {
|
|
71
105
|
return new CreateIndexBuilder({
|
|
72
106
|
...this.#props,
|
|
73
|
-
node: CreateIndexNode.
|
|
74
|
-
expression: ListNode.create(columns.map(parseColumnName)),
|
|
75
|
-
}),
|
|
107
|
+
node: CreateIndexNode.cloneWithColumns(this.#props.node, columns.map(parseOrderedColumnName)),
|
|
76
108
|
});
|
|
77
109
|
}
|
|
78
110
|
/**
|
|
@@ -89,13 +121,19 @@ export class CreateIndexBuilder {
|
|
|
89
121
|
* .expression(sql`first_name COLLATE "fi_FI"`)
|
|
90
122
|
* .execute()
|
|
91
123
|
* ```
|
|
124
|
+
*
|
|
125
|
+
* The generated SQL (PostgreSQL):
|
|
126
|
+
*
|
|
127
|
+
* ```sql
|
|
128
|
+
* create index "person_first_name_index" on "person" (first_name COLLATE "fi_FI")
|
|
129
|
+
* ```
|
|
92
130
|
*/
|
|
93
131
|
expression(expression) {
|
|
94
132
|
return new CreateIndexBuilder({
|
|
95
133
|
...this.#props,
|
|
96
|
-
node: CreateIndexNode.
|
|
97
|
-
expression
|
|
98
|
-
|
|
134
|
+
node: CreateIndexNode.cloneWithColumns(this.#props.node, [
|
|
135
|
+
expression.toOperationNode(),
|
|
136
|
+
]),
|
|
99
137
|
});
|
|
100
138
|
}
|
|
101
139
|
using(indexType) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DrainOuterGeneric } from './type-utils.js';
|
|
1
2
|
/**
|
|
2
3
|
* This type can be used to specify a different type for
|
|
3
4
|
* select, insert and update operations.
|
|
@@ -118,9 +119,9 @@ export declare type UpdateKeys<R> = {
|
|
|
118
119
|
* // }
|
|
119
120
|
* ```
|
|
120
121
|
*/
|
|
121
|
-
export declare type Selectable<R> = {
|
|
122
|
+
export declare type Selectable<R> = DrainOuterGeneric<{
|
|
122
123
|
[K in NonNeverSelectKeys<R>]: SelectType<R[K]>;
|
|
123
|
-
}
|
|
124
|
+
}>;
|
|
124
125
|
/**
|
|
125
126
|
* Given a table interface, extracts the insert type from all
|
|
126
127
|
* {@link ColumnType} types.
|
package/dist/esm/util/log.d.ts
CHANGED
|
@@ -14,12 +14,12 @@ export interface ErrorLogEvent {
|
|
|
14
14
|
readonly queryDurationMillis: number;
|
|
15
15
|
}
|
|
16
16
|
export declare type LogEvent = QueryLogEvent | ErrorLogEvent;
|
|
17
|
-
export declare type Logger = (event: LogEvent) => void
|
|
17
|
+
export declare type Logger = (event: LogEvent) => void | Promise<void>;
|
|
18
18
|
export declare type LogConfig = ReadonlyArray<LogLevel> | Logger;
|
|
19
19
|
export declare class Log {
|
|
20
20
|
#private;
|
|
21
21
|
constructor(config: LogConfig);
|
|
22
22
|
isLevelEnabled(level: LogLevel): boolean;
|
|
23
|
-
query(getEvent: () => QueryLogEvent): void
|
|
24
|
-
error(getEvent: () => ErrorLogEvent): void
|
|
23
|
+
query(getEvent: () => QueryLogEvent): Promise<void>;
|
|
24
|
+
error(getEvent: () => ErrorLogEvent): Promise<void>;
|
|
25
25
|
}
|
package/dist/esm/util/log.js
CHANGED
|
@@ -23,14 +23,14 @@ export class Log {
|
|
|
23
23
|
isLevelEnabled(level) {
|
|
24
24
|
return this.#levels[level];
|
|
25
25
|
}
|
|
26
|
-
query(getEvent) {
|
|
26
|
+
async query(getEvent) {
|
|
27
27
|
if (this.#levels.query) {
|
|
28
|
-
this.#logger(getEvent());
|
|
28
|
+
await this.#logger(getEvent());
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
-
error(getEvent) {
|
|
31
|
+
async error(getEvent) {
|
|
32
32
|
if (this.#levels.error) {
|
|
33
|
-
this.#logger(getEvent());
|
|
33
|
+
await this.#logger(getEvent());
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ShallowRecord } from './type-utils.js';
|
|
1
2
|
export declare function isEmpty(obj: ArrayLike<unknown> | string | object): boolean;
|
|
2
3
|
export declare function isUndefined(obj: unknown): obj is undefined;
|
|
3
4
|
export declare function isString(obj: unknown): obj is string;
|
|
@@ -10,7 +11,7 @@ export declare function isBuffer(obj: unknown): obj is {
|
|
|
10
11
|
length: number;
|
|
11
12
|
};
|
|
12
13
|
export declare function isFunction(obj: unknown): obj is Function;
|
|
13
|
-
export declare function isObject(obj: unknown): obj is
|
|
14
|
+
export declare function isObject(obj: unknown): obj is ShallowRecord<string, unknown>;
|
|
14
15
|
export declare function isArrayBufferOrView(obj: unknown): obj is ArrayBuffer | ArrayBufferView;
|
|
15
16
|
export declare function getLast<T>(arr: ArrayLike<T>): T | undefined;
|
|
16
17
|
export declare function freeze<T>(obj: T): Readonly<T>;
|