kysely 0.7.7 → 0.8.1

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 (98) hide show
  1. package/README.md +29 -2
  2. package/dist/cjs/dialect/dialect-adapter.d.ts +19 -12
  3. package/dist/cjs/dialect/dialect.d.ts +1 -1
  4. package/dist/cjs/dialect/mysql/mysql-adapter.js +6 -0
  5. package/dist/cjs/dialect/mysql/mysql-driver.js +5 -5
  6. package/dist/cjs/dialect/postgres/postgres-driver.js +5 -5
  7. package/dist/cjs/driver/database-connection.d.ts +5 -0
  8. package/dist/cjs/driver/driver.d.ts +3 -5
  9. package/dist/cjs/index.d.ts +1 -1
  10. package/dist/cjs/kysely.d.ts +31 -1
  11. package/dist/cjs/kysely.js +33 -1
  12. package/dist/cjs/operation-node/operator-node.d.ts +1 -1
  13. package/dist/cjs/parser/data-type-parser.d.ts +1 -1
  14. package/dist/cjs/parser/default-value-parser.d.ts +1 -1
  15. package/dist/cjs/parser/filter-parser.d.ts +1 -1
  16. package/dist/cjs/parser/insert-values-parser.d.ts +2 -2
  17. package/dist/cjs/parser/join-parser.d.ts +1 -1
  18. package/dist/cjs/parser/on-conflict-parser.d.ts +1 -1
  19. package/dist/cjs/parser/order-by-parser.d.ts +1 -1
  20. package/dist/cjs/parser/reference-parser.d.ts +3 -2
  21. package/dist/cjs/parser/returning-parser.d.ts +1 -1
  22. package/dist/cjs/parser/select-parser.d.ts +1 -1
  23. package/dist/cjs/parser/table-parser.d.ts +17 -6
  24. package/dist/cjs/parser/update-set-parser.d.ts +2 -2
  25. package/dist/cjs/parser/value-parser.d.ts +1 -1
  26. package/dist/cjs/parser/with-parser.d.ts +1 -1
  27. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +4 -3
  28. package/dist/cjs/plugin/kysely-plugin.d.ts +9 -5
  29. package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +3 -2
  30. package/dist/cjs/query-builder/expression-builder.d.ts +33 -0
  31. package/dist/cjs/query-builder/expression-builder.js +35 -0
  32. package/dist/cjs/query-builder/function-builder.d.ts +112 -0
  33. package/dist/cjs/query-builder/function-builder.js +138 -0
  34. package/dist/cjs/query-builder/query-builder.d.ts +8 -8
  35. package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
  36. package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -2
  37. package/dist/cjs/query-compiler/default-query-compiler.js +9 -9
  38. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -0
  39. package/dist/cjs/query-creator.d.ts +9 -9
  40. package/dist/cjs/query-creator.js +11 -10
  41. package/dist/cjs/raw-builder/raw-builder.d.ts +14 -5
  42. package/dist/cjs/raw-builder/raw-builder.js +25 -20
  43. package/dist/cjs/schema/alter-table-builder.d.ts +1 -1
  44. package/dist/cjs/schema/column-definition-builder.d.ts +1 -1
  45. package/dist/cjs/util/generated-placeholder.d.ts +2 -2
  46. package/dist/cjs/util/generated-placeholder.js +2 -2
  47. package/dist/cjs/util/random-string.js +3 -3
  48. package/dist/cjs/{query-builder → util}/type-utils.d.ts +11 -3
  49. package/dist/cjs/{query-builder → util}/type-utils.js +0 -0
  50. package/dist/esm/dialect/dialect-adapter.d.ts +19 -12
  51. package/dist/esm/dialect/dialect.d.ts +1 -1
  52. package/dist/esm/dialect/mysql/mysql-adapter.js +6 -0
  53. package/dist/esm/dialect/mysql/mysql-driver.js +5 -5
  54. package/dist/esm/dialect/postgres/postgres-driver.js +5 -5
  55. package/dist/esm/driver/database-connection.d.ts +5 -0
  56. package/dist/esm/driver/driver.d.ts +3 -5
  57. package/dist/esm/index.d.ts +1 -1
  58. package/dist/esm/kysely.d.ts +31 -1
  59. package/dist/esm/kysely.js +34 -2
  60. package/dist/esm/operation-node/operator-node.d.ts +1 -1
  61. package/dist/esm/parser/data-type-parser.d.ts +1 -1
  62. package/dist/esm/parser/default-value-parser.d.ts +1 -1
  63. package/dist/esm/parser/filter-parser.d.ts +1 -1
  64. package/dist/esm/parser/insert-values-parser.d.ts +2 -2
  65. package/dist/esm/parser/join-parser.d.ts +1 -1
  66. package/dist/esm/parser/on-conflict-parser.d.ts +1 -1
  67. package/dist/esm/parser/order-by-parser.d.ts +1 -1
  68. package/dist/esm/parser/reference-parser.d.ts +3 -2
  69. package/dist/esm/parser/returning-parser.d.ts +1 -1
  70. package/dist/esm/parser/select-parser.d.ts +1 -1
  71. package/dist/esm/parser/table-parser.d.ts +17 -6
  72. package/dist/esm/parser/update-set-parser.d.ts +2 -2
  73. package/dist/esm/parser/value-parser.d.ts +1 -1
  74. package/dist/esm/parser/with-parser.d.ts +1 -1
  75. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +4 -3
  76. package/dist/esm/plugin/kysely-plugin.d.ts +9 -5
  77. package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +3 -2
  78. package/dist/esm/query-builder/expression-builder.d.ts +33 -0
  79. package/dist/esm/query-builder/expression-builder.js +35 -0
  80. package/dist/esm/query-builder/function-builder.d.ts +112 -0
  81. package/dist/esm/query-builder/function-builder.js +134 -0
  82. package/dist/esm/query-builder/query-builder.d.ts +8 -8
  83. package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
  84. package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -2
  85. package/dist/esm/query-compiler/default-query-compiler.js +9 -9
  86. package/dist/esm/query-compiler/query-compiler.d.ts +3 -0
  87. package/dist/esm/query-creator.d.ts +9 -9
  88. package/dist/esm/query-creator.js +11 -10
  89. package/dist/esm/raw-builder/raw-builder.d.ts +14 -5
  90. package/dist/esm/raw-builder/raw-builder.js +25 -20
  91. package/dist/esm/schema/alter-table-builder.d.ts +1 -1
  92. package/dist/esm/schema/column-definition-builder.d.ts +1 -1
  93. package/dist/esm/util/generated-placeholder.d.ts +2 -2
  94. package/dist/esm/util/generated-placeholder.js +1 -1
  95. package/dist/esm/util/random-string.js +3 -3
  96. package/dist/esm/{query-builder → util}/type-utils.d.ts +11 -3
  97. package/dist/esm/{query-builder → util}/type-utils.js +0 -0
  98. package/package.json +8 -8
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  # [Kysely](https://koskimas.github.io/kysely/index.html)
5
5
 
