kysely 0.27.4 → 0.27.6

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 (222) hide show
  1. package/.renovaterc.json +3 -0
  2. package/CODE_OF_CONDUCT.md +183 -0
  3. package/CONTRIBUTING.md +121 -23
  4. package/FUNDING.md +25 -0
  5. package/README.md +13 -2
  6. package/deno.check.d.ts +86 -0
  7. package/deno.check.json +21 -0
  8. package/dist/cjs/dialect/dialect-adapter-base.d.ts +11 -2
  9. package/dist/cjs/dialect/dialect-adapter.d.ts +11 -2
  10. package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +11 -2
  11. package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +37 -29
  12. package/dist/cjs/dialect/mssql/mssql-driver.js +20 -13
  13. package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +11 -2
  14. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +4 -0
  15. package/dist/cjs/dialect/mysql/mysql-driver.js +3 -0
  16. package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +11 -2
  17. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +10 -3
  18. package/dist/cjs/dialect/postgres/postgres-driver.js +3 -0
  19. package/dist/cjs/dialect/postgres/postgres-introspector.js +5 -1
  20. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +11 -2
  21. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +66 -44
  22. package/dist/cjs/driver/dummy-driver.d.ts +13 -12
  23. package/dist/cjs/driver/dummy-driver.js +13 -12
  24. package/dist/cjs/dynamic/dynamic.d.ts +6 -6
  25. package/dist/cjs/dynamic/dynamic.js +6 -6
  26. package/dist/cjs/expression/expression-builder.d.ts +154 -61
  27. package/dist/cjs/expression/expression-wrapper.d.ts +92 -23
  28. package/dist/cjs/expression/expression.d.ts +40 -5
  29. package/dist/cjs/helpers/mssql.d.ts +74 -14
  30. package/dist/cjs/helpers/mssql.js +74 -14
  31. package/dist/cjs/helpers/mysql.d.ts +14 -10
  32. package/dist/cjs/helpers/mysql.js +14 -10
  33. package/dist/cjs/helpers/postgres.d.ts +7 -4
  34. package/dist/cjs/helpers/postgres.js +7 -4
  35. package/dist/cjs/helpers/sqlite.d.ts +41 -16
  36. package/dist/cjs/helpers/sqlite.js +41 -16
  37. package/dist/cjs/kysely.d.ts +99 -41
  38. package/dist/cjs/kysely.js +60 -36
  39. package/dist/cjs/migration/file-migration-provider.d.ts +2 -2
  40. package/dist/cjs/migration/file-migration-provider.js +2 -2
  41. package/dist/cjs/migration/migrator.d.ts +90 -15
  42. package/dist/cjs/migration/migrator.js +95 -17
  43. package/dist/cjs/operation-node/aggregate-function-node.d.ts +4 -0
  44. package/dist/cjs/operation-node/aggregate-function-node.js +9 -0
  45. package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
  46. package/dist/cjs/operation-node/data-type-node.js +12 -0
  47. package/dist/cjs/operation-node/delete-query-node.d.ts +1 -0
  48. package/dist/cjs/operation-node/insert-query-node.d.ts +1 -0
  49. package/dist/cjs/operation-node/merge-query-node.d.ts +1 -0
  50. package/dist/cjs/operation-node/operation-node-transformer.d.ts +9 -3
  51. package/dist/cjs/operation-node/operation-node-transformer.js +14 -3
  52. package/dist/cjs/operation-node/query-node.d.ts +4 -0
  53. package/dist/cjs/operation-node/query-node.js +8 -0
  54. package/dist/cjs/operation-node/select-query-node.d.ts +0 -1
  55. package/dist/cjs/operation-node/select-query-node.js +0 -8
  56. package/dist/cjs/operation-node/update-query-node.d.ts +1 -0
  57. package/dist/cjs/parser/insert-values-parser.js +3 -1
  58. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +52 -25
  59. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +24 -19
  60. package/dist/cjs/plugin/camel-case/camel-case.js +4 -1
  61. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
  62. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
  63. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
  64. package/dist/cjs/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
  65. package/dist/cjs/plugin/kysely-plugin.d.ts +28 -6
  66. package/dist/cjs/plugin/noop-plugin.d.ts +28 -6
  67. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +62 -9
  68. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +34 -3
  69. package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +28 -6
  70. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  71. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +26 -0
  72. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +43 -1
  73. package/dist/cjs/query-builder/aggregate-function-builder.js +30 -0
  74. package/dist/cjs/query-builder/delete-query-builder.d.ts +137 -45
  75. package/dist/cjs/query-builder/delete-query-builder.js +76 -26
  76. package/dist/cjs/query-builder/function-module.d.ts +35 -88
  77. package/dist/cjs/query-builder/insert-query-builder.d.ts +239 -65
  78. package/dist/cjs/query-builder/insert-query-builder.js +188 -52
  79. package/dist/cjs/query-builder/insert-result.d.ts +10 -5
  80. package/dist/cjs/query-builder/insert-result.js +10 -5
  81. package/dist/cjs/query-builder/json-path-builder.d.ts +33 -9
  82. package/dist/cjs/query-builder/json-path-builder.js +8 -5
  83. package/dist/cjs/query-builder/merge-query-builder.d.ts +159 -21
  84. package/dist/cjs/query-builder/merge-query-builder.js +68 -6
  85. package/dist/cjs/query-builder/on-conflict-builder.d.ts +51 -18
  86. package/dist/cjs/query-builder/on-conflict-builder.js +41 -16
  87. package/dist/cjs/query-builder/output-interface.d.ts +50 -7
  88. package/dist/cjs/query-builder/returning-interface.d.ts +5 -5
  89. package/dist/cjs/query-builder/select-query-builder-expression.d.ts +8 -0
  90. package/dist/cjs/query-builder/select-query-builder.d.ts +295 -63
  91. package/dist/cjs/query-builder/select-query-builder.js +7 -7
  92. package/dist/cjs/query-builder/update-query-builder.d.ts +138 -29
  93. package/dist/cjs/query-builder/update-query-builder.js +75 -10
  94. package/dist/cjs/query-builder/update-result.d.ts +2 -2
  95. package/dist/cjs/query-builder/update-result.js +2 -2
  96. package/dist/cjs/query-builder/where-interface.d.ts +5 -1
  97. package/dist/cjs/query-compiler/default-query-compiler.js +20 -0
  98. package/dist/cjs/query-creator.d.ts +66 -18
  99. package/dist/cjs/query-creator.js +2 -2
  100. package/dist/cjs/raw-builder/raw-builder.d.ts +29 -7
  101. package/dist/cjs/raw-builder/sql.d.ts +27 -8
  102. package/dist/cjs/schema/alter-column-builder.d.ts +17 -3
  103. package/dist/cjs/schema/alter-column-builder.js +17 -3
  104. package/dist/cjs/schema/alter-table-add-index-builder.d.ts +43 -9
  105. package/dist/cjs/schema/alter-table-add-index-builder.js +26 -9
  106. package/dist/cjs/schema/column-definition-builder.d.ts +283 -26
  107. package/dist/cjs/schema/column-definition-builder.js +283 -26
  108. package/dist/cjs/schema/create-table-builder.d.ts +86 -33
  109. package/dist/cjs/schema/create-table-builder.js +86 -33
  110. package/dist/cjs/util/column-type.d.ts +5 -9
  111. package/dist/cjs/util/require-all-props.d.ts +4 -2
  112. package/dist/cjs/util/require-all-props.js +4 -2
  113. package/dist/cjs/util/streamable.d.ts +1 -1
  114. package/dist/cjs/util/type-utils.d.ts +4 -2
  115. package/dist/esm/dialect/dialect-adapter-base.d.ts +11 -2
  116. package/dist/esm/dialect/dialect-adapter.d.ts +11 -2
  117. package/dist/esm/dialect/mssql/mssql-adapter.d.ts +11 -2
  118. package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +37 -29
  119. package/dist/esm/dialect/mssql/mssql-driver.js +20 -13
  120. package/dist/esm/dialect/mysql/mysql-adapter.d.ts +11 -2
  121. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +4 -0
  122. package/dist/esm/dialect/mysql/mysql-driver.js +3 -0
  123. package/dist/esm/dialect/postgres/postgres-adapter.d.ts +11 -2
  124. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +10 -3
  125. package/dist/esm/dialect/postgres/postgres-driver.js +3 -0
  126. package/dist/esm/dialect/postgres/postgres-introspector.js +5 -1
  127. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +11 -2
  128. package/dist/esm/dialect/sqlite/sqlite-introspector.js +66 -44
  129. package/dist/esm/driver/dummy-driver.d.ts +13 -12
  130. package/dist/esm/driver/dummy-driver.js +13 -12
  131. package/dist/esm/dynamic/dynamic.d.ts +6 -6
  132. package/dist/esm/dynamic/dynamic.js +6 -6
  133. package/dist/esm/expression/expression-builder.d.ts +154 -61
  134. package/dist/esm/expression/expression-wrapper.d.ts +92 -23
  135. package/dist/esm/expression/expression.d.ts +40 -5
  136. package/dist/esm/helpers/mssql.d.ts +74 -14
  137. package/dist/esm/helpers/mssql.js +74 -14
  138. package/dist/esm/helpers/mysql.d.ts +14 -10
  139. package/dist/esm/helpers/mysql.js +14 -10
  140. package/dist/esm/helpers/postgres.d.ts +7 -4
  141. package/dist/esm/helpers/postgres.js +7 -4
  142. package/dist/esm/helpers/sqlite.d.ts +41 -16
  143. package/dist/esm/helpers/sqlite.js +41 -16
  144. package/dist/esm/kysely.d.ts +99 -41
  145. package/dist/esm/kysely.js +60 -36
  146. package/dist/esm/migration/file-migration-provider.d.ts +2 -2
  147. package/dist/esm/migration/file-migration-provider.js +2 -2
  148. package/dist/esm/migration/migrator.d.ts +90 -15
  149. package/dist/esm/migration/migrator.js +95 -17
  150. package/dist/esm/operation-node/aggregate-function-node.d.ts +4 -0
  151. package/dist/esm/operation-node/aggregate-function-node.js +9 -0
  152. package/dist/esm/operation-node/data-type-node.d.ts +1 -1
  153. package/dist/esm/operation-node/data-type-node.js +12 -0
  154. package/dist/esm/operation-node/delete-query-node.d.ts +1 -0
  155. package/dist/esm/operation-node/insert-query-node.d.ts +1 -0
  156. package/dist/esm/operation-node/merge-query-node.d.ts +1 -0
  157. package/dist/esm/operation-node/operation-node-transformer.d.ts +9 -3
  158. package/dist/esm/operation-node/operation-node-transformer.js +14 -3
  159. package/dist/esm/operation-node/query-node.d.ts +4 -0
  160. package/dist/esm/operation-node/query-node.js +8 -0
  161. package/dist/esm/operation-node/select-query-node.d.ts +0 -1
  162. package/dist/esm/operation-node/select-query-node.js +0 -8
  163. package/dist/esm/operation-node/update-query-node.d.ts +1 -0
  164. package/dist/esm/parser/insert-values-parser.js +3 -1
  165. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +52 -25
  166. package/dist/esm/plugin/camel-case/camel-case-plugin.js +24 -19
  167. package/dist/esm/plugin/camel-case/camel-case.js +4 -1
  168. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
  169. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
  170. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
  171. package/dist/esm/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
  172. package/dist/esm/plugin/kysely-plugin.d.ts +28 -6
  173. package/dist/esm/plugin/noop-plugin.d.ts +28 -6
  174. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +62 -9
  175. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +34 -3
  176. package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +28 -6
  177. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  178. package/dist/esm/plugin/with-schema/with-schema-transformer.js +26 -0
  179. package/dist/esm/query-builder/aggregate-function-builder.d.ts +43 -1
  180. package/dist/esm/query-builder/aggregate-function-builder.js +30 -0
  181. package/dist/esm/query-builder/delete-query-builder.d.ts +137 -45
  182. package/dist/esm/query-builder/delete-query-builder.js +76 -26
  183. package/dist/esm/query-builder/function-module.d.ts +35 -88
  184. package/dist/esm/query-builder/insert-query-builder.d.ts +239 -65
  185. package/dist/esm/query-builder/insert-query-builder.js +188 -52
  186. package/dist/esm/query-builder/insert-result.d.ts +10 -5
  187. package/dist/esm/query-builder/insert-result.js +10 -5
  188. package/dist/esm/query-builder/json-path-builder.d.ts +33 -9
  189. package/dist/esm/query-builder/json-path-builder.js +8 -5
  190. package/dist/esm/query-builder/merge-query-builder.d.ts +159 -21
  191. package/dist/esm/query-builder/merge-query-builder.js +68 -6
  192. package/dist/esm/query-builder/on-conflict-builder.d.ts +51 -18
  193. package/dist/esm/query-builder/on-conflict-builder.js +41 -16
  194. package/dist/esm/query-builder/output-interface.d.ts +50 -7
  195. package/dist/esm/query-builder/returning-interface.d.ts +5 -5
  196. package/dist/esm/query-builder/select-query-builder-expression.d.ts +8 -0
  197. package/dist/esm/query-builder/select-query-builder.d.ts +295 -63
  198. package/dist/esm/query-builder/select-query-builder.js +7 -7
  199. package/dist/esm/query-builder/update-query-builder.d.ts +138 -29
  200. package/dist/esm/query-builder/update-query-builder.js +75 -10
  201. package/dist/esm/query-builder/update-result.d.ts +2 -2
  202. package/dist/esm/query-builder/update-result.js +2 -2
  203. package/dist/esm/query-builder/where-interface.d.ts +5 -1
  204. package/dist/esm/query-compiler/default-query-compiler.js +20 -0
  205. package/dist/esm/query-creator.d.ts +66 -18
  206. package/dist/esm/query-creator.js +2 -2
  207. package/dist/esm/raw-builder/raw-builder.d.ts +29 -7
  208. package/dist/esm/raw-builder/sql.d.ts +27 -8
  209. package/dist/esm/schema/alter-column-builder.d.ts +17 -3
  210. package/dist/esm/schema/alter-column-builder.js +17 -3
  211. package/dist/esm/schema/alter-table-add-index-builder.d.ts +43 -9
  212. package/dist/esm/schema/alter-table-add-index-builder.js +26 -9
  213. package/dist/esm/schema/column-definition-builder.d.ts +283 -26
  214. package/dist/esm/schema/column-definition-builder.js +283 -26
  215. package/dist/esm/schema/create-table-builder.d.ts +86 -33
  216. package/dist/esm/schema/create-table-builder.js +86 -33
  217. package/dist/esm/util/column-type.d.ts +5 -9
  218. package/dist/esm/util/require-all-props.d.ts +4 -2
  219. package/dist/esm/util/require-all-props.js +4 -2
  220. package/dist/esm/util/streamable.d.ts +1 -1
  221. package/dist/esm/util/type-utils.d.ts +4 -2
  222. package/package.json +28 -23
