kysely 0.24.1 → 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.
Files changed (132) hide show
  1. package/README.md +30 -13
  2. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +2 -1
  3. package/dist/cjs/dialect/postgres/postgres-introspector.js +4 -1
  4. package/dist/cjs/driver/runtime-driver.js +6 -6
  5. package/dist/cjs/dynamic/dynamic.d.ts +1 -1
  6. package/dist/cjs/dynamic/dynamic.js +1 -1
  7. package/dist/cjs/expression/expression-builder.d.ts +56 -1
  8. package/dist/cjs/expression/expression-builder.js +10 -0
  9. package/dist/cjs/helpers/mysql.d.ts +3 -3
  10. package/dist/cjs/helpers/mysql.js +2 -2
  11. package/dist/cjs/helpers/postgres.d.ts +1 -1
  12. package/dist/cjs/index.d.ts +4 -0
  13. package/dist/cjs/index.js +4 -0
  14. package/dist/cjs/kysely.d.ts +19 -2
  15. package/dist/cjs/kysely.js +28 -1
  16. package/dist/cjs/operation-node/aggregate-function-node.d.ts +3 -7
  17. package/dist/cjs/operation-node/aggregate-function-node.js +1 -1
  18. package/dist/cjs/operation-node/alter-column-node.d.ts +1 -2
  19. package/dist/cjs/operation-node/alter-table-node.d.ts +1 -1
  20. package/dist/cjs/operation-node/alter-table-node.js +1 -2
  21. package/dist/cjs/operation-node/case-node.d.ts +19 -0
  22. package/dist/cjs/operation-node/case-node.js +42 -0
  23. package/dist/cjs/operation-node/create-index-node.d.ts +2 -1
  24. package/dist/cjs/operation-node/create-index-node.js +6 -0
  25. package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
  26. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  27. package/dist/cjs/operation-node/operation-node-transformer.js +20 -2
  28. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  29. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  30. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  31. package/dist/cjs/operation-node/when-node.d.ts +14 -0
  32. package/dist/cjs/operation-node/when-node.js +24 -0
  33. package/dist/cjs/parser/binary-operation-parser.d.ts +1 -0
  34. package/dist/cjs/parser/binary-operation-parser.js +18 -2
  35. package/dist/cjs/parser/expression-parser.d.ts +2 -1
  36. package/dist/cjs/parser/order-by-parser.d.ts +1 -0
  37. package/dist/cjs/parser/order-by-parser.js +5 -1
  38. package/dist/cjs/parser/reference-parser.d.ts +6 -2
  39. package/dist/cjs/parser/reference-parser.js +16 -1
  40. package/dist/cjs/parser/select-parser.d.ts +4 -4
  41. package/dist/cjs/parser/table-parser.d.ts +5 -4
  42. package/dist/cjs/parser/with-parser.d.ts +4 -3
  43. package/dist/cjs/query-builder/case-builder.d.ts +111 -0
  44. package/dist/cjs/query-builder/case-builder.js +75 -0
  45. package/dist/cjs/query-builder/delete-query-builder.d.ts +55 -13
  46. package/dist/cjs/query-builder/delete-query-builder.js +44 -0
  47. package/dist/cjs/query-builder/function-module.d.ts +36 -5
  48. package/dist/cjs/query-builder/function-module.js +12 -16
  49. package/dist/cjs/query-builder/insert-query-builder.d.ts +44 -3
  50. package/dist/cjs/query-builder/insert-query-builder.js +49 -1
  51. package/dist/cjs/query-builder/select-query-builder.d.ts +54 -13
  52. package/dist/cjs/query-builder/select-query-builder.js +43 -0
  53. package/dist/cjs/query-builder/update-query-builder.d.ts +65 -20
  54. package/dist/cjs/query-builder/update-query-builder.js +47 -0
  55. package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
  56. package/dist/cjs/query-compiler/default-query-compiler.js +30 -3
  57. package/dist/cjs/schema/alter-column-builder.d.ts +2 -2
  58. package/dist/cjs/schema/alter-column-builder.js +2 -2
  59. package/dist/cjs/schema/create-index-builder.d.ts +49 -7
  60. package/dist/cjs/schema/create-index-builder.js +51 -13
  61. package/dist/cjs/schema/schema.js +1 -1
  62. package/dist/cjs/util/column-type.d.ts +3 -2
  63. package/dist/cjs/util/log.d.ts +3 -3
  64. package/dist/cjs/util/log.js +4 -4
  65. package/dist/cjs/util/object-utils.d.ts +2 -1
  66. package/dist/cjs/util/type-utils.d.ts +43 -29
  67. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +2 -1
  68. package/dist/esm/dialect/postgres/postgres-introspector.js +4 -1
  69. package/dist/esm/driver/runtime-driver.js +6 -6
  70. package/dist/esm/dynamic/dynamic.d.ts +1 -1
  71. package/dist/esm/dynamic/dynamic.js +1 -1
  72. package/dist/esm/expression/expression-builder.d.ts +56 -1
  73. package/dist/esm/expression/expression-builder.js +11 -1
  74. package/dist/esm/helpers/mysql.d.ts +3 -3
  75. package/dist/esm/helpers/mysql.js +2 -2
  76. package/dist/esm/helpers/postgres.d.ts +1 -1
  77. package/dist/esm/index.d.ts +4 -0
  78. package/dist/esm/index.js +4 -0
  79. package/dist/esm/kysely.d.ts +19 -2
  80. package/dist/esm/kysely.js +29 -2
  81. package/dist/esm/operation-node/aggregate-function-node.d.ts +3 -7
  82. package/dist/esm/operation-node/aggregate-function-node.js +1 -1
  83. package/dist/esm/operation-node/alter-column-node.d.ts +1 -2
  84. package/dist/esm/operation-node/alter-table-node.d.ts +1 -1
  85. package/dist/esm/operation-node/alter-table-node.js +1 -2
  86. package/dist/esm/operation-node/case-node.d.ts +19 -0
  87. package/dist/esm/operation-node/case-node.js +40 -0
  88. package/dist/esm/operation-node/create-index-node.d.ts +2 -1
  89. package/dist/esm/operation-node/create-index-node.js +6 -0
  90. package/dist/esm/operation-node/data-type-node.d.ts +1 -1
  91. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  92. package/dist/esm/operation-node/operation-node-transformer.js +20 -2
  93. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  94. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  95. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  96. package/dist/esm/operation-node/when-node.d.ts +14 -0
  97. package/dist/esm/operation-node/when-node.js +22 -0
  98. package/dist/esm/parser/binary-operation-parser.d.ts +1 -0
  99. package/dist/esm/parser/binary-operation-parser.js +16 -1
  100. package/dist/esm/parser/expression-parser.d.ts +2 -1
  101. package/dist/esm/parser/order-by-parser.d.ts +1 -0
  102. package/dist/esm/parser/order-by-parser.js +3 -0
  103. package/dist/esm/parser/reference-parser.d.ts +6 -2
  104. package/dist/esm/parser/reference-parser.js +14 -0
  105. package/dist/esm/parser/select-parser.d.ts +4 -4
  106. package/dist/esm/parser/table-parser.d.ts +5 -4
  107. package/dist/esm/parser/with-parser.d.ts +4 -3
  108. package/dist/esm/query-builder/case-builder.d.ts +111 -0
  109. package/dist/esm/query-builder/case-builder.js +69 -0
  110. package/dist/esm/query-builder/delete-query-builder.d.ts +55 -13
  111. package/dist/esm/query-builder/delete-query-builder.js +44 -0
  112. package/dist/esm/query-builder/function-module.d.ts +36 -5
  113. package/dist/esm/query-builder/function-module.js +13 -17
  114. package/dist/esm/query-builder/insert-query-builder.d.ts +44 -3
  115. package/dist/esm/query-builder/insert-query-builder.js +49 -1
  116. package/dist/esm/query-builder/select-query-builder.d.ts +54 -13
  117. package/dist/esm/query-builder/select-query-builder.js +43 -0
  118. package/dist/esm/query-builder/update-query-builder.d.ts +65 -20
  119. package/dist/esm/query-builder/update-query-builder.js +47 -0
  120. package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
  121. package/dist/esm/query-compiler/default-query-compiler.js +30 -3
  122. package/dist/esm/schema/alter-column-builder.d.ts +2 -2
  123. package/dist/esm/schema/alter-column-builder.js +2 -2
  124. package/dist/esm/schema/create-index-builder.d.ts +49 -7
  125. package/dist/esm/schema/create-index-builder.js +52 -14
  126. package/dist/esm/schema/schema.js +1 -1
  127. package/dist/esm/util/column-type.d.ts +3 -2
  128. package/dist/esm/util/log.d.ts +3 -3
  129. package/dist/esm/util/log.js +4 -4
  130. package/dist/esm/util/object-utils.d.ts +2 -1
  131. package/dist/esm/util/type-utils.d.ts +43 -29
  132. package/package.json +1 -1