6
6
  A type-safe and autocompletion-friendly typescript SQL query builder for node.js. Inspired by
7
- [knex](http://knexjs.org/).
7
+ [knex](http://knexjs.org/). You can find an introduction to Kysely [here](https://www.jakso.me/blog/kysely-a-type-safe-sql-query-builder-for-typescript).
8
8
 
9
9
  ![](https://github.com/koskimas/kysely/blob/master/assets/demo.gif)
10
10
 
@@ -31,6 +31,7 @@ using Kysely and can't find something you'd want to use, please open an issue.
31
31
 
32
32
  - [Installation](#installation)
33
33
  - [Minimal example](#minimal-example)
34
+ - [Query examples](#query-examples)
34
35
  - [Migrations](#migrations)
35
36
  - [API reference](https://koskimas.github.io/kysely/index.html)
36
37
 
@@ -49,7 +50,7 @@ npm install kysely mysql2
49
50
  More dialects will be added soon. Kysely also has a simple interface
50
51
  for [3rd party dialects](https://koskimas.github.io/kysely/interfaces/Dialect.html).
51
52
 
52
- 3rd party dialects:
53
+ ### 3rd party dialects:
53
54
 
54
55
  - [AWS Data API](https://github.com/serverless-stack/kysely-data-api)
55
56
 
@@ -109,6 +110,32 @@ async function demo() {
109
110
  }
110
111
  ```
111
112
 
113
+ # Query examples
114
+
115
+ ## Select queries
116
+
117
+ You can find examples of select queries in the documentation of the
118
+ [select method](https://koskimas.github.io/kysely/classes/QueryBuilder.html#select) and
119
+ the [where method](https://koskimas.github.io/kysely/classes/QueryBuilder.html#where)
120
+ among other places.
121
+
122
+ ## Update queries
123
+
124
+ See the [set method](https://koskimas.github.io/kysely/classes/QueryBuilder.html#set) and the
125
+ [updateTable method](https://koskimas.github.io/kysely/classes/Kysely.html#updateTable)
126
+ documentation.
127
+
128
+ ## Insert queries
129
+
130
+ See the [values method](https://koskimas.github.io/kysely/classes/QueryBuilder.html#values) and the
131
+ [insertInto method](https://koskimas.github.io/kysely/classes/Kysely.html#insertInto)
132
+ documentation.
133
+
134
+ ## Delete queries
135
+
136
+ See the [deleteFrom method](https://koskimas.github.io/kysely/classes/Kysely.html#deleteFrom)
137
+ documentation.
138
+
112
139
  # Migrations
113
140
 
114
141
  Migration files should look like this:
@@ -1,5 +1,13 @@
1
1
  import { Kysely } from '../kysely.js';
2
- export interface DialectSupports {
2
+ /**
3
+ * A `DialectAdapter` encapsulates all differences between dialects outside
4
+ * of `Driver` and `QueryCompiler`.
5
+ *
6
+ * For example, some databases support transactional DDL and therefore we want
7
+ * to run migrations inside a transaction, while other databases don't support
8
+ * it. For that there's a `supportsTransactionalDdl` boolean in this interface.
9
+ */
10
+ export interface DialectAdapter {
3
11
  /**
4
12
  * Whether or not this dialect supports transactional DDL.
5
13
  *
@@ -8,19 +16,9 @@ export interface DialectSupports {
8
16
  readonly supportsTransactionalDdl: boolean;
9
17
  /**
10
18
  * Whether or not this dialect supports the `returning` in inserts
11
- * upates and deletes.
19
+ * updates and deletes.
12
20
  */
13
21
  readonly supportsReturning: boolean;
14
- }
15
- /**
16
- * The `DialectAdapter` encapsulates all differences between dialects outside
17
- * the `Driver` and `QueryCompiler`.
18
- *
19
- * For example, some databases support transactional DDL and therefore we want
20
- * to run migrations inside a transaction, while other databases don't support
21
- * it. For that there's a `supportsTransactionalDdl` boolean in this interface.
22
- */
23
- export interface DialectAdapter extends DialectSupports {
24
22
  /**
25
23
  * This method is used to acquire a lock for the migrations so that
26
24
  * it's not possible for two migration processes to run in parallel.
@@ -34,10 +32,19 @@ export interface DialectAdapter extends DialectSupports {
34
32
  * table whose id is {@link MIGRATION_LOCK_ID}. `is_locked` is an integer.
35
33
  * Kysely takes care of creating the lock table and inserting the one single
36
34
  * row to it before this method is executed.
35
+ *
36
+ * If `supportsTransactionalDdl` is `true` then the `db` passed to this method
37
+ * is a transaction inside which the migrations will be executed. Otherwise
38
+ * `db` is a single connection (session) that will be used to execute the
39
+ * migrations.
37
40
  */
38
41
  acquireMigrationLock(db: Kysely<any>): Promise<void>;
39
42
  /**
40
43
  * Releases the migration lock. See {@link acquireMigrationLock}.
44
+ *
45
+ * If `supportsTransactionalDdl` is `true` then the `db` passed to this method
46
+ * is a transaction inside which the migrations were executed. Otherwise `db`
47
+ * is a single connection (session) that was used to execute the migrations.
41
48
  */
42
49
  releaseMigrationLock(db: Kysely<any>): Promise<void>;
43
50
  }
@@ -4,7 +4,7 @@ import { QueryCompiler } from '../query-compiler/query-compiler.js';
4
4
  import { DatabaseIntrospector } from '../introspection/database-introspector.js';
5
5
  import { DialectAdapter } from './dialect-adapter.js';
6
6
  /**
7
- * A Dialect is an adapter between Kysely and the underlying database engine.
7
+ * A Dialect is the glue between Kysely and the underlying database engine.
8
8
  *
9
9
  * See the built-in {@link PostgresDialect} as an example of a dialect.
10
10
  * Users can implement their own dialects and use them by passing it
@@ -11,6 +11,12 @@ class MysqlAdapter {
11
11
  return false;
12
12
  }
13
13
  async acquireMigrationLock(db) {
14
+ // Kysely uses a single connection to run the migrations. Because of that, we
15
+ // can take a lock using `get_lock`. Locks acquired using `get_lock` get
16
+ // released when the connection is destroyed (session ends) or when the lock
17
+ // is released using `release_lock`. This way we know that the lock is either
18
+ // released by us after successfull or failed migrations OR it's released by
19
+ // mysql if the process gets killed for some reason.
14
20
  await db
15
21
  .raw(`select get_lock('${LOCK_ID}', ${LOCK_TIMEOUT_SECONDS})`)
16
22
  .execute();
@@ -53,16 +53,16 @@ class MysqlDriver {
53
53
  // On mysql this sets the isolation level of the next transaction.
54
54
  await connection.executeQuery({
55
55
  sql: `set transaction isolation level ${settings.isolationLevel}`,
56
- bindings: [],
56
+ parameters: [],
57
57
  });
58
58
  }
59
- await connection.executeQuery({ sql: 'begin', bindings: [] });
59
+ await connection.executeQuery({ sql: 'begin', parameters: [] });
60
60
  }
61
61
  async commitTransaction(connection) {
62
- await connection.executeQuery({ sql: 'commit', bindings: [] });
62
+ await connection.executeQuery({ sql: 'commit', parameters: [] });
63
63
  }
64
64
  async rollbackTransaction(connection) {
65
- await connection.executeQuery({ sql: 'rollback', bindings: [] });
65
+ await connection.executeQuery({ sql: 'rollback', parameters: [] });
66
66
  }
67
67
  async releaseConnection(connection) {
68
68
  const mysqlConnection = connection;
@@ -131,7 +131,7 @@ class MysqlConnection {
131
131
  }
132
132
  #executeQuery(compiledQuery) {
133
133
  return new Promise((resolve, reject) => {
134
- this.#rawConnection.query(compiledQuery.sql, compiledQuery.bindings, (err, result) => {
134
+ this.#rawConnection.query(compiledQuery.sql, compiledQuery.parameters, (err, result) => {
135
135
  if (err) {
136
136
  reject(err);
137
137
  }
@@ -40,18 +40,18 @@ class PostgresDriver {
40
40
  if (settings.isolationLevel) {
41
41
  await connection.executeQuery({
42
42
  sql: `start transaction isolation level ${settings.isolationLevel}`,
43
- bindings: [],
43
+ parameters: [],
44
44
  });
45
45
  }
46
46
  else {
47
- await connection.executeQuery({ sql: 'begin', bindings: [] });
47
+ await connection.executeQuery({ sql: 'begin', parameters: [] });
48
48
  }
49
49
  }
50
50
  async commitTransaction(connection) {
51
- await connection.executeQuery({ sql: 'commit', bindings: [] });
51
+ await connection.executeQuery({ sql: 'commit', parameters: [] });
52
52
  }
53
53
  async rollbackTransaction(connection) {
54
- await connection.executeQuery({ sql: 'rollback', bindings: [] });
54
+ await connection.executeQuery({ sql: 'rollback', parameters: [] });
55
55
  }
56
56
  async releaseConnection(connection) {
57
57
  const pgConnection = connection;
@@ -90,7 +90,7 @@ class PostgresConnection {
90
90
  }
91
91
  async executeQuery(compiledQuery) {
92
92
  const result = await this.#client.query(compiledQuery.sql, [
93
- ...compiledQuery.bindings,
93
+ ...compiledQuery.parameters,
94
94
  ]);
95
95
  if (result.command === 'UPDATE' || result.command === 'DELETE') {
96
96
  return {
@@ -1,4 +1,9 @@
1
1
  import { CompiledQuery } from '../query-compiler/compiled-query.js';
2
+ /**
3
+ * A single connection to the database engine.
4
+ *
5
+ * These are created by an instance of {@link Driver}.
6
+ */
2
7
  export interface DatabaseConnection {
3
8
  executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>>;
4
9
  }
@@ -1,10 +1,8 @@
1
- import { ArrayItemType } from '../query-builder/type-utils.js';
1
+ import { ArrayItemType } from '../util/type-utils.js';
2
2
  import { DatabaseConnection } from './database-connection.js';
3
3
  /**
4
- * A Driver is responsible for abstracting away the database engine details.
5
- *
6
- * The Driver creates and releases database connections and is also responsible
7
- * for connection pooling.
4
+ * A Driver creates and releases {@link DatabaseConnection | database connections}
5
+ * and is also responsible for connection pooling (if the dialect supports pooling).
8
6
  */
9
7
  export interface Driver {
10
8
  /**
@@ -110,7 +110,7 @@ export * from './operation-node/operation-node-source.js';
110
110
  export * from './operation-node/order-by-node.js';
111
111
  export * from './introspection/database-introspector.js';
112
112
  export * from './util/compilable.js';
113
- export { AnyColumn } from './query-builder/type-utils.js';
113
+ export { AnyColumn, UnknownRow as AnyRow } from './util/type-utils.js';
114
114
  export { SelectExpression, SelectExpressionOrList, } from './parser/select-parser.js';
115
115
  export { ReferenceExpression, ReferenceExpressionOrList, } from './parser/reference-parser.js';
116
116
  export { ValueExpression, ValueExpressionOrList, } from './parser/value-parser.js';
@@ -5,10 +5,11 @@ import { MigrationModule } from './migration/migration.js';
5
5
  import { QueryExecutor } from './query-executor/query-executor.js';
6
6
  import { QueryCreator } from './query-creator.js';
7
7
  import { KyselyPlugin } from './plugin/kysely-plugin.js';
8
- import { GeneratedPlaceholder } from './query-builder/type-utils.js';
8
+ import { GeneratedPlaceholder } from './util/type-utils.js';
9
9
  import { DatabaseIntrospector } from './introspection/database-introspector.js';
10
10
  import { Driver, IsolationLevel } from './driver/driver.js';
11
11
  import { ParseContext } from './parser/parse-context.js';
12
+ import { FunctionBuilder } from './query-builder/function-builder.js';
12
13
  /**
13
14
  * The main Kysely class.
14
15
  *
@@ -96,6 +97,35 @@ export declare class Kysely<DB> extends QueryCreator<DB> {
96
97
  * ```
97
98
  */
98
99
  get generated(): GeneratedPlaceholder;
100
+ /**
101
+ * Returns a {@link FunctionBuilder} that can be used to write type safe function
102
+ * calls.
103
+ *
104
+ * ```ts
105
+ * const { count } = db.fn
106
+ *
107
+ * await db.selectFrom('person')
108
+ * .innerJoin('pet', 'pet.owner_id', 'person.id')
109
+ * .select([
110
+ * 'person.id',
111
+ * count('pet.id').as('pet_count')
112
+ * ])
113
+ * .groupBy('person.id')
114
+ * .having(count('pet.id'), '>', 10)
115
+ * .execute()
116
+ * ```
117
+ *
118
+ * The generated SQL (postgresql):
119
+ *
120
+ * ```sql
121
+ * select "person"."id", count("pet"."id") as "pet_count"
122
+ * from "person"
123
+ * inner join "pet" on "pet"."owner_id" = "person"."id"
124
+ * group by "person"."id"
125
+ * having count("pet"."id") > $1
126
+ * ```
127
+ */
128
+ get fn(): FunctionBuilder<DB, keyof DB>;
99
129
  /**
100
130
  * Starts a transaction. If the callback throws the transaction is rolled back,
101
131
  * otherwise it's committed.
@@ -14,6 +14,7 @@ const single_connection_provider_js_1 = require("./driver/single-connection-prov
14
14
  const driver_js_1 = require("./driver/driver.js");
15
15
  const prevent_await_js_1 = require("./util/prevent-await.js");
16
16
  const parse_context_js_1 = require("./parser/parse-context.js");
17
+ const function_builder_js_1 = require("./query-builder/function-builder.js");
17
18
  /**
18
19
  * The main Kysely class.
19
20
  *
@@ -131,7 +132,38 @@ class Kysely extends query_creator_js_1.QueryCreator {
131
132
  * ```
132
133
  */
133
134
  get generated() {
134
- return generated_placeholder_js_1.generatedPlaceholder;
135
+ return generated_placeholder_js_1.GENERATED_PLACEHOLDER;
136
+ }
137
+ /**
138
+ * Returns a {@link FunctionBuilder} that can be used to write type safe function
139
+ * calls.
140
+ *
141
+ * ```ts
142
+ * const { count } = db.fn
143
+ *
144
+ * await db.selectFrom('person')
145
+ * .innerJoin('pet', 'pet.owner_id', 'person.id')
146
+ * .select([
147
+ * 'person.id',
148
+ * count('pet.id').as('pet_count')
149
+ * ])
150
+ * .groupBy('person.id')
151
+ * .having(count('pet.id'), '>', 10)
152
+ * .execute()
153
+ * ```
154
+ *
155
+ * The generated SQL (postgresql):
156
+ *
157
+ * ```sql
158
+ * select "person"."id", count("pet"."id") as "pet_count"
159
+ * from "person"
160
+ * inner join "pet" on "pet"."owner_id" = "person"."id"
161
+ * group by "person"."id"
162
+ * having count("pet"."id") > $1
163
+ * ```
164
+ */
165
+ get fn() {
166
+ return new function_builder_js_1.FunctionBuilder({ executor: this.#props.executor });
135
167
  }
136
168
  /**
137
169
  * Starts a transaction. If the callback throws the transaction is rolled back,
@@ -1,4 +1,4 @@
1
- import { ArrayItemType } from '../query-builder/type-utils.js';
1
+ import { ArrayItemType } from '../util/type-utils.js';
2
2
  import { OperationNode } from './operation-node.js';
3
3
  export declare const OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "ilike", "not ilike", "@>", "<@", "?", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "exists", "not exists"];
4
4
  export declare type Operator = ArrayItemType<typeof OPERATORS>;
@@ -1,5 +1,5 @@
1
1
  import { ColumnDataType, DataTypeNode } from '../operation-node/data-type-node.js';
2
2
  import { RawNode } from '../operation-node/raw-node.js';
3
- import { AnyRawBuilder } from '../query-builder/type-utils.js';
3
+ import { AnyRawBuilder } from '../util/type-utils.js';
4
4
  export declare type DataTypeExpression = ColumnDataType | AnyRawBuilder;
5
5
  export declare function parseDataTypeExpression(dataType: DataTypeExpression): DataTypeNode | RawNode;
@@ -1,6 +1,6 @@
1
1
  import { RawNode } from '../operation-node/raw-node.js';
2
2
  import { ValueNode } from '../operation-node/value-node.js';
3
- import { AnyRawBuilder } from '../query-builder/type-utils.js';
3
+ import { AnyRawBuilder } from '../util/type-utils.js';
4
4
  import { PrimitiveValue } from '../util/object-utils.js';
5
5
  export declare type DefaultValueExpression = PrimitiveValue | AnyRawBuilder;
6
6
  export declare function parseDefaultValueExpression(value: DefaultValueExpression): ValueNode | RawNode;
@@ -1,5 +1,5 @@
1
1
  import { FilterNode } from '../operation-node/filter-node.js';
2
- import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../query-builder/type-utils.js';
2
+ import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../util/type-utils.js';
3
3
  import { Operator } from '../operation-node/operator-node.js';
4
4
  import { ReferenceExpression } from './reference-parser.js';
5
5
  import { FilterExpressionNode } from '../operation-node/operation-node-utils.js';
@@ -3,13 +3,13 @@ import { InsertValuesNode } from '../operation-node/insert-query-node.js';
3
3
  import { RawNode } from '../operation-node/raw-node.js';
4
4
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
5
5
  import { ValueNode } from '../operation-node/value-node.js';
6
- import { AnyQueryBuilder, AnyRawBuilder, GeneratedPlaceholder } from '../query-builder/type-utils.js';
6
+ import { AnyQueryBuilder, AnyRawBuilder, GeneratedPlaceholder } from '../util/type-utils.js';
7
7
  import { PrimitiveValue } from '../util/object-utils.js';
8
8
  export declare type InsertObject<DB, TB extends keyof DB> = {
9
9
  [C in keyof DB[TB]]: InsertValueExpression<DB[TB][C]>;
10
10
  };
11
11
  export declare type InsertObjectOrList<DB, TB extends keyof DB> = InsertObject<DB, TB> | InsertObject<DB, TB>[];
12
- declare type InsertValueExpression<T extends PrimitiveValue> = T | AnyQueryBuilder | AnyRawBuilder | GeneratedPlaceholder;
12
+ declare type InsertValueExpression<T> = T | AnyQueryBuilder | AnyRawBuilder | GeneratedPlaceholder;
13
13
  export declare function parseInsertObjectOrList(args: InsertObjectOrList<any, any>): [ReadonlyArray<ColumnNode>, ReadonlyArray<InsertValuesNode>];
14
14
  export declare function parseInsertValueExpression(value: InsertValueExpression<PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
15
15
  export {};
@@ -1,5 +1,5 @@
1
1
  import { JoinNode, JoinType } from '../operation-node/join-node.js';
2
- import { AnyColumn, AnyColumnWithTable } from '../query-builder/type-utils.js';
2
+ import { AnyColumn, AnyColumnWithTable } from '../util/type-utils.js';
3
3
  import { ExtractAliasFromTableExpression, TableExpressionDatabaseType } from './table-parser.js';
4
4
  import { JoinBuilder } from '../query-builder/join-builder.js';
5
5
  import { ParseContext } from './parse-context.js';
@@ -1,5 +1,5 @@
1
1
  import { OnConflictNode } from '../operation-node/on-conflict-node.js';
2
- import { AnyColumn } from '../query-builder/type-utils.js';
2
+ import { AnyColumn } from '../util/type-utils.js';
3
3
  import { ParseContext } from './parse-context.js';
4
4
  import { MutationObject } from './update-set-parser.js';
5
5
  export declare type OnConflictConstraintTarget = {
@@ -1,6 +1,6 @@
1
1
  import { ReferenceExpressionNode } from '../operation-node/operation-node-utils.js';
2
2
  import { RawNode } from '../operation-node/raw-node.js';
3
- import { AnyRawBuilder } from '../query-builder/type-utils.js';
3
+ import { AnyRawBuilder } from '../util/type-utils.js';
4
4
  import { ParseContext } from './parse-context.js';
5
5
  import { ReferenceExpression } from './reference-parser.js';
6
6
  export declare type OrderByDirection = 'asc' | 'desc';
@@ -3,13 +3,14 @@ import { ColumnNode } from '../operation-node/column-node.js';
3
3
  import { ReferenceExpressionNode } from '../operation-node/operation-node-utils.js';
4
4
  import { ReferenceNode } from '../operation-node/reference-node.js';
5
5
  import { PrimitiveValue } from '../util/object-utils.js';
6
- import { AnyColumn, AnyColumnWithTable, AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory, RowType, ValueType } from '../query-builder/type-utils.js';
6
+ import { AnyColumn, AnyColumnWithTable, AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory, RowType, ValueType } from '../util/type-utils.js';
7
7
  import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
8
8
  import { RawBuilder } from '../raw-builder/raw-builder.js';
9
9
  import { QueryBuilder } from '../query-builder/query-builder.js';
10
10
  import { ParseContext } from './parse-context.js';
11
- export declare type ReferenceExpression<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
11
+ export declare type ReferenceExpression<DB, TB extends keyof DB> = StringReference<DB, TB> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
12
12
  export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReferenceExpression<DB, TB>[];
13
+ export declare type StringReference<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB>;
13
14
  export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE> = RE extends string ? ExtractTypeFromStringReference<DB, TB, RE> : RE extends RawBuilder<infer O> ? O : RE extends (qb: any) => RawBuilder<infer O> ? O : RE extends QueryBuilder<any, any, infer O> ? ValueType<O> : RE extends (qb: any) => QueryBuilder<any, any, infer O> ? ValueType<O> : PrimitiveValue;
14
15
  declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, S extends string, R = RowType<DB, TB>> = S extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : S extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : S extends keyof R ? R[S] : PrimitiveValue;
15
16
  export declare function parseReferenceExpressionOrList(ctx: ParseContext, arg: ReferenceExpressionOrList<any, any>): ReferenceExpressionNode[];
@@ -1,5 +1,5 @@
1
1
  import { QueryBuilder } from '../query-builder/query-builder.js';
2
- import { DeleteResultTypeTag, InsertResultTypeTag, UpdateResultTypeTag } from '../query-builder/type-utils.js';
2
+ import { DeleteResultTypeTag, InsertResultTypeTag, UpdateResultTypeTag } from '../util/type-utils.js';
3
3
  import { Selection } from './select-parser.js';
4
4
  /**
5
5
  * `returning` method output query builder type
@@ -1,7 +1,7 @@
1
1
  import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
2
2
  import { AliasedQueryBuilder, QueryBuilder } from '../query-builder/query-builder.js';
3
3
  import { SelectionNode } from '../operation-node/selection-node.js';
4
- import { AliasedQueryBuilderFactory, AliasedRawBuilderFactory, AnyAliasedColumn, AnyAliasedColumnWithTable, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, AnyColumn, AnyColumnWithTable, InsertResultTypeTag, RowType, ValueType } from '../query-builder/type-utils.js';
4
+ import { AliasedQueryBuilderFactory, AliasedRawBuilderFactory, AnyAliasedColumn, AnyAliasedColumnWithTable, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, AnyColumn, AnyColumnWithTable, InsertResultTypeTag, RowType, ValueType } from '../util/type-utils.js';
5
5
  import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
6
6
  import { ParseContext } from './parse-context.js';
7
7
  /**
@@ -1,6 +1,6 @@
1
1
  import { AliasedQueryBuilder, QueryBuilder } from '../query-builder/query-builder.js';
2
2
  import { TableNode } from '../operation-node/table-node.js';
3
- import { AliasedQueryBuilderFactory, AnyAliasedQueryBuilder, AnyAliasedRawBuilder } from '../query-builder/type-utils.js';
3
+ import { AliasedQueryBuilderFactory, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, Nullable } from '../util/type-utils.js';
4
4
  import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
5
5
  import { TableExpressionNode } from '../operation-node/operation-node-utils.js';
6
6
  import { ParseContext } from './parse-context.js';
@@ -8,14 +8,25 @@ export declare type TableExpression<DB, TB extends keyof DB> = TableReference<DB
8
8
  export declare type TableExpressionOrList<DB, TB extends keyof DB> = TableExpression<DB, TB> | ReadonlyArray<TableExpression<DB, TB>>;
9
9
  export declare type TableReference<DB> = AnyAliasedTable<DB, any, any> | AnyTable<DB> | AnyAliasedRawBuilder;
10
10
  export declare type QueryBuilderWithTable<DB, TB extends keyof DB, O, TE> = QueryBuilder<TableExpressionDatabaseType<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
11
- export declare type TableExpressionDatabaseType<DB, TE> = DB extends ExtractDatabaseTypeFromTableExpression<DB, TE> ? DB : DB & ExtractDatabaseTypeFromTableExpression<DB, TE>;
11
+ export declare type TableExpressionDatabaseType<DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
12
+ [C in keyof DB | A]: C extends A ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? DB[C] : never;
13
+ };
14
+ export declare type QueryBuilderWithLeftJoin<DB, TB extends keyof DB, O, TE> = QueryBuilder<LeftJoinTableExpressionDatabaseType<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
15
+ export declare type LeftJoinTableExpressionDatabaseType<DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
16
+ [C in keyof DB | A]: C extends A ? Nullable<ExtractRowTypeFromTableExpression<DB, TE, C>> : C extends keyof DB ? DB[C] : never;
17
+ };
18
+ export declare type QueryBuilderWithRightJoin<DB, TB extends keyof DB, O, TE> = QueryBuilder<RightJoinTableExpressionDatabaseType<DB, TB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
19
+ export declare type RightJoinTableExpressionDatabaseType<DB, TB extends keyof DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
20
+ [C in keyof DB | A]: C extends A ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? C extends TB ? Nullable<DB[C]> : DB[C] : never;
21
+ };
22
+ export declare type QueryBuilderWithFullJoin<DB, TB extends keyof DB, O, TE> = QueryBuilder<FullJoinTableExpressionDatabaseType<DB, TB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
23
+ export declare type FullJoinTableExpressionDatabaseType<DB, TB extends keyof DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
24
+ [C in keyof DB | A]: C extends A ? Nullable<ExtractRowTypeFromTableExpression<DB, TE, C>> : C extends keyof DB ? C extends TB ? Nullable<DB[C]> : DB[C] : never;
25
+ };
12
26
  export declare type ExtractAliasFromTableExpression<DB, TE> = TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : TE extends AliasedQueryBuilder<any, any, any, infer QA> ? QA : TE extends (qb: any) => AliasedQueryBuilder<any, any, any, infer QA> ? QA : TE extends AliasedRawBuilder<any, infer RA> ? RA : TE extends (qb: any) => AliasedRawBuilder<any, infer RA> ? RA : never;
27
+ declare type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : never;
13
28
  declare type AnyAliasedTable<DB, TB extends keyof DB, A extends string> = TB extends string ? `${TB} as ${A}` : never;
14
29
  declare type AnyTable<DB> = keyof DB;
15
- declare type ExtractDatabaseTypeFromTableExpression<DB, TE> = {
16
- [A in ExtractAliasFromTableExpression<DB, TE>]: ExtractRowTypeFromTableExpression<DB, TE, A>;
17
- };
18
- declare type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : never;
19
30
  export declare function parseTableExpressionOrList(ctx: ParseContext, table: TableExpressionOrList<any, any>): TableExpressionNode[];
20
31
  export declare function parseTableExpression(ctx: ParseContext, table: TableExpression<any, any>): TableExpressionNode;
21
32
  export declare function parseAliasedTable(from: string): TableExpressionNode;
@@ -2,12 +2,12 @@ import { ColumnUpdateNode } from '../operation-node/column-update-node.js';
2
2
  import { RawNode } from '../operation-node/raw-node.js';
3
3
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
4
4
  import { ValueNode } from '../operation-node/value-node.js';
5
- import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../query-builder/type-utils.js';
5
+ import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../util/type-utils.js';
6
6
  import { PrimitiveValue } from '../util/object-utils.js';
7
7
  import { ParseContext } from './parse-context.js';
8
8
  export declare type MutationObject<DB, TB extends keyof DB> = {
9
9
  [C in keyof DB[TB]]?: MutationValueExpression<DB, TB, DB[TB][C]>;
10
10
  };
11
- export declare type MutationValueExpression<DB, TB extends keyof DB, T extends PrimitiveValue> = T | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB>;
11
+ export declare type MutationValueExpression<DB, TB extends keyof DB, T> = T | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB>;
12
12
  export declare function parseUpdateObject(ctx: ParseContext, row: MutationObject<any, any>): ReadonlyArray<ColumnUpdateNode>;
13
13
  export declare function parseMutationValueExpression(ctx: ParseContext, value: MutationValueExpression<any, any, PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
@@ -1,5 +1,5 @@
1
1
  import { ValueExpressionNode } from '../operation-node/operation-node-utils.js';
2
- import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../query-builder/type-utils.js';
2
+ import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../util/type-utils.js';
3
3
  import { ExtractTypeFromReferenceExpression } from './reference-parser.js';
4
4
  import { ParseContext } from './parse-context.js';
5
5
  export declare type ValueExpression<DB, TB extends keyof DB, RE> = ExtractTypeFromReferenceExpression<DB, TB, RE> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB>;
@@ -2,7 +2,7 @@ import { CommonTableExpressionNode } from '../operation-node/common-table-expres
2
2
  import { QueryBuilder } from '../query-builder/query-builder.js';
3
3
  import { QueryCreator } from '../query-creator.js';
4
4
  import { RawBuilder } from '../raw-builder/raw-builder.js';
5
- import { AnyRawBuilder } from '../query-builder/type-utils.js';
5
+ import { AnyRawBuilder } from '../util/type-utils.js';
6
6
  import { ParseContext } from './parse-context.js';
7
7
  export declare type CommonTableExpression<DB> = (creator: QueryCreator<DB>) => QueryBuilder<DB, any> | AnyRawBuilder;
8
8
  export declare type QueryCreatorWithCommonTableExpression<DB, N extends string, E extends CommonTableExpression<DB>> = QueryCreator<DB & Record<N, ExtractRowTypeFromCommonTableExpression<E>>>;
@@ -1,6 +1,7 @@
1
1
  import { QueryResult } from '../../driver/database-connection.js';
2
2
  import { RootOperationNode } from '../../query-compiler/query-compiler.js';
3
- import { AnyRow, KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
3
+ import { UnknownRow } from '../../util/type-utils.js';
4
+ import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
4
5
  export interface CamelCasePluginOptions {
5
6
  /**
6
7
  * If true, camelCase is transformed into upper case SNAKE_CASE.
@@ -94,8 +95,8 @@ export declare class CamelCasePlugin implements KyselyPlugin {
94
95
  #private;
95
96
  constructor(opt?: CamelCasePluginOptions);
96
97
  transformQuery(args: PluginTransformQueryArgs): RootOperationNode;
97
- transformResult(args: PluginTransformResultArgs): Promise<QueryResult<AnyRow>>;
98
- protected mapRow(row: AnyRow): AnyRow;
98
+ transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
99
+ protected mapRow(row: UnknownRow): UnknownRow;
99
100
  protected snakeCase(str: string): string;
100
101
  protected camelCase(str: string): string;
101
102
  }
@@ -1,11 +1,12 @@
1
1
  import { QueryResult } from '../driver/database-connection.js';
2
2
  import { RootOperationNode } from '../query-compiler/query-compiler.js';
3
3
  import { QueryId } from '../util/query-id.js';
4
+ import { UnknownRow } from '../util/type-utils.js';
4
5
  export interface KyselyPlugin {
5
6
  /**
6
7
  * This is called for each query before it is executed. You can modify the query by
7
8
  * transforming its {@link OperationNode} tree provided in {@link PluginTransformQueryArgs.node | args.node}
8
- * and returning the transformed tree. You'd usually want to use an {@link OperationNodeTransformer}
9
+ * and returning the transformed tree. You'd usually want to use an {@link OperationNodeTransformer}
9
10
  * for this.
10
11
  *
11
12
  * If you need to pass some query-related data between this method and `transformResult` you
@@ -22,10 +23,14 @@ export interface KyselyPlugin {
22
23
  *
23
24
  * transformResult(args: PluginTransformResultArgs): QueryResult<AnyRow> {
24
25
  * const data = this.data.get(args.queryId)
25
- * return data.result
26
+ * return args.result
26
27
  * }
27
28
  * }
28
29
  * ```
30
+ *
31
+ * You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
32
+ * is not always matched by a call to `transformResult` which would leave orphaned items in the map
33
+ * and cause a memory leak.
29
34
  */
30
35
  transformQuery(args: PluginTransformQueryArgs): RootOperationNode;
31
36
  /**
@@ -33,14 +38,13 @@ export interface KyselyPlugin {
33
38
  * of the query can be accessed through {@link PluginTransformResultArgs.result | args.result}.
34
39
  * You can modify the result and return the modifier result.
35
40
  */
36
- transformResult(args: PluginTransformResultArgs): Promise<QueryResult<AnyRow>>;
41
+ transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
37
42
  }
38
43
  export interface PluginTransformQueryArgs {
39
44
  readonly queryId: QueryId;
40
45
  readonly node: RootOperationNode;
41
46
  }
42
- export declare type AnyRow = Record<string, unknown>;
43
47
  export interface PluginTransformResultArgs {
44
48
  readonly queryId: QueryId;
45
- readonly result: QueryResult<AnyRow>;
49
+ readonly result: QueryResult<UnknownRow>;
46
50
  }
@@ -1,9 +1,10 @@
1
1
  import { QueryResult } from '../../driver/database-connection.js';
2
2
  import { RootOperationNode } from '../../query-compiler/query-compiler.js';
3
- import { AnyRow, KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
3
+ import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
4
+ import { UnknownRow } from '../../util/type-utils.js';
4
5
  export declare class WithSchemaPlugin implements KyselyPlugin {
5
6
  #private;
6
7
  constructor(schema: string);
7
8
  transformQuery(args: PluginTransformQueryArgs): RootOperationNode;
8
- transformResult(args: PluginTransformResultArgs): Promise<QueryResult<AnyRow>>;
9
+ transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
9
10
  }