@@ -20,16 +20,29 @@ exports.NO_MIGRATIONS = (0, object_utils_js_1.freeze)({ __noMigrations__: true }
20
20
  * other way.
21
21
  *
22
22
  * ```ts
23
- * import { promises as fs } from 'fs'
24
- * import path from 'path'
23
+ * import { promises as fs } from 'node:fs'
24
+ * import path from 'node:path'
25
+ * import * as Sqlite from 'better-sqlite3'
26
+ * import {
27
+ * FileMigrationProvider,
28
+ * Kysely,
29
+ * Migrator,
30
+ * SqliteDialect
31
+ * } from 'kysely'
32
+ *
33
+ * const db = new Kysely<any>({
34
+ * dialect: new SqliteDialect({
35
+ * database: Sqlite(':memory:')
36
+ * })
37
+ * })
25
38
  *
26
39
  * const migrator = new Migrator({
27
40
  * db,
28
41
  * provider: new FileMigrationProvider({
29
42
  * fs,
30
- * path,
31
43
  * // Path to the folder that contains all your migrations.
32
- * migrationFolder: 'some/path/to/migrations'
44
+ * migrationFolder: 'some/path/to/migrations',
45
+ * path,
33
46
  * })
34
47
  * })
35
48
  * ```
@@ -50,6 +63,7 @@ class Migrator {
50
63
  .withPlugin(this.#schemaPlugin)
51
64
  .selectFrom(this.#migrationTable)
52
65
  .select(['name', 'timestamp'])
66
+ .$narrowType()
53
67
  .execute()
54
68
  : [];
55
69
  const migrations = await this.#resolveMigrations();
@@ -78,19 +92,18 @@ class Migrator {
78
92
  * ### Examples
79
93
  *
80
94
  * ```ts
81
- * const db = new Kysely<Database>({
82
- * dialect: new PostgresDialect({
83
- * host: 'localhost',
84
- * database: 'kysely_test',
85
- * }),
86
- * })
95
+ * import { promises as fs } from 'node:fs'
96
+ * import path from 'node:path'
97
+ * import * as Sqlite from 'better-sqlite3'
98
+ * import { FileMigrationProvider, Migrator } from 'kysely'
87
99
  *
88
100
  * const migrator = new Migrator({
89
101
  * db,
90
- * provider: new FileMigrationProvider(
91
- * // Path to the folder that contains all your migrations.
92
- * 'some/path/to/migrations'
93
- * )
102
+ * provider: new FileMigrationProvider({
103
+ * fs,
104
+ * migrationFolder: 'some/path/to/migrations',
105
+ * path,
106
+ * })
94
107
  * })
95
108
  *
96
109
  * const { error, results } = await migrator.migrateToLatest()
@@ -123,6 +136,20 @@ class Migrator {
123
136
  * ### Examples
124
137
  *
125
138
  * ```ts
139
+ * import { promises as fs } from 'node:fs'
140
+ * import path from 'node:path'
141
+ * import { FileMigrationProvider, Migrator } from 'kysely'
142
+ *
143
+ * const migrator = new Migrator({
144
+ * db,
145
+ * provider: new FileMigrationProvider({
146
+ * fs,
147
+ * // Path to the folder that contains all your migrations.
148
+ * migrationFolder: 'some/path/to/migrations',
149
+ * path,
150
+ * })
151
+ * })
152
+ *
126
153
  * await migrator.migrateTo('some_migration')
127
154
  * ```
128
155
  *
@@ -132,6 +159,20 @@ class Migrator {
132
159
  * you can use a special constant `NO_MIGRATIONS`:
133
160
  *
134
161
  * ```ts
162
+ * import { promises as fs } from 'node:fs'
163
+ * import path from 'node:path'
164
+ * import { FileMigrationProvider, Migrator, NO_MIGRATIONS } from 'kysely'
165
+ *
166
+ * const migrator = new Migrator({
167
+ * db,
168
+ * provider: new FileMigrationProvider({
169
+ * fs,
170
+ * // Path to the folder that contains all your migrations.
171
+ * migrationFolder: 'some/path/to/migrations',
172
+ * path,
173
+ * })
174
+ * })
175
+ *
135
176
  * await migrator.migrateTo(NO_MIGRATIONS)
136
177
  * ```
137
178
  */
@@ -170,6 +211,20 @@ class Migrator {
170
211
  * ### Examples
171
212
  *
172
213
  * ```ts
214
+ * import { promises as fs } from 'node:fs'
215
+ * import path from 'node:path'
216
+ * import { FileMigrationProvider, Migrator } from 'kysely'
217
+ *
218
+ * const migrator = new Migrator({
219
+ * db,
220
+ * provider: new FileMigrationProvider({
221
+ * fs,
222
+ * // Path to the folder that contains all your migrations.
223
+ * migrationFolder: 'some/path/to/migrations',
224
+ * path,
225
+ * })
226
+ * })
227
+ *
173
228
  * await migrator.migrateUp()
174
229
  * ```
175
230
  */
@@ -187,6 +242,20 @@ class Migrator {
187
242
  * ### Examples
188
243
  *
189
244
  * ```ts
245
+ * import { promises as fs } from 'node:fs'
246
+ * import path from 'node:path'
247
+ * import { FileMigrationProvider, Migrator } from 'kysely'
248
+ *
249
+ * const migrator = new Migrator({
250
+ * db,
251
+ * provider: new FileMigrationProvider({
252
+ * fs,
253
+ * // Path to the folder that contains all your migrations.
254
+ * migrationFolder: 'some/path/to/migrations',
255
+ * path,
256
+ * })
257
+ * })
258
+ *
190
259
  * await migrator.migrateDown()
191
260
  * ```
192
261
  */
@@ -397,10 +466,19 @@ class Migrator {
397
466
  const executedMigrations = await db
398
467
  .withPlugin(this.#schemaPlugin)
399
468
  .selectFrom(this.#migrationTable)
400
- .select('name')
401
- .orderBy(['timestamp', 'name'])
469
+ .select(['name', 'timestamp'])
470
+ .$narrowType()
402
471
  .execute();
403
- return executedMigrations.map((it) => it.name);
472
+ const nameComparator = this.#props.nameComparator || ((a, b) => a.localeCompare(b));
473
+ return (executedMigrations
474
+ // https://github.com/kysely-org/kysely/issues/843
475
+ .sort((a, b) => {
476
+ if (a.timestamp === b.timestamp) {
477
+ return nameComparator(a.name, b.name);
478
+ }
479
+ return (new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
480
+ })
481
+ .map((it) => it.name));
404
482
  }
405
483
  #ensureNoMissingMigrations(migrations, executedMigrations) {
406
484
  // Ensure all executed migrations exist in the `migrations` list.
@@ -1,11 +1,14 @@
1
1
  import { OperationNode } from './operation-node.js';
2
2
  import { OverNode } from './over-node.js';
3
3
  import { WhereNode } from './where-node.js';
4
+ import { OrderByNode } from './order-by-node.js';
5
+ import { OrderByItemNode } from './order-by-item-node.js';
4
6
  export interface AggregateFunctionNode extends OperationNode {
5
7
  readonly kind: 'AggregateFunctionNode';
6
8
  readonly func: string;
7
9
  readonly aggregated: readonly OperationNode[];
8
10
  readonly distinct?: boolean;
11
+ readonly orderBy?: OrderByNode;
9
12
  readonly filter?: WhereNode;
10
13
  readonly over?: OverNode;
11
14
  }
@@ -16,6 +19,7 @@ export declare const AggregateFunctionNode: Readonly<{
16
19
  is(node: OperationNode): node is AggregateFunctionNode;
17
20
  create(aggregateFunction: string, aggregated?: readonly OperationNode[]): AggregateFunctionNode;
18
21
  cloneWithDistinct(aggregateFunctionNode: AggregateFunctionNode): AggregateFunctionNode;
22
+ cloneWithOrderBy(aggregateFunctionNode: AggregateFunctionNode, orderItems: ReadonlyArray<OrderByItemNode>): AggregateFunctionNode;
19
23
  cloneWithFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
20
24
  cloneWithOrFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
21
25
  cloneWithOver(aggregateFunctionNode: AggregateFunctionNode, over?: OverNode): AggregateFunctionNode;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AggregateFunctionNode = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
5
  const where_node_js_1 = require("./where-node.js");
6
+ const order_by_node_js_1 = require("./order-by-node.js");
6
7
  /**
7
8
  * @internal
8
9
  */
@@ -23,6 +24,14 @@ exports.AggregateFunctionNode = (0, object_utils_js_1.freeze)({
23
24
  distinct: true,
24
25
  });
25
26
  },
27
+ cloneWithOrderBy(aggregateFunctionNode, orderItems) {
28
+ return (0, object_utils_js_1.freeze)({
29
+ ...aggregateFunctionNode,
30
+ orderBy: aggregateFunctionNode.orderBy
31
+ ? order_by_node_js_1.OrderByNode.cloneWithItems(aggregateFunctionNode.orderBy, orderItems)
32
+ : order_by_node_js_1.OrderByNode.create(orderItems),
33
+ });
34
+ },
26
35
  cloneWithFilter(aggregateFunctionNode, filter) {
27
36
  return (0, object_utils_js_1.freeze)({
28
37
  ...aggregateFunctionNode,
@@ -1,5 +1,5 @@
1
1
  import { OperationNode } from './operation-node.js';
2
- declare const SIMPLE_COLUMN_DATA_TYPES: readonly ["varchar", "char", "text", "integer", "int2", "int4", "int8", "smallint", "bigint", "boolean", "real", "double precision", "float4", "float8", "decimal", "numeric", "binary", "bytea", "date", "datetime", "time", "timetz", "timestamp", "timestamptz", "serial", "bigserial", "uuid", "json", "jsonb", "blob", "varbinary"];
2
+ declare const SIMPLE_COLUMN_DATA_TYPES: readonly ["varchar", "char", "text", "integer", "int2", "int4", "int8", "smallint", "bigint", "boolean", "real", "double precision", "float4", "float8", "decimal", "numeric", "binary", "bytea", "date", "datetime", "time", "timetz", "timestamp", "timestamptz", "serial", "bigserial", "uuid", "json", "jsonb", "blob", "varbinary", "int4range", "int4multirange", "int8range", "int8multirange", "numrange", "nummultirange", "tsrange", "tsmultirange", "tstzrange", "tstzmultirange", "daterange", "datemultirange"];
3
3
  type SimpleColumnDataType = (typeof SIMPLE_COLUMN_DATA_TYPES)[number];
4
4
  export type ColumnDataType = SimpleColumnDataType | `varchar(${number})` | `char(${number})` | `decimal(${number}, ${number})` | `numeric(${number}, ${number})` | `binary(${number})` | `datetime(${number})` | `time(${number})` | `timetz(${number})` | `timestamp(${number})` | `timestamptz(${number})` | `varbinary(${number})`;
5
5
  export type DataTypeParams = Omit<DataTypeNode, 'kind' | 'dataType'>;
@@ -35,6 +35,18 @@ const SIMPLE_COLUMN_DATA_TYPES = [
35
35
  'jsonb',
36
36
  'blob',
37
37
  'varbinary',
38
+ 'int4range',
39
+ 'int4multirange',
40
+ 'int8range',
41
+ 'int8multirange',
42
+ 'numrange',
43
+ 'nummultirange',
44
+ 'tsrange',
45
+ 'tsmultirange',
46
+ 'tstzrange',
47
+ 'tstzmultirange',
48
+ 'daterange',
49
+ 'datemultirange',
38
50
  ];
39
51
  const COLUMN_DATA_TYPE_REGEX = [
40
52
  /^varchar\(\d+\)$/,
@@ -22,6 +22,7 @@ export interface DeleteQueryNode extends OperationNode {
22
22
  readonly orderBy?: OrderByNode;
23
23
  readonly limit?: LimitNode;
24
24
  readonly explain?: ExplainNode;
25
+ readonly endModifiers?: ReadonlyArray<OperationNode>;
25
26
  readonly top?: TopNode;
26
27
  readonly output?: OutputNode;
27
28
  }
@@ -22,6 +22,7 @@ export interface InsertQueryNode extends OperationNode {
22
22
  readonly replace?: boolean;
23
23
  readonly explain?: ExplainNode;
24
24
  readonly defaultValues?: boolean;
25
+ readonly endModifiers?: ReadonlyArray<OperationNode>;
25
26
  readonly top?: TopNode;
26
27
  readonly output?: OutputNode;
27
28
  }
@@ -14,6 +14,7 @@ export interface MergeQueryNode extends OperationNode {
14
14
  readonly with?: WithNode;
15
15
  readonly top?: TopNode;
16
16
  readonly output?: OutputNode;
17
+ readonly endModifiers?: ReadonlyArray<OperationNode>;
17
18
  }
18
19
  /**
19
20
  * @internal
@@ -106,9 +106,12 @@ import { OutputNode } from './output-node.js';
106
106
  * snake_case, you'd do something like this:
107
107
  *
108
108
  * ```ts
109
+ * import { type IdentifierNode, OperationNodeTransformer } from 'kysely'
110
+ * import snakeCase from 'lodash/snakeCase'
111
+ *
109
112
  * class CamelCaseTransformer extends OperationNodeTransformer {
110
- * transformIdentifier(node: IdentifierNode): IdentifierNode {
111
- * node = super.transformIdentifier(node),
113
+ * override transformIdentifier(node: IdentifierNode): IdentifierNode {
114
+ * node = super.transformIdentifier(node)
112
115
  *
113
116
  * return {
114
117
  * ...node,
@@ -118,7 +121,10 @@ import { OutputNode } from './output-node.js';
118
121
  * }
119
122
  *
120
123
  * const transformer = new CamelCaseTransformer()
121
- * const tree = transformer.transformNode(tree)
124
+ *
125
+ * const query = db.selectFrom('person').select(['first_name', 'last_name'])
126
+ *
127
+ * const tree = transformer.transformNode(query.toOperationNode())
122
128
  * ```
123
129
  */
124
130
  export declare class OperationNodeTransformer {
@@ -17,9 +17,12 @@ const require_all_props_js_1 = require("../util/require-all-props.js");
17
17
  * snake_case, you'd do something like this:
18
18
  *
19
19
  * ```ts
20
+ * import { type IdentifierNode, OperationNodeTransformer } from 'kysely'
21
+ * import snakeCase from 'lodash/snakeCase'
22
+ *
20
23
  * class CamelCaseTransformer extends OperationNodeTransformer {
21
- * transformIdentifier(node: IdentifierNode): IdentifierNode {
22
- * node = super.transformIdentifier(node),
24
+ * override transformIdentifier(node: IdentifierNode): IdentifierNode {
25
+ * node = super.transformIdentifier(node)
23
26
  *
24
27
  * return {
25
28
  * ...node,
@@ -29,7 +32,10 @@ const require_all_props_js_1 = require("../util/require-all-props.js");
29
32
  * }
30
33
  *
31
34
  * const transformer = new CamelCaseTransformer()
32
- * const tree = transformer.transformNode(tree)
35
+ *
36
+ * const query = db.selectFrom('person').select(['first_name', 'last_name'])
37
+ *
38
+ * const tree = transformer.transformNode(query.toOperationNode())
33
39
  * ```
34
40
  */
35
41
  class OperationNodeTransformer {
@@ -263,6 +269,7 @@ class OperationNodeTransformer {
263
269
  returning: this.transformNode(node.returning),
264
270
  onConflict: this.transformNode(node.onConflict),
265
271
  onDuplicateKey: this.transformNode(node.onDuplicateKey),
272
+ endModifiers: this.transformNodeList(node.endModifiers),
266
273
  with: this.transformNode(node.with),
267
274
  ignore: node.ignore,
268
275
  replace: node.replace,
@@ -286,6 +293,7 @@ class OperationNodeTransformer {
286
293
  joins: this.transformNodeList(node.joins),
287
294
  where: this.transformNode(node.where),
288
295
  returning: this.transformNode(node.returning),
296
+ endModifiers: this.transformNodeList(node.endModifiers),
289
297
  with: this.transformNode(node.with),
290
298
  orderBy: this.transformNode(node.orderBy),
291
299
  limit: this.transformNode(node.limit),
@@ -383,6 +391,7 @@ class OperationNodeTransformer {
383
391
  where: this.transformNode(node.where),
384
392
  updates: this.transformNodeList(node.updates),
385
393
  returning: this.transformNode(node.returning),
394
+ endModifiers: this.transformNodeList(node.endModifiers),
386
395
  with: this.transformNode(node.with),
387
396
  explain: this.transformNode(node.explain),
388
397
  limit: this.transformNode(node.limit),
@@ -689,6 +698,7 @@ class OperationNodeTransformer {
689
698
  kind: 'AggregateFunctionNode',
690
699
  aggregated: this.transformNodeList(node.aggregated),
691
700
  distinct: node.distinct,
701
+ orderBy: this.transformNode(node.orderBy),
692
702
  filter: this.transformNode(node.filter),
693
703
  func: node.func,
694
704
  over: this.transformNode(node.over),
@@ -799,6 +809,7 @@ class OperationNodeTransformer {
799
809
  whens: this.transformNodeList(node.whens),
800
810
  with: this.transformNode(node.with),
801
811
  top: this.transformNode(node.top),
812
+ endModifiers: this.transformNodeList(node.endModifiers),
802
813
  output: this.transformNode(node.output),
803
814
  });
804
815
  }
@@ -32,11 +32,15 @@ type HasTop = {
32
32
  type HasOutput = {
33
33
  output?: OutputNode;
34
34
  };
35
+ type HasEndModifiers = {
36
+ endModifiers?: ReadonlyArray<OperationNode>;
37
+ };
35
38
  /**
36
39
  * @internal
37
40
  */
38
41
  export declare const QueryNode: Readonly<{
39
42
  is(node: OperationNode): node is QueryNode;
43
+ cloneWithEndModifier<T extends HasEndModifiers>(node: T, modifier: OperationNode): T;
40
44
  cloneWithWhere<T extends HasWhere>(node: T, operation: OperationNode): T;
41
45
  cloneWithJoin<T extends HasJoins>(node: T, join: JoinNode): T;
42
46
  cloneWithReturning<T extends HasReturning>(node: T, selections: ReadonlyArray<SelectionNode>): T;
@@ -22,6 +22,14 @@ exports.QueryNode = (0, object_utils_js_1.freeze)({
22
22
  delete_query_node_js_1.DeleteQueryNode.is(node) ||
23
23
  merge_query_node_js_1.MergeQueryNode.is(node));
24
24
  },
25
+ cloneWithEndModifier(node, modifier) {
26
+ return (0, object_utils_js_1.freeze)({
27
+ ...node,
28
+ endModifiers: node.endModifiers
29
+ ? (0, object_utils_js_1.freeze)([...node.endModifiers, modifier])
30
+ : (0, object_utils_js_1.freeze)([modifier]),
31
+ });
32
+ },
25
33
  cloneWithWhere(node, operation) {
26
34
  return (0, object_utils_js_1.freeze)({
27
35
  ...node,
@@ -46,7 +46,6 @@ export declare const SelectQueryNode: Readonly<{
46
46
  cloneWithSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
47
47
  cloneWithDistinctOn(select: SelectQueryNode, expressions: ReadonlyArray<OperationNode>): SelectQueryNode;
48
48
  cloneWithFrontModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
49
- cloneWithEndModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
50
49
  cloneWithOrderByItems(selectNode: SelectQueryNode, items: ReadonlyArray<OrderByItemNode>): SelectQueryNode;
51
50
  cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
52
51
  cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
@@ -50,14 +50,6 @@ exports.SelectQueryNode = (0, object_utils_js_1.freeze)({
50
50
  : (0, object_utils_js_1.freeze)([modifier]),
51
51
  });
52
52
  },
53
- cloneWithEndModifier(select, modifier) {
54
- return (0, object_utils_js_1.freeze)({
55
- ...select,
56
- endModifiers: select.endModifiers
57
- ? (0, object_utils_js_1.freeze)([...select.endModifiers, modifier])
58
- : (0, object_utils_js_1.freeze)([modifier]),
59
- });
60
- },
61
53
  cloneWithOrderByItems(selectNode, items) {
62
54
  return (0, object_utils_js_1.freeze)({
63
55
  ...selectNode,
@@ -22,6 +22,7 @@ export interface UpdateQueryNode extends OperationNode {
22
22
  readonly returning?: ReturningNode;
23
23
  readonly with?: WithNode;
24
24
  readonly explain?: ExplainNode;
25
+ readonly endModifiers?: ReadonlyArray<OperationNode>;
25
26
  readonly limit?: LimitNode;
26
27
  readonly top?: TopNode;
27
28
  readonly output?: OutputNode;
@@ -42,9 +42,11 @@ function parseRowValues(row, columns) {
42
42
  length: columns.size,
43
43
  });
44
44
  let hasUndefinedOrComplexColumns = false;
45
+ let indexedRowColumns = rowColumns.length;
45
46
  for (const col of rowColumns) {
46
47
  const columnIdx = columns.get(col);
47
48
  if ((0, object_utils_js_1.isUndefined)(columnIdx)) {
49
+ indexedRowColumns--;
48
50
  continue;
49
51
  }
50
52
  const value = row[col];
@@ -53,7 +55,7 @@ function parseRowValues(row, columns) {
53
55
  }
54
56
  rowValues[columnIdx] = value;
55
57
  }
56
- const hasMissingColumns = rowColumns.length < columns.size;
58
+ const hasMissingColumns = indexedRowColumns < columns.size;
57
59
  if (hasMissingColumns || hasUndefinedOrComplexColumns) {
58
60
  const defaultValue = default_insert_value_node_js_1.DefaultInsertValueNode.create();
59
61
  return value_list_node_js_1.ValueListNode.create(rowValues.map((it) => (0, object_utils_js_1.isUndefined)(it) ? defaultValue : (0, value_parser_js_1.parseValueExpression)(it)));
@@ -42,38 +42,39 @@ export interface CamelCasePluginOptions {
42
42
  * using `CamelCasePlugin` we would setup Kysely like this:
43
43
  *
44
44
  * ```ts
45
- * interface Person {
46
- * firstName: string
47
- * lastName: string
48
- * }
45
+ * import * as Sqlite from 'better-sqlite3'
46
+ * import { CamelCasePlugin, Kysely, SqliteDialect } from 'kysely'
49
47
  *
50
- * interface Database {
51
- * personTable: Person
48
+ * interface CamelCasedDatabase {
49
+ * userMetadata: {
50
+ * firstName: string
51
+ * lastName: string
52
+ * }
52
53
  * }
53
54
  *
54
- * const db = new Kysely<Database>({
55
- * dialect: new PostgresDialect({
56
- * database: 'kysely_test',
57
- * host: 'localhost',
55
+ * const db = new Kysely<CamelCasedDatabase>({
56
+ * dialect: new SqliteDialect({
57
+ * database: new Sqlite(':memory:'),
58
58
  * }),
59
- * plugins: [
60
- * new CamelCasePlugin()
61
- * ]
59
+ * plugins: [new CamelCasePlugin()],
62
60
  * })
63
61
  *
64
- * const person = await db.selectFrom('personTable')
62
+ * const person = await db.selectFrom('userMetadata')
65
63
  * .where('firstName', '=', 'Arnold')
66
64
  * .select(['firstName', 'lastName'])
67
65
  * .executeTakeFirst()
68
66
  *
69
- * // generated sql:
70
- * // select first_name, last_name from person_table where first_name = $1
71
- *
72
67
  * if (person) {
73
68
  * console.log(person.firstName)
74
69
  * }
75
70
  * ```
76
71
  *
72
+ * The generated SQL (SQLite):
73
+ *
74
+ * ```sql
75
+ * select "first_name", "last_name" from "user_metadata" where "first_name" = ?
76
+ * ```
77
+ *
77
78
  * As you can see from the example, __everything__ needs to be defined
78
79
  * in camelCase in the TypeScript code: table names, columns, schemas,
79
80
  * __everything__. When using the `CamelCasePlugin` Kysely works as if
@@ -88,11 +89,15 @@ export interface CamelCasePluginOptions {
88
89
  * ```ts
89
90
  * class MyCamelCasePlugin extends CamelCasePlugin {
90
91
  * protected override snakeCase(str: string): string {
91
- * return mySnakeCase(str)
92
+ * // ...
93
+ *
94
+ * return str
92
95
  * }
93
96
  *
94
97
  * protected override camelCase(str: string): string {
95
- * return myCamelCase(str)
98
+ * // ...
99
+ *
100
+ * return str
96
101
  * }
97
102
  * }
98
103
  * ```
@@ -111,19 +116,41 @@ export declare class CamelCasePlugin implements KyselyPlugin {
111
116
  * can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
112
117
  *
113
118
  * ```ts
114
- * const plugin = {
115
- * data: new WeakMap<QueryId, SomeData>(),
119
+ * import type {
120
+ * KyselyPlugin,
121
+ * QueryResult,
122
+ * RootOperationNode,
123
+ * UnknownRow
124
+ * } from 'kysely'
125
+ *
126
+ * interface MyData {
127
+ * // ...
128
+ * }
129
+ * const data = new WeakMap<any, MyData>()
116
130
  *
131
+ * const plugin = {
117
132
  * transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
118
- * this.data.set(args.queryId, something)
133
+ * const something: MyData = {}
134
+ *
135
+ * // ...
136
+ *
137
+ * data.set(args.queryId, something)
138
+ *
139
+ * // ...
140
+ *
119
141
  * return args.node
120
142
  * },
121
143
  *
122
- * transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow> {
123
- * const data = this.data.get(args.queryId)
144
+ * async transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
145
+ * // ...
146
+ *
147
+ * const something = data.get(args.queryId)
148
+ *
149
+ * // ...
150
+ *
124
151
  * return args.result
125
152
  * }
126
- * }
153
+ * } satisfies KyselyPlugin
127
154
  * ```
128
155
  *
129
156
  * You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
@@ -13,38 +13,39 @@ const camel_case_js_1 = require("./camel-case.js");
13
13
  * using `CamelCasePlugin` we would setup Kysely like this:
14
14
  *
15
15
  * ```ts
16
- * interface Person {
17
- * firstName: string
18
- * lastName: string
19
- * }
16
+ * import * as Sqlite from 'better-sqlite3'
17
+ * import { CamelCasePlugin, Kysely, SqliteDialect } from 'kysely'
20
18
  *
21
- * interface Database {
22
- * personTable: Person
19
+ * interface CamelCasedDatabase {
20
+ * userMetadata: {
21
+ * firstName: string
22
+ * lastName: string
23
+ * }
23
24
  * }
24
25
  *
25
- * const db = new Kysely<Database>({
26
- * dialect: new PostgresDialect({
27
- * database: 'kysely_test',
28
- * host: 'localhost',
26
+ * const db = new Kysely<CamelCasedDatabase>({
27
+ * dialect: new SqliteDialect({
28
+ * database: new Sqlite(':memory:'),
29
29
  * }),
30
- * plugins: [
31
- * new CamelCasePlugin()
32
- * ]
30
+ * plugins: [new CamelCasePlugin()],
33
31
  * })
34
32
  *
35
- * const person = await db.selectFrom('personTable')
33
+ * const person = await db.selectFrom('userMetadata')
36
34
  * .where('firstName', '=', 'Arnold')
37
35
  * .select(['firstName', 'lastName'])
38
36
  * .executeTakeFirst()
39
37
  *
40
- * // generated sql:
41
- * // select first_name, last_name from person_table where first_name = $1
42
- *
43
38
  * if (person) {
44
39
  * console.log(person.firstName)
45
40
  * }
46
41
  * ```
47
42
  *
43
+ * The generated SQL (SQLite):
44
+ *
45
+ * ```sql
46
+ * select "first_name", "last_name" from "user_metadata" where "first_name" = ?
47
+ * ```
48
+ *
48
49
  * As you can see from the example, __everything__ needs to be defined
49
50
  * in camelCase in the TypeScript code: table names, columns, schemas,
50
51
  * __everything__. When using the `CamelCasePlugin` Kysely works as if
@@ -59,11 +60,15 @@ const camel_case_js_1 = require("./camel-case.js");
59
60
  * ```ts
60
61
  * class MyCamelCasePlugin extends CamelCasePlugin {
61
62
  * protected override snakeCase(str: string): string {
62
- * return mySnakeCase(str)
63
+ * // ...
64
+ *
65
+ * return str
63
66
  * }
64
67
  *
65
68
  * protected override camelCase(str: string): string {
66
- * return myCamelCase(str)
69
+ * // ...
70
+ *
71
+ * return str
67
72
  * }
68
73
  * }
69
74
  * ```
@@ -23,7 +23,10 @@ function createSnakeCaseMapper({ upperCase = false, underscoreBeforeDigits = fal
23
23
  // If underScoreBeforeDigits is true then, well, insert an underscore
24
24
  // before digits :). Only the first digit gets an underscore if
25
25
  // there are multiple.
26
- if (underscoreBeforeDigits && isDigit(char) && !isDigit(prevChar)) {
26
+ if (underscoreBeforeDigits &&
27
+ isDigit(char) &&
28
+ !isDigit(prevChar) &&
29
+ !out.endsWith('_')) {
27
30
  out += '_' + char;
28
31
  continue;
29
32
  }