@@ -2,10 +2,7 @@ import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
2
2
  import { InsertResult } from '../query-builder/insert-result.js';
3
3
  import { DeleteResult } from '../query-builder/delete-result.js';
4
4
  import { UpdateResult } from '../query-builder/update-result.js';
5
- /**
6
- * Given an object type, extracts the union of all value types.
7
- */
8
- export declare type ValueType<T> = T[keyof T];
5
+ import { KyselyTypeError } from './type-error.js';
9
6
  /**
10
7
  * Given a database type and a union of table names in that db, returns
11
8
  * a union type with all possible column names.
@@ -37,9 +34,9 @@ export declare type ValueType<T> = T[keyof T];
37
34
  * // Columns == 'id' | 'name' | 'species'
38
35
  * ```
39
36
  */
40
- export declare type AnyColumn<DB, TB extends keyof DB> = {
37
+ export declare type AnyColumn<DB, TB extends keyof DB> = DrainOuterGeneric<{
41
38
  [T in TB]: keyof DB[T];
42
- }[TB] & string;
39
+ }[TB] & string>;
43
40
  /**
44
41
  * Extracts a column type.
45
42
  */
@@ -102,9 +99,9 @@ export declare type ArrayItemType<T> = T extends ReadonlyArray<infer I> ? I : ne
102
99
  export declare type AnySelectQueryBuilder = SelectQueryBuilder<any, any, any>;
