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.
- package/dist/cjs/dialect/sqlite/sqlite-adapter.js +6 -2
- package/dist/cjs/parser/insert-values-parser.d.ts +6 -5
- package/dist/cjs/parser/insert-values-parser.js +11 -5
- package/dist/cjs/query-builder/query-builder.d.ts +17 -0
- package/dist/cjs/query-builder/query-builder.js +1 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.js +6 -2
- package/dist/esm/parser/insert-values-parser.d.ts +6 -5
- package/dist/esm/parser/insert-values-parser.js +12 -6
- package/dist/esm/query-builder/query-builder.d.ts +17 -0
- package/dist/esm/query-builder/query-builder.js +1 -1
- package/package.json +1 -1
|
@@ -9,10 +9,14 @@ class SqliteAdapter {
|
|
|
9
9
|
return false;
|
|
10
10
|
}
|
|
11
11
|
async acquireMigrationLock() {
|
|
12
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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, {
|