kysely 0.11.3 → 0.11.4

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.
@@ -9,10 +9,14 @@ class SqliteAdapter {
9
9
  return false;
10
10
  }
11
11
  async acquireMigrationLock() {
12
- // Nothing to do here.
12
+ // SQLite only has one connection that's reserved by the migration system
13
+ // for the whole time between acquireMigrationLock and releaseMigrationLock.
14
+ // We don't need to do anything here.
13
15
  }
14
16
  async releaseMigrationLock() {
15
- // Nothing to do here.
17
+ // SQLite only has one connection that's reserved by the migration system
18
+ // for the whole time between acquireMigrationLock and releaseMigrationLock.
19
+ // We don't need to do anything here.
16
20
  }
17
21
  }
18
22
  exports.SqliteAdapter = SqliteAdapter;
@@ -3,13 +3,14 @@ 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 '../util/type-utils.js';
6
+ import { AnyQueryBuilder, AnyRawBuilder, GeneratedPlaceholder, QueryBuilderFactory, RawBuilderFactory } from '../util/type-utils.js';
7
7
  import { PrimitiveValue } from '../util/object-utils.js';
8
+ import { ParseContext } from './parse-context.js';
8
9
  export declare type InsertObject<DB, TB extends keyof DB> = {
9
- [C in keyof DB[TB]]: InsertValueExpression<DB[TB][C]>;
10
+ [C in keyof DB[TB]]: InsertValueExpression<DB, TB, DB[TB][C]>;
10
11
  };
11
12
  export declare type InsertObjectOrList<DB, TB extends keyof DB> = InsertObject<DB, TB> | ReadonlyArray<InsertObject<DB, TB>>;
