@mdxui/do 2.1.1 → 3.0.0

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.
Files changed (71) hide show
  1. package/README.md +253 -266
  2. package/dist/{agents-xcIn2dUB.d.ts → agents-2_r9e9i7.d.ts} +213 -2
  3. package/dist/app/index.d.ts +347 -0
  4. package/dist/app/index.js +13 -0
  5. package/dist/app/index.js.map +1 -0
  6. package/dist/chunk-4KXVN3EQ.js +56 -0
  7. package/dist/chunk-4KXVN3EQ.js.map +1 -0
  8. package/dist/chunk-5AWTQDRF.js +76 -0
  9. package/dist/chunk-5AWTQDRF.js.map +1 -0
  10. package/dist/chunk-EQVOEEQO.js +95 -0
  11. package/dist/chunk-EQVOEEQO.js.map +1 -0
  12. package/dist/chunk-FO3N7SXV.js +469 -0
  13. package/dist/chunk-FO3N7SXV.js.map +1 -0
  14. package/dist/chunk-IESVTECE.js +536 -0
  15. package/dist/chunk-IESVTECE.js.map +1 -0
  16. package/dist/chunk-JWKIONEO.js +234 -0
  17. package/dist/chunk-JWKIONEO.js.map +1 -0
  18. package/dist/chunk-NTSEARBC.js +715 -0
  19. package/dist/chunk-NTSEARBC.js.map +1 -0
  20. package/dist/chunk-OWEAW4U6.js +116 -0
  21. package/dist/chunk-OWEAW4U6.js.map +1 -0
  22. package/dist/chunk-VRLUXCLD.js +31 -0
  23. package/dist/chunk-VRLUXCLD.js.map +1 -0
  24. package/dist/chunk-Y52IEYVM.js +131 -0
  25. package/dist/chunk-Y52IEYVM.js.map +1 -0
  26. package/dist/chunk-YGIBMNRH.js +1991 -0
  27. package/dist/chunk-YGIBMNRH.js.map +1 -0
  28. package/dist/components/index.d.ts +1 -738
  29. package/dist/components/index.js +2 -6
  30. package/dist/config-CmZBQQaT.d.ts +122 -0
  31. package/dist/{do-CaQVueZw.d.ts → do-C-t9UgjT.d.ts} +31 -33
  32. package/dist/errors-B4Oyyj4Z.d.ts +346 -0
  33. package/dist/hooks/index.d.ts +428 -696
  34. package/dist/hooks/index.js +6 -4
  35. package/dist/hooks/things/index.d.ts +298 -0
  36. package/dist/hooks/things/index.js +8 -0
  37. package/dist/hooks/things/index.js.map +1 -0
  38. package/dist/index.d.ts +21 -1010
  39. package/dist/index.js +11 -839
  40. package/dist/index.js.map +1 -1
  41. package/dist/lib/index.d.ts +100 -0
  42. package/dist/lib/index.js +6 -0
  43. package/dist/lib/index.js.map +1 -0
  44. package/dist/providers/index.d.ts +244 -32
  45. package/dist/providers/index.js +3 -2
  46. package/dist/query-keys-BC901wog.d.ts +153 -0
  47. package/dist/schemas/index.d.ts +1 -1
  48. package/dist/schemas/index.js +2 -2
  49. package/dist/schemas/index.js.map +1 -1
  50. package/dist/{thing-DtI25yZh.d.ts → thing-BVhCTzOi.d.ts} +4 -4
  51. package/dist/types/index.d.ts +251 -216
  52. package/dist/types/index.js +1 -2
  53. package/dist/views/index.d.ts +131 -0
  54. package/dist/views/index.js +11 -0
  55. package/dist/views/index.js.map +1 -0
  56. package/package.json +39 -17
  57. package/dist/__test-utils__/index.d.ts +0 -399
  58. package/dist/__test-utils__/index.js +0 -34641
  59. package/dist/__test-utils__/index.js.map +0 -1
  60. package/dist/chunk-EEDMN7UF.js +0 -1351
  61. package/dist/chunk-EEDMN7UF.js.map +0 -1
  62. package/dist/chunk-G3PMV62Z.js +0 -33
  63. package/dist/chunk-G3PMV62Z.js.map +0 -1
  64. package/dist/chunk-NXPXL5NA.js +0 -3789
  65. package/dist/chunk-NXPXL5NA.js.map +0 -1
  66. package/dist/chunk-PC5FJY6M.js +0 -20
  67. package/dist/chunk-PC5FJY6M.js.map +0 -1
  68. package/dist/chunk-XF6LKY2M.js +0 -445
  69. package/dist/chunk-XF6LKY2M.js.map +0 -1
  70. package/dist/magic-string.es-J7BYFTTJ.js +0 -1307
  71. package/dist/magic-string.es-J7BYFTTJ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/json-rpc-client.ts","../src/lib/capnweb-client.ts","../src/providers/do-provider.tsx"],"names":[],"mappings":"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","file":"chunk-FO3N7SXV.js","sourcesContent":["/**\n * JSON-RPC Client for DO Admin API\n *\n * This client wraps the JSON-RPC API exposed by DO admin servers,\n * translating the standard Thing/Schema interface to the server's\n * actual RPC methods.\n *\n * Auto-discovers available types and endpoints from the server.\n *\n * @module\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface RpcResponse<T = unknown> {\n result?: T\n error?: {\n code: string\n message: string\n data?: unknown\n }\n}\n\ninterface ListResponse<T> {\n data?: T[]\n items?: T[]\n result?: T[]\n count?: number\n}\n\n/** SQL execution result */\nexport interface SQLResult {\n rows: Record<string, unknown>[]\n columns: { name: string; type: string }[]\n rowsAffected?: number\n executionTimeMs?: number\n}\n\n/** Cache for discovered endpoints that exist */\nconst endpointCache = new Map<string, Set<string>>()\n\n// =============================================================================\n// JSON-RPC Client Implementation\n// =============================================================================\n\n/**\n * Create a JSON-RPC compatible client that matches the DOClient interface\n */\nexport function createJsonRpcClient(baseUrl: string) {\n // Normalize URL: strip trailing slash and any existing /rpc suffix\n // This prevents double /rpc when the baseUrl already ends with /rpc\n const rpcUrl = baseUrl.replace(/\\/$/, '').replace(/\\/rpc$/, '')\n\n /**\n * Make a JSON-RPC call\n */\n async function rpcCall<T>(method: string, args: unknown[] = []): Promise<T> {\n const response = await fetch(`${rpcUrl}/rpc`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ method, args }),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const data: RpcResponse<T> = await response.json()\n\n if (data.error) {\n throw new Error(data.error.message || data.error.code)\n }\n\n return data.result as T\n }\n\n /**\n * Make a REST call\n */\n async function restCall<T>(path: string, options?: RequestInit): Promise<T> {\n const response = await fetch(`${rpcUrl}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n })\n\n if (!response.ok) {\n // Return empty data structure for 404s on GET requests (endpoint doesn't exist)\n // POST/PUT/DELETE 404s should still throw\n const method = options?.method?.toUpperCase() ?? 'GET'\n if (response.status === 404 && method === 'GET') {\n return { data: [], count: 0 } as T\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n // Return a client object that matches the DOClient interface\n return {\n /**\n * Namespace operations\n */\n Namespace: {\n async list(_params?: { includeSystem?: boolean }) {\n // The server doesn't have explicit namespaces, return default\n return [{ id: 'default', name: 'default' }]\n },\n },\n\n /**\n * Schema operations\n */\n Schema: {\n async discover(_params?: { ns?: string }) {\n // Get schemas from RPC\n const schemas = await rpcCall<string[]>('schemas.list', [])\n return {\n namespaces: ['default'],\n types: schemas,\n schemas,\n }\n },\n\n async get(params: { ns?: string; type: string }) {\n const result = await rpcCall<unknown>('schemas.get', [params.type])\n return result\n },\n },\n\n /**\n * Thing operations (maps to REST endpoints)\n */\n Thing: {\n async types(params: { ns?: string; includeSystem?: boolean }) {\n // Discover types from schema and probe which have REST endpoints\n try {\n // Get all schema types from RPC\n const schemas = await rpcCall<string[]>('schemas.list', [])\n\n // Check cache first\n let validEndpoints = endpointCache.get(rpcUrl)\n\n if (!validEndpoints) {\n // Probe each type's endpoint to see if it exists\n validEndpoints = new Set<string>()\n\n const probeResults = await Promise.all(\n schemas.map(async (type) => {\n const endpoint = getEndpointForType(type)\n try {\n const response = await fetch(`${rpcUrl}${endpoint}`, { method: 'HEAD' })\n return { type, exists: response.ok }\n } catch {\n // Network error or CORS - try GET with limit=0\n try {\n const response = await fetch(`${rpcUrl}${endpoint}?limit=0`)\n return { type, exists: response.ok }\n } catch {\n return { type, exists: false }\n }\n }\n })\n )\n\n for (const { type, exists } of probeResults) {\n if (exists) {\n validEndpoints.add(type)\n }\n }\n\n // Cache the results\n endpointCache.set(rpcUrl, validEndpoints)\n }\n\n return Array.from(validEndpoints).map((name) => ({\n name,\n ns: params.ns || 'default',\n }))\n } catch {\n // Fallback: return common types if schema discovery fails\n return ['Noun', 'Verb', 'Action', 'Function'].map((name) => ({\n name,\n ns: params.ns || 'default',\n }))\n }\n },\n\n async list(params: { ns?: string; type?: string; limit?: number; offset?: number }) {\n // Map type to endpoint (lowercase + plural heuristic)\n const endpoint = getEndpointForType(params.type || 'Thing')\n const response = await restCall<ListResponse<unknown>>(endpoint)\n\n // Normalize response\n const items = response.data || response.items || response.result || []\n return {\n data: items,\n total: response.count ?? items.length,\n }\n },\n\n async get(params: { ns?: string; type: string; id: string }) {\n const endpoint = getEndpointForType(params.type)\n const response = await restCall<{ data: unknown }>(`${endpoint}/${params.id}`)\n return response.data\n },\n\n async create(params: { ns?: string; type: string; data: unknown }) {\n const endpoint = getEndpointForType(params.type)\n const response = await restCall<{ data: unknown }>(endpoint, {\n method: 'POST',\n body: JSON.stringify(params.data),\n })\n return response.data\n },\n\n async update(params: { ns?: string; type: string; id: string; data: unknown }) {\n const endpoint = getEndpointForType(params.type)\n const response = await restCall<{ data: unknown }>(`${endpoint}/${params.id}`, {\n method: 'PUT',\n body: JSON.stringify(params.data),\n })\n return response.data\n },\n\n async delete(params: { ns?: string; type: string; id: string; hard?: boolean }) {\n const endpoint = getEndpointForType(params.type)\n await restCall(`${endpoint}/${params.id}`, { method: 'DELETE' })\n return { success: true }\n },\n\n async versions(_params: { ns?: string; type: string; id: string }) {\n // Versions not supported by this server\n return []\n },\n\n async stats(_params: { ns?: string; type?: string }) {\n // Get valid endpoints from cache or discover them\n let validEndpoints = endpointCache.get(rpcUrl)\n\n if (!validEndpoints) {\n // Trigger discovery by calling types()\n await this.types({ ns: _params.ns })\n validEndpoints = endpointCache.get(rpcUrl) || new Set()\n }\n\n // Get counts from discovered endpoints\n const types = Array.from(validEndpoints)\n const results = await Promise.all(\n types.map(async (type) => {\n const endpoint = getEndpointForType(type)\n const response = await restCall<ListResponse<unknown>>(endpoint).catch(() => ({ count: 0 }))\n return { type, count: response.count || 0 }\n })\n )\n\n const byType: Record<string, number> = {}\n let total = 0\n for (const { type, count } of results) {\n byType[type] = count\n total += count\n }\n\n return { total, byType }\n },\n },\n\n /**\n * SQL operations\n */\n SQL: {\n async execute(params: { query: string; params?: unknown[] }): Promise<SQLResult> {\n const startTime = Date.now()\n\n // Try RPC method first\n try {\n const result = await rpcCall<{\n rows: Record<string, unknown>[]\n columns: { name: string; type: string }[]\n rowsAffected?: number\n executionTimeMs?: number\n }>('sql.execute', [params.query, params.params || []])\n\n return {\n rows: result.rows ?? [],\n columns: result.columns ?? [],\n rowsAffected: result.rowsAffected,\n executionTimeMs: result.executionTimeMs ?? (Date.now() - startTime),\n }\n } catch (rpcError) {\n // Check if this is a \"not supported\" error\n const errorMessage = rpcError instanceof Error ? rpcError.message : String(rpcError)\n const isNotSupported =\n errorMessage.includes('not found') ||\n errorMessage.includes('not supported') ||\n errorMessage.includes('unknown method')\n\n // Fallback to REST endpoint if exists\n try {\n const response = await restCall<{\n rows: Record<string, unknown>[]\n columns: { name: string; type: string }[]\n rowsAffected?: number\n }>('/sql', {\n method: 'POST',\n body: JSON.stringify({ query: params.query, params: params.params }),\n })\n\n return {\n rows: response.rows ?? [],\n columns: response.columns ?? [],\n rowsAffected: response.rowsAffected,\n executionTimeMs: Date.now() - startTime,\n }\n } catch (restError) {\n // If both methods fail and RPC indicated not supported, throw clearer error\n if (isNotSupported) {\n throw new Error(\n 'SQL execution is not supported by this server. The server does not expose sql.execute RPC method or /sql REST endpoint.'\n )\n }\n throw restError\n }\n }\n },\n },\n\n // Required for interface compatibility\n dup: () => createJsonRpcClient(baseUrl),\n onRpcBroken: (_callback: (error: unknown) => void) => {},\n [Symbol.dispose]: () => {},\n }\n}\n\n/**\n * Map a type name to its REST endpoint\n */\nfunction getEndpointForType(type: string): string {\n const typeMap: Record<string, string> = {\n Noun: '/nouns',\n Verb: '/verbs',\n Action: '/actions',\n Function: '/functions',\n Event: '/events',\n Relationship: '/relationships',\n Thing: '/things',\n Workflow: '/workflows',\n }\n\n return typeMap[type] || `/${type.toLowerCase()}s`\n}\n\n/**\n * Create a client context - factory function matching $Context interface\n */\nexport function $JsonRpcContext(url: string) {\n return createJsonRpcClient(url)\n}\n","/**\n * Cap'n Web Client Wrapper for DO Admin API\n *\n * This wraps the raw capnweb HTTP batch client to provide a structured interface\n * matching the DOClient interface (client.Thing.list, client.Schema.discover, etc.)\n *\n * @module\n */\n\nimport { newHttpBatchRpcSession } from 'capnweb'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface ListResponse<T> {\n data?: T[]\n items?: T[]\n result?: T[]\n count?: number\n}\n\n/** SQL execution result */\nexport interface SQLResult {\n rows: Record<string, unknown>[]\n columns: { name: string; type: string }[]\n rowsAffected?: number\n executionTimeMs?: number\n}\n\n// =============================================================================\n// Cap'n Web Client Wrapper\n// =============================================================================\n\n/**\n * Create a Cap'n Web client that matches the DOClient interface\n *\n * @param baseUrl - The base URL for the RPC endpoint\n */\nexport function createCapnwebClient(baseUrl: string) {\n // Normalize URL - strip trailing slash and /rpc suffix, then add /rpc\n const rpcUrl = `${baseUrl.replace(/\\/$/, '').replace(/\\/rpc$/, '')}/rpc`\n\n // Create the capnweb HTTP batch session\n // The capnweb library has deeply nested types that cause TS2589\n // @ts-expect-error - Type instantiation is excessively deep (capnweb library issue)\n const session = newHttpBatchRpcSession(rpcUrl) as any\n\n // The capnweb client provides methods directly - we need to call them as:\n // session.methodName(args) where methodName matches server's exposed methods\n //\n // Server API (from GET /rpc):\n // methods: [\"create\", \"get\", \"update\", \"delete\", \"list\", \"search\", \"getRelated\", \"generate\", \"getStats\", \"getSchemas\", \"getSchema\"]\n const rpc = session as unknown as {\n create: (...args: unknown[]) => Promise<unknown>\n get: (...args: unknown[]) => Promise<unknown>\n update: (...args: unknown[]) => Promise<unknown>\n delete: (...args: unknown[]) => Promise<unknown>\n list: (...args: unknown[]) => Promise<unknown>\n search: (...args: unknown[]) => Promise<unknown>\n getRelated: (...args: unknown[]) => Promise<unknown>\n generate: (...args: unknown[]) => Promise<unknown>\n getStats: (...args: unknown[]) => Promise<unknown>\n getSchemas: (...args: unknown[]) => Promise<unknown>\n getSchema: (...args: unknown[]) => Promise<unknown>\n }\n\n // Return a client object that matches the DOClient interface\n return {\n /**\n * Namespace operations\n */\n Namespace: {\n async list(_params?: { includeSystem?: boolean }) {\n // Server doesn't have explicit namespaces, return default\n return [{ id: 'default', name: 'default' }]\n },\n },\n\n /**\n * Schema operations\n */\n Schema: {\n async discover(_params?: { ns?: string }) {\n try {\n const schemas = await rpc.getSchemas() as string[] | undefined\n return {\n namespaces: ['default'],\n types: schemas ?? [],\n schemas: schemas ?? [],\n }\n } catch (error) {\n console.error('[@mdxui/do] Failed to get schemas:', error)\n return { namespaces: ['default'], types: [], schemas: [] }\n }\n },\n\n async get(params: { ns?: string; type: string }) {\n try {\n const result = await rpc.getSchema(params.type)\n return result\n } catch {\n return null\n }\n },\n },\n\n /**\n * Thing operations\n */\n Thing: {\n async types(params: { ns?: string; includeSystem?: boolean }) {\n try {\n const schemas = await rpc.getSchemas() as string[] | undefined\n return (schemas ?? []).map((name: string) => ({\n name,\n ns: params.ns || 'default',\n }))\n } catch (error) {\n console.error('[@mdxui/do] Failed to get types:', error)\n return []\n }\n },\n\n async list(params: { ns?: string; type?: string; limit?: number; offset?: number }) {\n try {\n const options: Record<string, unknown> = {}\n if (params.type) options.type = params.type\n if (params.limit !== undefined) options.limit = params.limit\n if (params.offset !== undefined) options.offset = params.offset\n\n const result = await rpc.list(options) as ListResponse<unknown> | unknown[] | undefined\n if (Array.isArray(result)) {\n return { data: result, total: result.length }\n }\n if (result) {\n const items = result.data || result.items || result.result || []\n return { data: items, total: result.count ?? items.length }\n }\n return { data: [], total: 0 }\n } catch (error) {\n console.error('[@mdxui/do] Failed to list things:', error)\n return { data: [], total: 0 }\n }\n },\n\n async get(params: { ns?: string; type: string; id: string }) {\n try {\n const result = await rpc.get({ type: params.type, id: params.id })\n return result\n } catch {\n return null\n }\n },\n\n async create(params: { ns?: string; type: string; data: unknown }) {\n const result = await rpc.create({ type: params.type, data: params.data })\n return result\n },\n\n async update(params: { ns?: string; type: string; id: string; data: unknown }) {\n const result = await rpc.update({ type: params.type, id: params.id, data: params.data })\n return result\n },\n\n async delete(params: { ns?: string; type: string; id: string; hard?: boolean }) {\n await rpc.delete({ type: params.type, id: params.id })\n return { success: true }\n },\n\n async versions(_params: { ns?: string; type: string; id: string }) {\n return []\n },\n\n async stats(_params: { ns?: string; type?: string }) {\n try {\n const options: Record<string, unknown> = {}\n if (_params.type) options.type = _params.type\n const result = await rpc.getStats(options) as { total?: number; byType?: Record<string, number> } | undefined\n return {\n total: result?.total ?? 0,\n byType: result?.byType ?? {},\n }\n } catch (error) {\n console.error('[@mdxui/do] Failed to get stats:', error)\n return { total: 0, byType: {} }\n }\n },\n },\n\n /**\n * SQL operations (not supported by capnweb servers)\n */\n SQL: {\n async execute(_params: { query: string; params?: unknown[] }): Promise<SQLResult> {\n throw new Error('SQL execution is not supported by this server')\n },\n },\n\n // Required for interface compatibility\n dup: () => createCapnwebClient(baseUrl),\n onRpcBroken: (callback: (error: unknown) => void) => {\n if ('onRpcBroken' in session && typeof session.onRpcBroken === 'function') {\n (session as { onRpcBroken: (cb: (error: unknown) => void) => void }).onRpcBroken(callback)\n }\n },\n [Symbol.dispose]: () => {\n if (Symbol.dispose in session) {\n (session as { [Symbol.dispose]: () => void })[Symbol.dispose]()\n }\n },\n }\n}\n\n/**\n * Create a capnweb client context - factory function matching DOClient interface\n */\nexport function $CapnwebContext(url: string) {\n return createCapnwebClient(url)\n}\n\n// Keep these exports for backward compatibility\nexport const $CapnwebHttpContext = $CapnwebContext\nexport const $CapnwebWsContext = $CapnwebContext\n","'use client'\n\nimport * as React from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { $JsonRpcContext } from '../lib/json-rpc-client'\nimport { $CapnwebContext } from '../lib/capnweb-client'\nimport { DataProviderContext } from '@mdxui/app'\nimport type { DataProvider } from '@mdxui/app'\nimport type { DOAdminConfig } from '../types'\nimport { deriveRpcUrl } from '../lib/url-utils'\nimport { useHealthCheck } from '../lib/use-health-check'\n\n/**\n * Create a QueryClient with sensible defaults for @mdxui/do\n */\nfunction createQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n // Stale time: 30 seconds (data considered fresh)\n staleTime: 30 * 1000,\n // Cache time: 5 minutes (keep in cache after unmount)\n gcTime: 5 * 60 * 1000,\n // Retry failed requests 1 time\n retry: 1,\n // Refetch on window focus for fresh data\n refetchOnWindowFocus: true,\n },\n mutations: {\n // Retry mutations once on failure\n retry: 1,\n },\n },\n })\n}\n\n/**\n * Type for the DO client instance\n *\n * The client provides a structured interface for RPC operations.\n * Common patterns:\n * - client.Thing.list({ type: 'User' })\n * - client.Thing.get({ id: 'xxx' })\n * - client.Thing.create({ type: 'User', name: 'Alice', data: {} })\n * - client.Schema.discover()\n */\nexport type DOClient = ReturnType<typeof $CapnwebContext>\n\n/**\n * DO Context value\n *\n * Provides access to config, connection state, RPC URL, and the @dotdo/client instance.\n */\nexport interface DOContextValue {\n /** Admin configuration */\n config: DOAdminConfig\n /** Current namespace */\n namespace: string\n /** Set current namespace */\n setNamespace: (ns: string) => void\n /** Current user ID */\n userId?: string\n /** Is connected to backend? */\n isConnected: boolean\n /** Connection error */\n connectionError?: Error\n /** RPC URL for capnweb session */\n rpcUrl: string\n /** @dotdo/client instance for direct RPC calls */\n client: DOClient\n}\n\n/**\n * DO Context\n */\nconst DOContext = React.createContext<DOContextValue | null>(null)\n\n/**\n * Primary hook for accessing the DO provider context.\n *\n * This is the **main hook for application development** with @mdxui/do.\n * It provides access to configuration, connection state, RPC URL, and the client.\n *\n * @returns The DO context value containing config, state, rpcUrl, and client\n * @throws Error if called outside of a `DOProvider`\n *\n * @example\n * ```tsx\n * import { useDO } from '@mdxui/do'\n *\n * function ConnectionStatus() {\n * const { isConnected, namespace, rpcUrl, client } = useDO()\n *\n * const handleFetch = async () => {\n * const users = await client.Thing.list({ type: 'User' })\n * console.log(users)\n * }\n *\n * return (\n * <div>\n * <span>Namespace: {namespace}</span>\n * <span>Connected: {isConnected ? 'Yes' : 'No'}</span>\n * <button onClick={handleFetch}>Fetch Users</button>\n * </div>\n * )\n * }\n * ```\n */\nexport function useDO(): DOContextValue {\n const context = React.useContext(DOContext)\n if (!context) {\n throw new Error('useDO must be used within a DOProvider')\n }\n return context\n}\n\n/**\n * Hook to access the @dotdo/client instance directly.\n *\n * Convenience hook for components that only need the RPC client.\n *\n * @returns The @dotdo/client instance\n * @throws Error if called outside of a `DOProvider`\n *\n * @example\n * ```tsx\n * import { useDOClient } from '@mdxui/do'\n *\n * function UserList() {\n * const client = useDOClient()\n * const [users, setUsers] = useState([])\n *\n * useEffect(() => {\n * client.Thing.list({ type: 'User' }).then(setUsers)\n * }, [client])\n *\n * return <ul>{users.map(u => <li key={u.id}>{u.name}</li>)}</ul>\n * }\n * ```\n */\nexport function useDOClient(): DOClient {\n const { client } = useDO()\n return client\n}\n\n/**\n * Convenience hook to access derived URLs for API operations.\n *\n * Returns URL endpoints from the DOProvider configuration,\n * useful for making direct API calls or debugging connection issues.\n *\n * @returns Object containing rpcUrl and apiEndpoint\n */\nexport function useDOUrls() {\n const { rpcUrl, config } = useDO()\n return {\n rpcUrl,\n apiEndpoint: config.apiEndpoint,\n }\n}\n\n/**\n * @deprecated Sync status is no longer available in the simplified RPC-only architecture.\n * This function is kept for backward compatibility but always returns 'disconnected'.\n */\nexport function useSyncStatus(): 'disconnected' {\n return 'disconnected'\n}\n\n/**\n * Props for DOProvider\n */\nexport interface DOProviderProps {\n /** Admin configuration */\n config: DOAdminConfig\n /** Initial namespace */\n initialNamespace?: string\n /** Current user ID */\n userId?: string\n /** Children */\n children: React.ReactNode\n /** Custom QueryClient (for testing) */\n queryClient?: QueryClient\n}\n\n/**\n * DOProvider - Main provider for @mdxui/do\n *\n * Provides a single-mode RPC-first architecture using @dotdo/client for typed RPC calls.\n * All data operations go through the RPC endpoint using promise pipelining.\n *\n * @example\n * ```tsx\n * <DOProvider\n * config={{\n * apiEndpoint: 'https://admin.do.ai',\n * authMethod: 'jwt',\n * authToken: 'xxx',\n * bindings: [...],\n * realTimeUpdates: false,\n * }}\n * initialNamespace=\"my-app\"\n * userId=\"user_123\"\n * >\n * <App />\n * </DOProvider>\n * ```\n *\n * @example\n * ```tsx\n * // Accessing the client in a child component\n * function MyComponent() {\n * const { client } = useDO()\n *\n * const fetchData = async () => {\n * // Promise pipelining - efficient batched RPC calls\n * const [users, projects] = await Promise.all([\n * client.Thing.list({ type: 'User' }),\n * client.Thing.list({ type: 'Project' }),\n * ])\n * return { users, projects }\n * }\n * }\n * ```\n */\nexport function DOProvider({\n config,\n initialNamespace = 'default',\n userId,\n children,\n queryClient: providedQueryClient,\n}: DOProviderProps) {\n // Namespace state\n const [namespace, setNamespace] = React.useState(initialNamespace)\n\n // Derive RPC URL from config - use explicit rpcUrl if provided, otherwise derive from apiEndpoint\n const rpcUrl = config.rpcUrl ?? deriveRpcUrl(config.apiEndpoint)\n\n // Create RPC client instance based on clientType config\n const client = React.useMemo(() => {\n const clientType = config.clientType ?? 'capnweb'\n\n // Log client initialization in development for debugging\n if (process.env.NODE_ENV === 'development') {\n const url = clientType === 'json-rpc' ? config.apiEndpoint : rpcUrl\n console.log(`[@mdxui/do] Initializing ${clientType} client with URL: ${url}`)\n }\n\n if (clientType === 'json-rpc') {\n // JSON-RPC over HTTP - for servers that use simple JSON format\n return $JsonRpcContext(config.apiEndpoint) as unknown as DOClient\n }\n\n // Default: Cap'n Proto HTTP batch with structured interface\n return $CapnwebContext(rpcUrl) as unknown as DOClient\n }, [rpcUrl, config.apiEndpoint, config.clientType])\n\n // Health check for API connectivity (with retry and exponential backoff)\n // Skip health check if configured (useful for backends without /health endpoint)\n const healthCheckResult = useHealthCheck({\n apiEndpoint: config.apiEndpoint,\n authToken: config.authToken,\n requestTimeout: config.requestTimeout,\n healthCheckRetries: config.healthCheckRetries,\n })\n\n // When skipHealthCheck is true, assume connected\n const isConnected = config.skipHealthCheck ? true : healthCheckResult.isConnected\n const connectionError = config.skipHealthCheck ? undefined : healthCheckResult.connectionError\n\n // Use provided QueryClient or create one\n const [queryClient] = React.useState(() => providedQueryClient ?? createQueryClient())\n\n // Context value\n const value = React.useMemo<DOContextValue>(\n () => ({\n config,\n namespace,\n setNamespace,\n userId,\n isConnected,\n connectionError,\n rpcUrl,\n client,\n }),\n [config, namespace, userId, isConnected, connectionError, rpcUrl, client]\n )\n\n return (\n <QueryClientProvider client={queryClient}>\n <DOContext.Provider value={value}>{children}</DOContext.Provider>\n </QueryClientProvider>\n )\n}\n\n/**\n * Hook to access the QueryClient for manual cache operations\n */\nexport { useQueryClient } from '@tanstack/react-query'\n\n/**\n * Hook to safely access the DataProvider, returning null if not available.\n *\n * This is useful for hooks that can optionally use a DataProvider when one\n * is configured, but should fall back to RPC when no DataProvider is present.\n */\nexport function useDataProviderSafe(): DataProvider | null {\n return React.useContext(DataProviderContext)\n}\n"]}