103
100
  export declare type SimplifySingleResult<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : Simplify<O> | undefined;
104
101
  export declare type SimplifyResult<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : Simplify<O>;
105
- export declare type Simplify<T> = {
102
+ export declare type Simplify<T> = DrainOuterGeneric<{
106
103
  [K in keyof T]: T[K];
107
- } & {};
104
+ } & {}>;
108
105
  /**
109
106
  * Represents a database row whose column names and their types are unknown.
110
107
  */
@@ -115,33 +112,50 @@ export declare type UnknownRow = Record<string, unknown>;
115
112
  export declare type Nullable<T> = {
116
113
  [P in keyof T]: T[P] | null;
117
114
  };
118
- /**
119
- * Takes all properties from T1 and merges all properties from T2
120
- * that don't exist in T1 as optional properties.
121
- *
122
- * Example:
123
- *
124
- * interface Person {
125
- * name: string
126
- * age: number
127
- * }
128
- *
129
- * interface Pet {
130
- * name: string
131
- * species: 'cat' | 'dog'
132
- * }
133
- *
134
- * type Merged = MergePartial<Person, Pet>
135
- *
136
- * // { name: string, age: number, species?: 'cat' | 'dog' }
137
- */
138
- export declare type MergePartial<T1, T2> = T1 & Partial<Omit<T2, keyof T1>>;
139
115
  /**
140
116
  * Evaluates to `true` if `T` is `never`.
141
117
  */
142
118
  export declare type IsNever<T> = [T] extends [never] ? true : false;
119
+ /**
120
+ * Evaluates to `true` if `T` is `any`.
121
+ */
122
+ export declare type IsAny<T> = 0 extends T & 1 ? true : false;
143
123
  /**
144
124
  * Evaluates to `true` if the types `T` and `U` are equal.
145
125
  */
146
126
  export declare type Equals<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U ? 1 : 2 ? true : false;
127
+ export declare type NarrowPartial<S, T> = DrainOuterGeneric<{
128
+ [K in keyof S & string]: K extends keyof T ? T[K] extends S[K] ? T[K] : KyselyTypeError<`$narrowType() call failed: passed type does not exist in '${K}'s type union`> : S[K];
129
+ }>;
147
130
  export declare type SqlBool = boolean | 0 | 1;
131
+ /**
132
+ * Utility to reduce depth of TypeScript's internal type instantiation stack.
133
+ *
134
+ * Example:
135
+ *
136
+ * ```ts
137
+ * type A<T> = { item: T }
138
+ *
139
+ * type Test<T> = A<
140
+ * A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<T>>>>>>>>>>>>>>>>>>>>>>>>
141
+ * >
142
+ *
143
+ * type Error = Test<number> // Type instantiation is excessively deep and possibly infinite.ts (2589)
144
+ * ```
145
+ *
146
+ * To fix this, we can use `DrainOuterGeneric`:
147
+ *
148
+ * ```ts
149
+ * type A<T> = DrainOuterGeneric<{ item: T }>
150
+ *
151
+ * type Test<T> = A<
152
+ * A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<T>>>>>>>>>>>>>>>>>>>>>>>>
153
+ * >
154
+ *
155
+ * type Ok = Test<number> // Ok
156
+ * ```
157
+ */
158
+ export declare type DrainOuterGeneric<T> = [T] extends [unknown] ? T : never;
159
+ export declare type ShallowRecord<K extends keyof any, T> = DrainOuterGeneric<{
160
+ [P in K]: T;
161
+ }>;
@@ -1,4 +1,5 @@
1
1
  import { DatabaseConnection } from '../../driver/database-connection.js';
