kysely 0.21.6 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/index.d.ts +9 -4
  3. package/dist/cjs/index.js +7 -2
  4. package/dist/cjs/kysely.d.ts +3 -3
  5. package/dist/cjs/kysely.js +3 -3
  6. package/dist/cjs/migration/file-migration-provider.js +7 -2
  7. package/dist/cjs/operation-node/aggregate-function-node.d.ts +22 -0
  8. package/dist/cjs/operation-node/aggregate-function-node.js +31 -0
  9. package/dist/cjs/operation-node/alias-node.d.ts +2 -1
  10. package/dist/cjs/operation-node/group-by-node.d.ts +1 -1
  11. package/dist/cjs/operation-node/group-by-node.js +3 -3
  12. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
  13. package/dist/cjs/operation-node/operation-node-transformer.d.ts +10 -2
  14. package/dist/cjs/operation-node/operation-node-transformer.js +38 -5
  15. package/dist/cjs/operation-node/operation-node-utils.d.ts +2 -1
  16. package/dist/cjs/operation-node/operation-node-visitor.d.ts +10 -2
  17. package/dist/cjs/operation-node/operation-node-visitor.js +5 -1
  18. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  19. package/dist/cjs/operation-node/over-node.d.ts +19 -0
  20. package/dist/cjs/operation-node/over-node.js +35 -0
  21. package/dist/cjs/operation-node/partition-by-item-node.d.ts +14 -0
  22. package/dist/cjs/operation-node/{union-node.js → partition-by-item-node.js} +6 -7
  23. package/dist/cjs/operation-node/partition-by-node.d.ts +14 -0
  24. package/dist/cjs/operation-node/partition-by-node.js +24 -0
  25. package/dist/cjs/operation-node/select-query-node.d.ts +3 -3
  26. package/dist/cjs/operation-node/select-query-node.js +4 -4
  27. package/dist/cjs/operation-node/set-operation-node.d.ts +18 -0
  28. package/dist/cjs/operation-node/set-operation-node.js +20 -0
  29. package/dist/cjs/operation-node/value-list-node.d.ts +2 -1
  30. package/dist/cjs/parser/complex-expression-parser.d.ts +6 -4
  31. package/dist/cjs/parser/group-by-parser.d.ts +1 -1
  32. package/dist/cjs/parser/group-by-parser.js +2 -2
  33. package/dist/cjs/parser/parse-utils.d.ts +2 -0
  34. package/dist/cjs/parser/parse-utils.js +9 -1
  35. package/dist/cjs/parser/partition-by-parser.d.ts +6 -0
  36. package/dist/cjs/parser/partition-by-parser.js +9 -0
  37. package/dist/cjs/parser/reference-parser.d.ts +2 -1
  38. package/dist/cjs/parser/select-parser.d.ts +4 -3
  39. package/dist/cjs/parser/set-operation-parser.d.ts +5 -0
  40. package/dist/cjs/parser/set-operation-parser.js +8 -0
  41. package/dist/cjs/parser/value-parser.d.ts +2 -1
  42. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +117 -0
  43. package/dist/cjs/query-builder/aggregate-function-builder.js +146 -0
  44. package/dist/cjs/query-builder/expression-builder.d.ts +3 -3
  45. package/dist/cjs/query-builder/expression-builder.js +3 -3
  46. package/dist/cjs/query-builder/{function-builder.d.ts → function-module.d.ts} +49 -42
  47. package/dist/cjs/query-builder/{function-builder.js → function-module.js} +70 -59
  48. package/dist/cjs/query-builder/over-builder.d.ts +59 -0
  49. package/dist/cjs/query-builder/over-builder.js +50 -0
  50. package/dist/cjs/query-builder/select-query-builder.d.ts +63 -3
  51. package/dist/cjs/query-builder/select-query-builder.js +83 -3
  52. package/dist/cjs/query-compiler/default-query-compiler.d.ts +10 -2
  53. package/dist/cjs/query-compiler/default-query-compiler.js +41 -14
  54. package/dist/cjs/raw-builder/sql.d.ts +13 -5
  55. package/dist/cjs/raw-builder/sql.js +6 -0
  56. package/dist/cjs/util/type-utils.d.ts +4 -0
  57. package/dist/esm/index.d.ts +9 -4
  58. package/dist/esm/index.js +7 -2
  59. package/dist/esm/kysely.d.ts +3 -3
  60. package/dist/esm/kysely.js +3 -3
  61. package/dist/esm/migration/file-migration-provider.js +7 -2
  62. package/dist/esm/operation-node/aggregate-function-node.d.ts +22 -0
  63. package/dist/esm/operation-node/aggregate-function-node.js +29 -0
  64. package/dist/esm/operation-node/alias-node.d.ts +2 -1
  65. package/dist/esm/operation-node/group-by-node.d.ts +1 -1
  66. package/dist/esm/operation-node/group-by-node.js +3 -3
  67. package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
  68. package/dist/esm/operation-node/operation-node-transformer.d.ts +10 -2
  69. package/dist/esm/operation-node/operation-node-transformer.js +38 -5
  70. package/dist/esm/operation-node/operation-node-utils.d.ts +2 -1
  71. package/dist/esm/operation-node/operation-node-visitor.d.ts +10 -2
  72. package/dist/esm/operation-node/operation-node-visitor.js +5 -1
  73. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  74. package/dist/esm/operation-node/over-node.d.ts +19 -0
  75. package/dist/esm/operation-node/over-node.js +33 -0
  76. package/dist/esm/operation-node/partition-by-item-node.d.ts +14 -0
  77. package/dist/esm/operation-node/partition-by-item-node.js +16 -0
  78. package/dist/esm/operation-node/partition-by-node.d.ts +14 -0
  79. package/dist/esm/operation-node/partition-by-node.js +22 -0
  80. package/dist/esm/operation-node/select-query-node.d.ts +3 -3
  81. package/dist/esm/operation-node/select-query-node.js +4 -4
  82. package/dist/esm/operation-node/set-operation-node.d.ts +18 -0
  83. package/dist/esm/operation-node/set-operation-node.js +18 -0
  84. package/dist/esm/operation-node/value-list-node.d.ts +2 -1
  85. package/dist/esm/parser/complex-expression-parser.d.ts +6 -4
  86. package/dist/esm/parser/group-by-parser.d.ts +1 -1
  87. package/dist/esm/parser/group-by-parser.js +2 -2
  88. package/dist/esm/parser/parse-utils.d.ts +2 -0
  89. package/dist/esm/parser/parse-utils.js +7 -0
  90. package/dist/esm/parser/partition-by-parser.d.ts +6 -0
  91. package/dist/esm/parser/partition-by-parser.js +6 -0
  92. package/dist/esm/parser/reference-parser.d.ts +2 -1
  93. package/dist/esm/parser/select-parser.d.ts +4 -3
  94. package/dist/esm/parser/set-operation-parser.d.ts +5 -0
  95. package/dist/esm/parser/set-operation-parser.js +5 -0
  96. package/dist/esm/parser/value-parser.d.ts +2 -1
  97. package/dist/esm/query-builder/aggregate-function-builder.d.ts +117 -0
  98. package/dist/esm/query-builder/aggregate-function-builder.js +142 -0
  99. package/dist/esm/query-builder/expression-builder.d.ts +3 -3
  100. package/dist/esm/query-builder/expression-builder.js +3 -3
  101. package/dist/esm/query-builder/{function-builder.d.ts → function-module.d.ts} +49 -42
  102. package/dist/esm/query-builder/{function-builder.js → function-module.js} +69 -58
  103. package/dist/esm/query-builder/over-builder.d.ts +59 -0
  104. package/dist/esm/query-builder/over-builder.js +47 -0
  105. package/dist/esm/query-builder/select-query-builder.d.ts +63 -3
  106. package/dist/esm/query-builder/select-query-builder.js +83 -3
  107. package/dist/esm/query-compiler/default-query-compiler.d.ts +10 -2
  108. package/dist/esm/query-compiler/default-query-compiler.js +41 -14
  109. package/dist/esm/raw-builder/sql.d.ts +13 -5
  110. package/dist/esm/raw-builder/sql.js +6 -0
  111. package/dist/esm/util/type-utils.d.ts +4 -0
  112. package/package.json +4 -1
  113. package/dist/cjs/operation-node/union-node.d.ts +0 -16
  114. package/dist/cjs/parser/union-parser.d.ts +0 -5
  115. package/dist/cjs/parser/union-parser.js +0 -8
  116. package/dist/esm/operation-node/union-node.d.ts +0 -16
  117. package/dist/esm/operation-node/union-node.js +0 -17
  118. package/dist/esm/parser/union-parser.d.ts +0 -5
  119. package/dist/esm/parser/union-parser.js +0 -5
