-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
datasources.ts
216 lines (192 loc) · 4.6 KB
/
datasources.ts
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
import { Table, Row } from "../documents"
import { QueryJson } from "./search"
export const PASSWORD_REPLACEMENT = "--secret-value--"
export enum Operation {
CREATE = "CREATE",
READ = "READ",
UPDATE = "UPDATE",
DELETE = "DELETE",
COUNT = "COUNT",
BULK_CREATE = "BULK_CREATE",
BULK_UPSERT = "BULK_UPSERT",
CREATE_TABLE = "CREATE_TABLE",
UPDATE_TABLE = "UPDATE_TABLE",
DELETE_TABLE = "DELETE_TABLE",
}
export const RowOperations = [
Operation.CREATE,
Operation.READ,
Operation.UPDATE,
Operation.DELETE,
Operation.BULK_CREATE,
Operation.BULK_UPSERT,
]
export enum QueryType {
SQL = "sql",
JSON = "json",
FIELDS = "fields",
}
export enum DatasourceFieldType {
STRING = "string",
CODE = "code",
LONGFORM = "longForm",
BOOLEAN = "boolean",
NUMBER = "number",
PASSWORD = "password",
LIST = "list",
OBJECT = "object",
JSON = "json",
FILE = "file",
FIELD_GROUP = "fieldGroup",
SELECT = "select",
}
export enum SourceName {
POSTGRES = "POSTGRES",
DYNAMODB = "DYNAMODB",
MONGODB = "MONGODB",
ELASTICSEARCH = "ELASTICSEARCH",
COUCHDB = "COUCHDB",
SQL_SERVER = "SQL_SERVER",
S3 = "S3",
AIRTABLE = "AIRTABLE",
MYSQL = "MYSQL",
ARANGODB = "ARANGODB",
REST = "REST",
ORACLE = "ORACLE",
GOOGLE_SHEETS = "GOOGLE_SHEETS",
FIRESTORE = "FIRESTORE",
REDIS = "REDIS",
SNOWFLAKE = "SNOWFLAKE",
BUDIBASE = "BUDIBASE",
}
export enum IncludeRelationship {
INCLUDE = 1,
EXCLUDE = 0,
}
export enum FilterType {
STRING = "string",
FUZZY = "fuzzy",
RANGE = "range",
EQUAL = "equal",
NOT_EQUAL = "notEqual",
EMPTY = "empty",
NOT_EMPTY = "notEmpty",
ONE_OF = "oneOf",
}
export enum DatasourceFeature {
CONNECTION_CHECKING = "connection",
FETCH_TABLE_NAMES = "fetch_table_names",
EXPORT_SCHEMA = "export_schema",
}
export interface StepDefinition {
key: string
template: string
}
export interface QueryDefinition {
type: QueryType
displayName?: string
readable?: boolean
customisable?: boolean
fields?: object
urlDisplay?: boolean
steps?: Array<StepDefinition>
}
export interface ExtraQueryConfig {
[key: string]: {
displayName: string
type: string
required: boolean
data?: object
}
}
interface DatasourceBasicFieldConfig {
type: DatasourceFieldType
display?: string
required?: boolean
default?: any
deprecated?: boolean
hidden?: string
}
interface DatasourceSelectFieldConfig extends DatasourceBasicFieldConfig {
type: DatasourceFieldType.SELECT
config: { options: string[] }
}
interface DatasourceFieldGroupConfig extends DatasourceBasicFieldConfig {
type: DatasourceFieldType.FIELD_GROUP
config: {
openByDefault?: boolean
nestedFields?: boolean
}
}
type DatasourceFieldConfig =
| DatasourceSelectFieldConfig
| DatasourceFieldGroupConfig
| DatasourceBasicFieldConfig
export interface DatasourceConfig {
[key: string]: DatasourceFieldConfig & {
fields?: DatasourceConfig
}
}
export interface Integration {
docs: string
plus?: boolean
isSQL?: boolean
auth?: { type: string }
features?: Partial<Record<DatasourceFeature, boolean>>
relationships?: boolean
description: string
friendlyName: string
type?: string
iconUrl?: string
datasource: DatasourceConfig
query: {
[key: string]: QueryDefinition
}
extra?: ExtraQueryConfig
}
export type ConnectionInfo = {
connected: boolean
error?: string
}
export interface IntegrationBase {
create?(query: any): Promise<any[] | any>
read?(query: any): Promise<any[] | any>
update?(query: any): Promise<any[] | any>
delete?(query: any): Promise<any[] | any>
testConnection?(): Promise<ConnectionInfo>
getExternalSchema?(): Promise<string>
defineTypeCastingFromSchema?(schema: {
[key: string]: {
name: string
type: string
}
}): void
}
export interface Schema {
tables: Record<string, Table>
errors: Record<string, string>
}
// return these when an operation occurred but we got no response
export enum DSPlusOperation {
CREATE = "create",
READ = "read",
UPDATE = "update",
DELETE = "delete",
}
export type DatasourcePlusQueryResponse =
| Row[]
| Record<DSPlusOperation, boolean>[]
| { total: number }[]
| void
export interface DatasourcePlus extends IntegrationBase {
// if the datasource supports the use of bindings directly (to protect against SQL injection)
// this returns the format of the identifier
getBindingIdentifier(): string
getStringConcat(parts: string[]): string
query(json: QueryJson): Promise<DatasourcePlusQueryResponse>
buildSchema(
datasourceId: string,
entities: Record<string, Table>
): Promise<Schema>
getTableNames(): Promise<string[]>
}