kysely 0.16.4 → 0.16.8

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 (123) hide show
  1. package/README.md +118 -5
  2. package/dist/cjs/dialect/mysql/mysql-dialect.js +2 -1
  3. package/dist/cjs/dialect/mysql/mysql-driver.js +1 -1
  4. package/dist/cjs/dialect/postgres/postgres-dialect.js +2 -1
  5. package/dist/cjs/dialect/postgres/postgres-driver.js +1 -1
  6. package/dist/cjs/dialect/sqlite/sqlite-dialect.js +2 -1
  7. package/dist/cjs/dialect/sqlite/sqlite-driver.js +1 -1
  8. package/dist/cjs/driver/dummy-driver.d.ts +68 -0
  9. package/dist/cjs/driver/dummy-driver.js +62 -0
  10. package/dist/cjs/driver/runtime-driver.d.ts +1 -1
  11. package/dist/cjs/driver/runtime-driver.js +30 -33
  12. package/dist/cjs/index-nodeless.d.ts +2 -0
  13. package/dist/cjs/index-nodeless.js +2 -0
  14. package/dist/cjs/kysely.d.ts +8 -6
  15. package/dist/cjs/kysely.js +8 -6
  16. package/dist/cjs/migration/migrator.d.ts +2 -2
  17. package/dist/cjs/operation-node/primitive-value-list-node.d.ts +2 -3
  18. package/dist/cjs/operation-node/value-node.d.ts +3 -4
  19. package/dist/cjs/parser/complex-expression-parser.d.ts +1 -0
  20. package/dist/cjs/parser/complex-expression-parser.js +5 -1
  21. package/dist/cjs/parser/default-value-parser.d.ts +2 -3
  22. package/dist/cjs/parser/default-value-parser.js +2 -2
  23. package/dist/cjs/parser/insert-values-parser.js +4 -3
  24. package/dist/cjs/parser/reference-parser.d.ts +2 -3
  25. package/dist/cjs/parser/value-parser.d.ts +2 -3
  26. package/dist/cjs/parser/value-parser.js +6 -7
  27. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +48 -0
  28. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +19 -0
  29. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +9 -0
  30. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +42 -0
  31. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.d.ts +0 -0
  32. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.js +0 -0
  33. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.d.ts +0 -0
  34. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.js +0 -0
  35. package/dist/cjs/query-builder/delete-query-builder.d.ts +51 -9
  36. package/dist/cjs/query-builder/delete-query-builder.js +56 -8
  37. package/dist/cjs/query-builder/expression-builder.d.ts +1 -1
  38. package/dist/cjs/query-builder/expression-builder.js +2 -2
  39. package/dist/cjs/query-builder/function-builder.d.ts +29 -5
  40. package/dist/cjs/query-builder/function-builder.js +31 -7
  41. package/dist/cjs/query-builder/insert-query-builder.d.ts +53 -11
  42. package/dist/cjs/query-builder/insert-query-builder.js +58 -10
  43. package/dist/cjs/query-builder/select-query-builder.d.ts +58 -16
  44. package/dist/cjs/query-builder/select-query-builder.js +64 -15
  45. package/dist/cjs/query-builder/update-query-builder.d.ts +52 -9
  46. package/dist/cjs/query-builder/update-query-builder.js +57 -8
  47. package/dist/cjs/query-compiler/default-query-compiler.d.ts +1 -2
  48. package/dist/cjs/query-creator.d.ts +2 -2
  49. package/dist/cjs/query-creator.js +2 -2
  50. package/dist/cjs/query-executor/query-executor.js +3 -2
  51. package/dist/cjs/raw-builder/raw-builder.d.ts +2 -2
  52. package/dist/cjs/raw-builder/raw-builder.js +8 -1
  53. package/dist/cjs/schema/alter-table-builder.d.ts +30 -4
  54. package/dist/cjs/schema/alter-table-builder.js +2 -5
  55. package/dist/cjs/schema/column-definition-builder.d.ts +27 -2
  56. package/dist/cjs/schema/create-view-builder.js +1 -1
  57. package/dist/cjs/util/log.d.ts +1 -0
  58. package/dist/cjs/util/log.js +3 -0
  59. package/dist/cjs/util/object-utils.d.ts +5 -5
  60. package/dist/cjs/util/object-utils.js +52 -11
  61. package/dist/cjs/util/type-utils.d.ts +21 -0
  62. package/dist/esm/dialect/mysql/mysql-dialect.js +2 -1
  63. package/dist/esm/dialect/mysql/mysql-driver.js +2 -2
  64. package/dist/esm/dialect/postgres/postgres-dialect.js +2 -1
  65. package/dist/esm/dialect/postgres/postgres-driver.js +2 -2
  66. package/dist/esm/dialect/sqlite/sqlite-dialect.js +2 -1
  67. package/dist/esm/dialect/sqlite/sqlite-driver.js +2 -2
  68. package/dist/esm/driver/dummy-driver.d.ts +68 -0
  69. package/dist/esm/driver/dummy-driver.js +59 -0
  70. package/dist/esm/driver/runtime-driver.d.ts +1 -1
  71. package/dist/esm/driver/runtime-driver.js +29 -32
  72. package/dist/esm/index-nodeless.d.ts +2 -0
  73. package/dist/esm/index-nodeless.js +2 -0
  74. package/dist/esm/kysely.d.ts +8 -6
  75. package/dist/esm/kysely.js +8 -6
  76. package/dist/esm/migration/migrator.d.ts +2 -2
  77. package/dist/esm/operation-node/primitive-value-list-node.d.ts +2 -3
  78. package/dist/esm/operation-node/value-node.d.ts +3 -4
  79. package/dist/esm/parser/complex-expression-parser.d.ts +1 -0
  80. package/dist/esm/parser/complex-expression-parser.js +3 -0
  81. package/dist/esm/parser/default-value-parser.d.ts +2 -3
  82. package/dist/esm/parser/default-value-parser.js +2 -2
  83. package/dist/esm/parser/insert-values-parser.js +5 -4
  84. package/dist/esm/parser/reference-parser.d.ts +2 -3
  85. package/dist/esm/parser/reference-parser.js +1 -1
  86. package/dist/esm/parser/value-parser.d.ts +2 -3
  87. package/dist/esm/parser/value-parser.js +8 -9
  88. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +48 -0
  89. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +16 -0
  90. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +9 -0
  91. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +39 -0
  92. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.d.ts +0 -0
  93. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.js +0 -0
  94. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.d.ts +0 -0
  95. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.js +0 -0
  96. package/dist/esm/query-builder/delete-query-builder.d.ts +51 -9
  97. package/dist/esm/query-builder/delete-query-builder.js +56 -8
  98. package/dist/esm/query-builder/expression-builder.d.ts +1 -1
  99. package/dist/esm/query-builder/expression-builder.js +1 -1
  100. package/dist/esm/query-builder/function-builder.d.ts +29 -5
  101. package/dist/esm/query-builder/function-builder.js +31 -7
  102. package/dist/esm/query-builder/insert-query-builder.d.ts +53 -11
  103. package/dist/esm/query-builder/insert-query-builder.js +58 -10
  104. package/dist/esm/query-builder/select-query-builder.d.ts +58 -16
  105. package/dist/esm/query-builder/select-query-builder.js +64 -15
  106. package/dist/esm/query-builder/update-query-builder.d.ts +52 -9
  107. package/dist/esm/query-builder/update-query-builder.js +57 -8
  108. package/dist/esm/query-compiler/default-query-compiler.d.ts +1 -2
  109. package/dist/esm/query-creator.d.ts +2 -2
  110. package/dist/esm/query-creator.js +2 -2
  111. package/dist/esm/query-executor/query-executor.js +3 -2
  112. package/dist/esm/raw-builder/raw-builder.d.ts +2 -2
  113. package/dist/esm/raw-builder/raw-builder.js +8 -1
  114. package/dist/esm/schema/alter-table-builder.d.ts +30 -4
  115. package/dist/esm/schema/alter-table-builder.js +2 -5
  116. package/dist/esm/schema/column-definition-builder.d.ts +27 -2
  117. package/dist/esm/schema/create-view-builder.js +1 -1
  118. package/dist/esm/util/log.d.ts +1 -0
  119. package/dist/esm/util/log.js +3 -0
  120. package/dist/esm/util/object-utils.d.ts +5 -5
  121. package/dist/esm/util/object-utils.js +50 -9
  122. package/dist/esm/util/type-utils.d.ts +21 -0
  123. package/package.json +11 -5