@@ -4,10 +4,9 @@ exports.DefaultQueryCompiler = void 0;
4
4
  const insert_query_node_js_1 = require("../operation-node/insert-query-node.js");
5
5
  const operation_node_visitor_js_1 = require("../operation-node/operation-node-visitor.js");
6
6
  const query_node_js_1 = require("../operation-node/query-node.js");
7
- const raw_node_js_1 = require("../operation-node/raw-node.js");
8
7
  const object_utils_js_1 = require("../util/object-utils.js");
9
- const union_node_js_1 = require("../operation-node/union-node.js");
10
8
  const create_view_node_js_1 = require("../operation-node/create-view-node.js");
9
+ const set_operation_node_js_1 = require("../operation-node/set-operation-node.js");
11
10
  class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisitor {
12
11
  #sql = '';
13
12
  #parameters = [];
@@ -31,7 +30,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
31
30
  const wrapInParens = this.parentNode !== undefined &&
32
31
  !insert_query_node_js_1.InsertQueryNode.is(this.parentNode) &&
33
32
  !create_view_node_js_1.CreateViewNode.is(this.parentNode) &&
34
- !union_node_js_1.UnionNode.is(this.parentNode);
33
+ !set_operation_node_js_1.SetOperationNode.is(this.parentNode);
35
34
  if (this.parentNode === undefined && node.explain) {
36
35
  this.visitNode(node.explain);
37
36
  this.append(' ');
@@ -73,9 +72,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
73
72
  this.append(' ');
74
73
  this.visitNode(node.having);
75
74
  }
76
- if (node.union) {
75
+ if (node.setOperations) {
77
76
  this.append(' ');
78
- this.compileList(node.union, ' ');
77
+ this.compileList(node.setOperations, ' ');
79
78
  }
80
79
  if (node.orderBy) {
81
80
  this.append(' ');
@@ -544,13 +543,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
544
543
  }
545
544
  if (node.expression) {
546
545
  this.append(' (');
547
- if (raw_node_js_1.RawNode.is(node.expression)) {
548
- this.append('(');
549
- }
550
546
  this.visitNode(node.expression);
551
- if (raw_node_js_1.RawNode.is(node.expression)) {
552
- this.append(')');
553
- }
554
547
  this.append(')');
555
548
  }
556
549
  }
@@ -752,12 +745,13 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
752
745
  this.append(' restrict');
753
746
  }
