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
@@ -7,52 +7,57 @@ const raw_node_js_1 = require("../operation-node/raw-node.js");
7
7
  const value_node_js_1 = require("../operation-node/value-node.js");
8
8
  const reference_parser_js_1 = require("../parser/reference-parser.js");
9
9
  const prevent_await_js_1 = require("../util/prevent-await.js");
10
- const query_id_js_1 = require("../util/query-id.js");
10
+ const object_utils_js_1 = require("../util/object-utils.js");
11
11
  class RawBuilder {
12
- #queryId;
13
- #sql;
14
- #params;
15
- #executor;
16
- constructor(args) {
17
- this.#queryId = (0, query_id_js_1.createQueryId)();
18
- this.#sql = args.sql;
19
- this.#params = args.params;
20
- this.#executor = args.executor;
12
+ #props;
13
+ constructor(props) {
14
+ this.#props = (0, object_utils_js_1.freeze)(props);
21
15
  }
22
16
  as(alias) {
23
17
  return new AliasedRawBuilder(this, alias);
24
18
  }
19
+ /**
20
+ * Change the output type of the raw expression.
21
+ *
22
+ * This doesn't produce any SQL. This methods simply returns a copy
23
+ * of this `RawBuilder` with a new output type.
24
+ */
25
+ castTo() {
26
+ return new RawBuilder({
27
+ ...this.#props,
28
+ });
29
+ }
25
30
  toOperationNode() {
26
- const bindingRegex = /(\?\??)/g;
27
- const sql = this.#sql;
28
- const params = this.#params ?? [];
31
+ const parameterPlaceholderRegex = /(\?\??)/g;
32
+ const sql = this.#props.sql;
33
+ const parameters = this.#props.parameters ?? [];
29
34
  const sqlFragments = [];
30
35
  const argNodes = [];
31
36
  let paramIdx = 0;
32
37
  let sqlIdx = 0;
33
38
  let match = null;
34
- while ((match = bindingRegex.exec(sql))) {
39
+ while ((match = parameterPlaceholderRegex.exec(sql))) {
35
40
  const str = match[1];
36
- if (paramIdx >= params.length) {
37
- throw new Error(`value not provided for all bindings in string ${sql}`);
41
+ if (paramIdx >= parameters.length) {
42
+ throw new Error(`value not provided for all placeholders in string ${sql}`);
38
43
  }
39
44
  if (match.index > 0 && sql[match.index - 1] === '\\') {
40
45
  continue;
41
46
  }
42
47
  sqlFragments.push(sql.slice(sqlIdx, match.index).replaceAll('\\?', '?'));
43
- argNodes.push(parseRawArg(str, params[paramIdx]));
48
+ argNodes.push(parseRawArg(str, parameters[paramIdx]));
44
49
  sqlIdx = match.index + str.length;
45
50
  ++paramIdx;
46
51
  }
47
52
  sqlFragments.push(sql.slice(sqlIdx));
48
53
  const rawNode = raw_node_js_1.RawNode.create(sqlFragments, argNodes);
49
- return this.#executor.transformQuery(rawNode, this.#queryId);
54
+ return this.#props.executor.transformQuery(rawNode, this.#props.queryId);
50
55
  }
51
56
  compile() {
52
- return this.#executor.compileQuery(this.toOperationNode(), this.#queryId);
57
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
53
58
  }
54
59
  async execute() {
55
- return this.#executor.executeQuery(this.compile(), this.#queryId);
60
+ return this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
56
61
  }
57
62
  }
58
63
  exports.RawBuilder = RawBuilder;
@@ -7,7 +7,7 @@ import { CompiledQuery } from '../query-compiler/compiled-query.js';
7
7
  import { Compilable } from '../util/compilable.js';
8
8
  import { PrimitiveValue } from '../util/object-utils.js';
9
9
  import { ColumnDefinitionBuilder, ColumnDefinitionBuilderInterface } from './column-definition-builder.js';
10
- import { AnyRawBuilder } from '../query-builder/type-utils.js';
10
+ import { AnyRawBuilder } from '../util/type-utils.js';
11
11
  import { QueryId } from '../util/query-id.js';
12
12
  import { QueryExecutor } from '../query-executor/query-executor.js';
13
13
  import { DataTypeExpression } from '../parser/data-type-parser.js';
@@ -2,7 +2,7 @@ import { OperationNodeSource } from '../operation-node/operation-node-source.js'
2
2
  import { OnModifyForeignAction } from '../operation-node/references-node.js';
3
3
  import { PrimitiveValue } from '../util/object-utils.js';
4
4
  import { ColumnDefinitionNode } from '../operation-node/column-definition-node.js';
5
- import { AnyRawBuilder } from '../query-builder/type-utils.js';
5
+ import { AnyRawBuilder } from '../util/type-utils.js';
6
6
  import { DefaultValueExpression } from '../parser/default-value-parser.js';
7
7
  export interface ColumnDefinitionBuilderInterface<R> {
8
8
  /**
@@ -1,3 +1,3 @@
1
- import { GeneratedPlaceholder } from '../query-builder/type-utils.js';
2
- export declare const generatedPlaceholder: GeneratedPlaceholder;
1
+ import { GeneratedPlaceholder } from './type-utils.js';
2
+ export declare const GENERATED_PLACEHOLDER: GeneratedPlaceholder;
3
3
  export declare function isGeneratedPlaceholder(obj: unknown): obj is GeneratedPlaceholder;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isGeneratedPlaceholder = exports.generatedPlaceholder = void 0;
3
+ exports.isGeneratedPlaceholder = exports.GENERATED_PLACEHOLDER = void 0;
4
4
  const object_utils_js_1 = require("./object-utils.js");
5
- exports.generatedPlaceholder = (0, object_utils_js_1.freeze)({
5
+ exports.GENERATED_PLACEHOLDER = (0, object_utils_js_1.freeze)({
6
6
  __isGeneratedPlaceholder__: true,
7
7
  });
8
8
  function isGeneratedPlaceholder(obj) {
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.randomString = void 0;
4
4
  const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
5
5
  function randomString(length) {
6
- let str = '';
6
+ let chars = new Array(length);
7
7
  for (let i = 0; i < length; ++i) {
8
- str += CHARS[Math.floor(Math.random() * CHARS.length)];
8
+ chars[i] = CHARS[Math.floor(Math.random() * CHARS.length)];
9
9
  }
10
- return str;
10
+ return chars.join('');
11
11
  }
12
12
  exports.randomString = randomString;
@@ -1,6 +1,9 @@
1
1
  import { AliasedRawBuilder, RawBuilder } from '../raw-builder/raw-builder.js';
2
- import { AliasedQueryBuilder, QueryBuilder } from './query-builder.js';
3
- import { ExpressionBuilder } from './expression-builder.js';
2
+ import { AliasedQueryBuilder, QueryBuilder } from '../query-builder/query-builder.js';
3
+ import { ExpressionBuilder } from '../query-builder/expression-builder.js';
4
+ /**
5
+ * Given an object type, extracts the union of all value types.
6
+ */
4
7
  export declare type ValueType<T> = T[keyof T];
5
8
  /**
6
9
  * Given a database type and a union of table names returns the row type
@@ -38,7 +41,7 @@ export declare type RowType<DB, TB extends keyof DB> = UnionToIntersection<DB[TB
38
41
  * Evil typescript magic to convert a union type `A | B | C` into an
39
42
  * intersection type `A & B & C`.
40
43
  */
41
- export declare type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
44
+ declare type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
42
45
  /**
43
46
  * Given a database type and a union of table names in that db, returns
44
47
  * a union type with all possible column names.
@@ -150,3 +153,8 @@ export interface GeneratedPlaceholder {
150
153
  export declare type ManyResultRowType<O> = O extends InsertResultTypeTag ? number | undefined : O extends DeleteResultTypeTag ? number : O extends UpdateResultTypeTag ? number : O;
151
154
  export declare type SingleResultRowType<O> = O extends InsertResultTypeTag ? number | undefined : O extends DeleteResultTypeTag ? number : O extends UpdateResultTypeTag ? number : O | undefined;
152
155
  export declare type NonEmptySingleResultRowType<O> = O extends InsertResultTypeTag ? number : O extends DeleteResultTypeTag ? number : O extends UpdateResultTypeTag ? number : O;
156
+ export declare type UnknownRow = Record<string, unknown>;
157
+ export declare type Nullable<T> = {
158
+ [P in keyof T]: T[P] | null;
159
+ };
160
+ export {};
File without changes
@@ -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
@@ -8,6 +8,12 @@ export class MysqlAdapter {
8
8
  return false;
9
9
  }
10
10
  async acquireMigrationLock(db) {
11
+ // Kysely uses a single connection to run the migrations. Because of that, we
12
+ // can take a lock using `get_lock`. Locks acquired using `get_lock` get
13
+ // released when the connection is destroyed (session ends) or when the lock
14
+ // is released using `release_lock`. This way we know that the lock is either
15
+ // released by us after successfull or failed migrations OR it's released by
16
+ // mysql if the process gets killed for some reason.
11
17
  await db
12
18
  .raw(`select get_lock('${LOCK_ID}', ${LOCK_TIMEOUT_SECONDS})`)
13
19
  .execute();
@@ -50,16 +50,16 @@ export class MysqlDriver {
50
50
  // On mysql this sets the isolation level of the next transaction.
51
51
  await connection.executeQuery({
52
52
  sql: `set transaction isolation level ${settings.isolationLevel}`,
53
- bindings: [],
53
+ parameters: [],
54
54
  });
55
55
  }
56
- await connection.executeQuery({ sql: 'begin', bindings: [] });
56
+ await connection.executeQuery({ sql: 'begin', parameters: [] });
57
57
  }
58
58
  async commitTransaction(connection) {
59
- await connection.executeQuery({ sql: 'commit', bindings: [] });
59
+ await connection.executeQuery({ sql: 'commit', parameters: [] });
60
60
  }
61
61
  async rollbackTransaction(connection) {
62
- await connection.executeQuery({ sql: 'rollback', bindings: [] });
62
+ await connection.executeQuery({ sql: 'rollback', parameters: [] });
63
63
  }
64
64
  async releaseConnection(connection) {
65
65
  const mysqlConnection = connection;
@@ -127,7 +127,7 @@ class MysqlConnection {
127
127
  }
128
128
  #executeQuery(compiledQuery) {
129
129
  return new Promise((resolve, reject) => {
130
- this.#rawConnection.query(compiledQuery.sql, compiledQuery.bindings, (err, result) => {
130
+ this.#rawConnection.query(compiledQuery.sql, compiledQuery.parameters, (err, result) => {
131
131
  if (err) {
132
132
  reject(err);
133
133
  }
@@ -37,18 +37,18 @@ export class PostgresDriver {
37
37
  if (settings.isolationLevel) {
38
38
  await connection.executeQuery({
39
39
  sql: `start transaction isolation level ${settings.isolationLevel}`,
40
- bindings: [],
40
+ parameters: [],
41
41
  });
42
42
  }
43
43
  else {
44
- await connection.executeQuery({ sql: 'begin', bindings: [] });
44
+ await connection.executeQuery({ sql: 'begin', parameters: [] });
45
45
  }
46
46
  }
47
47
  async commitTransaction(connection) {
48
- await connection.executeQuery({ sql: 'commit', bindings: [] });
48
+ await connection.executeQuery({ sql: 'commit', parameters: [] });
49
49
  }
50
50
  async rollbackTransaction(connection) {
51
- await connection.executeQuery({ sql: 'rollback', bindings: [] });
51
+ await connection.executeQuery({ sql: 'rollback', parameters: [] });
52
52
  }
53
53
  async releaseConnection(connection) {
54
54
  const pgConnection = connection;
@@ -86,7 +86,7 @@ class PostgresConnection {
86
86
  }
87
87
  async executeQuery(compiledQuery) {
88
88
  const result = await this.#client.query(compiledQuery.sql, [
89
- ...compiledQuery.bindings,
89
+ ...compiledQuery.parameters,
90
90
  ]);
91
91
  if (result.command === 'UPDATE' || result.command === 'DELETE') {
92
92
  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.
@@ -3,7 +3,7 @@ import { DynamicModule } from './dynamic/dynamic.js';
3
3
  import { DefaultConnectionProvider } from './driver/default-connection-provider.js';
4
4
  import { MigrationModule } from './migration/migration.js';
5
5
  import { QueryCreator } from './query-creator.js';
6
- import { generatedPlaceholder } from './util/generated-placeholder.js';
6
+ import { GENERATED_PLACEHOLDER } from './util/generated-placeholder.js';
7
7
  import { DefaultQueryExecutor } from './query-executor/default-query-executor.js';
8
8
  import { freeze, isObject } from './util/object-utils.js';
9
9
  import { RuntimeDriver } from './driver/runtime-driver.js';
@@ -11,6 +11,7 @@ import { SingleConnectionProvider } from './driver/single-connection-provider.js
11
11
  import { TRANSACTION_ISOLATION_LEVELS, } from './driver/driver.js';
12
12
  import { preventAwait } from './util/prevent-await.js';
13
13
  import { DefaultParseContext } from './parser/parse-context.js';
14
+ import { FunctionBuilder } from './query-builder/function-builder.js';
14
15
  /**
15
16
  * The main Kysely class.
16
17
  *
@@ -128,7 +129,38 @@ export class Kysely extends QueryCreator {
128
129
  * ```
129
130
  */
130
131
  get generated() {
131
- return generatedPlaceholder;
132
+ return GENERATED_PLACEHOLDER;
133
+ }
134
+ /**
135
+ * Returns a {@link FunctionBuilder} that can be used to write type safe function
136
+ * calls.
137
+ *
138
+ * ```ts
139
+ * const { count } = db.fn
140
+ *
141
+ * await db.selectFrom('person')
142
+ * .innerJoin('pet', 'pet.owner_id', 'person.id')
143
+ * .select([
144
+ * 'person.id',
145
+ * count('pet.id').as('pet_count')
146
+ * ])
147
+ * .groupBy('person.id')
148
+ * .having(count('pet.id'), '>', 10)
149
+ * .execute()
150
+ * ```
151
+ *
152
+ * The generated SQL (postgresql):
153
+ *
154
+ * ```sql
155
+ * select "person"."id", count("pet"."id") as "pet_count"
156
+ * from "person"
157
+ * inner join "pet" on "pet"."owner_id" = "person"."id"
158
+ * group by "person"."id"
159
+ * having count("pet"."id") > $1
160
+ * ```
161
+ */
162
+ get fn() {
163
+ return new FunctionBuilder({ executor: this.#props.executor });
132
164
  }
133
165
  /**
134
166
  * 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;