package/README.md CHANGED
@@ -3,14 +3,15 @@
3
3
 
4
4
  # [Kysely](https://koskimas.github.io/kysely/index.html)
5
5
 
6
- A type-safe and autocompletion-friendly typescript SQL query builder for node.js. Inspired by
7
- [knex](http://knexjs.org/).
6
+ A type-safe and autocompletion-friendly typescript SQL query builder. Inspired by [knex](http://knexjs.org/).
7
+ Mainly developed for [node.js](https://nodejs.org/en/) but also runs on [deno](https://deno.land/) and
8
+ in the browser.
8
9
 
9
10
  ![](https://github.com/koskimas/kysely/blob/master/assets/demo.gif)
10
11
 
11
- Kysely's typings make sure you only refer to tables and columns that are visible to the part of the query
12
- you are writing. The result type only has the selected columns with correct types and aliases. This
13
- allows tools like vscode autocompletion to make your life so much easier.
12
+ Kysely makes sure you only refer to tables and columns that are visible to the part of the query
13
+ you are writing. The result type only has the selected columns with correct types and aliases. As an
14
+ added bonus you get autocompletion for all that stuff.
14
15
 
15
16
  As you can see in the gif above, through the pure magic of modern typescript, Kysely is even able to parse
16
17
  the alias given to `pet.name` and add the `pet_name` column to the result row type. Kysely is able to infer
@@ -32,7 +33,10 @@ You can find a more thorough introduction [here](https://www.jakso.me/blog/kysel
32
33
  - [Installation](#installation)
33
34
  - [Minimal example](#minimal-example)
34
35
  - [Query examples](#query-examples)
36
+ - [Recipes](https://github.com/koskimas/kysely/tree/master/recipes)
35
37
  - [Migrations](#migrations)
38
+ - [Deno](#deno)
39
+ - [Browser](#browser)
36
40
  - [API reference](https://koskimas.github.io/kysely/index.html)
37
41
  - [Changelog](https://github.com/koskimas/kysely/releases)
38
42
 
@@ -341,6 +345,8 @@ async function migrateToLatest() {
341
345
  console.error(error)
342
346
  process.exit(1)
343
347
  }
348
+
349
+ await db.destroy()
344
350
  }
345
351
 
346
352
  migrateToLatest()
@@ -350,6 +356,113 @@ The migration methods use a lock on the database level, and parallel calls are e
350
356
  This means that you can safely call `migrateToLatest` and other migration methods from multiple
351
357
  server instances simultaneously and the migrations are guaranteed to only be executed once.
352
358
 
359
+ # Deno
360
+
361
+ Kysely doesn't include drivers for deno, but you can still use Kysely as a query builder
362
+ or implement your own driver:
363
+
364
+ ```ts
365
+ // We use jsdeliver to get Kysely from npm. We also need to
366
+ // import the `dist/esm/index-nodeless.js` file instead of the
367
+ // root which has node dependencies.
368
+ import {
369
+ DummyDriver,
370
+ Generated,
371
+ Kysely,
372
+ PostgresAdapter,
373
+ PostgresIntrospector,
374
+ PostgresQueryCompiler,
375
+ } from 'https://cdn.jsdelivr.net/npm/kysely/dist/esm/index-nodeless.js'
376
+
377
+ interface Person {
378
+ id: Generated<number>
379
+ first_name: string
380
+ last_name: string | null
381
+ }
382
+
383
+ interface Database {
384
+ person: Person
385
+ }
386
+
387
+ const db = new Kysely<Database>({
388
+ dialect: {
389
+ createAdapter() {
390
+ return new PostgresAdapter()
391
+ },
392
+ createDriver() {
393
+ // You need a driver to be able to execute queries. In this example
394
+ // we use the dummy driver that never does anything.
395
+ return new DummyDriver()
396
+ },
397
+ createIntrospector(db: Kysely<unknown>) {
398
+ return new PostgresIntrospector(db)
399
+ },
400
+ createQueryCompiler() {
401
+ return new PostgresQueryCompiler()
402
+ },
403
+ },
404
+ })
405
+
406
+ const query = db.selectFrom('person').select('id')
407
+ const sql = query.compile()
408
+
409
+ console.log(sql.sql)
410
+ ```
411
+
412
+ # Browser
413
+
414
+ Kysely also runs in the browser as long as you import the `dist/esm/index-nodeless.js`
415
+ module instead of the root that has node dependencies. You can also import the
416
+ `dist/cjs/index-nodeless.js` file if you are using commonjs modules instead of ESM.
417
+
418
+ ```ts
419
+ import {
420
+ Kysely,
421
+ Generated,
422
+ DummyDriver,
423
+ SqliteAdapter,
424
+ SqliteIntrospector,
425
+ SqliteQueryCompiler,
426
+ } from 'kysely/dist/esm/index-nodeless.js'
427
+
428
+ interface Person {
429
+ id: Generated<number>
430
+ first_name: string
431
+ last_name: string | null
432
+ }
433
+
434
+ interface Database {
435
+ person: Person
436
+ }
437
+
438
+ const db = new Kysely<Database>({
439
+ dialect: {
440
+ createAdapter() {
441
+ return new SqliteAdapter()
442
+ },
443
+ createDriver() {
444
+ return new DummyDriver()
445
+ },
446
+ createIntrospector(db: Kysely<unknown>) {
447
+ return new SqliteIntrospector(db)
448
+ },
449
+ createQueryCompiler() {
450
+ return new SqliteQueryCompiler()
451
+ },
452
+ },
453
+ })
454
+
455
+ window.addEventListener('load', () => {
456
+ const sql = db.selectFrom('person').select('id').compile()
457
+
458
+ const result = document.createElement('span')
459
+ result.id = 'result'
460
+ result.innerHTML = sql.sql
461
+
462
+ document.body.appendChild(result)
463
+ })
464
+ ```
465
+
353
466
  # Why not just contribute to knex
354
467
 
355
468
  Kysely is very similar to knex, but it also attempts to fix things that I personally find not-so-good
@@ -5,6 +5,7 @@ const mysql_driver_js_1 = require("./mysql-driver.js");
5
5
  const mysql_query_compiler_js_1 = require("./mysql-query-compiler.js");
6
6
  const mysql_introspector_js_1 = require("./mysql-introspector.js");
7
7
  const mysql_adapter_js_1 = require("./mysql-adapter.js");
8
+ const object_utils_js_1 = require("../../util/object-utils.js");
8
9
  /**
9
10
  * MySQL dialect that uses the [mysql2](https://github.com/sidorares/node-mysql2#readme) library.
10
11
  *
@@ -15,7 +16,7 @@ const mysql_adapter_js_1 = require("./mysql-adapter.js");
15
16
  class MysqlDialect {
16
17
  #config;
17
18
  constructor(config) {
18
- this.#config = config;
19
+ this.#config = (0, object_utils_js_1.freeze)({ ...config });
19
20
  }
20
21
  createDriver() {
21
22
  return new mysql_driver_js_1.MysqlDriver(this.#config);
@@ -9,7 +9,7 @@ class MysqlDriver {
9
9
  #connections = new WeakMap();
10
10
  #pool;
11
11
  constructor(config) {
12
- this.#config = config;
12
+ this.#config = (0, object_utils_js_1.freeze)({ ...config });
13
13
  }
14
14
  async init() {
15
15
  // Import the `mysql2` module here instead at the top of the file
@@ -5,6 +5,7 @@ const postgres_driver_js_1 = require("./postgres-driver.js");
5
5
  const postgres_introspector_js_1 = require("./postgres-introspector.js");
6
6
  const postgres_query_compiler_js_1 = require("./postgres-query-compiler.js");
7
7
  const postgres_adapter_js_1 = require("./postgres-adapter.js");
8
+ const object_utils_js_1 = require("../../util/object-utils.js");
8
9
  /**
9
10
  * PostgreSQL dialect that uses the [pg](https://node-postgres.com/) library.
10
11
  *
@@ -18,7 +19,7 @@ const postgres_adapter_js_1 = require("./postgres-adapter.js");
18
19
  class PostgresDialect {
19
20
  #config;
20
21
  constructor(config) {
21
- this.#config = config;
22
+ this.#config = (0, object_utils_js_1.freeze)({ ...config });
22
23
  }
23
24
  createDriver() {
24
25
  return new postgres_driver_js_1.PostgresDriver(this.#config);
@@ -9,7 +9,7 @@ class PostgresDriver {
9
9
  #connections = new WeakMap();
10
10
  #pool = null;
11
11
  constructor(config) {
12
- this.#config = config;
12
+ this.#config = (0, object_utils_js_1.freeze)({ ...config });
13
13
  }
14
14
  async init() {
15
15
  // Import the `pg` module here instead at the top of the file
@@ -5,6 +5,7 @@ const sqlite_driver_js_1 = require("./sqlite-driver.js");
5
5
  const sqlite_query_compiler_js_1 = require("./sqlite-query-compiler.js");
6
6
  const sqlite_introspector_js_1 = require("./sqlite-introspector.js");
7
7
  const sqlite_adapter_js_1 = require("./sqlite-adapter.js");
8
+ const object_utils_js_1 = require("../../util/object-utils.js");
8
9
  /**
9
10
  * SQLite dialect that uses the [better-sqlite3](https://github.com/JoshuaWise/better-sqlite3) library.
10
11
  *
@@ -15,7 +16,7 @@ const sqlite_adapter_js_1 = require("./sqlite-adapter.js");
15
16
  class SqliteDialect {
16
17
  #config;
17
18
  constructor(config) {
18
- this.#config = config;
19
+ this.#config = (0, object_utils_js_1.freeze)({ ...config });
19
20
  }
20
21
  createDriver() {
21
22
  return new sqlite_driver_js_1.SqliteDriver(this.#config);
@@ -9,7 +9,7 @@ class SqliteDriver {
9
9
  #db;
10
10
  #connection;
11
11
  constructor(config) {
12
- this.#config = config;
12
+ this.#config = (0, object_utils_js_1.freeze)({ ...config });
13
13
  }
14
14
  async init() {
15
15
  // Import the `better-sqlite3` module here instead at the top of the file
@@ -0,0 +1,68 @@
1
+ import { DatabaseConnection } from './database-connection.js';
2
+ import { Driver } from './driver.js';
3
+ /**
4
+ * A driver that does absolutely nothing.
5
+ *
6
+ * You can use this to create Kysely instances solely for building queries
7
+ *
8
+ * ### Examples
9
+ *
10
+ * This example creates a Kysely instance for building postgres queries:
11
+ *
12
+ * ```ts
13
+ * const db = new Kysely<Database>({
14
+ * dialect: {
15
+ * createAdapter() {
16
+ * return new PostgresAdapter()
17
+ * },
18
+ * createDriver() {
19
+ * return new DummyDriver()
20
+ * },
21
+ * createIntrospector(db: Kysely<any>) {
22
+ * return new PostgresIntrospector(db)
23
+ * },
24
+ * createQueryCompiler() {
25
+ * return new PostgresQueryCompiler()
26
+ * },
27
+ * },
28
+ * })
29
+ * ```
30
+ */
31
+ export declare class DummyDriver implements Driver {
32
+ /**
33
+ * Initializes the driver.
34
+ *
35
+ * After calling this method the driver should be usable and `acquireConnection` etc.
36
+ * methods should be callable.
37
+ *
38
+ * IMPORTANT: The underlying database engine driver (like [pg](https://node-postgres.com/))
39
+ * should be imported inside this function, not at the top of the driver file! This is
40
+ * important so that Kysely is usable without installing all database driver libraries
41
+ * it supports.
42
+ */
43
+ init(): Promise<void>;
44
+ /**
45
+ * Acquires a new connection from the pool.
46
+ */
47
+ acquireConnection(): Promise<DatabaseConnection>;
48
+ /**
49
+ * Begins a transaction.
50
+ */
51
+ beginTransaction(): Promise<void>;
52
+ /**
53
+ * Commits a transaction.
54
+ */
55
+ commitTransaction(): Promise<void>;
56
+ /**
57
+ * Rolls back a transaction.
58
+ */
59
+ rollbackTransaction(): Promise<void>;
60
+ /**
61
+ * Releases a connection back to the pool.
62
+ */
63
+ releaseConnection(): Promise<void>;
64
+ /**
65
+ * Destroys the driver and releases all resources.
66
+ */
67
+ destroy(): Promise<void>;
68
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DummyDriver = void 0;
4
+ /**
5
+ * A driver that does absolutely nothing.
6
+ *
7
+ * You can use this to create Kysely instances solely for building queries
8
+ *
9
+ * ### Examples
10
+ *
11
+ * This example creates a Kysely instance for building postgres queries:
12
+ *
13
+ * ```ts
14
+ * const db = new Kysely<Database>({
15
+ * dialect: {
16
+ * createAdapter() {
17
+ * return new PostgresAdapter()
18
+ * },
19
+ * createDriver() {
20
+ * return new DummyDriver()
21
+ * },
22
+ * createIntrospector(db: Kysely<any>) {
23
+ * return new PostgresIntrospector(db)
24
+ * },
25
+ * createQueryCompiler() {
26
+ * return new PostgresQueryCompiler()
27
+ * },
28
+ * },
29
+ * })
30
+ * ```
31
+ */
32
+ class DummyDriver {
33
+ async init() {
34
+ // Nothing to do here.
35
+ }
36
+ async acquireConnection() {
37
+ return new DummyConnection();
38
+ }
39
+ async beginTransaction() {
40
+ // Nothing to do here.
41
+ }
42
+ async commitTransaction() {
43
+ // Nothing to do here.
44
+ }
45
+ async rollbackTransaction() {
46
+ // Nothing to do here.
47
+ }
48
+ async releaseConnection() {
49
+ // Nothing to do here.
50
+ }
51
+ async destroy() {
52
+ // Nothing to do here.
53
+ }
54
+ }
55
+ exports.DummyDriver = DummyDriver;
56
+ class DummyConnection {
57
+ async executeQuery() {
58
+ return {
59
+ rows: [],
60
+ };
61
+ }
62
+ }
@@ -28,7 +28,7 @@ export declare class RuntimeDriver implements Driver {
28
28
  /**
29
29
  * Releases a connection back to the pool.
30
30
  */
31
- releaseConnection(runtimeConnection: DatabaseConnection): Promise<void>;
31
+ releaseConnection(connection: DatabaseConnection): Promise<void>;
32
32
  /**
33
33
  * Begins a transaction.
34
34
  */
@@ -12,7 +12,7 @@ class RuntimeDriver {
12
12
  #log;
13
13
  #initPromise;
14
14
  #destroyPromise;
15
- #connections = new WeakMap();
15
+ #connections = new WeakSet();
16
16
  constructor(driver, log) {
17
17
  this.#driver = driver;
18
18
  this.#log = log;
@@ -29,17 +29,16 @@ class RuntimeDriver {
29
29
  async acquireConnection() {
30
30
  await this.init();
31
31
  const connection = await this.#driver.acquireConnection();
32
- let runtimeConnection = this.#connections.get(connection);
33
- if (!runtimeConnection) {
34
- runtimeConnection = new RuntimeConnection(connection, this.#log);
35
- this.#connections.set(connection, runtimeConnection);
32
+ if (!this.#connections.has(connection)) {
33
+ if (this.#needsLogging()) {
34
+ this.#addLogging(connection);
35
+ }
36
+ this.#connections.add(connection);
36
37
  }
37
- return runtimeConnection;
38
+ return connection;
38
39
  }
39
- async releaseConnection(runtimeConnection) {
40
- if (runtimeConnection instanceof RuntimeConnection) {
41
- await this.#driver.releaseConnection(runtimeConnection.connection);
42
- }
40
+ async releaseConnection(connection) {
41
+ await this.#driver.releaseConnection(connection);
43
42
  }
44
43
  beginTransaction(connection, settings) {
45
44
  return this.#driver.beginTransaction(connection, settings);
@@ -63,30 +62,27 @@ class RuntimeDriver {
63
62
  }
64
63
  await this.#destroyPromise;
65
64
  }
66
- }
67
- exports.RuntimeDriver = RuntimeDriver;
68
- class RuntimeConnection {
69
- #connection;
70
- #log;
71
- get connection() {
72
- return this.#connection;
73
- }
74
- constructor(connection, log) {
75
- this.#connection = connection;
76
- this.#log = log;
65
+ #needsLogging() {
66
+ return (this.#log.isLevelEnabled('query') || this.#log.isLevelEnabled('error'));
77
67
  }
78
- async executeQuery(compiledQuery) {
79
- const startTime = (0, performance_now_js_1.performanceNow)();
80
- try {
81
- return await this.#connection.executeQuery(compiledQuery);
82
- }
83
- catch (error) {
84
- this.#logError(error);
85
- throw error;
86
- }
87
- finally {
88
- this.#logQuery(compiledQuery, startTime);
89
- }
68
+ // This method monkey patches the database connection's executeQuery method
69
+ // by adding logging code around it. Monkey patching is not pretty, but it's
70
+ // the best option in this case.
71
+ #addLogging(connection) {
72
+ const executeQuery = connection.executeQuery;
73
+ connection.executeQuery = async (compiledQuery) => {
74
+ const startTime = (0, performance_now_js_1.performanceNow)();
75
+ try {
76
+ return await executeQuery.call(connection, compiledQuery);
77
+ }
78
+ catch (error) {
79
+ this.#logError(error);
80
+ throw error;
81
+ }
82
+ finally {
83
+ this.#logQuery(compiledQuery, startTime);
84
+ }
85
+ };
90
86
  }
91
87
  #logError(error) {
92
88
  this.#log.error(() => ({
@@ -105,3 +101,4 @@ class RuntimeConnection {
105
101
  return (0, performance_now_js_1.performanceNow)() - startTime;
106
102
  }
107
103
  }
104
+ exports.RuntimeDriver = RuntimeDriver;
@@ -40,6 +40,7 @@ export * from './driver/database-connection.js';
40
40
  export * from './driver/connection-provider.js';
41
41
  export * from './driver/default-connection-provider.js';
42
42
  export * from './driver/single-connection-provider.js';
43
+ export * from './driver/dummy-driver.js';
43
44
  export * from './dialect/dialect.js';
44
45
  export * from './dialect/dialect-adapter.js';
45
46
  export * from './dialect/dialect-adapter-base.js';
@@ -58,6 +59,7 @@ export * from './query-compiler/query-compiler.js';
58
59
  export * from './migration/migrator.js';
59
60
  export * from './plugin/kysely-plugin.js';
60
61
  export * from './plugin/camel-case/camel-case-plugin.js';
62
+ export * from './plugin/deduplicate-joins/deduplicate-joins-plugin.js';
61
63
  export * from './operation-node/add-column-node.js';
62
64
  export * from './operation-node/add-constraint-node.js';
63
65
  export * from './operation-node/alias-node.js';
@@ -52,6 +52,7 @@ __exportStar(require("./driver/database-connection.js"), exports);
52
52
  __exportStar(require("./driver/connection-provider.js"), exports);
53
53
  __exportStar(require("./driver/default-connection-provider.js"), exports);
54
54
  __exportStar(require("./driver/single-connection-provider.js"), exports);
55
+ __exportStar(require("./driver/dummy-driver.js"), exports);
55
56
  __exportStar(require("./dialect/dialect.js"), exports);
56
57
  __exportStar(require("./dialect/dialect-adapter.js"), exports);
57
58
  __exportStar(require("./dialect/dialect-adapter-base.js"), exports);
@@ -70,6 +71,7 @@ __exportStar(require("./query-compiler/query-compiler.js"), exports);
70
71
  __exportStar(require("./migration/migrator.js"), exports);
71
72
  __exportStar(require("./plugin/kysely-plugin.js"), exports);
72
73
  __exportStar(require("./plugin/camel-case/camel-case-plugin.js"), exports);
74
+ __exportStar(require("./plugin/deduplicate-joins/deduplicate-joins-plugin.js"), exports);
73
75
  __exportStar(require("./operation-node/add-column-node.js"), exports);
74
76
  __exportStar(require("./operation-node/add-constraint-node.js"), exports);
75
77
  __exportStar(require("./operation-node/alias-node.js"), exports);
@@ -22,22 +22,24 @@ import { DialectAdapter } from './dialect/dialect-adapter.js';
22
22
  * This example assumes your database has tables `person` and `pet`:
23
23
  *
24
24
  * ```ts
25
- * interface Person {
26
- * id: number
25
+ * import { Kysely, Generated, PostgresDialect } from 'kysely'
26
+ *
27
+ * interface PersonTable {
28
+ * id: Generated<number>
27
29
  * first_name: string
28
30
  * last_name: string
29
31
  * }
30
32
  *
31
- * interface Pet {
32
- * id: number
33
+ * interface PetTable {
34
+ * id: Generated<number>
33
35
  * owner_id: number
34
36
  * name: string
35
37
  * species 'cat' | 'dog'
36
38
  * }
37
39
  *
38
40
  * interface Database {
39
- * person: Person,
40
- * pet: Pet
41
+ * person: PersonTable,
42
+ * pet: PetTable
41
43
  * }
42
44
  *
43
45
  * const db = new Kysely<Database>({
@@ -26,22 +26,24 @@ const private_symbols_js_1 = require("./util/private-symbols.js");
26
26
  * This example assumes your database has tables `person` and `pet`:
27
27
  *
28
28
  * ```ts
29
- * interface Person {
30
- * id: number
29
+ * import { Kysely, Generated, PostgresDialect } from 'kysely'
30
+ *
31
+ * interface PersonTable {
32
+ * id: Generated<number>
31
33
  * first_name: string
32
34
  * last_name: string
33
35
  * }
34
36
  *
35
- * interface Pet {
36
- * id: number
37
+ * interface PetTable {
38
+ * id: Generated<number>
37
39
  * owner_id: number
38
40
  * name: string
39
41
  * species 'cat' | 'dog'
40
42
  * }
41
43
  *
42
44
  * interface Database {
43
- * person: Person,
44
- * pet: Pet
45
+ * person: PersonTable,
46
+ * pet: PetTable
45
47
  * }
46
48
  *
47
49
  * const db = new Kysely<Database>({
@@ -144,8 +144,8 @@ export interface MigratorProps {
144
144
  readonly provider: MigrationProvider;
145
145
  }
146
146
  /**
147
- * All migration methods ({@link MigrationModule.migrateTo | migrateTo},
148
- * {@link MigrationModule.migrateToLatest | migrateToLatest} etc.) never
147
+ * All migration methods ({@link Migrator.migrateTo | migrateTo},
148
+ * {@link Migrator.migrateToLatest | migrateToLatest} etc.) never
149
149
  * throw but return this object instead.
150
150
  */
151
151
  export interface MigrationResultSet {
@@ -1,4 +1,3 @@
1
- import { PrimitiveValue } from '../util/object-utils.js';
2
1
  import { OperationNode } from './operation-node.js';
3
2
  /**
4
3
  * This node is basically just a performance optimization over the normal ValueListNode.
@@ -7,12 +6,12 @@ import { OperationNode } from './operation-node.js';
7
6
  */
8
7
  export interface PrimitiveValueListNode extends OperationNode {
9
8
  readonly kind: 'PrimitiveValueListNode';
10
- readonly values: ReadonlyArray<PrimitiveValue>;
9
+ readonly values: ReadonlyArray<unknown>;
11
10
  }
12
11
  /**
13
12
  * @internal
14
13
  */
15
14
  export declare const PrimitiveValueListNode: Readonly<{
16
15
  is(node: OperationNode): node is PrimitiveValueListNode;
17
- create(values: ReadonlyArray<PrimitiveValue>): PrimitiveValueListNode;
16
+ create(values: ReadonlyArray<unknown>): PrimitiveValueListNode;
18
17
  }>;
@@ -1,8 +1,7 @@
1
- import { PrimitiveValue } from '../util/object-utils.js';
2
1
  import { OperationNode } from './operation-node.js';
3
2
  export interface ValueNode extends OperationNode {
4
3
  readonly kind: 'ValueNode';
5
- readonly value: PrimitiveValue;
4
+ readonly value: unknown;
6
5
  readonly immediate?: boolean;
7
6
  }
8
7
  /**
@@ -10,6 +9,6 @@ export interface ValueNode extends OperationNode {
10
9
  */
11
10
  export declare const ValueNode: Readonly<{
12
11
  is(node: OperationNode): node is ValueNode;
13
- create(value: PrimitiveValue): ValueNode;
14
- createImmediate(value: PrimitiveValue): ValueNode;
12
+ create(value: unknown): ValueNode;
13
+ createImmediate(value: unknown): ValueNode;
15
14
  }>;
@@ -7,3 +7,4 @@ export declare type ComplexExpression<DB, TB extends keyof DB> = AnySelectQueryB
7
7
  export declare type AliasedComplexExpression<DB, TB extends keyof DB> = AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB> | AnyAliasedRawBuilder | AliasedRawBuilderFactory<DB, TB>;
8
8
  export declare function parseComplexExpression(ctx: ParseContext, exp: ComplexExpression<any, any>): SelectQueryNode | RawNode;
9
9
  export declare function parseAliasedComplexExpression(ctx: ParseContext, exp: AliasedComplexExpression<any, any>): AliasNode;
10
+ export declare function isComplexExpression(obj: unknown): obj is ComplexExpression<any, any>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseAliasedComplexExpression = exports.parseComplexExpression = void 0;
3
+ exports.isComplexExpression = exports.parseAliasedComplexExpression = exports.parseComplexExpression = void 0;
4
4
  const operation_node_source_js_1 = require("../operation-node/operation-node-source.js");
5
5
  const object_utils_js_1 = require("../util/object-utils.js");
6
6
  function parseComplexExpression(ctx, exp) {
@@ -23,3 +23,7 @@ function parseAliasedComplexExpression(ctx, exp) {
23
23
  throw new Error(`invalid aliased expression: ${JSON.stringify(exp)}`);
24
24
  }
25
25
  exports.parseAliasedComplexExpression = parseAliasedComplexExpression;
26
+ function isComplexExpression(obj) {
27
+ return (0, operation_node_source_js_1.isOperationNodeSource)(obj) || (0, object_utils_js_1.isFunction)(obj);
28
+ }
29
+ exports.isComplexExpression = isComplexExpression;
@@ -1,6 +1,5 @@
1
1
  import { RawNode } from '../operation-node/raw-node.js';
2
2
  import { ValueNode } from '../operation-node/value-node.js';
3
- import { AnyRawBuilder } from '../util/type-utils.js';
4
- import { PrimitiveValue } from '../util/object-utils.js';
5
- export declare type DefaultValueExpression = PrimitiveValue | AnyRawBuilder;
3
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
4
+ export declare type DefaultValueExpression = unknown | RawBuilder;
6
5
  export declare function parseDefaultValueExpression(value: DefaultValueExpression): ValueNode | RawNode;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseDefaultValueExpression = void 0;
4
- const operation_node_source_js_1 = require("../operation-node/operation-node-source.js");
5
4
  const value_node_js_1 = require("../operation-node/value-node.js");
5
+ const raw_builder_js_1 = require("../raw-builder/raw-builder.js");
6
6
  function parseDefaultValueExpression(value) {
7
- return (0, operation_node_source_js_1.isOperationNodeSource)(value)
7
+ return value instanceof raw_builder_js_1.RawBuilder
8
8
  ? value.toOperationNode()
9
9
  : value_node_js_1.ValueNode.createImmediate(value);
10
10
  }