kysely 0.27.0 → 0.27.2

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 (68) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/dialect/mssql/mssql-introspector.js +8 -6
  3. package/dist/cjs/expression/expression-wrapper.d.ts +13 -3
  4. package/dist/cjs/expression/expression-wrapper.js +12 -0
  5. package/dist/cjs/migration/migrator.d.ts +19 -2
  6. package/dist/cjs/migration/migrator.js +77 -43
  7. package/dist/cjs/operation-node/insert-query-node.d.ts +1 -0
  8. package/dist/cjs/operation-node/limit-node.d.ts +2 -3
  9. package/dist/cjs/operation-node/limit-node.js +1 -2
  10. package/dist/cjs/operation-node/offset-node.d.ts +2 -3
  11. package/dist/cjs/operation-node/offset-node.js +1 -2
  12. package/dist/cjs/operation-node/operation-node-transformer.js +2 -0
  13. package/dist/cjs/operation-node/select-modifier-node.d.ts +2 -1
  14. package/dist/cjs/operation-node/select-modifier-node.js +2 -1
  15. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +17 -0
  16. package/dist/cjs/query-builder/aggregate-function-builder.js +21 -0
  17. package/dist/cjs/query-builder/case-builder.d.ts +2 -2
  18. package/dist/cjs/query-builder/delete-query-builder.d.ts +5 -4
  19. package/dist/cjs/query-builder/delete-query-builder.js +4 -3
  20. package/dist/cjs/query-builder/function-module.d.ts +1 -1
  21. package/dist/cjs/query-builder/insert-query-builder.d.ts +9 -6
  22. package/dist/cjs/query-builder/insert-query-builder.js +173 -2
  23. package/dist/cjs/query-builder/json-path-builder.d.ts +2 -1
  24. package/dist/cjs/query-builder/json-path-builder.js +3 -0
  25. package/dist/cjs/query-builder/select-query-builder.d.ts +11 -9
  26. package/dist/cjs/query-builder/select-query-builder.js +12 -10
  27. package/dist/cjs/query-builder/update-query-builder.d.ts +5 -6
  28. package/dist/cjs/query-builder/update-query-builder.js +2 -2
  29. package/dist/cjs/query-compiler/default-query-compiler.js +8 -0
  30. package/dist/cjs/raw-builder/raw-builder.d.ts +11 -1
  31. package/dist/cjs/raw-builder/raw-builder.js +3 -0
  32. package/dist/cjs/raw-builder/sql.js +9 -2
  33. package/dist/cjs/util/object-utils.d.ts +1 -1
  34. package/dist/cjs/util/object-utils.js +1 -1
  35. package/dist/esm/dialect/mssql/mssql-introspector.js +8 -6
  36. package/dist/esm/expression/expression-wrapper.d.ts +13 -3
  37. package/dist/esm/expression/expression-wrapper.js +12 -0
  38. package/dist/esm/migration/migrator.d.ts +19 -2
  39. package/dist/esm/migration/migrator.js +76 -42
  40. package/dist/esm/operation-node/insert-query-node.d.ts +1 -0
  41. package/dist/esm/operation-node/limit-node.d.ts +2 -3
  42. package/dist/esm/operation-node/limit-node.js +1 -2
  43. package/dist/esm/operation-node/offset-node.d.ts +2 -3
  44. package/dist/esm/operation-node/offset-node.js +1 -2
  45. package/dist/esm/operation-node/operation-node-transformer.js +2 -0
  46. package/dist/esm/operation-node/select-modifier-node.d.ts +2 -1
  47. package/dist/esm/operation-node/select-modifier-node.js +2 -1
  48. package/dist/esm/query-builder/aggregate-function-builder.d.ts +17 -0
  49. package/dist/esm/query-builder/aggregate-function-builder.js +21 -0
  50. package/dist/esm/query-builder/case-builder.d.ts +2 -2
  51. package/dist/esm/query-builder/delete-query-builder.d.ts +5 -4
  52. package/dist/esm/query-builder/delete-query-builder.js +4 -3
  53. package/dist/esm/query-builder/function-module.d.ts +1 -1
  54. package/dist/esm/query-builder/insert-query-builder.d.ts +9 -6
  55. package/dist/esm/query-builder/insert-query-builder.js +173 -2
  56. package/dist/esm/query-builder/json-path-builder.d.ts +2 -1
  57. package/dist/esm/query-builder/json-path-builder.js +3 -0
  58. package/dist/esm/query-builder/select-query-builder.d.ts +11 -9
  59. package/dist/esm/query-builder/select-query-builder.js +13 -11
  60. package/dist/esm/query-builder/update-query-builder.d.ts +5 -6
  61. package/dist/esm/query-builder/update-query-builder.js +2 -2
  62. package/dist/esm/query-compiler/default-query-compiler.js +8 -0
  63. package/dist/esm/raw-builder/raw-builder.d.ts +11 -1
  64. package/dist/esm/raw-builder/raw-builder.js +3 -0
  65. package/dist/esm/raw-builder/sql.js +9 -2
  66. package/dist/esm/util/object-utils.d.ts +1 -1
  67. package/dist/esm/util/object-utils.js +1 -1
  68. package/package.json +5 -11