2
+ import { ShallowRecord } from '../../util/type-utils.js';
2
3
  /**
3
4
  * Config for the MySQL dialect.
4
5
  *
@@ -48,4 +49,4 @@ export interface MysqlOkPacket {
48
49
  affectedRows: number;
49
50
  insertId: number;
50
51
  }
51
- export declare type MysqlQueryResult = MysqlOkPacket | Record<string, unknown>[];
52
+ export declare type MysqlQueryResult = MysqlOkPacket | ShallowRecord<string, unknown>[];
@@ -48,7 +48,10 @@ export class PostgresIntrospector {
48
48
  .as('auto_incrementing'),
49
49
  ])
50
50
  // r == normal table
51
- .where('c.relkind', 'in', ['r', 'v'])
51
+ .where(({ cmpr, or }) => or([
52
+ cmpr('c.relkind', '=', 'r'),
53
+ cmpr('c.relkind', '=', 'v'),
54
+ ]))
52
55
  .where('ns.nspname', '!~', '^pg_')
53
56
  .where('ns.nspname', '!=', 'information_schema')
54
57
  // No system columns
@@ -74,24 +74,24 @@ export class RuntimeDriver {
74
74
  return await executeQuery.call(connection, compiledQuery);
75
75
  }
76
76
  catch (error) {
77
- this.#logError(error, compiledQuery, startTime);
77
+ await this.#logError(error, compiledQuery, startTime);
78
78
  throw error;
79
79
  }
80
80
  finally {
81
- this.#logQuery(compiledQuery, startTime);
81
+ await this.#logQuery(compiledQuery, startTime);
82
82
  }
83
83
  };
84
84
  }
85
- #logError(error, compiledQuery, startTime) {
86
- this.#log.error(() => ({
85
+ async #logError(error, compiledQuery, startTime) {
86
+ await this.#log.error(() => ({
87
87
  level: 'error',
88
88
  error,
89
89
  query: compiledQuery,
90
90
  queryDurationMillis: this.#calculateDurationMillis(startTime),
91
91
  }));
92
92
  }
93
- #logQuery(compiledQuery, startTime) {
94
- this.#log.query(() => ({
93
+ async #logQuery(compiledQuery, startTime) {
94
+ await this.#log.query(() => ({
95
95
  level: 'query',
96
96
  query: compiledQuery,
97
97
  queryDurationMillis: this.#calculateDurationMillis(startTime),
@@ -69,7 +69,7 @@ export declare class DynamicModule {
69
69
  *
70
70
  * const [person] = await db.selectFrom('person')
71
71
  * .select([
72
- * ref<PossibleColumns>(columnFromUserInput)
72
+ * ref<PossibleColumns>(columnFromUserInput),
73
73
  * 'id'
74
74
  * ])
75
75
  * .execute()
@@ -70,7 +70,7 @@ export class DynamicModule {
70
70
  *
71
71
  * const [person] = await db.selectFrom('person')
72
72
  * .select([
73
- * ref<PossibleColumns>(columnFromUserInput)
73
+ * ref<PossibleColumns>(columnFromUserInput),
74
74
  * 'id'
75
75
  * ])
76
76
  * .execute()
@@ -1,7 +1,7 @@
1
1
  import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
2
2
  import { TableExpression, From, FromTables, ExtractTableAlias, AnyAliasedTable, PickTableWithAlias } from '../parser/table-parser.js';
3
3
  import { FunctionModule } from '../query-builder/function-module.js';
4
- import { ExtractTypeFromReferenceExpression, ReferenceExpression, StringReference } from '../parser/reference-parser.js';
4
+ import { ExtractTypeFromReferenceExpression, ReferenceExpression, SimpleReferenceExpression, StringReference } from '../parser/reference-parser.js';
5
5
  import { QueryExecutor } from '../query-executor/query-executor.js';
6
6
  import { BinaryOperatorExpression, ComparisonOperatorExpression, OperandValueExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
7
7
  import { Expression } from './expression.js';
@@ -9,6 +9,7 @@ import { ExpressionWrapper } from './expression-wrapper.js';
9
9
  import { ComparisonOperator, UnaryOperator } from '../operation-node/operator-node.js';
10
10
  import { SqlBool } from '../util/type-utils.js';
11
11
  import { ExtractTypeFromValueExpressionOrList } from '../parser/value-parser.js';
12
+ import { CaseBuilder } from '../query-builder/case-builder.js';
12
13
  export interface ExpressionBuilder<DB, TB extends keyof DB> {
13
14
  /**
14
15
  * Returns a {@link FunctionModule} that can be used to write type safe function
@@ -91,6 +92,60 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
91
92
  selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
92
93
  selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB, TE>, {}>;
93
94
  selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
95
+ /**
96
+ * Creates a `case` statement/operator.
97
+ *
98
+ * ### Examples
99
+ *
100
+ * Kitchen sink example with 2 flavors of `case` operator:
101
+ *
102
+ * ```ts
103
+ * import { sql } from 'kysely'
104
+ *
105
+ * const { title, name } = await db
106
+ * .selectFrom('person')
107
+ * .where('id', '=', '123')
108
+ * .select((eb) => [
109
+ * eb.fn.coalesce('last_name', 'first_name').as('name'),
110
+ * eb
111
+ * .case()
112
+ * .when('gender', '=', 'male')
113
+ * .then('Mr.')
114
+ * .when('gender', '=', 'female')
115
+ * .then(
116
+ * eb
117
+ * .case('martialStatus')
118
+ * .when('single')
119
+ * .then('Ms.')
120
+ * .else('Mrs.')
121
+ * .end()
122
+ * )
123
+ * .end()
124
+ * .as('title'),
125
+ * ])
126
+ * .executeTakeFirstOrThrow()
127
+ * ```
128
+ *
129
+ * The generated SQL (PostgreSQL):
130
+ *
131
+ * ```sql
132
+ * select
133
+ * coalesce("last_name", "first_name") as "name",
134
+ * case
135
+ * when "gender" = $1 then $2
136
+ * when "gender" = $3 then
137
+ * case "martialStatus"
138
+ * when $4 then $5
139
+ * else $6
140
+ * end
141
+ * end as "title"
142
+ * from "person"
143
+ * where "id" = $7
144
+ * ```
145
+ */
146
+ case(): CaseBuilder<DB, TB>;
147
+ case<C extends SimpleReferenceExpression<DB, TB>>(column: C): CaseBuilder<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, C>>;
148
+ case<O>(expression: Expression<O>): CaseBuilder<DB, TB, O>;
94
149
  /**
95
150
  * This can be used to reference columns.
96
151
  *
@@ -5,7 +5,7 @@ import { parseTableExpressionOrList, } from '../parser/table-parser.js';
5
5
  import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
6
6
  import { createQueryId } from '../util/query-id.js';
7
7
  import { createFunctionModule, } from '../query-builder/function-module.js';
8
- import { parseStringReference, } from '../parser/reference-parser.js';
8
+ import { parseReferenceExpression, parseStringReference, } from '../parser/reference-parser.js';
9
9
  import { parseValueBinaryOperation, } from '../parser/binary-operation-parser.js';
10
10
  import { AndNode } from '../operation-node/and-node.js';
11
11
  import { OrNode } from '../operation-node/or-node.js';
@@ -15,6 +15,9 @@ import { parseUnaryOperation } from '../parser/unary-operation-parser.js';
15
15
  import { parseValueExpressionOrList, } from '../parser/value-parser.js';
16
16
  import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
17
17
  import { ValueNode } from '../operation-node/value-node.js';
18
+ import { CaseBuilder } from '../query-builder/case-builder.js';
19
+ import { CaseNode } from '../operation-node/case-node.js';
20
+ import { isUndefined } from '../util/object-utils.js';
18
21
  export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
19
22
  function unary(op, expr) {
20
23
  return new ExpressionWrapper(parseUnaryOperation(op, expr));
@@ -30,6 +33,13 @@ export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
30
33
  queryNode: SelectQueryNode.create(parseTableExpressionOrList(table)),
31
34
  });
32
35
  },
36
+ case(reference) {
37
+ return new CaseBuilder({
38
+ node: CaseNode.create(isUndefined(reference)
39
+ ? undefined
40
+ : parseReferenceExpression(reference)),
41
+ });
42
+ },
33
43
  ref(reference) {
34
44
  return new ExpressionWrapper(parseStringReference(reference));
35
45
  },
@@ -3,7 +3,7 @@ import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
3
3
  import { RawBuilder } from '../raw-builder/raw-builder.js';
4
4
  import { Simplify } from '../util/type-utils.js';
5
5
  /**
6
- * A MySQL helper for aggregating a subquery (or other expression) into a JSON array.
6
+ * A MySQL helper for aggregating a subquery into a JSON array.
7
7
  *
8
8
  * NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
9
9
  * While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
@@ -49,7 +49,7 @@ import { Simplify } from '../util/type-utils.js';
49
49
  */