754
747
  }
755
- visitUnion(node) {
756
- this.append('union ');
748
+ visitSetOperation(node) {
749
+ this.append(node.operator);
750
+ this.append(' ');
757
751
  if (node.all) {
758
752
  this.append('all ');
759
753
  }
760
- this.visitNode(node.union);
754
+ this.visitNode(node.expression);
761
755
  }
762
756
  visitCreateView(node) {
763
757
  this.append('create ');
@@ -870,6 +864,39 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
870
864
  visitDefaultInsertValue(_) {
871
865
  this.append('default');
872
866
  }
867
+ visitAggregateFunction(node) {
868
+ this.append(node.func);
869
+ this.append('(');
870
+ if (node.distinct) {
871
+ this.append('distinct ');
872
+ }
873
+ this.visitNode(node.column);
874
+ this.append(')');
875
+ if (node.over) {
876
+ this.append(' ');
877
+ this.visitNode(node.over);
878
+ }
879
+ }
880
+ visitOver(node) {
881
+ this.append('over(');
882
+ if (node.partitionBy) {
883
+ this.visitNode(node.partitionBy);
884
+ if (node.orderBy) {
885
+ this.append(' ');
886
+ }
887
+ }
888
+ if (node.orderBy) {
889
+ this.visitNode(node.orderBy);
890
+ }
891
+ this.append(')');
892
+ }
893
+ visitPartitionBy(node) {
894
+ this.append('partition by ');
895
+ this.compileList(node.items);
896
+ }
897
+ visitPartitionByItem(node) {
898
+ this.visitNode(node.partitionBy);
899
+ }
873
900
  append(str) {
874
901
  this.#sql += str;
875
902
  }
@@ -7,13 +7,14 @@ export interface Sql {
7
7
  * import { sql } from 'kysely'
8
8
  *
9
9
  * const id = 123
10
- *
11
10
  * const snippet = sql<Person[]>`select * from person where id = ${id}`
12
11
  * ```
13
12
  *
14
13
  * Substitutions (the things inside `${}`) are automatically passed to the database
15
- * as parameters and are NOT interpolated to the SQL string. There's no need to worry
16
- * about SQL injection vulnerabilities.
14
+ * as parameters and are never interpolated to the SQL string. There's no need to worry
15
+ * about SQL injection vulnerabilities. Substitutions can be values, other `sql`
16
+ * expressions, queries and almost anything else Kysely can produce and they get
17
+ * handled correctly. See the examples below.
17
18
  *
18
19
  * If you need your substitutions to be interpreted as identifiers, value literals or
19
20
  * lists of things, see the {@link Sql.ref}, {@link Sql.table}, {@link Sql.id},
@@ -29,8 +30,7 @@ export interface Sql {
29
30
  * .selectFrom('person')
30
31
  * .select(
31
32
  * // If you use `sql` in a select statement, remember to call the `as`
32
- * // method to give it an alias. Otherwise Kysely is not able to add
33
- * // the column to the result type.
33
+ * // method to give it an alias.
34
34
  * sql<string>`concat(first_name, ' ', last_name)`.as('full_name')
35
35
  * )
36
36
  * .where(sql`birthdate between ${date1} and ${date2}`)
@@ -97,6 +97,14 @@ export interface Sql {
97
97
  * type-safety though... But it's possible.
98
98
  */
99
99
  <T = unknown>(sqlFragments: TemplateStringsArray, ...parameters: unknown[]): RawBuilder<T>;
100
+ /**
101
+ * `sql.value(value)` is a shortcut for:
102
+ *
103
+ * ```ts
104
+ * sql`${value}`
105
+ * ```
106
+ */
107
+ value(value: unknown): RawBuilder<unknown>;
100
108
  /**
101
109
  * This can be used to add runtime column references to SQL snippets.
102
110
  *
@@ -21,6 +21,12 @@ exports.sql = Object.assign((sqlFragments, ...parameters) => {
21
21
  rawNode: raw_node_js_1.RawNode.createWithChild((0, reference_parser_js_1.parseStringReference)(columnReference)),
22
22
  });
23
23
  },
24
+ value(value) {
25
+ return new raw_builder_js_1.RawBuilder({
26
+ queryId: (0, query_id_js_1.createQueryId)(),
27
+ rawNode: raw_node_js_1.RawNode.createWithChild((0, value_parser_js_1.parseValueExpression)(value)),
28
+ });
29
+ },
24
30
  table(tableReference) {
25
31
  return new raw_builder_js_1.RawBuilder({
26
32
  queryId: (0, query_id_js_1.createQueryId)(),
@@ -4,6 +4,7 @@ import { ExpressionBuilder } from '../query-builder/expression-builder.js';
4
4
  import { InsertResult } from '../query-builder/insert-result.js';
5
5
  import { DeleteResult } from '../query-builder/delete-result.js';
6
6
  import { UpdateResult } from '../query-builder/update-result.js';
7
+ import { AggregateFunctionBuilder, AliasedAggregateFunctionBuilder } from '../query-builder/aggregate-function-builder.js';
7
8
  /**
8
9
  * Given an object type, extracts the union of all value types.
9
10
  */
@@ -102,10 +103,13 @@ export declare type AnySelectQueryBuilder = SelectQueryBuilder<any, any, any>;
102
103
  export declare type AnyAliasedQueryBuilder = AliasedQueryBuilder<any, any, any, any>;
103
104
  export declare type AnyRawBuilder = RawBuilder<any>;
104
105
  export declare type AnyAliasedRawBuilder = AliasedRawBuilder<any, any>;
106
+ export declare type AnyAliasedAggregateFunctionBuilder = AliasedAggregateFunctionBuilder<any, any, any, any>;
105
107
  export declare type SelectQueryBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnySelectQueryBuilder;
106
108
  export declare type AliasedQueryBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedQueryBuilder;
107
109
  export declare type RawBuilderFactory<DB, TB extends keyof DB, O = any> = (qb: ExpressionBuilder<DB, TB>) => RawBuilder<O>;
108
110
  export declare type AliasedRawBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedRawBuilder;
111
+ export declare type AggregateFunctionBuilderFactory<DB, TB extends keyof DB, O = unknown> = (qb: ExpressionBuilder<DB, TB>) => AggregateFunctionBuilder<DB, TB, O>;
112
+ export declare type AliasedAggregateFunctionBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedAggregateFunctionBuilder;
109
113
  export declare type SingleResultType<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : O | undefined;
110
114
  export declare type UnknownRow = Record<string, unknown>;
111
115
  export declare type Nullable<T> = {
@@ -10,11 +10,12 @@ export * from './query-builder/delete-query-builder.js';
10
10
  export * from './query-builder/no-result-error.js';
11
11
  export * from './query-builder/join-builder.js';
12
12
  export * from './query-builder/expression-builder.js';
13
- export * from './query-builder/function-builder.js';
13
+ export * from './query-builder/function-module.js';
14
14
  export * from './query-builder/insert-result.js';
15
15
  export * from './query-builder/delete-result.js';
16
16
  export * from './query-builder/update-result.js';
17
17
  export * from './query-builder/on-conflict-builder.js';
18
+ export * from './query-builder/aggregate-function-builder.js';
18
19
  export * from './raw-builder/raw-builder.js';
19
20
  export * from './raw-builder/sql.js';
20
21
  export * from './query-executor/query-executor.js';
@@ -142,7 +143,6 @@ export * from './operation-node/select-query-node.js';
142
143
  export * from './operation-node/select-query-node.js';
143
144
  export * from './operation-node/selection-node.js';
144
145
  export * from './operation-node/table-node.js';
145
- export * from './operation-node/union-node.js';
146
146
  export * from './operation-node/unique-constraint-node.js';
147
147
  export * from './operation-node/update-query-node.js';
148
148
  export * from './operation-node/value-list-node.js';
@@ -152,13 +152,18 @@ export * from './operation-node/where-node.js';
152
152
  export * from './operation-node/with-node.js';
153
153
  export * from './operation-node/explain-node.js';
154
154
  export * from './operation-node/default-insert-value-node.js';
155
+ export * from './operation-node/aggregate-function-node.js';
156
+ export * from './operation-node/over-node.js';
157
+ export * from './operation-node/partition-by-node.js';
158
+ export * from './operation-node/partition-by-item-node.js';
159
+ export * from './operation-node/set-operation-node.js';
155
160
  export * from './util/column-type.js';
156
161
  export * from './util/compilable.js';
157
162
  export * from './util/explainable.js';
158
163
  export * from './util/log.js';
159
164
  export { AnyColumn, UnknownRow, AnySelectQueryBuilder, } from './util/type-utils.js';
160
165
  export { SelectExpression, SelectExpressionOrList, Selection, } from './parser/select-parser.js';
161
- export { ReferenceExpression, ReferenceExpressionOrList, } from './parser/reference-parser.js';
166
+ export { ReferenceExpression, ReferenceExpressionOrList, StringReference, } from './parser/reference-parser.js';
162
167
  export { ValueExpression, ValueExpressionOrList, } from './parser/value-parser.js';
163
168
  export { FilterValueExpression, FilterValueExpressionOrList, ExistsExpression, FilterOperator, } from './parser/filter-parser.js';
164
169
  export { TableExpression, TableExpressionOrList, } from './parser/table-parser.js';
@@ -166,4 +171,4 @@ export { JoinReferenceExpression, JoinCallbackExpression, } from './parser/join-
166
171
  export { InsertObject } from './parser/insert-values-parser.js';
167
172
  export { MutationObject } from './parser/update-set-parser.js';
168
173
  export { OrderByExpression, OrderByDirectionExpression, } from './parser/order-by-parser.js';
169
- export { UnionExpression } from './parser/union-parser.js';
174
+ export { SetOperationExpression } from './parser/set-operation-parser.js';
package/dist/esm/index.js CHANGED
@@ -11,11 +11,12 @@ export * from './query-builder/delete-query-builder.js';
11
11
  export * from './query-builder/no-result-error.js';
12
12
  export * from './query-builder/join-builder.js';
13
13
  export * from './query-builder/expression-builder.js';
14
- export * from './query-builder/function-builder.js';
14
+ export * from './query-builder/function-module.js';
15
15
  export * from './query-builder/insert-result.js';
16
16
  export * from './query-builder/delete-result.js';
17
17
  export * from './query-builder/update-result.js';
18
18
  export * from './query-builder/on-conflict-builder.js';
19
+ export * from './query-builder/aggregate-function-builder.js';
19
20
  export * from './raw-builder/raw-builder.js';
20
21
  export * from './raw-builder/sql.js';
21
22
  export * from './query-executor/query-executor.js';
@@ -143,7 +144,6 @@ export * from './operation-node/select-query-node.js';
143
144
  export * from './operation-node/select-query-node.js';
144
145
  export * from './operation-node/selection-node.js';
145
146
  export * from './operation-node/table-node.js';
146
- export * from './operation-node/union-node.js';
147
147
  export * from './operation-node/unique-constraint-node.js';
148
148
  export * from './operation-node/update-query-node.js';
149
149
  export * from './operation-node/value-list-node.js';
@@ -153,6 +153,11 @@ export * from './operation-node/where-node.js';
153
153
  export * from './operation-node/with-node.js';
154
154
  export * from './operation-node/explain-node.js';
155
155
  export * from './operation-node/default-insert-value-node.js';
156
+ export * from './operation-node/aggregate-function-node.js';
157
+ export * from './operation-node/over-node.js';
158
+ export * from './operation-node/partition-by-node.js';
159
+ export * from './operation-node/partition-by-item-node.js';
160
+ export * from './operation-node/set-operation-node.js';
156
161
  export * from './util/column-type.js';
157
162
  export * from './util/compilable.js';
158
163
  export * from './util/explainable.js';
@@ -6,7 +6,7 @@ import { QueryCreator } from './query-creator.js';
6
6
  import { KyselyPlugin } from './plugin/kysely-plugin.js';
7
7
  import { DatabaseIntrospector } from './dialect/database-introspector.js';
8
8
  import { Driver, IsolationLevel } from './driver/driver.js';
9
- import { FunctionBuilder } from './query-builder/function-builder.js';
9
+ import { FunctionModule } from './query-builder/function-module.js';
10
10
  import { LogConfig } from './util/log.js';
11
11
  import { QueryExecutorProvider } from './query-executor/query-executor-provider.js';
12
12
  /**
@@ -72,7 +72,7 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
72
72
  */
73
73
  get introspection(): DatabaseIntrospector;
74
74
  /**
75
- * Returns a {@link FunctionBuilder} that can be used to write type safe function
75
+ * Returns a {@link FunctionModule} that can be used to write type safe function
76
76
  * calls.
77
77
  *
78
78
  * ```ts
@@ -99,7 +99,7 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
99
99
  * having count("pet"."id") > $1
100
100
  * ```
101
101
  */
102
- get fn(): FunctionBuilder<DB, keyof DB>;
102
+ get fn(): FunctionModule<DB, keyof DB>;
103
103
  /**
104
104
  * Creates a {@link TransactionBuilder} that can be used to run queries inside a transaction.
105
105
  *
@@ -9,7 +9,7 @@ import { RuntimeDriver } from './driver/runtime-driver.js';
9
9
  import { SingleConnectionProvider } from './driver/single-connection-provider.js';
10
10
  import { TRANSACTION_ISOLATION_LEVELS, } from './driver/driver.js';
11
11
  import { preventAwait } from './util/prevent-await.js';
12
- import { FunctionBuilder } from './query-builder/function-builder.js';
12
+ import { FunctionModule } from './query-builder/function-module.js';
13
13
  import { Log } from './util/log.js';
14
14
  /**
15
15
  * The main Kysely class.
@@ -105,7 +105,7 @@ export class Kysely extends QueryCreator {
105
105
  return this.#props.dialect.createIntrospector(this.withoutPlugins());
106
106
  }
107
107
  /**
108
- * Returns a {@link FunctionBuilder} that can be used to write type safe function
108
+ * Returns a {@link FunctionModule} that can be used to write type safe function
109
109
  * calls.
110
110
  *
111
111
  * ```ts
@@ -133,7 +133,7 @@ export class Kysely extends QueryCreator {
133
133
  * ```
134
134
  */
135
135
  get fn() {
136
- return new FunctionBuilder();
136
+ return new FunctionModule();
137
137
  }
138
138
  /**
139
139
  * Creates a {@link TransactionBuilder} that can be used to run queries inside a transaction.
@@ -29,8 +29,13 @@ export class FileMigrationProvider {
29
29
  !fileName.endsWith('.d.ts')) {
30
30
  const migration = await import(
31
31
  /* webpackIgnore: true */ this.#props.path.join(this.#props.migrationFolder, fileName));
32
- if (isMigration(migration)) {
33
- migrations[fileName.substring(0, fileName.length - 3)] = migration;
32
+ const migrationKey = fileName.substring(0, fileName.length - 3);
33
+ // Handle esModuleInterop export's `default` prop...
34
+ if (isMigration(migration?.default)) {
35
+ migrations[migrationKey] = migration.default;
36
+ }
37
+ else if (isMigration(migration)) {
38
+ migrations[migrationKey] = migration;
34
39
  }
35
40
  }
36
41
  }
@@ -0,0 +1,22 @@
1
+ import { ColumnNode } from './column-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ import { OverNode } from './over-node.js';
4
+ import { ReferenceNode } from './reference-node.js';
5
+ declare type AggregateFunction = 'avg' | 'count' | 'max' | 'min' | 'sum';
6
+ export interface AggregateFunctionNode extends OperationNode {
7
+ readonly kind: 'AggregateFunctionNode';
8
+ readonly func: AggregateFunction;
9
+ readonly column: ColumnNode | ReferenceNode;
10
+ readonly distinct?: boolean;
11
+ readonly over?: OverNode;
12
+ }
13
+ /**
14
+ * @internal
15
+ */
16
+ export declare const AggregateFunctionNode: Readonly<{
17
+ is(node: OperationNode): node is AggregateFunctionNode;
18
+ create(aggregateFunction: AggregateFunction, column: ColumnNode | ReferenceNode): AggregateFunctionNode;
19
+ cloneWithDistinct(aggregateFunctionNode: AggregateFunctionNode): AggregateFunctionNode;
20
+ cloneWithOver(aggregateFunctionNode: AggregateFunctionNode, over?: OverNode): AggregateFunctionNode;
21
+ }>;
22
+ export {};
@@ -0,0 +1,29 @@
1
+ /// <reference types="./aggregate-function-node.d.ts" />
2
+ import { freeze } from '../util/object-utils.js';
3
+ /**
4
+ * @internal
5
+ */
6
+ export const AggregateFunctionNode = freeze({
7
+ is(node) {
8
+ return node.kind === 'AggregateFunctionNode';
9
+ },
10
+ create(aggregateFunction, column) {
11
+ return freeze({
12
+ kind: 'AggregateFunctionNode',
13
+ func: aggregateFunction,
14
+ column,
15
+ });
16
+ },
17
+ cloneWithDistinct(aggregateFunctionNode) {
18
+ return freeze({
19
+ ...aggregateFunctionNode,
20
+ distinct: true,
21
+ });
22
+ },
23
+ cloneWithOver(aggregateFunctionNode, over) {
24
+ return freeze({
25
+ ...aggregateFunctionNode,
26
+ over,
27
+ });
28
+ },
29
+ });
@@ -1,3 +1,4 @@
1
+ import { AggregateFunctionNode } from './aggregate-function-node.js';
1
2
  import { ColumnNode } from './column-node.js';
2
3
  import { IdentifierNode } from './identifier-node.js';
3
4
  import { OperationNode } from './operation-node.js';
@@ -5,7 +6,7 @@ import { RawNode } from './raw-node.js';
5
6
  import { ReferenceNode } from './reference-node.js';
6
7
  import { SelectQueryNode } from './select-query-node.js';
7
8
  import { TableNode } from './table-node.js';
8
- export declare type AliasNodeChild = ColumnNode | ReferenceNode | TableNode | SelectQueryNode | RawNode;
9
+ export declare type AliasNodeChild = ColumnNode | ReferenceNode | TableNode | SelectQueryNode | RawNode | AggregateFunctionNode;
9
10
  export interface AliasNode extends OperationNode {
10
11
  readonly kind: 'AliasNode';
11
12
  readonly node: AliasNodeChild;
@@ -10,5 +10,5 @@ export interface GroupByNode extends OperationNode {
10
10
  export declare const GroupByNode: Readonly<{
11
11
  is(node: OperationNode): node is GroupByNode;
12
12
  create(items: ReadonlyArray<GroupByItemNode>): GroupByNode;
13
- cloneWithItems(orderBy: GroupByNode, items: ReadonlyArray<GroupByItemNode>): GroupByNode;
13
+ cloneWithItems(groupBy: GroupByNode, items: ReadonlyArray<GroupByItemNode>): GroupByNode;
14
14
  }>;
@@ -13,10 +13,10 @@ export const GroupByNode = freeze({
13
13
  items: freeze(items),
14
14
  });
15
15
  },
16
- cloneWithItems(orderBy, items) {
16
+ cloneWithItems(groupBy, items) {
17
17
  return freeze({
18
- ...orderBy,
19
- items: freeze([...orderBy.items, ...items]),
18
+ ...groupBy,
19
+ items: freeze([...groupBy.items, ...items]),
20
20
  });
21
21
  },
22
22
  });
@@ -1,3 +1,4 @@
1
+ import { AggregateFunctionNode } from './aggregate-function-node.js';
1
2
  import { ColumnNode } from './column-node.js';
2
3
  import { ExplainNode } from './explain-node.js';
3
4
  import { OnConflictNode } from './on-conflict-node.js';
@@ -14,7 +15,7 @@ export interface InsertQueryNode extends OperationNode {
14
15
  readonly kind: 'InsertQueryNode';
15
16
  readonly into: TableNode;
16
17
  readonly columns?: ReadonlyArray<ColumnNode>;
17
- readonly values?: ValuesNode | SelectQueryNode | RawNode;
18
+ readonly values?: ValuesNode | SelectQueryNode | RawNode | AggregateFunctionNode;
18
19
  readonly returning?: ReturningNode;
19
20
  readonly onConflict?: OnConflictNode;
20
21
  readonly onDuplicateKey?: OnDuplicateKeyNode;
@@ -58,7 +58,6 @@ import { ForeignKeyConstraintNode } from './foreign-key-constraint-node.js';
58
58
  import { ColumnDefinitionNode } from './column-definition-node.js';
59
59
  import { ModifyColumnNode } from './modify-column-node.js';
60
60
  import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
61
- import { UnionNode } from './union-node.js';
62
61
  import { CreateViewNode } from './create-view-node.js';
63
62
  import { DropViewNode } from './drop-view-node.js';
64
63
  import { GeneratedNode } from './generated-node.js';
@@ -71,6 +70,11 @@ import { DropTypeNode } from './drop-type-node.js';
71
70
  import { ExplainNode } from './explain-node.js';
72
71
  import { SchemableIdentifierNode } from './schemable-identifier-node.js';
73
72
  import { DefaultInsertValueNode } from './default-insert-value-node.js';
73
+ import { AggregateFunctionNode } from './aggregate-function-node.js';
74
+ import { OverNode } from './over-node.js';
75
+ import { PartitionByNode } from './partition-by-node.js';
76
+ import { PartitionByItemNode } from './partition-by-item-node.js';
77
+ import { SetOperationNode } from './set-operation-node.js';
74
78
  /**
75
79
  * Transforms an operation node tree into another one.
76
80
  *
@@ -145,7 +149,7 @@ export declare class OperationNodeTransformer {
145
149
  protected transformPrimaryKeyConstraint(node: PrimaryKeyConstraintNode): PrimaryKeyConstraintNode;
146
150
  protected transformUniqueConstraint(node: UniqueConstraintNode): UniqueConstraintNode;
147
151
  protected transformForeignKeyConstraint(node: ForeignKeyConstraintNode): ForeignKeyConstraintNode;
148
- protected transformUnion(node: UnionNode): UnionNode;
152
+ protected transformSetOperation(node: SetOperationNode): SetOperationNode;
149
153
  protected transformReferences(node: ReferencesNode): ReferencesNode;
150
154
  protected transformCheckConstraint(node: CheckConstraintNode): CheckConstraintNode;
151
155
  protected transformWith(node: WithNode): WithNode;
@@ -171,6 +175,10 @@ export declare class OperationNodeTransformer {
171
175
  protected transformDropType(node: DropTypeNode): DropTypeNode;
172
176
  protected transformExplain(node: ExplainNode): ExplainNode;
173
177
  protected transformSchemableIdentifier(node: SchemableIdentifierNode): SchemableIdentifierNode;
178
+ protected transformAggregateFunction(node: AggregateFunctionNode): AggregateFunctionNode;
179
+ protected transformOver(node: OverNode): OverNode;
180
+ protected transformPartitionBy(node: PartitionByNode): PartitionByNode;
181
+ protected transformPartitionByItem(node: PartitionByItemNode): PartitionByItemNode;
174
182
  protected transformDataType(node: DataTypeNode): DataTypeNode;
175
183
  protected transformSelectAll(node: SelectAllNode): SelectAllNode;
176
184
  protected transformIdentifier(node: IdentifierNode): IdentifierNode;
@@ -93,7 +93,6 @@ export class OperationNodeTransformer {
93
93
  AddConstraintNode: this.transformAddConstraint.bind(this),
94
94
  DropConstraintNode: this.transformDropConstraint.bind(this),
95
95
  ForeignKeyConstraintNode: this.transformForeignKeyConstraint.bind(this),
96
- UnionNode: this.transformUnion.bind(this),
97
96
  CreateViewNode: this.transformCreateView.bind(this),
98
97
  DropViewNode: this.transformDropView.bind(this),
99
98
  GeneratedNode: this.transformGenerated.bind(this),
@@ -105,6 +104,11 @@ export class OperationNodeTransformer {
105
104
  DropTypeNode: this.transformDropType.bind(this),
106
105
  ExplainNode: this.transformExplain.bind(this),
107
106
  DefaultInsertValueNode: this.transformDefaultInsertValue.bind(this),
107
+ AggregateFunctionNode: this.transformAggregateFunction.bind(this),
108
+ OverNode: this.transformOver.bind(this),
109
+ PartitionByNode: this.transformPartitionBy.bind(this),
110
+ PartitionByItemNode: this.transformPartitionByItem.bind(this),
111
+ SetOperationNode: this.transformSetOperation.bind(this),
108
112
  });
109
113
  transformNode(node) {
110
114
  if (!node) {
@@ -140,8 +144,8 @@ export class OperationNodeTransformer {
140
144
  offset: this.transformNode(node.offset),
141
145
  with: this.transformNode(node.with),
142
146
  having: this.transformNode(node.having),
143
- union: this.transformNodeList(node.union),
144
147
  explain: this.transformNode(node.explain),
148
+ setOperations: this.transformNodeList(node.setOperations),
145
149
  });
146
150
  }
147
151
  transformSelection(node) {
@@ -444,10 +448,11 @@ export class OperationNodeTransformer {
444
448
  onUpdate: node.onUpdate,
445
449
  });
446
450
  }
447
- transformUnion(node) {
451
+ transformSetOperation(node) {
448
452
  return requireAllProps({
449
- kind: 'UnionNode',
450
- union: this.transformNode(node.union),
453
+ kind: 'SetOperationNode',
454
+ operator: node.operator,
455
+ expression: this.transformNode(node.expression),
451
456
  all: node.all,
452
457
  });
453
458
  }
@@ -647,6 +652,34 @@ export class OperationNodeTransformer {
647
652
  identifier: this.transformNode(node.identifier),
648
653
  });
649
654
  }
655
+ transformAggregateFunction(node) {
656
+ return requireAllProps({
657
+ kind: 'AggregateFunctionNode',
658
+ column: this.transformNode(node.column),
659
+ distinct: node.distinct,
660
+ func: node.func,
661
+ over: this.transformNode(node.over),
662
+ });
663
+ }
664
+ transformOver(node) {
665
+ return requireAllProps({
666
+ kind: 'OverNode',
667
+ orderBy: this.transformNode(node.orderBy),
668
+ partitionBy: this.transformNode(node.partitionBy),
669
+ });
670
+ }
671
+ transformPartitionBy(node) {
672
+ return requireAllProps({
673
+ kind: 'PartitionByNode',
674
+ items: this.transformNodeList(node.items),
675
+ });
676
+ }
677
+ transformPartitionByItem(node) {
678
+ return requireAllProps({
679
+ kind: 'PartitionByItemNode',
680
+ partitionBy: this.transformNode(node.partitionBy),
681
+ });
682
+ }
650
683
  transformDataType(node) {
651
684
  // An Object.freezed leaf node. No need to clone.
652
685
  return node;
@@ -1,3 +1,4 @@
1
+ import { AggregateFunctionNode } from './aggregate-function-node.js';
1
2
  import { AliasNode } from './alias-node.js';
2
3
  import { AndNode } from './and-node.js';
3
4
  import { ColumnNode } from './column-node.js';
@@ -11,7 +12,7 @@ import { SelectQueryNode } from './select-query-node.js';
11
12
  import { TableNode } from './table-node.js';
12
13
  import { ValueListNode } from './value-list-node.js';
13
14
  import { ValueNode } from './value-node.js';
14
- export declare type ReferenceExpressionNode = ColumnNode | ReferenceNode | SelectQueryNode | RawNode;
15
+ export declare type ReferenceExpressionNode = ColumnNode | ReferenceNode | SelectQueryNode | RawNode | AggregateFunctionNode;
15
16
  export declare type ValueExpressionNode = ValueNode | ValueListNode | PrimitiveValueListNode | ReferenceExpressionNode;
16
17
  export declare type TableExpressionNode = TableNode | AliasNode;
17
18
  export declare type FilterExpressionNode = FilterNode | AndNode | OrNode | ParensNode | RawNode;
@@ -58,7 +58,6 @@ import { ForeignKeyConstraintNode } from './foreign-key-constraint-node.js';
58
58
  import { ColumnDefinitionNode } from './column-definition-node.js';
59
59
  import { ModifyColumnNode } from './modify-column-node.js';
60
60
  import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
61
- import { UnionNode } from './union-node.js';
62
61
  import { CreateViewNode } from './create-view-node.js';
63
62
  import { DropViewNode } from './drop-view-node.js';
64
63
  import { GeneratedNode } from './generated-node.js';
@@ -71,6 +70,11 @@ import { DropTypeNode } from './drop-type-node.js';
71
70
  import { ExplainNode } from './explain-node.js';
72
71
  import { SchemableIdentifierNode } from './schemable-identifier-node.js';
73
72
  import { DefaultInsertValueNode } from './default-insert-value-node.js';
73
+ import { AggregateFunctionNode } from './aggregate-function-node.js';
74
+ import { OverNode } from './over-node.js';
75
+ import { PartitionByNode } from './partition-by-node.js';
76
+ import { PartitionByItemNode } from './partition-by-item-node.js';
77
+ import { SetOperationNode } from './set-operation-node.js';
74
78
  export declare abstract class OperationNodeVisitor {
75
79
  #private;
76
80
  protected readonly nodeStack: OperationNode[];
@@ -129,7 +133,6 @@ export declare abstract class OperationNodeVisitor {
129
133
  protected abstract visitAddConstraint(node: AddConstraintNode): void;
130
134
  protected abstract visitDropConstraint(node: DropConstraintNode): void;
131
135
  protected abstract visitForeignKeyConstraint(node: ForeignKeyConstraintNode): void;
132
- protected abstract visitUnion(node: UnionNode): void;
133
136
  protected abstract visitDataType(node: DataTypeNode): void;
134
137
  protected abstract visitSelectAll(node: SelectAllNode): void;
135
138
  protected abstract visitIdentifier(node: IdentifierNode): void;
@@ -148,4 +151,9 @@ export declare abstract class OperationNodeVisitor {
148
151
  protected abstract visitDropType(node: DropTypeNode): void;
149
152
  protected abstract visitExplain(node: ExplainNode): void;
150
153
  protected abstract visitDefaultInsertValue(node: DefaultInsertValueNode): void;
154
+ protected abstract visitAggregateFunction(node: AggregateFunctionNode): void;
155
+ protected abstract visitOver(node: OverNode): void;
156
+ protected abstract visitPartitionBy(node: PartitionByNode): void;
157
+ protected abstract visitPartitionByItem(node: PartitionByItemNode): void;
158
+ protected abstract visitSetOperation(node: SetOperationNode): void;
151
159
  }
@@ -66,7 +66,6 @@ export class OperationNodeVisitor {
66
66
  AddConstraintNode: this.visitAddConstraint.bind(this),
67
67
  DropConstraintNode: this.visitDropConstraint.bind(this),
68
68
  ForeignKeyConstraintNode: this.visitForeignKeyConstraint.bind(this),
69
- UnionNode: this.visitUnion.bind(this),
70
69
  CreateViewNode: this.visitCreateView.bind(this),
71
70
  DropViewNode: this.visitDropView.bind(this),
72
71
  GeneratedNode: this.visitGenerated.bind(this),
@@ -78,6 +77,11 @@ export class OperationNodeVisitor {
78
77
  DropTypeNode: this.visitDropType.bind(this),
79
78
  ExplainNode: this.visitExplain.bind(this),
80
79
  DefaultInsertValueNode: this.visitDefaultInsertValue.bind(this),
80
+ AggregateFunctionNode: this.visitAggregateFunction.bind(this),
81
+ OverNode: this.visitOver.bind(this),
82
+ PartitionByNode: this.visitPartitionBy.bind(this),
83
+ PartitionByItemNode: this.visitPartitionByItem.bind(this),
84
+ SetOperationNode: this.visitSetOperation.bind(this),
81
85
  });
82
86
  visitNode = (node) => {
83
87
  this.nodeStack.push(node);