12
- declare type InsertValueExpression<T> = T | AnyQueryBuilder | AnyRawBuilder | GeneratedPlaceholder;
13
- export declare function parseInsertObjectOrList(args: InsertObjectOrList<any, any>): [ReadonlyArray<ColumnNode>, ReadonlyArray<InsertValuesNode>];
14
- export declare function parseInsertValueExpression(value: InsertValueExpression<PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
13
+ declare type InsertValueExpression<DB, TB extends keyof DB, T> = T | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB> | GeneratedPlaceholder;
14
+ export declare function parseInsertObjectOrList(ctx: ParseContext, args: InsertObjectOrList<any, any>): [ReadonlyArray<ColumnNode>, ReadonlyArray<InsertValuesNode>];
15
+ export declare function parseInsertValueExpression(ctx: ParseContext, value: InsertValueExpression<any, any, PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
15
16
  export {};
@@ -9,11 +9,11 @@ const value_list_node_js_1 = require("../operation-node/value-list-node.js");
9
9
  const value_node_js_1 = require("../operation-node/value-node.js");
10
10
  const generated_placeholder_js_1 = require("../util/generated-placeholder.js");
11
11
  const object_utils_js_1 = require("../util/object-utils.js");
12
- function parseInsertObjectOrList(args) {
13
- return parseInsertColumnsAndValues(Array.isArray(args) ? args : [args]);
12
+ function parseInsertObjectOrList(ctx, args) {
13
+ return parseInsertColumnsAndValues(ctx, Array.isArray(args) ? args : [args]);
14
14
  }
15
15
  exports.parseInsertObjectOrList = parseInsertObjectOrList;
16
- function parseInsertColumnsAndValues(rows) {
16
+ function parseInsertColumnsAndValues(ctx, rows) {
17
17
  const columns = [];
18
18
  const values = [];
19
19
  for (const row of rows) {
@@ -36,12 +36,12 @@ function parseInsertColumnsAndValues(rows) {
36
36
  values.push(primitive_value_list_node_js_1.PrimitiveValueListNode.create(rowValues));
37
37
  }
38
38
  else {
39
- values.push(value_list_node_js_1.ValueListNode.create(rowValues.map(parseInsertValueExpression)));
39
+ values.push(value_list_node_js_1.ValueListNode.create(rowValues.map((it) => parseInsertValueExpression(ctx, it))));
40
40
  }
41
41
  }
42
42
  return [columns.map(column_node_js_1.ColumnNode.create), values];
43
43
  }
44
- function parseInsertValueExpression(value) {
44
+ function parseInsertValueExpression(ctx, value) {
45
45
  if ((0, object_utils_js_1.isPrimitive)(value)) {
46
46
  return value_node_js_1.ValueNode.create(value);
47
47
  }
@@ -51,6 +51,12 @@ function parseInsertValueExpression(value) {
51
51
  return node;
52
52
  }
53
53
  }
54
+ else if ((0, object_utils_js_1.isFunction)(value)) {
55
+ const node = value(ctx.createExpressionBuilder()).toOperationNode();
56
+ if (!query_node_js_1.QueryNode.isMutating(node)) {
57
+ return node;
58
+ }
59
+ }
54
60
  throw new Error(`unsupported value for insert object ${JSON.stringify(value)}`);
55
61
  }
56
62
  exports.parseInsertValueExpression = parseInsertValueExpression;
@@ -1002,6 +1002,23 @@ export declare class QueryBuilder<DB, TB extends keyof DB, O = {}> implements Op
1002
1002
  * insert into "person" ("first_name", "last_name", "age")
1003
1003
  * values ($1, $2 || $3, (select avg(age) from "person"))
1004
1004
  * ```
1005
+ *
1006
+ * @example
1007
+ * You can also use the callback version of subqueries or raw expressions:
1008
+ *
1009
+ * ```ts
1010
+ * db.with('jennifer', (db) => db
1011
+ * .selectFrom('person')
1012
+ * .where('first_name', '=', 'Jennifer')
1013
+ * .select(['id', 'first_name', 'gender'])
1014
+ * .limit(1)
1015
+ * ).insertInto('pet').values({
1016
+ * id: db.generated,
1017
+ * owner_id: (eb) => eb.subQuery('jennifer').select('id'),
1018
+ * name: (eb) => eb.subQuery('jennifer').select('first_name'),
1019
+ * species: 'cat',
1020
+ * })
1021
+ * ```
1005
1022
  */
1006
1023
  values(row: InsertObject<DB, TB>): QueryBuilder<DB, TB, O>;
1007
1024
  values(row: ReadonlyArray<InsertObject<DB, TB>>): QueryBuilder<DB, TB, O>;
@@ -440,7 +440,7 @@ class QueryBuilder {
440
440
  }
441
441
  values(args) {
442
442
  assertCanHaveInsertValues(this.#props.queryNode);
443
- const [columns, values] = (0, insert_values_parser_js_1.parseInsertObjectOrList)(args);
443
+ const [columns, values] = (0, insert_values_parser_js_1.parseInsertObjectOrList)(this.#props.parseContext, args);
444
444
  return new QueryBuilder({
445
445
  ...this.#props,
446
446
  queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
@@ -6,9 +6,13 @@ export class SqliteAdapter {
6
6
  return false;
7
7
  }
8
8
  async acquireMigrationLock() {
9
- // Nothing to do here.
9
+ // SQLite only has one connection that's reserved by the migration system
10
+ // for the whole time between acquireMigrationLock and releaseMigrationLock.
11
+ // We don't need to do anything here.
10
12
  }
11
13
  async releaseMigrationLock() {
12
- // Nothing to do here.
14
+ // SQLite only has one connection that's reserved by the migration system
15
+ // for the whole time between acquireMigrationLock and releaseMigrationLock.
16
+ // We don't need to do anything here.
13
17
  }
14
18
  }
@@ -3,13 +3,14 @@ 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 '../util/type-utils.js';
6
+ import { AnyQueryBuilder, AnyRawBuilder, GeneratedPlaceholder, QueryBuilderFactory, RawBuilderFactory } from '../util/type-utils.js';
7
7
  import { PrimitiveValue } from '../util/object-utils.js';
8
+ import { ParseContext } from './parse-context.js';
8
9
  export declare type InsertObject<DB, TB extends keyof DB> = {
9
- [C in keyof DB[TB]]: InsertValueExpression<DB[TB][C]>;
10
+ [C in keyof DB[TB]]: InsertValueExpression<DB, TB, DB[TB][C]>;
10
11
  };
11
12
  export declare type InsertObjectOrList<DB, TB extends keyof DB> = InsertObject<DB, TB> | ReadonlyArray<InsertObject<DB, TB>>;
12
- declare type InsertValueExpression<T> = T | AnyQueryBuilder | AnyRawBuilder | GeneratedPlaceholder;
13
- export declare function parseInsertObjectOrList(args: InsertObjectOrList<any, any>): [ReadonlyArray<ColumnNode>, ReadonlyArray<InsertValuesNode>];
14
- export declare function parseInsertValueExpression(value: InsertValueExpression<PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
13
+ declare type InsertValueExpression<DB, TB extends keyof DB, T> = T | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB> | GeneratedPlaceholder;
14
+ export declare function parseInsertObjectOrList(ctx: ParseContext, args: InsertObjectOrList<any, any>): [ReadonlyArray<ColumnNode>, ReadonlyArray<InsertValuesNode>];
15
+ export declare function parseInsertValueExpression(ctx: ParseContext, value: InsertValueExpression<any, any, PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
15
16
  export {};
@@ -5,11 +5,11 @@ import { QueryNode } from '../operation-node/query-node.js';
5
5
  import { ValueListNode } from '../operation-node/value-list-node.js';
6
6
  import { ValueNode } from '../operation-node/value-node.js';
7
7
  import { isGeneratedPlaceholder } from '../util/generated-placeholder.js';
8
- import { isPrimitive } from '../util/object-utils.js';
9
- export function parseInsertObjectOrList(args) {
10
- return parseInsertColumnsAndValues(Array.isArray(args) ? args : [args]);
8
+ import { isFunction, isPrimitive, } from '../util/object-utils.js';
9
+ export function parseInsertObjectOrList(ctx, args) {
10
+ return parseInsertColumnsAndValues(ctx, Array.isArray(args) ? args : [args]);
11
11
  }
12
- function parseInsertColumnsAndValues(rows) {
12
+ function parseInsertColumnsAndValues(ctx, rows) {
13
13
  const columns = [];
14
14
  const values = [];
15
15
  for (const row of rows) {
@@ -32,12 +32,12 @@ function parseInsertColumnsAndValues(rows) {
32
32
  values.push(PrimitiveValueListNode.create(rowValues));
33
33
  }
34
34
  else {
35
- values.push(ValueListNode.create(rowValues.map(parseInsertValueExpression)));
35
+ values.push(ValueListNode.create(rowValues.map((it) => parseInsertValueExpression(ctx, it))));
36
36
  }
37
37
  }
38
38
  return [columns.map(ColumnNode.create), values];
39
39
  }
40
- export function parseInsertValueExpression(value) {
40
+ export function parseInsertValueExpression(ctx, value) {
41
41
  if (isPrimitive(value)) {
42
42
  return ValueNode.create(value);
43
43
  }
@@ -47,5 +47,11 @@ export function parseInsertValueExpression(value) {
47
47
  return node;
48
48
  }
49
49
  }
50
+ else if (isFunction(value)) {
51
+ const node = value(ctx.createExpressionBuilder()).toOperationNode();
52
+ if (!QueryNode.isMutating(node)) {
53
+ return node;
54
+ }
55
+ }
50
56
  throw new Error(`unsupported value for insert object ${JSON.stringify(value)}`);
51
57
  }
@@ -1002,6 +1002,23 @@ export declare class QueryBuilder<DB, TB extends keyof DB, O = {}> implements Op
1002
1002
  * insert into "person" ("first_name", "last_name", "age")
1003
1003
  * values ($1, $2 || $3, (select avg(age) from "person"))
1004
1004
  * ```
1005
+ *
1006
+ * @example
1007
+ * You can also use the callback version of subqueries or raw expressions:
1008
+ *
1009
+ * ```ts
1010
+ * db.with('jennifer', (db) => db
1011
+ * .selectFrom('person')
1012
+ * .where('first_name', '=', 'Jennifer')
1013
+ * .select(['id', 'first_name', 'gender'])
1014
+ * .limit(1)
1015
+ * ).insertInto('pet').values({
1016
+ * id: db.generated,
1017
+ * owner_id: (eb) => eb.subQuery('jennifer').select('id'),
1018
+ * name: (eb) => eb.subQuery('jennifer').select('first_name'),
1019
+ * species: 'cat',
1020
+ * })
1021
+ * ```
1005
1022
  */
1006
1023
  values(row: InsertObject<DB, TB>): QueryBuilder<DB, TB, O>;
1007
1024
  values(row: ReadonlyArray<InsertObject<DB, TB>>): QueryBuilder<DB, TB, O>;
@@ -437,7 +437,7 @@ export class QueryBuilder {
437
437
  }
438
438
  values(args) {
439
439
  assertCanHaveInsertValues(this.#props.queryNode);
440
- const [columns, values] = parseInsertObjectOrList(args);
440
+ const [columns, values] = parseInsertObjectOrList(this.#props.parseContext, args);
441
441
  return new QueryBuilder({
442
442
  ...this.#props,
443
443
  queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.11.3",
3
+ "version": "0.11.4",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",