@@ -0,0 +1,536 @@
1
+ import { thingsKeys } from './chunk-4KXVN3EQ.js';
2
+ import { useDO } from './chunk-FO3N7SXV.js';
3
+ import { useQuery, useQueryClient } from '@tanstack/react-query';
4
+ import { useState, useRef, useCallback, useEffect } from 'react';
5
+
6
+ var schemaKeys = {
7
+ all: ["schema"],
8
+ discovery: (ns) => [...schemaKeys.all, "discovery", ns ?? "all"],
9
+ definition: (ns, type) => [...schemaKeys.all, "definition", ns, type]
10
+ };
11
+ function useSchema(options = {}) {
12
+ const { ns, type, includeSystem = false, enabled = true } = options;
13
+ const { client } = useDO();
14
+ const query = useQuery({
15
+ queryKey: schemaKeys.discovery(ns),
16
+ queryFn: async () => {
17
+ try {
18
+ const result = await client.Schema.discover({
19
+ ns,
20
+ type,
21
+ includeSystem
22
+ });
23
+ return {
24
+ schemas: result.schemas ?? [],
25
+ namespaces: result.namespaces ?? [],
26
+ typesByNamespace: result.typesByNamespace ?? {},
27
+ serverInfo: result.serverInfo
28
+ };
29
+ } catch (error) {
30
+ try {
31
+ const typesResult = await client.Thing.types({ ns });
32
+ const namespaces = typesResult.namespaces ?? [ns ?? "default"];
33
+ const types = typesResult.types ?? [];
34
+ return {
35
+ schemas: types.map((t) => ({
36
+ name: t,
37
+ ns: ns ?? "default",
38
+ properties: []
39
+ })),
40
+ namespaces,
41
+ typesByNamespace: {
42
+ [ns ?? "default"]: types
43
+ }
44
+ };
45
+ } catch {
46
+ return {
47
+ schemas: [],
48
+ namespaces: [],
49
+ typesByNamespace: {}
50
+ };
51
+ }
52
+ }
53
+ },
54
+ enabled
55
+ });
56
+ return {
57
+ data: query.data ?? null,
58
+ isLoading: query.isLoading,
59
+ error: query.error,
60
+ refetch: query.refetch,
61
+ isRefetching: query.isRefetching
62
+ };
63
+ }
64
+ function useSchemaDefinition(ns, type, options = {}) {
65
+ const { enabled = true } = options;
66
+ const { client } = useDO();
67
+ const query = useQuery({
68
+ queryKey: schemaKeys.definition(ns, type),
69
+ queryFn: async () => {
70
+ try {
71
+ const result = await client.Schema.get({ ns, type });
72
+ return result;
73
+ } catch {
74
+ return {
75
+ name: type,
76
+ ns,
77
+ properties: []
78
+ };
79
+ }
80
+ },
81
+ enabled: enabled && Boolean(ns && type)
82
+ });
83
+ return {
84
+ data: query.data ?? null,
85
+ isLoading: query.isLoading,
86
+ error: query.error,
87
+ refetch: query.refetch
88
+ };
89
+ }
90
+ var namespacesKeys = {
91
+ all: ["namespaces"],
92
+ list: (includeSystem) => [...namespacesKeys.all, "list", includeSystem ?? false]
93
+ };
94
+ function useNamespaces(options = {}) {
95
+ const { includeSystem = false, enabled = true } = options;
96
+ const { client } = useDO();
97
+ const query = useQuery({
98
+ queryKey: namespacesKeys.list(includeSystem),
99
+ queryFn: async () => {
100
+ let primaryError = null;
101
+ try {
102
+ const result = await client.Namespace.list({ includeSystem });
103
+ if (Array.isArray(result)) {
104
+ return result.map(normalizeNamespace);
105
+ }
106
+ if (result.namespaces && Array.isArray(result.namespaces)) {
107
+ return result.namespaces.map(normalizeNamespace);
108
+ }
109
+ if (result.data && Array.isArray(result.data)) {
110
+ return result.data.map(normalizeNamespace);
111
+ }
112
+ return [];
113
+ } catch (err) {
114
+ primaryError = err instanceof Error ? err : new Error(String(err));
115
+ try {
116
+ const schemaResult = await client.Schema.discover({});
117
+ const namespaceNames = schemaResult.namespaces ?? ["default"];
118
+ return namespaceNames.map((name) => ({
119
+ id: name,
120
+ name,
121
+ types: [],
122
+ thingCount: 0,
123
+ createdAt: /* @__PURE__ */ new Date()
124
+ }));
125
+ } catch (fallbackErr) {
126
+ throw new Error(
127
+ `Failed to fetch namespaces: ${primaryError.message}. Fallback also failed: ${fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)}`
128
+ );
129
+ }
130
+ }
131
+ },
132
+ enabled
133
+ });
134
+ return {
135
+ data: query.data ?? null,
136
+ isLoading: query.isLoading,
137
+ error: query.error,
138
+ refetch: query.refetch,
139
+ isRefetching: query.isRefetching,
140
+ status: query.status
141
+ };
142
+ }
143
+ function normalizeNamespace(ns) {
144
+ if (typeof ns === "string") {
145
+ return {
146
+ id: ns,
147
+ name: ns,
148
+ types: [],
149
+ thingCount: 0,
150
+ createdAt: /* @__PURE__ */ new Date()
151
+ };
152
+ }
153
+ const nsObj = ns;
154
+ return {
155
+ id: nsObj.id ?? nsObj.name ?? "unknown",
156
+ name: nsObj.name ?? nsObj.id ?? "unknown",
157
+ description: nsObj.description,
158
+ baseUrl: nsObj.baseUrl,
159
+ types: nsObj.types ?? [],
160
+ thingCount: nsObj.thingCount ?? 0,
161
+ createdAt: nsObj.createdAt ? new Date(nsObj.createdAt) : /* @__PURE__ */ new Date()
162
+ };
163
+ }
164
+ var typesKeys = {
165
+ all: ["types"],
166
+ list: (ns, includeSystem) => [...typesKeys.all, "list", ns, includeSystem ?? false]
167
+ };
168
+ function useTypes(options = {}) {
169
+ const { includeSystem = false, enabled = true } = options;
170
+ const { namespace, client } = useDO();
171
+ const ns = options.ns ?? namespace;
172
+ const query = useQuery({
173
+ queryKey: typesKeys.list(ns, includeSystem),
174
+ queryFn: async () => {
175
+ let primaryError = null;
176
+ try {
177
+ const result = await client.Thing.types({ ns, includeSystem });
178
+ if (Array.isArray(result)) {
179
+ return result.map((t) => normalizeType(t, ns));
180
+ }
181
+ if (result.types && Array.isArray(result.types)) {
182
+ return result.types.map((t) => normalizeType(t, ns));
183
+ }
184
+ if (result.data && Array.isArray(result.data)) {
185
+ return result.data.map((t) => normalizeType(t, ns));
186
+ }
187
+ return [];
188
+ } catch (err) {
189
+ primaryError = err instanceof Error ? err : new Error(String(err));
190
+ try {
191
+ const schemaResult = await client.Schema.discover({ ns });
192
+ const typeNames = schemaResult.typesByNamespace?.[ns] ?? [];
193
+ return typeNames.map((name) => normalizeType(name, ns));
194
+ } catch (fallbackErr) {
195
+ throw new Error(
196
+ `Failed to fetch types: ${primaryError.message}. Fallback also failed: ${fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)}`
197
+ );
198
+ }
199
+ }
200
+ },
201
+ enabled: enabled && Boolean(ns)
202
+ });
203
+ return {
204
+ data: query.data ?? null,
205
+ isLoading: query.isLoading,
206
+ error: query.error,
207
+ refetch: query.refetch,
208
+ isRefetching: query.isRefetching,
209
+ status: query.status
210
+ };
211
+ }
212
+ function normalizeType(type, defaultNs) {
213
+ if (typeof type === "string") {
214
+ return {
215
+ namespace: defaultNs,
216
+ name: type,
217
+ id: `${defaultNs}/${type}`,
218
+ label: type,
219
+ parentTypes: [],
220
+ properties: [],
221
+ subtypes: []
222
+ };
223
+ }
224
+ const typeObj = type;
225
+ const name = typeObj.name ?? typeObj.type ?? "unknown";
226
+ const namespace = typeObj.namespace ?? typeObj.ns ?? defaultNs;
227
+ return {
228
+ namespace,
229
+ name,
230
+ id: typeObj.id ?? `${namespace}/${name}`,
231
+ label: typeObj.label ?? typeObj.displayName ?? name,
232
+ description: typeObj.description,
233
+ parentTypes: typeObj.parentTypes ?? [],
234
+ properties: typeObj.properties ?? [],
235
+ subtypes: typeObj.subtypes ?? [],
236
+ examples: typeObj.examples
237
+ };
238
+ }
239
+ function useThingSubscription(options = {}) {
240
+ const {
241
+ type,
242
+ id,
243
+ filter,
244
+ onCreated,
245
+ onUpdated,
246
+ onDeleted,
247
+ onEvent,
248
+ onStateChange,
249
+ enabled = true,
250
+ invalidateOnUpdate = true
251
+ } = options;
252
+ const { client, namespace } = useDO();
253
+ const ns = options.ns ?? namespace;
254
+ const queryClient = useQueryClient();
255
+ const [state, setState] = useState("disconnected");
256
+ const [events, setEvents] = useState([]);
257
+ const [error, setError] = useState(null);
258
+ const subscriptionRef = useRef(null);
259
+ const reconnectTimeoutRef = useRef(null);
260
+ const MAX_EVENTS = 100;
261
+ const addEvent = useCallback((event) => {
262
+ setEvents((prev) => {
263
+ const newEvents = [event, ...prev];
264
+ return newEvents.slice(0, MAX_EVENTS);
265
+ });
266
+ onEvent?.(event);
267
+ }, [onEvent]);
268
+ const handleCreated = useCallback((thing) => {
269
+ addEvent({ type: "created", thing, timestamp: /* @__PURE__ */ new Date() });
270
+ onCreated?.(thing);
271
+ if (invalidateOnUpdate) {
272
+ queryClient.invalidateQueries({ queryKey: thingsKeys.lists() });
273
+ }
274
+ }, [addEvent, onCreated, invalidateOnUpdate, queryClient]);
275
+ const handleUpdated = useCallback((thing) => {
276
+ addEvent({ type: "updated", thing, timestamp: /* @__PURE__ */ new Date() });
277
+ onUpdated?.(thing);
278
+ if (invalidateOnUpdate) {
279
+ queryClient.setQueryData(
280
+ thingsKeys.detail(thing.ns, thing.type, thing.id),
281
+ thing
282
+ );
283
+ queryClient.invalidateQueries({ queryKey: thingsKeys.lists() });
284
+ }
285
+ }, [addEvent, onUpdated, invalidateOnUpdate, queryClient]);
286
+ const handleDeleted = useCallback((thingId) => {
287
+ addEvent({ type: "deleted", thingId, timestamp: /* @__PURE__ */ new Date() });
288
+ onDeleted?.(thingId);
289
+ if (invalidateOnUpdate) {
290
+ queryClient.invalidateQueries({ queryKey: thingsKeys.lists() });
291
+ }
292
+ }, [addEvent, onDeleted, invalidateOnUpdate, queryClient]);
293
+ const updateState = useCallback((newState) => {
294
+ setState(newState);
295
+ onStateChange?.(newState);
296
+ if (newState === "connected") {
297
+ addEvent({ type: "connected", timestamp: /* @__PURE__ */ new Date() });
298
+ } else if (newState === "disconnected") {
299
+ addEvent({ type: "disconnected", timestamp: /* @__PURE__ */ new Date() });
300
+ }
301
+ }, [onStateChange, addEvent]);
302
+ const connect = useCallback(async () => {
303
+ if (!enabled) return;
304
+ try {
305
+ updateState("connecting");
306
+ setError(null);
307
+ const subscriptionParams = {
308
+ ns,
309
+ type,
310
+ id,
311
+ filter
312
+ };
313
+ const subscription = await client.Thing.subscribe?.(subscriptionParams, {
314
+ onCreated: handleCreated,
315
+ onUpdated: handleUpdated,
316
+ onDeleted: handleDeleted,
317
+ onError: (err) => {
318
+ setError(err);
319
+ addEvent({ type: "error", error: err.message, timestamp: /* @__PURE__ */ new Date() });
320
+ updateState("error");
321
+ },
322
+ onConnected: () => updateState("connected"),
323
+ onDisconnected: () => updateState("disconnected")
324
+ });
325
+ if (subscription) {
326
+ subscriptionRef.current = subscription;
327
+ updateState("connected");
328
+ } else {
329
+ updateState("disconnected");
330
+ }
331
+ } catch (err) {
332
+ const error2 = err instanceof Error ? err : new Error("Subscription failed");
333
+ setError(error2);
334
+ addEvent({ type: "error", error: error2.message, timestamp: /* @__PURE__ */ new Date() });
335
+ updateState("error");
336
+ }
337
+ }, [
338
+ enabled,
339
+ ns,
340
+ type,
341
+ id,
342
+ filter,
343
+ client,
344
+ handleCreated,
345
+ handleUpdated,
346
+ handleDeleted,
347
+ updateState,
348
+ addEvent
349
+ ]);
350
+ const disconnect = useCallback(() => {
351
+ if (subscriptionRef.current?.unsubscribe) {
352
+ subscriptionRef.current.unsubscribe();
353
+ }
354
+ subscriptionRef.current = null;
355
+ updateState("disconnected");
356
+ }, [updateState]);
357
+ const reconnect = useCallback(() => {
358
+ disconnect();
359
+ reconnectTimeoutRef.current = setTimeout(connect, 100);
360
+ }, [disconnect, connect]);
361
+ useEffect(() => {
362
+ if (enabled) {
363
+ connect();
364
+ }
365
+ return () => {
366
+ disconnect();
367
+ if (reconnectTimeoutRef.current) {
368
+ clearTimeout(reconnectTimeoutRef.current);
369
+ }
370
+ };
371
+ }, [enabled, connect, disconnect]);
372
+ return {
373
+ state,
374
+ events,
375
+ isConnected: state === "connected",
376
+ error,
377
+ reconnect,
378
+ disconnect
379
+ };
380
+ }
381
+ function useSingleThingSubscription(options) {
382
+ const [lastUpdate, setLastUpdate] = useState(null);
383
+ const { isConnected, error } = useThingSubscription({
384
+ ns: options.ns,
385
+ type: options.type,
386
+ id: options.id,
387
+ enabled: options.enabled,
388
+ onUpdated: (thing) => {
389
+ setLastUpdate(/* @__PURE__ */ new Date());
390
+ options.onUpdated?.(thing);
391
+ },
392
+ onDeleted: () => {
393
+ options.onDeleted?.();
394
+ }
395
+ });
396
+ return {
397
+ isConnected,
398
+ lastUpdate,
399
+ error
400
+ };
401
+ }
402
+ function useEditHistory(options = {}) {
403
+ const { maxHistory = 50, onUndo, onRedo } = options;
404
+ const [undoStack, setUndoStack] = useState([]);
405
+ const [redoStack, setRedoStack] = useState([]);
406
+ const isUndoingRef = useRef(false);
407
+ const pushOperation = useCallback(
408
+ (operation) => {
409
+ if (isUndoingRef.current) return;
410
+ const fullOperation = {
411
+ ...operation,
412
+ timestamp: Date.now()
413
+ };
414
+ setUndoStack((prev) => {
415
+ const newStack = [...prev, fullOperation];
416
+ if (newStack.length > maxHistory) {
417
+ return newStack.slice(-maxHistory);
418
+ }
419
+ return newStack;
420
+ });
421
+ setRedoStack([]);
422
+ },
423
+ [maxHistory]
424
+ );
425
+ const undo = useCallback(() => {
426
+ if (undoStack.length === 0) return null;
427
+ const operation = undoStack[undoStack.length - 1];
428
+ isUndoingRef.current = true;
429
+ try {
430
+ setUndoStack((prev) => prev.slice(0, -1));
431
+ setRedoStack((prev) => [...prev, operation]);
432
+ onUndo?.(operation);
433
+ } finally {
434
+ isUndoingRef.current = false;
435
+ }
436
+ return operation;
437
+ }, [undoStack, onUndo]);
438
+ const redo = useCallback(() => {
439
+ if (redoStack.length === 0) return null;
440
+ const operation = redoStack[redoStack.length - 1];
441
+ isUndoingRef.current = true;
442
+ try {
443
+ setRedoStack((prev) => prev.slice(0, -1));
444
+ setUndoStack((prev) => [...prev, operation]);
445
+ onRedo?.(operation);
446
+ } finally {
447
+ isUndoingRef.current = false;
448
+ }
449
+ return operation;
450
+ }, [redoStack, onRedo]);
451
+ const clearHistory = useCallback(() => {
452
+ setUndoStack([]);
453
+ setRedoStack([]);
454
+ }, []);
455
+ return {
456
+ pushOperation,
457
+ undo,
458
+ redo,
459
+ canUndo: undoStack.length > 0,
460
+ canRedo: redoStack.length > 0,
461
+ undoCount: undoStack.length,
462
+ redoCount: redoStack.length,
463
+ clearHistory
464
+ };
465
+ }
466
+ function isEditableTarget(target) {
467
+ if (!target || !(target instanceof HTMLElement)) return false;
468
+ const tagName = target.tagName;
469
+ if (tagName === "INPUT" || tagName === "TEXTAREA") {
470
+ return true;
471
+ }
472
+ if (target.isContentEditable || target.getAttribute("contenteditable") === "true") {
473
+ return true;
474
+ }
475
+ return false;
476
+ }
477
+ function matchesShortcut(event, config) {
478
+ if (event.key.toLowerCase() !== config.key.toLowerCase()) {
479
+ return false;
480
+ }
481
+ const isModifierPressed = config.ctrl || config.meta;
482
+ if (isModifierPressed) {
483
+ if (!event.ctrlKey && !event.metaKey) {
484
+ return false;
485
+ }
486
+ }
487
+ if (config.shift && !event.shiftKey) {
488
+ return false;
489
+ }
490
+ if (!config.shift && event.shiftKey) {
491
+ return false;
492
+ }
493
+ return true;
494
+ }
495
+ function useKeyboardShortcuts(shortcuts, options = {}) {
496
+ const { enabled = true, preventDefault = true, stopPropagation = false } = options;
497
+ const shortcutsRef = useRef(shortcuts);
498
+ shortcutsRef.current = shortcuts;
499
+ const optionsRef = useRef({ preventDefault, stopPropagation });
500
+ optionsRef.current = { preventDefault, stopPropagation };
501
+ const handleKeyDown = useCallback((event) => {
502
+ if (isEditableTarget(event.target)) {
503
+ return;
504
+ }
505
+ const currentShortcuts = shortcutsRef.current;
506
+ const currentOptions = optionsRef.current;
507
+ for (const config of currentShortcuts) {
508
+ if (config.disabled) {
509
+ continue;
510
+ }
511
+ if (matchesShortcut(event, config)) {
512
+ if (currentOptions.preventDefault) {
513
+ event.preventDefault();
514
+ }
515
+ if (currentOptions.stopPropagation) {
516
+ event.stopPropagation();
517
+ }
518
+ config.handler();
519
+ return;
520
+ }
521
+ }
522
+ }, []);
523
+ useEffect(() => {
524
+ if (!enabled) {
525
+ return;
526
+ }
527
+ document.addEventListener("keydown", handleKeyDown);
528
+ return () => {
529
+ document.removeEventListener("keydown", handleKeyDown);
530
+ };
531
+ }, [enabled, handleKeyDown]);
532
+ }
533
+
534
+ export { namespacesKeys, schemaKeys, typesKeys, useEditHistory, useKeyboardShortcuts, useNamespaces, useSchema, useSchemaDefinition, useSingleThingSubscription, useThingSubscription, useTypes };
535
+ //# sourceMappingURL=chunk-IESVTECE.js.map
536
+ //# sourceMappingURL=chunk-IESVTECE.js.map