bun-query-builder 0.1.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.
- package/LICENSE.md +21 -0
- package/README.md +150 -0
- package/dist/actions/explain.d.ts +1 -0
- package/dist/actions/file.d.ts +2 -0
- package/dist/actions/index.d.ts +8 -0
- package/dist/actions/introspect.d.ts +2 -0
- package/dist/actions/migrate.d.ts +3 -0
- package/dist/actions/ping.d.ts +1 -0
- package/dist/actions/sql.d.ts +2 -0
- package/dist/actions/unsafe.d.ts +2 -0
- package/dist/actions/wait-ready.d.ts +2 -0
- package/dist/client.d.ts +427 -0
- package/dist/config.d.ts +3 -0
- package/dist/factory.d.ts +7 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +3934 -0
- package/dist/loader.d.ts +6 -0
- package/dist/meta.d.ts +14 -0
- package/dist/migrations.d.ts +65 -0
- package/dist/schema.d.ts +220 -0
- package/dist/types.d.ts +216 -0
- package/package.json +99 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Open Web Foundation
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
<p align="center"><img src=".github/art/cover.jpg" alt="Social Card of this repo"></p>
|
|
2
|
+
|
|
3
|
+
[![npm version][npm-version-src]][npm-version-href]
|
|
4
|
+
[![GitHub Actions][github-actions-src]][github-actions-href]
|
|
5
|
+
[](http://commitizen.github.io/cz-cli/)
|
|
6
|
+
<!-- [![npm downloads][npm-downloads-src]][npm-downloads-href] -->
|
|
7
|
+
<!-- [![Codecov][codecov-src]][codecov-href] -->
|
|
8
|
+
|
|
9
|
+
# bun-query-builder
|
|
10
|
+
|
|
11
|
+
Fully-typed, model-driven Query Builder for Bun’s native `sql`.
|
|
12
|
+
|
|
13
|
+
Define your data model once and get a type-safe query experience _(a la Kysely/Laravel)_, powered by Bun’s tagged templates for safety and performance.
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
- **Typed from Models**: Infer tables/columns/PKs from your model files; `selectFrom('users')` and `where({ active: true })` are typed.
|
|
18
|
+
- **Fluent Builder**: `select/insert/update/delete`, `where/andWhere/orWhere`, `join/leftJoin/rightJoin/crossJoin`, `groupBy/having`, `union/unionAll`.
|
|
19
|
+
- **Relations**: `with(...)`, `withCount(...)`, `whereHas(...)`, `selectAllRelations()` with configurable aliasing.
|
|
20
|
+
- **Utilities**: `distinct/distinctOn`, `orderByDesc/latest/oldest/inRandomOrder`, `whereColumn/whereRaw/groupByRaw/havingRaw`, JSON/date helpers.
|
|
21
|
+
- **Pagination**: `paginate`, `simplePaginate`, `cursorPaginate`, plus `chunk/chunkById/eachById`.
|
|
22
|
+
- **Transactions**: `transaction` with retries/backoff/isolation/onRetry/afterCommit; `savepoint`; distributed tx helpers.
|
|
23
|
+
- **Configurable**: Dialect hints, timestamps, alias strategies, relation FK formats, JSON mode, random function, shared lock syntax.
|
|
24
|
+
- **Bun API passthroughs**: `unsafe`, `file`, `simple`, pool `reserve/release`, `close`, `ping/waitForReady`.
|
|
25
|
+
- **CLI**: Introspection, query printing, connectivity checks, file/unsafe execution, explain.
|
|
26
|
+
|
|
27
|
+
> Note: LISTEN/NOTIFY and COPY helpers are scaffolded and will be wired as Bun exposes native APIs.
|
|
28
|
+
|
|
29
|
+
## Get Started
|
|
30
|
+
|
|
31
|
+
### Installation
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
bun add bun-query-builder
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Usage
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { buildDatabaseSchema, buildSchemaMeta, createQueryBuilder } from 'bun-query-builder'
|
|
41
|
+
|
|
42
|
+
// Load or define your model files (see docs for model shape)
|
|
43
|
+
const models = {
|
|
44
|
+
User: { name: 'User', table: 'users', primaryKey: 'id', attributes: { id: { validation: { rule: {} } }, name: { validation: { rule: {} } }, active: { validation: { rule: {} } } } },
|
|
45
|
+
} as const
|
|
46
|
+
|
|
47
|
+
const schema = buildDatabaseSchema(models as any)
|
|
48
|
+
const meta = buildSchemaMeta(models as any)
|
|
49
|
+
const db = createQueryBuilder<typeof schema>({ schema, meta })
|
|
50
|
+
|
|
51
|
+
// Fully-typed query
|
|
52
|
+
const q = db
|
|
53
|
+
.selectFrom('users')
|
|
54
|
+
.where({ active: true })
|
|
55
|
+
.orderBy('created_at', 'desc')
|
|
56
|
+
.limit(10)
|
|
57
|
+
|
|
58
|
+
const rows = await q.execute()
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Migrations
|
|
62
|
+
|
|
63
|
+
Generate and execute migrations from your models:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import { generateMigration, executeMigration } from 'bun-query-builder'
|
|
67
|
+
|
|
68
|
+
// Generate migration from models directory
|
|
69
|
+
const migration = await generateMigration('./models', {
|
|
70
|
+
dialect: 'postgres',
|
|
71
|
+
apply: true,
|
|
72
|
+
full: true
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
// Execute the migration
|
|
76
|
+
await executeMigration(migration)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### CLI
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Print inferred schema from model dir
|
|
83
|
+
query-builder introspect ./app/Models --verbose
|
|
84
|
+
|
|
85
|
+
# Print a sample SQL (text) for a table
|
|
86
|
+
query-builder sql ./app/Models users --limit 5
|
|
87
|
+
|
|
88
|
+
# Connectivity:
|
|
89
|
+
query-builder ping
|
|
90
|
+
query-builder wait-ready --attempts 30 --delay 250
|
|
91
|
+
|
|
92
|
+
# Execute a file or unsafe string (be careful!)
|
|
93
|
+
query-builder file ./migrations/seed.sql
|
|
94
|
+
query-builder unsafe "SELECT * FROM users WHERE id = $1" --params "[1]"
|
|
95
|
+
|
|
96
|
+
# Explain a query
|
|
97
|
+
query-builder explain "SELECT * FROM users WHERE active = true"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Testing
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
bun test
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Changelog
|
|
107
|
+
|
|
108
|
+
Please see our [releases](https://github.com/stackjs/bun-query-builder/releases) page for more information on what has changed recently.
|
|
109
|
+
|
|
110
|
+
## Contributing
|
|
111
|
+
|
|
112
|
+
Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details.
|
|
113
|
+
|
|
114
|
+
## Community
|
|
115
|
+
|
|
116
|
+
For help, discussion about best practices, or any other conversation that would benefit from being searchable:
|
|
117
|
+
|
|
118
|
+
[Discussions on GitHub](https://github.com/stacksjs/ts-starter/discussions)
|
|
119
|
+
|
|
120
|
+
For casual chit-chat with others using this package:
|
|
121
|
+
|
|
122
|
+
[Join the Stacks Discord Server](https://discord.gg/stacksjs)
|
|
123
|
+
|
|
124
|
+
## Postcardware
|
|
125
|
+
|
|
126
|
+
“Software that is free, but hopes for a postcard.” We love receiving postcards from around the world showing where Stacks is being used! We showcase them on our website too.
|
|
127
|
+
|
|
128
|
+
Our address: Stacks.js, 12665 Village Ln #2306, Playa Vista, CA 90094, United States 🌎
|
|
129
|
+
|
|
130
|
+
## Sponsors
|
|
131
|
+
|
|
132
|
+
We would like to extend our thanks to the following sponsors for funding Stacks development. If you are interested in becoming a sponsor, please reach out to us.
|
|
133
|
+
|
|
134
|
+
- [JetBrains](https://www.jetbrains.com/)
|
|
135
|
+
- [The Solana Foundation](https://solana.com/)
|
|
136
|
+
|
|
137
|
+
## License
|
|
138
|
+
|
|
139
|
+
The MIT License (MIT). Please see [LICENSE](LICENSE.md) for more information.
|
|
140
|
+
|
|
141
|
+
Made with 💙
|
|
142
|
+
|
|
143
|
+
<!-- Badges -->
|
|
144
|
+
[npm-version-src]: https://img.shields.io/npm/v/bun-query-builder?style=flat-square
|
|
145
|
+
[npm-version-href]: https://npmjs.com/package/bun-query-builder
|
|
146
|
+
[github-actions-src]: https://img.shields.io/github/actions/workflow/status/stacksjs/ts-starter/ci.yml?style=flat-square&branch=main
|
|
147
|
+
[github-actions-href]: https://github.com/stacksjs/ts-starter/actions?query=workflow%3Aci
|
|
148
|
+
|
|
149
|
+
<!-- [codecov-src]: https://img.shields.io/codecov/c/gh/stacksjs/ts-starter/main?style=flat-square
|
|
150
|
+
[codecov-href]: https://codecov.io/gh/stacksjs/ts-starter -->
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function explain(sql: string): void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { explain } from './explain';
|
|
2
|
+
export { file } from './file';
|
|
3
|
+
export { introspect } from './introspect';
|
|
4
|
+
export { executeMigration, generateMigration } from './migrate';
|
|
5
|
+
export { ping } from './ping';
|
|
6
|
+
export { sql } from './sql';
|
|
7
|
+
export { unsafe } from './unsafe';
|
|
8
|
+
export { waitReady } from './wait-ready';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { GenerateMigrationResult, MigrateOptions } from '../types';
|
|
2
|
+
export declare function generateMigration(dir: string, opts?: MigrateOptions): Promise<GenerateMigrationResult>;
|
|
3
|
+
export declare function executeMigration(migration: GenerateMigrationResult): Promise<boolean>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ping(): void;
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { config } from './config';
|
|
2
|
+
import type { DatabaseSchema } from './schema';
|
|
3
|
+
import type { SchemaMeta } from './meta';
|
|
4
|
+
export declare function createQueryBuilder<DB extends DatabaseSchema<any>>(state?: Partial<InternalState>): QueryBuilder<DB>;
|
|
5
|
+
export declare interface WhereRaw {
|
|
6
|
+
raw: any
|
|
7
|
+
}
|
|
8
|
+
export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> {
|
|
9
|
+
distinct: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
10
|
+
distinctOn: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
11
|
+
selectRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
12
|
+
where: (expr: WhereExpression<DB[TTable]['columns']> | string, op?: WhereOperator, value?: any) => SelectQueryBuilder<DB, TTable, TSelected>
|
|
13
|
+
whereRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
14
|
+
whereColumn: (left: string, op: WhereOperator, right: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
15
|
+
orWhereColumn: (left: string, op: WhereOperator, right: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
16
|
+
whereIn: (column: keyof DB[TTable]['columns'] & string, values: any[] | { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
17
|
+
orWhereIn: (column: keyof DB[TTable]['columns'] & string, values: any[] | { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
18
|
+
whereNotIn: (column: keyof DB[TTable]['columns'] & string, values: any[] | { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
19
|
+
orWhereNotIn: (column: keyof DB[TTable]['columns'] & string, values: any[] | { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
20
|
+
whereLike: (column: keyof DB[TTable]['columns'] & string, pattern: string, caseSensitive?: boolean) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
21
|
+
whereILike?: (column: keyof DB[TTable]['columns'] & string, pattern: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
22
|
+
orWhereLike: (column: keyof DB[TTable]['columns'] & string, pattern: string, caseSensitive?: boolean) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
23
|
+
orWhereILike?: (column: keyof DB[TTable]['columns'] & string, pattern: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
24
|
+
whereNotLike: (column: keyof DB[TTable]['columns'] & string, pattern: string, caseSensitive?: boolean) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
25
|
+
whereNotILike?: (column: keyof DB[TTable]['columns'] & string, pattern: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
26
|
+
orWhereNotLike: (column: keyof DB[TTable]['columns'] & string, pattern: string, caseSensitive?: boolean) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
27
|
+
orWhereNotILike?: (column: keyof DB[TTable]['columns'] & string, pattern: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
28
|
+
whereAny: (columns: (keyof DB[TTable]['columns'] & string)[], op: WhereOperator, value: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
29
|
+
whereAll: (columns: (keyof DB[TTable]['columns'] & string)[], op: WhereOperator, value: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
30
|
+
whereNone: (columns: (keyof DB[TTable]['columns'] & string)[], op: WhereOperator, value: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
31
|
+
whereNested: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
32
|
+
orWhereNested: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
33
|
+
whereDate: (column: string, op: WhereOperator, date: string | Date) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
34
|
+
whereBetween: (column: string, start: any, end: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
35
|
+
whereNotBetween: (column: string, start: any, end: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
36
|
+
whereJsonContains: (column: string, json: unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
37
|
+
whereJsonPath?: (path: string, op: WhereOperator, value: unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
38
|
+
andWhere: (expr: WhereExpression<DB[TTable]['columns']> | string, op?: WhereOperator, value?: any) => SelectQueryBuilder<DB, TTable, TSelected>
|
|
39
|
+
orWhere: (expr: WhereExpression<DB[TTable]['columns']> | string, op?: WhereOperator, value?: any) => SelectQueryBuilder<DB, TTable, TSelected>
|
|
40
|
+
orderBy: (column: ColumnName<DB, TTable>, direction?: SortDirection) => SelectQueryBuilder<DB, TTable, TSelected>
|
|
41
|
+
orderByDesc: (column: ColumnName<DB, TTable>) => SelectQueryBuilder<DB, TTable, TSelected>
|
|
42
|
+
inRandomOrder: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
43
|
+
reorder: (column: string, direction?: 'asc' | 'desc') => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
44
|
+
latest: (column?: keyof DB[TTable]['columns'] & string) => SelectQueryBuilder<DB, TTable, TSelected>
|
|
45
|
+
oldest: (column?: keyof DB[TTable]['columns'] & string) => SelectQueryBuilder<DB, TTable, TSelected>
|
|
46
|
+
limit: (n: number) => SelectQueryBuilder<DB, TTable, TSelected>
|
|
47
|
+
offset: (n: number) => SelectQueryBuilder<DB, TTable, TSelected>
|
|
48
|
+
withTimeout?: (ms: number) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
49
|
+
abort?: (signal: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
50
|
+
join: <T2 extends keyof DB & string>(
|
|
51
|
+
table: T2,
|
|
52
|
+
onLeft: JoinColumn<DB, TJoined | T2>,
|
|
53
|
+
operator: '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like',
|
|
54
|
+
onRight: JoinColumn<DB, TJoined | T2>,
|
|
55
|
+
) => SelectQueryBuilder<DB, TTable, TSelected, TJoined | T2>
|
|
56
|
+
joinSub: (sub: { toSQL: () => any }, alias: string, onLeft: string, operator: WhereOperator, onRight: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
57
|
+
innerJoin: <T2 extends keyof DB & string>(
|
|
58
|
+
table: T2,
|
|
59
|
+
onLeft: JoinColumn<DB, TJoined | T2>,
|
|
60
|
+
operator: '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like',
|
|
61
|
+
onRight: JoinColumn<DB, TJoined | T2>,
|
|
62
|
+
) => SelectQueryBuilder<DB, TTable, TSelected, TJoined | T2>
|
|
63
|
+
leftJoin: <T2 extends keyof DB & string>(
|
|
64
|
+
table: T2,
|
|
65
|
+
onLeft: JoinColumn<DB, TJoined | T2>,
|
|
66
|
+
operator: '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like',
|
|
67
|
+
onRight: JoinColumn<DB, TJoined | T2>,
|
|
68
|
+
) => SelectQueryBuilder<DB, TTable, TSelected, TJoined | T2>
|
|
69
|
+
leftJoinSub: (sub: { toSQL: () => any }, alias: string, onLeft: string, operator: WhereOperator, onRight: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
70
|
+
rightJoin: <T2 extends keyof DB & string>(
|
|
71
|
+
table: T2,
|
|
72
|
+
onLeft: JoinColumn<DB, TJoined | T2>,
|
|
73
|
+
operator: '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like',
|
|
74
|
+
onRight: JoinColumn<DB, TJoined | T2>,
|
|
75
|
+
) => SelectQueryBuilder<DB, TTable, TSelected, TJoined | T2>
|
|
76
|
+
crossJoin: <T2 extends keyof DB & string>(table: T2) => SelectQueryBuilder<DB, TTable, TSelected, TJoined | T2>
|
|
77
|
+
crossJoinSub: (sub: { toSQL: () => any }, alias: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
78
|
+
groupBy: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
79
|
+
groupByRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
80
|
+
having: (expr: WhereExpression<any>) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
81
|
+
havingRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
82
|
+
addSelect: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
83
|
+
selectAll?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
84
|
+
orderByRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
85
|
+
union: (other: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
86
|
+
unionAll: (other: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
87
|
+
forPage: (page: number, perPage: number) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
88
|
+
selectAllRelations?: () => SelectQueryBuilder<DB, TTable, any, TJoined>
|
|
89
|
+
whereNull?: (column: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
90
|
+
whereNotNull?: (column: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
91
|
+
whereExists?: (subquery: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
92
|
+
whereJsonDoesntContain?: (column: string, json: unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
93
|
+
whereJsonContainsKey?: (path: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
94
|
+
whereJsonDoesntContainKey?: (path: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
95
|
+
whereJsonLength?: (path: string, opOrLen: WhereOperator | number, len?: number) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
96
|
+
with?: (...relations: string[]) => SelectQueryBuilder<DB, TTable, TSelected, any>
|
|
97
|
+
lockForUpdate: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
98
|
+
sharedLock: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
99
|
+
withCTE: (name: string, sub: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
100
|
+
withRecursive: (name: string, sub: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
101
|
+
value: <K extends keyof TSelected & string>(column: K) => Promise<SelectedRow<DB, TTable, TSelected>[K]>
|
|
102
|
+
pluck: {
|
|
103
|
+
/**
|
|
104
|
+
* # `pluck(column)`
|
|
105
|
+
*
|
|
106
|
+
* Returns an array of values for a single column.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* const names = await db.selectFrom('users').pluck('name')
|
|
111
|
+
* const ids = await db.selectFrom('users').orderBy('id').pluck('id')
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
<K extends keyof TSelected & string>(column: K): Promise<SelectedRow<DB, TTable, TSelected>[K][]>
|
|
115
|
+
/**
|
|
116
|
+
* # `pluck(column, key)`
|
|
117
|
+
*
|
|
118
|
+
* Returns an object keyed by the given key column.
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```ts
|
|
122
|
+
* const byId = await db.selectFrom('users').pluck('email', 'id')
|
|
123
|
+
* const map = await db.selectFrom('users').pluck('name', 'email')
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
<K extends keyof TSelected & string, K2 extends keyof TSelected & string>(column: K, key: K2): Promise<Record<string, SelectedRow<DB, TTable, TSelected>[K]>>
|
|
127
|
+
}
|
|
128
|
+
exists: () => Promise<boolean>
|
|
129
|
+
doesntExist: () => Promise<boolean>
|
|
130
|
+
cursorPaginate: (perPage: number, cursor?: string | number, column?: string, direction?: 'asc' | 'desc') => Promise<{ data: any[], meta: { perPage: number, nextCursor: string | number | null } }>
|
|
131
|
+
chunk: (size: number, handler: (rows: any[]) => Promise<void> | void) => Promise<void>
|
|
132
|
+
chunkById: (size: number, column?: string, handler?: (rows: any[]) => Promise<void> | void) => Promise<void>
|
|
133
|
+
eachById: (size: number, column?: string, handler?: (row: any) => Promise<void> | void) => Promise<void>
|
|
134
|
+
when: (condition: any, then: (qb: any) => any, otherwise?: (qb: any) => any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
135
|
+
tap: (fn: (qb: any) => any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
136
|
+
dump: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
137
|
+
dd: () => never
|
|
138
|
+
explain: () => Promise<any[]>
|
|
139
|
+
simple: () => any
|
|
140
|
+
toText?: () => string
|
|
141
|
+
paginate: (perPage: number, page?: number) => Promise<{ data: SelectedRow<DB, TTable, TSelected>[], meta: { perPage: number, page: number, total: number, lastPage: number } }>
|
|
142
|
+
simplePaginate: (perPage: number, page?: number) => Promise<{ data: SelectedRow<DB, TTable, TSelected>[], meta: { perPage: number, page: number, hasMore: boolean } }>
|
|
143
|
+
toSQL: () => string
|
|
144
|
+
execute: () => Promise<SelectedRow<DB, TTable, TSelected>[]>
|
|
145
|
+
executeTakeFirst: () => Promise<SelectedRow<DB, TTable, TSelected> | undefined>
|
|
146
|
+
get: () => Promise<SelectedRow<DB, TTable, TSelected>[]>
|
|
147
|
+
first: () => Promise<SelectedRow<DB, TTable, TSelected> | undefined>
|
|
148
|
+
firstOrFail: () => Promise<SelectedRow<DB, TTable, TSelected>>
|
|
149
|
+
find: (id: any) => Promise<SelectedRow<DB, TTable, TSelected> | undefined>
|
|
150
|
+
findOrFail: (id: any) => Promise<SelectedRow<DB, TTable, TSelected>>
|
|
151
|
+
findMany: (ids: any[]) => Promise<TSelected[]>
|
|
152
|
+
lazy: () => AsyncIterable<TSelected>
|
|
153
|
+
lazyById: () => AsyncIterable<TSelected>
|
|
154
|
+
pipe: <R>(fn: (qb: SelectQueryBuilder<DB, TTable, TSelected, TJoined>) => R) => R
|
|
155
|
+
count: () => Promise<number>
|
|
156
|
+
rows: TSelected[]
|
|
157
|
+
row: TSelected
|
|
158
|
+
values: () => Promise<any[][]>
|
|
159
|
+
toParams?: () => any[]
|
|
160
|
+
raw: () => Promise<any[][]>
|
|
161
|
+
cancel: () => void
|
|
162
|
+
withTrashed?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
163
|
+
onlyTrashed?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
164
|
+
scope?: (name: string, value?: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
165
|
+
clone?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
166
|
+
rowNumber?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
167
|
+
denseRank?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
168
|
+
rank?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
169
|
+
}
|
|
170
|
+
export declare interface InsertQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
171
|
+
values: (data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => InsertQueryBuilder<DB, TTable>
|
|
172
|
+
returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
|
|
173
|
+
toSQL: () => string
|
|
174
|
+
execute: () => Promise<number | DB[TTable]['columns'] | DB[TTable]['columns'][]>
|
|
175
|
+
}
|
|
176
|
+
export declare interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
177
|
+
set: (values: Partial<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
|
|
178
|
+
where: (expr: WhereExpression<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
|
|
179
|
+
returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
|
|
180
|
+
toSQL: () => string
|
|
181
|
+
execute: () => Promise<number>
|
|
182
|
+
executeTakeFirst?: () => Promise<{ numUpdatedRows?: number }>
|
|
183
|
+
}
|
|
184
|
+
export declare interface DeleteQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
185
|
+
where: (expr: WhereExpression<DB[TTable]['columns']>) => DeleteQueryBuilder<DB, TTable>
|
|
186
|
+
returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
|
|
187
|
+
toSQL: () => string
|
|
188
|
+
execute: () => Promise<number>
|
|
189
|
+
executeTakeFirst?: () => Promise<{ numDeletedRows?: number }>
|
|
190
|
+
}
|
|
191
|
+
export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
|
|
192
|
+
select: <TTable extends keyof DB & string, K extends keyof DB[TTable]['columns'] & string>(
|
|
193
|
+
table: TTable,
|
|
194
|
+
...columns: (K | `${string} as ${string}`)[]
|
|
195
|
+
) => SelectQueryBuilder<DB, TTable, any>
|
|
196
|
+
selectFrom: <TTable extends keyof DB & string>(table: TTable) => TypedSelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TTable, `SELECT * FROM ${TTable}`>
|
|
197
|
+
insertInto: <TTable extends keyof DB & string>(table: TTable) => TypedInsertQueryBuilder<DB, TTable>
|
|
198
|
+
updateTable: <TTable extends keyof DB & string>(table: TTable) => UpdateQueryBuilder<DB, TTable>
|
|
199
|
+
deleteFrom: <TTable extends keyof DB & string>(table: TTable) => DeleteQueryBuilder<DB, TTable>
|
|
200
|
+
selectFromSub: (sub: { toSQL: () => any }, alias: string) => SelectQueryBuilder<DB, keyof DB & string, any>
|
|
201
|
+
sql: any
|
|
202
|
+
raw: (strings: TemplateStringsArray, ...values: any[]) => any
|
|
203
|
+
simple: (strings: TemplateStringsArray, ...values: any[]) => any
|
|
204
|
+
unsafe: (query: string, params?: any[]) => Promise<any>
|
|
205
|
+
file: (path: string, params?: any[]) => Promise<any>
|
|
206
|
+
reserve: () => Promise<(QueryBuilder<DB> & { release: () => void })>
|
|
207
|
+
close: (opts?: { timeout?: number }) => Promise<void>
|
|
208
|
+
listen: (channel: string, handler?: (payload: any) => void) => Promise<void>
|
|
209
|
+
unlisten: (channel?: string) => Promise<void>
|
|
210
|
+
notify: (channel: string, payload?: any) => Promise<void>
|
|
211
|
+
copyTo: (queryOrTable: string, options?: Record<string, any>) => Promise<any>
|
|
212
|
+
copyFrom: (queryOrTable: string, source: AsyncIterable<any> | Iterable<any>, options?: Record<string, any>) => Promise<any>
|
|
213
|
+
ping: () => Promise<boolean>
|
|
214
|
+
waitForReady: (opts?: { attempts?: number, delayMs?: number }) => Promise<void>
|
|
215
|
+
transaction: <T>(fn: (tx: QueryBuilder<DB>) => Promise<T> | T, options?: TransactionOptions) => Promise<T>
|
|
216
|
+
savepoint: <T>(fn: (sp: QueryBuilder<DB>) => Promise<T> | T) => Promise<T>
|
|
217
|
+
beginDistributed: <T>(name: string, fn: (tx: QueryBuilder<DB>) => Promise<T> | T) => Promise<T>
|
|
218
|
+
commitDistributed: (name: string) => Promise<void>
|
|
219
|
+
rollbackDistributed: (name: string) => Promise<void>
|
|
220
|
+
configure: (opts: Partial<typeof config>) => QueryBuilder<DB>
|
|
221
|
+
setTransactionDefaults: (defaults: TransactionOptions) => void
|
|
222
|
+
transactional: <TArgs extends any[], R>(fn: (tx: QueryBuilder<DB>, ...args: TArgs) => Promise<R> | R, options?: TransactionOptions) => (...args: TArgs) => Promise<R>
|
|
223
|
+
count: <TTable extends keyof DB & string>(table: TTable, column?: keyof DB[TTable]['columns'] & string) => Promise<number>
|
|
224
|
+
sum: <TTable extends keyof DB & string>(table: TTable, column: keyof DB[TTable]['columns'] & string) => Promise<number>
|
|
225
|
+
avg: <TTable extends keyof DB & string>(table: TTable, column: keyof DB[TTable]['columns'] & string) => Promise<number>
|
|
226
|
+
min: <TTable extends keyof DB & string>(table: TTable, column: keyof DB[TTable]['columns'] & string) => Promise<any>
|
|
227
|
+
max: <TTable extends keyof DB & string>(table: TTable, column: keyof DB[TTable]['columns'] & string) => Promise<any>
|
|
228
|
+
insertOrIgnore: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => Promise<any>
|
|
229
|
+
insertGetId: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']>, idColumn?: keyof DB[TTable]['columns'] & string) => Promise<any>
|
|
230
|
+
updateOrInsert: <TTable extends keyof DB & string>(table: TTable, match: Partial<DB[TTable]['columns']>, values: Partial<DB[TTable]['columns']>) => Promise<boolean>
|
|
231
|
+
upsert: <TTable extends keyof DB & string>(table: TTable, rows: Partial<DB[TTable]['columns']>[], conflictColumns: (keyof DB[TTable]['columns'] & string)[], mergeColumns?: (keyof DB[TTable]['columns'] & string)[]) => Promise<any>
|
|
232
|
+
create: <TTable extends keyof DB & string>(
|
|
233
|
+
table: TTable,
|
|
234
|
+
values: Partial<DB[TTable]['columns']>,
|
|
235
|
+
) => Promise<DB[TTable]['columns']>
|
|
236
|
+
createMany: <TTable extends keyof DB & string>(
|
|
237
|
+
table: TTable,
|
|
238
|
+
rows: Partial<DB[TTable]['columns']>[],
|
|
239
|
+
) => Promise<void>
|
|
240
|
+
firstOrCreate: <TTable extends keyof DB & string>(
|
|
241
|
+
table: TTable,
|
|
242
|
+
match: Partial<DB[TTable]['columns']>,
|
|
243
|
+
defaults?: Partial<DB[TTable]['columns']>,
|
|
244
|
+
) => Promise<DB[TTable]['columns']>
|
|
245
|
+
updateOrCreate: <TTable extends keyof DB & string>(
|
|
246
|
+
table: TTable,
|
|
247
|
+
match: Partial<DB[TTable]['columns']>,
|
|
248
|
+
values: Partial<DB[TTable]['columns']>,
|
|
249
|
+
) => Promise<DB[TTable]['columns']>
|
|
250
|
+
save: <TTable extends keyof DB & string>(
|
|
251
|
+
table: TTable,
|
|
252
|
+
values: Partial<DB[TTable]['columns']>,
|
|
253
|
+
) => Promise<DB[TTable]['columns']>
|
|
254
|
+
remove: <TTable extends keyof DB & string>(
|
|
255
|
+
table: TTable,
|
|
256
|
+
id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
|
|
257
|
+
) => Promise<any>
|
|
258
|
+
find: <TTable extends keyof DB & string>(
|
|
259
|
+
table: TTable,
|
|
260
|
+
id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
|
|
261
|
+
) => Promise<DB[TTable]['columns'] | undefined>
|
|
262
|
+
findOrFail: <TTable extends keyof DB & string>(
|
|
263
|
+
table: TTable,
|
|
264
|
+
id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
|
|
265
|
+
) => Promise<DB[TTable]['columns']>
|
|
266
|
+
findMany: <TTable extends keyof DB & string>(
|
|
267
|
+
table: TTable,
|
|
268
|
+
ids: any[],
|
|
269
|
+
) => Promise<DB[TTable]['columns'][]>
|
|
270
|
+
latest: <TTable extends keyof DB & string>(
|
|
271
|
+
table: TTable,
|
|
272
|
+
column?: keyof DB[TTable]['columns'] & string,
|
|
273
|
+
) => Promise<DB[TTable]['columns'] | undefined>
|
|
274
|
+
oldest: <TTable extends keyof DB & string>(
|
|
275
|
+
table: TTable,
|
|
276
|
+
column?: keyof DB[TTable]['columns'] & string,
|
|
277
|
+
) => Promise<DB[TTable]['columns'] | undefined>
|
|
278
|
+
skip: <TTable extends keyof DB & string>(
|
|
279
|
+
table: TTable,
|
|
280
|
+
count: number,
|
|
281
|
+
) => SelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TTable>
|
|
282
|
+
rawQuery: (query: string) => Promise<any>
|
|
283
|
+
id?: (name: string) => any
|
|
284
|
+
ids?: (...names: string[]) => any
|
|
285
|
+
advisoryLock?: (key: number | string) => Promise<void>
|
|
286
|
+
tryAdvisoryLock?: (key: number | string) => Promise<boolean>
|
|
287
|
+
}
|
|
288
|
+
declare interface InternalState {
|
|
289
|
+
sql: any
|
|
290
|
+
meta?: SchemaMeta
|
|
291
|
+
schema?: any
|
|
292
|
+
txDefaults?: TransactionOptions
|
|
293
|
+
}
|
|
294
|
+
export declare interface TransactionOptions {
|
|
295
|
+
retries?: number
|
|
296
|
+
isolation?: TransactionIsolation
|
|
297
|
+
onRetry?: (attempt: number, error: any) => void
|
|
298
|
+
afterCommit?: () => void
|
|
299
|
+
sqlStates?: string[]
|
|
300
|
+
backoff?: TxBackoff
|
|
301
|
+
logger?: (event: TxLoggerEvent) => void
|
|
302
|
+
readOnly?: boolean
|
|
303
|
+
onRollback?: (error: any) => void
|
|
304
|
+
afterRollback?: () => void
|
|
305
|
+
}
|
|
306
|
+
declare interface TxBackoff {
|
|
307
|
+
baseMs?: number
|
|
308
|
+
maxMs?: number
|
|
309
|
+
factor?: number
|
|
310
|
+
jitter?: boolean
|
|
311
|
+
}
|
|
312
|
+
declare interface TxLoggerEvent {
|
|
313
|
+
type: 'start' | 'retry' | 'commit' | 'rollback' | 'error'
|
|
314
|
+
attempt: number
|
|
315
|
+
error?: any
|
|
316
|
+
durationMs?: number
|
|
317
|
+
}
|
|
318
|
+
// Where condition helpers
|
|
319
|
+
declare type Primitive = string | number | boolean | bigint | Date | null | undefined
|
|
320
|
+
declare type ValueOrRef = Primitive
|
|
321
|
+
export type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in' | 'is' | 'is not'
|
|
322
|
+
export type WhereExpression<TableColumns> = | Partial<{ [K in keyof TableColumns & string]: ValueOrRef | ValueOrRef[] }>
|
|
323
|
+
| [key: keyof TableColumns & string, op: WhereOperator, value: ValueOrRef | ValueOrRef[]]
|
|
324
|
+
| WhereRaw
|
|
325
|
+
export type QueryResult = any
|
|
326
|
+
/**
|
|
327
|
+
* # `SortDirection`
|
|
328
|
+
*
|
|
329
|
+
* The direction used when ordering query results.
|
|
330
|
+
*/
|
|
331
|
+
export type SortDirection = 'asc' | 'desc'
|
|
332
|
+
/**
|
|
333
|
+
* # `ColumnName<DB, TTable>`
|
|
334
|
+
*
|
|
335
|
+
* Helper type extracting a string union of column names for a given table.
|
|
336
|
+
*/
|
|
337
|
+
export type ColumnName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = keyof DB[TTable]['columns'] & string
|
|
338
|
+
// Named row alias to improve IDE hover readability
|
|
339
|
+
export type SelectedRow<DB extends DatabaseSchema<any>, _TTable extends keyof DB & string, TSelected> = Readonly<TSelected>
|
|
340
|
+
declare type JoinColumn<DB extends DatabaseSchema<any>, TTables extends string> = TTables extends any
|
|
341
|
+
? `${TTables}.${keyof DB[TTables]['columns'] & string}`
|
|
342
|
+
: never
|
|
343
|
+
// Convert snake_case to PascalCase at the type level (e.g. created_at -> CreatedAt)
|
|
344
|
+
declare type SnakeToPascal<S extends string> = S extends `${infer H}_${infer T}`
|
|
345
|
+
? `${Capitalize<H>}${SnakeToPascal<T>}`
|
|
346
|
+
: Capitalize<S>
|
|
347
|
+
// Typed SQL builder (type-level only). We piggy-back on the runtime builder but
|
|
348
|
+
// thread a phantom TSql string through method signatures so hovers can show the
|
|
349
|
+
// composed SQL at compile-time for common operations.
|
|
350
|
+
declare type _TypedDynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string, TSql extends string> = {
|
|
351
|
+
[K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (
|
|
352
|
+
value: DB[TTable]['columns'][K],
|
|
353
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>
|
|
354
|
+
} & {
|
|
355
|
+
[K in keyof DB[TTable]['columns'] & string as `orWhere${SnakeToPascal<K>}`]: (
|
|
356
|
+
value: DB[TTable]['columns'][K],
|
|
357
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} = ?`>
|
|
358
|
+
} & {
|
|
359
|
+
[K in keyof DB[TTable]['columns'] & string as `andWhere${SnakeToPascal<K>}`]: (
|
|
360
|
+
value: DB[TTable]['columns'][K],
|
|
361
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>
|
|
362
|
+
}
|
|
363
|
+
export type TypedSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable, TSql extends string = `SELECT * FROM ${TTable}`> = Omit<
|
|
364
|
+
BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined>,
|
|
365
|
+
'toSQL' | 'where' | 'andWhere' | 'orWhere' | 'orderBy' | 'limit'
|
|
366
|
+
> & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
|
|
367
|
+
& _TypedDynamicWhereMethods<DB, TTable, TSelected, TJoined, TSql>
|
|
368
|
+
& {
|
|
369
|
+
toSQL: () => TSql
|
|
370
|
+
where: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
371
|
+
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
372
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
373
|
+
expr: [K, OP, any],
|
|
374
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
375
|
+
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
376
|
+
op?: WhereOperator,
|
|
377
|
+
value?: any,
|
|
378
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${string}`>)
|
|
379
|
+
andWhere: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
380
|
+
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
381
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
382
|
+
expr: [K, OP, any],
|
|
383
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
384
|
+
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
385
|
+
op?: WhereOperator,
|
|
386
|
+
value?: any,
|
|
387
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${string}`>)
|
|
388
|
+
orWhere: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
389
|
+
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
390
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
391
|
+
expr: [K, OP, any],
|
|
392
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
393
|
+
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
394
|
+
op?: WhereOperator,
|
|
395
|
+
value?: any,
|
|
396
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${string}`>)
|
|
397
|
+
orderBy: <C extends keyof DB[TTable]['columns'] & string, D extends 'asc' | 'desc' = 'asc'>(
|
|
398
|
+
column: C,
|
|
399
|
+
direction?: D,
|
|
400
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} ORDER BY ${C} ${D}`>
|
|
401
|
+
limit: <N extends number>(n: N) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} LIMIT ${N}`>
|
|
402
|
+
}
|
|
403
|
+
declare type DynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> = {
|
|
404
|
+
[K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
405
|
+
} & {
|
|
406
|
+
[K in keyof DB[TTable]['columns'] & string as `orWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
407
|
+
} & {
|
|
408
|
+
[K in keyof DB[TTable]['columns'] & string as `andWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
409
|
+
}
|
|
410
|
+
export type SelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> = BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined> & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
|
|
411
|
+
// Typed INSERT builder to expose a structured SQL literal in hovers
|
|
412
|
+
export type TypedInsertQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSql extends string = `INSERT INTO ${TTable}`> = Omit<InsertQueryBuilder<DB, TTable>, 'toSQL' | 'values' | 'returning'> & {
|
|
413
|
+
toSQL: () => TSql
|
|
414
|
+
values: (
|
|
415
|
+
data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[],
|
|
416
|
+
) => TypedInsertQueryBuilder<DB, TTable, `${TSql} ${string}`>
|
|
417
|
+
returning: <K extends keyof DB[TTable]['columns'] & string>(
|
|
418
|
+
...cols: K[]
|
|
419
|
+
) => TypedSelectQueryBuilder<
|
|
420
|
+
DB,
|
|
421
|
+
TTable,
|
|
422
|
+
Pick<DB[TTable]['columns'], K>,
|
|
423
|
+
TTable,
|
|
424
|
+
`${TSql} RETURNING ${string}`
|
|
425
|
+
>
|
|
426
|
+
}
|
|
427
|
+
declare type TransactionIsolation = 'read committed' | 'repeatable read' | 'serializable'
|
package/dist/config.d.ts
ADDED