kysely 0.16.3 → 0.16.7

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.
Files changed (150) hide show
  1. package/README.md +122 -9
  2. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +205 -0
  3. package/dist/cjs/dialect/mysql/mysql-dialect-config.js +2 -0
  4. package/dist/cjs/dialect/mysql/mysql-dialect.d.ts +1 -205
  5. package/dist/cjs/dialect/mysql/mysql-dialect.js +2 -1
  6. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +1 -1
  7. package/dist/cjs/dialect/mysql/mysql-driver.js +11 -3
  8. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +103 -0
  9. package/dist/cjs/dialect/postgres/postgres-dialect-config.js +2 -0
  10. package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +1 -103
  11. package/dist/cjs/dialect/postgres/postgres-dialect.js +2 -1
  12. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +1 -1
  13. package/dist/cjs/dialect/postgres/postgres-driver.js +12 -3
  14. package/dist/cjs/dialect/sqlite/sqlite-dialect-config.d.ts +43 -0
  15. package/dist/cjs/dialect/sqlite/sqlite-dialect-config.js +2 -0
  16. package/dist/cjs/dialect/sqlite/sqlite-dialect.d.ts +1 -43
  17. package/dist/cjs/dialect/sqlite/sqlite-dialect.js +2 -1
  18. package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +1 -1
  19. package/dist/cjs/dialect/sqlite/sqlite-driver.js +11 -3
  20. package/dist/cjs/driver/dummy-driver.d.ts +68 -0
  21. package/dist/cjs/driver/dummy-driver.js +62 -0
  22. package/dist/cjs/driver/runtime-driver.d.ts +1 -1
  23. package/dist/cjs/driver/runtime-driver.js +30 -33
  24. package/dist/cjs/index-nodeless.d.ts +2 -0
  25. package/dist/cjs/index-nodeless.js +2 -0
  26. package/dist/cjs/index.d.ts +3 -0
  27. package/dist/cjs/index.js +3 -0
  28. package/dist/cjs/kysely.d.ts +8 -6
  29. package/dist/cjs/kysely.js +8 -6
  30. package/dist/cjs/migration/migrator.d.ts +2 -2
  31. package/dist/cjs/operation-node/primitive-value-list-node.d.ts +2 -3
  32. package/dist/cjs/operation-node/value-node.d.ts +3 -4
  33. package/dist/cjs/parser/complex-expression-parser.d.ts +1 -0
  34. package/dist/cjs/parser/complex-expression-parser.js +5 -1
  35. package/dist/cjs/parser/default-value-parser.d.ts +2 -3
  36. package/dist/cjs/parser/default-value-parser.js +2 -2
  37. package/dist/cjs/parser/insert-values-parser.js +4 -3
  38. package/dist/cjs/parser/reference-parser.d.ts +2 -3
  39. package/dist/cjs/parser/value-parser.d.ts +2 -3
  40. package/dist/cjs/parser/value-parser.js +6 -7
  41. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +48 -0
  42. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +19 -0
  43. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +9 -0
  44. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +42 -0
  45. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.d.ts +0 -0
  46. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.js +0 -0
  47. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.d.ts +0 -0
  48. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.js +0 -0
  49. package/dist/cjs/query-builder/delete-query-builder.d.ts +51 -9
  50. package/dist/cjs/query-builder/delete-query-builder.js +56 -8
  51. package/dist/cjs/query-builder/expression-builder.d.ts +1 -1
  52. package/dist/cjs/query-builder/expression-builder.js +2 -2
  53. package/dist/cjs/query-builder/function-builder.d.ts +29 -5
  54. package/dist/cjs/query-builder/function-builder.js +31 -7
  55. package/dist/cjs/query-builder/insert-query-builder.d.ts +53 -11
  56. package/dist/cjs/query-builder/insert-query-builder.js +58 -10
  57. package/dist/cjs/query-builder/select-query-builder.d.ts +58 -16
  58. package/dist/cjs/query-builder/select-query-builder.js +64 -15
  59. package/dist/cjs/query-builder/update-query-builder.d.ts +52 -9
  60. package/dist/cjs/query-builder/update-query-builder.js +57 -8
  61. package/dist/cjs/query-compiler/default-query-compiler.d.ts +1 -2
  62. package/dist/cjs/query-creator.d.ts +2 -2
  63. package/dist/cjs/query-creator.js +2 -2
  64. package/dist/cjs/schema/alter-table-builder.d.ts +30 -4
  65. package/dist/cjs/schema/alter-table-builder.js +2 -5
  66. package/dist/cjs/schema/column-definition-builder.d.ts +27 -2
  67. package/dist/cjs/schema/create-view-builder.js +1 -1
  68. package/dist/cjs/util/log.d.ts +1 -0
  69. package/dist/cjs/util/log.js +3 -0
  70. package/dist/cjs/util/object-utils.d.ts +5 -5
  71. package/dist/cjs/util/object-utils.js +52 -11
  72. package/dist/cjs/util/type-utils.d.ts +21 -0
  73. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +205 -0
  74. package/dist/esm/dialect/mysql/mysql-dialect-config.js +2 -0
  75. package/dist/esm/dialect/mysql/mysql-dialect.d.ts +1 -205
  76. package/dist/esm/dialect/mysql/mysql-dialect.js +2 -1
  77. package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -1
  78. package/dist/esm/dialect/mysql/mysql-driver.js +12 -4
  79. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +103 -0
  80. package/dist/esm/dialect/postgres/postgres-dialect-config.js +2 -0
  81. package/dist/esm/dialect/postgres/postgres-dialect.d.ts +1 -103
  82. package/dist/esm/dialect/postgres/postgres-dialect.js +2 -1
  83. package/dist/esm/dialect/postgres/postgres-driver.d.ts +1 -1
  84. package/dist/esm/dialect/postgres/postgres-driver.js +12 -3
  85. package/dist/esm/dialect/sqlite/sqlite-dialect-config.d.ts +43 -0
  86. package/dist/esm/dialect/sqlite/sqlite-dialect-config.js +2 -0
  87. package/dist/esm/dialect/sqlite/sqlite-dialect.d.ts +1 -43
  88. package/dist/esm/dialect/sqlite/sqlite-dialect.js +2 -1
  89. package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +1 -1
  90. package/dist/esm/dialect/sqlite/sqlite-driver.js +12 -4
  91. package/dist/esm/driver/dummy-driver.d.ts +68 -0
  92. package/dist/esm/driver/dummy-driver.js +59 -0
  93. package/dist/esm/driver/runtime-driver.d.ts +1 -1
  94. package/dist/esm/driver/runtime-driver.js +29 -32
  95. package/dist/esm/index-nodeless.d.ts +2 -0
  96. package/dist/esm/index-nodeless.js +2 -0
  97. package/dist/esm/index.d.ts +3 -0
  98. package/dist/esm/index.js +3 -0
  99. package/dist/esm/kysely.d.ts +8 -6
  100. package/dist/esm/kysely.js +8 -6
  101. package/dist/esm/migration/migrator.d.ts +2 -2
  102. package/dist/esm/operation-node/primitive-value-list-node.d.ts +2 -3
  103. package/dist/esm/operation-node/value-node.d.ts +3 -4
  104. package/dist/esm/parser/complex-expression-parser.d.ts +1 -0
  105. package/dist/esm/parser/complex-expression-parser.js +3 -0
  106. package/dist/esm/parser/default-value-parser.d.ts +2 -3
  107. package/dist/esm/parser/default-value-parser.js +2 -2
  108. package/dist/esm/parser/insert-values-parser.js +5 -4
  109. package/dist/esm/parser/reference-parser.d.ts +2 -3
  110. package/dist/esm/parser/reference-parser.js +1 -1
  111. package/dist/esm/parser/value-parser.d.ts +2 -3
  112. package/dist/esm/parser/value-parser.js +8 -9
  113. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +48 -0
  114. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +16 -0
  115. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +9 -0
  116. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +39 -0
  117. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.d.ts +0 -0
  118. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.js +0 -0
  119. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.d.ts +0 -0
  120. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.js +0 -0
  121. package/dist/esm/query-builder/delete-query-builder.d.ts +51 -9
  122. package/dist/esm/query-builder/delete-query-builder.js +56 -8
  123. package/dist/esm/query-builder/expression-builder.d.ts +1 -1
  124. package/dist/esm/query-builder/expression-builder.js +1 -1
  125. package/dist/esm/query-builder/function-builder.d.ts +29 -5
  126. package/dist/esm/query-builder/function-builder.js +31 -7
  127. package/dist/esm/query-builder/insert-query-builder.d.ts +53 -11
  128. package/dist/esm/query-builder/insert-query-builder.js +58 -10
  129. package/dist/esm/query-builder/select-query-builder.d.ts +58 -16
  130. package/dist/esm/query-builder/select-query-builder.js +64 -15
  131. package/dist/esm/query-builder/update-query-builder.d.ts +52 -9
  132. package/dist/esm/query-builder/update-query-builder.js +57 -8
  133. package/dist/esm/query-compiler/default-query-compiler.d.ts +1 -2
  134. package/dist/esm/query-creator.d.ts +2 -2
  135. package/dist/esm/query-creator.js +2 -2
  136. package/dist/esm/schema/alter-table-builder.d.ts +30 -4
  137. package/dist/esm/schema/alter-table-builder.js +2 -5
  138. package/dist/esm/schema/column-definition-builder.d.ts +27 -2
  139. package/dist/esm/schema/create-view-builder.js +1 -1
  140. package/dist/esm/util/log.d.ts +1 -0
  141. package/dist/esm/util/log.js +3 -0
  142. package/dist/esm/util/object-utils.d.ts +5 -5
  143. package/dist/esm/util/object-utils.js +50 -9
  144. package/dist/esm/util/type-utils.d.ts +21 -0
  145. package/package.json +11 -5
  146. package/.prettierignore +0 -1
  147. package/dist/cjs/util/dynamic-import.d.ts +0 -2
  148. package/dist/cjs/util/dynamic-import.js +0 -32
  149. package/dist/esm/util/dynamic-import.d.ts +0 -2
  150. package/dist/esm/util/dynamic-import.js +0 -28
