@softr/sdk 0.0.12 → 0.0.14
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/dist/assertions.js +68 -0
- package/dist/auth/config.js +27 -0
- package/dist/auth/context.d.ts +18 -0
- package/dist/auth/isomorphic.d.ts +73 -0
- package/dist/auth/isomorphic.js +113 -0
- package/dist/auth/methods/password.d.ts +22 -0
- package/dist/auth/methods/password.js +51 -0
- package/dist/auth/methods/signup.d.ts +37 -0
- package/dist/auth/methods/signup.js +89 -0
- package/dist/auth/methods/utils.d.ts +15 -0
- package/dist/auth/methods/utils.js +13 -0
- package/dist/auth/permissions.d.ts +17 -0
- package/dist/auth/permissions.js +13 -0
- package/dist/auth/platform.js +138 -0
- package/dist/auth/server.d.ts +17 -0
- package/dist/auth/server.js +17 -0
- package/dist/auth/session.js +167 -0
- package/dist/auth/user.d.ts +28 -0
- package/dist/client/timezone.d.ts +4 -0
- package/dist/client/timezone.js +11 -0
- package/dist/client.d.ts +1 -4
- package/dist/client.js +1 -9
- package/dist/cookies.js +47 -0
- package/dist/core/datasource.d.ts +21 -0
- package/dist/core/datasource.js +221 -0
- package/dist/core/integration.d.ts +7 -0
- package/dist/core/integration.js +32 -0
- package/dist/{types-n-Sir_Y2.d.ts → core/query.d.ts} +1 -129
- package/dist/core/query.js +528 -0
- package/dist/core/workflow.d.ts +7 -0
- package/dist/core/workflow.js +19 -0
- package/dist/index.d.ts +8 -172
- package/dist/index.js +4 -176
- package/dist/routes/discover.d.ts +9 -0
- package/dist/routes/discover.js +198 -0
- package/dist/routes/manifest.d.ts +17 -0
- package/dist/routes/manifest.js +148 -0
- package/dist/routes/mem-fs.js +71 -0
- package/dist/routes/visibility.d.ts +142 -0
- package/dist/routes/visibility.js +125 -0
- package/dist/server.d.ts +4 -113
- package/dist/server.js +4 -429
- package/dist/types.d.ts +115 -0
- package/dist/vite.d.ts +1 -21
- package/dist/vite.js +2 -405
- package/package.json +4 -4
- package/dist/session-kTqxT5_K.js +0 -891
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { buildFilterCriteria, buildOrderBy, dealiasFilterCriteria, dealiasOrderBy } from "./query.js";
|
|
2
|
+
import { panic } from "../assertions.js";
|
|
3
|
+
import { readUserTimezone } from "../cookies.js";
|
|
4
|
+
import { sessionConfig } from "../auth/config.js";
|
|
5
|
+
import { readSessionToken } from "../auth/session.js";
|
|
6
|
+
|
|
7
|
+
//#region src/core/datasource.ts
|
|
8
|
+
const MAX_RECORD_COUNT = 100;
|
|
9
|
+
const COUNT_CNT = "COUNT_CNT";
|
|
10
|
+
const dsUrl = (datasourceId) => {
|
|
11
|
+
const datasourceApiUrl = process.env.SOFTR_DATASOURCE_API_URL || "https://datasource-api-staging12.softr.io";
|
|
12
|
+
if (!datasourceApiUrl) panic("SOFTR_DATASOURCE_API_URL is not set.");
|
|
13
|
+
const { applicationId } = sessionConfig();
|
|
14
|
+
return `${withoutTrailingSlash(datasourceApiUrl)}/v1/datasource/vibe/applications/${applicationId}/datasources/${datasourceId}`;
|
|
15
|
+
};
|
|
16
|
+
async function listRecords(datasourceId, options = {}) {
|
|
17
|
+
const { select, where, orderBy } = options;
|
|
18
|
+
const count = Math.min(options.limit ?? 20, MAX_RECORD_COUNT);
|
|
19
|
+
const offset = options.offset ?? null;
|
|
20
|
+
const filterCriteria = where ? dealiasFilterCriteria(buildFilterCriteria(where), select ?? {}) : {};
|
|
21
|
+
const sortingOption = orderBy ? dealiasOrderBy(buildOrderBy(orderBy), select ?? {}) : void 0;
|
|
22
|
+
const res = await fetch(`${dsUrl(datasourceId)}/records`, {
|
|
23
|
+
method: "POST",
|
|
24
|
+
headers: {
|
|
25
|
+
"Content-Type": "application/json",
|
|
26
|
+
"X-User-Timezone": options.timeZone ?? readUserTimezone() ?? "UTC",
|
|
27
|
+
"Authorization": `Bearer ${readSessionToken()}`
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
options: { userLocale: "en-US" },
|
|
31
|
+
filterCriteria,
|
|
32
|
+
sortingOption,
|
|
33
|
+
pagingOption: {
|
|
34
|
+
offset,
|
|
35
|
+
count
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
});
|
|
39
|
+
if (!res.ok) throw new Error(`Softr datasource list failed for "${datasourceId}": ${res.status}`);
|
|
40
|
+
const payload = await res.json();
|
|
41
|
+
const nextOffset = payload.offset < payload.total ? payload.offset : null;
|
|
42
|
+
return {
|
|
43
|
+
records: payload.items.map((item) => ({
|
|
44
|
+
id: item.id,
|
|
45
|
+
fields: select ? aliasFields(item.fields, select) : item.fields
|
|
46
|
+
})),
|
|
47
|
+
total: payload.total,
|
|
48
|
+
nextOffset
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async function getRecord(datasourceId, options) {
|
|
52
|
+
if (options.id !== void 0) {
|
|
53
|
+
if (!options.id) throw new Error(`Softr datasource get: id must not be empty`);
|
|
54
|
+
const res = await fetch(`${dsUrl(datasourceId)}/records/${options.id}`, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
headers: {
|
|
57
|
+
"Content-Type": "application/json",
|
|
58
|
+
"X-User-Timezone": options.timeZone ?? readUserTimezone() ?? "UTC",
|
|
59
|
+
"Authorization": `Bearer ${readSessionToken()}`
|
|
60
|
+
},
|
|
61
|
+
body: JSON.stringify({ options: { userLocale: "en-US" } })
|
|
62
|
+
});
|
|
63
|
+
if (!res.ok) throw new Error(`Softr datasource get failed for "${datasourceId}": ${res.status}`);
|
|
64
|
+
const contentLength = res.headers.get("Content-Length");
|
|
65
|
+
if (contentLength && parseInt(contentLength, 10) === 0) return null;
|
|
66
|
+
return res.json();
|
|
67
|
+
}
|
|
68
|
+
return (await listRecords(datasourceId, {
|
|
69
|
+
where: options.where,
|
|
70
|
+
limit: 1,
|
|
71
|
+
timeZone: options.timeZone
|
|
72
|
+
})).records[0] ?? null;
|
|
73
|
+
}
|
|
74
|
+
async function createRecord(datasourceId, options) {
|
|
75
|
+
const rawFields = options.select ? dealiasData(options.data, options.select) : options.data;
|
|
76
|
+
const res = await fetch(`${dsUrl(datasourceId)}/records/new`, {
|
|
77
|
+
method: "POST",
|
|
78
|
+
headers: {
|
|
79
|
+
"Content-Type": "application/json",
|
|
80
|
+
"Authorization": `Bearer ${readSessionToken()}`
|
|
81
|
+
},
|
|
82
|
+
body: JSON.stringify({ fields: rawFields })
|
|
83
|
+
});
|
|
84
|
+
if (!res.ok) throw new Error(`Softr datasource create failed for "${datasourceId}": ${res.status}`);
|
|
85
|
+
const record = await res.json();
|
|
86
|
+
return options.select ? {
|
|
87
|
+
id: record.id,
|
|
88
|
+
fields: aliasFields(record.fields, options.select)
|
|
89
|
+
} : record;
|
|
90
|
+
}
|
|
91
|
+
async function updateRecord(datasourceId, options) {
|
|
92
|
+
if (!options.id) throw new Error(`Softr datasource update: id must not be empty`);
|
|
93
|
+
const rawFields = options.select ? dealiasData(options.data, options.select) : options.data;
|
|
94
|
+
const res = await fetch(`${dsUrl(datasourceId)}/records/${options.id}`, {
|
|
95
|
+
method: "PATCH",
|
|
96
|
+
headers: {
|
|
97
|
+
"Content-Type": "application/json",
|
|
98
|
+
"Authorization": `Bearer ${readSessionToken()}`
|
|
99
|
+
},
|
|
100
|
+
body: JSON.stringify({ fields: rawFields })
|
|
101
|
+
});
|
|
102
|
+
if (!res.ok) throw new Error(`Softr datasource update failed for "${datasourceId}": ${res.status}`);
|
|
103
|
+
const record = await res.json();
|
|
104
|
+
return options.select ? {
|
|
105
|
+
id: record.id,
|
|
106
|
+
fields: aliasFields(record.fields, options.select)
|
|
107
|
+
} : record;
|
|
108
|
+
}
|
|
109
|
+
async function deleteRecord(datasourceId, id) {
|
|
110
|
+
const res = await fetch(`${dsUrl(datasourceId)}/records/${id}`, {
|
|
111
|
+
method: "DELETE",
|
|
112
|
+
headers: { "Authorization": `Bearer ${readSessionToken()}` }
|
|
113
|
+
});
|
|
114
|
+
if (!res.ok) throw new Error(`Softr datasource delete failed for "${datasourceId}": ${res.status}`);
|
|
115
|
+
}
|
|
116
|
+
async function getMetric(datasourceId, options) {
|
|
117
|
+
const { select, where, aggregation, field } = options;
|
|
118
|
+
const fieldId = field ? select?.[field] ?? field : void 0;
|
|
119
|
+
const filterCriteria = where ? dealiasFilterCriteria(buildFilterCriteria(where), select ?? {}) : {};
|
|
120
|
+
const res = await fetch(`${dsUrl(datasourceId)}/metric/data`, {
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers: {
|
|
123
|
+
"Content-Type": "application/json",
|
|
124
|
+
"X-User-Timezone": options.timeZone ?? readUserTimezone() ?? "UTC",
|
|
125
|
+
"Authorization": `Bearer ${readSessionToken()}`
|
|
126
|
+
},
|
|
127
|
+
body: JSON.stringify({
|
|
128
|
+
options: { userLocale: "en-US" },
|
|
129
|
+
calculationField: {
|
|
130
|
+
field: fieldId,
|
|
131
|
+
aggregation
|
|
132
|
+
},
|
|
133
|
+
filterCriteria
|
|
134
|
+
})
|
|
135
|
+
});
|
|
136
|
+
if (!res.ok) throw new Error(`Softr datasource metric failed for "${datasourceId}": ${res.status}`);
|
|
137
|
+
const payload = await res.json();
|
|
138
|
+
const executionTimestamp = /* @__PURE__ */ new Date(payload.executionTimestamp * 1e3);
|
|
139
|
+
let value;
|
|
140
|
+
if (aggregation === "COUNT") value = payload.data.find((item) => COUNT_CNT in item)?.[COUNT_CNT] ?? null;
|
|
141
|
+
else {
|
|
142
|
+
if (!fieldId) throw new Error(`field is required for aggregation "${aggregation}"`);
|
|
143
|
+
value = payload.data.find((item) => fieldId in item)?.[fieldId] ?? null;
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
value,
|
|
147
|
+
executionTimestamp
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async function getChartData(datasourceId, options) {
|
|
151
|
+
const { select, where, groupBy, metrics, orderBy } = options;
|
|
152
|
+
const filterCriteria = where ? dealiasFilterCriteria(buildFilterCriteria(where), select ?? {}) : {};
|
|
153
|
+
const sortingOption = orderBy ? dealiasOrderBy(buildOrderBy(orderBy), select ?? {})[0] : void 0;
|
|
154
|
+
const groupByFields = (Array.isArray(groupBy) ? groupBy : [groupBy]).map((field) => ({ field: select?.[field] ?? field }));
|
|
155
|
+
const yAxisFields = Object.values(metrics).map(({ field, aggregation }) => ({
|
|
156
|
+
field: field ? select?.[field] ?? field : void 0,
|
|
157
|
+
aggregation
|
|
158
|
+
}));
|
|
159
|
+
const res = await fetch(`${dsUrl(datasourceId)}/chart`, {
|
|
160
|
+
method: "POST",
|
|
161
|
+
headers: {
|
|
162
|
+
"Content-Type": "application/json",
|
|
163
|
+
"X-User-Timezone": options.timeZone ?? readUserTimezone() ?? "UTC",
|
|
164
|
+
"Authorization": `Bearer ${readSessionToken()}`
|
|
165
|
+
},
|
|
166
|
+
body: JSON.stringify({
|
|
167
|
+
options: { userLocale: "en-US" },
|
|
168
|
+
filterCriteria,
|
|
169
|
+
sortingOption,
|
|
170
|
+
xAxisFields: groupByFields,
|
|
171
|
+
yAxisFields
|
|
172
|
+
})
|
|
173
|
+
});
|
|
174
|
+
if (!res.ok) throw new Error(`Softr datasource chartData failed for "${datasourceId}": ${res.status}`);
|
|
175
|
+
const payload = await res.json();
|
|
176
|
+
const executionTimestamp = /* @__PURE__ */ new Date(payload.executionTimestamp * 1e3);
|
|
177
|
+
const aliases = {};
|
|
178
|
+
const multipleMetrics = Object.keys(metrics).length > 1;
|
|
179
|
+
for (const [alias, { field, aggregation }] of Object.entries(metrics)) if (aggregation === "COUNT") aliases[COUNT_CNT] = alias;
|
|
180
|
+
else {
|
|
181
|
+
const fieldId = field ? select?.[field] ?? field : field;
|
|
182
|
+
if (fieldId) {
|
|
183
|
+
const suffix = multipleMetrics ? `_${aggregation.toLowerCase()}` : "";
|
|
184
|
+
aliases[fieldId + suffix] = alias;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
for (const field of Array.isArray(groupBy) ? groupBy : [groupBy]) aliases[select?.[field] ?? field] = field;
|
|
188
|
+
return {
|
|
189
|
+
data: payload.data.map((item) => {
|
|
190
|
+
const row = {};
|
|
191
|
+
for (const [rawKey, alias] of Object.entries(aliases)) if (rawKey in item) row[alias] = item[rawKey];
|
|
192
|
+
return row;
|
|
193
|
+
}),
|
|
194
|
+
executionTimestamp
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function aliasFields(fields, aliases) {
|
|
198
|
+
const result = {};
|
|
199
|
+
for (const [alias, fieldId] of Object.entries(aliases)) result[alias] = fields[fieldId];
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
function dealiasData(data, select) {
|
|
203
|
+
const result = {};
|
|
204
|
+
for (const [alias, value] of Object.entries(data)) result[select[alias] ?? alias] = value;
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
const ds = {
|
|
208
|
+
list: listRecords,
|
|
209
|
+
get: getRecord,
|
|
210
|
+
create: createRecord,
|
|
211
|
+
update: updateRecord,
|
|
212
|
+
delete: deleteRecord,
|
|
213
|
+
metric: getMetric,
|
|
214
|
+
chartData: getChartData
|
|
215
|
+
};
|
|
216
|
+
function withoutTrailingSlash(url) {
|
|
217
|
+
return url.replace(/\/+$/, "");
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
//#endregion
|
|
221
|
+
export { ds };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
//#region src/core/integration.d.ts
|
|
2
|
+
declare function integrationFetch(integrationId: string, input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
|
|
3
|
+
declare const integration: {
|
|
4
|
+
fetch: typeof integrationFetch;
|
|
5
|
+
};
|
|
6
|
+
//#endregion
|
|
7
|
+
export { integration };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { readSessionToken } from "../auth/session.js";
|
|
2
|
+
|
|
3
|
+
//#region src/core/integration.ts
|
|
4
|
+
const BASE_URL = () => (import.meta.env.VITE_SOFTR_BASE_URL ?? "").replace(/\/$/, "");
|
|
5
|
+
async function integrationFetch(integrationId, input, init) {
|
|
6
|
+
const req = new Request(input, init);
|
|
7
|
+
if (req.signal.aborted) throw req.signal.reason ?? new DOMException("The operation was aborted.", "AbortError");
|
|
8
|
+
const reqHeaders = {};
|
|
9
|
+
new Headers(req.headers).forEach((value, key) => {
|
|
10
|
+
reqHeaders[key] = value;
|
|
11
|
+
});
|
|
12
|
+
const payload = {
|
|
13
|
+
method: req.method,
|
|
14
|
+
url: req.url,
|
|
15
|
+
headers: reqHeaders
|
|
16
|
+
};
|
|
17
|
+
const method = req.method.toUpperCase();
|
|
18
|
+
if (method !== "GET" && method !== "HEAD" && req.body !== null) payload.body = await req.clone().text();
|
|
19
|
+
return fetch(`${BASE_URL()}/api/integrations/${integrationId}/proxy`, {
|
|
20
|
+
method: "POST",
|
|
21
|
+
headers: {
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
"Authorization": `Bearer ${readSessionToken()}`
|
|
24
|
+
},
|
|
25
|
+
body: JSON.stringify(payload),
|
|
26
|
+
signal: req.signal
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const integration = { fetch: integrationFetch };
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { integration };
|
|
@@ -351,132 +351,4 @@ declare const q: {
|
|
|
351
351
|
desc(subject: string): ConstructableOrderBy;
|
|
352
352
|
};
|
|
353
353
|
//#endregion
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* Declare this interface in your app to narrow every group id the SDK takes and
|
|
357
|
-
* returns. Without a declaration, a group id is a plain `string`.
|
|
358
|
-
*
|
|
359
|
-
* @example
|
|
360
|
-
* declare module "@softr/sdk" {
|
|
361
|
-
* interface SoftrUserGroups {
|
|
362
|
-
* ids:
|
|
363
|
-
* | "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
|
|
364
|
-
* | "f9e8d7c6-5b4a-4938-8271-605f4e3d2c1b"
|
|
365
|
-
* }
|
|
366
|
-
* }
|
|
367
|
-
*/
|
|
368
|
-
interface SoftrUserGroups {}
|
|
369
|
-
/** A Softr user group id, narrowed to your own ids if you declare {@link SoftrUserGroups}. */
|
|
370
|
-
type SoftrUserGroupId = SoftrUserGroups extends {
|
|
371
|
-
ids: infer Id extends string;
|
|
372
|
-
} ? Id : string;
|
|
373
|
-
/** The signed-in visitor. */
|
|
374
|
-
type User = {
|
|
375
|
-
id: string;
|
|
376
|
-
email: string;
|
|
377
|
-
name: string;
|
|
378
|
-
userGroupIds: Array<SoftrUserGroupId>;
|
|
379
|
-
};
|
|
380
|
-
//#endregion
|
|
381
|
-
//#region src/types.d.ts
|
|
382
|
-
interface SoftrUser {
|
|
383
|
-
id: string;
|
|
384
|
-
email: string;
|
|
385
|
-
name: string;
|
|
386
|
-
userGroupIds: Array<SoftrUserGroupId>;
|
|
387
|
-
}
|
|
388
|
-
interface DatasourcePermissions {
|
|
389
|
-
read: boolean;
|
|
390
|
-
create: boolean;
|
|
391
|
-
update: boolean;
|
|
392
|
-
delete: boolean;
|
|
393
|
-
}
|
|
394
|
-
interface SoftrPermissions {
|
|
395
|
-
datasources: Record<string, DatasourcePermissions>;
|
|
396
|
-
workflows: Record<string, boolean>;
|
|
397
|
-
}
|
|
398
|
-
interface SoftrMe {
|
|
399
|
-
user: SoftrUser | null;
|
|
400
|
-
permissions: SoftrPermissions;
|
|
401
|
-
}
|
|
402
|
-
type GetByIdOptions = {
|
|
403
|
-
id: string;
|
|
404
|
-
where?: never;
|
|
405
|
-
timeZone?: string;
|
|
406
|
-
};
|
|
407
|
-
type GetByWhereOptions = {
|
|
408
|
-
id?: never;
|
|
409
|
-
where: AnyConstructable;
|
|
410
|
-
timeZone?: string;
|
|
411
|
-
};
|
|
412
|
-
type GetOptions = GetByIdOptions | GetByWhereOptions;
|
|
413
|
-
interface ListOptions {
|
|
414
|
-
/**
|
|
415
|
-
* Maps human-readable aliases to Softr field IDs.
|
|
416
|
-
* When provided, returned fields are keyed by alias instead of raw field ID.
|
|
417
|
-
*/
|
|
418
|
-
select?: Record<string, string>;
|
|
419
|
-
where?: AnyConstructable;
|
|
420
|
-
orderBy?: ConstructableOrderBy | ConstructableOrderBy[];
|
|
421
|
-
/**
|
|
422
|
-
* Number of records to return per page. Defaults to 20, max 100.
|
|
423
|
-
*/
|
|
424
|
-
limit?: number;
|
|
425
|
-
/**
|
|
426
|
-
* Offset to start from. Pass the `nextOffset` from a previous result to paginate.
|
|
427
|
-
* Omit or pass `null` to start from the beginning.
|
|
428
|
-
*/
|
|
429
|
-
offset?: number | null;
|
|
430
|
-
/** Override the timezone for this request. */
|
|
431
|
-
timeZone?: string;
|
|
432
|
-
}
|
|
433
|
-
interface ListResult<T = SoftrRecord> {
|
|
434
|
-
records: T[];
|
|
435
|
-
total: number;
|
|
436
|
-
/** Offset to pass as `offset` in the next call, or `null` when there are no more pages. */
|
|
437
|
-
nextOffset: number | null;
|
|
438
|
-
}
|
|
439
|
-
interface SoftrRecord {
|
|
440
|
-
id: string;
|
|
441
|
-
fields: Record<string, unknown>;
|
|
442
|
-
}
|
|
443
|
-
type AggregationFunction = 'SUM' | 'AVG' | 'MAX' | 'MIN' | 'COUNT' | 'DISTINCT';
|
|
444
|
-
interface MetricOptions {
|
|
445
|
-
select?: Record<string, string>;
|
|
446
|
-
where?: AnyConstructable;
|
|
447
|
-
aggregation: AggregationFunction;
|
|
448
|
-
/** Field alias (resolved via select) or raw field ID. Not required for COUNT. */
|
|
449
|
-
field?: string;
|
|
450
|
-
/** Override the timezone for this request. */
|
|
451
|
-
timeZone?: string;
|
|
452
|
-
}
|
|
453
|
-
interface MetricResult {
|
|
454
|
-
value: number | null;
|
|
455
|
-
executionTimestamp: Date;
|
|
456
|
-
}
|
|
457
|
-
interface ChartDataOptions {
|
|
458
|
-
select?: Record<string, string>;
|
|
459
|
-
where?: AnyConstructable;
|
|
460
|
-
/** Field alias (resolved via select) or raw field ID. */
|
|
461
|
-
groupBy: string | string[];
|
|
462
|
-
metrics: Record<string, {
|
|
463
|
-
field?: string;
|
|
464
|
-
aggregation: AggregationFunction;
|
|
465
|
-
}>;
|
|
466
|
-
orderBy?: ConstructableOrderBy;
|
|
467
|
-
/** Override the timezone for this request. */
|
|
468
|
-
timeZone?: string;
|
|
469
|
-
}
|
|
470
|
-
interface ChartDataResult {
|
|
471
|
-
data: Record<string, unknown>[];
|
|
472
|
-
executionTimestamp: Date;
|
|
473
|
-
}
|
|
474
|
-
interface CreateOptions {
|
|
475
|
-
fields: Record<string, unknown>;
|
|
476
|
-
}
|
|
477
|
-
interface UpdateOptions {
|
|
478
|
-
id: string;
|
|
479
|
-
fields: Record<string, unknown>;
|
|
480
|
-
}
|
|
481
|
-
//#endregion
|
|
482
|
-
export { SoftrUserGroups as _, DatasourcePermissions as a, ListResult as c, SoftrMe as d, SoftrPermissions as f, SoftrUserGroupId as g, UpdateOptions as h, CreateOptions as i, MetricOptions as l, SoftrUser as m, ChartDataOptions as n, GetOptions as o, SoftrRecord as p, ChartDataResult as r, ListOptions as s, AggregationFunction as t, MetricResult as u, User as v, q as y };
|
|
354
|
+
export { AnyConstructable, ConstructableOrderBy, q };
|