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 {};
|
|
@@ -217,6 +217,53 @@ class UpdateQueryBuilder {
|
|
|
217
217
|
castTo() {
|
|
218
218
|
return this.$castTo();
|
|
219
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* Narrows (parts of) the output type of the query.
|
|
222
|
+
*
|
|
223
|
+
* Kysely tries to be as type-safe as possible, but in some cases we have to make
|
|
224
|
+
* compromises for better maintainability and compilation performance. At present,
|
|
225
|
+
* Kysely doesn't narrow the output type of the query based on {@link set} input
|
|
226
|
+
* when using {@link where} and/or {@link returning} or {@link returningAll}.
|
|
227
|
+
*
|
|
228
|
+
* This utility method is very useful for these situations, as it removes unncessary
|
|
229
|
+
* runtime assertion/guard code. Its input type is limited to the output type
|
|
230
|
+
* of the query, so you can't add a column that doesn't exist, or change a column's
|
|
231
|
+
* type to something that doesn't exist in its union type.
|
|
232
|
+
*
|
|
233
|
+
* ### Examples
|
|
234
|
+
*
|
|
235
|
+
* Turn this code:
|
|
236
|
+
*
|
|
237
|
+
* ```ts
|
|
238
|
+
* const person = await db.updateTable('person')
|
|
239
|
+
* .set({ deletedAt: now })
|
|
240
|
+
* .where('id', '=', id)
|
|
241
|
+
* .where('nullable_column', 'is not', null)
|
|
242
|
+
* .returningAll()
|
|
243
|
+
* .executeTakeFirstOrThrow()
|
|
244
|
+
*
|
|
245
|
+
* if (person.nullable_column) {
|
|
246
|
+
* functionThatExpectsPersonWithNonNullValue(person)
|
|
247
|
+
* }
|
|
248
|
+
* ```
|
|
249
|
+
*
|
|
250
|
+
* Into this:
|
|
251
|
+
*
|
|
252
|
+
* ```ts
|
|
253
|
+
* const person = await db.updateTable('person')
|
|
254
|
+
* .set({ deletedAt: now })
|
|
255
|
+
* .where('id', '=', id)
|
|
256
|
+
* .where('nullable_column', 'is not', null)
|
|
257
|
+
* .returningAll()
|
|
258
|
+
* .$narrowType<{ deletedAt: Date; nullable_column: string }>()
|
|
259
|
+
* .executeTakeFirstOrThrow()
|
|
260
|
+
*
|
|
261
|
+
* functionThatExpectsPersonWithNonNullValue(person)
|
|
262
|
+
* ```
|
|
263
|
+
*/
|
|
264
|
+
$narrowType() {
|
|
265
|
+
return new UpdateQueryBuilder(this.#props);
|
|
266
|
+
}
|
|
220
267
|
/**
|
|
221
268
|
* Asserts that query's output row type equals the given type `T`.
|
|
222
269
|
*
|
|
@@ -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;
|
|
@@ -548,9 +548,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
548
548
|
this.append(' using ');
|
|
549
549
|
this.visitNode(node.using);
|
|
550
550
|
}
|
|
551
|
-
if (node.
|
|
551
|
+
if (node.columns) {
|
|
552
552
|
this.append(' (');
|
|
553
|
-
this.
|
|
553
|
+
this.compileList(node.columns);
|
|
554
554
|
this.append(')');
|
|
555
555
|
}
|
|
556
556
|
if (node.where) {
|
|
@@ -869,7 +869,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
869
869
|
if (node.distinct) {
|
|
870
870
|
this.append('distinct ');
|
|
871
871
|
}
|
|
872
|
-
this.
|
|
872
|
+
this.compileList(node.aggregated);
|
|
873
873
|
this.append(')');
|
|
874
874
|
if (node.filter) {
|
|
875
875
|
this.append(' filter(');
|
|
@@ -928,6 +928,33 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
928
928
|
this.compileList(node.arguments);
|
|
929
929
|
this.append(')');
|
|
930
930
|
}
|
|
931
|
+
visitCase(node) {
|
|
932
|
+
this.append('case');
|
|
933
|
+
if (node.value) {
|
|
934
|
+
this.append(' ');
|
|
935
|
+
this.visitNode(node.value);
|
|
936
|
+
}
|
|
937
|
+
if (node.when) {
|
|
938
|
+
this.append(' ');
|
|
939
|
+
this.compileList(node.when, ' ');
|
|
940
|
+
}
|
|
941
|
+
if (node.else) {
|
|
942
|
+
this.append(' else ');
|
|
943
|
+
this.visitNode(node.else);
|
|
944
|
+
}
|
|
945
|
+
this.append(' end');
|
|
946
|
+
if (node.isStatement) {
|
|
947
|
+
this.append(' case');
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
visitWhen(node) {
|
|
951
|
+
this.append('when ');
|
|
952
|
+
this.visitNode(node.condition);
|
|
953
|
+
if (node.result) {
|
|
954
|
+
this.append(' then ');
|
|
955
|
+
this.visitNode(node.result);
|
|
956
|
+
}
|
|
957
|
+
}
|
|
931
958
|
append(str) {
|
|
932
959
|
this.#sql += str;
|
|
933
960
|
}
|
|
@@ -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;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AlteredColumnBuilder = exports.AlterColumnBuilder = void 0;
|
|
4
4
|
const alter_column_node_js_1 = require("../operation-node/alter-column-node.js");
|
|
5
|
-
const
|
|
5
|
+
const data_type_parser_js_1 = require("../parser/data-type-parser.js");
|
|
6
6
|
const default_value_parser_js_1 = require("../parser/default-value-parser.js");
|
|
7
7
|
class AlterColumnBuilder {
|
|
8
8
|
alterColumnNode;
|
|
@@ -11,7 +11,7 @@ class AlterColumnBuilder {
|
|
|
11
11
|
}
|
|
12
12
|
setDataType(dataType) {
|
|
13
13
|
return new AlteredColumnBuilder(alter_column_node_js_1.AlterColumnNode.cloneWith(this.alterColumnNode, {
|
|
14
|
-
dataType:
|
|
14
|
+
dataType: (0, data_type_parser_js_1.parseDataTypeExpression)(dataType),
|
|
15
15
|
}));
|
|
16
16
|
}
|
|
17
17
|
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
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CreateIndexBuilder = void 0;
|
|
4
4
|
const create_index_node_js_1 = require("../operation-node/create-index-node.js");
|
|
5
|
-
const list_node_js_1 = require("../operation-node/list-node.js");
|
|
6
5
|
const raw_node_js_1 = require("../operation-node/raw-node.js");
|
|
7
6
|
const reference_parser_js_1 = require("../parser/reference-parser.js");
|
|
8
7
|
const table_parser_js_1 = require("../parser/table-parser.js");
|
|
@@ -52,29 +51,62 @@ class CreateIndexBuilder {
|
|
|
52
51
|
});
|
|
53
52
|
}
|
|
54
53
|
/**
|
|
55
|
-
*
|
|
54
|
+
* Adds a column to the index.
|
|
56
55
|
*
|
|
57
|
-
* Also see
|
|
56
|
+
* Also see {@link columns} for adding multiple columns at once or {@link expression}
|
|
57
|
+
* for 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
|
+
* .column('first_name')
|
|
66
|
+
* .column('age desc')
|
|
67
|
+
* .execute()
|
|
68
|
+
* ```
|
|
69
|
+
*
|
|
70
|
+
* The generated SQL (PostgreSQL):
|
|
71
|
+
*
|
|
72
|
+
* ```sql
|
|
73
|
+
* create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
|
|
74
|
+
* ```
|
|
58
75
|
*/
|
|
59
76
|
column(column) {
|
|
60
77
|
return new CreateIndexBuilder({
|
|
61
78
|
...this.#props,
|
|
62
|
-
node: create_index_node_js_1.CreateIndexNode.
|
|
63
|
-
|
|
64
|
-
|
|
79
|
+
node: create_index_node_js_1.CreateIndexNode.cloneWithColumns(this.#props.node, [
|
|
80
|
+
(0, reference_parser_js_1.parseOrderedColumnName)(column),
|
|
81
|
+
]),
|
|
65
82
|
});
|
|
66
83
|
}
|
|
67
84
|
/**
|
|
68
85
|
* Specifies a list of columns for the index.
|
|
69
86
|
*
|
|
70
|
-
* Also see
|
|
87
|
+
* Also see {@link column} for adding a single column or {@link expression} for
|
|
88
|
+
* specifying an arbitrary expression.
|
|
89
|
+
*
|
|
90
|
+
* ### Examples
|
|
91
|
+
*
|
|
92
|
+
* ```ts
|
|
93
|
+
* await db.schema
|
|
94
|
+
* .createIndex('person_first_name_and_age_index')
|
|
95
|
+
* .on('person')
|
|
96
|
+
* .columns(['first_name', 'age desc'])
|
|
97
|
+
* .execute()
|
|
98
|
+
* ```
|
|
99
|
+
*
|
|
100
|
+
* The generated SQL (PostgreSQL):
|
|
101
|
+
*
|
|
102
|
+
* ```sql
|
|
103
|
+
* create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
|
|
104
|
+
* ```
|
|
71
105
|
*/
|
|
72
106
|
columns(columns) {
|
|
73
107
|
return new CreateIndexBuilder({
|
|
74
108
|
...this.#props,
|
|
75
|
-
node: create_index_node_js_1.CreateIndexNode.
|
|
76
|
-
expression: list_node_js_1.ListNode.create(columns.map(reference_parser_js_1.parseColumnName)),
|
|
77
|
-
}),
|
|
109
|
+
node: create_index_node_js_1.CreateIndexNode.cloneWithColumns(this.#props.node, columns.map(reference_parser_js_1.parseOrderedColumnName)),
|
|
78
110
|
});
|
|
79
111
|
}
|
|
80
112
|
/**
|
|
@@ -91,13 +123,19 @@ class CreateIndexBuilder {
|
|
|
91
123
|
* .expression(sql`first_name COLLATE "fi_FI"`)
|
|
92
124
|
* .execute()
|
|
93
125
|
* ```
|
|
126
|
+
*
|
|
127
|
+
* The generated SQL (PostgreSQL):
|
|
128
|
+
*
|
|
129
|
+
* ```sql
|
|
130
|
+
* create index "person_first_name_index" on "person" (first_name COLLATE "fi_FI")
|
|
131
|
+
* ```
|
|
94
132
|
*/
|
|
95
133
|
expression(expression) {
|
|
96
134
|
return new CreateIndexBuilder({
|
|
97
135
|
...this.#props,
|
|
98
|
-
node: create_index_node_js_1.CreateIndexNode.
|
|
99
|
-
expression
|
|
100
|
-
|
|
136
|
+
node: create_index_node_js_1.CreateIndexNode.cloneWithColumns(this.#props.node, [
|
|
137
|
+
expression.toOperationNode(),
|
|
138
|
+
]),
|
|
101
139
|
});
|
|
102
140
|
}
|
|
103
141
|
using(indexType) {
|
|
@@ -202,7 +202,7 @@ class SchemaModule {
|
|
|
202
202
|
return new alter_table_builder_js_1.AlterTableBuilder({
|
|
203
203
|
queryId: (0, query_id_js_1.createQueryId)(),
|
|
204
204
|
executor: this.#executor,
|
|
205
|
-
node: alter_table_node_js_1.AlterTableNode.create(table),
|
|
205
|
+
node: alter_table_node_js_1.AlterTableNode.create((0, table_parser_js_1.parseTable)(table)),
|
|
206
206
|
});
|
|
207
207
|
}
|
|
208
208
|
/**
|
|
@@ -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/cjs/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/cjs/util/log.js
CHANGED
|
@@ -25,14 +25,14 @@ class Log {
|
|
|
25
25
|
isLevelEnabled(level) {
|
|
26
26
|
return this.#levels[level];
|
|
27
27
|
}
|
|
28
|
-
query(getEvent) {
|
|
28
|
+
async query(getEvent) {
|
|
29
29
|
if (this.#levels.query) {
|
|
30
|
-
this.#logger(getEvent());
|
|
30
|
+
await this.#logger(getEvent());
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
error(getEvent) {
|
|
33
|
+
async error(getEvent) {
|
|
34
34
|
if (this.#levels.error) {
|
|
35
|
-
this.#logger(getEvent());
|
|
35
|
+
await this.#logger(getEvent());
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -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>;
|