@@ -24,22 +24,24 @@ import { PRIVATE_ADAPTER } from './util/private-symbols.js';
24
24
  * This example assumes your database has tables `person` and `pet`:
25
25
  *
26
26
  * ```ts
27
- * interface Person {
28
- * id: number
27
+ * import { Kysely, Generated, PostgresDialect } from 'kysely'
28
+ *
29
+ * interface PersonTable {
30
+ * id: Generated<number>
29
31
  * first_name: string
30
32
  * last_name: string
31
33
  * }
32
34
  *
33
- * interface Pet {
34
- * id: number
35
+ * interface PetTable {
36
+ * id: Generated<number>
35
37
  * owner_id: number
36
38
  * name: string
37
39
  * species 'cat' | 'dog'
38
40
  * }
39
41
  *
40
42
  * interface Database {
41
- * person: Person,
42
- * pet: Pet
43
+ * person: PersonTable,
44
+ * pet: PetTable
43
45
  * }
44
46
  *
45
47
  * const db = new Kysely<Database>({
@@ -144,8 +144,8 @@ export interface MigratorProps {
144
144
  readonly provider: MigrationProvider;
145
145
  }
146
146
  /**
147
- * All migration methods ({@link MigrationModule.migrateTo | migrateTo},
148
- * {@link MigrationModule.migrateToLatest | migrateToLatest} etc.) never
147
+ * All migration methods ({@link Migrator.migrateTo | migrateTo},
148
+ * {@link Migrator.migrateToLatest | migrateToLatest} etc.) never
149
149
  * throw but return this object instead.
150
150
  */
151
151
  export interface MigrationResultSet {
@@ -1,4 +1,3 @@
1
- import { PrimitiveValue } from '../util/object-utils.js';
2
1
  import { OperationNode } from './operation-node.js';
3
2
  /**
4
3
  * This node is basically just a performance optimization over the normal ValueListNode.
@@ -7,12 +6,12 @@ import { OperationNode } from './operation-node.js';
7
6
  */
8
7
  export interface PrimitiveValueListNode extends OperationNode {
9
8
  readonly kind: 'PrimitiveValueListNode';
10
- readonly values: ReadonlyArray<PrimitiveValue>;
9
+ readonly values: ReadonlyArray<unknown>;
11
10
  }
12
11
  /**
13
12
  * @internal
14
13
  */
15
14
  export declare const PrimitiveValueListNode: Readonly<{
16
15
  is(node: OperationNode): node is PrimitiveValueListNode;
17
- create(values: ReadonlyArray<PrimitiveValue>): PrimitiveValueListNode;
16
+ create(values: ReadonlyArray<unknown>): PrimitiveValueListNode;
18
17
  }>;
@@ -1,8 +1,7 @@
1
- import { PrimitiveValue } from '../util/object-utils.js';
2
1
  import { OperationNode } from './operation-node.js';
3
2
  export interface ValueNode extends OperationNode {
4
3
  readonly kind: 'ValueNode';
5
- readonly value: PrimitiveValue;
4
+ readonly value: unknown;
6
5
  readonly immediate?: boolean;
7
6
  }
8
7
  /**
@@ -10,6 +9,6 @@ export interface ValueNode extends OperationNode {
10
9
  */
11
10
  export declare const ValueNode: Readonly<{
12
11
  is(node: OperationNode): node is ValueNode;
13
- create(value: PrimitiveValue): ValueNode;
14
- createImmediate(value: PrimitiveValue): ValueNode;
12
+ create(value: unknown): ValueNode;
13
+ createImmediate(value: unknown): ValueNode;
15
14
  }>;
@@ -7,3 +7,4 @@ export declare type ComplexExpression<DB, TB extends keyof DB> = AnySelectQueryB
7
7
  export declare type AliasedComplexExpression<DB, TB extends keyof DB> = AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB> | AnyAliasedRawBuilder | AliasedRawBuilderFactory<DB, TB>;
8
8
  export declare function parseComplexExpression(ctx: ParseContext, exp: ComplexExpression<any, any>): SelectQueryNode | RawNode;
9
9
  export declare function parseAliasedComplexExpression(ctx: ParseContext, exp: AliasedComplexExpression<any, any>): AliasNode;
10
+ export declare function isComplexExpression(obj: unknown): obj is ComplexExpression<any, any>;
@@ -19,3 +19,6 @@ export function parseAliasedComplexExpression(ctx, exp) {
19
19
  }
20
20
  throw new Error(`invalid aliased expression: ${JSON.stringify(exp)}`);
21
21
  }
22
+ export function isComplexExpression(obj) {
23
+ return isOperationNodeSource(obj) || isFunction(obj);
24
+ }
@@ -1,6 +1,5 @@
1
1
  import { RawNode } from '../operation-node/raw-node.js';
2
2
  import { ValueNode } from '../operation-node/value-node.js';
3
- import { AnyRawBuilder } from '../util/type-utils.js';
4
- import { PrimitiveValue } from '../util/object-utils.js';
5
- export declare type DefaultValueExpression = PrimitiveValue | AnyRawBuilder;
3
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
4
+ export declare type DefaultValueExpression = unknown | RawBuilder;
6
5
  export declare function parseDefaultValueExpression(value: DefaultValueExpression): ValueNode | RawNode;
@@ -1,8 +1,8 @@
1
1
  /// <reference types="./default-value-parser.d.ts" />
2
- import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
3
2
  import { ValueNode } from '../operation-node/value-node.js';
3
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
4
4
  export function parseDefaultValueExpression(value) {
5
- return isOperationNodeSource(value)
5
+ return value instanceof RawBuilder
6
6
  ? value.toOperationNode()
7
7
  : ValueNode.createImmediate(value);
8
8
  }
@@ -2,9 +2,10 @@
2
2
  import { ColumnNode } from '../operation-node/column-node.js';
3
3
  import { PrimitiveValueListNode } from '../operation-node/primitive-value-list-node.js';
4
4
  import { ValueListNode } from '../operation-node/value-list-node.js';
5
- import { freeze, isPrimitive } from '../util/object-utils.js';
5
+ import { freeze } from '../util/object-utils.js';
6
6
  import { parseValueExpression } from './value-parser.js';
7
7
  import { ValuesNode } from '../operation-node/values-node.js';
8
+ import { isComplexExpression } from './complex-expression-parser.js';
8
9
  export function parseInsertObjectOrList(ctx, args) {
9
10
  return parseInsertColumnsAndValues(ctx, Array.isArray(args) ? args : [args]);
10
11
  }
@@ -37,8 +38,8 @@ function parseRowValues(ctx, row, columns) {
37
38
  rowValues[columnIdx] = value;
38
39
  }
39
40
  }
40
- if (rowValues.every(isPrimitive)) {
41
- return PrimitiveValueListNode.create(rowValues);
41
+ if (rowValues.some(isComplexExpression)) {
42
+ return ValueListNode.create(rowValues.map((it) => parseValueExpression(ctx, it)));
42
43
  }
43
- return ValueListNode.create(rowValues.map((it) => parseValueExpression(ctx, it)));
44
+ return PrimitiveValueListNode.create(rowValues);
44
45
  }
@@ -2,7 +2,6 @@ import { AliasNode } from '../operation-node/alias-node.js';
2
2
  import { ColumnNode } from '../operation-node/column-node.js';
3
3
  import { ReferenceExpressionNode } from '../operation-node/operation-node-utils.js';
4
4
  import { ReferenceNode } from '../operation-node/reference-node.js';
5
- import { PrimitiveValue } from '../util/object-utils.js';
6
5
  import { AnyColumn, AnyColumnWithTable, ExtractColumnType, ValueType } from '../util/type-utils.js';
7
6
  import { RawBuilder } from '../raw-builder/raw-builder.js';
8
7
  import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
@@ -13,8 +12,8 @@ import { SelectType } from '../util/column-type.js';
13
12
  export declare type ReferenceExpression<DB, TB extends keyof DB> = StringReference<DB, TB> | DynamicReferenceBuilder<any> | ComplexExpression<DB, TB>;
14
13
  export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReadonlyArray<ReferenceExpression<DB, TB>>;
15
14
  export declare type StringReference<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB>;
16
- export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE> = RE extends string ? SelectType<ExtractTypeFromStringReference<DB, TB, RE>> : RE extends RawBuilder<infer O> ? O : RE extends (qb: any) => RawBuilder<infer O> ? O : RE extends SelectQueryBuilder<any, any, infer O> ? ValueType<O> : RE extends (qb: any) => SelectQueryBuilder<any, any, infer O> ? ValueType<O> : PrimitiveValue;
17
- declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, RE extends string> = RE extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : RE extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : RE extends AnyColumn<DB, TB> ? ExtractColumnType<DB, TB, RE> : PrimitiveValue;
15
+ export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE> = RE extends string ? SelectType<ExtractTypeFromStringReference<DB, TB, RE>> : RE extends RawBuilder<infer O> ? O : RE extends (qb: any) => RawBuilder<infer O> ? O : RE extends SelectQueryBuilder<any, any, infer O> ? ValueType<O> : RE extends (qb: any) => SelectQueryBuilder<any, any, infer O> ? ValueType<O> : unknown;
16
+ declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, RE extends string> = RE extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : RE extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : RE extends AnyColumn<DB, TB> ? ExtractColumnType<DB, TB, RE> : unknown;
18
17
  export declare function parseReferenceExpressionOrList(ctx: ParseContext, arg: ReferenceExpressionOrList<any, any>): ReferenceExpressionNode[];
19
18
  export declare function parseReferenceExpression(ctx: ParseContext, exp: ReferenceExpression<any, any>): ReferenceExpressionNode;
20
19
  export declare function parseStringReference(ref: string): ColumnNode | ReferenceNode;
@@ -3,7 +3,7 @@ import { AliasNode } from '../operation-node/alias-node.js';
3
3
  import { ColumnNode } from '../operation-node/column-node.js';
4
4
  import { ReferenceNode } from '../operation-node/reference-node.js';
5
5
  import { TableNode } from '../operation-node/table-node.js';
6
- import { isReadonlyArray, isString, } from '../util/object-utils.js';
6
+ import { isReadonlyArray, isString } from '../util/object-utils.js';
7
7
  import { parseComplexExpression, } from './complex-expression-parser.js';
8
8
  import { isDynamicReferenceBuilder, } from '../dynamic/dynamic-reference-builder.js';
9
9
  export function parseReferenceExpressionOrList(ctx, arg) {
@@ -1,11 +1,10 @@
1
1
  import { ValueExpressionNode } from '../operation-node/operation-node-utils.js';
2
2
  import { ValueNode } from '../operation-node/value-node.js';
3
- import { PrimitiveValue } from '../util/object-utils.js';
4
3
  import { ParseContext } from './parse-context.js';
5
4
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
6
5
  import { RawNode } from '../operation-node/raw-node.js';
7
6
  import { ComplexExpression } from './complex-expression-parser.js';
8
7
  export declare type ValueExpression<DB, TB extends keyof DB, V> = V | ComplexExpression<DB, TB>;
9
8
  export declare type ValueExpressionOrList<DB, TB extends keyof DB, V> = ValueExpression<DB, TB, V> | ReadonlyArray<ValueExpression<DB, TB, V>>;
10
- export declare function parseValueExpressionOrList(ctx: ParseContext, arg: ValueExpressionOrList<any, any, PrimitiveValue>): ValueExpressionNode;
11
- export declare function parseValueExpression(ctx: ParseContext, exp: ValueExpression<any, any, PrimitiveValue>): ValueNode | SelectQueryNode | RawNode;
9
+ export declare function parseValueExpressionOrList(ctx: ParseContext, arg: ValueExpressionOrList<any, any, unknown>): ValueExpressionNode;
10
+ export declare function parseValueExpression(ctx: ParseContext, exp: ValueExpression<any, any, unknown>): ValueNode | SelectQueryNode | RawNode;
@@ -2,8 +2,8 @@
2
2
  import { PrimitiveValueListNode } from '../operation-node/primitive-value-list-node.js';
3
3
  import { ValueListNode } from '../operation-node/value-list-node.js';
4
4
  import { ValueNode } from '../operation-node/value-node.js';
5
- import { isPrimitive, isReadonlyArray, } from '../util/object-utils.js';
6
- import { parseComplexExpression, } from './complex-expression-parser.js';
5
+ import { isReadonlyArray } from '../util/object-utils.js';
6
+ import { parseComplexExpression, isComplexExpression, } from './complex-expression-parser.js';
7
7
  export function parseValueExpressionOrList(ctx, arg) {
8
8
  if (isReadonlyArray(arg)) {
9
9
  return parseValueExpressionList(ctx, arg);
@@ -13,15 +13,14 @@ export function parseValueExpressionOrList(ctx, arg) {
13
13
  }
14
14
  }
15
15
  export function parseValueExpression(ctx, exp) {
16
- if (isPrimitive(exp)) {
17
- return ValueNode.create(exp);
16
+ if (isComplexExpression(exp)) {
17
+ return parseComplexExpression(ctx, exp);
18
18
  }
19
- return parseComplexExpression(ctx, exp);
19
+ return ValueNode.create(exp);
20
20
  }
21
21
  function parseValueExpressionList(ctx, arg) {
22
- if (arg.every(isPrimitive)) {
23
- // Optimization for large lists of primitive values.
24
- return PrimitiveValueListNode.create(arg);
22
+ if (arg.some(isComplexExpression)) {
23
+ return ValueListNode.create(arg.map((it) => parseValueExpression(ctx, it)));
25
24
  }
26
- return ValueListNode.create(arg.map((it) => parseValueExpression(ctx, it)));
25
+ return PrimitiveValueListNode.create(arg);
27
26
  }
@@ -0,0 +1,48 @@
1
+ import { QueryResult } from '../../driver/database-connection.js';
2
+ import { RootOperationNode } from '../../query-compiler/query-compiler.js';
3
+ import { UnknownRow } from '../../util/type-utils.js';
4
+ import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
5
+ /**
6
+ * Plugin that removes duplicate joins from queries.
7
+ *
8
+ * See [this recipe](https://github.com/koskimas/kysely/tree/master/recipes/deduplicate-joins.md)
9
+ */
10
+ export declare class DeduplicateJoinsPlugin implements KyselyPlugin {
11
+ #private;
12
+ /**
13
+ * This is called for each query before it is executed. You can modify the query by
14
+ * transforming its {@link OperationNode} tree provided in {@link PluginTransformQueryArgs.node | args.node}
15
+ * and returning the transformed tree. You'd usually want to use an {@link OperationNodeTransformer}
16
+ * for this.
17
+ *
18
+ * If you need to pass some query-related data between this method and `transformResult` you
19
+ * can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
20
+ *
21
+ * ```ts
22
+ * const plugin = {
23
+ * data: new WeakMap<QueryId, SomeData>(),
24
+ *
25
+ * transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
26
+ * this.data.set(args.queryId, something)
27
+ * return args.node
28
+ * },
29
+ *
30
+ * transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow> {
31
+ * const data = this.data.get(args.queryId)
32
+ * return args.result
33
+ * }
34
+ * }
35
+ * ```
36
+ *
37
+ * You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
38
+ * is not always matched by a call to `transformResult` which would leave orphaned items in the map
39
+ * and cause a memory leak.
40
+ */
41
+ transformQuery(args: PluginTransformQueryArgs): RootOperationNode;
42
+ /**
43
+ * This method is called for each query after it has been executed. The result
44
+ * of the query can be accessed through {@link PluginTransformResultArgs.result | args.result}.
45
+ * You can modify the result and return the modifier result.
46
+ */
47
+ transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
48
+ }
@@ -0,0 +1,16 @@
1
+ /// <reference types="./deduplicate-joins-plugin.d.ts" />
2
+ import { DeduplicateJoinsTransformer } from './deduplicate-joins-transformer.js';
3
+ /**
4
+ * Plugin that removes duplicate joins from queries.
5
+ *
6
+ * See [this recipe](https://github.com/koskimas/kysely/tree/master/recipes/deduplicate-joins.md)
7
+ */
8
+ export class DeduplicateJoinsPlugin {
9
+ #transformer = new DeduplicateJoinsTransformer();
10
+ transformQuery(args) {
11
+ return this.#transformer.transformNode(args.node);
12
+ }
13
+ transformResult(args) {
14
+ return Promise.resolve(args.result);
15
+ }
16
+ }
@@ -0,0 +1,9 @@
1
+ import { DeleteQueryNode, UpdateQueryNode } from '../../index-nodeless.js';
2
+ import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
3
+ import { SelectQueryNode } from '../../operation-node/select-query-node.js';
4
+ export declare class DeduplicateJoinsTransformer extends OperationNodeTransformer {
5
+ #private;
6
+ protected transformSelectQuery(node: SelectQueryNode): SelectQueryNode;
7
+ protected transformUpdateQuery(node: UpdateQueryNode): UpdateQueryNode;
8
+ protected transformDeleteQuery(node: DeleteQueryNode): DeleteQueryNode;
9
+ }
@@ -0,0 +1,39 @@
1
+ /// <reference types="./deduplicate-joins-transformer.d.ts" />
2
+ import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
3
+ import { compare, freeze } from '../../util/object-utils.js';
4
+ export class DeduplicateJoinsTransformer extends OperationNodeTransformer {
5
+ transformSelectQuery(node) {
6
+ return this.#transformQuery(super.transformSelectQuery(node));
7
+ }
8
+ transformUpdateQuery(node) {
9
+ return this.#transformQuery(super.transformUpdateQuery(node));
10
+ }
11
+ transformDeleteQuery(node) {
12
+ return this.#transformQuery(super.transformDeleteQuery(node));
13
+ }
14
+ #transformQuery(node) {
15
+ if (!node.joins || node.joins.length === 0) {
16
+ return node;
17
+ }
18
+ return freeze({
19
+ ...node,
20
+ joins: this.#deduplicateJoins(node.joins),
21
+ });
22
+ }
23
+ #deduplicateJoins(joins) {
24
+ const out = [];
25
+ for (let i = 0; i < joins.length; ++i) {
26
+ let foundDuplicate = false;
27
+ for (let j = i + 1; j < joins.length; ++j) {
28
+ if (compare(joins[i], joins[j])) {
29
+ foundDuplicate = true;
30
+ break;
31
+ }
32
+ }
33
+ if (!foundDuplicate) {
34
+ out.push(joins[i]);
35
+ }
36
+ }
37
+ return freeze(out);
38
+ }
39
+ }
@@ -6,7 +6,7 @@ import { SelectExpression } from '../parser/select-parser.js';
6
6
  import { ExistsExpression, FilterOperator, FilterValueExpressionOrList, WhereGrouper } from '../parser/filter-parser.js';
7
7
  import { ReturningRow } from '../parser/returning-parser.js';
8
8
  import { ReferenceExpression } from '../parser/reference-parser.js';
9
- import { AnyRawBuilder, SingleResultType } from '../util/type-utils.js';
9
+ import { AnyRawBuilder, MergePartial, SingleResultType } from '../util/type-utils.js';
10
10
  import { Compilable } from '../util/compilable.js';
11
11
  import { QueryExecutor } from '../query-executor/query-executor.js';
12
12
  import { QueryId } from '../util/query-id.js';
@@ -16,6 +16,7 @@ import { WhereInterface } from './where-interface.js';
16
16
  import { JoinInterface } from './join-interface.js';
17
17
  import { ReturningInterface } from './returning-interface.js';
18
18
  import { NoResultErrorConstructor } from './no-result-error.js';
19
+ import { DeleteResult } from './delete-result.js';
19
20
  import { DeleteQueryNode } from '../operation-node/delete-query-node.js';
20
21
  import { Selectable } from '../util/column-type.js';
21
22
  export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, JoinInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable {
@@ -589,23 +590,61 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
589
590
  /**
590
591
  * Simply calls the given function passing `this` as the only argument.
591
592
  *
592
- * This method can be useful when adding optional method calls:
593
+ * If you want to conditionally call a method on `this`, see
594
+ * the {@link if} method.
593
595
  *
594
596
  * ### Examples
595
597
  *
598
+ * The next example uses a helper funtion `log` to log a query:
599
+ *
596
600
  * ```ts
