Skip to content

Commit 854e192

Browse files
committed
Add support for bigint
1 parent 5c1cc8f commit 854e192

File tree

5 files changed

+55
-54
lines changed

5 files changed

+55
-54
lines changed

src/Builder.ts

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
ArrayResult,
33
ConflictUpsert,
44
DefaultObject,
5+
DefaultReturnObject,
56
Delete,
67
DeleteReturning,
78
DeleteWithoutReturning,
@@ -63,7 +64,9 @@ export class QueryBuilder<GenericResultWrapper> {
6364
}, `DROP TABLE ${params.ifExists ? 'IF EXISTS' : ''} ${params.tableName}`)
6465
}
6566

66-
fetchOne<GenericResult = DefaultObject>(params: SelectOne): Query<OneResult<GenericResultWrapper, GenericResult>> {
67+
fetchOne<GenericResult = DefaultReturnObject>(
68+
params: SelectOne
69+
): Query<OneResult<GenericResultWrapper, GenericResult>> {
6770
return new Query(
6871
(q: Query) => {
6972
return this.execute(q)
@@ -76,7 +79,9 @@ export class QueryBuilder<GenericResultWrapper> {
7679
)
7780
}
7881

79-
fetchAll<GenericResult = DefaultObject>(params: SelectAll): Query<ArrayResult<GenericResultWrapper, GenericResult>> {
82+
fetchAll<GenericResult = DefaultReturnObject>(
83+
params: SelectAll
84+
): Query<ArrayResult<GenericResultWrapper, GenericResult>> {
8085
return new Query(
8186
(q: Query) => {
8287
return this.execute(q)
@@ -89,10 +94,14 @@ export class QueryBuilder<GenericResultWrapper> {
8994
)
9095
}
9196

92-
raw<GenericResult = DefaultObject>(params: RawQueryFetchOne): Query<OneResult<GenericResultWrapper, GenericResult>>
93-
raw<GenericResult = DefaultObject>(params: RawQueryFetchAll): Query<ArrayResult<GenericResultWrapper, GenericResult>>
94-
raw<GenericResult = DefaultObject>(params: RawQueryWithoutFetching): Query<GenericResultWrapper>
95-
raw<GenericResult = DefaultObject>(params: RawQuery): unknown {
97+
raw<GenericResult = DefaultReturnObject>(
98+
params: RawQueryFetchOne
99+
): Query<OneResult<GenericResultWrapper, GenericResult>>
100+
raw<GenericResult = DefaultReturnObject>(
101+
params: RawQueryFetchAll
102+
): Query<ArrayResult<GenericResultWrapper, GenericResult>>
103+
raw<GenericResult = DefaultReturnObject>(params: RawQueryWithoutFetching): Query<GenericResultWrapper>
104+
raw<GenericResult = DefaultReturnObject>(params: RawQuery): unknown {
96105
return new Query(
97106
(q: Query) => {
98107
return this.execute(q)
@@ -103,10 +112,12 @@ export class QueryBuilder<GenericResultWrapper> {
103112
)
104113
}
105114

106-
insert<GenericResult = DefaultObject>(params: InsertOne): Query<OneResult<GenericResultWrapper, GenericResult>>
107-
insert<GenericResult = DefaultObject>(params: InsertMultiple): Query<ArrayResult<GenericResultWrapper, GenericResult>>
108-
insert<GenericResult = DefaultObject>(params: InsertWithoutReturning): Query<GenericResultWrapper>
109-
insert<GenericResult = DefaultObject>(params: Insert): unknown {
115+
insert<GenericResult = DefaultReturnObject>(params: InsertOne): Query<OneResult<GenericResultWrapper, GenericResult>>
116+
insert<GenericResult = DefaultReturnObject>(
117+
params: InsertMultiple
118+
): Query<ArrayResult<GenericResultWrapper, GenericResult>>
119+
insert<GenericResult = DefaultReturnObject>(params: InsertWithoutReturning): Query<GenericResultWrapper>
120+
insert<GenericResult = DefaultReturnObject>(params: Insert): unknown {
110121
let args: any[] = []
111122

112123
if (typeof params.onConflict === 'object') {
@@ -146,11 +157,11 @@ export class QueryBuilder<GenericResultWrapper> {
146157
)
147158
}
148159

149-
update<GenericResult = DefaultObject>(
160+
update<GenericResult = DefaultReturnObject>(
150161
params: UpdateReturning
151162
): Query<ArrayResult<GenericResultWrapper, GenericResult>>
152-
update<GenericResult = DefaultObject>(params: UpdateWithoutReturning): Query<GenericResultWrapper>
153-
update<GenericResult = DefaultObject>(params: Update): unknown {
163+
update<GenericResult = DefaultReturnObject>(params: UpdateWithoutReturning): Query<GenericResultWrapper>
164+
update<GenericResult = DefaultReturnObject>(params: Update): unknown {
154165
let args = this._parse_arguments(params.data)
155166

156167
if (typeof params.where === 'object' && !Array.isArray(params.where) && params.where?.params) {
@@ -167,11 +178,11 @@ export class QueryBuilder<GenericResultWrapper> {
167178
)
168179
}
169180

170-
delete<GenericResult = DefaultObject>(
181+
delete<GenericResult = DefaultReturnObject>(
171182
params: DeleteReturning
172183
): Query<ArrayResult<GenericResultWrapper, GenericResult>>
173-
delete<GenericResult = DefaultObject>(params: DeleteWithoutReturning): Query<GenericResultWrapper>
174-
delete<GenericResult = DefaultObject>(params: Delete): unknown {
184+
delete<GenericResult = DefaultReturnObject>(params: DeleteWithoutReturning): Query<GenericResultWrapper>
185+
delete<GenericResult = DefaultReturnObject>(params: Delete): unknown {
175186
return new Query(
176187
(q: Query) => {
177188
return this.execute(q)
@@ -184,7 +195,7 @@ export class QueryBuilder<GenericResultWrapper> {
184195
)
185196
}
186197

187-
_parse_arguments(row: Record<string, string | boolean | number | null | Raw>): Array<any> {
198+
_parse_arguments(row: DefaultObject): Array<any> {
188199
// Raw parameters are placed directly in the query, and keeping them here would result in more parameters that are
189200
// expected in the query and could result in weird results or outright errors when using PostgreSQL
190201
return Object.values(row).filter((value) => {
@@ -216,11 +227,18 @@ export class QueryBuilder<GenericResultWrapper> {
216227
_insert(params: Insert): string {
217228
const rows = []
218229

230+
let data: Array<DefaultObject>
219231
if (!Array.isArray(params.data)) {
220-
params.data = [params.data]
232+
data = [params.data]
233+
} else {
234+
data = params.data
235+
}
236+
237+
if (!data || !data[0] || data.length === 0) {
238+
throw new Error('Insert data is undefined')
221239
}
222240

223-
const columns = Object.keys(params.data[0]).join(', ')
241+
const columns = Object.keys(data[0]).join(', ')
224242
let index = 1
225243

226244
let orConflict = '',
@@ -243,7 +261,7 @@ export class QueryBuilder<GenericResultWrapper> {
243261
orConflict = this._onConflict(params.onConflict)
244262
}
245263

246-
for (const row of params.data) {
264+
for (const row of data) {
247265
const values: Array<string> = []
248266
Object.values(row).forEach((value) => {
249267
if (value instanceof Raw) {

src/databases/d1.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,14 @@ export class D1QB extends QueryBuilder<D1Result> {
7575
},
7676
i: number
7777
) => {
78-
if (queryArray[i]) {
78+
if (queryArray && queryArray[i] !== undefined && queryArray[i]?.fetchType) {
7979
return {
8080
changes: resp.meta?.changes,
8181
duration: resp.meta?.duration,
8282
last_row_id: resp.meta?.last_row_id,
8383
served_by: resp.meta?.served_by,
8484
success: resp.success,
85-
results: queryArray[i].fetchType === FetchTypes.ONE ? resp.results?.[0] : resp.results,
85+
results: queryArray[i]?.fetchType === FetchTypes.ONE ? resp.results?.[0] : resp.results,
8686
}
8787
} else {
8888
return {

src/interfaces.ts

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import { ConflictTypes, FetchTypes, JoinTypes, OrderTypes } from './enums'
22
import { Raw } from './tools'
3-
import { IsEqual, Merge, Primitive, Simplify } from './typefest'
4-
import Any = jasmine.Any
3+
import { Merge } from './typefest'
4+
5+
export type Primitive = null | string | number | boolean | bigint | Raw
56

67
export type DefaultObject = Record<string, Primitive>
8+
export type DefaultReturnObject = Record<string, null | string | number | boolean | bigint>
79

810
export type Where =
911
| {
1012
conditions: string | Array<string>
11-
// TODO: enable named parameters Record<string, string | boolean | number | null>
12-
params?: (string | boolean | number | null | Raw)[]
13+
// TODO: enable named parameters with DefaultObject
14+
params?: Primitive[]
1315
}
1416
| string
1517
| Array<string>
@@ -34,7 +36,7 @@ export type SelectOne = {
3436

3537
export type RawQuery = {
3638
query: string
37-
args?: (string | number | boolean | null | Raw)[]
39+
args?: Primitive[]
3840
fetchType?: FetchTypes
3941
}
4042

@@ -54,26 +56,24 @@ export type SelectAll = SelectOne & {
5456

5557
export type ConflictUpsert = {
5658
column: string | Array<string>
57-
data: Record<string, string | boolean | number | null | Raw>
59+
data: DefaultObject
5860
where?: Where
5961
}
6062

6163
export type Insert = {
6264
tableName: string
63-
data:
64-
| Record<string, string | boolean | number | null | Raw>
65-
| Array<Record<string, string | boolean | number | null | Raw>>
65+
data: DefaultObject | Array<DefaultObject>
6666
returning?: string | Array<string>
6767
onConflict?: string | ConflictTypes | ConflictUpsert
6868
}
6969

7070
export type InsertOne = Omit<Insert, 'data' | 'returning'> & {
71-
data: Record<string, string | boolean | number | null | Raw>
71+
data: DefaultObject
7272
returning: string | Array<string>
7373
}
7474

7575
export type InsertMultiple = Omit<Insert, 'data' | 'returning'> & {
76-
data: Array<Record<string, string | boolean | number | null | Raw>>
76+
data: Array<DefaultObject>
7777
returning: string | Array<string>
7878
}
7979

@@ -83,7 +83,7 @@ export type test<I extends Insert = Insert> = I
8383

8484
export type Update = {
8585
tableName: string
86-
data: Record<string, string | boolean | number | null | Raw>
86+
data: DefaultObject
8787
where?: Where
8888
returning?: string | Array<string>
8989
onConflict?: string | ConflictTypes
@@ -121,17 +121,3 @@ export type PGResult = {
121121

122122
export type ArrayResult<ResultWrapper, Result> = Merge<ResultWrapper, { results?: Array<Result> }>
123123
export type OneResult<ResultWrapper, Result> = Merge<ResultWrapper, { results?: Result }>
124-
125-
// Types bellow are WIP to improve even more type hints for raw and insert queries
126-
export type GetFetchValue<T> = T extends { fetchType?: infer U } ? U : never
127-
export type SwitchFetch<P, A, B> = IsEqual<P, FetchTypes.ALL> extends true
128-
? ArrayResult<A, B>
129-
: IsEqual<P, FetchTypes.ONE> extends true
130-
? OneResult<A, B>
131-
: A
132-
133-
export type FindResult<P, A, B> = Simplify<SwitchFetch<GetFetchValue<P>, A, B>>
134-
135-
// raw<GenericResult=DefaultObject, P extends RawQuery = RawQuery>(params: P): Query<FindResult<P, GenericResultWrapper, GenericResult>> {
136-
//
137-
// }

src/tools.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { FetchTypes } from './enums'
2+
import { Primitive } from './interfaces'
23

34
export class Raw {
45
public isRaw = true
@@ -11,13 +12,13 @@ export class Raw {
1112
export class Query<Result = any> {
1213
executeMethod: (query: Query<Result>) => Promise<Result>
1314
public query: string
14-
public arguments?: (string | number | boolean | null | Raw)[]
15+
public arguments?: Primitive[]
1516
public fetchType?: FetchTypes
1617

1718
constructor(
1819
executeMethod: (query: Query<Result>) => Promise<Result>,
1920
query: string,
20-
args?: (string | number | boolean | null | Raw)[],
21+
args?: Primitive[],
2122
fetchType?: FetchTypes
2223
) {
2324
this.executeMethod = executeMethod

src/typefest.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// Code taken from type-fest
22

3-
export type Primitive = null | undefined | string | number | boolean | symbol | bigint
4-
53
export type OmitIndexSignature<ObjectType> = {
64
[KeyType in keyof ObjectType as {} extends Record<KeyType, unknown> ? never : KeyType]: ObjectType[KeyType]
75
}
@@ -20,5 +18,3 @@ export type Merge<Destination, Source> = Simplify<
2018
SimpleMerge<PickIndexSignature<Destination>, PickIndexSignature<Source>> &
2119
SimpleMerge<OmitIndexSignature<Destination>, OmitIndexSignature<Source>>
2220
>
23-
24-
export type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends <G>() => G extends B ? 1 : 2 ? true : false

0 commit comments

Comments
 (0)