@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/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry.ts","../src/manager.ts","../src/plugin.ts"],"names":["items","options"],"mappings":"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","file":"index.js","sourcesContent":["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/registry.ts","../src/manager.ts","../src/plugin.ts"],"names":["items","options"],"mappings":"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","file":"index.js","sourcesContent":["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"]}
|
|
@@ -96,16 +96,60 @@ interface DatasourceListResult {
|
|
|
96
96
|
total?: number;
|
|
97
97
|
nextCursor?: string;
|
|
98
98
|
}
|
|
99
|
+
type DatasourceFrameType = string;
|
|
100
|
+
type DatasourceFieldKind = string;
|
|
101
|
+
interface DatasourceField {
|
|
102
|
+
name: string;
|
|
103
|
+
kind?: DatasourceFieldKind;
|
|
104
|
+
type?: string;
|
|
105
|
+
labels?: Record<string, string>;
|
|
106
|
+
values: unknown[];
|
|
107
|
+
meta?: Record<string, unknown>;
|
|
108
|
+
}
|
|
109
|
+
interface DatasourceFrame {
|
|
110
|
+
name?: string;
|
|
111
|
+
frameType: DatasourceFrameType;
|
|
112
|
+
fields: DatasourceField[];
|
|
113
|
+
meta?: Record<string, unknown>;
|
|
114
|
+
}
|
|
115
|
+
interface QueryStats {
|
|
116
|
+
executionTimeMs?: number;
|
|
117
|
+
rowsReturned?: number;
|
|
118
|
+
bytesRead?: number;
|
|
119
|
+
meta?: Record<string, unknown>;
|
|
120
|
+
}
|
|
121
|
+
interface QueryInspect {
|
|
122
|
+
rawQuery?: string;
|
|
123
|
+
executedQuery?: string;
|
|
124
|
+
meta?: Record<string, unknown>;
|
|
125
|
+
}
|
|
99
126
|
interface QueryResult {
|
|
127
|
+
frames: DatasourceFrame[];
|
|
128
|
+
stats?: QueryStats;
|
|
129
|
+
inspect?: QueryInspect;
|
|
130
|
+
requestId?: string;
|
|
131
|
+
meta?: Record<string, unknown>;
|
|
132
|
+
}
|
|
133
|
+
interface TableRowsInput {
|
|
100
134
|
columns: Array<{
|
|
101
135
|
name: string;
|
|
102
|
-
type
|
|
136
|
+
type?: string;
|
|
103
137
|
meta?: Record<string, unknown>;
|
|
104
138
|
}>;
|
|
105
139
|
rows: unknown[][];
|
|
106
|
-
|
|
140
|
+
name?: string;
|
|
107
141
|
meta?: Record<string, unknown>;
|
|
108
142
|
}
|
|
143
|
+
interface TableRowsOutput {
|
|
144
|
+
columns: Array<{
|
|
145
|
+
name: string;
|
|
146
|
+
type?: string;
|
|
147
|
+
meta?: Record<string, unknown>;
|
|
148
|
+
}>;
|
|
149
|
+
rows: unknown[][];
|
|
150
|
+
}
|
|
151
|
+
declare function tableRowsToFrame(input: TableRowsInput): DatasourceFrame;
|
|
152
|
+
declare function tableFrameToRows(frame: DatasourceFrame): TableRowsOutput;
|
|
109
153
|
interface VariableOption {
|
|
110
154
|
label: string;
|
|
111
155
|
value: string;
|
|
@@ -119,11 +163,13 @@ interface DatasourceHealthResult {
|
|
|
119
163
|
message?: string;
|
|
120
164
|
details?: Record<string, unknown>;
|
|
121
165
|
}
|
|
166
|
+
type DatasourceSchemaKind = string;
|
|
122
167
|
interface DatasourceSchemaNamespace {
|
|
123
168
|
id: string;
|
|
124
169
|
name: string;
|
|
125
|
-
kind?:
|
|
170
|
+
kind?: DatasourceSchemaKind;
|
|
126
171
|
parentId?: string;
|
|
172
|
+
hasChildren?: boolean;
|
|
127
173
|
meta?: Record<string, unknown>;
|
|
128
174
|
}
|
|
129
175
|
interface DatasourceSchemaFieldRequest {
|
|
@@ -132,8 +178,10 @@ interface DatasourceSchemaFieldRequest {
|
|
|
132
178
|
interface DatasourceSchemaField {
|
|
133
179
|
name: string;
|
|
134
180
|
type?: string;
|
|
181
|
+
kind?: DatasourceFieldKind;
|
|
182
|
+
nullable?: boolean;
|
|
135
183
|
label?: string;
|
|
136
|
-
|
|
184
|
+
insertText?: string;
|
|
137
185
|
meta?: Record<string, unknown>;
|
|
138
186
|
}
|
|
139
187
|
interface AnnotationQuery<TQuery = unknown> {
|
|
@@ -146,9 +194,11 @@ interface AnnotationQuery<TQuery = unknown> {
|
|
|
146
194
|
color?: string;
|
|
147
195
|
}
|
|
148
196
|
type BatchQueryResultItem = {
|
|
197
|
+
id: string;
|
|
149
198
|
data: QueryResult;
|
|
150
199
|
error?: never;
|
|
151
200
|
} | {
|
|
201
|
+
id: string;
|
|
152
202
|
data?: never;
|
|
153
203
|
error: Error;
|
|
154
204
|
};
|
|
@@ -272,6 +322,8 @@ interface CreateRestDatasourceManagerOptions {
|
|
|
272
322
|
fetch?: typeof fetch;
|
|
273
323
|
getHeaders?: (context?: DatasourceContext) => HeadersInit | Promise<HeadersInit>;
|
|
274
324
|
paths?: Partial<RestDatasourceManagerPaths>;
|
|
325
|
+
serializeQueryBody?(request: DataQuery, context?: DatasourceContext): unknown;
|
|
326
|
+
serializeBatchQueryBody?(requests: DataQuery[], context?: DatasourceContext): unknown;
|
|
275
327
|
unwrap?<T>(body: unknown, response: Response): T;
|
|
276
328
|
createError?(response: Response, body: unknown): Error | undefined;
|
|
277
329
|
}
|
|
@@ -285,6 +337,7 @@ interface RestDatasourceManagerPaths {
|
|
|
285
337
|
instanceUpdate(uid: string): string;
|
|
286
338
|
instanceDelete(uid: string): string;
|
|
287
339
|
query(): string;
|
|
340
|
+
batchQuery(): string;
|
|
288
341
|
healthCheck(uid: string): string;
|
|
289
342
|
validateQuery(uid: string): string;
|
|
290
343
|
listNamespaces(uid: string): string;
|
|
@@ -292,4 +345,4 @@ interface RestDatasourceManagerPaths {
|
|
|
292
345
|
}
|
|
293
346
|
declare function createRestDatasourceManager(options: CreateRestDatasourceManagerOptions): DatasourceManagerBackend;
|
|
294
347
|
|
|
295
|
-
export { type Annotation as A, type BatchQueryResult as B, type CreateDatasourceManagerOptions as C, type DataQuery as D, type
|
|
348
|
+
export { type Annotation as A, type BatchQueryResult as B, type CreateDatasourceManagerOptions as C, type DataQuery as D, type DatasourceSchemaField as E, type DatasourceSchemaFieldRequest as F, type DatasourceSchemaKind as G, type DatasourceSchemaNamespace as H, type DatasourceTypeInfo as I, type DatasourceUpdateInput as J, type DatasourceValidationResult as K, type QueryInspect as L, type QueryResult as M, type QueryStats as N, type TableRowsOutput as O, createDatasourceManager as P, type QueryCallOptions as Q, type RestDatasourceManagerPaths as R, createDatasourceRegistry as S, type TableRowsInput as T, createRestDatasourceManager as U, type VariableOption as V, defineDatasourcePlugin as W, tableFrameToRows as X, tableRowsToFrame as Y, type AnnotationQuery as a, type AuthContext as b, type AuthSubject as c, type BatchQueryResultItem as d, type CreateRestDatasourceManagerOptions as e, type DatasourceConfigEditorProps as f, type DatasourceContext as g, type DatasourceCreateInput as h, type DatasourceField as i, type DatasourceFieldKind as j, type DatasourceFrame as k, type DatasourceFrameType as l, type DatasourceHealthResult as m, type DatasourceInstance as n, type DatasourceListFilter as o, type DatasourceListOptions as p, type DatasourceListResult as q, type DatasourceManager as r, type DatasourceManagerBackend as s, type DatasourceManagerInstances as t, type DatasourceManagerTypes as u, type DatasourcePermissionHint as v, type DatasourcePluginBackend as w, type DatasourcePluginDef as x, type DatasourceQueryEditorProps as y, type DatasourceRegistry as z };
|
|
@@ -96,16 +96,60 @@ interface DatasourceListResult {
|
|
|
96
96
|
total?: number;
|
|
97
97
|
nextCursor?: string;
|
|
98
98
|
}
|
|
99
|
+
type DatasourceFrameType = string;
|
|
100
|
+
type DatasourceFieldKind = string;
|
|
101
|
+
interface DatasourceField {
|
|
102
|
+
name: string;
|
|
103
|
+
kind?: DatasourceFieldKind;
|
|
104
|
+
type?: string;
|
|
105
|
+
labels?: Record<string, string>;
|
|
106
|
+
values: unknown[];
|
|
107
|
+
meta?: Record<string, unknown>;
|
|
108
|
+
}
|
|
109
|
+
interface DatasourceFrame {
|
|
110
|
+
name?: string;
|
|
111
|
+
frameType: DatasourceFrameType;
|
|
112
|
+
fields: DatasourceField[];
|
|
113
|
+
meta?: Record<string, unknown>;
|
|
114
|
+
}
|
|
115
|
+
interface QueryStats {
|
|
116
|
+
executionTimeMs?: number;
|
|
117
|
+
rowsReturned?: number;
|
|
118
|
+
bytesRead?: number;
|
|
119
|
+
meta?: Record<string, unknown>;
|
|
120
|
+
}
|
|
121
|
+
interface QueryInspect {
|
|
122
|
+
rawQuery?: string;
|
|
123
|
+
executedQuery?: string;
|
|
124
|
+
meta?: Record<string, unknown>;
|
|
125
|
+
}
|
|
99
126
|
interface QueryResult {
|
|
127
|
+
frames: DatasourceFrame[];
|
|
128
|
+
stats?: QueryStats;
|
|
129
|
+
inspect?: QueryInspect;
|
|
130
|
+
requestId?: string;
|
|
131
|
+
meta?: Record<string, unknown>;
|
|
132
|
+
}
|
|
133
|
+
interface TableRowsInput {
|
|
100
134
|
columns: Array<{
|
|
101
135
|
name: string;
|
|
102
|
-
type
|
|
136
|
+
type?: string;
|
|
103
137
|
meta?: Record<string, unknown>;
|
|
104
138
|
}>;
|
|
105
139
|
rows: unknown[][];
|
|
106
|
-
|
|
140
|
+
name?: string;
|
|
107
141
|
meta?: Record<string, unknown>;
|
|
108
142
|
}
|
|
143
|
+
interface TableRowsOutput {
|
|
144
|
+
columns: Array<{
|
|
145
|
+
name: string;
|
|
146
|
+
type?: string;
|
|
147
|
+
meta?: Record<string, unknown>;
|
|
148
|
+
}>;
|
|
149
|
+
rows: unknown[][];
|
|
150
|
+
}
|
|
151
|
+
declare function tableRowsToFrame(input: TableRowsInput): DatasourceFrame;
|
|
152
|
+
declare function tableFrameToRows(frame: DatasourceFrame): TableRowsOutput;
|
|
109
153
|
interface VariableOption {
|
|
110
154
|
label: string;
|
|
111
155
|
value: string;
|
|
@@ -119,11 +163,13 @@ interface DatasourceHealthResult {
|
|
|
119
163
|
message?: string;
|
|
120
164
|
details?: Record<string, unknown>;
|
|
121
165
|
}
|
|
166
|
+
type DatasourceSchemaKind = string;
|
|
122
167
|
interface DatasourceSchemaNamespace {
|
|
123
168
|
id: string;
|
|
124
169
|
name: string;
|
|
125
|
-
kind?:
|
|
170
|
+
kind?: DatasourceSchemaKind;
|
|
126
171
|
parentId?: string;
|
|
172
|
+
hasChildren?: boolean;
|
|
127
173
|
meta?: Record<string, unknown>;
|
|
128
174
|
}
|
|
129
175
|
interface DatasourceSchemaFieldRequest {
|
|
@@ -132,8 +178,10 @@ interface DatasourceSchemaFieldRequest {
|
|
|
132
178
|
interface DatasourceSchemaField {
|
|
133
179
|
name: string;
|
|
134
180
|
type?: string;
|
|
181
|
+
kind?: DatasourceFieldKind;
|
|
182
|
+
nullable?: boolean;
|
|
135
183
|
label?: string;
|
|
136
|
-
|
|
184
|
+
insertText?: string;
|
|
137
185
|
meta?: Record<string, unknown>;
|
|
138
186
|
}
|
|
139
187
|
interface AnnotationQuery<TQuery = unknown> {
|
|
@@ -146,9 +194,11 @@ interface AnnotationQuery<TQuery = unknown> {
|
|
|
146
194
|
color?: string;
|
|
147
195
|
}
|
|
148
196
|
type BatchQueryResultItem = {
|
|
197
|
+
id: string;
|
|
149
198
|
data: QueryResult;
|
|
150
199
|
error?: never;
|
|
151
200
|
} | {
|
|
201
|
+
id: string;
|
|
152
202
|
data?: never;
|
|
153
203
|
error: Error;
|
|
154
204
|
};
|
|
@@ -272,6 +322,8 @@ interface CreateRestDatasourceManagerOptions {
|
|
|
272
322
|
fetch?: typeof fetch;
|
|
273
323
|
getHeaders?: (context?: DatasourceContext) => HeadersInit | Promise<HeadersInit>;
|
|
274
324
|
paths?: Partial<RestDatasourceManagerPaths>;
|
|
325
|
+
serializeQueryBody?(request: DataQuery, context?: DatasourceContext): unknown;
|
|
326
|
+
serializeBatchQueryBody?(requests: DataQuery[], context?: DatasourceContext): unknown;
|
|
275
327
|
unwrap?<T>(body: unknown, response: Response): T;
|
|
276
328
|
createError?(response: Response, body: unknown): Error | undefined;
|
|
277
329
|
}
|
|
@@ -285,6 +337,7 @@ interface RestDatasourceManagerPaths {
|
|
|
285
337
|
instanceUpdate(uid: string): string;
|
|
286
338
|
instanceDelete(uid: string): string;
|
|
287
339
|
query(): string;
|
|
340
|
+
batchQuery(): string;
|
|
288
341
|
healthCheck(uid: string): string;
|
|
289
342
|
validateQuery(uid: string): string;
|
|
290
343
|
listNamespaces(uid: string): string;
|
|
@@ -292,4 +345,4 @@ interface RestDatasourceManagerPaths {
|
|
|
292
345
|
}
|
|
293
346
|
declare function createRestDatasourceManager(options: CreateRestDatasourceManagerOptions): DatasourceManagerBackend;
|
|
294
347
|
|
|
295
|
-
export { type Annotation as A, type BatchQueryResult as B, type CreateDatasourceManagerOptions as C, type DataQuery as D, type
|
|
348
|
+
export { type Annotation as A, type BatchQueryResult as B, type CreateDatasourceManagerOptions as C, type DataQuery as D, type DatasourceSchemaField as E, type DatasourceSchemaFieldRequest as F, type DatasourceSchemaKind as G, type DatasourceSchemaNamespace as H, type DatasourceTypeInfo as I, type DatasourceUpdateInput as J, type DatasourceValidationResult as K, type QueryInspect as L, type QueryResult as M, type QueryStats as N, type TableRowsOutput as O, createDatasourceManager as P, type QueryCallOptions as Q, type RestDatasourceManagerPaths as R, createDatasourceRegistry as S, type TableRowsInput as T, createRestDatasourceManager as U, type VariableOption as V, defineDatasourcePlugin as W, tableFrameToRows as X, tableRowsToFrame as Y, type AnnotationQuery as a, type AuthContext as b, type AuthSubject as c, type BatchQueryResultItem as d, type CreateRestDatasourceManagerOptions as e, type DatasourceConfigEditorProps as f, type DatasourceContext as g, type DatasourceCreateInput as h, type DatasourceField as i, type DatasourceFieldKind as j, type DatasourceFrame as k, type DatasourceFrameType as l, type DatasourceHealthResult as m, type DatasourceInstance as n, type DatasourceListFilter as o, type DatasourceListOptions as p, type DatasourceListResult as q, type DatasourceManager as r, type DatasourceManagerBackend as s, type DatasourceManagerInstances as t, type DatasourceManagerTypes as u, type DatasourcePermissionHint as v, type DatasourcePluginBackend as w, type DatasourcePluginDef as x, type DatasourceQueryEditorProps as y, type DatasourceRegistry as z };
|
package/dist/testing.cjs
CHANGED
|
@@ -14,6 +14,21 @@ var DatasourceConflictError = class extends Error {
|
|
|
14
14
|
}
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
+
// src/types.ts
|
|
18
|
+
function tableRowsToFrame(input) {
|
|
19
|
+
return {
|
|
20
|
+
...input.name !== void 0 ? { name: input.name } : {},
|
|
21
|
+
frameType: "table",
|
|
22
|
+
fields: input.columns.map((column, columnIndex) => ({
|
|
23
|
+
name: column.name,
|
|
24
|
+
...column.type !== void 0 ? { type: column.type } : {},
|
|
25
|
+
values: input.rows.map((row) => row[columnIndex]),
|
|
26
|
+
...column.meta !== void 0 ? { meta: column.meta } : {}
|
|
27
|
+
})),
|
|
28
|
+
...input.meta !== void 0 ? { meta: input.meta } : {}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
17
32
|
// src/testing.ts
|
|
18
33
|
function nextVersion(current) {
|
|
19
34
|
return String(Number(current ?? "0") + 1);
|
|
@@ -147,15 +162,19 @@ function createMemoryDatasourceBackend(options = {}) {
|
|
|
147
162
|
store = store.filter((d) => d.uid !== uid);
|
|
148
163
|
}
|
|
149
164
|
},
|
|
150
|
-
async query(request) {
|
|
165
|
+
async query(request, _context) {
|
|
151
166
|
const ds = findInstance(request.datasourceUid);
|
|
152
167
|
return {
|
|
153
|
-
|
|
154
|
-
{
|
|
155
|
-
|
|
156
|
-
|
|
168
|
+
frames: [
|
|
169
|
+
tableRowsToFrame({
|
|
170
|
+
columns: [
|
|
171
|
+
{ name: "name", type: "string" },
|
|
172
|
+
{ name: "type", type: "string" },
|
|
173
|
+
{ name: "version", type: "string" }
|
|
174
|
+
],
|
|
175
|
+
rows: [[ds.name, ds.type, ds.version ?? ""]]
|
|
176
|
+
})
|
|
157
177
|
],
|
|
158
|
-
rows: [[ds.name, ds.type, ds.version ?? ""]],
|
|
159
178
|
requestId: request.id,
|
|
160
179
|
meta: { datasourceUid: ds.uid }
|
|
161
180
|
};
|
package/dist/testing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/testing.ts"],"names":[],"mappings":"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","file":"testing.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 { DatasourceConflictError, DatasourceNotFoundError } from './errors'\nimport type { DatasourceManagerBackend } from './manager'\nimport type {\n DataQuery,\n DatasourceCreateInput,\n DatasourceInstance,\n DatasourceListOptions,\n DatasourceListResult,\n DatasourceTypeInfo,\n DatasourceUpdateInput,\n QueryResult,\n} from './types'\n\nfunction nextVersion(current?: string): string {\n return String(Number(current ?? '0') + 1)\n}\n\nfunction defaultTypes(seed: DatasourceInstance[]): DatasourceTypeInfo[] {\n const seen = new Set<string>()\n const types: DatasourceTypeInfo[] = []\n for (const instance of seed) {\n if (seen.has(instance.type)) continue\n seen.add(instance.type)\n types.push({\n type: instance.type,\n name: instance.type,\n enabled: true,\n installed: true,\n })\n }\n return types\n}\n\nexport interface CreateMemoryDatasourceBackendOptions {\n instances?: DatasourceInstance[]\n types?: DatasourceTypeInfo[]\n}\n\nexport function createMemoryDatasourceBackend(\n options: CreateMemoryDatasourceBackendOptions = {},\n): DatasourceManagerBackend {\n let store: DatasourceInstance[] = (options.instances ?? []).map((d) => ({ ...d }))\n let types: DatasourceTypeInfo[] = (options.types ?? defaultTypes(store)).map((t) => ({ ...t }))\n\n function findType(type: string): DatasourceTypeInfo {\n const info = types.find((t) => t.type === type)\n if (!info) throw new DatasourceNotFoundError(type)\n return info\n }\n\n function findInstance(uid: string): DatasourceInstance {\n const ds = store.find((d) => d.uid === uid)\n if (!ds) throw new DatasourceNotFoundError(uid)\n return ds\n }\n\n return {\n types: {\n async list() {\n return types.map((t) => ({ ...t }))\n },\n\n async get(type) {\n return { ...findType(type) }\n },\n\n async install(type) {\n if (!types.some((t) => t.type === type)) {\n types = [...types, { type, name: type, installed: true, enabled: false }]\n }\n },\n\n async uninstall(type) {\n findType(type)\n types = types.filter((t) => t.type !== type)\n },\n\n async enable(type) {\n const current = findType(type)\n types = types.map((t) => t.type === type ? { ...current, enabled: true } : t)\n },\n\n async disable(type) {\n const current = findType(type)\n types = types.map((t) => t.type === type ? { ...current, enabled: false } : t)\n },\n },\n\n instances: {\n async list(listOptions?: DatasourceListOptions): Promise<DatasourceListResult> {\n let items = [...store]\n const filter = listOptions?.filter\n if (filter?.type !== undefined) {\n const filterTypes = Array.isArray(filter.type) ? filter.type : [filter.type]\n items = items.filter((d) => filterTypes.includes(d.type))\n }\n if (filter?.enabled !== undefined) {\n items = items.filter((d) => (d.enabled ?? true) === filter.enabled)\n }\n if (filter?.search !== undefined) {\n const query = filter.search.toLowerCase()\n items = items.filter(\n (d) => d.name.toLowerCase().includes(query) || d.uid.toLowerCase().includes(query),\n )\n }\n const total = items.length\n if (listOptions?.page !== undefined && listOptions?.pageSize !== undefined) {\n const start = listOptions.page * listOptions.pageSize\n items = items.slice(start, start + listOptions.pageSize)\n } else if (listOptions?.pageSize !== undefined) {\n items = items.slice(0, listOptions.pageSize)\n }\n return { items: items.map((d) => ({ ...d })), total }\n },\n\n async get(uid) {\n return { ...findInstance(uid) }\n },\n\n async create(input: DatasourceCreateInput) {\n const now = new Date().toISOString()\n const uid = input.uid ?? `ds-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`\n const ds: DatasourceInstance = {\n uid,\n type: input.type,\n name: input.name,\n ...(input.options !== undefined ? { options: input.options } : {}),\n enabled: input.enabled ?? true,\n ...(input.meta !== undefined ? { meta: input.meta } : {}),\n version: '1',\n createdAt: now,\n updatedAt: now,\n }\n store = [...store, ds]\n if (!types.some((t) => t.type === input.type)) {\n types = [...types, { type: input.type, name: input.type, installed: true, enabled: true }]\n }\n return { ...ds }\n },\n\n async update(uid, patch: DatasourceUpdateInput) {\n const idx = store.findIndex((d) => d.uid === uid)\n if (idx === -1) throw new DatasourceNotFoundError(uid)\n const ds = store[idx]\n if (patch.version !== undefined && ds.version !== patch.version) {\n throw new DatasourceConflictError(\n `\"${uid}\" version conflict: expected ${patch.version}, got ${ds.version}`,\n )\n }\n const updated: DatasourceInstance = {\n ...ds,\n ...(patch.name !== undefined ? { name: patch.name } : {}),\n ...(patch.options !== undefined ? { options: patch.options } : {}),\n ...(patch.enabled !== undefined ? { enabled: patch.enabled } : {}),\n ...(patch.meta !== undefined ? { meta: patch.meta } : {}),\n version: nextVersion(ds.version),\n updatedAt: new Date().toISOString(),\n }\n store = [...store.slice(0, idx), updated, ...store.slice(idx + 1)]\n return { ...updated }\n },\n\n async delete(uid) {\n findInstance(uid)\n store = store.filter((d) => d.uid !== uid)\n },\n },\n\n async query(request: DataQuery): Promise<QueryResult> {\n const ds = findInstance(request.datasourceUid)\n return {\n columns: [\n { name: 'name', type: 'string' },\n { name: 'type', type: 'string' },\n { name: 'version', type: 'string' },\n ],\n rows: [[ds.name, ds.type, ds.version ?? '']],\n requestId: request.id,\n meta: { datasourceUid: ds.uid },\n }\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/types.ts","../src/testing.ts"],"names":[],"mappings":"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","file":"testing.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","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","import { DatasourceConflictError, DatasourceNotFoundError } from './errors'\nimport type { DatasourceManagerBackend } from './manager'\nimport { tableRowsToFrame } from './types'\nimport type {\n DataQuery,\n DatasourceContext,\n DatasourceCreateInput,\n DatasourceInstance,\n DatasourceListOptions,\n DatasourceListResult,\n DatasourceTypeInfo,\n DatasourceUpdateInput,\n QueryResult,\n} from './types'\n\nfunction nextVersion(current?: string): string {\n return String(Number(current ?? '0') + 1)\n}\n\nfunction defaultTypes(seed: DatasourceInstance[]): DatasourceTypeInfo[] {\n const seen = new Set<string>()\n const types: DatasourceTypeInfo[] = []\n for (const instance of seed) {\n if (seen.has(instance.type)) continue\n seen.add(instance.type)\n types.push({\n type: instance.type,\n name: instance.type,\n enabled: true,\n installed: true,\n })\n }\n return types\n}\n\nexport interface CreateMemoryDatasourceBackendOptions {\n instances?: DatasourceInstance[]\n types?: DatasourceTypeInfo[]\n}\n\nexport function createMemoryDatasourceBackend(\n options: CreateMemoryDatasourceBackendOptions = {},\n): DatasourceManagerBackend {\n let store: DatasourceInstance[] = (options.instances ?? []).map((d) => ({ ...d }))\n let types: DatasourceTypeInfo[] = (options.types ?? defaultTypes(store)).map((t) => ({ ...t }))\n\n function findType(type: string): DatasourceTypeInfo {\n const info = types.find((t) => t.type === type)\n if (!info) throw new DatasourceNotFoundError(type)\n return info\n }\n\n function findInstance(uid: string): DatasourceInstance {\n const ds = store.find((d) => d.uid === uid)\n if (!ds) throw new DatasourceNotFoundError(uid)\n return ds\n }\n\n return {\n types: {\n async list() {\n return types.map((t) => ({ ...t }))\n },\n\n async get(type) {\n return { ...findType(type) }\n },\n\n async install(type) {\n if (!types.some((t) => t.type === type)) {\n types = [...types, { type, name: type, installed: true, enabled: false }]\n }\n },\n\n async uninstall(type) {\n findType(type)\n types = types.filter((t) => t.type !== type)\n },\n\n async enable(type) {\n const current = findType(type)\n types = types.map((t) => t.type === type ? { ...current, enabled: true } : t)\n },\n\n async disable(type) {\n const current = findType(type)\n types = types.map((t) => t.type === type ? { ...current, enabled: false } : t)\n },\n },\n\n instances: {\n async list(listOptions?: DatasourceListOptions): Promise<DatasourceListResult> {\n let items = [...store]\n const filter = listOptions?.filter\n if (filter?.type !== undefined) {\n const filterTypes = Array.isArray(filter.type) ? filter.type : [filter.type]\n items = items.filter((d) => filterTypes.includes(d.type))\n }\n if (filter?.enabled !== undefined) {\n items = items.filter((d) => (d.enabled ?? true) === filter.enabled)\n }\n if (filter?.search !== undefined) {\n const query = filter.search.toLowerCase()\n items = items.filter(\n (d) => d.name.toLowerCase().includes(query) || d.uid.toLowerCase().includes(query),\n )\n }\n const total = items.length\n if (listOptions?.page !== undefined && listOptions?.pageSize !== undefined) {\n const start = listOptions.page * listOptions.pageSize\n items = items.slice(start, start + listOptions.pageSize)\n } else if (listOptions?.pageSize !== undefined) {\n items = items.slice(0, listOptions.pageSize)\n }\n return { items: items.map((d) => ({ ...d })), total }\n },\n\n async get(uid) {\n return { ...findInstance(uid) }\n },\n\n async create(input: DatasourceCreateInput) {\n const now = new Date().toISOString()\n const uid = input.uid ?? `ds-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`\n const ds: DatasourceInstance = {\n uid,\n type: input.type,\n name: input.name,\n ...(input.options !== undefined ? { options: input.options } : {}),\n enabled: input.enabled ?? true,\n ...(input.meta !== undefined ? { meta: input.meta } : {}),\n version: '1',\n createdAt: now,\n updatedAt: now,\n }\n store = [...store, ds]\n if (!types.some((t) => t.type === input.type)) {\n types = [...types, { type: input.type, name: input.type, installed: true, enabled: true }]\n }\n return { ...ds }\n },\n\n async update(uid, patch: DatasourceUpdateInput) {\n const idx = store.findIndex((d) => d.uid === uid)\n if (idx === -1) throw new DatasourceNotFoundError(uid)\n const ds = store[idx]\n if (patch.version !== undefined && ds.version !== patch.version) {\n throw new DatasourceConflictError(\n `\"${uid}\" version conflict: expected ${patch.version}, got ${ds.version}`,\n )\n }\n const updated: DatasourceInstance = {\n ...ds,\n ...(patch.name !== undefined ? { name: patch.name } : {}),\n ...(patch.options !== undefined ? { options: patch.options } : {}),\n ...(patch.enabled !== undefined ? { enabled: patch.enabled } : {}),\n ...(patch.meta !== undefined ? { meta: patch.meta } : {}),\n version: nextVersion(ds.version),\n updatedAt: new Date().toISOString(),\n }\n store = [...store.slice(0, idx), updated, ...store.slice(idx + 1)]\n return { ...updated }\n },\n\n async delete(uid) {\n findInstance(uid)\n store = store.filter((d) => d.uid !== uid)\n },\n },\n\n async query(request: DataQuery, _context?: DatasourceContext): Promise<QueryResult> {\n const ds = findInstance(request.datasourceUid)\n return {\n frames: [\n tableRowsToFrame({\n columns: [\n { name: 'name', type: 'string' },\n { name: 'type', type: 'string' },\n { name: 'version', type: 'string' },\n ],\n rows: [[ds.name, ds.type, ds.version ?? '']],\n }),\n ],\n requestId: request.id,\n meta: { datasourceUid: ds.uid },\n }\n },\n }\n}\n"]}
|
package/dist/testing.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as DatasourceInstance, I as DatasourceTypeInfo, s as DatasourceManagerBackend } from './manager-DOC7PPiJ.cjs';
|
|
2
2
|
|
|
3
3
|
interface CreateMemoryDatasourceBackendOptions {
|
|
4
4
|
instances?: DatasourceInstance[];
|
package/dist/testing.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as DatasourceInstance, I as DatasourceTypeInfo, s as DatasourceManagerBackend } from './manager-DOC7PPiJ.js';
|
|
2
2
|
|
|
3
3
|
interface CreateMemoryDatasourceBackendOptions {
|
|
4
4
|
instances?: DatasourceInstance[];
|
package/dist/testing.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DatasourceNotFoundError, DatasourceConflictError } from './chunk-
|
|
1
|
+
import { tableRowsToFrame, DatasourceNotFoundError, DatasourceConflictError } from './chunk-NSZRSVET.js';
|
|
2
2
|
|
|
3
3
|
// src/testing.ts
|
|
4
4
|
function nextVersion(current) {
|
|
@@ -133,15 +133,19 @@ function createMemoryDatasourceBackend(options = {}) {
|
|
|
133
133
|
store = store.filter((d) => d.uid !== uid);
|
|
134
134
|
}
|
|
135
135
|
},
|
|
136
|
-
async query(request) {
|
|
136
|
+
async query(request, _context) {
|
|
137
137
|
const ds = findInstance(request.datasourceUid);
|
|
138
138
|
return {
|
|
139
|
-
|
|
140
|
-
{
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
frames: [
|
|
140
|
+
tableRowsToFrame({
|
|
141
|
+
columns: [
|
|
142
|
+
{ name: "name", type: "string" },
|
|
143
|
+
{ name: "type", type: "string" },
|
|
144
|
+
{ name: "version", type: "string" }
|
|
145
|
+
],
|
|
146
|
+
rows: [[ds.name, ds.type, ds.version ?? ""]]
|
|
147
|
+
})
|
|
143
148
|
],
|
|
144
|
-
rows: [[ds.name, ds.type, ds.version ?? ""]],
|
|
145
149
|
requestId: request.id,
|
|
146
150
|
meta: { datasourceUid: ds.uid }
|
|
147
151
|
};
|