601
+ * function log<T extends Compilable>(qb: T): T {
602
+ * console.log(qb.compile())
603
+ * return qb
604
+ * }
605
+ *
597
606
  * db.deleteFrom('person')
598
- * .call((qb) => {
599
- * if (something) {
600
- * return qb.where('something', '=', something)
601
- * } else {
602
- * return qb.where('somethingElse', '=', somethingElse)
603
- * }
604
- * })
607
+ * .call(log)
605
608
  * .execute()
606
609
  * ```
607
610
  */
608
611
  call<T>(func: (qb: this) => T): T;
612
+ /**
613
+ * Call `func(this)` if `condition` is true.
614
+ *
615
+ * This method is especially handy with optional selects. Any `returning` or `returningAll`
616
+ * method calls add columns as optional fields to the output type when called inside
617
+ * the `func` callback. This is because we can't know if those selections were actually
618
+ * made before running the code.
619
+ *
620
+ * You can also call any other methods inside the callback.
621
+ *
622
+ * ### Examples
623
+ *
624
+ * ```ts
625
+ * async function deletePerson(id: number, returnLastName: boolean) {
626
+ * return await db
627
+ * .deleteFrom('person')
628
+ * .where('id', '=', id)
629
+ * .returning(['id', 'first_name'])
630
+ * .if(returnLastName, (qb) => qb.returning('last_name'))
631
+ * .executeTakeFirstOrThrow()
632
+ * }
633
+ * ```
634
+ *
635
+ * Any selections added inside the `if` callback will be added as optional fields to the
636
+ * output type since we can't know if the selections were actually made before running
637
+ * the code. In the example above the return type of the `deletePerson` function is:
638
+ *
639
+ * ```ts
640
+ * {
641
+ * id: number
642
+ * first_name: string
643
+ * last_name?: string
644
+ * }
645
+ * ```
646
+ */
647
+ if<O2>(condition: boolean, func: (qb: this) => DeleteQueryBuilder<DB, TB, O2>): DeleteQueryBuilder<DB, TB, O2 extends DeleteResult ? DeleteResult : O extends DeleteResult ? Partial<O2> : MergePartial<O, O2>>;
609
648
  /**
610
649
  * Change the output type of the query.
611
650
  *
@@ -613,6 +652,9 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
613
652
  * don't support your use case.
614
653
  */
615
654
  castTo<T>(): DeleteQueryBuilder<DB, TB, T>;
655
+ /**
656
+ * Returns a copy of this DeleteQueryBuilder instance with the given plugin installed.
657
+ */
616
658
  withPlugin(plugin: KyselyPlugin): DeleteQueryBuilder<DB, TB, O>;
617
659
  toOperationNode(): DeleteQueryNode;
618
660
  compile(): CompiledQuery;
@@ -99,25 +99,70 @@ export class DeleteQueryBuilder {
99
99
  /**
100
100
  * Simply calls the given function passing `this` as the only argument.
101
101
  *
102
- * This method can be useful when adding optional method calls:
102
+ * If you want to conditionally call a method on `this`, see
103
+ * the {@link if} method.
103
104
  *
104
105
  * ### Examples
105
106
  *
107
+ * The next example uses a helper funtion `log` to log a query:
108
+ *
106
109
  * ```ts