@@ -18,6 +18,166 @@ export class InsertQueryBuilder {
18
18
  constructor(props) {
19
19
  this.#props = freeze(props);
20
20
  }
21
+ /**
22
+ * Sets the values to insert for an {@link Kysely.insertInto | insert} query.
23
+ *
24
+ * This method takes an object whose keys are column names and values are
25
+ * values to insert. In addition to the column's type, the values can be
26
+ * raw {@link sql} snippets or select queries.
27
+ *
28
+ * You must provide all fields you haven't explicitly marked as nullable
29
+ * or optional using {@link Generated} or {@link ColumnType}.
30
+ *
31
+ * The return value of an `insert` query is an instance of {@link InsertResult}. The
32
+ * {@link InsertResult.insertId | insertId} field holds the auto incremented primary
33
+ * key if the database returned one.
34
+ *
35
+ * On PostgreSQL and some other dialects, you need to call `returning` to get
36
+ * something out of the query.
37
+ *
38
+ * Also see the {@link expression} method for inserting the result of a select
39
+ * query or any other expression.
40
+ *
41
+ * ### Examples
42
+ *
43
+ * <!-- siteExample("insert", "Single row", 10) -->
44
+ *
45
+ * Insert a single row:
46
+ *
47
+ * ```ts
48
+ * const result = await db
49
+ * .insertInto('person')
50
+ * .values({
51
+ * first_name: 'Jennifer',
52
+ * last_name: 'Aniston',
53
+ * age: 40
54
+ * })
55
+ * .executeTakeFirst()
56
+ *
57
+ * // `insertId` is only available on dialects that
58
+ * // automatically return the id of the inserted row
59
+ * // such as MySQL and SQLite. On PostgreSQL, for example,
60
+ * // you need to add a `returning` clause to the query to
61
+ * // get anything out. See the "returning data" example.
62
+ * console.log(result.insertId)
63
+ * ```
64
+ *
65
+ * The generated SQL (MySQL):
66
+ *
67
+ * ```sql
68
+ * insert into `person` (`first_name`, `last_name`, `age`) values (?, ?, ?)
69
+ * ```
70
+ *
71
+ * <!-- siteExample("insert", "Multiple rows", 20) -->
72
+ *
73
+ * On dialects that support it (for example PostgreSQL) you can insert multiple
74
+ * rows by providing an array. Note that the return value is once again very
75
+ * dialect-specific. Some databases may only return the id of the *last* inserted
76
+ * row and some return nothing at all unless you call `returning`.
77
+ *
78
+ * ```ts
79
+ * await db
80
+ * .insertInto('person')
81
+ * .values([{
82
+ * first_name: 'Jennifer',
83
+ * last_name: 'Aniston',
84
+ * age: 40,
85
+ * }, {
86
+ * first_name: 'Arnold',
87
+ * last_name: 'Schwarzenegger',
88
+ * age: 70,
89
+ * }])
90
+ * .execute()
91
+ * ```
92
+ *
93
+ * The generated SQL (PostgreSQL):
94
+ *
95
+ * ```sql
96
+ * insert into "person" ("first_name", "last_name", "age") values (($1, $2, $3), ($4, $5, $6))
97
+ * ```
98
+ *
99
+ * <!-- siteExample("insert", "Returning data", 30) -->
100
+ *
101
+ * On supported dialects like PostgreSQL you need to chain `returning` to the query to get
102
+ * the inserted row's columns (or any other expression) as the return value. `returning`
103
+ * works just like `select`. Refer to `select` method's examples and documentation for
104
+ * more info.
105
+ *
106
+ * ```ts
107
+ * const result = await db
108
+ * .insertInto('person')
109
+ * .values({
110
+ * first_name: 'Jennifer',
111
+ * last_name: 'Aniston',
112
+ * age: 40,
113
+ * })
114
+ * .returning(['id', 'first_name as name'])
115
+ * .executeTakeFirstOrThrow()
116
+ * ```
117
+ *
118
+ * The generated SQL (PostgreSQL):
119
+ *
120
+ * ```sql
121
+ * insert into "person" ("first_name", "last_name", "age") values ($1, $2, $3) returning "id", "first_name" as "name"
122
+ * ```
123
+ *
124
+ * <!-- siteExample("insert", "Complex values", 40) -->
125
+ *
126
+ * In addition to primitives, the values can also be arbitrary expressions.
127
+ * You can build the expressions by using a callback and calling the methods
128
+ * on the expression builder passed to it:
129
+ *
130
+ * ```ts
131
+ * import { sql } from 'kysely'
132
+ *
133
+ * const ani = "Ani"
134
+ * const ston = "ston"
135
+ *
136
+ * const result = await db
137
+ * .insertInto('person')
138
+ * .values(({ ref, selectFrom, fn }) => ({
139
+ * first_name: 'Jennifer',
140
+ * last_name: sql`concat(${ani}, ${ston})`,
141
+ * middle_name: ref('first_name'),
142
+ * age: selectFrom('person')
143
+ * .select(fn.avg<number>('age')
144
+ * .as('avg_age')),
145
+ * }))
146
+ * .executeTakeFirst()
147
+ * ```
148
+ *
149
+ * The generated SQL (PostgreSQL):
150
+ *
151
+ * ```sql
152
+ * insert into "person" (
153
+ * "first_name",
154
+ * "last_name",
155
+ * "middle_name",
156
+ * "age"
157
+ * )
158
+ * values (
159
+ * $1,
160
+ * concat($2, $3),
161
+ * "first_name",
162
+ * (select avg("age") as "avg_age" from "person")
163
+ * )
164
+ * ```
165
+ *
166
+ * You can also use the callback version of subqueries or raw expressions:
167
+ *
168
+ * ```ts
169
+ * db.with('jennifer', (db) => db
170
+ * .selectFrom('person')
171
+ * .where('first_name', '=', 'Jennifer')
172
+ * .select(['id', 'first_name', 'gender'])
173
+ * .limit(1)
174
+ * ).insertInto('pet').values((eb) => ({
175
+ * owner_id: eb.selectFrom('jennifer').select('id'),
176
+ * name: eb.selectFrom('jennifer').select('first_name'),
177
+ * species: 'cat',
178
+ * }))
179
+ * ```
180
+ */
21
181
  values(insert) {
22
182
  const [columns, values] = parseInsertExpression(insert);
23
183
  return new InsertQueryBuilder({
@@ -96,6 +256,17 @@ export class InsertQueryBuilder {
96
256
  }),
97
257
  });
98
258
  }