50
50
  export declare function jsonArrayFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O>[]>;
51
51
  /**
52
- * A MySQL helper for turning a subquery (or other expression) into a JSON object.
52
+ * A MySQL helper for turning a subquery into a JSON object.
53
53
  *
54
54
  * The subquery must only return one row.
55
55
  *
@@ -95,7 +95,7 @@ export declare function jsonArrayFrom<O>(expr: SelectQueryBuilder<any, any, O>):
95
95
  * from `person`
96
96
  * ```
97
97
  */
98
- export declare function jsonObjectFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O>>;
98
+ export declare function jsonObjectFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O> | null>;
99
99
  /**
100
100
  * The MySQL `json_object` function.
101
101
  *
@@ -5,7 +5,7 @@ import { IdentifierNode } from '../operation-node/identifier-node.js';
5
5
  import { ReferenceNode } from '../operation-node/reference-node.js';
6
6
  import { sql } from '../raw-builder/sql.js';
7
7
  /**
8
- * A MySQL helper for aggregating a subquery (or other expression) into a JSON array.
8
+ * A MySQL helper for aggregating a subquery into a JSON array.
9
9
  *
10
10
  * NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
11
11
  * While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
@@ -53,7 +53,7 @@ export function jsonArrayFrom(expr) {
53
53
  return sql `(select cast(coalesce(json_arrayagg(json_object(${sql.join(getJsonObjectArgs(expr.toOperationNode(), 'agg'))})), '[]') as json) from ${expr} as agg)`;
54
54
  }
55
55
  /**
56
- * A MySQL helper for turning a subquery (or other expression) into a JSON object.
56
+ * A MySQL helper for turning a subquery into a JSON object.
57
57
  *
58
58
  * The subquery must only return one row.
59
59
  *
@@ -88,7 +88,7 @@ export declare function jsonArrayFrom<O>(expr: Expression<O>): RawBuilder<Simpli
88
88
  * from "person"
89
89
  * ```
90
90
  */
