@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 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
- columns: response.fields.map((name) => ({ name, type: 'string' })),
112
- rows: response.rows,
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
- export { DatasourceCapabilityError, DatasourceConflictError, DatasourceForbiddenError, DatasourceNotFoundError, DatasourceTransportError, DatasourceTypeNotRegisteredError, DatasourceUnauthorizedError, DatasourceValidationError };
54
- //# sourceMappingURL=chunk-Z2DGIUJ2.js.map
55
- //# sourceMappingURL=chunk-Z2DGIUJ2.js.map
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
@@ -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":"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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 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 DatasourceHealthResult, j as DatasourceInstance, k as DatasourceListFilter, l as DatasourceListOptions, m as DatasourceListResult, n as DatasourceManager, o as DatasourceManagerBackend, p as DatasourceManagerInstances, q as DatasourceManagerTypes, r as DatasourcePermissionHint, s as DatasourcePluginBackend, t as DatasourcePluginDef, u as DatasourceQueryEditorProps, v as DatasourceRegistry, w as DatasourceSchemaField, x as DatasourceSchemaFieldRequest, y as DatasourceSchemaNamespace, z as DatasourceTypeInfo, E as DatasourceUpdateInput, F as DatasourceValidationResult, Q as QueryCallOptions, G as QueryResult, R as RestDatasourceManagerPaths, V as VariableOption, H as createDatasourceManager, I as createDatasourceRegistry, J as createRestDatasourceManager, K as defineDatasourcePlugin } from './manager-C5PgvWNH.cjs';
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 DatasourceHealthResult, j as DatasourceInstance, k as DatasourceListFilter, l as DatasourceListOptions, m as DatasourceListResult, n as DatasourceManager, o as DatasourceManagerBackend, p as DatasourceManagerInstances, q as DatasourceManagerTypes, r as DatasourcePermissionHint, s as DatasourcePluginBackend, t as DatasourcePluginDef, u as DatasourceQueryEditorProps, v as DatasourceRegistry, w as DatasourceSchemaField, x as DatasourceSchemaFieldRequest, y as DatasourceSchemaNamespace, z as DatasourceTypeInfo, E as DatasourceUpdateInput, F as DatasourceValidationResult, Q as QueryCallOptions, G as QueryResult, R as RestDatasourceManagerPaths, V as VariableOption, H as createDatasourceManager, I as createDatasourceRegistry, J as createRestDatasourceManager, K as defineDatasourcePlugin } from './manager-C5PgvWNH.js';
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-Z2DGIUJ2.js';
2
- export { DatasourceCapabilityError, DatasourceConflictError, DatasourceForbiddenError, DatasourceNotFoundError, DatasourceTransportError, DatasourceTypeNotRegisteredError, DatasourceUnauthorizedError, DatasourceValidationError } from './chunk-Z2DGIUJ2.js';
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), {