kysely 0.16.9 → 0.17.1
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/LICENSE +21 -0
- package/README.md +2 -2
- package/dist/cjs/dialect/mysql/mysql-adapter.js +3 -4
- package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -1
- package/dist/cjs/dialect/postgres/postgres-adapter.js +3 -2
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +2 -1
- package/dist/cjs/driver/connection-provider.d.ts +1 -1
- package/dist/cjs/driver/default-connection-provider.d.ts +1 -1
- package/dist/cjs/driver/default-connection-provider.js +1 -1
- package/dist/cjs/driver/single-connection-provider.d.ts +1 -1
- package/dist/cjs/driver/single-connection-provider.js +1 -1
- package/dist/cjs/index-nodeless.d.ts +2 -0
- package/dist/cjs/index-nodeless.js +2 -0
- package/dist/cjs/kysely.d.ts +3 -6
- package/dist/cjs/kysely.js +30 -41
- package/dist/cjs/migration/migrator.js +4 -4
- package/dist/cjs/operation-node/delete-query-node.d.ts +7 -0
- package/dist/cjs/operation-node/delete-query-node.js +15 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +1 -1
- package/dist/cjs/operation-node/raw-node.d.ts +4 -2
- package/dist/cjs/operation-node/raw-node.js +8 -2
- package/dist/cjs/parser/complex-expression-parser.d.ts +5 -5
- package/dist/cjs/parser/complex-expression-parser.js +5 -4
- package/dist/cjs/parser/filter-parser.d.ts +9 -9
- package/dist/cjs/parser/filter-parser.js +31 -30
- package/dist/cjs/parser/group-by-parser.d.ts +1 -2
- package/dist/cjs/parser/group-by-parser.js +2 -2
- package/dist/cjs/parser/insert-values-parser.d.ts +1 -2
- package/dist/cjs/parser/insert-values-parser.js +6 -6
- package/dist/cjs/parser/join-parser.d.ts +1 -2
- package/dist/cjs/parser/join-parser.js +8 -7
- package/dist/cjs/parser/order-by-parser.d.ts +1 -2
- package/dist/cjs/parser/order-by-parser.js +4 -4
- package/dist/cjs/parser/parse-utils.d.ts +10 -0
- package/dist/cjs/parser/parse-utils.js +38 -0
- package/dist/cjs/parser/reference-parser.d.ts +2 -3
- package/dist/cjs/parser/reference-parser.js +5 -5
- package/dist/cjs/parser/select-parser.d.ts +1 -2
- package/dist/cjs/parser/select-parser.js +5 -5
- package/dist/cjs/parser/table-parser.d.ts +2 -3
- package/dist/cjs/parser/table-parser.js +5 -5
- package/dist/cjs/parser/update-set-parser.d.ts +1 -2
- package/dist/cjs/parser/update-set-parser.js +2 -2
- package/dist/cjs/parser/value-parser.d.ts +3 -4
- package/dist/cjs/parser/value-parser.js +7 -7
- package/dist/cjs/parser/with-parser.d.ts +1 -2
- package/dist/cjs/parser/with-parser.js +3 -2
- package/dist/cjs/query-builder/delete-query-builder.d.ts +77 -20
- package/dist/cjs/query-builder/delete-query-builder.js +81 -14
- package/dist/cjs/query-builder/expression-builder.d.ts +4 -13
- package/dist/cjs/query-builder/expression-builder.js +12 -21
- package/dist/cjs/query-builder/function-builder.d.ts +2 -6
- package/dist/cjs/query-builder/function-builder.js +5 -8
- package/dist/cjs/query-builder/insert-query-builder.d.ts +11 -9
- package/dist/cjs/query-builder/insert-query-builder.js +8 -7
- package/dist/cjs/query-builder/join-builder.d.ts +0 -2
- package/dist/cjs/query-builder/join-builder.js +8 -8
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +24 -20
- package/dist/cjs/query-builder/on-conflict-builder.js +17 -17
- package/dist/cjs/query-builder/returning-interface.d.ts +2 -2
- package/dist/cjs/query-builder/select-query-builder.d.ts +43 -32
- package/dist/cjs/query-builder/select-query-builder.js +28 -26
- package/dist/cjs/query-builder/update-query-builder.d.ts +29 -25
- package/dist/cjs/query-builder/update-query-builder.js +22 -20
- package/dist/cjs/query-builder/where-interface.d.ts +20 -16
- package/dist/cjs/query-compiler/default-query-compiler.js +16 -7
- package/dist/cjs/query-creator.d.ts +24 -138
- package/dist/cjs/query-creator.js +19 -145
- package/dist/cjs/query-executor/default-query-executor.d.ts +14 -3
- package/dist/cjs/query-executor/default-query-executor.js +15 -17
- package/dist/cjs/query-executor/noop-query-executor.d.ts +13 -2
- package/dist/cjs/query-executor/noop-query-executor.js +9 -2
- package/dist/cjs/query-executor/query-executor-provider.d.ts +8 -0
- package/dist/cjs/query-executor/query-executor-provider.js +2 -0
- package/dist/cjs/query-executor/query-executor.d.ts +14 -6
- package/dist/cjs/query-executor/query-executor.js +4 -2
- package/dist/cjs/raw-builder/raw-builder.d.ts +42 -11
- package/dist/cjs/raw-builder/raw-builder.js +55 -56
- package/dist/cjs/raw-builder/sql.d.ts +323 -0
- package/dist/cjs/raw-builder/sql.js +153 -0
- package/dist/cjs/schema/alter-table-builder.d.ts +20 -8
- package/dist/cjs/schema/alter-table-builder.js +3 -3
- package/dist/cjs/schema/column-definition-builder.d.ts +20 -8
- package/dist/cjs/schema/create-index-builder.d.ts +3 -1
- package/dist/cjs/schema/create-index-builder.js +3 -1
- package/dist/cjs/schema/create-table-builder.d.ts +6 -2
- package/dist/cjs/schema/create-table-builder.js +8 -4
- package/dist/cjs/schema/create-view-builder.d.ts +3 -3
- package/dist/cjs/schema/create-view-builder.js +3 -3
- package/dist/cjs/util/query-id.js +10 -4
- package/dist/cjs/util/random-string.js +65 -2
- package/dist/esm/dialect/mysql/mysql-adapter.js +3 -4
- package/dist/esm/dialect/mysql/mysql-introspector.js +2 -1
- package/dist/esm/dialect/postgres/postgres-adapter.js +3 -2
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -1
- package/dist/esm/driver/connection-provider.d.ts +1 -1
- package/dist/esm/driver/default-connection-provider.d.ts +1 -1
- package/dist/esm/driver/default-connection-provider.js +1 -1
- package/dist/esm/driver/single-connection-provider.d.ts +1 -1
- package/dist/esm/driver/single-connection-provider.js +1 -1
- package/dist/esm/index-nodeless.d.ts +2 -0
- package/dist/esm/index-nodeless.js +2 -0
- package/dist/esm/kysely.d.ts +3 -6
- package/dist/esm/kysely.js +30 -41
- package/dist/esm/migration/migrator.js +4 -4
- package/dist/esm/operation-node/delete-query-node.d.ts +7 -0
- package/dist/esm/operation-node/delete-query-node.js +15 -0
- package/dist/esm/operation-node/operation-node-transformer.js +1 -1
- package/dist/esm/operation-node/raw-node.d.ts +4 -2
- package/dist/esm/operation-node/raw-node.js +8 -2
- package/dist/esm/parser/complex-expression-parser.d.ts +5 -5
- package/dist/esm/parser/complex-expression-parser.js +5 -4
- package/dist/esm/parser/filter-parser.d.ts +9 -9
- package/dist/esm/parser/filter-parser.js +31 -30
- package/dist/esm/parser/group-by-parser.d.ts +1 -2
- package/dist/esm/parser/group-by-parser.js +2 -2
- package/dist/esm/parser/insert-values-parser.d.ts +1 -2
- package/dist/esm/parser/insert-values-parser.js +6 -6
- package/dist/esm/parser/join-parser.d.ts +1 -2
- package/dist/esm/parser/join-parser.js +8 -7
- package/dist/esm/parser/order-by-parser.d.ts +1 -2
- package/dist/esm/parser/order-by-parser.js +4 -4
- package/dist/esm/parser/parse-utils.d.ts +10 -0
- package/dist/esm/parser/parse-utils.js +32 -0
- package/dist/esm/parser/reference-parser.d.ts +2 -3
- package/dist/esm/parser/reference-parser.js +5 -5
- package/dist/esm/parser/select-parser.d.ts +1 -2
- package/dist/esm/parser/select-parser.js +5 -5
- package/dist/esm/parser/table-parser.d.ts +2 -3
- package/dist/esm/parser/table-parser.js +5 -5
- package/dist/esm/parser/update-set-parser.d.ts +1 -2
- package/dist/esm/parser/update-set-parser.js +2 -2
- package/dist/esm/parser/value-parser.d.ts +3 -4
- package/dist/esm/parser/value-parser.js +7 -7
- package/dist/esm/parser/with-parser.d.ts +1 -2
- package/dist/esm/parser/with-parser.js +3 -2
- package/dist/esm/query-builder/delete-query-builder.d.ts +77 -20
- package/dist/esm/query-builder/delete-query-builder.js +81 -14
- package/dist/esm/query-builder/expression-builder.d.ts +4 -13
- package/dist/esm/query-builder/expression-builder.js +12 -21
- package/dist/esm/query-builder/function-builder.d.ts +2 -6
- package/dist/esm/query-builder/function-builder.js +5 -8
- package/dist/esm/query-builder/insert-query-builder.d.ts +11 -9
- package/dist/esm/query-builder/insert-query-builder.js +8 -7
- package/dist/esm/query-builder/join-builder.d.ts +0 -2
- package/dist/esm/query-builder/join-builder.js +8 -8
- package/dist/esm/query-builder/on-conflict-builder.d.ts +24 -20
- package/dist/esm/query-builder/on-conflict-builder.js +17 -17
- package/dist/esm/query-builder/returning-interface.d.ts +2 -2
- package/dist/esm/query-builder/select-query-builder.d.ts +43 -32
- package/dist/esm/query-builder/select-query-builder.js +28 -26
- package/dist/esm/query-builder/update-query-builder.d.ts +29 -25
- package/dist/esm/query-builder/update-query-builder.js +22 -20
- package/dist/esm/query-builder/where-interface.d.ts +20 -16
- package/dist/esm/query-compiler/default-query-compiler.js +16 -7
- package/dist/esm/query-creator.d.ts +24 -138
- package/dist/esm/query-creator.js +19 -145
- package/dist/esm/query-executor/default-query-executor.d.ts +14 -3
- package/dist/esm/query-executor/default-query-executor.js +15 -17
- package/dist/esm/query-executor/noop-query-executor.d.ts +13 -2
- package/dist/esm/query-executor/noop-query-executor.js +8 -1
- package/dist/esm/query-executor/query-executor-provider.d.ts +8 -0
- package/dist/esm/query-executor/query-executor-provider.js +2 -0
- package/dist/esm/query-executor/query-executor.d.ts +14 -6
- package/dist/esm/query-executor/query-executor.js +4 -2
- package/dist/esm/raw-builder/raw-builder.d.ts +42 -11
- package/dist/esm/raw-builder/raw-builder.js +56 -57
- package/dist/esm/raw-builder/sql.d.ts +323 -0
- package/dist/esm/raw-builder/sql.js +151 -0
- package/dist/esm/schema/alter-table-builder.d.ts +20 -8
- package/dist/esm/schema/alter-table-builder.js +3 -3
- package/dist/esm/schema/column-definition-builder.d.ts +20 -8
- package/dist/esm/schema/create-index-builder.d.ts +3 -1
- package/dist/esm/schema/create-index-builder.js +3 -1
- package/dist/esm/schema/create-table-builder.d.ts +6 -2
- package/dist/esm/schema/create-table-builder.js +8 -4
- package/dist/esm/schema/create-view-builder.d.ts +3 -3
- package/dist/esm/schema/create-view-builder.js +3 -3
- package/dist/esm/util/query-id.js +10 -4
- package/dist/esm/util/random-string.js +65 -2
- package/package.json +13 -13
- package/dist/cjs/parser/parse-context.d.ts +0 -55
- package/dist/cjs/parser/parse-context.js +0 -50
- package/dist/cjs/util/private-symbols.d.ts +0 -5
- package/dist/cjs/util/private-symbols.js +0 -8
- package/dist/esm/parser/parse-context.d.ts +0 -55
- package/dist/esm/parser/parse-context.js +0 -47
- package/dist/esm/util/private-symbols.d.ts +0 -5
- package/dist/esm/util/private-symbols.js +0 -6
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/// <reference types="./sql.d.ts" />
|
|
2
|
+
import { IdentifierNode } from '../operation-node/identifier-node.js';
|
|
3
|
+
import { RawNode } from '../operation-node/raw-node.js';
|
|
4
|
+
import { ValueNode } from '../operation-node/value-node.js';
|
|
5
|
+
import { parseStringReference } from '../parser/reference-parser.js';
|
|
6
|
+
import { parseTable } from '../parser/table-parser.js';
|
|
7
|
+
import { parseValueExpression } from '../parser/value-parser.js';
|
|
8
|
+
import { createQueryId } from '../util/query-id.js';
|
|
9
|
+
import { RawBuilder } from './raw-builder.js';
|
|
10
|
+
/**
|
|
11
|
+
* Template tag for creating raw SQL snippets and queries.
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { sql } from 'kysely'
|
|
15
|
+
*
|
|
16
|
+
* const id = 123
|
|
17
|
+
*
|
|
18
|
+
* const snippet = sql<Person[]>`select * from person where id = ${id}`
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Substitutions (the things inside `${}`) are automatically passed to the database
|
|
22
|
+
* as parameters and are NOT interpolated to the SQL string. There's no need to worry
|
|
23
|
+
* about SQL injection vulnerabilities.
|
|
24
|
+
*
|
|
25
|
+
* If you need your substitutions to be interpreted as identifiers, value literals or
|
|
26
|
+
* lists of things, see the {@link Sql.ref}, {@link Sql.table}, {@link Sql.id},
|
|
27
|
+
* {@link Sql.literal}, {@link Sql.raw} and {@link Sql.join} functions.
|
|
28
|
+
*
|
|
29
|
+
* You can pass sql snippets returned by the `sql` tag pretty much anywhere. Whenever
|
|
30
|
+
* something can't be done using the Kysely API, you should be able to drop down to
|
|
31
|
+
* raw SQL using the `sql` tag. Here's an example query that uses raw sql in a bunch
|
|
32
|
+
* of methods:
|
|
33
|
+
*
|
|
34
|
+
* ```ts
|
|
35
|
+
* const persons = await db
|
|
36
|
+
* .selectFrom('person')
|
|
37
|
+
* .select(
|
|
38
|
+
* // If you use `sql` in a select statement, remember to call the `as`
|
|
39
|
+
* // method to give it an alias. Otherwise Kysely is not able to add
|
|
40
|
+
* // the column to the result type.
|
|
41
|
+
* sql<string>`concat(first_name, ' ', last_name)`.as('full_name')
|
|
42
|
+
* )
|
|
43
|
+
* .where(sql`birthdate between ${date1} and ${date2}`)
|
|
44
|
+
* // Here we assume we have list of nicknames for the person
|
|
45
|
+
* // (a list of strings) and we use the PostgreSQL `@>` operator
|
|
46
|
+
* // to test if all of them are valid nicknames for the user.
|
|
47
|
+
* .where('nicknames', '@>', sql`ARRAY[${sql.join(nicknames)}]`)
|
|
48
|
+
* .orderBy(sql`concat(first_name, ' ', last_name)`)
|
|
49
|
+
* .execute()
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* The generated SQL (PostgreSQL):
|
|
53
|
+
*
|
|
54
|
+
* ```sql
|
|
55
|
+
* select concat(first_name, ' ', last_name) as "full_name"
|
|
56
|
+
* from "person"
|
|
57
|
+
* where birthdate between $1 and $2
|
|
58
|
+
* and "nicknames" @> ARRAY[$3, $4, $5, $6, $7, $8, $9, $10]
|
|
59
|
+
* order by concate(first_name, ' ', last_name)
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* SQL snippets can be executed by calling the `execute` method and passing a `Kysely`
|
|
63
|
+
* instance as the only argument:
|
|
64
|
+
*
|
|
65
|
+
* ```ts
|
|
66
|
+
* const result = await sql<Person[]>`select * from person`.execute(db)
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* You can merge other `sql` expressions and queries using substitutions:
|
|
70
|
+
*
|
|
71
|
+
* ```ts
|
|
72
|
+
* const petName = db.selectFrom('pet').select('name').limit(1)
|
|
73
|
+
* const fullName = sql`concat(first_name, ' ', last_name)`
|
|
74
|
+
*
|
|
75
|
+
* sql`
|
|
76
|
+
* select ${fullName} as full_name, ${petName} as pet_name
|
|
77
|
+
* from person
|
|
78
|
+
* `
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* Substitutions also handle {@link ExpressionBuilder.ref},
|
|
82
|
+
* {@link DynamicModule.ref} and pretty much anything else you
|
|
83
|
+
* throw at it. Here's an example of calling a function in a
|
|
84
|
+
* type-safe way:
|
|
85
|
+
*
|
|
86
|
+
* ```ts
|
|
87
|
+
* db.selectFrom('person')
|
|
88
|
+
* .select([
|
|
89
|
+
* 'first_name',
|
|
90
|
+
* 'last_name',
|
|
91
|
+
* (eb) => sql<string>`concat(${eb.ref('first_name')}, ' ', ${eb.ref('last_name')})`.as('full_name')
|
|
92
|
+
* ])
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* don't know if that amount of ceremony is worth the small increase in
|
|
96
|
+
* type-safety though... But it's possible.
|
|
97
|
+
*/
|
|
98
|
+
export const sql = Object.assign((sqlFragments, ...parameters) => {
|
|
99
|
+
return new RawBuilder({
|
|
100
|
+
queryId: createQueryId(),
|
|
101
|
+
rawNode: RawNode.create(sqlFragments, parameters?.map(parseValueExpression) ?? []),
|
|
102
|
+
});
|
|
103
|
+
}, {
|
|
104
|
+
ref(columnReference) {
|
|
105
|
+
return new RawBuilder({
|
|
106
|
+
queryId: createQueryId(),
|
|
107
|
+
rawNode: RawNode.createWithChild(parseStringReference(columnReference)),
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
table(tableReference) {
|
|
111
|
+
return new RawBuilder({
|
|
112
|
+
queryId: createQueryId(),
|
|
113
|
+
rawNode: RawNode.createWithChild(parseTable(tableReference)),
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
id(...ids) {
|
|
117
|
+
const fragments = new Array(ids.length + 1).fill('.');
|
|
118
|
+
fragments[0] = '';
|
|
119
|
+
fragments[fragments.length - 1] = '';
|
|
120
|
+
return new RawBuilder({
|
|
121
|
+
queryId: createQueryId(),
|
|
122
|
+
rawNode: RawNode.create(fragments, ids.map(IdentifierNode.create)),
|
|
123
|
+
});
|
|
124
|
+
},
|
|
125
|
+
literal(value) {
|
|
126
|
+
return new RawBuilder({
|
|
127
|
+
queryId: createQueryId(),
|
|
128
|
+
rawNode: RawNode.createWithChild(ValueNode.createImmediate(value)),
|
|
129
|
+
});
|
|
130
|
+
},
|
|
131
|
+
raw(sql) {
|
|
132
|
+
return new RawBuilder({
|
|
133
|
+
queryId: createQueryId(),
|
|
134
|
+
rawNode: RawNode.createWithSql(sql),
|
|
135
|
+
});
|
|
136
|
+
},
|
|
137
|
+
join(array, separator = sql `, `) {
|
|
138
|
+
const nodes = new Array(2 * array.length - 1);
|
|
139
|
+
const sep = separator.toOperationNode();
|
|
140
|
+
for (let i = 0; i < array.length; ++i) {
|
|
141
|
+
nodes[2 * i] = parseValueExpression(array[i]);
|
|
142
|
+
if (i !== array.length - 1) {
|
|
143
|
+
nodes[2 * i + 1] = sep;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return new RawBuilder({
|
|
147
|
+
queryId: createQueryId(),
|
|
148
|
+
rawNode: RawNode.createWithChildren(nodes),
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
});
|
|
@@ -142,15 +142,17 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
|
|
|
142
142
|
* .execute()
|
|
143
143
|
* ```
|
|
144
144
|
*
|
|
145
|
-
* Raw expressions are also supported:
|
|
145
|
+
* Raw {@link sql} expressions are also supported:
|
|
146
146
|
*
|
|
147
147
|
* ```ts
|
|
148
|
+
* import { sql } from 'kysely'
|
|
149
|
+
*
|
|
148
150
|
* db.schema
|
|
149
151
|
* .createTable('pet')
|
|
150
152
|
* .addColumn(
|
|
151
153
|
* 'number_of_legs',
|
|
152
154
|
* 'integer',
|
|
153
|
-
* (col) => col.defaultTo(
|
|
155
|
+
* (col) => col.defaultTo(sql`any SQL here`)
|
|
154
156
|
* )
|
|
155
157
|
* .execute()
|
|
156
158
|
* ```
|
|
@@ -162,10 +164,12 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
|
|
|
162
164
|
* ### Examples
|
|
163
165
|
*
|
|
164
166
|
* ```ts
|
|
167
|
+
* import { sql } from 'kysely'
|
|
168
|
+
*
|
|
165
169
|
* db.schema
|
|
166
170
|
* .createTable('pet')
|
|
167
171
|
* .addColumn('number_of_legs', 'integer', (col) =>
|
|
168
|
-
* col.check(
|
|
172
|
+
* col.check(sql`number_of_legs < 5`)
|
|
169
173
|
* )
|
|
170
174
|
* .execute()
|
|
171
175
|
* ```
|
|
@@ -177,10 +181,12 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
|
|
|
177
181
|
* ### Examples
|
|
178
182
|
*
|
|
179
183
|
* ```ts
|
|
184
|
+
* import { sql } from 'kysely'
|
|
185
|
+
*
|
|
180
186
|
* db.schema
|
|
181
187
|
* .createTable('person')
|
|
182
188
|
* .addColumn('full_name', 'varchar(255)',
|
|
183
|
-
* (col) => col.generatedAlwaysAs(
|
|
189
|
+
* (col) => col.generatedAlwaysAs(sql`concat(first_name, ' ', last_name)`)
|
|
184
190
|
* )
|
|
185
191
|
* .execute()
|
|
186
192
|
* ```
|
|
@@ -300,15 +306,17 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
|
|
|
300
306
|
* .execute()
|
|
301
307
|
* ```
|
|
302
308
|
*
|
|
303
|
-
* Raw expressions are also supported:
|
|
309
|
+
* Raw {@link sql} expressions are also supported:
|
|
304
310
|
*
|
|
305
311
|
* ```ts
|
|
312
|
+
* import { sql } from 'kysely'
|
|
313
|
+
*
|
|
306
314
|
* db.schema
|
|
307
315
|
* .createTable('pet')
|
|
308
316
|
* .addColumn(
|
|
309
317
|
* 'number_of_legs',
|
|
310
318
|
* 'integer',
|
|
311
|
-
* (col) => col.defaultTo(
|
|
319
|
+
* (col) => col.defaultTo(sql`any SQL here`)
|
|
312
320
|
* )
|
|
313
321
|
* .execute()
|
|
314
322
|
* ```
|
|
@@ -320,10 +328,12 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
|
|
|
320
328
|
* ### Examples
|
|
321
329
|
*
|
|
322
330
|
* ```ts
|
|
331
|
+
* import { sql } from 'kysely'
|
|
332
|
+
*
|
|
323
333
|
* db.schema
|
|
324
334
|
* .createTable('pet')
|
|
325
335
|
* .addColumn('number_of_legs', 'integer', (col) =>
|
|
326
|
-
* col.check(
|
|
336
|
+
* col.check(sql`number_of_legs < 5`)
|
|
327
337
|
* )
|
|
328
338
|
* .execute()
|
|
329
339
|
* ```
|
|
@@ -335,10 +345,12 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
|
|
|
335
345
|
* ### Examples
|
|
336
346
|
*
|
|
337
347
|
* ```ts
|
|
348
|
+
* import { sql } from 'kysely'
|
|
349
|
+
*
|
|
338
350
|
* db.schema
|
|
339
351
|
* .createTable('person')
|
|
340
352
|
* .addColumn('full_name', 'varchar(255)',
|
|
341
|
-
* (col) => col.generatedAlwaysAs(
|
|
353
|
+
* (col) => col.generatedAlwaysAs(sql`concat(first_name, ' ', last_name)`)
|
|
342
354
|
* )
|
|
343
355
|
* .execute()
|
|
344
356
|
* ```
|
|
@@ -7,7 +7,6 @@ import { DataTypeNode, } from '../operation-node/data-type-node.js';
|
|
|
7
7
|
import { DropColumnNode } from '../operation-node/drop-column-node.js';
|
|
8
8
|
import { IdentifierNode } from '../operation-node/identifier-node.js';
|
|
9
9
|
import { RenameColumnNode } from '../operation-node/rename-column-node.js';
|
|
10
|
-
import { TableNode } from '../operation-node/table-node.js';
|
|
11
10
|
import { freeze } from '../util/object-utils.js';
|
|
12
11
|
import { preventAwait } from '../util/prevent-await.js';
|
|
13
12
|
import { ColumnDefinitionBuilder, } from './column-definition-builder.js';
|
|
@@ -20,6 +19,7 @@ import { CheckConstraintNode } from '../operation-node/check-constraint-node.js'
|
|
|
20
19
|
import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constraint-node.js';
|
|
21
20
|
import { ColumnNode } from '../operation-node/column-node.js';
|
|
22
21
|
import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
|
|
22
|
+
import { parseTable } from '../parser/table-parser.js';
|
|
23
23
|
/**
|
|
24
24
|
* This builder can be used to create a `alter table` query.
|
|
25
25
|
*/
|
|
@@ -32,7 +32,7 @@ export class AlterTableBuilder {
|
|
|
32
32
|
return new AlterTableExecutor({
|
|
33
33
|
...this.#props,
|
|
34
34
|
alterTableNode: AlterTableNode.cloneWith(this.#props.alterTableNode, {
|
|
35
|
-
renameTo:
|
|
35
|
+
renameTo: parseTable(newTableName),
|
|
36
36
|
}),
|
|
37
37
|
});
|
|
38
38
|
}
|
|
@@ -102,7 +102,7 @@ export class AlterTableBuilder {
|
|
|
102
102
|
addForeignKeyConstraint(constraintName, columns, targetTable, targetColumns) {
|
|
103
103
|
return new AlterTableAddForeignKeyConstraintBuilder({
|
|
104
104
|
...this.#props,
|
|
105
|
-
constraintBuilder: new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create),
|
|
105
|
+
constraintBuilder: new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), parseTable(targetTable), targetColumns.map(ColumnNode.create), constraintName)),
|
|
106
106
|
});
|
|
107
107
|
}
|
|
108
108
|
}
|
|
@@ -83,15 +83,17 @@ export interface ColumnDefinitionBuilderInterface {
|
|
|
83
83
|
* .execute()
|
|
84
84
|
* ```
|
|
85
85
|
*
|
|
86
|
-
* Raw expressions are also supported:
|
|
86
|
+
* Raw {@link sql} expressions are also supported:
|
|
87
87
|
*
|
|
88
88
|
* ```ts
|
|
89
|
+
* import { sql } from 'kysely'
|
|
90
|
+
*
|
|
89
91
|
* db.schema
|
|
90
92
|
* .createTable('pet')
|
|
91
93
|
* .addColumn(
|
|
92
94
|
* 'number_of_legs',
|
|
93
95
|
* 'integer',
|
|
94
|
-
* (col) => col.defaultTo(
|
|
96
|
+
* (col) => col.defaultTo(sql`any SQL here`)
|
|
95
97
|
* )
|
|
96
98
|
* .execute()
|
|
97
99
|
* ```
|
|
@@ -103,10 +105,12 @@ export interface ColumnDefinitionBuilderInterface {
|
|
|
103
105
|
* ### Examples
|
|
104
106
|
*
|
|
105
107
|
* ```ts
|
|
108
|
+
* import { sql } from 'kysely'
|
|
109
|
+
*
|
|
106
110
|
* db.schema
|
|
107
111
|
* .createTable('pet')
|
|
108
112
|
* .addColumn('number_of_legs', 'integer', (col) =>
|
|
109
|
-
* col.check(
|
|
113
|
+
* col.check(sql`number_of_legs < 5`)
|
|
110
114
|
* )
|
|
111
115
|
* .execute()
|
|
112
116
|
* ```
|
|
@@ -118,10 +122,12 @@ export interface ColumnDefinitionBuilderInterface {
|
|
|
118
122
|
* ### Examples
|
|
119
123
|
*
|
|
120
124
|
* ```ts
|
|
125
|
+
* import { sql } from 'kysely'
|
|
126
|
+
*
|
|
121
127
|
* db.schema
|
|
122
128
|
* .createTable('person')
|
|
123
129
|
* .addColumn('full_name', 'varchar(255)',
|
|
124
|
-
* (col) => col.generatedAlwaysAs(
|
|
130
|
+
* (col) => col.generatedAlwaysAs(sql`concat(first_name, ' ', last_name)`)
|
|
125
131
|
* )
|
|
126
132
|
* .execute()
|
|
127
133
|
* ```
|
|
@@ -235,15 +241,17 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
|
|
|
235
241
|
* .execute()
|
|
236
242
|
* ```
|
|
237
243
|
*
|
|
238
|
-
* Raw expressions are also supported:
|
|
244
|
+
* Raw {@link sql} expressions are also supported:
|
|
239
245
|
*
|
|
240
246
|
* ```ts
|
|
247
|
+
* import { sql } from 'kysely'
|
|
248
|
+
*
|
|
241
249
|
* db.schema
|
|
242
250
|
* .createTable('pet')
|
|
243
251
|
* .addColumn(
|
|
244
252
|
* 'number_of_legs',
|
|
245
253
|
* 'integer',
|
|
246
|
-
* (col) => col.defaultTo(
|
|
254
|
+
* (col) => col.defaultTo(sql`any SQL here`)
|
|
247
255
|
* )
|
|
248
256
|
* .execute()
|
|
249
257
|
* ```
|
|
@@ -255,10 +263,12 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
|
|
|
255
263
|
* ### Examples
|
|
256
264
|
*
|
|
257
265
|
* ```ts
|
|
266
|
+
* import { sql } from 'kysely'
|
|
267
|
+
*
|
|
258
268
|
* db.schema
|
|
259
269
|
* .createTable('pet')
|
|
260
270
|
* .addColumn('number_of_legs', 'integer', (col) =>
|
|
261
|
-
* col.check(
|
|
271
|
+
* col.check(sql`number_of_legs < 5`)
|
|
262
272
|
* )
|
|
263
273
|
* .execute()
|
|
264
274
|
* ```
|
|
@@ -270,10 +280,12 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
|
|
|
270
280
|
* ### Examples
|
|
271
281
|
*
|
|
272
282
|
* ```ts
|
|
283
|
+
* import { sql } from 'kysely'
|
|
284
|
+
*
|
|
273
285
|
* db.schema
|
|
274
286
|
* .createTable('person')
|
|
275
287
|
* .addColumn('full_name', 'varchar(255)',
|
|
276
|
-
* (col) => col.generatedAlwaysAs(
|
|
288
|
+
* (col) => col.generatedAlwaysAs(sql`concat(first_name, ' ', last_name)`)
|
|
277
289
|
* )
|
|
278
290
|
* .execute()
|
|
279
291
|
* ```
|
|
@@ -34,10 +34,12 @@ export declare class CreateIndexBuilder implements OperationNodeSource, Compilab
|
|
|
34
34
|
* ### Examples
|
|
35
35
|
*
|
|
36
36
|
* ```ts
|
|
37
|
+
* import { sql } from 'kysely'
|
|
38
|
+
*
|
|
37
39
|
* await db.schema
|
|
38
40
|
* .createIndex('person_first_name_index')
|
|
39
41
|
* .on('person')
|
|
40
|
-
* .expression(
|
|
42
|
+
* .expression(sql`first_name COLLATE "fi_FI"`)
|
|
41
43
|
* .execute()
|
|
42
44
|
* ```
|
|
43
45
|
*/
|
|
@@ -65,10 +65,12 @@ export class CreateIndexBuilder {
|
|
|
65
65
|
* ### Examples
|
|
66
66
|
*
|
|
67
67
|
* ```ts
|
|
68
|
+
* import { sql } from 'kysely'
|
|
69
|
+
*
|
|
68
70
|
* await db.schema
|
|
69
71
|
* .createIndex('person_first_name_index')
|
|
70
72
|
* .on('person')
|
|
71
|
-
* .expression(
|
|
73
|
+
* .expression(sql`first_name COLLATE "fi_FI"`)
|
|
72
74
|
* .execute()
|
|
73
75
|
* ```
|
|
74
76
|
*/
|
|
@@ -39,13 +39,15 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
|
|
|
39
39
|
* ### Examples
|
|
40
40
|
*
|
|
41
41
|
* ```ts
|
|
42
|
+
* import { sql } from 'kysely'
|
|
43
|
+
*
|
|
42
44
|
* await db.schema
|
|
43
45
|
* .createTable('person')
|
|
44
46
|
* .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
|
|
45
47
|
* .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
|
|
46
48
|
* .addColumn('last_name', 'varchar(255)')
|
|
47
49
|
* .addColumn('bank_balance', 'numeric(8, 2)')
|
|
48
|
-
* .addColumn('data',
|
|
50
|
+
* .addColumn('data', sql`customtype`)
|
|
49
51
|
* .addColumn('parent_id', 'integer', (col) =>
|
|
50
52
|
* col.references('person.id').onDelete('cascade'))
|
|
51
53
|
* )
|
|
@@ -111,7 +113,9 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
|
|
|
111
113
|
* ### Examples
|
|
112
114
|
*
|
|
113
115
|
* ```ts
|
|
114
|
-
*
|
|
116
|
+
* import { sql } from 'kysely'
|
|
117
|
+
*
|
|
118
|
+
* addCheckConstraint('check_legs', sql`number_of_legs < 5`)
|
|
115
119
|
* ```
|
|
116
120
|
*/
|
|
117
121
|
addCheckConstraint(constraintName: string, checkExpression: AnyRawBuilder): CreateTableBuilder<TB, C>;
|
|
@@ -6,12 +6,12 @@ import { ColumnDefinitionBuilder } from './column-definition-builder.js';
|
|
|
6
6
|
import { freeze, noop } from '../util/object-utils.js';
|
|
7
7
|
import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constraint-node.js';
|
|
8
8
|
import { ColumnNode } from '../operation-node/column-node.js';
|
|
9
|
-
import { TableNode } from '../operation-node/table-node.js';
|
|
10
9
|
import { ForeignKeyConstraintBuilder } from './foreign-key-constraint-builder.js';
|
|
11
10
|
import { parseDataTypeExpression, } from '../parser/data-type-parser.js';
|
|
12
11
|
import { PrimaryConstraintNode } from '../operation-node/primary-constraint-node.js';
|
|
13
12
|
import { UniqueConstraintNode } from '../operation-node/unique-constraint-node.js';
|
|
14
13
|
import { CheckConstraintNode } from '../operation-node/check-constraint-node.js';
|
|
14
|
+
import { parseTable } from '../parser/table-parser.js';
|
|
15
15
|
/**
|
|
16
16
|
* This builder can be used to create a `create table` query.
|
|
17
17
|
*/
|
|
@@ -66,13 +66,15 @@ export class CreateTableBuilder {
|
|
|
66
66
|
* ### Examples
|
|
67
67
|
*
|
|
68
68
|
* ```ts
|
|
69
|
+
* import { sql } from 'kysely'
|
|
70
|
+
*
|
|
69
71
|
* await db.schema
|
|
70
72
|
* .createTable('person')
|
|
71
73
|
* .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
|
|
72
74
|
* .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
|
|
73
75
|
* .addColumn('last_name', 'varchar(255)')
|
|
74
76
|
* .addColumn('bank_balance', 'numeric(8, 2)')
|
|
75
|
-
* .addColumn('data',
|
|
77
|
+
* .addColumn('data', sql`customtype`)
|
|
76
78
|
* .addColumn('parent_id', 'integer', (col) =>
|
|
77
79
|
* col.references('person.id').onDelete('cascade'))
|
|
78
80
|
* )
|
|
@@ -154,7 +156,9 @@ export class CreateTableBuilder {
|
|
|
154
156
|
* ### Examples
|
|
155
157
|
*
|
|
156
158
|
* ```ts
|
|
157
|
-
*
|
|
159
|
+
* import { sql } from 'kysely'
|
|
160
|
+
*
|
|
161
|
+
* addCheckConstraint('check_legs', sql`number_of_legs < 5`)
|
|
158
162
|
* ```
|
|
159
163
|
*/
|
|
160
164
|
addCheckConstraint(constraintName, checkExpression) {
|
|
@@ -193,7 +197,7 @@ export class CreateTableBuilder {
|
|
|
193
197
|
* ```
|
|
194
198
|
*/
|
|
195
199
|
addForeignKeyConstraint(constraintName, columns, targetTable, targetColumns, build = noop) {
|
|
196
|
-
const builder = build(new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create),
|
|
200
|
+
const builder = build(new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), parseTable(targetTable), targetColumns.map(ColumnNode.create), constraintName)));
|
|
197
201
|
return new CreateTableBuilder({
|
|
198
202
|
...this.#props,
|
|
199
203
|
createTableNode: CreateTableNode.cloneWithConstraint(this.#props.createTableNode, builder.toOperationNode()),
|
|
@@ -26,9 +26,9 @@ export declare class CreateViewBuilder implements OperationNodeSource, Compilabl
|
|
|
26
26
|
*
|
|
27
27
|
* WARNING!
|
|
28
28
|
* Some dialects don't support parameterized queries in DDL statements and therefore
|
|
29
|
-
* the query or
|
|
30
|
-
* opening an SQL injection vulnerability. DO NOT pass unchecked user input
|
|
31
|
-
* the query or
|
|
29
|
+
* the query or raw {@link sql } expression passed here is interpolated into a single
|
|
30
|
+
* string opening an SQL injection vulnerability. DO NOT pass unchecked user input
|
|
31
|
+
* into the query or raw expression passed to this method!
|
|
32
32
|
*/
|
|
33
33
|
as(query: AnySelectQueryBuilder | AnyRawBuilder): CreateViewBuilder;
|
|
34
34
|
toOperationNode(): CreateViewNode;
|
|
@@ -62,9 +62,9 @@ export class CreateViewBuilder {
|
|
|
62
62
|
*
|
|
63
63
|
* WARNING!
|
|
64
64
|
* Some dialects don't support parameterized queries in DDL statements and therefore
|
|
65
|
-
* the query or
|
|
66
|
-
* opening an SQL injection vulnerability. DO NOT pass unchecked user input
|
|
67
|
-
* the query or
|
|
65
|
+
* the query or raw {@link sql } expression passed here is interpolated into a single
|
|
66
|
+
* string opening an SQL injection vulnerability. DO NOT pass unchecked user input
|
|
67
|
+
* into the query or raw expression passed to this method!
|
|
68
68
|
*/
|
|
69
69
|
as(query) {
|
|
70
70
|
const queryNode = query
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
/// <reference types="./query-id.d.ts" />
|
|
2
|
-
import { freeze } from './object-utils.js';
|
|
3
2
|
import { randomString } from './random-string.js';
|
|
4
3
|
export function createQueryId() {
|
|
5
|
-
return
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
return new LazyQueryId();
|
|
5
|
+
}
|
|
6
|
+
class LazyQueryId {
|
|
7
|
+
#queryId;
|
|
8
|
+
get queryId() {
|
|
9
|
+
if (this.#queryId === undefined) {
|
|
10
|
+
this.#queryId = randomString(8);
|
|
11
|
+
}
|
|
12
|
+
return this.#queryId;
|
|
13
|
+
}
|
|
8
14
|
}
|
|
@@ -1,5 +1,68 @@
|
|
|
1
1
|
/// <reference types="./random-string.d.ts" />
|
|
2
|
-
const CHARS =
|
|
2
|
+
const CHARS = [
|
|
3
|
+
'A',
|
|
4
|
+
'B',
|
|
5
|
+
'C',
|
|
6
|
+
'D',
|
|
7
|
+
'E',
|
|
8
|
+
'F',
|
|
9
|
+
'G',
|
|
10
|
+
'H',
|
|
11
|
+
'I',
|
|
12
|
+
'J',
|
|
13
|
+
'K',
|
|
14
|
+
'L',
|
|
15
|
+
'M',
|
|
16
|
+
'N',
|
|
17
|
+
'O',
|
|
18
|
+
'P',
|
|
19
|
+
'Q',
|
|
20
|
+
'R',
|
|
21
|
+
'S',
|
|
22
|
+
'T',
|
|
23
|
+
'U',
|
|
24
|
+
'V',
|
|
25
|
+
'W',
|
|
26
|
+
'X',
|
|
27
|
+
'Y',
|
|
28
|
+
'Z',
|
|
29
|
+
'a',
|
|
30
|
+
'b',
|
|
31
|
+
'c',
|
|
32
|
+
'd',
|
|
33
|
+
'e',
|
|
34
|
+
'f',
|
|
35
|
+
'g',
|
|
36
|
+
'h',
|
|
37
|
+
'i',
|
|
38
|
+
'j',
|
|
39
|
+
'k',
|
|
40
|
+
'l',
|
|
41
|
+
'm',
|
|
42
|
+
'n',
|
|
43
|
+
'o',
|
|
44
|
+
'p',
|
|
45
|
+
'q',
|
|
46
|
+
'r',
|
|
47
|
+
's',
|
|
48
|
+
't',
|
|
49
|
+
'u',
|
|
50
|
+
'v',
|
|
51
|
+
'w',
|
|
52
|
+
'x',
|
|
53
|
+
'y',
|
|
54
|
+
'z',
|
|
55
|
+
'0',
|
|
56
|
+
'1',
|
|
57
|
+
'2',
|
|
58
|
+
'3',
|
|
59
|
+
'4',
|
|
60
|
+
'5',
|
|
61
|
+
'6',
|
|
62
|
+
'7',
|
|
63
|
+
'8',
|
|
64
|
+
'9',
|
|
65
|
+
];
|
|
3
66
|
export function randomString(length) {
|
|
4
67
|
let chars = '';
|
|
5
68
|
for (let i = 0; i < length; ++i) {
|
|
@@ -8,5 +71,5 @@ export function randomString(length) {
|
|
|
8
71
|
return chars;
|
|
9
72
|
}
|
|
10
73
|
function randomChar() {
|
|
11
|
-
return CHARS[
|
|
74
|
+
return CHARS[~~(Math.random() * CHARS.length)];
|
|
12
75
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kysely",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.1",
|
|
4
4
|
"description": "Type safe SQL query builder",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -47,22 +47,22 @@
|
|
|
47
47
|
"@types/node": "^16.11.9"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@types/better-sqlite3": "^7.4.
|
|
50
|
+
"@types/better-sqlite3": "^7.4.2",
|
|
51
51
|
"@types/chai": "^4.3.0",
|
|
52
52
|
"@types/chai-subset": "^1.3.3",
|
|
53
|
-
"@types/mocha": "^9.
|
|
54
|
-
"@types/pg": "^8.6.
|
|
55
|
-
"better-sqlite3": "^7.
|
|
56
|
-
"chai": "^4.3.
|
|
53
|
+
"@types/mocha": "^9.1.0",
|
|
54
|
+
"@types/pg": "^8.6.4",
|
|
55
|
+
"better-sqlite3": "^7.5.0",
|
|
56
|
+
"chai": "^4.3.6",
|
|
57
57
|
"chai-subset": "^1.6.0",
|
|
58
|
-
"esbuild": "^0.14.
|
|
59
|
-
"mocha": "^9.
|
|
58
|
+
"esbuild": "^0.14.22",
|
|
59
|
+
"mocha": "^9.2.0",
|
|
60
60
|
"mysql2": "^2.3.3",
|
|
61
|
-
"pg": "^8.7.
|
|
62
|
-
"playwright": "^1.
|
|
61
|
+
"pg": "^8.7.3",
|
|
62
|
+
"playwright": "^1.19.1",
|
|
63
63
|
"prettier": "^2.5.1",
|
|
64
|
-
"tsd": "^0.19.
|
|
65
|
-
"typedoc": "^0.22.
|
|
66
|
-
"typescript": "4.5.
|
|
64
|
+
"tsd": "^0.19.1",
|
|
65
|
+
"typedoc": "^0.22.11",
|
|
66
|
+
"typescript": "4.5.5"
|
|
67
67
|
}
|
|
68
68
|
}
|