91
- export declare function jsonObjectFrom<O>(expr: Expression<O>): RawBuilder<Simplify<O>>;
91
+ export declare function jsonObjectFrom<O>(expr: Expression<O>): RawBuilder<Simplify<O> | null>;
92
92
  /**
93
93
  * The PostgreSQL `json_build_object` function.
94
94
  *
@@ -2,6 +2,7 @@ export * from './kysely.js';
2
2
  export * from './query-creator.js';
3
3
  export * from './expression/expression.js';
4
4
  export { ExpressionBuilder, expressionBuilder, } from './expression/expression-builder.js';
5
+ export * from './expression/expression-wrapper.js';
5
6
  export * from './query-builder/where-interface.js';
6
7
  export * from './query-builder/returning-interface.js';
7
8
  export * from './query-builder/having-interface.js';
@@ -17,6 +18,7 @@ export * from './query-builder/delete-result.js';
17
18
  export * from './query-builder/update-result.js';
18
19
  export * from './query-builder/on-conflict-builder.js';
19
20
  export * from './query-builder/aggregate-function-builder.js';
21
+ export * from './query-builder/case-builder.js';
20
22
  export * from './raw-builder/raw-builder.js';
21
23
  export * from './raw-builder/sql.js';
22
24
  export * from './query-executor/query-executor.js';
@@ -83,6 +85,7 @@ export * from './operation-node/alias-node.js';
83
85
  export * from './operation-node/alter-column-node.js';
84
86
  export * from './operation-node/alter-table-node.js';
85
87
  export * from './operation-node/and-node.js';
88
+ export * from './operation-node/case-node.js';
86
89
  export * from './operation-node/check-constraint-node.js';
87
90
  export * from './operation-node/column-definition-node.js';
88
91
  export * from './operation-node/column-node.js';
@@ -148,6 +151,7 @@ export * from './operation-node/update-query-node.js';
148
151
  export * from './operation-node/value-list-node.js';
149
152
  export * from './operation-node/value-node.js';
150
153
  export * from './operation-node/values-node.js';
154
+ export * from './operation-node/when-node.js';
151
155
  export * from './operation-node/where-node.js';
152
156
  export * from './operation-node/with-node.js';
153
157
  export * from './operation-node/explain-node.js';
package/dist/esm/index.js CHANGED
@@ -3,6 +3,7 @@ export * from './kysely.js';
3
3
  export * from './query-creator.js';
4
4
  export * from './expression/expression.js';
5
5
  export { expressionBuilder, } from './expression/expression-builder.js';
6
+ export * from './expression/expression-wrapper.js';
6
7
  export * from './query-builder/where-interface.js';
7
8
  export * from './query-builder/returning-interface.js';
8
9
  export * from './query-builder/having-interface.js';
@@ -18,6 +19,7 @@ export * from './query-builder/delete-result.js';
18
19
  export * from './query-builder/update-result.js';
19
20
  export * from './query-builder/on-conflict-builder.js';
20
21
  export * from './query-builder/aggregate-function-builder.js';
22
+ export * from './query-builder/case-builder.js';
21
23
  export * from './raw-builder/raw-builder.js';
22
24
  export * from './raw-builder/sql.js';
23
25
  export * from './query-executor/query-executor.js';
@@ -84,6 +86,7 @@ export * from './operation-node/alias-node.js';
84
86
  export * from './operation-node/alter-column-node.js';
85
87
  export * from './operation-node/alter-table-node.js';
86
88
  export * from './operation-node/and-node.js';
89
+ export * from './operation-node/case-node.js';
87
90
  export * from './operation-node/check-constraint-node.js';
88
91
  export * from './operation-node/column-definition-node.js';
89
92
  export * from './operation-node/column-node.js';
@@ -149,6 +152,7 @@ export * from './operation-node/update-query-node.js';
149
152
  export * from './operation-node/value-list-node.js';
150
153
  export * from './operation-node/value-node.js';
151
154
  export * from './operation-node/values-node.js';
155
+ export * from './operation-node/when-node.js';
152
156
  export * from './operation-node/where-node.js';
153
157
  export * from './operation-node/with-node.js';
154
158
  export * from './operation-node/explain-node.js';
@@ -13,6 +13,8 @@ import { QueryResult } from './driver/database-connection.js';
13
13
  import { CompiledQuery } from './query-compiler/compiled-query.js';
14
14
  import { QueryId } from './util/query-id.js';
15
15
  import { Compilable } from './util/compilable.js';
16
+ import { CaseBuilder } from './query-builder/case-builder.js';
17
+ import { Expression } from './expression/expression.js';
16
18
  /**
17
19
  * The main Kysely class.
18
20
  *
@@ -75,6 +77,13 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
75
77
  * Returns a {@link DatabaseIntrospector | database introspector}.
76
78
  */
77
79
  get introspection(): DatabaseIntrospector;
80
+ /**
81
+ * Creates a `case` statement/operator.
82
+ *
83
+ * See {@link ExpressionBuilder.case} for more information.
84
+ */
85
+ case(): CaseBuilder<DB, keyof DB>;
86
+ case<V>(value: Expression<V>): CaseBuilder<DB, keyof DB, V>;
78
87
  /**
79
88
  * Returns a {@link FunctionModule} that can be used to write type safe function
80
89
  * calls.
@@ -138,7 +147,7 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
138
147
  * name: 'Catto',
139
148
  * species: 'cat'
140
149
  * })
141
- * .returning('*')
150
+ * .returningAll()
142
151
  * .executeTakeFirst()
143
152
  * })
144
153
  * ```
@@ -180,6 +189,10 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
180
189
  * Returns a copy of this Kysely instance without any plugins.
181
190
  */
