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.
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
package/README.md CHANGED
@@ -1,7 +1,14 @@
1
1
  [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://stand-with-ukraine.pp.ua)
2
2
 
3
- [![Discord](https://img.shields.io/discord/890118421587578920)](https://discord.gg/xyBJ3GwvAm)
3
+ [![Discord](https://img.shields.io/discord/890118421587578920?logo=discord&style=flat)](https://discord.gg/xyBJ3GwvAm)
4
4
  [![Tests](https://github.com/koskimas/kysely/actions/workflows/test.yml/badge.svg)](https://github.com/koskimas/kysely)
5
+ [![License](https://img.shields.io/github/license/kysely-org/kysely?style=flat)](https://github.com/kysely-org/kysely/blob/master/LICENSE)
6
+ [![Issues](https://img.shields.io/github/issues-closed/kysely-org/kysely?logo=github)](https://github.com/kysely-org/kysely/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)
7
+ [![Pull Requests](https://img.shields.io/github/issues-pr-closed/kysely-org/kysely?label=PRs&logo=github&style=flat)](https://github.com/kysely-org/kysely/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc)
8
+ [![Vulnerabilities](https://img.shields.io/snyk/vulnerabilities/github/kysely-org/kysely?style=flat&logo=snyk)](https://snyk.io/advisor/npm-package/kysely)
9
+ [![Downloads](https://img.shields.io/npm/dw/kysely?logo=npm)](https://www.npmjs.com/package/kysely)
10
+ [![Bundle Size](https://img.shields.io/bundlephobia/minzip/kysely?label=size&logo=npm)](https://bundlephobia.com/package/kysely)
11
+ [![Social](https://img.shields.io/twitter/follow/kysely_?style=social)](https://twitter.com/kysely_)
5
12
 
6
13
  # [Kysely](https://kysely-org.github.io/kysely/index.html)
7
14
 
@@ -73,14 +80,16 @@ for [3rd party dialects](https://kysely-org.github.io/kysely/interfaces/Dialect.
73
80
 
74
81
  ### 3rd party dialects
75
82
 
76
- - [AWS Data API](https://github.com/serverless-stack/kysely-data-api)
77
83
  - [PlanetScale Serverless Driver](https://github.com/depot/kysely-planetscale)
78
- - [SingleStore Data API](https://github.com/igalklebanov/kysely-singlestore)
79
- - [D1](https://github.com/aidenwallis/kysely-d1)
84
+ - [Cloudflare D1](https://github.com/aidenwallis/kysely-d1)
85
+ - [AWS RDS Data API](https://github.com/serverless-stack/kysely-data-api)
80
86
  - [SurrealDB](https://github.com/igalklebanov/kysely-surrealdb)
81
- - [sqld](https://github.com/libsql/kysely-libsql)
82
87
  - [Neon](https://github.com/seveibar/kysely-neon)
83
88
  - [AWS S3 Select](https://github.com/igalklebanov/kysely-s3-select)
89
+ - [libSQL/sqld](https://github.com/libsql/kysely-libsql)
90
+ - [SingleStore Data API](https://github.com/igalklebanov/kysely-singlestore)
91
+ - [Postgres.js](https://github.com/igalklebanov/kysely-postgres-js)
92
+ - [Fetch driver](https://github.com/andersgee/kysely-fetch-driver)
84
93
 
85
94
  # Minimal example
86
95
 
@@ -186,7 +195,7 @@ type UpdateablePerson = Updateable<PersonTable>
186
195
 
187
196
  # Playground
188
197
 
189
- [@wirekang](https://github.com/wirekang) has created a [playground for Kysely](https://wirekang.github.io/kysely-playground/?p=f&i=-NLp3n_P5fyeQKMQda8n). You can use to quickly test stuff out and for creating code examples for your issues, PRs and discord messages.
198
+ [@wirekang](https://github.com/wirekang) has created a [playground for Kysely](https://kyse.link). You can use to quickly test stuff out and for creating code examples for your issues, PRs and discord messages.
190
199
 
191
200
  # Generating types
192
201
 
@@ -587,10 +596,18 @@ that aren't possible at this point of the project. Knex was also originally writ
587
596
  the typescript typings were added afterwards. That always leads to compromises in the types. Designing
588
597
  a library for typescript from the ground up produces much better and simpler types.
589
598
 
590
- # How to contribute to Kysely
591
-
592
- See [CONTRIBUTING.md](./CONTRIBUTING.md).
593
-
594
- # Sponsors
595
-
596
- <a href="https://vercel.com/?utm_source=kysely&utm_campaign=oss"><img src="https://kysely.dev/img/powered-by-vercel.svg" alt="Powered by Vercel" /></a>
599
+ # Contributors
600
+
601
+ <p align="center">
602
+ <a href="https://github.com/kysely-org/kysely/graphs/contributors">
603
+ <img src="https://contrib.rocks/image?repo=kysely-org/kysely" />
604
+ </a>
605
+ </br>
606
+ <span>Want to contribute? Check out our <a href="./CONTRIBUTING.md" >contribution guidelines</a>.</span>
607
+ </p>
608
+
609
+ <p align="center">
610
+ <a href="https://vercel.com/?utm_source=kysely&utm_campaign=oss">
611
+ <img src="https://kysely.dev/img/powered-by-vercel.svg" alt="Powered by Vercel" />
612
+ </a>
613
+ </p>
@@ -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>[];
@@ -50,7 +50,10 @@ class PostgresIntrospector {
50
50
  .as('auto_incrementing'),
51
51
  ])
52
52
  // r == normal table
53
- .where('c.relkind', 'in', ['r', 'v'])
53
+ .where(({ cmpr, or }) => or([
54
+ cmpr('c.relkind', '=', 'r'),
55
+ cmpr('c.relkind', '=', 'v'),
56
+ ]))
54
57
  .where('ns.nspname', '!~', '^pg_')
55
58
  .where('ns.nspname', '!=', 'information_schema')
56
59
  // No system columns
@@ -76,24 +76,24 @@ class RuntimeDriver {
76
76
  return await executeQuery.call(connection, compiledQuery);
77
77
  }
78
78
  catch (error) {
79
- this.#logError(error, compiledQuery, startTime);
79
+ await this.#logError(error, compiledQuery, startTime);
80
80
  throw error;
81
81
  }
82
82
  finally {
83
- this.#logQuery(compiledQuery, startTime);
83
+ await this.#logQuery(compiledQuery, startTime);
84
84
  }
85
85
  };
86
86
  }
87
- #logError(error, compiledQuery, startTime) {
88
- this.#log.error(() => ({
87
+ async #logError(error, compiledQuery, startTime) {
88
+ await this.#log.error(() => ({
89
89
  level: 'error',
90
90
  error,
91
91
  query: compiledQuery,
92
92
  queryDurationMillis: this.#calculateDurationMillis(startTime),
93
93
  }));
94
94
  }
95
- #logQuery(compiledQuery, startTime) {
96
- this.#log.query(() => ({
95
+ async #logQuery(compiledQuery, startTime) {
96
+ await this.#log.query(() => ({
97
97
  level: 'query',
98
98
  query: compiledQuery,
99
99
  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()
@@ -72,7 +72,7 @@ class DynamicModule {
72
72
  *
73
73
  * const [person] = await db.selectFrom('person')
74
74
  * .select([
75
- * ref<PossibleColumns>(columnFromUserInput)
75
+ * ref<PossibleColumns>(columnFromUserInput),
76
76
  * 'id'
77
77
  * ])
78
78
  * .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
  *
@@ -17,6 +17,9 @@ const unary_operation_parser_js_1 = require("../parser/unary-operation-parser.js
17
17
  const value_parser_js_1 = require("../parser/value-parser.js");
18
18
  const noop_query_executor_js_1 = require("../query-executor/noop-query-executor.js");
19
19
  const value_node_js_1 = require("../operation-node/value-node.js");
20
+ const case_builder_js_1 = require("../query-builder/case-builder.js");
21
+ const case_node_js_1 = require("../operation-node/case-node.js");
22
+ const object_utils_js_1 = require("../util/object-utils.js");
20
23
  function createExpressionBuilder(executor = noop_query_executor_js_1.NOOP_QUERY_EXECUTOR) {
21
24
  function unary(op, expr) {
22
25
  return new expression_wrapper_js_1.ExpressionWrapper((0, unary_operation_parser_js_1.parseUnaryOperation)(op, expr));
@@ -32,6 +35,13 @@ function createExpressionBuilder(executor = noop_query_executor_js_1.NOOP_QUERY_
32
35
  queryNode: select_query_node_js_1.SelectQueryNode.create((0, table_parser_js_1.parseTableExpressionOrList)(table)),
33
36
  });
34
37
  },
38
+ case(reference) {
39
+ return new case_builder_js_1.CaseBuilder({
40
+ node: case_node_js_1.CaseNode.create((0, object_utils_js_1.isUndefined)(reference)
41
+ ? undefined
42
+ : (0, reference_parser_js_1.parseReferenceExpression)(reference)),
43
+ });
44
+ },
35
45
  ref(reference) {
36
46
  return new expression_wrapper_js_1.ExpressionWrapper((0, reference_parser_js_1.parseStringReference)(reference));
37
47
  },
@@ -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
  *
@@ -7,7 +7,7 @@ const identifier_node_js_1 = require("../operation-node/identifier-node.js");
7
7
  const reference_node_js_1 = require("../operation-node/reference-node.js");
8
8
  const sql_js_1 = require("../raw-builder/sql.js");
9
9
  /**
10
- * A MySQL helper for aggregating a subquery (or other expression) into a JSON array.
10
+ * A MySQL helper for aggregating a subquery into a JSON array.
11
11
  *
12
12
  * NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
13
13
  * While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
@@ -56,7 +56,7 @@ function jsonArrayFrom(expr) {
56
56
  }
57
57
  exports.jsonArrayFrom = jsonArrayFrom;
58
58
  /**
59
- * A MySQL helper for turning a subquery (or other expression) into a JSON object.
59
+ * A MySQL helper for turning a subquery into a JSON object.
60
60
  *
61
61
  * The subquery must only return one row.
62
62
  *
@@ -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/cjs/index.js CHANGED
@@ -20,6 +20,7 @@ __exportStar(require("./query-creator.js"), exports);
20
20
  __exportStar(require("./expression/expression.js"), exports);
21
21
  var expression_builder_js_1 = require("./expression/expression-builder.js");
22
22
  Object.defineProperty(exports, "expressionBuilder", { enumerable: true, get: function () { return expression_builder_js_1.expressionBuilder; } });
23
+ __exportStar(require("./expression/expression-wrapper.js"), exports);
23
24
  __exportStar(require("./query-builder/where-interface.js"), exports);
24
25
  __exportStar(require("./query-builder/returning-interface.js"), exports);
25
26
  __exportStar(require("./query-builder/having-interface.js"), exports);
@@ -35,6 +36,7 @@ __exportStar(require("./query-builder/delete-result.js"), exports);
35
36
  __exportStar(require("./query-builder/update-result.js"), exports);
36
37
  __exportStar(require("./query-builder/on-conflict-builder.js"), exports);
37
38
  __exportStar(require("./query-builder/aggregate-function-builder.js"), exports);
39
+ __exportStar(require("./query-builder/case-builder.js"), exports);
38
40
  __exportStar(require("./raw-builder/raw-builder.js"), exports);
39
41
  __exportStar(require("./raw-builder/sql.js"), exports);
40
42
  __exportStar(require("./query-executor/query-executor.js"), exports);
@@ -101,6 +103,7 @@ __exportStar(require("./operation-node/alias-node.js"), exports);
101
103
  __exportStar(require("./operation-node/alter-column-node.js"), exports);
102
104
  __exportStar(require("./operation-node/alter-table-node.js"), exports);
103
105
  __exportStar(require("./operation-node/and-node.js"), exports);
106
+ __exportStar(require("./operation-node/case-node.js"), exports);
104
107
  __exportStar(require("./operation-node/check-constraint-node.js"), exports);
105
108
  __exportStar(require("./operation-node/column-definition-node.js"), exports);
106
109
  __exportStar(require("./operation-node/column-node.js"), exports);
@@ -166,6 +169,7 @@ __exportStar(require("./operation-node/update-query-node.js"), exports);
166
169
  __exportStar(require("./operation-node/value-list-node.js"), exports);
167
170
  __exportStar(require("./operation-node/value-node.js"), exports);
168
171
  __exportStar(require("./operation-node/values-node.js"), exports);
172
+ __exportStar(require("./operation-node/when-node.js"), exports);
169
173
  __exportStar(require("./operation-node/where-node.js"), exports);
170
174
  __exportStar(require("./operation-node/with-node.js"), exports);
171
175
  __exportStar(require("./operation-node/explain-node.js"), exports);
@@ -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.
@@ -15,6 +15,10 @@ const function_module_js_1 = require("./query-builder/function-module.js");
15
15
  const log_js_1 = require("./util/log.js");
16
16
  const query_id_js_1 = require("./util/query-id.js");
17
17
  const compilable_js_1 = require("./util/compilable.js");
18
+ const case_builder_js_1 = require("./query-builder/case-builder.js");
19
+ const case_node_js_1 = require("./operation-node/case-node.js");
20
+ const expression_parser_js_1 = require("./parser/expression-parser.js");
21
+ const with_schema_plugin_js_1 = require("./plugin/with-schema/with-schema-plugin.js");
18
22
  /**
19
23
  * The main Kysely class.
20
24
  *
@@ -108,6 +112,11 @@ class Kysely extends query_creator_js_1.QueryCreator {
108
112
  get introspection() {
109
113
  return this.#props.dialect.createIntrospector(this.withoutPlugins());
110
114
  }
115
+ case(value) {
116
+ return new case_builder_js_1.CaseBuilder({
117
+ node: case_node_js_1.CaseNode.create((0, object_utils_js_1.isUndefined)(value) ? undefined : (0, expression_parser_js_1.parseExpression)(value)),
118
+ });
119
+ }
111
120
  /**
112
121
  * Returns a {@link FunctionModule} that can be used to write type safe function
113
122
  * calls.
@@ -173,7 +182,7 @@ class Kysely extends query_creator_js_1.QueryCreator {
173
182
  * name: 'Catto',
174
183
  * species: 'cat'
175
184
  * })
176
- * .returning('*')
185
+ * .returningAll()
177
186
  * .executeTakeFirst()
178
187
  * })
179
188
  * ```
@@ -229,6 +238,15 @@ class Kysely extends query_creator_js_1.QueryCreator {
229
238
  executor: this.#props.executor.withoutPlugins(),
230
239
  });
231
240
  }
241
+ /**
242
+ * @override
243
+ */
244
+ withSchema(schema) {
245
+ return new Kysely({
246
+ ...this.#props,
247
+ executor: this.#props.executor.withPluginAtFront(new with_schema_plugin_js_1.WithSchemaPlugin(schema)),
248
+ });
249
+ }
232
250
  /**
233
251
  * Returns a copy of this Kysely instance with tables added to its
234
252
  * database type.
@@ -330,6 +348,15 @@ class Transaction extends Kysely {
330
348
  executor: this.#props.executor.withoutPlugins(),
331
349
  });
332
350
  }
351
+ /**
352
+ * @override
353
+ */
354
+ withSchema(schema) {
355
+ return new Transaction({
356
+ ...this.#props,
357
+ executor: this.#props.executor.withPluginAtFront(new with_schema_plugin_js_1.WithSchemaPlugin(schema)),
358
+ });
359
+ }
333
360
  withTables() {
334
361
  return new Transaction({ ...this.#props });
335
362
  }
@@ -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 {};
@@ -10,7 +10,7 @@ exports.AggregateFunctionNode = (0, object_utils_js_1.freeze)({
10
10
  is(node) {
11
11
  return node.kind === 'AggregateFunctionNode';
12
12
  },
13
- create(aggregateFunction, aggregated) {
13
+ create(aggregateFunction, aggregated = []) {
14
14
  return (0, object_utils_js_1.freeze)({
15
15
  kind: 'AggregateFunctionNode',
16
16
  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
  }>;
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AlterTableNode = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
- const table_node_js_1 = require("./table-node.js");
6
5
  /**
7
6
  * @internal
8
7
  */
@@ -13,7 +12,7 @@ exports.AlterTableNode = (0, object_utils_js_1.freeze)({
13
12
  create(table) {
14
13
  return (0, object_utils_js_1.freeze)({
15
14
  kind: 'AlterTableNode',
16
- table: table_node_js_1.TableNode.create(table),
15
+ table,
17
16
  });
18
17
  },
19
18
  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
+ }>;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CaseNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ const when_node_js_1 = require("./when-node.js");
6
+ /**
7
+ * @internal
8
+ */
9
+ exports.CaseNode = (0, object_utils_js_1.freeze)({
10
+ is(node) {
11
+ return node.kind === 'CaseNode';
12
+ },
13
+ create(value) {
14
+ return (0, object_utils_js_1.freeze)({
15
+ kind: 'CaseNode',
16
+ value,
17
+ });
18
+ },
19
+ cloneWithWhen(caseNode, when) {
20
+ return (0, object_utils_js_1.freeze)({
21
+ ...caseNode,
22
+ when: (0, object_utils_js_1.freeze)(caseNode.when ? [...caseNode.when, when] : [when]),
23
+ });
24
+ },
25
+ cloneWithThen(caseNode, then) {
26
+ return (0, object_utils_js_1.freeze)({
27
+ ...caseNode,
28
+ when: caseNode.when
29
+ ? (0, object_utils_js_1.freeze)([
30
+ ...caseNode.when.slice(0, -1),
31
+ when_node_js_1.WhenNode.cloneWithResult(caseNode.when[caseNode.when.length - 1], then),
32
+ ])
33
+ : undefined,
34
+ });
35
+ },
36
+ cloneWith(caseNode, props) {
37
+ return (0, object_utils_js_1.freeze)({
38
+ ...caseNode,
39
+ ...props,
40
+ });
41
+ },
42
+ });