@loykin/datasourcekit 0.0.2 → 0.0.3
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/README.md +16 -3
- package/dist/{chunk-Z2DGIUJ2.js → chunk-NSZRSVET.js} +32 -3
- package/dist/chunk-NSZRSVET.js.map +1 -0
- package/dist/index.cjs +52 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +23 -8
- package/dist/index.js.map +1 -1
- package/dist/{manager-C5PgvWNH.d.cts → manager-DOC7PPiJ.d.cts} +58 -5
- package/dist/{manager-C5PgvWNH.d.ts → manager-DOC7PPiJ.d.ts} +58 -5
- package/dist/testing.cjs +25 -6
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +11 -7
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-Z2DGIUJ2.js.map +0 -1
package/README.md
CHANGED
|
@@ -87,6 +87,7 @@ A plugin owns the type-specific UI hooks and response normalization. PostgreSQL
|
|
|
87
87
|
import {
|
|
88
88
|
createDatasourceManager,
|
|
89
89
|
defineDatasourcePlugin,
|
|
90
|
+
tableRowsToFrame,
|
|
90
91
|
type QueryResult,
|
|
91
92
|
} from '@loykin/datasourcekit'
|
|
92
93
|
|
|
@@ -108,8 +109,12 @@ function normalizePostgresResult(raw: unknown): QueryResult {
|
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
return {
|
|
111
|
-
|
|
112
|
-
|
|
112
|
+
frames: [
|
|
113
|
+
tableRowsToFrame({
|
|
114
|
+
columns: response.fields.map((name) => ({ name, type: 'string' })),
|
|
115
|
+
rows: response.rows,
|
|
116
|
+
}),
|
|
117
|
+
],
|
|
113
118
|
requestId: response.requestId,
|
|
114
119
|
}
|
|
115
120
|
}
|
|
@@ -193,7 +198,7 @@ manager.instances.query(request)
|
|
|
193
198
|
-> registry.get('postgres')
|
|
194
199
|
-> backend.query(request)
|
|
195
200
|
-> postgresPlugin.backend.transform(raw, request)
|
|
196
|
-
-> QueryResult
|
|
201
|
+
-> QueryResult.frames
|
|
197
202
|
```
|
|
198
203
|
|
|
199
204
|
## Manager API
|
|
@@ -303,7 +308,15 @@ const backend = createRestDatasourceManager({
|
|
|
303
308
|
typeGet: (type) => `/catalog/datasource-types/${type}`,
|
|
304
309
|
instancesList: (queryString) => `/connections${queryString}`,
|
|
305
310
|
query: () => '/query/run',
|
|
311
|
+
batchQuery: () => '/query/batch',
|
|
306
312
|
},
|
|
313
|
+
serializeQueryBody: (request, context) => ({
|
|
314
|
+
request,
|
|
315
|
+
context: {
|
|
316
|
+
variables: context?.variables,
|
|
317
|
+
timeRange: context?.timeRange,
|
|
318
|
+
},
|
|
319
|
+
}),
|
|
307
320
|
unwrap: (body) => body.data,
|
|
308
321
|
createError: (response, body) => {
|
|
309
322
|
if (response.status === 500) {
|
|
@@ -50,6 +50,35 @@ var DatasourceTransportError = class extends Error {
|
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
// src/types.ts
|
|
54
|
+
function tableRowsToFrame(input) {
|
|
55
|
+
return {
|
|
56
|
+
...input.name !== void 0 ? { name: input.name } : {},
|
|
57
|
+
frameType: "table",
|
|
58
|
+
fields: input.columns.map((column, columnIndex) => ({
|
|
59
|
+
name: column.name,
|
|
60
|
+
...column.type !== void 0 ? { type: column.type } : {},
|
|
61
|
+
values: input.rows.map((row) => row[columnIndex]),
|
|
62
|
+
...column.meta !== void 0 ? { meta: column.meta } : {}
|
|
63
|
+
})),
|
|
64
|
+
...input.meta !== void 0 ? { meta: input.meta } : {}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function tableFrameToRows(frame) {
|
|
68
|
+
const rowCount = frame.fields.reduce((max, field) => Math.max(max, field.values.length), 0);
|
|
69
|
+
return {
|
|
70
|
+
columns: frame.fields.map((field) => ({
|
|
71
|
+
name: field.name,
|
|
72
|
+
...field.type !== void 0 ? { type: field.type } : {},
|
|
73
|
+
...field.meta !== void 0 ? { meta: field.meta } : {}
|
|
74
|
+
})),
|
|
75
|
+
rows: Array.from(
|
|
76
|
+
{ length: rowCount },
|
|
77
|
+
(_, rowIndex) => frame.fields.map((field) => field.values[rowIndex])
|
|
78
|
+
)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export { DatasourceCapabilityError, DatasourceConflictError, DatasourceForbiddenError, DatasourceNotFoundError, DatasourceTransportError, DatasourceTypeNotRegisteredError, DatasourceUnauthorizedError, DatasourceValidationError, tableFrameToRows, tableRowsToFrame };
|
|
83
|
+
//# sourceMappingURL=chunk-NSZRSVET.js.map
|
|
84
|
+
//# sourceMappingURL=chunk-NSZRSVET.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/types.ts"],"names":[],"mappings":"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","file":"chunk-NSZRSVET.js","sourcesContent":["export class DatasourceNotFoundError extends Error {\n constructor(uid: string) {\n super(`datasource \"${uid}\" not found`)\n this.name = 'DatasourceNotFoundError'\n }\n}\n\nexport class DatasourceCapabilityError extends Error {\n constructor(uid: string, capability: string) {\n super(`datasource \"${uid}\" does not support ${capability}`)\n this.name = 'DatasourceCapabilityError'\n }\n}\n\nexport class DatasourceTypeNotRegisteredError extends Error {\n constructor(type: string) {\n super(`datasource type \"${type}\" is not registered`)\n this.name = 'DatasourceTypeNotRegisteredError'\n }\n}\n\nexport class DatasourceUnauthorizedError extends Error {\n constructor(message = 'datasource request is not authenticated') {\n super(message)\n this.name = 'DatasourceUnauthorizedError'\n }\n}\n\nexport class DatasourceForbiddenError extends Error {\n constructor(message = 'datasource request is not allowed') {\n super(message)\n this.name = 'DatasourceForbiddenError'\n }\n}\n\nexport class DatasourceConflictError extends Error {\n constructor(message = 'datasource was modified by another actor') {\n super(message)\n this.name = 'DatasourceConflictError'\n }\n}\n\nexport class DatasourceValidationError extends Error {\n constructor(\n message = 'datasource validation failed',\n readonly errors?: string[],\n ) {\n super(message)\n this.name = 'DatasourceValidationError'\n }\n}\n\nexport class DatasourceTransportError extends Error {\n constructor(\n message = 'datasource backend request failed',\n readonly status?: number,\n ) {\n super(message)\n this.name = 'DatasourceTransportError'\n }\n}\n","export interface AuthSubject {\n id: string\n roles?: string[]\n groups?: string[]\n attributes?: Record<string, unknown>\n}\n\nexport interface AuthContext {\n subject?: AuthSubject\n tenantId?: string\n attributes?: Record<string, unknown>\n}\n\nexport interface DataQuery<TQuery = unknown> {\n id: string\n datasourceUid: string\n datasourceType?: string\n query?: TQuery\n options?: Record<string, unknown>\n cacheTtlMs?: number\n staleWhileRevalidate?: boolean\n permissions?: unknown[]\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceContext {\n authToken?: string\n headers?: Record<string, string>\n signal?: AbortSignal\n variables?: Record<string, string | string[]>\n timeRange?: { from: string; to: string; raw?: { from: string; to: string } }\n authContext?: AuthContext\n builtins?: Record<string, string>\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourcePermissionHint {\n canRead?: boolean\n canCreate?: boolean\n canUpdate?: boolean\n canDelete?: boolean\n canQuery?: boolean\n canManage?: boolean\n reason?: string\n}\n\nexport interface DatasourceTypeInfo {\n type: string\n name: string\n description?: string\n enabled?: boolean\n installed?: boolean\n permissions?: DatasourcePermissionHint\n hasConfigEditor?: boolean\n hasQueryEditor?: boolean\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceInstance<TOptions = unknown> {\n uid: string\n type: string\n name: string\n options?: TOptions\n enabled?: boolean\n version?: string\n createdAt?: string\n updatedAt?: string\n permissions?: DatasourcePermissionHint\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceCreateInput<TOptions = unknown> {\n uid?: string\n type: string\n name: string\n options?: TOptions\n enabled?: boolean\n meta?: Record<string, unknown>\n}\n\nexport type DatasourceUpdateInput<TOptions = unknown> =\n Partial<Omit<DatasourceCreateInput<TOptions>, 'uid' | 'type'>> & {\n version?: string\n }\n\nexport interface DatasourceListFilter {\n type?: string | string[]\n enabled?: boolean\n search?: string\n}\n\nexport interface DatasourceListOptions {\n filter?: DatasourceListFilter\n page?: number\n pageSize?: number\n cursor?: string\n}\n\nexport interface DatasourceListResult {\n items: DatasourceInstance[]\n total?: number\n nextCursor?: string\n}\n\nexport type DatasourceFrameType = string\nexport type DatasourceFieldKind = string\n\nexport interface DatasourceField {\n name: string\n kind?: DatasourceFieldKind\n type?: string\n labels?: Record<string, string>\n values: unknown[]\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceFrame {\n name?: string\n frameType: DatasourceFrameType\n fields: DatasourceField[]\n meta?: Record<string, unknown>\n}\n\nexport interface QueryStats {\n executionTimeMs?: number\n rowsReturned?: number\n bytesRead?: number\n meta?: Record<string, unknown>\n}\n\nexport interface QueryInspect {\n rawQuery?: string\n executedQuery?: string\n meta?: Record<string, unknown>\n}\n\nexport interface QueryResult {\n frames: DatasourceFrame[]\n stats?: QueryStats\n inspect?: QueryInspect\n requestId?: string\n meta?: Record<string, unknown>\n}\n\nexport interface TableRowsInput {\n columns: Array<{ name: string; type?: string; meta?: Record<string, unknown> }>\n rows: unknown[][]\n name?: string\n meta?: Record<string, unknown>\n}\n\nexport interface TableRowsOutput {\n columns: Array<{ name: string; type?: string; meta?: Record<string, unknown> }>\n rows: unknown[][]\n}\n\nexport function tableRowsToFrame(input: TableRowsInput): DatasourceFrame {\n return {\n ...(input.name !== undefined ? { name: input.name } : {}),\n frameType: 'table',\n fields: input.columns.map((column, columnIndex) => ({\n name: column.name,\n ...(column.type !== undefined ? { type: column.type } : {}),\n values: input.rows.map((row) => row[columnIndex]),\n ...(column.meta !== undefined ? { meta: column.meta } : {}),\n })),\n ...(input.meta !== undefined ? { meta: input.meta } : {}),\n }\n}\n\nexport function tableFrameToRows(frame: DatasourceFrame): TableRowsOutput {\n const rowCount = frame.fields.reduce((max, field) => Math.max(max, field.values.length), 0)\n return {\n columns: frame.fields.map((field) => ({\n name: field.name,\n ...(field.type !== undefined ? { type: field.type } : {}),\n ...(field.meta !== undefined ? { meta: field.meta } : {}),\n })),\n rows: Array.from({ length: rowCount }, (_, rowIndex) =>\n frame.fields.map((field) => field.values[rowIndex]),\n ),\n }\n}\n\nexport interface VariableOption {\n label: string\n value: string\n}\n\nexport interface DatasourceValidationResult {\n valid: boolean\n errors?: string[]\n}\n\nexport interface DatasourceHealthResult {\n ok: boolean\n message?: string\n details?: Record<string, unknown>\n}\n\nexport type DatasourceSchemaKind = string\n\nexport interface DatasourceSchemaNamespace {\n id: string\n name: string\n kind?: DatasourceSchemaKind\n parentId?: string\n hasChildren?: boolean\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceSchemaFieldRequest {\n namespaceId: string\n}\n\nexport interface DatasourceSchemaField {\n name: string\n type?: string\n kind?: DatasourceFieldKind\n nullable?: boolean\n label?: string\n insertText?: string\n meta?: Record<string, unknown>\n}\n\nexport interface AnnotationQuery<TQuery = unknown> {\n id: string\n datasourceUid: string\n name?: string\n query?: TQuery\n options?: Record<string, unknown>\n hide?: boolean\n color?: string\n}\n\nexport type BatchQueryResultItem =\n | { id: string; data: QueryResult; error?: never }\n | { id: string; data?: never; error: Error }\n\nexport interface BatchQueryResult {\n items: BatchQueryResultItem[]\n}\n\nexport interface Annotation {\n id?: string\n time: number\n timeEnd?: number\n title?: string\n text?: string\n tags?: string[]\n color?: string\n source?: AnnotationQuery\n meta?: Record<string, unknown>\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -134,6 +134,16 @@ async function getInstanceOptions(backend, uid, context) {
|
|
|
134
134
|
function missingCapability(uid, capability) {
|
|
135
135
|
throw new DatasourceCapabilityError(uid, capability);
|
|
136
136
|
}
|
|
137
|
+
function ensureBatchResultIds(result) {
|
|
138
|
+
return {
|
|
139
|
+
items: result.items.map((item, index) => {
|
|
140
|
+
if (item.id) return item;
|
|
141
|
+
throw new DatasourceValidationError("batch query result item is missing id", [
|
|
142
|
+
`items[${index}].id is required`
|
|
143
|
+
]);
|
|
144
|
+
})
|
|
145
|
+
};
|
|
146
|
+
}
|
|
137
147
|
function createDatasourceManager(options) {
|
|
138
148
|
const registry = options.registry ?? createDatasourceRegistry(options.plugins);
|
|
139
149
|
if (options.registry && options.plugins) {
|
|
@@ -187,14 +197,14 @@ function createDatasourceManager(options) {
|
|
|
187
197
|
},
|
|
188
198
|
async batchQuery(requests, context, callOptions) {
|
|
189
199
|
if (options.backend.batchQuery) {
|
|
190
|
-
const result = await options.backend.batchQuery(requests, context);
|
|
200
|
+
const result = ensureBatchResultIds(await options.backend.batchQuery(requests, context));
|
|
191
201
|
if (!callOptions?.transform) return result;
|
|
192
202
|
const items2 = await Promise.all(result.items.map(async (item) => {
|
|
193
203
|
if (item.error || !item.data) return item;
|
|
194
204
|
try {
|
|
195
|
-
return { data: await callOptions.transform(item.data) };
|
|
205
|
+
return { id: item.id, data: await callOptions.transform(item.data) };
|
|
196
206
|
} catch (error) {
|
|
197
|
-
return { error: error instanceof Error ? error : new Error(String(error)) };
|
|
207
|
+
return { id: item.id, error: error instanceof Error ? error : new Error(String(error)) };
|
|
198
208
|
}
|
|
199
209
|
}));
|
|
200
210
|
return { items: items2 };
|
|
@@ -202,9 +212,9 @@ function createDatasourceManager(options) {
|
|
|
202
212
|
const items = await Promise.all(requests.map(async (request) => {
|
|
203
213
|
try {
|
|
204
214
|
const data = await manager.instances.query(request, context, callOptions);
|
|
205
|
-
return { data };
|
|
215
|
+
return { id: request.id, data };
|
|
206
216
|
} catch (error) {
|
|
207
|
-
return { error: error instanceof Error ? error : new Error(String(error)) };
|
|
217
|
+
return { id: request.id, error: error instanceof Error ? error : new Error(String(error)) };
|
|
208
218
|
}
|
|
209
219
|
}));
|
|
210
220
|
return { items };
|
|
@@ -254,6 +264,7 @@ var defaultRestPaths = {
|
|
|
254
264
|
instanceUpdate: (uid) => `/${encodeURIComponent(uid)}`,
|
|
255
265
|
instanceDelete: (uid) => `/${encodeURIComponent(uid)}`,
|
|
256
266
|
query: () => "/query",
|
|
267
|
+
batchQuery: () => "/batch-query",
|
|
257
268
|
healthCheck: (uid) => `/${encodeURIComponent(uid)}/health`,
|
|
258
269
|
validateQuery: (uid) => `/${encodeURIComponent(uid)}/validate-query`,
|
|
259
270
|
listNamespaces: (uid) => `/${encodeURIComponent(uid)}/namespaces`,
|
|
@@ -344,7 +355,11 @@ function createRestDatasourceManager(options) {
|
|
|
344
355
|
},
|
|
345
356
|
query: (request, context) => send(paths.query(), {
|
|
346
357
|
method: "POST",
|
|
347
|
-
body: JSON.stringify(request)
|
|
358
|
+
body: JSON.stringify(options.serializeQueryBody?.(request, context) ?? request)
|
|
359
|
+
}, context),
|
|
360
|
+
batchQuery: (requests, context) => send(paths.batchQuery(), {
|
|
361
|
+
method: "POST",
|
|
362
|
+
body: JSON.stringify(options.serializeBatchQueryBody?.(requests, context) ?? requests)
|
|
348
363
|
}, context),
|
|
349
364
|
healthCheck: (uid, context) => send(paths.healthCheck(uid), { method: "GET" }, context),
|
|
350
365
|
validateQuery: (uid, query, context) => send(paths.validateQuery(uid), {
|
|
@@ -364,6 +379,35 @@ function defineDatasourcePlugin(def) {
|
|
|
364
379
|
return def;
|
|
365
380
|
}
|
|
366
381
|
|
|
382
|
+
// src/types.ts
|
|
383
|
+
function tableRowsToFrame(input) {
|
|
384
|
+
return {
|
|
385
|
+
...input.name !== void 0 ? { name: input.name } : {},
|
|
386
|
+
frameType: "table",
|
|
387
|
+
fields: input.columns.map((column, columnIndex) => ({
|
|
388
|
+
name: column.name,
|
|
389
|
+
...column.type !== void 0 ? { type: column.type } : {},
|
|
390
|
+
values: input.rows.map((row) => row[columnIndex]),
|
|
391
|
+
...column.meta !== void 0 ? { meta: column.meta } : {}
|
|
392
|
+
})),
|
|
393
|
+
...input.meta !== void 0 ? { meta: input.meta } : {}
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
function tableFrameToRows(frame) {
|
|
397
|
+
const rowCount = frame.fields.reduce((max, field) => Math.max(max, field.values.length), 0);
|
|
398
|
+
return {
|
|
399
|
+
columns: frame.fields.map((field) => ({
|
|
400
|
+
name: field.name,
|
|
401
|
+
...field.type !== void 0 ? { type: field.type } : {},
|
|
402
|
+
...field.meta !== void 0 ? { meta: field.meta } : {}
|
|
403
|
+
})),
|
|
404
|
+
rows: Array.from(
|
|
405
|
+
{ length: rowCount },
|
|
406
|
+
(_, rowIndex) => frame.fields.map((field) => field.values[rowIndex])
|
|
407
|
+
)
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
|
|
367
411
|
exports.DatasourceCapabilityError = DatasourceCapabilityError;
|
|
368
412
|
exports.DatasourceConflictError = DatasourceConflictError;
|
|
369
413
|
exports.DatasourceForbiddenError = DatasourceForbiddenError;
|
|
@@ -376,5 +420,7 @@ exports.createDatasourceManager = createDatasourceManager;
|
|
|
376
420
|
exports.createDatasourceRegistry = createDatasourceRegistry;
|
|
377
421
|
exports.createRestDatasourceManager = createRestDatasourceManager;
|
|
378
422
|
exports.defineDatasourcePlugin = defineDatasourcePlugin;
|
|
423
|
+
exports.tableFrameToRows = tableFrameToRows;
|
|
424
|
+
exports.tableRowsToFrame = tableRowsToFrame;
|
|
379
425
|
//# sourceMappingURL=index.cjs.map
|
|
380
426
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/registry.ts","../src/manager.ts","../src/plugin.ts"],"names":["items","options"],"mappings":"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","file":"index.cjs","sourcesContent":["export class DatasourceNotFoundError extends Error {\n constructor(uid: string) {\n super(`datasource \"${uid}\" not found`)\n this.name = 'DatasourceNotFoundError'\n }\n}\n\nexport class DatasourceCapabilityError extends Error {\n constructor(uid: string, capability: string) {\n super(`datasource \"${uid}\" does not support ${capability}`)\n this.name = 'DatasourceCapabilityError'\n }\n}\n\nexport class DatasourceTypeNotRegisteredError extends Error {\n constructor(type: string) {\n super(`datasource type \"${type}\" is not registered`)\n this.name = 'DatasourceTypeNotRegisteredError'\n }\n}\n\nexport class DatasourceUnauthorizedError extends Error {\n constructor(message = 'datasource request is not authenticated') {\n super(message)\n this.name = 'DatasourceUnauthorizedError'\n }\n}\n\nexport class DatasourceForbiddenError extends Error {\n constructor(message = 'datasource request is not allowed') {\n super(message)\n this.name = 'DatasourceForbiddenError'\n }\n}\n\nexport class DatasourceConflictError extends Error {\n constructor(message = 'datasource was modified by another actor') {\n super(message)\n this.name = 'DatasourceConflictError'\n }\n}\n\nexport class DatasourceValidationError extends Error {\n constructor(\n message = 'datasource validation failed',\n readonly errors?: string[],\n ) {\n super(message)\n this.name = 'DatasourceValidationError'\n }\n}\n\nexport class DatasourceTransportError extends Error {\n constructor(\n message = 'datasource backend request failed',\n readonly status?: number,\n ) {\n super(message)\n this.name = 'DatasourceTransportError'\n }\n}\n","import type {\n DatasourceConfigEditorProps,\n DatasourcePluginDef,\n DatasourceQueryEditorProps,\n} from './plugin'\n\nexport interface DatasourceRegistry {\n register(plugin: DatasourcePluginDef): void\n get(type: string): DatasourcePluginDef | undefined\n has(type: string): boolean\n list(): DatasourcePluginDef[]\n getConfigEditor(\n type: string,\n ): ((props: DatasourceConfigEditorProps<unknown>) => unknown) | undefined\n getQueryEditor(\n type: string,\n ): ((props: DatasourceQueryEditorProps<unknown, unknown>) => unknown) | undefined\n}\n\nexport function createDatasourceRegistry(\n plugins: readonly DatasourcePluginDef[] = [],\n): DatasourceRegistry {\n const byType = new Map<string, DatasourcePluginDef>()\n\n const registry: DatasourceRegistry = {\n register(plugin) {\n byType.set(plugin.type, plugin)\n },\n\n get(type) {\n return byType.get(type)\n },\n\n has(type) {\n return byType.has(type)\n },\n\n list() {\n return [...byType.values()]\n },\n\n getConfigEditor(type) {\n return byType.get(type)?.configEditor as\n | ((props: DatasourceConfigEditorProps<unknown>) => unknown)\n | undefined\n },\n\n getQueryEditor(type) {\n return byType.get(type)?.queryEditor as\n | ((props: DatasourceQueryEditorProps<unknown, unknown>) => unknown)\n | undefined\n },\n }\n\n for (const plugin of plugins) registry.register(plugin)\n\n return registry\n}\n","import {\n DatasourceCapabilityError,\n DatasourceConflictError,\n DatasourceForbiddenError,\n DatasourceNotFoundError,\n DatasourceTransportError,\n DatasourceTypeNotRegisteredError,\n DatasourceUnauthorizedError,\n DatasourceValidationError,\n} from './errors'\nimport type { DatasourcePluginDef } from './plugin'\nimport { createDatasourceRegistry, type DatasourceRegistry } from './registry'\nimport type {\n BatchQueryResult,\n DataQuery,\n DatasourceContext,\n DatasourceCreateInput,\n DatasourceHealthResult,\n DatasourceInstance,\n DatasourceListOptions,\n DatasourceListResult,\n DatasourceSchemaField,\n DatasourceSchemaFieldRequest,\n DatasourceSchemaNamespace,\n DatasourceTypeInfo,\n DatasourceUpdateInput,\n DatasourceValidationResult,\n QueryResult,\n} from './types'\n\nexport interface QueryCallOptions {\n transform?: (result: QueryResult) => QueryResult | Promise<QueryResult>\n}\n\nexport interface DatasourceManagerTypes {\n list(context?: DatasourceContext): Promise<DatasourceTypeInfo[]>\n get(type: string, context?: DatasourceContext): Promise<DatasourceTypeInfo>\n install?(type: string, context?: DatasourceContext): Promise<void>\n uninstall?(type: string, context?: DatasourceContext): Promise<void>\n enable?(type: string, context?: DatasourceContext): Promise<void>\n disable?(type: string, context?: DatasourceContext): Promise<void>\n}\n\nexport interface DatasourceManagerInstances {\n list(options?: DatasourceListOptions, context?: DatasourceContext): Promise<DatasourceListResult>\n get(uid: string, context?: DatasourceContext): Promise<DatasourceInstance>\n create(\n input: DatasourceCreateInput,\n context?: DatasourceContext,\n ): Promise<DatasourceInstance>\n update(\n uid: string,\n patch: DatasourceUpdateInput,\n context?: DatasourceContext,\n ): Promise<DatasourceInstance>\n delete(uid: string, context?: DatasourceContext): Promise<void>\n query(\n request: DataQuery,\n context?: DatasourceContext,\n options?: QueryCallOptions,\n ): Promise<QueryResult>\n batchQuery(\n requests: DataQuery[],\n context?: DatasourceContext,\n options?: QueryCallOptions,\n ): Promise<BatchQueryResult>\n healthCheck(uid: string, type: string, context?: DatasourceContext): Promise<DatasourceHealthResult>\n validateQuery(\n uid: string,\n type: string,\n query: unknown,\n context?: DatasourceContext,\n ): Promise<DatasourceValidationResult>\n listNamespaces(\n uid: string,\n type: string,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaNamespace[]>\n listFields(\n uid: string,\n type: string,\n request: DatasourceSchemaFieldRequest,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaField[]>\n}\n\nexport interface DatasourceManager {\n registerPlugin(plugin: DatasourcePluginDef): void\n registry: DatasourceRegistry\n types: DatasourceManagerTypes\n instances: DatasourceManagerInstances\n}\n\nexport interface DatasourceManagerBackend {\n types: {\n list(context?: DatasourceContext): Promise<DatasourceTypeInfo[]>\n get(type: string, context?: DatasourceContext): Promise<DatasourceTypeInfo>\n install?(type: string, context?: DatasourceContext): Promise<void>\n uninstall?(type: string, context?: DatasourceContext): Promise<void>\n enable?(type: string, context?: DatasourceContext): Promise<void>\n disable?(type: string, context?: DatasourceContext): Promise<void>\n }\n instances: {\n list(options?: DatasourceListOptions, context?: DatasourceContext): Promise<DatasourceListResult>\n get(uid: string, context?: DatasourceContext): Promise<DatasourceInstance>\n create(\n input: DatasourceCreateInput,\n context?: DatasourceContext,\n ): Promise<DatasourceInstance>\n update(\n uid: string,\n patch: DatasourceUpdateInput,\n context?: DatasourceContext,\n ): Promise<DatasourceInstance>\n delete(uid: string, context?: DatasourceContext): Promise<void>\n }\n query(request: DataQuery, context?: DatasourceContext): Promise<unknown>\n batchQuery?(requests: DataQuery[], context?: DatasourceContext): Promise<BatchQueryResult>\n healthCheck?(uid: string, context?: DatasourceContext): Promise<DatasourceHealthResult>\n validateQuery?(\n uid: string,\n query: unknown,\n context?: DatasourceContext,\n ): Promise<DatasourceValidationResult>\n listNamespaces?(uid: string, context?: DatasourceContext): Promise<DatasourceSchemaNamespace[]>\n listFields?(\n uid: string,\n request: DatasourceSchemaFieldRequest,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaField[]>\n}\n\nexport interface CreateDatasourceManagerOptions {\n registry?: DatasourceRegistry\n plugins?: readonly DatasourcePluginDef[]\n backend: DatasourceManagerBackend\n}\n\nfunction getRequestType(request: DataQuery): string {\n if (!request.datasourceType) {\n throw new DatasourceValidationError('query request requires datasourceType', [\n 'datasourceType is required for plugin routing',\n ])\n }\n return request.datasourceType\n}\n\nfunction getPlugin(registry: DatasourceRegistry, type: string): DatasourcePluginDef {\n const plugin = registry.get(type)\n if (!plugin) throw new DatasourceTypeNotRegisteredError(type)\n return plugin\n}\n\nasync function normalizeQueryResult(\n raw: unknown,\n request: DataQuery,\n context: DatasourceContext | undefined,\n plugin: DatasourcePluginDef,\n options: QueryCallOptions | undefined,\n): Promise<QueryResult> {\n const normalized = plugin.backend?.transform\n ? await plugin.backend.transform(raw, request, context)\n : raw as QueryResult\n return options?.transform ? options.transform(normalized) : normalized\n}\n\nfunction typeInfoFromPlugin(plugin: DatasourcePluginDef): DatasourceTypeInfo {\n return {\n type: plugin.type,\n name: plugin.name,\n ...(plugin.description !== undefined ? { description: plugin.description } : {}),\n installed: false,\n enabled: false,\n hasConfigEditor: plugin.configEditor !== undefined,\n hasQueryEditor: plugin.queryEditor !== undefined,\n ...(plugin.meta !== undefined ? { meta: plugin.meta } : {}),\n }\n}\n\nfunction mergeTypeInfo(\n backendTypes: DatasourceTypeInfo[],\n plugins: DatasourcePluginDef[],\n): DatasourceTypeInfo[] {\n const byType = new Map<string, DatasourceTypeInfo>()\n for (const typeInfo of backendTypes) byType.set(typeInfo.type, { ...typeInfo })\n\n for (const plugin of plugins) {\n const current = byType.get(plugin.type)\n if (current) {\n byType.set(plugin.type, {\n ...current,\n name: current.name || plugin.name,\n hasConfigEditor: plugin.configEditor !== undefined,\n hasQueryEditor: plugin.queryEditor !== undefined,\n })\n } else {\n byType.set(plugin.type, typeInfoFromPlugin(plugin))\n }\n }\n\n return [...byType.values()]\n}\n\nasync function getInstanceOptions(\n backend: DatasourceManagerBackend,\n uid: string,\n context?: DatasourceContext,\n): Promise<unknown> {\n const instance = await backend.instances.get(uid, context)\n return instance.options ?? {}\n}\n\nfunction missingCapability(uid: string, capability: string): never {\n throw new DatasourceCapabilityError(uid, capability)\n}\n\nexport function createDatasourceManager(options: CreateDatasourceManagerOptions): DatasourceManager {\n const registry = options.registry ?? createDatasourceRegistry(options.plugins)\n\n if (options.registry && options.plugins) {\n for (const plugin of options.plugins) registry.register(plugin)\n }\n\n const manager: DatasourceManager = {\n registry,\n\n registerPlugin(plugin) {\n registry.register(plugin)\n },\n\n types: {\n async list(context) {\n const backendTypes = await options.backend.types.list(context)\n return mergeTypeInfo(backendTypes, registry.list())\n },\n\n async get(type, context) {\n const plugin = registry.get(type)\n let backendType: DatasourceTypeInfo | undefined\n try {\n backendType = await options.backend.types.get(type, context)\n } catch (error) {\n if (!(error instanceof DatasourceNotFoundError) || !plugin) throw error\n }\n if (!backendType) {\n if (!plugin) throw new DatasourceNotFoundError(type)\n return typeInfoFromPlugin(plugin)\n }\n if (!plugin) return backendType\n return {\n ...backendType,\n hasConfigEditor: plugin.configEditor !== undefined,\n hasQueryEditor: plugin.queryEditor !== undefined,\n }\n },\n\n ...(options.backend.types.install\n ? { install: (type, context) => options.backend.types.install?.(type, context) ?? missingCapability(type, 'types.install') }\n : {}),\n ...(options.backend.types.uninstall\n ? { uninstall: (type, context) => options.backend.types.uninstall?.(type, context) ?? missingCapability(type, 'types.uninstall') }\n : {}),\n ...(options.backend.types.enable\n ? { enable: (type, context) => options.backend.types.enable?.(type, context) ?? missingCapability(type, 'types.enable') }\n : {}),\n ...(options.backend.types.disable\n ? { disable: (type, context) => options.backend.types.disable?.(type, context) ?? missingCapability(type, 'types.disable') }\n : {}),\n },\n\n instances: {\n list: (listOptions, context) => options.backend.instances.list(listOptions, context),\n get: (uid, context) => options.backend.instances.get(uid, context),\n create: (input, context) => options.backend.instances.create(input, context),\n update: (uid, patch, context) => options.backend.instances.update(uid, patch, context),\n delete: (uid, context) => options.backend.instances.delete(uid, context),\n\n async query(request, context, callOptions) {\n const type = getRequestType(request)\n const plugin = getPlugin(registry, type)\n const raw = plugin.backend?.query\n ? await plugin.backend.query(request, context)\n : await options.backend.query(request, context)\n return normalizeQueryResult(raw, request, context, plugin, callOptions)\n },\n\n async batchQuery(requests, context, callOptions) {\n if (options.backend.batchQuery) {\n const result = await options.backend.batchQuery(requests, context)\n if (!callOptions?.transform) return result\n const items = await Promise.all(result.items.map(async (item) => {\n if (item.error || !item.data) return item\n try {\n return { data: await callOptions.transform!(item.data) }\n } catch (error) {\n return { error: error instanceof Error ? error : new Error(String(error)) }\n }\n }))\n return { items }\n }\n\n const items = await Promise.all(requests.map(async (request) => {\n try {\n const data = await manager.instances.query(request, context, callOptions)\n return { data }\n } catch (error) {\n return { error: error instanceof Error ? error : new Error(String(error)) }\n }\n }))\n return { items }\n },\n\n async healthCheck(uid, type, context) {\n const plugin = getPlugin(registry, type)\n if (plugin.backend?.healthCheck) {\n const datasourceOptions = await getInstanceOptions(options.backend, uid, context)\n return plugin.backend.healthCheck(uid, datasourceOptions, context)\n }\n return options.backend.healthCheck?.(uid, context) ?? missingCapability(uid, 'healthCheck')\n },\n\n async validateQuery(uid, type, query, context) {\n const plugin = getPlugin(registry, type)\n if (plugin.backend?.validateQuery) {\n return plugin.backend.validateQuery(uid, query, context)\n }\n return options.backend.validateQuery?.(uid, query, context) ?? missingCapability(uid, 'validateQuery')\n },\n\n async listNamespaces(uid, type, context) {\n const plugin = getPlugin(registry, type)\n if (plugin.backend?.listNamespaces) {\n const datasourceOptions = await getInstanceOptions(options.backend, uid, context)\n return plugin.backend.listNamespaces(uid, datasourceOptions, context)\n }\n return options.backend.listNamespaces?.(uid, context) ?? missingCapability(uid, 'listNamespaces')\n },\n\n async listFields(uid, type, request, context) {\n const plugin = getPlugin(registry, type)\n if (plugin.backend?.listFields) {\n const datasourceOptions = await getInstanceOptions(options.backend, uid, context)\n return plugin.backend.listFields(uid, request, datasourceOptions, context)\n }\n return options.backend.listFields?.(uid, request, context) ?? missingCapability(uid, 'listFields')\n },\n },\n }\n\n return manager\n}\n\nexport interface CreateRestDatasourceManagerOptions {\n baseUrl: string\n fetch?: typeof fetch\n getHeaders?: (context?: DatasourceContext) => HeadersInit | Promise<HeadersInit>\n paths?: Partial<RestDatasourceManagerPaths>\n unwrap?<T>(body: unknown, response: Response): T\n createError?(response: Response, body: unknown): Error | undefined\n}\n\nexport interface RestDatasourceManagerPaths {\n typesList(): string\n typeGet(type: string): string\n typeAction(type: string, action: 'install' | 'uninstall' | 'enable' | 'disable'): string\n instancesList(queryString: string): string\n instanceGet(uid: string): string\n instanceCreate(): string\n instanceUpdate(uid: string): string\n instanceDelete(uid: string): string\n query(): string\n healthCheck(uid: string): string\n validateQuery(uid: string): string\n listNamespaces(uid: string): string\n listFields(uid: string): string\n}\n\nconst defaultRestPaths: RestDatasourceManagerPaths = {\n typesList: () => '/types',\n typeGet: (type) => `/types/${encodeURIComponent(type)}`,\n typeAction: (type, action) => `/types/${encodeURIComponent(type)}/${action}`,\n instancesList: (qs) => qs,\n instanceGet: (uid) => `/${encodeURIComponent(uid)}`,\n instanceCreate: () => '',\n instanceUpdate: (uid) => `/${encodeURIComponent(uid)}`,\n instanceDelete: (uid) => `/${encodeURIComponent(uid)}`,\n query: () => '/query',\n healthCheck: (uid) => `/${encodeURIComponent(uid)}/health`,\n validateQuery: (uid) => `/${encodeURIComponent(uid)}/validate-query`,\n listNamespaces: (uid) => `/${encodeURIComponent(uid)}/namespaces`,\n listFields: (uid) => `/${encodeURIComponent(uid)}/fields`,\n}\n\nfunction mergeRestPaths(paths?: Partial<RestDatasourceManagerPaths>): RestDatasourceManagerPaths {\n return { ...defaultRestPaths, ...paths }\n}\n\nasync function readJson(response: Response): Promise<unknown> {\n if (response.status === 204) return undefined\n try {\n return await response.json()\n } catch {\n return undefined\n }\n}\n\nasync function parseResponse<T>(\n response: Response,\n options: CreateRestDatasourceManagerOptions,\n): Promise<T> {\n const body = await readJson(response)\n\n if (response.ok) {\n return options.unwrap ? options.unwrap<T>(body, response) : body as T\n }\n\n const customError = options.createError?.(response, body)\n if (customError) throw customError\n\n const errorBody = body as { message?: string; errors?: string[] } | undefined\n const message = errorBody?.message\n if (response.status === 401) throw new DatasourceUnauthorizedError(message)\n if (response.status === 403) throw new DatasourceForbiddenError(message)\n if (response.status === 404) throw new DatasourceNotFoundError(message ?? 'unknown')\n if (response.status === 409) throw new DatasourceConflictError(message)\n if (response.status === 422) throw new DatasourceValidationError(message, errorBody?.errors)\n throw new DatasourceTransportError(message, response.status)\n}\n\nasync function requestHeaders(\n options: CreateRestDatasourceManagerOptions,\n context?: DatasourceContext,\n): Promise<HeadersInit> {\n return {\n 'content-type': 'application/json',\n ...(context?.authToken ? { authorization: `Bearer ${context.authToken}` } : {}),\n ...(context?.headers ?? {}),\n ...await options.getHeaders?.(context),\n }\n}\n\nfunction queryString(options?: DatasourceListOptions): string {\n const params = new URLSearchParams()\n if (options?.filter?.type !== undefined) {\n const types = Array.isArray(options.filter.type) ? options.filter.type : [options.filter.type]\n for (const type of types) params.append('type', type)\n }\n if (options?.filter?.enabled !== undefined) params.set('enabled', String(options.filter.enabled))\n if (options?.filter?.search !== undefined) params.set('search', options.filter.search)\n if (options?.page !== undefined) params.set('page', String(options.page))\n if (options?.pageSize !== undefined) params.set('pageSize', String(options.pageSize))\n if (options?.cursor !== undefined) params.set('cursor', options.cursor)\n const qs = params.toString()\n return qs ? `?${qs}` : ''\n}\n\nexport function createRestDatasourceManager(\n options: CreateRestDatasourceManagerOptions,\n): DatasourceManagerBackend {\n const fetchImpl = options.fetch ?? fetch\n const baseUrl = options.baseUrl.replace(/\\/$/, '')\n const paths = mergeRestPaths(options.paths)\n\n async function send<T>(\n path: string,\n init: RequestInit,\n context?: DatasourceContext,\n ): Promise<T> {\n const response = await fetchImpl(`${baseUrl}${path}`, {\n ...init,\n headers: await requestHeaders(options, context),\n ...(context?.signal ? { signal: context.signal } : {}),\n })\n return parseResponse<T>(response, options)\n }\n\n return {\n types: {\n list: (context) => send<DatasourceTypeInfo[]>(paths.typesList(), { method: 'GET' }, context),\n get: (type, context) => send<DatasourceTypeInfo>(paths.typeGet(type), { method: 'GET' }, context),\n install: (type, context) => send<void>(paths.typeAction(type, 'install'), { method: 'POST' }, context),\n uninstall: (type, context) => send<void>(paths.typeAction(type, 'uninstall'), { method: 'POST' }, context),\n enable: (type, context) => send<void>(paths.typeAction(type, 'enable'), { method: 'POST' }, context),\n disable: (type, context) => send<void>(paths.typeAction(type, 'disable'), { method: 'POST' }, context),\n },\n instances: {\n list: (options, context) => send<DatasourceListResult>(paths.instancesList(queryString(options)), { method: 'GET' }, context),\n get: (uid, context) => send<DatasourceInstance>(paths.instanceGet(uid), { method: 'GET' }, context),\n create: (input, context) => send<DatasourceInstance>(paths.instanceCreate(), {\n method: 'POST',\n body: JSON.stringify(input),\n }, context),\n update: (uid, patch, context) => send<DatasourceInstance>(paths.instanceUpdate(uid), {\n method: 'PATCH',\n body: JSON.stringify(patch),\n }, context),\n delete: (uid, context) => send<void>(paths.instanceDelete(uid), { method: 'DELETE' }, context),\n },\n query: (request, context) => send<unknown>(paths.query(), {\n method: 'POST',\n body: JSON.stringify(request),\n }, context),\n healthCheck: (uid, context) => send<DatasourceHealthResult>(paths.healthCheck(uid), { method: 'GET' }, context),\n validateQuery: (uid, query, context) => send<DatasourceValidationResult>(paths.validateQuery(uid), {\n method: 'POST',\n body: JSON.stringify(query),\n }, context),\n listNamespaces: (uid, context) => send<DatasourceSchemaNamespace[]>(paths.listNamespaces(uid), { method: 'GET' }, context),\n listFields: (uid, request, context) => send<DatasourceSchemaField[]>(paths.listFields(uid), {\n method: 'POST',\n body: JSON.stringify(request),\n }, context),\n }\n}\n","import type {\n DataQuery,\n DatasourceContext,\n DatasourceHealthResult,\n DatasourceInstance,\n DatasourceSchemaField,\n DatasourceSchemaFieldRequest,\n DatasourceSchemaNamespace,\n DatasourceValidationResult,\n QueryResult,\n} from './types'\n\nexport interface DatasourceConfigEditorProps<TOptions = unknown> {\n instance: DatasourceInstance<TOptions>\n options: TOptions\n onChange(options: TOptions): void\n onSave(): void\n}\n\nexport interface DatasourceQueryEditorProps<TOptions = unknown, TQuery = unknown> {\n instance: DatasourceInstance<TOptions>\n query: TQuery\n onChange(query: TQuery): void\n onRunQuery(): void\n}\n\nexport interface DatasourcePluginBackend<TOptions = unknown, TQuery = unknown> {\n query?(request: DataQuery<TQuery>, context?: DatasourceContext): Promise<unknown>\n transform?(\n raw: unknown,\n request: DataQuery<TQuery>,\n context?: DatasourceContext,\n ): QueryResult | Promise<QueryResult>\n healthCheck?(\n uid: string,\n options: TOptions,\n context?: DatasourceContext,\n ): Promise<DatasourceHealthResult>\n validateQuery?(\n uid: string,\n query: TQuery,\n context?: DatasourceContext,\n ): Promise<DatasourceValidationResult>\n listNamespaces?(\n uid: string,\n options: TOptions,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaNamespace[]>\n listFields?(\n uid: string,\n request: DatasourceSchemaFieldRequest,\n options: TOptions,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaField[]>\n}\n\nexport interface DatasourcePluginDef<TOptions = unknown, TQuery = unknown> {\n type: string\n name: string\n description?: string\n configEditor?(props: DatasourceConfigEditorProps<TOptions>): unknown\n queryEditor?(props: DatasourceQueryEditorProps<TOptions, TQuery>): unknown\n backend?: DatasourcePluginBackend<TOptions, TQuery>\n meta?: Record<string, unknown>\n}\n\nexport function defineDatasourcePlugin<TOptions = unknown, TQuery = unknown>(\n def: DatasourcePluginDef<TOptions, TQuery>,\n): DatasourcePluginDef<TOptions, TQuery> {\n return def\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/registry.ts","../src/manager.ts","../src/plugin.ts","../src/types.ts"],"names":["items","options"],"mappings":";;;AAAO,IAAM,uBAAA,GAAN,cAAsC,KAAA,CAAM;AAAA,EACjD,YAAY,GAAA,EAAa;AACvB,IAAA,KAAA,CAAM,CAAA,YAAA,EAAe,GAAG,CAAA,WAAA,CAAa,CAAA;AACrC,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF;AAEO,IAAM,yBAAA,GAAN,cAAwC,KAAA,CAAM;AAAA,EACnD,WAAA,CAAY,KAAa,UAAA,EAAoB;AAC3C,IAAA,KAAA,CAAM,CAAA,YAAA,EAAe,GAAG,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAE,CAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,2BAAA;AAAA,EACd;AACF;AAEO,IAAM,gCAAA,GAAN,cAA+C,KAAA,CAAM;AAAA,EAC1D,YAAY,IAAA,EAAc;AACxB,IAAA,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,mBAAA,CAAqB,CAAA;AACnD,IAAA,IAAA,CAAK,IAAA,GAAO,kCAAA;AAAA,EACd;AACF;AAEO,IAAM,2BAAA,GAAN,cAA0C,KAAA,CAAM;AAAA,EACrD,WAAA,CAAY,UAAU,yCAAA,EAA2C;AAC/D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,6BAAA;AAAA,EACd;AACF;AAEO,IAAM,wBAAA,GAAN,cAAuC,KAAA,CAAM;AAAA,EAClD,WAAA,CAAY,UAAU,mCAAA,EAAqC;AACzD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;AAEO,IAAM,uBAAA,GAAN,cAAsC,KAAA,CAAM;AAAA,EACjD,WAAA,CAAY,UAAU,0CAAA,EAA4C;AAChE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF;AAEO,IAAM,yBAAA,GAAN,cAAwC,KAAA,CAAM;AAAA,EACnD,WAAA,CACE,OAAA,GAAU,8BAAA,EACD,MAAA,EACT;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFJ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGT,IAAA,IAAA,CAAK,IAAA,GAAO,2BAAA;AAAA,EACd;AACF;AAEO,IAAM,wBAAA,GAAN,cAAuC,KAAA,CAAM;AAAA,EAClD,WAAA,CACE,OAAA,GAAU,mCAAA,EACD,MAAA,EACT;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFJ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGT,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;;;ACzCO,SAAS,wBAAA,CACd,OAAA,GAA0C,EAAC,EACvB;AACpB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAiC;AAEpD,EAAA,MAAM,QAAA,GAA+B;AAAA,IACnC,SAAS,MAAA,EAAQ;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAAA,IAChC,CAAA;AAAA,IAEA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,IACxB,CAAA;AAAA,IAEA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,IACxB,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,OAAO,CAAC,GAAG,MAAA,CAAO,MAAA,EAAQ,CAAA;AAAA,IAC5B,CAAA;AAAA,IAEA,gBAAgB,IAAA,EAAM;AACpB,MAAA,OAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG,YAAA;AAAA,IAG3B,CAAA;AAAA,IAEA,eAAe,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG,WAAA;AAAA,IAG3B;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA;AAEtD,EAAA,OAAO,QAAA;AACT;;;ACkFA,SAAS,eAAe,OAAA,EAA4B;AAClD,EAAA,IAAI,CAAC,QAAQ,cAAA,EAAgB;AAC3B,IAAA,MAAM,IAAI,0BAA0B,uCAAA,EAAyC;AAAA,MAC3E;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA,CAAQ,cAAA;AACjB;AAEA,SAAS,SAAA,CAAU,UAA8B,IAAA,EAAmC;AAClF,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAChC,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,iCAAiC,IAAI,CAAA;AAC5D,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,oBAAA,CACb,GAAA,EACA,OAAA,EACA,OAAA,EACA,QACA,OAAA,EACsB;AACtB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,EAAS,SAAA,GAC/B,MAAM,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA,GACpD,GAAA;AACJ,EAAA,OAAO,OAAA,EAAS,SAAA,GAAY,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA,GAAI,UAAA;AAC9D;AAEA,SAAS,mBAAmB,MAAA,EAAiD;AAC3E,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,GAAI,OAAO,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,MAAA,CAAO,WAAA,EAAY,GAAI,EAAC;AAAA,IAC9E,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS,KAAA;AAAA,IACT,eAAA,EAAiB,OAAO,YAAA,KAAiB,MAAA;AAAA,IACzC,cAAA,EAAgB,OAAO,WAAA,KAAgB,MAAA;AAAA,IACvC,GAAI,OAAO,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK,GAAI;AAAC,GAC3D;AACF;AAEA,SAAS,aAAA,CACP,cACA,OAAA,EACsB;AACtB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAgC;AACnD,EAAA,KAAA,MAAW,QAAA,IAAY,cAAc,MAAA,CAAO,GAAA,CAAI,SAAS,IAAA,EAAM,EAAE,GAAG,QAAA,EAAU,CAAA;AAE9E,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AACtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,GAAA,CAAI,OAAO,IAAA,EAAM;AAAA,QACtB,GAAG,OAAA;AAAA,QACH,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,MAAA,CAAO,IAAA;AAAA,QAC7B,eAAA,EAAiB,OAAO,YAAA,KAAiB,MAAA;AAAA,QACzC,cAAA,EAAgB,OAAO,WAAA,KAAgB;AAAA,OACxC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,MAAA,EAAQ,CAAA;AAC5B;AAEA,eAAe,kBAAA,CACb,OAAA,EACA,GAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,KAAK,OAAO,CAAA;AACzD,EAAA,OAAO,QAAA,CAAS,WAAW,EAAC;AAC9B;AAEA,SAAS,iBAAA,CAAkB,KAAa,UAAA,EAA2B;AACjE,EAAA,MAAM,IAAI,yBAAA,CAA0B,GAAA,EAAK,UAAU,CAAA;AACrD;AAEA,SAAS,qBAAqB,MAAA,EAA4C;AACxE,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,KAAA,KAAgC;AAC7D,MAAA,IAAI,IAAA,CAAK,IAAI,OAAO,IAAA;AACpB,MAAA,MAAM,IAAI,0BAA0B,uCAAA,EAAyC;AAAA,QAC3E,SAAS,KAAK,CAAA,gBAAA;AAAA,OACf,CAAA;AAAA,IACH,CAAC;AAAA,GACH;AACF;AAEO,SAAS,wBAAwB,OAAA,EAA4D;AAClG,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,wBAAA,CAAyB,QAAQ,OAAO,CAAA;AAE7E,EAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,OAAA,EAAS;AACvC,IAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,OAAA,GAA6B;AAAA,IACjC,QAAA;AAAA,IAEA,eAAe,MAAA,EAAQ;AACrB,MAAA,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,KAAA,EAAO;AAAA,MACL,MAAM,KAAK,OAAA,EAAS;AAClB,QAAA,MAAM,eAAe,MAAM,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,OAAO,CAAA;AAC7D,QAAA,OAAO,aAAA,CAAc,YAAA,EAAc,QAAA,CAAS,IAAA,EAAM,CAAA;AAAA,MACpD,CAAA;AAAA,MAEA,MAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS;AACvB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAChC,QAAA,IAAI,WAAA;AACJ,QAAA,IAAI;AACF,UAAA,WAAA,GAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,QAC7D,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,EAAE,KAAA,YAAiB,uBAAA,CAAA,IAA4B,CAAC,QAAQ,MAAM,KAAA;AAAA,QACpE;AACA,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,wBAAwB,IAAI,CAAA;AACnD,UAAA,OAAO,mBAAmB,MAAM,CAAA;AAAA,QAClC;AACA,QAAA,IAAI,CAAC,QAAQ,OAAO,WAAA;AACpB,QAAA,OAAO;AAAA,UACL,GAAG,WAAA;AAAA,UACH,eAAA,EAAiB,OAAO,YAAA,KAAiB,MAAA;AAAA,UACzC,cAAA,EAAgB,OAAO,WAAA,KAAgB;AAAA,SACzC;AAAA,MACF,CAAA;AAAA,MAEA,GAAI,QAAQ,OAAA,CAAQ,KAAA,CAAM,UACtB,EAAE,OAAA,EAAS,CAAC,IAAA,EAAM,OAAA,KAAY,OAAA,CAAQ,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAM,OAAO,CAAA,IAAK,kBAAkB,IAAA,EAAM,eAAe,CAAA,EAAE,GACzH,EAAC;AAAA,MACL,GAAI,QAAQ,OAAA,CAAQ,KAAA,CAAM,YACtB,EAAE,SAAA,EAAW,CAAC,IAAA,EAAM,OAAA,KAAY,OAAA,CAAQ,QAAQ,KAAA,CAAM,SAAA,GAAY,MAAM,OAAO,CAAA,IAAK,kBAAkB,IAAA,EAAM,iBAAiB,CAAA,EAAE,GAC/H,EAAC;AAAA,MACL,GAAI,QAAQ,OAAA,CAAQ,KAAA,CAAM,SACtB,EAAE,MAAA,EAAQ,CAAC,IAAA,EAAM,OAAA,KAAY,OAAA,CAAQ,QAAQ,KAAA,CAAM,MAAA,GAAS,MAAM,OAAO,CAAA,IAAK,kBAAkB,IAAA,EAAM,cAAc,CAAA,EAAE,GACtH,EAAC;AAAA,MACL,GAAI,QAAQ,OAAA,CAAQ,KAAA,CAAM,UACtB,EAAE,OAAA,EAAS,CAAC,IAAA,EAAM,OAAA,KAAY,OAAA,CAAQ,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAM,OAAO,CAAA,IAAK,kBAAkB,IAAA,EAAM,eAAe,CAAA,EAAE,GACzH;AAAC,KACP;AAAA,IAEA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,CAAC,WAAA,EAAa,OAAA,KAAY,QAAQ,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAAA,MACnF,GAAA,EAAK,CAAC,GAAA,EAAK,OAAA,KAAY,QAAQ,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAAA,MACjE,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAA,KAAY,QAAQ,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA;AAAA,MAC3E,MAAA,EAAQ,CAAC,GAAA,EAAK,KAAA,EAAO,OAAA,KAAY,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAAA,MACrF,MAAA,EAAQ,CAAC,GAAA,EAAK,OAAA,KAAY,QAAQ,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,GAAA,EAAK,OAAO,CAAA;AAAA,MAEvE,MAAM,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa;AACzC,QAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AACvC,QAAA,MAAM,MAAM,MAAA,CAAO,OAAA,EAAS,KAAA,GACxB,MAAM,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,OAAO,IAC3C,MAAM,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,SAAS,OAAO,CAAA;AAChD,QAAA,OAAO,oBAAA,CAAqB,GAAA,EAAK,OAAA,EAAS,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,MACxE,CAAA;AAAA,MAEA,MAAM,UAAA,CAAW,QAAA,EAAU,OAAA,EAAS,WAAA,EAAa;AAC/C,QAAA,IAAI,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAC9B,UAAA,MAAM,MAAA,GAAS,qBAAqB,MAAM,OAAA,CAAQ,QAAQ,UAAA,CAAW,QAAA,EAAU,OAAO,CAAC,CAAA;AACvF,UAAA,IAAI,CAAC,WAAA,EAAa,SAAA,EAAW,OAAO,MAAA;AACpC,UAAA,MAAMA,MAAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS;AAC/D,YAAA,IAAI,IAAA,CAAK,KAAA,IAAS,CAAC,IAAA,CAAK,MAAM,OAAO,IAAA;AACrC,YAAA,IAAI;AACF,cAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,MAAM,WAAA,CAAY,SAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,YACtE,SAAS,KAAA,EAAO;AACd,cAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,EAAE;AAAA,YACzF;AAAA,UACF,CAAC,CAAC,CAAA;AACF,UAAA,OAAO,EAAE,OAAAA,MAAAA,EAAM;AAAA,QACjB;AAEA,QAAA,MAAM,QAAQ,MAAM,OAAA,CAAQ,IAAI,QAAA,CAAS,GAAA,CAAI,OAAO,OAAA,KAAY;AAC9D,UAAA,IAAI;AACF,YAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,UAAU,KAAA,CAAM,OAAA,EAAS,SAAS,WAAW,CAAA;AACxE,YAAA,OAAO,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAK;AAAA,UAChC,SAAS,KAAA,EAAO;AACd,YAAA,OAAO,EAAE,EAAA,EAAI,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,EAAE;AAAA,UAC5F;AAAA,QACF,CAAC,CAAC,CAAA;AACF,QAAA,OAAO,EAAE,KAAA,EAAM;AAAA,MACjB,CAAA;AAAA,MAEA,MAAM,WAAA,CAAY,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS;AACpC,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AACvC,QAAA,IAAI,MAAA,CAAO,SAAS,WAAA,EAAa;AAC/B,UAAA,MAAM,oBAAoB,MAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAA,EAAS,KAAK,OAAO,CAAA;AAChF,UAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,WAAA,CAAY,GAAA,EAAK,mBAAmB,OAAO,CAAA;AAAA,QACnE;AACA,QAAA,OAAO,OAAA,CAAQ,QAAQ,WAAA,GAAc,GAAA,EAAK,OAAO,CAAA,IAAK,iBAAA,CAAkB,KAAK,aAAa,CAAA;AAAA,MAC5F,CAAA;AAAA,MAEA,MAAM,aAAA,CAAc,GAAA,EAAK,IAAA,EAAM,OAAO,OAAA,EAAS;AAC7C,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AACvC,QAAA,IAAI,MAAA,CAAO,SAAS,aAAA,EAAe;AACjC,UAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,aAAA,CAAc,GAAA,EAAK,OAAO,OAAO,CAAA;AAAA,QACzD;AACA,QAAA,OAAO,OAAA,CAAQ,QAAQ,aAAA,GAAgB,GAAA,EAAK,OAAO,OAAO,CAAA,IAAK,iBAAA,CAAkB,GAAA,EAAK,eAAe,CAAA;AAAA,MACvG,CAAA;AAAA,MAEA,MAAM,cAAA,CAAe,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS;AACvC,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AACvC,QAAA,IAAI,MAAA,CAAO,SAAS,cAAA,EAAgB;AAClC,UAAA,MAAM,oBAAoB,MAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAA,EAAS,KAAK,OAAO,CAAA;AAChF,UAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,cAAA,CAAe,GAAA,EAAK,mBAAmB,OAAO,CAAA;AAAA,QACtE;AACA,QAAA,OAAO,OAAA,CAAQ,QAAQ,cAAA,GAAiB,GAAA,EAAK,OAAO,CAAA,IAAK,iBAAA,CAAkB,KAAK,gBAAgB,CAAA;AAAA,MAClG,CAAA;AAAA,MAEA,MAAM,UAAA,CAAW,GAAA,EAAK,IAAA,EAAM,SAAS,OAAA,EAAS;AAC5C,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AACvC,QAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAC9B,UAAA,MAAM,oBAAoB,MAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAA,EAAS,KAAK,OAAO,CAAA;AAChF,UAAA,OAAO,OAAO,OAAA,CAAQ,UAAA,CAAW,GAAA,EAAK,OAAA,EAAS,mBAAmB,OAAO,CAAA;AAAA,QAC3E;AACA,QAAA,OAAO,OAAA,CAAQ,QAAQ,UAAA,GAAa,GAAA,EAAK,SAAS,OAAO,CAAA,IAAK,iBAAA,CAAkB,GAAA,EAAK,YAAY,CAAA;AAAA,MACnG;AAAA;AACF,GACF;AAEA,EAAA,OAAO,OAAA;AACT;AA8BA,IAAM,gBAAA,GAA+C;AAAA,EACnD,WAAW,MAAM,QAAA;AAAA,EACjB,SAAS,CAAC,IAAA,KAAS,CAAA,OAAA,EAAU,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AAAA,EACrD,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,KAAW,UAAU,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,EAC1E,aAAA,EAAe,CAAC,EAAA,KAAO,EAAA;AAAA,EACvB,aAAa,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AAAA,EACjD,gBAAgB,MAAM,EAAA;AAAA,EACtB,gBAAgB,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AAAA,EACpD,gBAAgB,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AAAA,EACpD,OAAO,MAAM,QAAA;AAAA,EACb,YAAY,MAAM,cAAA;AAAA,EAClB,aAAa,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,kBAAA,CAAmB,GAAG,CAAC,CAAA,OAAA,CAAA;AAAA,EACjD,eAAe,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,kBAAA,CAAmB,GAAG,CAAC,CAAA,eAAA,CAAA;AAAA,EACnD,gBAAgB,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,kBAAA,CAAmB,GAAG,CAAC,CAAA,WAAA,CAAA;AAAA,EACpD,YAAY,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,kBAAA,CAAmB,GAAG,CAAC,CAAA,OAAA;AAClD,CAAA;AAEA,SAAS,eAAe,KAAA,EAAyE;AAC/F,EAAA,OAAO,EAAE,GAAG,gBAAA,EAAkB,GAAG,KAAA,EAAM;AACzC;AAEA,eAAe,SAAS,QAAA,EAAsC;AAC5D,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AACpC,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,eAAe,aAAA,CACb,UACA,OAAA,EACY;AACZ,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,QAAQ,CAAA;AAEpC,EAAA,IAAI,SAAS,EAAA,EAAI;AACf,IAAA,OAAO,QAAQ,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAU,IAAA,EAAM,QAAQ,CAAA,GAAI,IAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,GAAc,QAAA,EAAU,IAAI,CAAA;AACxD,EAAA,IAAI,aAAa,MAAM,WAAA;AAEvB,EAAA,MAAM,SAAA,GAAY,IAAA;AAClB,EAAA,MAAM,UAAU,SAAA,EAAW,OAAA;AAC3B,EAAA,IAAI,SAAS,MAAA,KAAW,GAAA,EAAK,MAAM,IAAI,4BAA4B,OAAO,CAAA;AAC1E,EAAA,IAAI,SAAS,MAAA,KAAW,GAAA,EAAK,MAAM,IAAI,yBAAyB,OAAO,CAAA;AACvE,EAAA,IAAI,SAAS,MAAA,KAAW,GAAA,QAAW,IAAI,uBAAA,CAAwB,WAAW,SAAS,CAAA;AACnF,EAAA,IAAI,SAAS,MAAA,KAAW,GAAA,EAAK,MAAM,IAAI,wBAAwB,OAAO,CAAA;AACtE,EAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK,MAAM,IAAI,yBAAA,CAA0B,OAAA,EAAS,WAAW,MAAM,CAAA;AAC3F,EAAA,MAAM,IAAI,wBAAA,CAAyB,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA;AAC7D;AAEA,eAAe,cAAA,CACb,SACA,OAAA,EACsB;AACtB,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,kBAAA;AAAA,IAChB,GAAI,OAAA,EAAS,SAAA,GAAY,EAAE,aAAA,EAAe,UAAU,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAG,GAAI,EAAC;AAAA,IAC7E,GAAI,OAAA,EAAS,OAAA,IAAW,EAAC;AAAA,IACzB,GAAG,MAAM,OAAA,CAAQ,UAAA,GAAa,OAAO;AAAA,GACvC;AACF;AAEA,SAAS,YAAY,OAAA,EAAyC;AAC5D,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,IAAA,KAAS,MAAA,EAAW;AACvC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,IAAA,GAAO,CAAC,OAAA,CAAQ,OAAO,IAAI,CAAA;AAC7F,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,OAAA,KAAY,MAAA,EAAW,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAC,CAAA;AAChG,EAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,KAAW,MAAA,SAAkB,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AACrF,EAAA,IAAI,OAAA,EAAS,SAAS,MAAA,EAAW,MAAA,CAAO,IAAI,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AACxE,EAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAW,MAAA,CAAO,IAAI,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACpF,EAAA,IAAI,SAAS,MAAA,KAAW,MAAA,SAAkB,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACtE,EAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,EAAA,OAAO,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,EAAA;AACzB;AAEO,SAAS,4BACd,OAAA,EAC0B;AAC1B,EAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,IAAS,KAAA;AACnC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAE1C,EAAA,eAAe,IAAA,CACb,IAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,MAAM,WAAW,MAAM,SAAA,CAAU,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MACpD,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,MAAM,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAAA,MAC9C,GAAI,SAAS,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACrD,CAAA;AACD,IAAA,OAAO,aAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,CAAC,OAAA,KAAY,IAAA,CAA2B,KAAA,CAAM,SAAA,EAAU,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,OAAO,CAAA;AAAA,MAC3F,GAAA,EAAK,CAAC,IAAA,EAAM,OAAA,KAAY,IAAA,CAAyB,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,IAAS,OAAO,CAAA;AAAA,MAChG,OAAA,EAAS,CAAC,IAAA,EAAM,OAAA,KAAY,KAAW,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA,EAAG,EAAE,MAAA,EAAQ,MAAA,IAAU,OAAO,CAAA;AAAA,MACrG,SAAA,EAAW,CAAC,IAAA,EAAM,OAAA,KAAY,KAAW,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,WAAW,CAAA,EAAG,EAAE,MAAA,EAAQ,MAAA,IAAU,OAAO,CAAA;AAAA,MACzG,MAAA,EAAQ,CAAC,IAAA,EAAM,OAAA,KAAY,KAAW,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,QAAQ,CAAA,EAAG,EAAE,MAAA,EAAQ,MAAA,IAAU,OAAO,CAAA;AAAA,MACnG,OAAA,EAAS,CAAC,IAAA,EAAM,OAAA,KAAY,KAAW,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA,EAAG,EAAE,MAAA,EAAQ,MAAA,IAAU,OAAO;AAAA,KACvG;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,CAACC,QAAAA,EAAS,OAAA,KAAY,KAA2B,KAAA,CAAM,aAAA,CAAc,WAAA,CAAYA,QAAO,CAAC,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,IAAS,OAAO,CAAA;AAAA,MAC5H,GAAA,EAAK,CAAC,GAAA,EAAK,OAAA,KAAY,IAAA,CAAyB,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,IAAS,OAAO,CAAA;AAAA,MAClG,QAAQ,CAAC,KAAA,EAAO,YAAY,IAAA,CAAyB,KAAA,CAAM,gBAAe,EAAG;AAAA,QAC3E,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,SACzB,OAAO,CAAA;AAAA,MACV,MAAA,EAAQ,CAAC,GAAA,EAAK,KAAA,EAAO,YAAY,IAAA,CAAyB,KAAA,CAAM,cAAA,CAAe,GAAG,CAAA,EAAG;AAAA,QACnF,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,SACzB,OAAO,CAAA;AAAA,MACV,MAAA,EAAQ,CAAC,GAAA,EAAK,OAAA,KAAY,IAAA,CAAW,KAAA,CAAM,cAAA,CAAe,GAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,QAAA,IAAY,OAAO;AAAA,KAC/F;AAAA,IACA,OAAO,CAAC,OAAA,EAAS,YAAY,IAAA,CAAc,KAAA,CAAM,OAAM,EAAG;AAAA,MACxD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,qBAAqB,OAAA,EAAS,OAAO,KAAK,OAAO;AAAA,OAC7E,OAAO,CAAA;AAAA,IACV,YAAY,CAAC,QAAA,EAAU,YAAY,IAAA,CAAuB,KAAA,CAAM,YAAW,EAAG;AAAA,MAC5E,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,0BAA0B,QAAA,EAAU,OAAO,KAAK,QAAQ;AAAA,OACpF,OAAO,CAAA;AAAA,IACV,WAAA,EAAa,CAAC,GAAA,EAAK,OAAA,KAAY,IAAA,CAA6B,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,IAAS,OAAO,CAAA;AAAA,IAC9G,aAAA,EAAe,CAAC,GAAA,EAAK,KAAA,EAAO,YAAY,IAAA,CAAiC,KAAA,CAAM,aAAA,CAAc,GAAG,CAAA,EAAG;AAAA,MACjG,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OACzB,OAAO,CAAA;AAAA,IACV,cAAA,EAAgB,CAAC,GAAA,EAAK,OAAA,KAAY,IAAA,CAAkC,KAAA,CAAM,cAAA,CAAe,GAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,IAAS,OAAO,CAAA;AAAA,IACzH,UAAA,EAAY,CAAC,GAAA,EAAK,OAAA,EAAS,YAAY,IAAA,CAA8B,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAAA,MAC1F,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC3B,OAAO;AAAA,GACZ;AACF;;;ACndO,SAAS,uBACd,GAAA,EACuC;AACvC,EAAA,OAAO,GAAA;AACT;;;ACsFO,SAAS,iBAAiB,KAAA,EAAwC;AACvE,EAAA,OAAO;AAAA,IACL,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,GAAI,EAAC;AAAA,IACvD,SAAA,EAAW,OAAA;AAAA,IACX,QAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,WAAA,MAAiB;AAAA,MAClD,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,GAAI,OAAO,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK,GAAI,EAAC;AAAA,MACzD,MAAA,EAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,MAChD,GAAI,OAAO,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK,GAAI;AAAC,KAC3D,CAAE,CAAA;AAAA,IACF,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,GAAI;AAAC,GACzD;AACF;AAEO,SAAS,iBAAiB,KAAA,EAAyC;AACxE,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,MAAM,GAAG,CAAC,CAAA;AAC1F,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACpC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,GAAI,EAAC;AAAA,MACvD,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,GAAI;AAAC,KACzD,CAAE,CAAA;AAAA,IACF,MAAM,KAAA,CAAM,IAAA;AAAA,MAAK,EAAE,QAAQ,QAAA,EAAS;AAAA,MAAG,CAAC,CAAA,EAAG,QAAA,KACzC,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAC;AAAA;AACpD,GACF;AACF","file":"index.cjs","sourcesContent":["export class DatasourceNotFoundError extends Error {\n constructor(uid: string) {\n super(`datasource \"${uid}\" not found`)\n this.name = 'DatasourceNotFoundError'\n }\n}\n\nexport class DatasourceCapabilityError extends Error {\n constructor(uid: string, capability: string) {\n super(`datasource \"${uid}\" does not support ${capability}`)\n this.name = 'DatasourceCapabilityError'\n }\n}\n\nexport class DatasourceTypeNotRegisteredError extends Error {\n constructor(type: string) {\n super(`datasource type \"${type}\" is not registered`)\n this.name = 'DatasourceTypeNotRegisteredError'\n }\n}\n\nexport class DatasourceUnauthorizedError extends Error {\n constructor(message = 'datasource request is not authenticated') {\n super(message)\n this.name = 'DatasourceUnauthorizedError'\n }\n}\n\nexport class DatasourceForbiddenError extends Error {\n constructor(message = 'datasource request is not allowed') {\n super(message)\n this.name = 'DatasourceForbiddenError'\n }\n}\n\nexport class DatasourceConflictError extends Error {\n constructor(message = 'datasource was modified by another actor') {\n super(message)\n this.name = 'DatasourceConflictError'\n }\n}\n\nexport class DatasourceValidationError extends Error {\n constructor(\n message = 'datasource validation failed',\n readonly errors?: string[],\n ) {\n super(message)\n this.name = 'DatasourceValidationError'\n }\n}\n\nexport class DatasourceTransportError extends Error {\n constructor(\n message = 'datasource backend request failed',\n readonly status?: number,\n ) {\n super(message)\n this.name = 'DatasourceTransportError'\n }\n}\n","import type {\n DatasourceConfigEditorProps,\n DatasourcePluginDef,\n DatasourceQueryEditorProps,\n} from './plugin'\n\nexport interface DatasourceRegistry {\n register(plugin: DatasourcePluginDef): void\n get(type: string): DatasourcePluginDef | undefined\n has(type: string): boolean\n list(): DatasourcePluginDef[]\n getConfigEditor(\n type: string,\n ): ((props: DatasourceConfigEditorProps<unknown>) => unknown) | undefined\n getQueryEditor(\n type: string,\n ): ((props: DatasourceQueryEditorProps<unknown, unknown>) => unknown) | undefined\n}\n\nexport function createDatasourceRegistry(\n plugins: readonly DatasourcePluginDef[] = [],\n): DatasourceRegistry {\n const byType = new Map<string, DatasourcePluginDef>()\n\n const registry: DatasourceRegistry = {\n register(plugin) {\n byType.set(plugin.type, plugin)\n },\n\n get(type) {\n return byType.get(type)\n },\n\n has(type) {\n return byType.has(type)\n },\n\n list() {\n return [...byType.values()]\n },\n\n getConfigEditor(type) {\n return byType.get(type)?.configEditor as\n | ((props: DatasourceConfigEditorProps<unknown>) => unknown)\n | undefined\n },\n\n getQueryEditor(type) {\n return byType.get(type)?.queryEditor as\n | ((props: DatasourceQueryEditorProps<unknown, unknown>) => unknown)\n | undefined\n },\n }\n\n for (const plugin of plugins) registry.register(plugin)\n\n return registry\n}\n","import {\n DatasourceCapabilityError,\n DatasourceConflictError,\n DatasourceForbiddenError,\n DatasourceNotFoundError,\n DatasourceTransportError,\n DatasourceTypeNotRegisteredError,\n DatasourceUnauthorizedError,\n DatasourceValidationError,\n} from './errors'\nimport type { DatasourcePluginDef } from './plugin'\nimport { createDatasourceRegistry, type DatasourceRegistry } from './registry'\nimport type {\n BatchQueryResult,\n BatchQueryResultItem,\n DataQuery,\n DatasourceContext,\n DatasourceCreateInput,\n DatasourceHealthResult,\n DatasourceInstance,\n DatasourceListOptions,\n DatasourceListResult,\n DatasourceSchemaField,\n DatasourceSchemaFieldRequest,\n DatasourceSchemaNamespace,\n DatasourceTypeInfo,\n DatasourceUpdateInput,\n DatasourceValidationResult,\n QueryResult,\n} from './types'\n\nexport interface QueryCallOptions {\n transform?: (result: QueryResult) => QueryResult | Promise<QueryResult>\n}\n\nexport interface DatasourceManagerTypes {\n list(context?: DatasourceContext): Promise<DatasourceTypeInfo[]>\n get(type: string, context?: DatasourceContext): Promise<DatasourceTypeInfo>\n install?(type: string, context?: DatasourceContext): Promise<void>\n uninstall?(type: string, context?: DatasourceContext): Promise<void>\n enable?(type: string, context?: DatasourceContext): Promise<void>\n disable?(type: string, context?: DatasourceContext): Promise<void>\n}\n\nexport interface DatasourceManagerInstances {\n list(options?: DatasourceListOptions, context?: DatasourceContext): Promise<DatasourceListResult>\n get(uid: string, context?: DatasourceContext): Promise<DatasourceInstance>\n create(\n input: DatasourceCreateInput,\n context?: DatasourceContext,\n ): Promise<DatasourceInstance>\n update(\n uid: string,\n patch: DatasourceUpdateInput,\n context?: DatasourceContext,\n ): Promise<DatasourceInstance>\n delete(uid: string, context?: DatasourceContext): Promise<void>\n query(\n request: DataQuery,\n context?: DatasourceContext,\n options?: QueryCallOptions,\n ): Promise<QueryResult>\n batchQuery(\n requests: DataQuery[],\n context?: DatasourceContext,\n options?: QueryCallOptions,\n ): Promise<BatchQueryResult>\n healthCheck(uid: string, type: string, context?: DatasourceContext): Promise<DatasourceHealthResult>\n validateQuery(\n uid: string,\n type: string,\n query: unknown,\n context?: DatasourceContext,\n ): Promise<DatasourceValidationResult>\n listNamespaces(\n uid: string,\n type: string,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaNamespace[]>\n listFields(\n uid: string,\n type: string,\n request: DatasourceSchemaFieldRequest,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaField[]>\n}\n\nexport interface DatasourceManager {\n registerPlugin(plugin: DatasourcePluginDef): void\n registry: DatasourceRegistry\n types: DatasourceManagerTypes\n instances: DatasourceManagerInstances\n}\n\nexport interface DatasourceManagerBackend {\n types: {\n list(context?: DatasourceContext): Promise<DatasourceTypeInfo[]>\n get(type: string, context?: DatasourceContext): Promise<DatasourceTypeInfo>\n install?(type: string, context?: DatasourceContext): Promise<void>\n uninstall?(type: string, context?: DatasourceContext): Promise<void>\n enable?(type: string, context?: DatasourceContext): Promise<void>\n disable?(type: string, context?: DatasourceContext): Promise<void>\n }\n instances: {\n list(options?: DatasourceListOptions, context?: DatasourceContext): Promise<DatasourceListResult>\n get(uid: string, context?: DatasourceContext): Promise<DatasourceInstance>\n create(\n input: DatasourceCreateInput,\n context?: DatasourceContext,\n ): Promise<DatasourceInstance>\n update(\n uid: string,\n patch: DatasourceUpdateInput,\n context?: DatasourceContext,\n ): Promise<DatasourceInstance>\n delete(uid: string, context?: DatasourceContext): Promise<void>\n }\n query(request: DataQuery, context?: DatasourceContext): Promise<unknown>\n batchQuery?(requests: DataQuery[], context?: DatasourceContext): Promise<BatchQueryResult>\n healthCheck?(uid: string, context?: DatasourceContext): Promise<DatasourceHealthResult>\n validateQuery?(\n uid: string,\n query: unknown,\n context?: DatasourceContext,\n ): Promise<DatasourceValidationResult>\n listNamespaces?(uid: string, context?: DatasourceContext): Promise<DatasourceSchemaNamespace[]>\n listFields?(\n uid: string,\n request: DatasourceSchemaFieldRequest,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaField[]>\n}\n\nexport interface CreateDatasourceManagerOptions {\n registry?: DatasourceRegistry\n plugins?: readonly DatasourcePluginDef[]\n backend: DatasourceManagerBackend\n}\n\nfunction getRequestType(request: DataQuery): string {\n if (!request.datasourceType) {\n throw new DatasourceValidationError('query request requires datasourceType', [\n 'datasourceType is required for plugin routing',\n ])\n }\n return request.datasourceType\n}\n\nfunction getPlugin(registry: DatasourceRegistry, type: string): DatasourcePluginDef {\n const plugin = registry.get(type)\n if (!plugin) throw new DatasourceTypeNotRegisteredError(type)\n return plugin\n}\n\nasync function normalizeQueryResult(\n raw: unknown,\n request: DataQuery,\n context: DatasourceContext | undefined,\n plugin: DatasourcePluginDef,\n options: QueryCallOptions | undefined,\n): Promise<QueryResult> {\n const normalized = plugin.backend?.transform\n ? await plugin.backend.transform(raw, request, context)\n : raw as QueryResult\n return options?.transform ? options.transform(normalized) : normalized\n}\n\nfunction typeInfoFromPlugin(plugin: DatasourcePluginDef): DatasourceTypeInfo {\n return {\n type: plugin.type,\n name: plugin.name,\n ...(plugin.description !== undefined ? { description: plugin.description } : {}),\n installed: false,\n enabled: false,\n hasConfigEditor: plugin.configEditor !== undefined,\n hasQueryEditor: plugin.queryEditor !== undefined,\n ...(plugin.meta !== undefined ? { meta: plugin.meta } : {}),\n }\n}\n\nfunction mergeTypeInfo(\n backendTypes: DatasourceTypeInfo[],\n plugins: DatasourcePluginDef[],\n): DatasourceTypeInfo[] {\n const byType = new Map<string, DatasourceTypeInfo>()\n for (const typeInfo of backendTypes) byType.set(typeInfo.type, { ...typeInfo })\n\n for (const plugin of plugins) {\n const current = byType.get(plugin.type)\n if (current) {\n byType.set(plugin.type, {\n ...current,\n name: current.name || plugin.name,\n hasConfigEditor: plugin.configEditor !== undefined,\n hasQueryEditor: plugin.queryEditor !== undefined,\n })\n } else {\n byType.set(plugin.type, typeInfoFromPlugin(plugin))\n }\n }\n\n return [...byType.values()]\n}\n\nasync function getInstanceOptions(\n backend: DatasourceManagerBackend,\n uid: string,\n context?: DatasourceContext,\n): Promise<unknown> {\n const instance = await backend.instances.get(uid, context)\n return instance.options ?? {}\n}\n\nfunction missingCapability(uid: string, capability: string): never {\n throw new DatasourceCapabilityError(uid, capability)\n}\n\nfunction ensureBatchResultIds(result: BatchQueryResult): BatchQueryResult {\n return {\n items: result.items.map((item, index): BatchQueryResultItem => {\n if (item.id) return item\n throw new DatasourceValidationError('batch query result item is missing id', [\n `items[${index}].id is required`,\n ])\n }),\n }\n}\n\nexport function createDatasourceManager(options: CreateDatasourceManagerOptions): DatasourceManager {\n const registry = options.registry ?? createDatasourceRegistry(options.plugins)\n\n if (options.registry && options.plugins) {\n for (const plugin of options.plugins) registry.register(plugin)\n }\n\n const manager: DatasourceManager = {\n registry,\n\n registerPlugin(plugin) {\n registry.register(plugin)\n },\n\n types: {\n async list(context) {\n const backendTypes = await options.backend.types.list(context)\n return mergeTypeInfo(backendTypes, registry.list())\n },\n\n async get(type, context) {\n const plugin = registry.get(type)\n let backendType: DatasourceTypeInfo | undefined\n try {\n backendType = await options.backend.types.get(type, context)\n } catch (error) {\n if (!(error instanceof DatasourceNotFoundError) || !plugin) throw error\n }\n if (!backendType) {\n if (!plugin) throw new DatasourceNotFoundError(type)\n return typeInfoFromPlugin(plugin)\n }\n if (!plugin) return backendType\n return {\n ...backendType,\n hasConfigEditor: plugin.configEditor !== undefined,\n hasQueryEditor: plugin.queryEditor !== undefined,\n }\n },\n\n ...(options.backend.types.install\n ? { install: (type, context) => options.backend.types.install?.(type, context) ?? missingCapability(type, 'types.install') }\n : {}),\n ...(options.backend.types.uninstall\n ? { uninstall: (type, context) => options.backend.types.uninstall?.(type, context) ?? missingCapability(type, 'types.uninstall') }\n : {}),\n ...(options.backend.types.enable\n ? { enable: (type, context) => options.backend.types.enable?.(type, context) ?? missingCapability(type, 'types.enable') }\n : {}),\n ...(options.backend.types.disable\n ? { disable: (type, context) => options.backend.types.disable?.(type, context) ?? missingCapability(type, 'types.disable') }\n : {}),\n },\n\n instances: {\n list: (listOptions, context) => options.backend.instances.list(listOptions, context),\n get: (uid, context) => options.backend.instances.get(uid, context),\n create: (input, context) => options.backend.instances.create(input, context),\n update: (uid, patch, context) => options.backend.instances.update(uid, patch, context),\n delete: (uid, context) => options.backend.instances.delete(uid, context),\n\n async query(request, context, callOptions) {\n const type = getRequestType(request)\n const plugin = getPlugin(registry, type)\n const raw = plugin.backend?.query\n ? await plugin.backend.query(request, context)\n : await options.backend.query(request, context)\n return normalizeQueryResult(raw, request, context, plugin, callOptions)\n },\n\n async batchQuery(requests, context, callOptions) {\n if (options.backend.batchQuery) {\n const result = ensureBatchResultIds(await options.backend.batchQuery(requests, context))\n if (!callOptions?.transform) return result\n const items = await Promise.all(result.items.map(async (item) => {\n if (item.error || !item.data) return item\n try {\n return { id: item.id, data: await callOptions.transform!(item.data) }\n } catch (error) {\n return { id: item.id, error: error instanceof Error ? error : new Error(String(error)) }\n }\n }))\n return { items }\n }\n\n const items = await Promise.all(requests.map(async (request) => {\n try {\n const data = await manager.instances.query(request, context, callOptions)\n return { id: request.id, data }\n } catch (error) {\n return { id: request.id, error: error instanceof Error ? error : new Error(String(error)) }\n }\n }))\n return { items }\n },\n\n async healthCheck(uid, type, context) {\n const plugin = getPlugin(registry, type)\n if (plugin.backend?.healthCheck) {\n const datasourceOptions = await getInstanceOptions(options.backend, uid, context)\n return plugin.backend.healthCheck(uid, datasourceOptions, context)\n }\n return options.backend.healthCheck?.(uid, context) ?? missingCapability(uid, 'healthCheck')\n },\n\n async validateQuery(uid, type, query, context) {\n const plugin = getPlugin(registry, type)\n if (plugin.backend?.validateQuery) {\n return plugin.backend.validateQuery(uid, query, context)\n }\n return options.backend.validateQuery?.(uid, query, context) ?? missingCapability(uid, 'validateQuery')\n },\n\n async listNamespaces(uid, type, context) {\n const plugin = getPlugin(registry, type)\n if (plugin.backend?.listNamespaces) {\n const datasourceOptions = await getInstanceOptions(options.backend, uid, context)\n return plugin.backend.listNamespaces(uid, datasourceOptions, context)\n }\n return options.backend.listNamespaces?.(uid, context) ?? missingCapability(uid, 'listNamespaces')\n },\n\n async listFields(uid, type, request, context) {\n const plugin = getPlugin(registry, type)\n if (plugin.backend?.listFields) {\n const datasourceOptions = await getInstanceOptions(options.backend, uid, context)\n return plugin.backend.listFields(uid, request, datasourceOptions, context)\n }\n return options.backend.listFields?.(uid, request, context) ?? missingCapability(uid, 'listFields')\n },\n },\n }\n\n return manager\n}\n\nexport interface CreateRestDatasourceManagerOptions {\n baseUrl: string\n fetch?: typeof fetch\n getHeaders?: (context?: DatasourceContext) => HeadersInit | Promise<HeadersInit>\n paths?: Partial<RestDatasourceManagerPaths>\n serializeQueryBody?(request: DataQuery, context?: DatasourceContext): unknown\n serializeBatchQueryBody?(requests: DataQuery[], context?: DatasourceContext): unknown\n unwrap?<T>(body: unknown, response: Response): T\n createError?(response: Response, body: unknown): Error | undefined\n}\n\nexport interface RestDatasourceManagerPaths {\n typesList(): string\n typeGet(type: string): string\n typeAction(type: string, action: 'install' | 'uninstall' | 'enable' | 'disable'): string\n instancesList(queryString: string): string\n instanceGet(uid: string): string\n instanceCreate(): string\n instanceUpdate(uid: string): string\n instanceDelete(uid: string): string\n query(): string\n batchQuery(): string\n healthCheck(uid: string): string\n validateQuery(uid: string): string\n listNamespaces(uid: string): string\n listFields(uid: string): string\n}\n\nconst defaultRestPaths: RestDatasourceManagerPaths = {\n typesList: () => '/types',\n typeGet: (type) => `/types/${encodeURIComponent(type)}`,\n typeAction: (type, action) => `/types/${encodeURIComponent(type)}/${action}`,\n instancesList: (qs) => qs,\n instanceGet: (uid) => `/${encodeURIComponent(uid)}`,\n instanceCreate: () => '',\n instanceUpdate: (uid) => `/${encodeURIComponent(uid)}`,\n instanceDelete: (uid) => `/${encodeURIComponent(uid)}`,\n query: () => '/query',\n batchQuery: () => '/batch-query',\n healthCheck: (uid) => `/${encodeURIComponent(uid)}/health`,\n validateQuery: (uid) => `/${encodeURIComponent(uid)}/validate-query`,\n listNamespaces: (uid) => `/${encodeURIComponent(uid)}/namespaces`,\n listFields: (uid) => `/${encodeURIComponent(uid)}/fields`,\n}\n\nfunction mergeRestPaths(paths?: Partial<RestDatasourceManagerPaths>): RestDatasourceManagerPaths {\n return { ...defaultRestPaths, ...paths }\n}\n\nasync function readJson(response: Response): Promise<unknown> {\n if (response.status === 204) return undefined\n try {\n return await response.json()\n } catch {\n return undefined\n }\n}\n\nasync function parseResponse<T>(\n response: Response,\n options: CreateRestDatasourceManagerOptions,\n): Promise<T> {\n const body = await readJson(response)\n\n if (response.ok) {\n return options.unwrap ? options.unwrap<T>(body, response) : body as T\n }\n\n const customError = options.createError?.(response, body)\n if (customError) throw customError\n\n const errorBody = body as { message?: string; errors?: string[] } | undefined\n const message = errorBody?.message\n if (response.status === 401) throw new DatasourceUnauthorizedError(message)\n if (response.status === 403) throw new DatasourceForbiddenError(message)\n if (response.status === 404) throw new DatasourceNotFoundError(message ?? 'unknown')\n if (response.status === 409) throw new DatasourceConflictError(message)\n if (response.status === 422) throw new DatasourceValidationError(message, errorBody?.errors)\n throw new DatasourceTransportError(message, response.status)\n}\n\nasync function requestHeaders(\n options: CreateRestDatasourceManagerOptions,\n context?: DatasourceContext,\n): Promise<HeadersInit> {\n return {\n 'content-type': 'application/json',\n ...(context?.authToken ? { authorization: `Bearer ${context.authToken}` } : {}),\n ...(context?.headers ?? {}),\n ...await options.getHeaders?.(context),\n }\n}\n\nfunction queryString(options?: DatasourceListOptions): string {\n const params = new URLSearchParams()\n if (options?.filter?.type !== undefined) {\n const types = Array.isArray(options.filter.type) ? options.filter.type : [options.filter.type]\n for (const type of types) params.append('type', type)\n }\n if (options?.filter?.enabled !== undefined) params.set('enabled', String(options.filter.enabled))\n if (options?.filter?.search !== undefined) params.set('search', options.filter.search)\n if (options?.page !== undefined) params.set('page', String(options.page))\n if (options?.pageSize !== undefined) params.set('pageSize', String(options.pageSize))\n if (options?.cursor !== undefined) params.set('cursor', options.cursor)\n const qs = params.toString()\n return qs ? `?${qs}` : ''\n}\n\nexport function createRestDatasourceManager(\n options: CreateRestDatasourceManagerOptions,\n): DatasourceManagerBackend {\n const fetchImpl = options.fetch ?? fetch\n const baseUrl = options.baseUrl.replace(/\\/$/, '')\n const paths = mergeRestPaths(options.paths)\n\n async function send<T>(\n path: string,\n init: RequestInit,\n context?: DatasourceContext,\n ): Promise<T> {\n const response = await fetchImpl(`${baseUrl}${path}`, {\n ...init,\n headers: await requestHeaders(options, context),\n ...(context?.signal ? { signal: context.signal } : {}),\n })\n return parseResponse<T>(response, options)\n }\n\n return {\n types: {\n list: (context) => send<DatasourceTypeInfo[]>(paths.typesList(), { method: 'GET' }, context),\n get: (type, context) => send<DatasourceTypeInfo>(paths.typeGet(type), { method: 'GET' }, context),\n install: (type, context) => send<void>(paths.typeAction(type, 'install'), { method: 'POST' }, context),\n uninstall: (type, context) => send<void>(paths.typeAction(type, 'uninstall'), { method: 'POST' }, context),\n enable: (type, context) => send<void>(paths.typeAction(type, 'enable'), { method: 'POST' }, context),\n disable: (type, context) => send<void>(paths.typeAction(type, 'disable'), { method: 'POST' }, context),\n },\n instances: {\n list: (options, context) => send<DatasourceListResult>(paths.instancesList(queryString(options)), { method: 'GET' }, context),\n get: (uid, context) => send<DatasourceInstance>(paths.instanceGet(uid), { method: 'GET' }, context),\n create: (input, context) => send<DatasourceInstance>(paths.instanceCreate(), {\n method: 'POST',\n body: JSON.stringify(input),\n }, context),\n update: (uid, patch, context) => send<DatasourceInstance>(paths.instanceUpdate(uid), {\n method: 'PATCH',\n body: JSON.stringify(patch),\n }, context),\n delete: (uid, context) => send<void>(paths.instanceDelete(uid), { method: 'DELETE' }, context),\n },\n query: (request, context) => send<unknown>(paths.query(), {\n method: 'POST',\n body: JSON.stringify(options.serializeQueryBody?.(request, context) ?? request),\n }, context),\n batchQuery: (requests, context) => send<BatchQueryResult>(paths.batchQuery(), {\n method: 'POST',\n body: JSON.stringify(options.serializeBatchQueryBody?.(requests, context) ?? requests),\n }, context),\n healthCheck: (uid, context) => send<DatasourceHealthResult>(paths.healthCheck(uid), { method: 'GET' }, context),\n validateQuery: (uid, query, context) => send<DatasourceValidationResult>(paths.validateQuery(uid), {\n method: 'POST',\n body: JSON.stringify(query),\n }, context),\n listNamespaces: (uid, context) => send<DatasourceSchemaNamespace[]>(paths.listNamespaces(uid), { method: 'GET' }, context),\n listFields: (uid, request, context) => send<DatasourceSchemaField[]>(paths.listFields(uid), {\n method: 'POST',\n body: JSON.stringify(request),\n }, context),\n }\n}\n","import type {\n DataQuery,\n DatasourceContext,\n DatasourceHealthResult,\n DatasourceInstance,\n DatasourceSchemaField,\n DatasourceSchemaFieldRequest,\n DatasourceSchemaNamespace,\n DatasourceValidationResult,\n QueryResult,\n} from './types'\n\nexport interface DatasourceConfigEditorProps<TOptions = unknown> {\n instance: DatasourceInstance<TOptions>\n options: TOptions\n onChange(options: TOptions): void\n onSave(): void\n}\n\nexport interface DatasourceQueryEditorProps<TOptions = unknown, TQuery = unknown> {\n instance: DatasourceInstance<TOptions>\n query: TQuery\n onChange(query: TQuery): void\n onRunQuery(): void\n}\n\nexport interface DatasourcePluginBackend<TOptions = unknown, TQuery = unknown> {\n query?(request: DataQuery<TQuery>, context?: DatasourceContext): Promise<unknown>\n transform?(\n raw: unknown,\n request: DataQuery<TQuery>,\n context?: DatasourceContext,\n ): QueryResult | Promise<QueryResult>\n healthCheck?(\n uid: string,\n options: TOptions,\n context?: DatasourceContext,\n ): Promise<DatasourceHealthResult>\n validateQuery?(\n uid: string,\n query: TQuery,\n context?: DatasourceContext,\n ): Promise<DatasourceValidationResult>\n listNamespaces?(\n uid: string,\n options: TOptions,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaNamespace[]>\n listFields?(\n uid: string,\n request: DatasourceSchemaFieldRequest,\n options: TOptions,\n context?: DatasourceContext,\n ): Promise<DatasourceSchemaField[]>\n}\n\nexport interface DatasourcePluginDef<TOptions = unknown, TQuery = unknown> {\n type: string\n name: string\n description?: string\n configEditor?(props: DatasourceConfigEditorProps<TOptions>): unknown\n queryEditor?(props: DatasourceQueryEditorProps<TOptions, TQuery>): unknown\n backend?: DatasourcePluginBackend<TOptions, TQuery>\n meta?: Record<string, unknown>\n}\n\nexport function defineDatasourcePlugin<TOptions = unknown, TQuery = unknown>(\n def: DatasourcePluginDef<TOptions, TQuery>,\n): DatasourcePluginDef<TOptions, TQuery> {\n return def\n}\n","export interface AuthSubject {\n id: string\n roles?: string[]\n groups?: string[]\n attributes?: Record<string, unknown>\n}\n\nexport interface AuthContext {\n subject?: AuthSubject\n tenantId?: string\n attributes?: Record<string, unknown>\n}\n\nexport interface DataQuery<TQuery = unknown> {\n id: string\n datasourceUid: string\n datasourceType?: string\n query?: TQuery\n options?: Record<string, unknown>\n cacheTtlMs?: number\n staleWhileRevalidate?: boolean\n permissions?: unknown[]\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceContext {\n authToken?: string\n headers?: Record<string, string>\n signal?: AbortSignal\n variables?: Record<string, string | string[]>\n timeRange?: { from: string; to: string; raw?: { from: string; to: string } }\n authContext?: AuthContext\n builtins?: Record<string, string>\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourcePermissionHint {\n canRead?: boolean\n canCreate?: boolean\n canUpdate?: boolean\n canDelete?: boolean\n canQuery?: boolean\n canManage?: boolean\n reason?: string\n}\n\nexport interface DatasourceTypeInfo {\n type: string\n name: string\n description?: string\n enabled?: boolean\n installed?: boolean\n permissions?: DatasourcePermissionHint\n hasConfigEditor?: boolean\n hasQueryEditor?: boolean\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceInstance<TOptions = unknown> {\n uid: string\n type: string\n name: string\n options?: TOptions\n enabled?: boolean\n version?: string\n createdAt?: string\n updatedAt?: string\n permissions?: DatasourcePermissionHint\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceCreateInput<TOptions = unknown> {\n uid?: string\n type: string\n name: string\n options?: TOptions\n enabled?: boolean\n meta?: Record<string, unknown>\n}\n\nexport type DatasourceUpdateInput<TOptions = unknown> =\n Partial<Omit<DatasourceCreateInput<TOptions>, 'uid' | 'type'>> & {\n version?: string\n }\n\nexport interface DatasourceListFilter {\n type?: string | string[]\n enabled?: boolean\n search?: string\n}\n\nexport interface DatasourceListOptions {\n filter?: DatasourceListFilter\n page?: number\n pageSize?: number\n cursor?: string\n}\n\nexport interface DatasourceListResult {\n items: DatasourceInstance[]\n total?: number\n nextCursor?: string\n}\n\nexport type DatasourceFrameType = string\nexport type DatasourceFieldKind = string\n\nexport interface DatasourceField {\n name: string\n kind?: DatasourceFieldKind\n type?: string\n labels?: Record<string, string>\n values: unknown[]\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceFrame {\n name?: string\n frameType: DatasourceFrameType\n fields: DatasourceField[]\n meta?: Record<string, unknown>\n}\n\nexport interface QueryStats {\n executionTimeMs?: number\n rowsReturned?: number\n bytesRead?: number\n meta?: Record<string, unknown>\n}\n\nexport interface QueryInspect {\n rawQuery?: string\n executedQuery?: string\n meta?: Record<string, unknown>\n}\n\nexport interface QueryResult {\n frames: DatasourceFrame[]\n stats?: QueryStats\n inspect?: QueryInspect\n requestId?: string\n meta?: Record<string, unknown>\n}\n\nexport interface TableRowsInput {\n columns: Array<{ name: string; type?: string; meta?: Record<string, unknown> }>\n rows: unknown[][]\n name?: string\n meta?: Record<string, unknown>\n}\n\nexport interface TableRowsOutput {\n columns: Array<{ name: string; type?: string; meta?: Record<string, unknown> }>\n rows: unknown[][]\n}\n\nexport function tableRowsToFrame(input: TableRowsInput): DatasourceFrame {\n return {\n ...(input.name !== undefined ? { name: input.name } : {}),\n frameType: 'table',\n fields: input.columns.map((column, columnIndex) => ({\n name: column.name,\n ...(column.type !== undefined ? { type: column.type } : {}),\n values: input.rows.map((row) => row[columnIndex]),\n ...(column.meta !== undefined ? { meta: column.meta } : {}),\n })),\n ...(input.meta !== undefined ? { meta: input.meta } : {}),\n }\n}\n\nexport function tableFrameToRows(frame: DatasourceFrame): TableRowsOutput {\n const rowCount = frame.fields.reduce((max, field) => Math.max(max, field.values.length), 0)\n return {\n columns: frame.fields.map((field) => ({\n name: field.name,\n ...(field.type !== undefined ? { type: field.type } : {}),\n ...(field.meta !== undefined ? { meta: field.meta } : {}),\n })),\n rows: Array.from({ length: rowCount }, (_, rowIndex) =>\n frame.fields.map((field) => field.values[rowIndex]),\n ),\n }\n}\n\nexport interface VariableOption {\n label: string\n value: string\n}\n\nexport interface DatasourceValidationResult {\n valid: boolean\n errors?: string[]\n}\n\nexport interface DatasourceHealthResult {\n ok: boolean\n message?: string\n details?: Record<string, unknown>\n}\n\nexport type DatasourceSchemaKind = string\n\nexport interface DatasourceSchemaNamespace {\n id: string\n name: string\n kind?: DatasourceSchemaKind\n parentId?: string\n hasChildren?: boolean\n meta?: Record<string, unknown>\n}\n\nexport interface DatasourceSchemaFieldRequest {\n namespaceId: string\n}\n\nexport interface DatasourceSchemaField {\n name: string\n type?: string\n kind?: DatasourceFieldKind\n nullable?: boolean\n label?: string\n insertText?: string\n meta?: Record<string, unknown>\n}\n\nexport interface AnnotationQuery<TQuery = unknown> {\n id: string\n datasourceUid: string\n name?: string\n query?: TQuery\n options?: Record<string, unknown>\n hide?: boolean\n color?: string\n}\n\nexport type BatchQueryResultItem =\n | { id: string; data: QueryResult; error?: never }\n | { id: string; data?: never; error: Error }\n\nexport interface BatchQueryResult {\n items: BatchQueryResultItem[]\n}\n\nexport interface Annotation {\n id?: string\n time: number\n timeEnd?: number\n title?: string\n text?: string\n tags?: string[]\n color?: string\n source?: AnnotationQuery\n meta?: Record<string, unknown>\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as Annotation, a as AnnotationQuery, b as AuthContext, c as AuthSubject, B as BatchQueryResult, d as BatchQueryResultItem, C as CreateDatasourceManagerOptions, e as CreateRestDatasourceManagerOptions, D as DataQuery, f as DatasourceConfigEditorProps, g as DatasourceContext, h as DatasourceCreateInput, i as
|
|
1
|
+
export { A as Annotation, a as AnnotationQuery, b as AuthContext, c as AuthSubject, B as BatchQueryResult, d as BatchQueryResultItem, C as CreateDatasourceManagerOptions, e as CreateRestDatasourceManagerOptions, D as DataQuery, f as DatasourceConfigEditorProps, g as DatasourceContext, h as DatasourceCreateInput, i as DatasourceField, j as DatasourceFieldKind, k as DatasourceFrame, l as DatasourceFrameType, m as DatasourceHealthResult, n as DatasourceInstance, o as DatasourceListFilter, p as DatasourceListOptions, q as DatasourceListResult, r as DatasourceManager, s as DatasourceManagerBackend, t as DatasourceManagerInstances, u as DatasourceManagerTypes, v as DatasourcePermissionHint, w as DatasourcePluginBackend, x as DatasourcePluginDef, y as DatasourceQueryEditorProps, z as DatasourceRegistry, E as DatasourceSchemaField, F as DatasourceSchemaFieldRequest, G as DatasourceSchemaKind, H as DatasourceSchemaNamespace, I as DatasourceTypeInfo, J as DatasourceUpdateInput, K as DatasourceValidationResult, Q as QueryCallOptions, L as QueryInspect, M as QueryResult, N as QueryStats, R as RestDatasourceManagerPaths, T as TableRowsInput, O as TableRowsOutput, V as VariableOption, P as createDatasourceManager, S as createDatasourceRegistry, U as createRestDatasourceManager, W as defineDatasourcePlugin, X as tableFrameToRows, Y as tableRowsToFrame } from './manager-DOC7PPiJ.cjs';
|
|
2
2
|
|
|
3
3
|
declare class DatasourceNotFoundError extends Error {
|
|
4
4
|
constructor(uid: string);
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as Annotation, a as AnnotationQuery, b as AuthContext, c as AuthSubject, B as BatchQueryResult, d as BatchQueryResultItem, C as CreateDatasourceManagerOptions, e as CreateRestDatasourceManagerOptions, D as DataQuery, f as DatasourceConfigEditorProps, g as DatasourceContext, h as DatasourceCreateInput, i as
|
|
1
|
+
export { A as Annotation, a as AnnotationQuery, b as AuthContext, c as AuthSubject, B as BatchQueryResult, d as BatchQueryResultItem, C as CreateDatasourceManagerOptions, e as CreateRestDatasourceManagerOptions, D as DataQuery, f as DatasourceConfigEditorProps, g as DatasourceContext, h as DatasourceCreateInput, i as DatasourceField, j as DatasourceFieldKind, k as DatasourceFrame, l as DatasourceFrameType, m as DatasourceHealthResult, n as DatasourceInstance, o as DatasourceListFilter, p as DatasourceListOptions, q as DatasourceListResult, r as DatasourceManager, s as DatasourceManagerBackend, t as DatasourceManagerInstances, u as DatasourceManagerTypes, v as DatasourcePermissionHint, w as DatasourcePluginBackend, x as DatasourcePluginDef, y as DatasourceQueryEditorProps, z as DatasourceRegistry, E as DatasourceSchemaField, F as DatasourceSchemaFieldRequest, G as DatasourceSchemaKind, H as DatasourceSchemaNamespace, I as DatasourceTypeInfo, J as DatasourceUpdateInput, K as DatasourceValidationResult, Q as QueryCallOptions, L as QueryInspect, M as QueryResult, N as QueryStats, R as RestDatasourceManagerPaths, T as TableRowsInput, O as TableRowsOutput, V as VariableOption, P as createDatasourceManager, S as createDatasourceRegistry, U as createRestDatasourceManager, W as defineDatasourcePlugin, X as tableFrameToRows, Y as tableRowsToFrame } from './manager-DOC7PPiJ.js';
|
|
2
2
|
|
|
3
3
|
declare class DatasourceNotFoundError extends Error {
|
|
4
4
|
constructor(uid: string);
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DatasourceNotFoundError, DatasourceCapabilityError, DatasourceTypeNotRegisteredError, DatasourceValidationError, DatasourceUnauthorizedError, DatasourceForbiddenError, DatasourceConflictError, DatasourceTransportError } from './chunk-
|
|
2
|
-
export { DatasourceCapabilityError, DatasourceConflictError, DatasourceForbiddenError, DatasourceNotFoundError, DatasourceTransportError, DatasourceTypeNotRegisteredError, DatasourceUnauthorizedError, DatasourceValidationError } from './chunk-
|
|
1
|
+
import { DatasourceNotFoundError, DatasourceCapabilityError, DatasourceTypeNotRegisteredError, DatasourceValidationError, DatasourceUnauthorizedError, DatasourceForbiddenError, DatasourceConflictError, DatasourceTransportError } from './chunk-NSZRSVET.js';
|
|
2
|
+
export { DatasourceCapabilityError, DatasourceConflictError, DatasourceForbiddenError, DatasourceNotFoundError, DatasourceTransportError, DatasourceTypeNotRegisteredError, DatasourceUnauthorizedError, DatasourceValidationError, tableFrameToRows, tableRowsToFrame } from './chunk-NSZRSVET.js';
|
|
3
3
|
|
|
4
4
|
// src/registry.ts
|
|
5
5
|
function createDatasourceRegistry(plugins = []) {
|
|
@@ -83,6 +83,16 @@ async function getInstanceOptions(backend, uid, context) {
|
|
|
83
83
|
function missingCapability(uid, capability) {
|
|
84
84
|
throw new DatasourceCapabilityError(uid, capability);
|
|
85
85
|
}
|
|
86
|
+
function ensureBatchResultIds(result) {
|
|
87
|
+
return {
|
|
88
|
+
items: result.items.map((item, index) => {
|
|
89
|
+
if (item.id) return item;
|
|
90
|
+
throw new DatasourceValidationError("batch query result item is missing id", [
|
|
91
|
+
`items[${index}].id is required`
|
|
92
|
+
]);
|
|
93
|
+
})
|
|
94
|
+
};
|
|
95
|
+
}
|
|
86
96
|
function createDatasourceManager(options) {
|
|
87
97
|
const registry = options.registry ?? createDatasourceRegistry(options.plugins);
|
|
88
98
|
if (options.registry && options.plugins) {
|
|
@@ -136,14 +146,14 @@ function createDatasourceManager(options) {
|
|
|
136
146
|
},
|
|
137
147
|
async batchQuery(requests, context, callOptions) {
|
|
138
148
|
if (options.backend.batchQuery) {
|
|
139
|
-
const result = await options.backend.batchQuery(requests, context);
|
|
149
|
+
const result = ensureBatchResultIds(await options.backend.batchQuery(requests, context));
|
|
140
150
|
if (!callOptions?.transform) return result;
|
|
141
151
|
const items2 = await Promise.all(result.items.map(async (item) => {
|
|
142
152
|
if (item.error || !item.data) return item;
|
|
143
153
|
try {
|
|
144
|
-
return { data: await callOptions.transform(item.data) };
|
|
154
|
+
return { id: item.id, data: await callOptions.transform(item.data) };
|
|
145
155
|
} catch (error) {
|
|
146
|
-
return { error: error instanceof Error ? error : new Error(String(error)) };
|
|
156
|
+
return { id: item.id, error: error instanceof Error ? error : new Error(String(error)) };
|
|
147
157
|
}
|
|
148
158
|
}));
|
|
149
159
|
return { items: items2 };
|
|
@@ -151,9 +161,9 @@ function createDatasourceManager(options) {
|
|
|
151
161
|
const items = await Promise.all(requests.map(async (request) => {
|
|
152
162
|
try {
|
|
153
163
|
const data = await manager.instances.query(request, context, callOptions);
|
|
154
|
-
return { data };
|
|
164
|
+
return { id: request.id, data };
|
|
155
165
|
} catch (error) {
|
|
156
|
-
return { error: error instanceof Error ? error : new Error(String(error)) };
|
|
166
|
+
return { id: request.id, error: error instanceof Error ? error : new Error(String(error)) };
|
|
157
167
|
}
|
|
158
168
|
}));
|
|
159
169
|
return { items };
|
|
@@ -203,6 +213,7 @@ var defaultRestPaths = {
|
|
|
203
213
|
instanceUpdate: (uid) => `/${encodeURIComponent(uid)}`,
|
|
204
214
|
instanceDelete: (uid) => `/${encodeURIComponent(uid)}`,
|
|
205
215
|
query: () => "/query",
|
|
216
|
+
batchQuery: () => "/batch-query",
|
|
206
217
|
healthCheck: (uid) => `/${encodeURIComponent(uid)}/health`,
|
|
207
218
|
validateQuery: (uid) => `/${encodeURIComponent(uid)}/validate-query`,
|
|
208
219
|
listNamespaces: (uid) => `/${encodeURIComponent(uid)}/namespaces`,
|
|
@@ -293,7 +304,11 @@ function createRestDatasourceManager(options) {
|
|
|
293
304
|
},
|
|
294
305
|
query: (request, context) => send(paths.query(), {
|
|
295
306
|
method: "POST",
|
|
296
|
-
body: JSON.stringify(request)
|
|
307
|
+
body: JSON.stringify(options.serializeQueryBody?.(request, context) ?? request)
|
|
308
|
+
}, context),
|
|
309
|
+
batchQuery: (requests, context) => send(paths.batchQuery(), {
|
|
310
|
+
method: "POST",
|
|
311
|
+
body: JSON.stringify(options.serializeBatchQueryBody?.(requests, context) ?? requests)
|
|
297
312
|
}, context),
|
|
298
313
|
healthCheck: (uid, context) => send(paths.healthCheck(uid), { method: "GET" }, context),
|
|
299
314
|
validateQuery: (uid, query, context) => send(paths.validateQuery(uid), {
|