182
191
  withoutPlugins(): Kysely<DB>;
192
+ /**
193
+ * @override
194
+ */
195
+ withSchema(schema: string): Kysely<DB>;
183
196
  /**
184
197
  * Returns a copy of this Kysely instance with tables added to its
185
198
  * database type.
@@ -279,7 +292,7 @@ export declare class Transaction<DB> extends Kysely<DB> {
279
292
  * name: 'Catto',
280
293
  * species: 'cat'
281
294
  * })
282
- * .returning('*')
295
+ * .returningAll()
283
296
  * .executeTakeFirst()
284
297
  * })
285
298
  * ```
@@ -327,6 +340,10 @@ export declare class Transaction<DB> extends Kysely<DB> {
327
340
  * Returns a copy of this Kysely instance without any plugins.
328
341
  */
329
342
  withoutPlugins(): Transaction<DB>;
343
+ /**
344
+ * @override
345
+ */
346
+ withSchema(schema: string): Transaction<DB>;
330
347
  /**
331
348
  * Returns a copy of this Kysely instance with tables added to its
332
349
  * database type.
@@ -4,7 +4,7 @@ import { DynamicModule } from './dynamic/dynamic.js';
4
4
  import { DefaultConnectionProvider } from './driver/default-connection-provider.js';
5
5
  import { QueryCreator } from './query-creator.js';
6
6
  import { DefaultQueryExecutor } from './query-executor/default-query-executor.js';
7
- import { freeze, isObject } from './util/object-utils.js';
7
+ import { freeze, isObject, isUndefined } from './util/object-utils.js';
8
8
  import { RuntimeDriver } from './driver/runtime-driver.js';
9
9
  import { SingleConnectionProvider } from './driver/single-connection-provider.js';
10
10
  import { TRANSACTION_ISOLATION_LEVELS, } from './driver/driver.js';
@@ -13,6 +13,10 @@ import { createFunctionModule, } from './query-builder/function-module.js';
13
13
  import { Log } from './util/log.js';
14
14
  import { createQueryId } from './util/query-id.js';
15
15
  import { isCompilable } from './util/compilable.js';
16
+ import { CaseBuilder } from './query-builder/case-builder.js';
17
+ import { CaseNode } from './operation-node/case-node.js';
18
+ import { parseExpression } from './parser/expression-parser.js';
19
+ import { WithSchemaPlugin } from './plugin/with-schema/with-schema-plugin.js';
16
20
  /**
17
21
  * The main Kysely class.
18
22
  *
@@ -106,6 +110,11 @@ export class Kysely extends QueryCreator {
106
110
  get introspection() {
107
111
  return this.#props.dialect.createIntrospector(this.withoutPlugins());
108
112
  }
113
+ case(value) {
114
+ return new CaseBuilder({
115
+ node: CaseNode.create(isUndefined(value) ? undefined : parseExpression(value)),
116
+ });
117
+ }
109
118
  /**
110
119
  * Returns a {@link FunctionModule} that can be used to write type safe function
111
120
  * calls.
@@ -171,7 +180,7 @@ export class Kysely extends QueryCreator {
171
180
  * name: 'Catto',
172
181
  * species: 'cat'
173
182
  * })
174
- * .returning('*')
183
+ * .returningAll()
175
184
  * .executeTakeFirst()
176
185
  * })
177
186
  * ```
@@ -227,6 +236,15 @@ export class Kysely extends QueryCreator {
227
236
  executor: this.#props.executor.withoutPlugins(),
228
237
  });
229
238
  }
239
+ /**
240
+ * @override
241
+ */
242
+ withSchema(schema) {
243
+ return new Kysely({
244
+ ...this.#props,
245
+ executor: this.#props.executor.withPluginAtFront(new WithSchemaPlugin(schema)),
246
+ });
247
+ }
230
248
  /**
231
249
  * Returns a copy of this Kysely instance with tables added to its
232
250
  * database type.
@@ -327,6 +345,15 @@ export class Transaction extends Kysely {
327
345
  executor: this.#props.executor.withoutPlugins(),
328
346
  });
329
347
  }
348
+ /**
349
+ * @override
350
+ */
351
+ withSchema(schema) {
352
+ return new Transaction({
353
+ ...this.#props,
354
+ executor: this.#props.executor.withPluginAtFront(new WithSchemaPlugin(schema)),
355
+ });
356
+ }
330
357
  withTables() {
331
358
  return new Transaction({ ...this.#props });
332
359
  }
@@ -1,13 +1,10 @@
1
1
  import { OperationNode } from './operation-node.js';
2
2
  import { OverNode } from './over-node.js';
3
- import { SelectionNode } from './selection-node.js';
4
- import { SimpleReferenceExpressionNode } from './simple-reference-expression-node.js';
5
3
  import { WhereNode } from './where-node.js';
6
- declare type AggregateFunction = 'avg' | 'count' | 'max' | 'min' | 'sum';
7
4
  export interface AggregateFunctionNode extends OperationNode {
8
5
  readonly kind: 'AggregateFunctionNode';
9
- readonly func: AggregateFunction;
10
- readonly aggregated: SimpleReferenceExpressionNode | SelectionNode;
6
+ readonly func: string;
7
+ readonly aggregated: readonly OperationNode[];
11
8
  readonly distinct?: boolean;
12
9
  readonly filter?: WhereNode;
13
10
  readonly over?: OverNode;
@@ -17,10 +14,9 @@ export interface AggregateFunctionNode extends OperationNode {
17
14
  */
18
15
  export declare const AggregateFunctionNode: Readonly<{
19
16
  is(node: OperationNode): node is AggregateFunctionNode;
20
- create(aggregateFunction: AggregateFunction, aggregated: SimpleReferenceExpressionNode | SelectionNode): AggregateFunctionNode;
17
+ create(aggregateFunction: string, aggregated?: readonly OperationNode[]): AggregateFunctionNode;
21
18
  cloneWithDistinct(aggregateFunctionNode: AggregateFunctionNode): AggregateFunctionNode;
22
19
  cloneWithFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
23
20
  cloneWithOrFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
24
21
  cloneWithOver(aggregateFunctionNode: AggregateFunctionNode, over?: OverNode): AggregateFunctionNode;
25
22
  }>;
26
- export {};
@@ -8,7 +8,7 @@ export const AggregateFunctionNode = freeze({
8
8
  is(node) {
9
9
  return node.kind === 'AggregateFunctionNode';
10
10
  },
11
- create(aggregateFunction, aggregated) {
11
+ create(aggregateFunction, aggregated = []) {
12
12
  return freeze({
13
13
  kind: 'AggregateFunctionNode',
14
14
  func: aggregateFunction,
@@ -1,12 +1,11 @@
1
1
  import { OperationNode } from './operation-node.js';
2
2
  import { ColumnNode } from './column-node.js';
3
- import { DataTypeNode } from './data-type-node.js';
4
3
  import { RawNode } from './raw-node.js';
5
4
  export declare type AlterColumnNodeProps = Omit<AlterColumnNode, 'kind' | 'column'>;
6
5
  export interface AlterColumnNode extends OperationNode {
7
6
  readonly kind: 'AlterColumnNode';
8
7
  readonly column: ColumnNode;
9
- readonly dataType?: DataTypeNode;
8
+ readonly dataType?: OperationNode;
10
9
  readonly dataTypeExpression?: RawNode;
11
10
  readonly setDefault?: OperationNode;
12
11
  readonly dropDefault?: true;
@@ -24,7 +24,7 @@ export interface AlterTableNode extends OperationNode {
24
24
  */
25
25
  export declare const AlterTableNode: Readonly<{
26
26
  is(node: OperationNode): node is AlterTableNode;
27
- create(table: string): AlterTableNode;
27
+ create(table: TableNode): AlterTableNode;
28
28
  cloneWithTableProps(node: AlterTableNode, props: AlterTableNodeTableProps): AlterTableNode;
29
29
  cloneWithColumnAlteration(node: AlterTableNode, columnAlteration: AlterTableColumnAlterationNode): AlterTableNode;
30
30
  }>;
@@ -1,6 +1,5 @@
1
1
  /// <reference types="./alter-table-node.d.ts" />
2
2
  import { freeze } from '../util/object-utils.js';
3
- import { TableNode } from './table-node.js';
4
3
  /**
5
4
  * @internal
6
5
  */
@@ -11,7 +10,7 @@ export const AlterTableNode = freeze({
11
10
  create(table) {
12
11
  return freeze({
13
12
  kind: 'AlterTableNode',
14
- table: TableNode.create(table),
13
+ table,
15
14
  });
16
15
  },
17
16
  cloneWithTableProps(node, props) {
@@ -0,0 +1,19 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ import { WhenNode } from './when-node.js';
3
+ export interface CaseNode extends OperationNode {
4
+ readonly kind: 'CaseNode';
5
+ readonly value?: OperationNode;
6
+ readonly when?: ReadonlyArray<WhenNode>;
7
+ readonly else?: OperationNode;
8
+ readonly isStatement?: boolean;
9
+ }
10
+ /**
11
+ * @internal
12
+ */
13
+ export declare const CaseNode: Readonly<{
14
+ is(node: OperationNode): node is CaseNode;
15
+ create(value?: OperationNode): CaseNode;
16
+ cloneWithWhen(caseNode: CaseNode, when: WhenNode): CaseNode;
17
+ cloneWithThen(caseNode: CaseNode, then: OperationNode): CaseNode;
18
+ cloneWith(caseNode: CaseNode, props: Partial<Pick<CaseNode, 'else' | 'isStatement'>>): CaseNode;
19
+ }>;