kysely 0.9.1 → 0.9.5
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/mysql/mysql-dialect.d.ts +11 -0
- package/dist/cjs/dialect/mysql/mysql-dialect.js +7 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +13 -1
- package/dist/cjs/dialect/postgres/postgres-dialect.js +10 -0
- package/dist/cjs/dialect/postgres/postgres-driver.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-query-compiler.js +1 -1
- package/dist/cjs/driver/runtime-driver.d.ts +3 -2
- package/dist/cjs/driver/runtime-driver.js +57 -4
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/kysely.d.ts +31 -9
- package/dist/cjs/kysely.js +25 -9
- package/dist/cjs/migration/migration.d.ts +32 -0
- package/dist/cjs/operation-node/join-node.d.ts +2 -1
- package/dist/cjs/operation-node/join-node.js +8 -6
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +9 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +61 -59
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -316
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/query-node.d.ts +4 -3
- package/dist/cjs/operation-node/query-node.js +10 -2
- package/dist/cjs/operation-node/select-query-node.d.ts +5 -1
- package/dist/cjs/operation-node/select-query-node.js +18 -2
- package/dist/cjs/operation-node/union-node.d.ts +16 -0
- package/dist/cjs/operation-node/union-node.js +19 -0
- package/dist/cjs/parser/group-by-parser.d.ts +4 -0
- package/dist/cjs/parser/group-by-parser.js +9 -0
- package/dist/cjs/parser/insert-values-parser.d.ts +1 -1
- package/dist/cjs/parser/join-parser.d.ts +4 -4
- package/dist/cjs/parser/order-by-parser.d.ts +2 -4
- package/dist/cjs/parser/order-by-parser.js +6 -3
- package/dist/cjs/parser/reference-parser.d.ts +1 -1
- package/dist/cjs/parser/reference-parser.js +1 -1
- package/dist/cjs/parser/union-parser.d.ts +5 -0
- package/dist/cjs/parser/union-parser.js +13 -0
- package/dist/cjs/parser/value-parser.d.ts +1 -1
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +5 -116
- package/dist/cjs/plugin/camel-case/camel-case-transformer.d.ts +8 -0
- package/dist/cjs/plugin/camel-case/camel-case-transformer.js +19 -0
- package/dist/cjs/plugin/camel-case/camel-case.d.ts +15 -0
- package/dist/cjs/plugin/camel-case/camel-case.js +109 -0
- package/dist/cjs/plugin/kysely-plugin.d.ts +1 -1
- package/dist/cjs/query-builder/join-builder.js +8 -8
- package/dist/cjs/query-builder/query-builder.d.ts +65 -1
- package/dist/cjs/query-builder/query-builder.js +103 -22
- package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +7 -2
- package/dist/cjs/query-compiler/default-query-compiler.js +20 -3
- package/dist/cjs/query-executor/default-query-executor.d.ts +1 -0
- package/dist/cjs/query-executor/default-query-executor.js +6 -0
- package/dist/cjs/query-executor/noop-query-executor.d.ts +1 -0
- package/dist/cjs/query-executor/noop-query-executor.js +3 -0
- package/dist/cjs/query-executor/query-executor.d.ts +9 -4
- package/dist/cjs/util/log.d.ts +19 -0
- package/dist/cjs/util/log.js +37 -0
- package/dist/cjs/util/object-utils.d.ts +11 -11
- package/dist/cjs/util/object-utils.js +1 -1
- package/dist/cjs/util/random-string.js +6 -3
- package/dist/cjs/util/type-utils.d.ts +4 -4
- package/dist/esm/dialect/mysql/mysql-dialect.d.ts +11 -0
- package/dist/esm/dialect/mysql/mysql-dialect.js +7 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +3 -3
- package/dist/esm/dialect/postgres/postgres-dialect.d.ts +13 -1
- package/dist/esm/dialect/postgres/postgres-dialect.js +10 -0
- package/dist/esm/dialect/postgres/postgres-driver.js +2 -2
- package/dist/esm/dialect/postgres/postgres-query-compiler.js +1 -1
- package/dist/esm/driver/runtime-driver.d.ts +3 -2
- package/dist/esm/driver/runtime-driver.js +57 -4
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/kysely.d.ts +31 -9
- package/dist/esm/kysely.js +25 -9
- package/dist/esm/migration/migration.d.ts +32 -0
- package/dist/esm/operation-node/join-node.d.ts +2 -1
- package/dist/esm/operation-node/join-node.js +8 -6
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +9 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +61 -59
- package/dist/esm/operation-node/operation-node-visitor.js +1 -316
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/query-node.d.ts +4 -3
- package/dist/esm/operation-node/query-node.js +10 -2
- package/dist/esm/operation-node/select-query-node.d.ts +5 -1
- package/dist/esm/operation-node/select-query-node.js +18 -2
- package/dist/esm/operation-node/union-node.d.ts +16 -0
- package/dist/esm/operation-node/union-node.js +16 -0
- package/dist/esm/parser/group-by-parser.d.ts +4 -0
- package/dist/esm/parser/group-by-parser.js +5 -0
- package/dist/esm/parser/insert-values-parser.d.ts +1 -1
- package/dist/esm/parser/join-parser.d.ts +4 -4
- package/dist/esm/parser/order-by-parser.d.ts +2 -4
- package/dist/esm/parser/order-by-parser.js +6 -2
- package/dist/esm/parser/reference-parser.d.ts +1 -1
- package/dist/esm/parser/reference-parser.js +2 -2
- package/dist/esm/parser/union-parser.d.ts +5 -0
- package/dist/esm/parser/union-parser.js +9 -0
- package/dist/esm/parser/value-parser.d.ts +1 -1
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +4 -115
- package/dist/esm/plugin/camel-case/camel-case-transformer.d.ts +8 -0
- package/dist/esm/plugin/camel-case/camel-case-transformer.js +15 -0
- package/dist/esm/plugin/camel-case/camel-case.d.ts +15 -0
- package/dist/esm/plugin/camel-case/camel-case.js +104 -0
- package/dist/esm/plugin/kysely-plugin.d.ts +1 -1
- package/dist/esm/query-builder/join-builder.js +8 -8
- package/dist/esm/query-builder/query-builder.d.ts +65 -1
- package/dist/esm/query-builder/query-builder.js +104 -23
- package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
- package/dist/esm/query-compiler/default-query-compiler.d.ts +7 -2
- package/dist/esm/query-compiler/default-query-compiler.js +20 -3
- package/dist/esm/query-executor/default-query-executor.d.ts +1 -0
- package/dist/esm/query-executor/default-query-executor.js +6 -0
- package/dist/esm/query-executor/noop-query-executor.d.ts +1 -0
- package/dist/esm/query-executor/noop-query-executor.js +3 -0
- package/dist/esm/query-executor/query-executor.d.ts +9 -4
- package/dist/esm/util/log.d.ts +19 -0
- package/dist/esm/util/log.js +33 -0
- package/dist/esm/util/object-utils.d.ts +11 -11
- package/dist/esm/util/object-utils.js +1 -1
- package/dist/esm/util/random-string.js +6 -3
- package/dist/esm/util/type-utils.d.ts +4 -4
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
|
|
2
1
|
import { isObject } from '../../util/object-utils.js';
|
|
2
|
+
import { SnakeCaseTransformer } from './camel-case-transformer.js';
|
|
3
|
+
import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
|
|
3
4
|
/**
|
|
4
5
|
* A plugin that converts snake_case identifiers in the database into
|
|
5
6
|
* camelCase in the javascript side.
|
|
@@ -69,8 +70,8 @@ export class CamelCasePlugin {
|
|
|
69
70
|
#snakeCase;
|
|
70
71
|
#snakeCaseTransformer;
|
|
71
72
|
constructor(opt = {}) {
|
|
72
|
-
this.#camelCase =
|
|
73
|
-
this.#snakeCase =
|
|
73
|
+
this.#camelCase = createCamelCaseMapper(opt);
|
|
74
|
+
this.#snakeCase = createSnakeCaseMapper(opt);
|
|
74
75
|
this.#snakeCaseTransformer = new SnakeCaseTransformer(this.snakeCase.bind(this));
|
|
75
76
|
}
|
|
76
77
|
transformQuery(args) {
|
|
@@ -105,118 +106,6 @@ export class CamelCasePlugin {
|
|
|
105
106
|
return this.#camelCase(str);
|
|
106
107
|
}
|
|
107
108
|
}
|
|
108
|
-
class SnakeCaseTransformer extends OperationNodeTransformer {
|
|
109
|
-
#snakeCase;
|
|
110
|
-
constructor(snakeCase) {
|
|
111
|
-
super();
|
|
112
|
-
this.#snakeCase = snakeCase;
|
|
113
|
-
}
|
|
114
|
-
transformIdentifier(node) {
|
|
115
|
-
node = super.transformIdentifier(node);
|
|
116
|
-
return {
|
|
117
|
-
...node,
|
|
118
|
-
identifier: this.#snakeCase(node.identifier),
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
109
|
function canMap(obj) {
|
|
123
110
|
return isObject(obj) && !(obj instanceof Date) && !Buffer.isBuffer(obj);
|
|
124
111
|
}
|
|
125
|
-
function createSnakeCase({ upperCase = false, underscoreBeforeDigits = false, underscoreBetweenUppercaseLetters = false, } = {}) {
|
|
126
|
-
return memoize((str) => {
|
|
127
|
-
if (str.length === 0) {
|
|
128
|
-
return str;
|
|
129
|
-
}
|
|
130
|
-
const upper = str.toUpperCase();
|
|
131
|
-
const lower = str.toLowerCase();
|
|
132
|
-
let out = lower[0];
|
|
133
|
-
for (let i = 1, l = str.length; i < l; ++i) {
|
|
134
|
-
const char = str[i];
|
|
135
|
-
const prevChar = str[i - 1];
|
|
136
|
-
const upperChar = upper[i];
|
|
137
|
-
const prevUpperChar = upper[i - 1];
|
|
138
|
-
const lowerChar = lower[i];
|
|
139
|
-
const prevLowerChar = lower[i - 1];
|
|
140
|
-
// If underScoreBeforeDigits is true then, well, insert an underscore
|
|
141
|
-
// before digits :). Only the first digit gets an underscore if
|
|
142
|
-
// there are multiple.
|
|
143
|
-
if (underscoreBeforeDigits && isDigit(char) && !isDigit(prevChar)) {
|
|
144
|
-
out += '_' + char;
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
// Test if `char` is an upper-case character and that the character
|
|
148
|
-
// actually has different upper and lower case versions.
|
|
149
|
-
if (char === upperChar && upperChar !== lowerChar) {
|
|
150
|
-
const prevCharacterIsUppercase = prevChar === prevUpperChar && prevUpperChar !== prevLowerChar;
|
|
151
|
-
// If underscoreBetweenUppercaseLetters is true, we always place an underscore
|
|
152
|
-
// before consecutive uppercase letters (e.g. "fooBAR" becomes "foo_b_a_r").
|
|
153
|
-
// Otherwise, we don't (e.g. "fooBAR" becomes "foo_bar").
|
|
154
|
-
if (underscoreBetweenUppercaseLetters || !prevCharacterIsUppercase) {
|
|
155
|
-
out += '_' + lowerChar;
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
out += lowerChar;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
out += char;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
if (upperCase) {
|
|
166
|
-
return out.toUpperCase();
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
return out;
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
function createCamelCase({ upperCase = false } = {}) {
|
|
174
|
-
return memoize((str) => {
|
|
175
|
-
if (str.length === 0) {
|
|
176
|
-
return str;
|
|
177
|
-
}
|
|
178
|
-
if (upperCase && isAllUpperCaseSnakeCase(str)) {
|
|
179
|
-
// Only convert to lower case if the string is all upper
|
|
180
|
-
// case snake_case. This allows camelCase strings to go
|
|
181
|
-
// through without changing.
|
|
182
|
-
str = str.toLowerCase();
|
|
183
|
-
}
|
|
184
|
-
let out = str[0];
|
|
185
|
-
for (let i = 1, l = str.length; i < l; ++i) {
|
|
186
|
-
const char = str[i];
|
|
187
|
-
const prevChar = str[i - 1];
|
|
188
|
-
if (char !== '_') {
|
|
189
|
-
if (prevChar === '_') {
|
|
190
|
-
out += char.toUpperCase();
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
out += char;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
return out;
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
function isAllUpperCaseSnakeCase(str) {
|
|
201
|
-
for (let i = 1, l = str.length; i < l; ++i) {
|
|
202
|
-
const char = str[i];
|
|
203
|
-
if (char !== '_' && char !== char.toUpperCase()) {
|
|
204
|
-
return false;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
function isDigit(char) {
|
|
210
|
-
return char >= '0' && char <= '9';
|
|
211
|
-
}
|
|
212
|
-
function memoize(func) {
|
|
213
|
-
const cache = new Map();
|
|
214
|
-
return (str) => {
|
|
215
|
-
let mapped = cache.get(str);
|
|
216
|
-
if (!mapped) {
|
|
217
|
-
mapped = func(str);
|
|
218
|
-
cache.set(str, mapped);
|
|
219
|
-
}
|
|
220
|
-
return mapped;
|
|
221
|
-
};
|
|
222
|
-
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IdentifierNode } from '../../operation-node/identifier-node.js';
|
|
2
|
+
import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
|
|
3
|
+
import { StringMapper } from './camel-case.js';
|
|
4
|
+
export declare class SnakeCaseTransformer extends OperationNodeTransformer {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(snakeCase: StringMapper);
|
|
7
|
+
protected transformIdentifier(node: IdentifierNode): IdentifierNode;
|
|
8
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
|
|
2
|
+
export class SnakeCaseTransformer extends OperationNodeTransformer {
|
|
3
|
+
#snakeCase;
|
|
4
|
+
constructor(snakeCase) {
|
|
5
|
+
super();
|
|
6
|
+
this.#snakeCase = snakeCase;
|
|
7
|
+
}
|
|
8
|
+
transformIdentifier(node) {
|
|
9
|
+
node = super.transformIdentifier(node);
|
|
10
|
+
return {
|
|
11
|
+
...node,
|
|
12
|
+
identifier: this.#snakeCase(node.identifier),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare type StringMapper = (str: string) => string;
|
|
2
|
+
/**
|
|
3
|
+
* Creates a function that transforms camel case strings to snake case.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createSnakeCaseMapper({ upperCase, underscoreBeforeDigits, underscoreBetweenUppercaseLetters, }?: {
|
|
6
|
+
upperCase?: boolean | undefined;
|
|
7
|
+
underscoreBeforeDigits?: boolean | undefined;
|
|
8
|
+
underscoreBetweenUppercaseLetters?: boolean | undefined;
|
|
9
|
+
}): StringMapper;
|
|
10
|
+
/**
|
|
11
|
+
* Creates a function that transforms snake case strings to camel case.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createCamelCaseMapper({ upperCase, }?: {
|
|
14
|
+
upperCase?: boolean | undefined;
|
|
15
|
+
}): StringMapper;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a function that transforms camel case strings to snake case.
|
|
3
|
+
*/
|
|
4
|
+
export function createSnakeCaseMapper({ upperCase = false, underscoreBeforeDigits = false, underscoreBetweenUppercaseLetters = false, } = {}) {
|
|
5
|
+
return memoize((str) => {
|
|
6
|
+
if (str.length === 0) {
|
|
7
|
+
return str;
|
|
8
|
+
}
|
|
9
|
+
const upper = str.toUpperCase();
|
|
10
|
+
const lower = str.toLowerCase();
|
|
11
|
+
let out = lower[0];
|
|
12
|
+
for (let i = 1, l = str.length; i < l; ++i) {
|
|
13
|
+
const char = str[i];
|
|
14
|
+
const prevChar = str[i - 1];
|
|
15
|
+
const upperChar = upper[i];
|
|
16
|
+
const prevUpperChar = upper[i - 1];
|
|
17
|
+
const lowerChar = lower[i];
|
|
18
|
+
const prevLowerChar = lower[i - 1];
|
|
19
|
+
// If underScoreBeforeDigits is true then, well, insert an underscore
|
|
20
|
+
// before digits :). Only the first digit gets an underscore if
|
|
21
|
+
// there are multiple.
|
|
22
|
+
if (underscoreBeforeDigits && isDigit(char) && !isDigit(prevChar)) {
|
|
23
|
+
out += '_' + char;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
// Test if `char` is an upper-case character and that the character
|
|
27
|
+
// actually has different upper and lower case versions.
|
|
28
|
+
if (char === upperChar && upperChar !== lowerChar) {
|
|
29
|
+
const prevCharacterIsUppercase = prevChar === prevUpperChar && prevUpperChar !== prevLowerChar;
|
|
30
|
+
// If underscoreBetweenUppercaseLetters is true, we always place an underscore
|
|
31
|
+
// before consecutive uppercase letters (e.g. "fooBAR" becomes "foo_b_a_r").
|
|
32
|
+
// Otherwise, we don't (e.g. "fooBAR" becomes "foo_bar").
|
|
33
|
+
if (underscoreBetweenUppercaseLetters || !prevCharacterIsUppercase) {
|
|
34
|
+
out += '_' + lowerChar;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
out += lowerChar;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
out += char;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (upperCase) {
|
|
45
|
+
return out.toUpperCase();
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Creates a function that transforms snake case strings to camel case.
|
|
54
|
+
*/
|
|
55
|
+
export function createCamelCaseMapper({ upperCase = false, } = {}) {
|
|
56
|
+
return memoize((str) => {
|
|
57
|
+
if (str.length === 0) {
|
|
58
|
+
return str;
|
|
59
|
+
}
|
|
60
|
+
if (upperCase && isAllUpperCaseSnakeCase(str)) {
|
|
61
|
+
// Only convert to lower case if the string is all upper
|
|
62
|
+
// case snake_case. This allows camelCase strings to go
|
|
63
|
+
// through without changing.
|
|
64
|
+
str = str.toLowerCase();
|
|
65
|
+
}
|
|
66
|
+
let out = str[0];
|
|
67
|
+
for (let i = 1, l = str.length; i < l; ++i) {
|
|
68
|
+
const char = str[i];
|
|
69
|
+
const prevChar = str[i - 1];
|
|
70
|
+
if (char !== '_') {
|
|
71
|
+
if (prevChar === '_') {
|
|
72
|
+
out += char.toUpperCase();
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
out += char;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function isAllUpperCaseSnakeCase(str) {
|
|
83
|
+
for (let i = 1, l = str.length; i < l; ++i) {
|
|
84
|
+
const char = str[i];
|
|
85
|
+
if (char !== '_' && char !== char.toUpperCase()) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
function isDigit(char) {
|
|
92
|
+
return char >= '0' && char <= '9';
|
|
93
|
+
}
|
|
94
|
+
function memoize(func) {
|
|
95
|
+
const cache = new Map();
|
|
96
|
+
return (str) => {
|
|
97
|
+
let mapped = cache.get(str);
|
|
98
|
+
if (!mapped) {
|
|
99
|
+
mapped = func(str);
|
|
100
|
+
cache.set(str, mapped);
|
|
101
|
+
}
|
|
102
|
+
return mapped;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
@@ -21,7 +21,7 @@ export interface KyselyPlugin {
|
|
|
21
21
|
* return args.node
|
|
22
22
|
* },
|
|
23
23
|
*
|
|
24
|
-
* transformResult(args: PluginTransformResultArgs): QueryResult<
|
|
24
|
+
* transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow> {
|
|
25
25
|
* const data = this.data.get(args.queryId)
|
|
26
26
|
* return args.result
|
|
27
27
|
* }
|
|
@@ -10,13 +10,13 @@ export class JoinBuilder {
|
|
|
10
10
|
on(...args) {
|
|
11
11
|
return new JoinBuilder({
|
|
12
12
|
...this.#props,
|
|
13
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode,
|
|
13
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseOnFilter(this.#props.parseContext, args)),
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
orOn(...args) {
|
|
17
17
|
return new JoinBuilder({
|
|
18
18
|
...this.#props,
|
|
19
|
-
joinNode: JoinNode.
|
|
19
|
+
joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseOnFilter(this.#props.parseContext, args)),
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
@@ -28,7 +28,7 @@ export class JoinBuilder {
|
|
|
28
28
|
onRef(lhs, op, rhs) {
|
|
29
29
|
return new JoinBuilder({
|
|
30
30
|
...this.#props,
|
|
31
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode,
|
|
31
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
@@ -40,7 +40,7 @@ export class JoinBuilder {
|
|
|
40
40
|
orOnRef(lhs, op, rhs) {
|
|
41
41
|
return new JoinBuilder({
|
|
42
42
|
...this.#props,
|
|
43
|
-
joinNode: JoinNode.
|
|
43
|
+
joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
@@ -52,7 +52,7 @@ export class JoinBuilder {
|
|
|
52
52
|
onExists(arg) {
|
|
53
53
|
return new JoinBuilder({
|
|
54
54
|
...this.#props,
|
|
55
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode,
|
|
55
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
@@ -64,7 +64,7 @@ export class JoinBuilder {
|
|
|
64
64
|
onNotExists(arg) {
|
|
65
65
|
return new JoinBuilder({
|
|
66
66
|
...this.#props,
|
|
67
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode,
|
|
67
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
/**
|
|
@@ -76,7 +76,7 @@ export class JoinBuilder {
|
|
|
76
76
|
orOnExists(arg) {
|
|
77
77
|
return new JoinBuilder({
|
|
78
78
|
...this.#props,
|
|
79
|
-
joinNode: JoinNode.
|
|
79
|
+
joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
@@ -88,7 +88,7 @@ export class JoinBuilder {
|
|
|
88
88
|
orOnNotExists(arg) {
|
|
89
89
|
return new JoinBuilder({
|
|
90
90
|
...this.#props,
|
|
91
|
-
joinNode: JoinNode.
|
|
91
|
+
joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
toOperationNode() {
|
|
@@ -18,6 +18,7 @@ import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
|
18
18
|
import { QueryId } from '../util/query-id.js';
|
|
19
19
|
import { OnConflictConstraintTarget } from '../parser/on-conflict-parser.js';
|
|
20
20
|
import { ParseContext } from '../parser/parse-context.js';
|
|
21
|
+
import { UnionExpression } from '../parser/union-parser.js';
|
|
21
22
|
/**
|
|
22
23
|
* The main query builder class.
|
|
23
24
|
*
|
|
@@ -998,7 +999,7 @@ export declare class QueryBuilder<DB, TB extends keyof DB, O = {}> implements Op
|
|
|
998
999
|
* ```
|
|
999
1000
|
*/
|
|
1000
1001
|
values(row: InsertObject<DB, TB>): QueryBuilder<DB, TB, O>;
|
|
1001
|
-
values(row: InsertObject<DB, TB
|
|
1002
|
+
values(row: ReadonlyArray<InsertObject<DB, TB>>): QueryBuilder<DB, TB, O>;
|
|
1002
1003
|
/**
|
|
1003
1004
|
* Ignores the insert if the column or constraint given as the first
|
|
1004
1005
|
* argument conflicts with the current rows in the database. The
|
|
@@ -1553,6 +1554,69 @@ export declare class QueryBuilder<DB, TB extends keyof DB, O = {}> implements Op
|
|
|
1553
1554
|
* ```
|
|
1554
1555
|
*/
|
|
1555
1556
|
offset(offset: number): QueryBuilder<DB, TB, O>;
|
|
1557
|
+
/**
|
|
1558
|
+
* Combines another select query or raw expression to this query using `union`.
|
|
1559
|
+
*
|
|
1560
|
+
* The output row type of the combined query must match `this` query.
|
|
1561
|
+
*
|
|
1562
|
+
* @xample
|
|
1563
|
+
* ```ts
|
|
1564
|
+
* db.selectFrom('person')
|
|
1565
|
+
* .select(['id', 'first_name as name'])
|
|
1566
|
+
* .union(db.selectFrom('pet').select(['id', 'name']))
|
|
1567
|
+
* .orderBy('name')
|
|
1568
|
+
* ```
|
|
1569
|
+
*/
|
|
1570
|
+
union(expression: UnionExpression<DB, O>): QueryBuilder<DB, TB, O>;
|
|
1571
|
+
/**
|
|
1572
|
+
* Combines another select query or raw expression to this query using `union all`.
|
|
1573
|
+
*
|
|
1574
|
+
* The output row type of the combined query must match `this` query.
|
|
1575
|
+
*
|
|
1576
|
+
* @xample
|
|
1577
|
+
* ```ts
|
|
1578
|
+
* db.selectFrom('person')
|
|
1579
|
+
* .select(['id', 'first_name as name'])
|
|
1580
|
+
* .unionAll(db.selectFrom('pet').select(['id', 'name']))
|
|
1581
|
+
* .orderBy('name')
|
|
1582
|
+
* ```
|
|
1583
|
+
*/
|
|
1584
|
+
unionAll(expression: UnionExpression<DB, O>): QueryBuilder<DB, TB, O>;
|
|
1585
|
+
/**
|
|
1586
|
+
* Simply calls the given function passing `this` as the only argument.
|
|
1587
|
+
*
|
|
1588
|
+
* This method can be useful when adding optional method calls:
|
|
1589
|
+
*
|
|
1590
|
+
* @example
|
|
1591
|
+
* ```ts
|
|
1592
|
+
* db.selectFrom('person')
|
|
1593
|
+
* .selectAll()
|
|
1594
|
+
* .call((qb) => {
|
|
1595
|
+
* if (something) {
|
|
1596
|
+
* return qb.where('something', '=', something)
|
|
1597
|
+
* } else {
|
|
1598
|
+
* return qb.where('somethingElse', '=', somethingElse)
|
|
1599
|
+
* }
|
|
1600
|
+
* })
|
|
1601
|
+
* .execute()
|
|
1602
|
+
* ```
|
|
1603
|
+
*
|
|
1604
|
+
* The next example uses a helper funtion `log` to log a query:
|
|
1605
|
+
*
|
|
1606
|
+
* @example
|
|
1607
|
+
* ```ts
|
|
1608
|
+
* function log<T extends AnyQueryBuilder>(qb: T): T {
|
|
1609
|
+
* console.log(qb.compile())
|
|
1610
|
+
* return qb
|
|
1611
|
+
* }
|
|
1612
|
+
*
|
|
1613
|
+
* db.selectFrom('person')
|
|
1614
|
+
* .selectAll()
|
|
1615
|
+
* .call(log)
|
|
1616
|
+
* .execute()
|
|
1617
|
+
* ```
|
|
1618
|
+
*/
|
|
1619
|
+
call<T>(func: (qb: this) => T): T;
|
|
1556
1620
|
/**
|
|
1557
1621
|
* Gives an alias for the query. This method is only useful for sub queries.
|
|
1558
1622
|
*
|