110
+ * function log<T extends Compilable>(qb: T): T {
111
+ * console.log(qb.compile())
112
+ * return qb
113
+ * }
114
+ *
107
115
  * db.deleteFrom('person')
108
- * .call((qb) => {
109
- * if (something) {
110
- * return qb.where('something', '=', something)
111
- * } else {
112
- * return qb.where('somethingElse', '=', somethingElse)
113
- * }
114
- * })
116
+ * .call(log)
115
117
  * .execute()
116
118
  * ```
117
119
  */
118
120
  call(func) {
119
121
  return func(this);
120
122
  }
123
+ /**
124
+ * Call `func(this)` if `condition` is true.
125
+ *
126
+ * This method is especially handy with optional selects. Any `returning` or `returningAll`
127
+ * method calls add columns as optional fields to the output type when called inside
128
+ * the `func` callback. This is because we can't know if those selections were actually
129
+ * made before running the code.
130
+ *
131
+ * You can also call any other methods inside the callback.
132
+ *
133
+ * ### Examples
134
+ *
135
+ * ```ts
136
+ * async function deletePerson(id: number, returnLastName: boolean) {
137
+ * return await db
138
+ * .deleteFrom('person')
139
+ * .where('id', '=', id)
140
+ * .returning(['id', 'first_name'])
141
+ * .if(returnLastName, (qb) => qb.returning('last_name'))
142
+ * .executeTakeFirstOrThrow()
143
+ * }
144
+ * ```
145
+ *
146
+ * Any selections added inside the `if` callback will be added as optional fields to the
147
+ * output type since we can't know if the selections were actually made before running
148
+ * the code. In the example above the return type of the `deletePerson` function is:
149
+ *
150
+ * ```ts
151
+ * {
152
+ * id: number
153
+ * first_name: string
154
+ * last_name?: string
155
+ * }
156
+ * ```
157
+ */
158
+ if(condition, func) {
159
+ if (condition) {
160
+ return func(this);
161
+ }
162
+ return new DeleteQueryBuilder({
163
+ ...this.#props,
164
+ });
165
+ }
121
166
  /**
122
167
  * Change the output type of the query.
123
168
  *
@@ -127,6 +172,9 @@ export class DeleteQueryBuilder {
127
172
  castTo() {
128
173
  return new DeleteQueryBuilder(this.#props);
129
174
  }
175
+ /**
176
+ * Returns a copy of this DeleteQueryBuilder instance with the given plugin installed.
177
+ */
130
178
  withPlugin(plugin) {
131
179
  return new DeleteQueryBuilder({
132
180
  ...this.#props,
@@ -3,8 +3,8 @@ import { TableExpression, TableExpressionDatabase, TableExpressionTables } from
3
3
  import { NoopQueryExecutor } from '../query-executor/noop-query-executor.js';
4
4
  import { ParseContext } from '../parser/parse-context.js';
5
5
  import { FunctionBuilder } from './function-builder.js';
6
- import { RawBuilder } from '../index-nodeless.js';
7
6
  import { ExtractTypeFromReferenceExpression, StringReference } from '../parser/reference-parser.js';
7
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
8
8
  export declare class ExpressionBuilder<DB, TB extends keyof DB> {
9
9
  #private;
10
10
  constructor(props: ExpressionBuilderProps);
@@ -6,7 +6,7 @@ import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
6
6
  import { createQueryId } from '../util/query-id.js';
7
7
  import { freeze } from '../util/object-utils.js';
8
8
  import { FunctionBuilder } from './function-builder.js';
9
- import { RawBuilder } from '../index-nodeless.js';
9
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
10
10
  export class ExpressionBuilder {
11
11
  #props;
12
12
  constructor(props) {
@@ -4,6 +4,9 @@ import { RawBuilder } from '../raw-builder/raw-builder.js';
4
4
  /**
5
5
  * Helpers for type safe SQL function calls.
6
6
  *
7
+ * You can always use {@link Kysely.raw} to call functions and build arbitrary
8
+ * expressions. This module simply has shortcuts for most common function calls.
9
+ *
7
10
  * ### Examples
8
11
  *
9
12
  * ```ts