259
+ /**
260
+ * Creates an `insert into "person" default values` query.
261
+ */
262
+ defaultValues() {
263
+ return new InsertQueryBuilder({
264
+ ...this.#props,
265
+ queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
266
+ defaultValues: true,
267
+ }),
268
+ });
269
+ }
99
270
  /**
100
271
  * Changes an `insert into` query to an `insert ignore into` query.
101
272
  *
@@ -396,8 +567,8 @@ export class InsertQueryBuilder {
396
567
  /**
397
568
  * Change the output type of the query.
398
569
  *
399
- * You should only use this method as the last resort if the types
400
- * don't support your use case.
570
+ * This method call doesn't change the SQL in any way. This methods simply
571
+ * returns a copy of this `InsertQueryBuilder` with a new output type.
401
572
  */
402
573
  $castTo() {
403
574
  return new InsertQueryBuilder(this.#props);
@@ -232,7 +232,8 @@ export declare class TraversedJSONPathBuilder<S, O> extends JSONPathBuilder<S, O
232
232
  * This method call doesn't change the SQL in any way. This methods simply
233
233
  * returns a copy of this `JSONPathBuilder` with a new output type.
234
234
  */
235
- $castTo<T>(): JSONPathBuilder<T>;
235
+ $castTo<C>(): JSONPathBuilder<C>;
236
+ $notNull(): JSONPathBuilder<Exclude<O, null>>;
236
237
  /**
237
238
  * Creates the OperationNode that describes how to compile this expression into SQL.
238
239
  *
@@ -162,6 +162,9 @@ export class TraversedJSONPathBuilder extends JSONPathBuilder {
162
162
  $castTo() {
163
163
  return new JSONPathBuilder(this.#node);
164
164
  }
165
+ $notNull() {
166
+ return new JSONPathBuilder(this.#node);
167
+ }
165
168
  toOperationNode() {
166
169
  return this.#node;
167
170
  }
@@ -25,6 +25,7 @@ import { Streamable } from '../util/streamable.js';
25
25
  import { ExpressionOrFactory } from '../parser/expression-parser.js';
26
26
  import { ExpressionWrapper } from '../expression/expression-wrapper.js';
27
27
  import { SelectQueryBuilderExpression } from './select-query-builder-expression.js';
28
+ import { ValueExpression } from '../parser/value-parser.js';
28
29
  export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInterface<DB, TB>, HavingInterface<DB, TB>, SelectQueryBuilderExpression<O>, Compilable<O>, Explainable, Streamable<O> {
29
30
  /**
30
31
  * Adds a `where` expression to the query.
@@ -674,19 +675,19 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
674
675
  /**
675
676
  * Adds the `for update` modifier to a select query on supported databases.
676
677
  */
677
- forUpdate(): SelectQueryBuilder<DB, TB, O>;
678
+ forUpdate(of?: TableOrList<TB>): SelectQueryBuilder<DB, TB, O>;
678
679
  /**
679
680
  * Adds the `for share` modifier to a select query on supported databases.
680
681
  */
681
- forShare(): SelectQueryBuilder<DB, TB, O>;
682
+ forShare(of?: TableOrList<TB>): SelectQueryBuilder<DB, TB, O>;
682
683
  /**
683
684
  * Adds the `for key share` modifier to a select query on supported databases.
684
685
  */
685
- forKeyShare(): SelectQueryBuilder<DB, TB, O>;
686
+ forKeyShare(of?: TableOrList<TB>): SelectQueryBuilder<DB, TB, O>;
686
687
  /**
687
688
  * Adds the `for no key update` modifier to a select query on supported databases.
688
689
  */
689
- forNoKeyUpdate(): SelectQueryBuilder<DB, TB, O>;
690
+ forNoKeyUpdate(of?: TableOrList<TB>): SelectQueryBuilder<DB, TB, O>;
690
691
  /**
691
692
  * Adds the `skip locked` modifier to a select query on supported databases.
692
693
  */
@@ -1161,7 +1162,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1161
1162
  * .limit(10)
1162
1163
  * ```
1163
1164
  */
1164
- limit(limit: number): SelectQueryBuilder<DB, TB, O>;
1165
+ limit(limit: ValueExpression<DB, TB, number>): SelectQueryBuilder<DB, TB, O>;
1165
1166
  /**
1166
1167
  * Adds an offset clause to the query.
1167
1168
  *
@@ -1177,7 +1178,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1177
1178
  * .limit(10)
1178
1179
  * ```
1179
1180
  */
1180
- offset(offset: number): SelectQueryBuilder<DB, TB, O>;
1181
+ offset(offset: ValueExpression<DB, TB, number>): SelectQueryBuilder<DB, TB, O>;
1181
1182
  /**
1182
1183
  * Combines another select query or raw expression to this query using `union`.
1183
1184
  *
@@ -1549,10 +1550,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
1549
1550
  /**
1550
1551
  * Change the output type of the query.
1551
1552
  *
1552
- * You should only use this method as the last resort if the types
1553
- * don't support your use case.
1553
+ * This method call doesn't change the SQL in any way. This methods simply
1554
+ * returns a copy of this `SelectQueryBuilder` with a new output type.
1554
1555
  */
1555
- $castTo<T>(): SelectQueryBuilder<DB, TB, T>;
1556
+ $castTo<C>(): SelectQueryBuilder<DB, TB, C>;
1556
1557
  /**
1557
1558
  * Changes the output type from an object to a tuple.
1558
1559
  *
@@ -1831,4 +1832,5 @@ type OuterJoinedBuilder<DB, TB extends keyof DB, O, A extends keyof any, R> = Se
1831
1832
  type OuterJoinedBuilderDB<DB, TB extends keyof DB, A extends keyof any, R> = DrainOuterGeneric<{
1832
1833
  [C in keyof DB | A]: C extends A ? Nullable<R> : C extends TB ? Nullable<DB[C]> : C extends keyof DB ? DB[C] : never;
1833
1834
  }>;
1835
+ type TableOrList<TB extends keyof any> = (TB & string) | ReadonlyArray<TB & string>;
1834
1836
  export {};
@@ -2,6 +2,7 @@
2
2
  import { AliasNode } from '../operation-node/alias-node.js';
3
3
  import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
4
4
  import { parseJoin, } from '../parser/join-parser.js';
5
+ import { parseTable } from '../parser/table-parser.js';
5
6
  import { parseSelectArg, parseSelectAll, } from '../parser/select-parser.js';
6
7
  import { parseReferenceExpressionOrList, } from '../parser/reference-parser.js';
7
8
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
@@ -10,13 +11,14 @@ import { parseOrderBy, } from '../parser/order-by-parser.js';
10
11
  import { preventAwait } from '../util/prevent-await.js';
11
12
  import { LimitNode } from '../operation-node/limit-node.js';
12
13
  import { OffsetNode } from '../operation-node/offset-node.js';
13
- import { freeze } from '../util/object-utils.js';
14
+ import { asArray, freeze } from '../util/object-utils.js';
14
15
  import { parseGroupBy } from '../parser/group-by-parser.js';
15
16
  import { isNoResultErrorConstructor, NoResultError, } from './no-result-error.js';
16
17
  import { IdentifierNode } from '../operation-node/identifier-node.js';
17
18
  import { parseSetOperations, } from '../parser/set-operation-parser.js';
18
19
  import { parseValueBinaryOperationOrExpression, parseReferentialBinaryOperation, } from '../parser/binary-operation-parser.js';
19
20
  import { ExpressionWrapper } from '../expression/expression-wrapper.js';
21
+ import { parseValueExpression, } from '../parser/value-parser.js';
20
22
  class SelectQueryBuilderImpl {
21
23
  #props;
22
24
  constructor(props) {
@@ -82,28 +84,28 @@ class SelectQueryBuilderImpl {
82
84
  queryNode: SelectQueryNode.cloneWithFrontModifier(this.#props.queryNode, SelectModifierNode.create('Distinct')),
83
85
  });
84
86
  }
85
- forUpdate() {
87
+ forUpdate(of) {
86
88
  return new SelectQueryBuilderImpl({
87
89
  ...this.#props,
88
- queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForUpdate')),
90
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForUpdate', of ? asArray(of).map(parseTable) : undefined)),
89
91
  });
90
92
  }
91
- forShare() {
93
+ forShare(of) {
92
94
  return new SelectQueryBuilderImpl({
93
95
  ...this.#props,
94
- queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForShare')),
96
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForShare', of ? asArray(of).map(parseTable) : undefined)),
95
97
  });
96
98
  }
97
- forKeyShare() {
99
+ forKeyShare(of) {
98
100
  return new SelectQueryBuilderImpl({
99
101
  ...this.#props,
100
- queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForKeyShare')),
102
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForKeyShare', of ? asArray(of).map(parseTable) : undefined)),
101
103
  });
102
104
  }
103
- forNoKeyUpdate() {
105
+ forNoKeyUpdate(of) {
104
106
  return new SelectQueryBuilderImpl({
105
107
  ...this.#props,
106
- queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForNoKeyUpdate')),
108
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForNoKeyUpdate', of ? asArray(of).map(parseTable) : undefined)),
107
109
  });
108
110
  }
109
111
  skipLocked() {
@@ -175,13 +177,13 @@ class SelectQueryBuilderImpl {
175
177
  limit(limit) {
176
178
  return new SelectQueryBuilderImpl({
177
179
  ...this.#props,
178
- queryNode: SelectQueryNode.cloneWithLimit(this.#props.queryNode, LimitNode.create(limit)),
180
+ queryNode: SelectQueryNode.cloneWithLimit(this.#props.queryNode, LimitNode.create(parseValueExpression(limit))),
179
181
  });
180
182
  }
181
183
  offset(offset) {
182
184
  return new SelectQueryBuilderImpl({
183
185
  ...this.#props,
184
- queryNode: SelectQueryNode.cloneWithOffset(this.#props.queryNode, OffsetNode.create(offset)),
186
+ queryNode: SelectQueryNode.cloneWithOffset(this.#props.queryNode, OffsetNode.create(parseValueExpression(offset))),
185
187
  });
186
188
  }
187
189
  union(expression) {
@@ -8,7 +8,7 @@ import { ReferenceExpression } from '../parser/reference-parser.js';
8
8
  import { QueryNode } from '../operation-node/query-node.js';
9
9
  import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, SimplifyResult, SimplifySingleResult, SqlBool } from '../util/type-utils.js';
10
10
  import { UpdateQueryNode } from '../operation-node/update-query-node.js';
11
- import { UpdateObject, UpdateObjectFactory, ExtractUpdateTypeFromReferenceExpression } from '../parser/update-set-parser.js';
11
+ import { UpdateObjectExpression, ExtractUpdateTypeFromReferenceExpression } from '../parser/update-set-parser.js';
12
12
  import { Compilable } from '../util/compilable.js';
13
13
  import { QueryExecutor } from '../query-executor/query-executor.js';
14
14
  import { QueryId } from '../util/query-id.js';
@@ -695,8 +695,7 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
695
695
  * where "id" = $5
696
696
  * ```
697
697
  */
698
- set(update: UpdateObject<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
699
- set(update: UpdateObjectFactory<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
698
+ set(update: UpdateObjectExpression<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
700
699
  set<RE extends ReferenceExpression<DB, UT>>(key: RE, value: ValueExpression<DB, TB, ExtractUpdateTypeFromReferenceExpression<DB, UT, RE>>): UpdateQueryBuilder<DB, UT, TB, O>;
701
700
  /**
702
701
  * Allows you to return data from modified rows.
@@ -829,10 +828,10 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
829
828
  /**
830
829
  * Change the output type of the query.
831
830
  *
832
- * You should only use this method as the last resort if the types
833
- * don't support your use case.
831
+ * This method call doesn't change the SQL in any way. This methods simply
832
+ * returns a copy of this `UpdateQueryBuilder` with a new output type.
834
833
  */
835
- $castTo<T>(): UpdateQueryBuilder<DB, UT, TB, T>;
834
+ $castTo<C>(): UpdateQueryBuilder<DB, UT, TB, C>;
836
835
  /**
837
836
  * Narrows (parts of) the output type of the query.
838
837
  *
@@ -154,8 +154,8 @@ export class UpdateQueryBuilder {
154
154
  /**
155
155
  * Change the output type of the query.
156
156
  *
157
- * You should only use this method as the last resort if the types
158
- * don't support your use case.
157
+ * This method call doesn't change the SQL in any way. This methods simply
158
+ * returns a copy of this `UpdateQueryBuilder` with a new output type.
159
159
  */
160
160
  $castTo() {
161
161
  return new UpdateQueryBuilder(this.#props);
@@ -162,6 +162,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
162
162
  this.append(' ');
163
163
  this.visitNode(node.values);
164
164
  }
165
+ if (node.defaultValues) {
166
+ this.append(' ');
167
+ this.append('default values');
168
+ }
165
169
  if (node.onConflict) {
166
170
  this.append(' ');
167
171
  this.visitNode(node.onConflict);
@@ -867,6 +871,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
867
871
  else {
868
872
  this.append(SELECT_MODIFIER_SQL[node.modifier]);
869
873
  }
874
+ if (node.of) {
875
+ this.append(' of ');
876
+ this.compileList(node.of, ', ');
877
+ }
870
878
  }
871
879
  visitCreateType(node) {
872
880
  this.append('create type ');
@@ -130,7 +130,17 @@ export interface RawBuilder<O> extends AliasableExpression<O> {
130
130
  * This method call doesn't change the SQL in any way. This methods simply
131
131
  * returns a copy of this `RawBuilder` with a new output type.
132
132
  */
133
- $castTo<T>(): RawBuilder<T>;
133
+ $castTo<C>(): RawBuilder<C>;
134
+ /**
135
+ * Omit null from the expression's type.
136
+ *
137
+ * This function can be useful in cases where you know an expression can't be
138
+ * null, but Kysely is unable to infer it.
139
+ *
140
+ * This method call doesn't change the SQL in any way. This methods simply
141
+ * returns a copy of `this` with a new output type.
142
+ */
143
+ $notNull(): RawBuilder<Exclude<O, null>>;
134
144
  /**
135
145
  * Adds a plugin for this SQL snippet.
136
146
  */
@@ -22,6 +22,9 @@ class RawBuilderImpl {
22
22
  $castTo() {
23
23
  return new RawBuilderImpl({ ...this.#props });
24
24
  }
25
+ $notNull() {
26
+ return new RawBuilderImpl(this.#props);
27
+ }
25
28
  withPlugin(plugin) {
26
29
  return new RawBuilderImpl({
27
30
  ...this.#props,
@@ -1,5 +1,6 @@
1
1
  /// <reference types="./sql.d.ts" />
2
2
  import { IdentifierNode } from '../operation-node/identifier-node.js';
3
+ import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
3
4
  import { RawNode } from '../operation-node/raw-node.js';
4
5
  import { ValueNode } from '../operation-node/value-node.js';
5
6
  import { parseStringReference } from '../parser/reference-parser.js';
@@ -10,7 +11,7 @@ import { createRawBuilder } from './raw-builder.js';
10
11
  export const sql = Object.assign((sqlFragments, ...parameters) => {
11
12
  return createRawBuilder({
12
13
  queryId: createQueryId(),
13
- rawNode: RawNode.create(sqlFragments, parameters?.map(parseValueExpression) ?? []),
14
+ rawNode: RawNode.create(sqlFragments, parameters?.map(parseParameter) ?? []),
14
15
  });
15
16
  }, {
16
17
  ref(columnReference) {
@@ -62,7 +63,7 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
62
63
  const nodes = new Array(2 * array.length - 1);
63
64
  const sep = separator.toOperationNode();
64
65
  for (let i = 0; i < array.length; ++i) {
65
- nodes[2 * i] = parseValueExpression(array[i]);
66
+ nodes[2 * i] = parseParameter(array[i]);
66
67
  if (i !== array.length - 1) {
67
68
  nodes[2 * i + 1] = sep;
68
69
  }
@@ -73,3 +74,9 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
73
74
  });
74
75
  },
75
76
  });
77
+ function parseParameter(param) {
78
+ if (isOperationNodeSource(param)) {
79
+ return param.toOperationNode();
80
+ }
81
+ return parseValueExpression(param);
82
+ }
@@ -16,7 +16,7 @@ export declare function isArrayBufferOrView(obj: unknown): obj is ArrayBuffer |
16
16
  export declare function isPlainObject(obj: unknown): obj is Record<string, unknown>;
17
17
  export declare function getLast<T>(arr: ArrayLike<T>): T | undefined;
18
18
  export declare function freeze<T>(obj: T): Readonly<T>;
19
- export declare function asArray<T>(arg: T | T[]): T[];
19
+ export declare function asArray<T>(arg: T | ReadonlyArray<T>): ReadonlyArray<T>;
20
20
  export declare function asReadonlyArray<T>(arg: T | ReadonlyArray<T>): ReadonlyArray<T>;
21
21
  export declare function isReadonlyArray(arg: unknown): arg is ReadonlyArray<unknown>;
22
22
  export declare function noop<T>(obj: T): T;
@@ -57,7 +57,7 @@ export function freeze(obj) {
57
57
  return Object.freeze(obj);
58
58
  }
59
59
  export function asArray(arg) {
60
- if (Array.isArray(arg)) {
60
+ if (isReadonlyArray(arg)) {
61
61
  return arg;
62
62
  }
63
63
  else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.27.0",
3
+ "version": "0.27.2",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,14 +40,10 @@
40
40
  },
41
41
  "scripts": {
42
42
  "clean": "rm -rf dist & rm -rf test/node/dist & rm -rf test/browser/bundle.js & rm -rf helpers",
43
- "test": "npm run build && npm run test:node:build && concurrently -n node,typings,esmimports \"npm run test:node\" \"npm run test:typings\" \"npm run test:esmimports\"",
43
+ "test": "npm run build && npm run test:node:build && npm run test:node:run && npm run test:typings && npm run test:esmimports",
44
44
  "test:node:build": "tsc -p test/node",
45
- "test:node": "concurrently -n postgres,mysql,mssql,sqlite \"npm run test:node:postgres\" \"npm run test:node:mysql\" \"npm run test:node:mssql\" \"npm run test:node:sqlite\"",
46
- "test:node:postgres": "cross-env DIALECT=postgres npm run test:node:run",
47
- "test:node:mysql": "cross-env DIALECT=mysql npm run test:node:run",
48
- "test:node:mssql": "cross-env DIALECT=mssql npm run test:node:run",
49
- "test:node:sqlite": "cross-env DIALECT=sqlite npm run test:node:run",
50
- "test:node:run": "mocha --reporter min --timeout 15000 test/node/dist/**/*.test.js",
45
+ "test:node": "npm run build && npm run test:node:build && npm run test:node:run",
46
+ "test:node:run": "mocha --timeout 15000 test/node/dist/**/*.test.js",
51
47
  "test:browser:build": "rm -rf test/browser/bundle.js && esbuild test/browser/main.ts --bundle --outfile=test/browser/bundle.js",
52
48
  "test:browser": "npm run build && npm run test:browser:build && node test/browser/test.js",
53
49
  "test:bun": "npm run build && cd test/bun && bun install && bun run test",
@@ -57,7 +53,7 @@
57
53
  "test:esmimports": "node scripts/check-esm-imports.js",
58
54
  "test:esbuild": "esbuild --bundle --platform=node --external:pg-native dist/esm/index.js --outfile=/dev/null",
59
55
  "prettier": "prettier --write 'src/**/*.ts' 'test/**/*.ts'",
60
- "build": "npm run clean && concurrently -n esm,cjs \"npm run build:esm\" \"npm run build:cjs\" && concurrently -n modulefix,docfix \"npm run script:module-fixup\" \"npm run script:copy-interface-doc\"",
56
+ "build": "npm run clean && npm run build:esm && npm run build:cjs && npm run script:module-fixup && npm run script:copy-interface-doc",
61
57
  "build:esm": "tsc -p tsconfig.json && npm run script:add-deno-type-references",
62
58
  "build:cjs": "tsc -p tsconfig-cjs.json",
63
59
  "script:module-fixup": "node scripts/module-fixup.js",
@@ -87,8 +83,6 @@
87
83
  "chai": "^4.3.7",
88
84
  "chai-as-promised": "^7.1.1",
89
85
  "chai-subset": "^1.6.0",
90
- "concurrently": "^8.1.0",
91
- "cross-env": "^7.0.3",
92
86
  "esbuild": "^0.17.19",
93
87
  "mocha": "^10.2.0",
94
88
  "mysql2": "^3.3.3",