forked from surrealdb/surrealdb.js
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquerybindingvalues.ts
More file actions
88 lines (80 loc) · 2.09 KB
/
Copy pathquerybindingvalues.ts
File metadata and controls
88 lines (80 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import type { Gap } from "../../cbor";
import type { RecordId, StringRecordId } from "./recordid";
import type { Table } from "./table";
import type { Uuid } from "./uuid";
export type SurqlFuture<F extends string> = `<future> ${F}`;
export type SocketConnectionVariables<K extends string, V> = Record<K, V>;
type BrandedError<Msg extends string, T> = T & { __brand: Msg };
type SqlKeyword =
| "SELECT"
| "INSERT"
| "UPDATE"
| "DELETE"
| "CREATE"
| "DROP"
| "select"
| "insert"
| "update"
| "delete"
| "create"
| "drop";
type IsSurqlQuery<T extends string> = T extends `${SqlKeyword} ${string}`
? true
: false;
type IsRecord<T extends string> = T extends `${string}:${string}`
? true
: false;
type IsUuid<T extends string> =
T extends `${string}-${string}-${string}-${string}-${string}` ? true : false;
type IsIsoDate<T extends string> =
T extends `${number}-${number}-${number}T${number}:${number}:${number}.${number}Z`
? true
: T extends `${number}-${number}-${number}T${number}:${number}:${number}Z` // Without milliseconds
? true
: false;
export type SurqlQueryBindingValue =
| SurqlFuture<string>
| Date
| string
| StringRecordId
| RecordId
| Uuid
| boolean
| Gap
| Table
| number;
export type AssertValidSurqlValue<
T extends string,
V extends SurqlQueryBindingValue = SurqlQueryBindingValue,
> = IsIsoDate<T> extends true
? BrandedError<"Use d`…` for ISO-dates", T>
: IsUuid<T> extends true
? BrandedError<"Use u`…` instead for UUIDs", T>
: IsRecord<T> extends true
? BrandedError<"Use r`…` instead for record IDs", T>
: IsSurqlQuery<T> extends true
? BrandedError<"Use f`…` instead for futures", T>
: V;
export type MustBeSurqlValue<V> = V extends Date
? V
: V extends Table
? V
: V extends boolean
? V
: V extends Gap
? V
: V extends number
? V
: V extends Uuid
? V
: V extends StringRecordId
? V
: V extends Date
? V
: V extends RecordId
? V
: V extends string
? AssertValidSurqlValue<V>
: V extends unknown
? V
: never;