@@ -35,12 +38,33 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
35
38
  constructor(props: FunctionBuilderProps);
36
39
  /**
37
40
  * Calls the `max` function for the column given as the argument.
41
+ *
42
+ * ### Examples
43
+ *
44
+ * ```ts
45
+ * const { max } = db.fn
46
+ *
47
+ * db.selectFrom('toy')
48
+ * .select(max('price').as('max_price'))
49
+ * .execute()
50
+ * ```
38
51
  */
39
- min<C extends StringReference<DB, TB>>(column: C): RawBuilder<ExtractTypeFromReferenceExpression<DB, TB, C>>;
52
+ max<C extends StringReference<DB, TB>>(column: C): RawBuilder<ExtractTypeFromReferenceExpression<DB, TB, C>>;
40
53
  /**
41
54
  * Calls the `min` function for the column given as the argument.
55
+ *
56
+ * ### Examples
57
+ *
58
+ * ```ts
59
+ * const { min } = db.fn
60
+ *
61
+ * db.selectFrom('toy')
62
+ * .select(min('price').as('min_price'))
63
+ * .execute()
64
+ * ```
65
+ *
42
66
  */
43
- max<C extends StringReference<DB, TB>>(column: C): RawBuilder<ExtractTypeFromReferenceExpression<DB, TB, C>>;
67
+ min<C extends StringReference<DB, TB>>(column: C): RawBuilder<ExtractTypeFromReferenceExpression<DB, TB, C>>;
44
68
  /**
45
69
  * Calls the `avg` function for the column given as the argument.
46
70
  *
@@ -58,7 +82,7 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
58
82
  * const { avg } = db.fn
59
83
  *
60
84
  * db.selectFrom('toy')
61
- * .select(avg<number>('price'))
85
+ * .select(avg<number>('price').as('avg_price'))
62
86
  * .execute()
63
87
  * ```
64
88
  */
@@ -80,7 +104,7 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
80
104
  * const { sum } = db.fn
81
105
  *
82
106
  * db.selectFrom('toy')
83
- * .select(sum<number>('price'))
107
+ * .select(sum<number>('price').as('total_price'))
84
108
  * .execute()
85
109
  * ```
86
110
  */
@@ -102,7 +126,7 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
102
126
  * const { count } = db.fn
103
127
  *
104
128
  * db.selectFrom('toy')
105
- * .select(count<number>('price'))
129
+ * .select(count<number>('id').as('num_toys'))
106
130
  * .execute()
107
131
  * ```
108
132
  */