@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.
- package/README.md +253 -266
- package/dist/{agents-xcIn2dUB.d.ts → agents-2_r9e9i7.d.ts} +213 -2
- package/dist/app/index.d.ts +347 -0
- package/dist/app/index.js +13 -0
- package/dist/app/index.js.map +1 -0
- package/dist/chunk-4KXVN3EQ.js +56 -0
- package/dist/chunk-4KXVN3EQ.js.map +1 -0
- package/dist/chunk-5AWTQDRF.js +76 -0
- package/dist/chunk-5AWTQDRF.js.map +1 -0
- package/dist/chunk-EQVOEEQO.js +95 -0
- package/dist/chunk-EQVOEEQO.js.map +1 -0
- package/dist/chunk-FO3N7SXV.js +469 -0
- package/dist/chunk-FO3N7SXV.js.map +1 -0
- package/dist/chunk-IESVTECE.js +536 -0
- package/dist/chunk-IESVTECE.js.map +1 -0
- package/dist/chunk-JWKIONEO.js +234 -0
- package/dist/chunk-JWKIONEO.js.map +1 -0
- package/dist/chunk-NTSEARBC.js +715 -0
- package/dist/chunk-NTSEARBC.js.map +1 -0
- package/dist/chunk-OWEAW4U6.js +116 -0
- package/dist/chunk-OWEAW4U6.js.map +1 -0
- package/dist/chunk-VRLUXCLD.js +31 -0
- package/dist/chunk-VRLUXCLD.js.map +1 -0
- package/dist/chunk-Y52IEYVM.js +131 -0
- package/dist/chunk-Y52IEYVM.js.map +1 -0
- package/dist/chunk-YGIBMNRH.js +1991 -0
- package/dist/chunk-YGIBMNRH.js.map +1 -0
- package/dist/components/index.d.ts +1 -738
- package/dist/components/index.js +2 -6
- package/dist/config-CmZBQQaT.d.ts +122 -0
- package/dist/{do-CaQVueZw.d.ts → do-C-t9UgjT.d.ts} +31 -33
- package/dist/errors-B4Oyyj4Z.d.ts +346 -0
- package/dist/hooks/index.d.ts +428 -696
- package/dist/hooks/index.js +6 -4
- package/dist/hooks/things/index.d.ts +298 -0
- package/dist/hooks/things/index.js +8 -0
- package/dist/hooks/things/index.js.map +1 -0
- package/dist/index.d.ts +21 -1010
- package/dist/index.js +11 -839
- package/dist/index.js.map +1 -1
- package/dist/lib/index.d.ts +100 -0
- package/dist/lib/index.js +6 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/providers/index.d.ts +244 -32
- package/dist/providers/index.js +3 -2
- package/dist/query-keys-BC901wog.d.ts +153 -0
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.js +2 -2
- package/dist/schemas/index.js.map +1 -1
- package/dist/{thing-DtI25yZh.d.ts → thing-BVhCTzOi.d.ts} +4 -4
- package/dist/types/index.d.ts +251 -216
- package/dist/types/index.js +1 -2
- package/dist/views/index.d.ts +131 -0
- package/dist/views/index.js +11 -0
- package/dist/views/index.js.map +1 -0
- package/package.json +39 -17
- package/dist/__test-utils__/index.d.ts +0 -399
- package/dist/__test-utils__/index.js +0 -34641
- package/dist/__test-utils__/index.js.map +0 -1
- package/dist/chunk-EEDMN7UF.js +0 -1351
- package/dist/chunk-EEDMN7UF.js.map +0 -1
- package/dist/chunk-G3PMV62Z.js +0 -33
- package/dist/chunk-G3PMV62Z.js.map +0 -1
- package/dist/chunk-NXPXL5NA.js +0 -3789
- package/dist/chunk-NXPXL5NA.js.map +0 -1
- package/dist/chunk-PC5FJY6M.js +0 -20
- package/dist/chunk-PC5FJY6M.js.map +0 -1
- package/dist/chunk-XF6LKY2M.js +0 -445
- package/dist/chunk-XF6LKY2M.js.map +0 -1
- package/dist/magic-string.es-J7BYFTTJ.js +0 -1307
- package/dist/magic-string.es-J7BYFTTJ.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/admin/DoDataProvider.tsx","../src/admin/DoAuthProvider.tsx","../src/admin/discover-resources.ts","../src/admin/DoAdmin.tsx","../src/lib/sync/batch-sync.ts","../src/lib/sync/offline-queue.ts"],"names":["React","React2","jsx","AppAuthProvider"],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\n/**\n * DoDataProvider\n *\n * A DataProvider implementation that wraps @mdxui/do hooks for use\n * with @mdxui/admin components. Provides a standard DataProvider interface\n * backed by DO Things API.\n *\n * @module @mdxui/do/admin\n */\n\nimport * as React from 'react'\nimport {\n DataProviderProvider,\n type DataProvider as AppDataProvider,\n type GetListParams,\n type GetOneParams,\n type GetManyParams,\n type CreateParams,\n type UpdateParams,\n type DeleteParams,\n} from '@mdxui/app'\nimport { useDO } from '../providers'\nimport { fetchWithTimeout, DEFAULT_REQUEST_TIMEOUT } from '../lib/fetch-with-timeout'\nimport type { DoDataProvider as DoDataProviderInterface, DoRecord } from './types'\n\n// =============================================================================\n// Data Provider Factory\n// =============================================================================\n\n/**\n * Create a DataProvider that uses DO Things API.\n *\n * This factory function creates a DataProvider implementation that:\n * - Maps resources to DO Thing types\n * - Translates CRUD operations to DO API calls\n * - Supports both REST and RPC modes based on DOProvider config\n *\n * @param apiEndpoint - Base API endpoint\n * @param authToken - Optional auth token\n * @param namespace - Default namespace\n * @param rpcUrl - RPC endpoint for TanStack DB mode\n */\nexport function createDoDataProvider(\n apiEndpoint: string,\n authToken?: string,\n namespace: string = 'default',\n rpcUrl?: string | null\n): DoDataProviderInterface {\n const headers = {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n }\n\n /**\n * Make RPC call to DO backend\n */\n async function rpcCall<T>(method: string, args: unknown[] = []): Promise<T> {\n if (!rpcUrl) {\n throw new Error('RPC URL not configured')\n }\n\n const response = await fetchWithTimeout(rpcUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n id: crypto.randomUUID(),\n type: 'call',\n calls: [\n {\n promiseId: 'p-1',\n target: { type: 'root' },\n method,\n args: args.map((arg) => ({ type: 'value', value: arg })),\n },\n ],\n }),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n throw new Error(`RPC error: ${response.status}`)\n }\n\n const json = await response.json()\n\n if (json.type === 'error') {\n throw new Error(json.error?.message ?? 'RPC error')\n }\n\n if (json.results?.[0]?.type === 'error') {\n throw new Error(json.results[0].error?.message ?? 'RPC error')\n }\n\n return json.results?.[0]?.value as T\n }\n\n /**\n * Map resource name to Thing type\n * Resources use PascalCase (User), types use PascalCase (User)\n */\n function resourceToType(resource: string): string {\n return resource.charAt(0).toUpperCase() + resource.slice(1)\n }\n\n /**\n * Normalize a record to ensure it has an id field\n */\n function normalizeRecord<T>(item: Record<string, unknown>, fallbackId?: string | number): T {\n return {\n ...item,\n id: item.id ?? item.$id ?? fallbackId,\n } as T\n }\n\n const dataProvider: DoDataProviderInterface = {\n // =========================================================================\n // GetList\n // =========================================================================\n getList: async <T = DoRecord>(resource: string, params?: GetListParams) => {\n const type = resourceToType(resource)\n const { pagination, sort, filter } = params ?? {}\n\n if (rpcUrl) {\n // TanStack DB / RPC mode\n const result = await rpcCall<{\n items: Array<Record<string, unknown>>\n total: number\n }>('Thing.list', [{\n filter: { type, ns: namespace, ...filter },\n sort: sort ? { field: sort.field, order: sort.order.toLowerCase() } : undefined,\n pagination: pagination ? { page: pagination.page, perPage: pagination.perPage } : undefined,\n }])\n\n return {\n data: result.items.map((item) => normalizeRecord<T>(item)),\n total: result.total,\n }\n } else {\n // REST mode\n const urlParams = new URLSearchParams()\n urlParams.set('type', type)\n urlParams.set('ns', namespace)\n if (pagination) {\n urlParams.set('page', pagination.page.toString())\n urlParams.set('perPage', pagination.perPage.toString())\n }\n if (sort) {\n urlParams.set('sortField', sort.field)\n urlParams.set('sortOrder', sort.order)\n }\n if (filter) {\n Object.entries(filter).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n urlParams.set(`filter[${key}]`, String(value))\n }\n })\n }\n\n const response = await fetchWithTimeout(`${apiEndpoint}/things?${urlParams}`, {\n headers,\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${resource}: ${response.status}`)\n }\n\n const result = await response.json()\n const items = result.items ?? result.data ?? []\n return {\n data: items.map((item: Record<string, unknown>) => normalizeRecord<T>(item)),\n total: result.total ?? items.length,\n }\n }\n },\n\n // =========================================================================\n // GetOne\n // =========================================================================\n getOne: async <T = DoRecord>(resource: string, params: GetOneParams) => {\n const type = resourceToType(resource)\n const { id } = params\n\n if (rpcUrl) {\n const result = await rpcCall<Record<string, unknown>>('Thing.get', [{\n ns: namespace,\n type,\n id: String(id),\n }])\n\n return {\n data: normalizeRecord<T>(result, id),\n }\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(String(id))}`,\n { headers, timeout: DEFAULT_REQUEST_TIMEOUT }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${resource}/${id}: ${response.status}`)\n }\n\n const result = await response.json()\n return { data: normalizeRecord<T>(result, id) }\n }\n },\n\n // =========================================================================\n // GetMany\n // =========================================================================\n getMany: async <T = DoRecord>(resource: string, params: GetManyParams) => {\n const type = resourceToType(resource)\n const { ids } = params\n\n // Fetch each item individually and combine\n // TODO: Add bulk get endpoint to DO API\n const results = await Promise.all(\n ids.map(async (id) => {\n try {\n if (rpcUrl) {\n const result = await rpcCall<Record<string, unknown>>('Thing.get', [{\n ns: namespace,\n type,\n id: String(id),\n }])\n return normalizeRecord<T>(result, id)\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(String(id))}`,\n { headers, timeout: DEFAULT_REQUEST_TIMEOUT }\n )\n if (!response.ok) return null\n const result = await response.json()\n return normalizeRecord<T>(result, id)\n }\n } catch {\n return null\n }\n })\n )\n\n return {\n data: results.filter((item): item is NonNullable<typeof item> => item !== null) as T[],\n }\n },\n\n // =========================================================================\n // Create\n // =========================================================================\n create: async <T = DoRecord>(resource: string, params: CreateParams<T>) => {\n const type = resourceToType(resource)\n const { data } = params\n\n if (rpcUrl) {\n const result = await rpcCall<Record<string, unknown>>('Thing.create', [{\n ns: namespace,\n type,\n name: (data as Record<string, unknown>).name ?? `${type}-${Date.now()}`,\n data,\n }])\n\n return {\n data: normalizeRecord<T>(result),\n }\n } else {\n const response = await fetchWithTimeout(`${apiEndpoint}/things`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n ns: namespace,\n type,\n name: (data as Record<string, unknown>).name ?? `${type}-${Date.now()}`,\n data,\n }),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n throw new Error(`Failed to create ${resource}: ${response.status}`)\n }\n\n const result = await response.json()\n return { data: normalizeRecord<T>(result) }\n }\n },\n\n // =========================================================================\n // Update\n // =========================================================================\n update: async <T = DoRecord>(resource: string, params: UpdateParams<T>) => {\n const type = resourceToType(resource)\n const { id, data } = params\n\n if (rpcUrl) {\n const result = await rpcCall<Record<string, unknown>>('Thing.update', [{\n ns: namespace,\n type,\n id: String(id),\n data,\n }])\n\n return {\n data: normalizeRecord<T>(result, id),\n }\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(String(id))}`,\n {\n method: 'PATCH',\n headers,\n body: JSON.stringify({ data }),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to update ${resource}/${id}: ${response.status}`)\n }\n\n const result = await response.json()\n return { data: normalizeRecord<T>(result, id) }\n }\n },\n\n // =========================================================================\n // Delete\n // =========================================================================\n delete: async <T = DoRecord>(resource: string, params: DeleteParams) => {\n const type = resourceToType(resource)\n const { id } = params\n\n if (rpcUrl) {\n await rpcCall<void>('Thing.delete', [{\n ns: namespace,\n type,\n id: String(id),\n hard: false,\n }])\n\n return { data: { id } as T }\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(String(id))}`,\n {\n method: 'DELETE',\n headers,\n timeout: DEFAULT_REQUEST_TIMEOUT,\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to delete ${resource}/${id}: ${response.status}`)\n }\n\n return { data: { id } as T }\n }\n },\n\n // =========================================================================\n // DO-Specific Methods\n // =========================================================================\n\n /**\n * Get type statistics\n */\n getTypeStats: async (resource: string) => {\n const type = resourceToType(resource)\n\n if (rpcUrl) {\n const result = await rpcCall<{\n total: number\n recentlyCreated: number\n recentlyUpdated: number\n }>('Thing.stats', [{ ns: namespace, type }])\n return result\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/stats`,\n { headers, timeout: DEFAULT_REQUEST_TIMEOUT }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to get stats for ${resource}: ${response.status}`)\n }\n\n return response.json()\n }\n },\n\n /**\n * Get version history\n */\n getVersions: async (resource: string, id: string) => {\n const type = resourceToType(resource)\n\n if (rpcUrl) {\n const result = await rpcCall<unknown[]>('Thing.versions', [{\n ns: namespace,\n type,\n id,\n }])\n return result\n } else {\n const response = await fetchWithTimeout(\n `${apiEndpoint}/things/${encodeURIComponent(namespace)}/${encodeURIComponent(type)}/${encodeURIComponent(id)}/versions`,\n { headers, timeout: DEFAULT_REQUEST_TIMEOUT }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to get versions for ${resource}/${id}: ${response.status}`)\n }\n\n return response.json()\n }\n },\n }\n\n return dataProvider\n}\n\n// =============================================================================\n// Provider Component\n// =============================================================================\n\nexport interface DoDataProviderProviderProps {\n /** Children to render */\n children: React.ReactNode\n /** Optional pre-created data provider */\n dataProvider?: DoDataProviderInterface\n}\n\n/**\n * DoDataProviderProvider\n *\n * A provider component that automatically creates and provides a DO-backed\n * DataProvider using the current DOProvider context.\n *\n * @example\n * ```tsx\n * <DOProvider config={doConfig}>\n * <DoDataProviderProvider>\n * <MyApp />\n * </DoDataProviderProvider>\n * </DOProvider>\n * ```\n */\nexport function DoDataProviderProvider({\n children,\n dataProvider: providedDataProvider,\n}: DoDataProviderProviderProps) {\n const { config, namespace, rpcUrl } = useDO()\n\n // Create data provider from DO context if not provided\n const dataProvider = React.useMemo(() => {\n if (providedDataProvider) return providedDataProvider\n\n return createDoDataProvider(\n config.apiEndpoint,\n config.authToken,\n namespace,\n rpcUrl\n )\n }, [providedDataProvider, config.apiEndpoint, config.authToken, namespace, rpcUrl])\n\n return (\n <DataProviderProvider dataProvider={dataProvider as AppDataProvider}>\n {children}\n </DataProviderProvider>\n )\n}\n","'use client'\n\n/**\n * DoAuthProvider\n *\n * An AuthProvider implementation that wraps DO authentication context\n * for use with @mdxui/admin and @mdxui/app components.\n *\n * @module @mdxui/do/admin\n */\n\nimport * as React from 'react'\nimport { AuthProvider as AppAuthProvider, type AuthProviderInterface } from '@mdxui/app'\nimport { useDO } from '../providers'\nimport { fetchWithTimeout, DEFAULT_REQUEST_TIMEOUT } from '../lib/fetch-with-timeout'\nimport type { DoAuthProvider as DoAuthProviderType, DoUserIdentity, DoLoginParams } from './types'\n\n// =============================================================================\n// Auth Provider Factory\n// =============================================================================\n\n/**\n * Create an AuthProvider that uses DO authentication API.\n *\n * @param apiEndpoint - Base API endpoint\n * @param authMethod - Authentication method (jwt, api-key, oauth)\n * @param authToken - Optional pre-existing auth token\n * @param namespace - Default namespace\n */\nexport function createDoAuthProvider(\n apiEndpoint: string,\n authMethod: 'jwt' | 'api-key' | 'oauth',\n authToken?: string,\n namespace: string = 'default'\n): DoAuthProviderType {\n // Store token in memory (could also use localStorage)\n let currentToken = authToken\n\n const getHeaders = () => ({\n 'Content-Type': 'application/json',\n ...(currentToken ? { Authorization: `Bearer ${currentToken}` } : {}),\n })\n\n const authProvider: DoAuthProviderType = {\n /**\n * Login with credentials\n */\n login: async (params: DoLoginParams) => {\n const { username, password, apiKey, oauthToken, provider } = params\n\n let endpoint = `${apiEndpoint}/auth/login`\n let body: Record<string, unknown> = {}\n\n switch (authMethod) {\n case 'jwt':\n body = { username, password }\n break\n case 'api-key':\n // API key auth - validate the key\n endpoint = `${apiEndpoint}/auth/api-key`\n body = { apiKey }\n break\n case 'oauth':\n // OAuth - exchange token\n endpoint = `${apiEndpoint}/auth/oauth/${provider ?? 'google'}`\n body = { token: oauthToken }\n break\n }\n\n const response = await fetchWithTimeout(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Login failed' }))\n throw new Error(error.message ?? 'Login failed')\n }\n\n const result = await response.json()\n currentToken = result.token ?? result.accessToken\n\n // Store in localStorage for persistence\n if (typeof window !== 'undefined' && currentToken) {\n localStorage.setItem('do_auth_token', currentToken)\n }\n },\n\n /**\n * Logout current session\n */\n logout: async () => {\n try {\n // Call logout endpoint to invalidate server-side session\n await fetchWithTimeout(`${apiEndpoint}/auth/logout`, {\n method: 'POST',\n headers: getHeaders(),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n } catch {\n // Ignore logout errors - still clear local state\n }\n\n currentToken = undefined\n\n // Clear from localStorage\n if (typeof window !== 'undefined') {\n localStorage.removeItem('do_auth_token')\n }\n },\n\n /**\n * Check if user is authenticated\n */\n checkAuth: async () => {\n // Try to load token from localStorage if not in memory\n if (!currentToken && typeof window !== 'undefined') {\n currentToken = localStorage.getItem('do_auth_token') ?? undefined\n }\n\n if (!currentToken) {\n throw new Error('Not authenticated')\n }\n\n // Verify token is still valid\n const response = await fetchWithTimeout(`${apiEndpoint}/auth/me`, {\n method: 'GET',\n headers: getHeaders(),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n // Token is invalid - clear it\n currentToken = undefined\n if (typeof window !== 'undefined') {\n localStorage.removeItem('do_auth_token')\n }\n throw new Error('Session expired')\n }\n },\n\n /**\n * Check if an error is an auth error\n */\n checkError: async (error: Error) => {\n const status = (error as Error & { status?: number }).status\n\n if (status === 401 || status === 403) {\n currentToken = undefined\n if (typeof window !== 'undefined') {\n localStorage.removeItem('do_auth_token')\n }\n throw error\n }\n },\n\n /**\n * Get current user identity\n */\n getIdentity: async (): Promise<DoUserIdentity> => {\n const response = await fetchWithTimeout(`${apiEndpoint}/auth/me`, {\n method: 'GET',\n headers: getHeaders(),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n throw new Error('Failed to get user identity')\n }\n\n const user = await response.json()\n\n return {\n id: user.id ?? user.$id ?? user.sub,\n fullName: user.fullName ?? user.name ?? user.displayName,\n email: user.email,\n avatar: user.avatar ?? user.picture ?? user.avatarUrl,\n namespace: user.namespace ?? namespace,\n role: user.role,\n claims: user.claims ?? user.metadata,\n }\n },\n\n /**\n * Get user permissions\n */\n getPermissions: async (): Promise<string[]> => {\n const response = await fetchWithTimeout(`${apiEndpoint}/auth/permissions`, {\n method: 'GET',\n headers: getHeaders(),\n timeout: DEFAULT_REQUEST_TIMEOUT,\n })\n\n if (!response.ok) {\n // Return empty permissions if endpoint doesn't exist\n return []\n }\n\n const result = await response.json()\n return result.permissions ?? result ?? []\n },\n }\n\n return authProvider\n}\n\n// =============================================================================\n// Provider Component\n// =============================================================================\n\nexport interface DoAuthProviderProviderProps {\n /** Children to render */\n children: React.ReactNode\n /** Optional pre-created auth provider */\n authProvider?: DoAuthProviderType\n}\n\n/**\n * DoAuthProviderProvider\n *\n * A provider component that automatically creates and provides a DO-backed\n * AuthProvider using the current DOProvider context.\n *\n * @example\n * ```tsx\n * <DOProvider config={doConfig}>\n * <DoAuthProviderProvider>\n * <MyApp />\n * </DoAuthProviderProvider>\n * </DOProvider>\n * ```\n */\nexport function DoAuthProviderProvider({\n children,\n authProvider: providedAuthProvider,\n}: DoAuthProviderProviderProps) {\n const { config, namespace } = useDO()\n\n // Create auth provider from DO context if not provided\n const authProvider = React.useMemo(() => {\n if (providedAuthProvider) return providedAuthProvider\n\n return createDoAuthProvider(\n config.apiEndpoint,\n config.authMethod,\n config.authToken,\n namespace\n )\n }, [providedAuthProvider, config.apiEndpoint, config.authMethod, config.authToken, namespace])\n\n // Map DoAuthProvider to @mdxui/app AuthProvider interface\n const appAuthProvider: AuthProviderInterface = React.useMemo(() => ({\n login: authProvider.login as (params: Record<string, unknown>) => Promise<void>,\n logout: authProvider.logout,\n checkAuth: authProvider.checkAuth,\n checkError: authProvider.checkError,\n getIdentity: async () => {\n const identity = await authProvider.getIdentity()\n return {\n id: identity.id,\n fullName: identity.fullName,\n email: identity.email,\n avatar: identity.avatar,\n }\n },\n getPermissions: authProvider.getPermissions,\n }), [authProvider])\n\n return (\n <AppAuthProvider authProvider={appAuthProvider}>\n {children}\n </AppAuthProvider>\n )\n}\n","/**\n * Resource Discovery Utility\n *\n * Auto-generates resource definitions from DO configuration.\n * Used by DoAdmin to build navigation and CRUD views automatically.\n *\n * @module @mdxui/do/admin\n */\n\nimport type { DoAdminConfig, DoResourceDefinition } from './types'\nimport type { DOBinding } from '../types/do'\n\n/**\n * Default resource types when no bindings or explicit resources are provided.\n * These are the core entity types in the .do platform.\n */\nexport const DEFAULT_RESOURCE_TYPES = ['Thing', 'Agent', 'Workflow'] as const\n\n/**\n * Known resource type mappings for common DO class names.\n * Maps DO class names to user-friendly resource names.\n */\nconst CLASS_NAME_MAPPINGS: Record<string, string> = {\n ThingsRelationshipsDO: 'Thing',\n StateMachine: 'Workflow',\n ClaudeCodeSession: 'Session',\n BrowserSession: 'BrowserSession',\n ConversationSession: 'Conversation',\n ChangeProposal: 'Proposal',\n}\n\n/**\n * Convert a binding to a resource definition.\n *\n * @param binding - DO binding configuration\n * @returns Resource definition for the binding\n */\nfunction bindingToResource(binding: DOBinding): DoResourceDefinition {\n // Use class name mapping if available, otherwise use the binding name\n const resourceName = CLASS_NAME_MAPPINGS[binding.className] ?? binding.name\n\n // Generate a human-readable label from the resource name\n // PascalCase -> \"Pascal Case\"\n const label = resourceName\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .replace(/^./, (s) => s.toUpperCase())\n\n return {\n name: resourceName,\n label: label.endsWith('s') ? label : `${label}s`, // Pluralize for list views\n showInSidebar: true,\n }\n}\n\n/**\n * Create a default resource definition for a resource type.\n *\n * @param resourceType - The resource type name (e.g., 'Thing', 'Agent')\n * @returns Resource definition with sensible defaults\n */\nfunction createDefaultResource(resourceType: string): DoResourceDefinition {\n // Generate a human-readable label\n const label = resourceType\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .replace(/^./, (s) => s.toUpperCase())\n\n return {\n name: resourceType,\n label: label.endsWith('s') ? label : `${label}s`, // Pluralize\n showInSidebar: true,\n }\n}\n\n/**\n * Discover resources from configuration.\n *\n * Priority order:\n * 1. Explicitly provided resources (config.resources)\n * 2. Auto-discovered from bindings (if autoDiscoverResources is true)\n * 3. Default resources (Thing, Agent, Workflow)\n *\n * @param config - DoAdmin configuration\n * @returns Array of resource definitions\n *\n * @example\n * ```tsx\n * // Explicit resources take priority\n * const resources = discoverResources({\n * doConfig: { ... },\n * resources: [{ name: 'Task', label: 'Tasks' }],\n * })\n * // => [{ name: 'Task', label: 'Tasks' }]\n *\n * // Auto-discover from bindings\n * const resources = discoverResources({\n * doConfig: {\n * bindings: [\n * { name: 'THINGS', className: 'ThingsRelationshipsDO' },\n * ],\n * },\n * autoDiscoverResources: true,\n * })\n * // => [{ name: 'Thing', label: 'Things', showInSidebar: true }]\n *\n * // Default resources when nothing specified\n * const resources = discoverResources({\n * doConfig: { bindings: [] },\n * })\n * // => [{ name: 'Thing', ... }, { name: 'Agent', ... }, { name: 'Workflow', ... }]\n * ```\n */\nexport function discoverResources(config: DoAdminConfig): DoResourceDefinition[] {\n // Priority 1: Explicit resources\n if (config.resources && config.resources.length > 0) {\n return config.resources\n }\n\n // Priority 2: Auto-discover from bindings\n if (config.autoDiscoverResources && config.doConfig.bindings.length > 0) {\n // Deduplicate by resource name (in case multiple bindings map to same resource)\n const seen = new Set<string>()\n const resources: DoResourceDefinition[] = []\n\n for (const binding of config.doConfig.bindings) {\n const resource = bindingToResource(binding)\n if (!seen.has(resource.name)) {\n seen.add(resource.name)\n resources.push(resource)\n }\n }\n\n return resources\n }\n\n // Priority 3: Default resources\n return DEFAULT_RESOURCE_TYPES.map(createDefaultResource)\n}\n\n/**\n * Merge discovered resources with explicit overrides.\n *\n * This allows users to provide partial resource definitions that override\n * discovered defaults while keeping the auto-discovery behavior.\n *\n * @param discovered - Auto-discovered resources\n * @param overrides - User-provided resource overrides (by name)\n * @returns Merged resources with overrides applied\n */\nexport function mergeResourceOverrides(\n discovered: DoResourceDefinition[],\n overrides: Partial<DoResourceDefinition>[]\n): DoResourceDefinition[] {\n const overrideMap = new Map(\n overrides\n .filter((o) => o.name)\n .map((o) => [o.name!, o])\n )\n\n return discovered.map((resource) => {\n const override = overrideMap.get(resource.name)\n if (override) {\n return { ...resource, ...override }\n }\n return resource\n })\n}\n","'use client'\n\n/**\n * DoAdmin\n *\n * Main entry point for the embedded admin interface in @mdxui/do.\n * Combines @mdxui/app shell with @mdxui/admin components and\n * pre-wires everything to the DO backend.\n *\n * @module @mdxui/do/admin\n */\n\nimport * as React from 'react'\nimport {\n AppShell,\n NavMain,\n NavUser,\n PageHeader,\n AppBreadcrumbs,\n useAuth,\n type NavGroup,\n} from '@mdxui/app'\nimport {\n Admin,\n AdminWithoutRouter,\n Resource,\n type ResourceProps,\n} from '@mdxui/admin'\nimport { DOProvider, useDO } from '../providers'\nimport { DoDataProviderProvider, createDoDataProvider } from './DoDataProvider'\nimport { DoAuthProviderProvider, createDoAuthProvider } from './DoAuthProvider'\nimport type { DoAdminConfig, DoResourceDefinition, UseDoAdminResult } from './types'\nimport type { DOAdminConfig } from '../types/do'\nimport { discoverResources } from './discover-resources'\nimport {\n Database,\n Users,\n FileText,\n Settings,\n Home,\n Box,\n GitBranch,\n Workflow,\n Bot,\n Zap,\n type LucideIcon,\n} from 'lucide-react'\n\n// =============================================================================\n// Admin Config Context\n// =============================================================================\n\n/**\n * Context for DoAdmin configuration.\n * Allows useDoAdmin hook to access the full admin config including discovered resources.\n */\ninterface DoAdminContextValue {\n config: DoAdminConfig\n resources: DoResourceDefinition[]\n}\n\nconst DoAdminContext = React.createContext<DoAdminContextValue | null>(null)\n\n/**\n * Hook to access the DoAdmin config context.\n * Used internally by useDoAdmin.\n */\nfunction useDoAdminConfig(): DoAdminContextValue | null {\n return React.useContext(DoAdminContext)\n}\n\n// =============================================================================\n// Default Icon Map\n// =============================================================================\n\nconst DEFAULT_ICONS: Record<string, LucideIcon> = {\n dashboard: Home,\n task: FileText,\n user: Users,\n thing: Box,\n relationship: GitBranch,\n workflow: Workflow,\n agent: Bot,\n event: Zap,\n settings: Settings,\n database: Database,\n}\n\nfunction getIconForResource(name: string): LucideIcon {\n const lowercaseName = name.toLowerCase()\n return DEFAULT_ICONS[lowercaseName] ?? Box\n}\n\n// =============================================================================\n// Navigation Builder\n// =============================================================================\n\nfunction buildNavigation(\n resources: DoResourceDefinition[],\n basePath: string = ''\n): NavGroup[] {\n const mainItems = resources\n .filter((r) => r.showInSidebar !== false)\n .map((resource) => {\n const Icon = resource.icon ?? getIconForResource(resource.name)\n return {\n title: resource.label ?? resource.name,\n url: `${basePath}/${resource.name.toLowerCase()}`,\n icon: Icon as LucideIcon,\n }\n })\n\n return [\n {\n label: 'Resources',\n items: mainItems,\n },\n ]\n}\n\n// =============================================================================\n// DoAdmin Inner Component\n// =============================================================================\n\ninterface DoAdminInnerProps {\n config: DoAdminConfig\n}\n\nfunction DoAdminInner({ config }: DoAdminInnerProps) {\n const {\n title = 'Admin',\n logo,\n theme = 'system',\n basePath = '',\n dashboard,\n loginPage,\n notFoundPage,\n layout: CustomLayout,\n sidebarFooter,\n disableRouter = false,\n } = config\n\n const { isAuthenticated, identity, isLoading: isAuthLoading, logout } = useAuth()\n const { isConnected, connectionError, namespace } = useDO()\n\n // Discover resources from config (auto-generates from bindings or uses defaults)\n const resources = React.useMemo(() => discoverResources(config), [config])\n\n // Build navigation from discovered resources\n const navigation = React.useMemo(\n () => buildNavigation(resources, basePath),\n [resources, basePath]\n )\n\n // Context value for useDoAdmin hook\n const adminContextValue = React.useMemo<DoAdminContextValue>(\n () => ({ config, resources }),\n [config, resources]\n )\n\n // Map identity to user format expected by AppShell\n const user = React.useMemo(\n () =>\n identity\n ? {\n id: identity.id,\n fullName: identity.fullName,\n email: identity.email,\n avatar: identity.avatar,\n }\n : undefined,\n [identity]\n )\n\n // Render loading state\n if (isAuthLoading) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-background\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-muted-foreground\">Loading...</p>\n </div>\n </div>\n )\n }\n\n // Render connection error\n if (connectionError) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-background\">\n <div className=\"flex flex-col items-center gap-4 text-center\">\n <div className=\"rounded-full bg-destructive/10 p-4\">\n <Database className=\"h-8 w-8 text-destructive\" />\n </div>\n <h2 className=\"text-lg font-semibold\">Connection Error</h2>\n <p className=\"text-muted-foreground max-w-md\">\n Unable to connect to the backend. Please check your configuration and try again.\n </p>\n <p className=\"text-sm text-destructive\">{connectionError.message}</p>\n </div>\n </div>\n )\n }\n\n // Admin component to use\n const AdminComponent = disableRouter ? AdminWithoutRouter : Admin\n\n // Default admin content with @mdxui/admin\n const adminContent = (\n <AdminComponent\n title={title}\n logo={logo}\n theme={theme}\n basename={basePath}\n dashboard={dashboard}\n loginPage={loginPage}\n catchAll={notFoundPage}\n disableRouter={disableRouter}\n >\n {resources.map((resource) => (\n <Resource\n key={resource.name}\n name={resource.name}\n list={resource.list}\n create={resource.create}\n edit={resource.edit}\n show={resource.show}\n icon={resource.icon}\n />\n ))}\n </AdminComponent>\n )\n\n // If custom layout provided, use it\n if (CustomLayout) {\n return (\n <DoAdminContext.Provider value={adminContextValue}>\n <CustomLayout>{adminContent}</CustomLayout>\n </DoAdminContext.Provider>\n )\n }\n\n // Default: wrap in AppShell for consistent UI\n return (\n <DoAdminContext.Provider value={adminContextValue}>\n <AppShell\n config={{\n name: title,\n basePath,\n logo,\n }}\n navigation={navigation}\n user={user}\n isLoading={isAuthLoading}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold\">{title}</span>\n {namespace !== 'default' && (\n <span className=\"rounded-md bg-muted px-2 py-0.5 text-xs text-muted-foreground\">\n {namespace}\n </span>\n )}\n </div>\n }\n nav={<NavMain items={navigation[0]?.items ?? []} />}\n footer={\n sidebarFooter ?? (\n user && (\n <NavUser user={user} />\n )\n )\n }\n pageHeader={<AppBreadcrumbs />}\n >\n {adminContent}\n </AppShell>\n </DoAdminContext.Provider>\n )\n}\n\n// =============================================================================\n// DoAdmin Main Component\n// =============================================================================\n\nexport interface DoAdminProps {\n /** Admin configuration */\n config: DoAdminConfig\n /** Children (additional content) */\n children?: React.ReactNode\n}\n\n/**\n * DoAdmin - Full-featured admin interface for .do platform\n *\n * Provides a complete admin dashboard with:\n * - Pre-configured DO data provider\n * - Pre-configured DO auth provider\n * - Auto-generated CRUD views for resources\n * - Sidebar navigation\n * - User authentication\n *\n * @example\n * ```tsx\n * import { DoAdmin } from '@mdxui/do'\n *\n * function App() {\n * return (\n * <DoAdmin\n * config={{\n * title: 'My Admin',\n * doConfig: {\n * apiEndpoint: 'https://api.example.do',\n * authMethod: 'jwt',\n * bindings: [],\n * realTimeUpdates: true,\n * },\n * resources: [\n * { name: 'Task', label: 'Tasks' },\n * { name: 'User', label: 'Users' },\n * ],\n * }}\n * />\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Minimal setup - auto-discovers resources\n * <DoAdmin\n * config={{\n * doConfig: {\n * apiEndpoint: 'https://api.example.do',\n * authMethod: 'jwt',\n * bindings: [],\n * realTimeUpdates: true,\n * },\n * autoDiscoverResources: true,\n * }}\n * />\n * ```\n */\nexport function DoAdmin({ config, children }: DoAdminProps) {\n const { doConfig } = config\n\n return (\n <DOProvider config={doConfig}>\n <DoAuthProviderProvider>\n <DoDataProviderProvider>\n <DoAdminInner config={config} />\n {children}\n </DoDataProviderProvider>\n </DoAuthProviderProvider>\n </DOProvider>\n )\n}\n\nDoAdmin.displayName = 'DoAdmin'\n\n// =============================================================================\n// useDoAdmin Hook\n// =============================================================================\n\n/**\n * useDoAdmin - Hook to access DO admin context\n *\n * Provides access to user identity, auth state, resources, and namespace.\n * Must be used within a DoAdmin component.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {\n * user,\n * isAuthenticated,\n * namespace,\n * setNamespace,\n * logout,\n * } = useDoAdmin()\n *\n * return (\n * <div>\n * <p>Welcome, {user?.fullName}</p>\n * <button onClick={logout}>Logout</button>\n * </div>\n * )\n * }\n * ```\n */\nexport function useDoAdmin(): UseDoAdminResult {\n const auth = useAuth()\n const do_ = useDO()\n const adminConfig = useDoAdminConfig()\n\n // Get discovered resources from admin context, or generate defaults\n // This allows useDoAdmin to work both inside and outside DoAdmin component\n const resources = React.useMemo(() => {\n if (adminConfig?.resources) {\n return adminConfig.resources\n }\n // Fallback: discover from DO context config when used outside DoAdmin\n return discoverResources({\n doConfig: do_.config,\n })\n }, [adminConfig?.resources, do_.config])\n\n return React.useMemo(\n () => ({\n user: auth.identity\n ? {\n id: auth.identity.id,\n fullName: auth.identity.fullName,\n email: auth.identity.email,\n avatar: auth.identity.avatar,\n }\n : null,\n isAuthenticated: auth.isAuthenticated,\n isAuthLoading: auth.isLoading,\n isConnected: do_.isConnected,\n connectionError: do_.connectionError ?? null,\n resources,\n namespace: do_.namespace,\n setNamespace: do_.setNamespace,\n login: auth.login as (params: Record<string, unknown>) => Promise<void>,\n logout: auth.logout,\n }),\n [auth, do_, resources]\n )\n}\n","/**\n * Batch sync utilities for optimizing sync operations\n *\n * Batches rapid changes to reduce sync overhead and improve performance.\n * Instead of syncing every mutation individually, changes are buffered\n * and sent in batches.\n *\n * @module\n */\n\n/**\n * Options for batch sync operations\n */\nexport interface BatchSyncOptions {\n /** Maximum number of items before forcing a flush (default: 100) */\n maxBatchSize?: number\n /** Maximum time to wait before flushing in ms (default: 50) */\n maxWaitMs?: number\n}\n\n/**\n * Return type for batched operations controller\n */\nexport interface BatchedOperations<T> {\n /** Add an item to the batch queue */\n add: (item: T) => void\n /** Force flush all pending items immediately */\n flush: () => Promise<void>\n /** Get the current number of pending items */\n readonly pending: number\n}\n\n/**\n * Create a batched operations controller\n *\n * Buffers items and executes them in batches to reduce overhead.\n * Items are flushed when either:\n * - The batch reaches maxBatchSize\n * - maxWaitMs has elapsed since the first item was added\n *\n * @param executor - Function to execute with batched items\n * @param options - Batch configuration options\n * @returns Controller for managing batched operations\n *\n * @example\n * ```typescript\n * const batchedSync = createBatchedOperations<Mutation>(\n * async (mutations) => {\n * await syncToServer(mutations)\n * },\n * { maxBatchSize: 50, maxWaitMs: 100 }\n * )\n *\n * // These will be batched together\n * batchedSync.add({ type: 'create', data: { name: 'A' } })\n * batchedSync.add({ type: 'create', data: { name: 'B' } })\n * batchedSync.add({ type: 'create', data: { name: 'C' } })\n *\n * // Force immediate flush if needed\n * await batchedSync.flush()\n * ```\n */\nexport function createBatchedOperations<T>(\n executor: (items: T[]) => Promise<void>,\n options: BatchSyncOptions = {}\n): BatchedOperations<T> {\n const { maxBatchSize = 100, maxWaitMs = 50 } = options\n let batch: T[] = []\n let timer: ReturnType<typeof setTimeout> | null = null\n let flushPromise: Promise<void> | null = null\n\n const flush = async (): Promise<void> => {\n if (batch.length === 0) return\n\n // If already flushing, wait for that to complete\n if (flushPromise) {\n await flushPromise\n return\n }\n\n const items = batch\n batch = []\n\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n\n flushPromise = executor(items).finally(() => {\n flushPromise = null\n })\n\n await flushPromise\n }\n\n return {\n add: (item: T) => {\n batch.push(item)\n\n if (batch.length >= maxBatchSize) {\n // Batch is full, flush immediately\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n void flush()\n } else if (!timer) {\n // Start the timer if not already running\n timer = setTimeout(() => {\n timer = null\n void flush()\n }, maxWaitMs)\n }\n },\n\n flush,\n\n get pending() {\n return batch.length\n },\n }\n}\n","/**\n * Offline queue for mutation persistence during disconnection\n *\n * Queues mutations when offline and persists them to localStorage\n * for replay when connection is restored.\n *\n * @module\n */\n\n/**\n * Options for offline queue\n */\nexport interface OfflineQueueOptions {\n /** Maximum number of items to queue (default: 1000) */\n maxQueueSize?: number\n /** LocalStorage key for persistence (optional) */\n persistKey?: string\n}\n\n/**\n * Offline queue controller interface\n */\nexport interface OfflineQueue<T> {\n /** Add an item to the queue. Returns false if queue is full. */\n enqueue: (item: T) => boolean\n /** Remove and return all queued items */\n dequeueAll: () => T[]\n /** Peek at all items without removing */\n peek: () => readonly T[]\n /** Clear all items from the queue */\n clear: () => void\n /** Current number of items in queue */\n readonly length: number\n /** Whether queue is at capacity */\n readonly isFull: boolean\n}\n\n/**\n * Create an offline queue for mutation persistence\n *\n * Queues items during offline periods and can persist to localStorage\n * for durability across page refreshes.\n *\n * @param options - Queue configuration options\n * @returns Offline queue controller\n *\n * @example\n * ```typescript\n * const queue = createOfflineQueue<Mutation>({\n * maxQueueSize: 500,\n * persistKey: 'my-app-offline-mutations'\n * })\n *\n * // Queue mutations when offline\n * if (!navigator.onLine) {\n * queue.enqueue({ type: 'create', data: { name: 'Test' } })\n * }\n *\n * // Replay when back online\n * window.addEventListener('online', async () => {\n * const mutations = queue.dequeueAll()\n * await syncMutations(mutations)\n * })\n * ```\n */\nexport function createOfflineQueue<T>(\n options: OfflineQueueOptions = {}\n): OfflineQueue<T> {\n const { maxQueueSize = 1000, persistKey } = options\n let queue: T[] = []\n\n // Load from localStorage if persistKey provided\n if (persistKey && typeof localStorage !== 'undefined') {\n try {\n const stored = localStorage.getItem(persistKey)\n if (stored) {\n const parsed = JSON.parse(stored)\n if (Array.isArray(parsed)) {\n queue = parsed\n }\n }\n } catch {\n // Ignore parse errors, start with empty queue\n }\n }\n\n const persist = (): void => {\n if (persistKey && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(persistKey, JSON.stringify(queue))\n } catch {\n // Ignore storage errors (quota exceeded, etc.)\n }\n }\n }\n\n return {\n enqueue: (item: T): boolean => {\n if (queue.length >= maxQueueSize) {\n return false\n }\n queue.push(item)\n persist()\n return true\n },\n\n dequeueAll: (): T[] => {\n const items = queue\n queue = []\n persist()\n return items\n },\n\n peek: (): readonly T[] => {\n return queue\n },\n\n clear: (): void => {\n queue = []\n persist()\n },\n\n get length(): number {\n return queue.length\n },\n\n get isFull(): boolean {\n return queue.length >= maxQueueSize\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export { A as APIError, D as DEFAULT_REQUEST_TIMEOUT, F as FetchWithTimeoutOptions, N as NetworkError, R as RetryConfig, S as SyncError, V as ValidationError, j as camelToTitle, i as capitalize, c as cn, v as createFetchWithTimeout, l as debounce, n as fetchWithTimeout, g as formatBytes, a as formatDate, b as formatDateTime, h as formatDuration, e as formatNumber, d as formatRelativeTime, f as formatSemanticId, k as generateId, m as groupBy, o as isAPIError, q as isNetworkError, s as isSyncError, r as isValidationError, p as parseSemanticId, u as retryWithBackoff, t as truncate } from '../errors-B4Oyyj4Z.js';
|
|
2
|
+
export { P as Pagination, Q as QueryKeys, a as agentsKeys, c as createQueryKeys, r as relationshipsKeys, t as thingsKeys, w as workflowsKeys } from '../query-keys-BC901wog.js';
|
|
3
|
+
import 'clsx';
|
|
4
|
+
import 'zod';
|
|
5
|
+
import '../schemas/index.js';
|
|
6
|
+
import '../thing-BVhCTzOi.js';
|
|
7
|
+
import '../agents-2_r9e9i7.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* URL utilities for @mdxui/do
|
|
11
|
+
*
|
|
12
|
+
* Provides functions to normalize and derive URLs from the configuration.
|
|
13
|
+
* These utilities ensure consistent URL formatting across the package.
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Normalize a URL to an RPC endpoint
|
|
19
|
+
*
|
|
20
|
+
* Transforms various URL formats into a consistent RPC endpoint URL:
|
|
21
|
+
* - Converts wss:// to https:// and ws:// to http://
|
|
22
|
+
* - Strips trailing /sync or /rpc if present
|
|
23
|
+
* - Appends /rpc
|
|
24
|
+
*
|
|
25
|
+
* @param url - The base URL (e.g., 'https://api.do/admin' or 'wss://api.do/do/workspace')
|
|
26
|
+
* @returns The normalized RPC URL (e.g., 'https://api.do/admin/rpc')
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* deriveRpcUrl('https://api.do/admin')
|
|
31
|
+
* // => 'https://api.do/admin/rpc'
|
|
32
|
+
*
|
|
33
|
+
* deriveRpcUrl('wss://api.do/do/workspace/sync')
|
|
34
|
+
* // => 'https://api.do/do/workspace/rpc'
|
|
35
|
+
*
|
|
36
|
+
* deriveRpcUrl('https://api.do/admin/rpc')
|
|
37
|
+
* // => 'https://api.do/admin/rpc' (unchanged)
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
declare function deriveRpcUrl(url: string): string;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Configuration for health check behavior
|
|
44
|
+
*/
|
|
45
|
+
interface HealthCheckConfig {
|
|
46
|
+
/** API endpoint base URL (e.g., 'https://api.do/admin') */
|
|
47
|
+
apiEndpoint: string;
|
|
48
|
+
/** Optional auth token for Bearer authentication */
|
|
49
|
+
authToken?: string;
|
|
50
|
+
/** Request timeout in milliseconds (defaults to DEFAULT_REQUEST_TIMEOUT) */
|
|
51
|
+
requestTimeout?: number;
|
|
52
|
+
/** Number of retry attempts (defaults to 3) */
|
|
53
|
+
healthCheckRetries?: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Result of the health check hook
|
|
57
|
+
*/
|
|
58
|
+
interface HealthCheckResult {
|
|
59
|
+
/** Whether the API is reachable */
|
|
60
|
+
isConnected: boolean;
|
|
61
|
+
/** Error from the last failed attempt, if any */
|
|
62
|
+
connectionError?: Error;
|
|
63
|
+
/** Manually trigger a health check */
|
|
64
|
+
checkConnection: () => Promise<void>;
|
|
65
|
+
/** Whether a check is currently in progress */
|
|
66
|
+
isChecking: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Hook to perform health checks against an API endpoint
|
|
70
|
+
*
|
|
71
|
+
* Automatically checks connection on mount with retry and exponential backoff.
|
|
72
|
+
* Can also be manually triggered via the returned `checkConnection` function.
|
|
73
|
+
*
|
|
74
|
+
* @param config - Health check configuration
|
|
75
|
+
* @returns Health check state and manual trigger function
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```tsx
|
|
79
|
+
* function MyComponent() {
|
|
80
|
+
* const { isConnected, connectionError, checkConnection } = useHealthCheck({
|
|
81
|
+
* apiEndpoint: 'https://api.do/admin',
|
|
82
|
+
* authToken: 'my-token',
|
|
83
|
+
* healthCheckRetries: 3,
|
|
84
|
+
* })
|
|
85
|
+
*
|
|
86
|
+
* if (connectionError) {
|
|
87
|
+
* return <div>Connection failed: {connectionError.message}</div>
|
|
88
|
+
* }
|
|
89
|
+
*
|
|
90
|
+
* if (!isConnected) {
|
|
91
|
+
* return <div>Connecting...</div>
|
|
92
|
+
* }
|
|
93
|
+
*
|
|
94
|
+
* return <div>Connected!</div>
|
|
95
|
+
* }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
declare function useHealthCheck(config: HealthCheckConfig): HealthCheckResult;
|
|
99
|
+
|
|
100
|
+
export { type HealthCheckConfig, type HealthCheckResult, deriveRpcUrl, useHealthCheck };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { APIError, NetworkError, SyncError, ValidationError, isAPIError, isNetworkError, isSyncError, isValidationError } from '../chunk-5AWTQDRF.js';
|
|
2
|
+
export { agentsKeys, createQueryKeys, relationshipsKeys, thingsKeys, workflowsKeys } from '../chunk-4KXVN3EQ.js';
|
|
3
|
+
export { DEFAULT_REQUEST_TIMEOUT, createFetchWithTimeout, deriveRpcUrl, fetchWithTimeout, useHealthCheck } from '../chunk-OWEAW4U6.js';
|
|
4
|
+
export { camelToTitle, capitalize, cn, debounce, formatBytes, formatDate, formatDateTime, formatDuration, formatNumber, formatRelativeTime, formatSemanticId, generateId, groupBy, parseSemanticId, retryWithBackoff, truncate } from '../chunk-Y52IEYVM.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -1,13 +1,146 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { QueryClient } from '@tanstack/react-query';
|
|
4
|
-
|
|
4
|
+
export { useQueryClient } from '@tanstack/react-query';
|
|
5
5
|
import { DataProvider } from '@mdxui/app';
|
|
6
|
-
import {
|
|
6
|
+
import { i as DOAdminConfig } from '../do-C-t9UgjT.js';
|
|
7
7
|
import 'zod';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Cap'n Web Client Wrapper for DO Admin API
|
|
11
|
+
*
|
|
12
|
+
* This wraps the raw capnweb HTTP batch client to provide a structured interface
|
|
13
|
+
* matching the DOClient interface (client.Thing.list, client.Schema.discover, etc.)
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
/** SQL execution result */
|
|
18
|
+
interface SQLResult {
|
|
19
|
+
rows: Record<string, unknown>[];
|
|
20
|
+
columns: {
|
|
21
|
+
name: string;
|
|
22
|
+
type: string;
|
|
23
|
+
}[];
|
|
24
|
+
rowsAffected?: number;
|
|
25
|
+
executionTimeMs?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a capnweb client context - factory function matching DOClient interface
|
|
29
|
+
*/
|
|
30
|
+
declare function $CapnwebContext(url: string): {
|
|
31
|
+
/**
|
|
32
|
+
* Namespace operations
|
|
33
|
+
*/
|
|
34
|
+
Namespace: {
|
|
35
|
+
list(_params?: {
|
|
36
|
+
includeSystem?: boolean;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
}[]>;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Schema operations
|
|
44
|
+
*/
|
|
45
|
+
Schema: {
|
|
46
|
+
discover(_params?: {
|
|
47
|
+
ns?: string;
|
|
48
|
+
}): Promise<{
|
|
49
|
+
namespaces: string[];
|
|
50
|
+
types: string[];
|
|
51
|
+
schemas: string[];
|
|
52
|
+
}>;
|
|
53
|
+
get(params: {
|
|
54
|
+
ns?: string;
|
|
55
|
+
type: string;
|
|
56
|
+
}): Promise<unknown>;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Thing operations
|
|
60
|
+
*/
|
|
61
|
+
Thing: {
|
|
62
|
+
types(params: {
|
|
63
|
+
ns?: string;
|
|
64
|
+
includeSystem?: boolean;
|
|
65
|
+
}): Promise<{
|
|
66
|
+
name: string;
|
|
67
|
+
ns: string;
|
|
68
|
+
}[]>;
|
|
69
|
+
list(params: {
|
|
70
|
+
ns?: string;
|
|
71
|
+
type?: string;
|
|
72
|
+
limit?: number;
|
|
73
|
+
offset?: number;
|
|
74
|
+
}): Promise<{
|
|
75
|
+
data: unknown[];
|
|
76
|
+
total: number;
|
|
77
|
+
}>;
|
|
78
|
+
get(params: {
|
|
79
|
+
ns?: string;
|
|
80
|
+
type: string;
|
|
81
|
+
id: string;
|
|
82
|
+
}): Promise<unknown>;
|
|
83
|
+
create(params: {
|
|
84
|
+
ns?: string;
|
|
85
|
+
type: string;
|
|
86
|
+
data: unknown;
|
|
87
|
+
}): Promise<unknown>;
|
|
88
|
+
update(params: {
|
|
89
|
+
ns?: string;
|
|
90
|
+
type: string;
|
|
91
|
+
id: string;
|
|
92
|
+
data: unknown;
|
|
93
|
+
}): Promise<unknown>;
|
|
94
|
+
delete(params: {
|
|
95
|
+
ns?: string;
|
|
96
|
+
type: string;
|
|
97
|
+
id: string;
|
|
98
|
+
hard?: boolean;
|
|
99
|
+
}): Promise<{
|
|
100
|
+
success: boolean;
|
|
101
|
+
}>;
|
|
102
|
+
versions(_params: {
|
|
103
|
+
ns?: string;
|
|
104
|
+
type: string;
|
|
105
|
+
id: string;
|
|
106
|
+
}): Promise<never[]>;
|
|
107
|
+
stats(_params: {
|
|
108
|
+
ns?: string;
|
|
109
|
+
type?: string;
|
|
110
|
+
}): Promise<{
|
|
111
|
+
total: number;
|
|
112
|
+
byType: Record<string, number>;
|
|
113
|
+
}>;
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* SQL operations (not supported by capnweb servers)
|
|
117
|
+
*/
|
|
118
|
+
SQL: {
|
|
119
|
+
execute(_params: {
|
|
120
|
+
query: string;
|
|
121
|
+
params?: unknown[];
|
|
122
|
+
}): Promise<SQLResult>;
|
|
123
|
+
};
|
|
124
|
+
dup: () => /*elided*/ any;
|
|
125
|
+
onRpcBroken: (callback: (error: unknown) => void) => void;
|
|
126
|
+
[Symbol.dispose]: () => void;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Type for the DO client instance
|
|
131
|
+
*
|
|
132
|
+
* The client provides a structured interface for RPC operations.
|
|
133
|
+
* Common patterns:
|
|
134
|
+
* - client.Thing.list({ type: 'User' })
|
|
135
|
+
* - client.Thing.get({ id: 'xxx' })
|
|
136
|
+
* - client.Thing.create({ type: 'User', name: 'Alice', data: {} })
|
|
137
|
+
* - client.Schema.discover()
|
|
138
|
+
*/
|
|
139
|
+
type DOClient = ReturnType<typeof $CapnwebContext>;
|
|
9
140
|
/**
|
|
10
141
|
* DO Context value
|
|
142
|
+
*
|
|
143
|
+
* Provides access to config, connection state, RPC URL, and the @dotdo/client instance.
|
|
11
144
|
*/
|
|
12
145
|
interface DOContextValue {
|
|
13
146
|
/** Admin configuration */
|
|
@@ -22,36 +155,85 @@ interface DOContextValue {
|
|
|
22
155
|
isConnected: boolean;
|
|
23
156
|
/** Connection error */
|
|
24
157
|
connectionError?: Error;
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
/** Sync URL derived from doUrl */
|
|
30
|
-
syncUrl: string | null;
|
|
31
|
-
/** Whether using TanStack DB mode */
|
|
32
|
-
isTanStackDBMode: boolean;
|
|
33
|
-
/** TanStack DB context from @dotdo/react (null in REST mode) */
|
|
34
|
-
db: DotdoContextValue | null;
|
|
35
|
-
/** Collections being synced */
|
|
36
|
-
collections: readonly string[];
|
|
158
|
+
/** RPC URL for capnweb session */
|
|
159
|
+
rpcUrl: string;
|
|
160
|
+
/** @dotdo/client instance for direct RPC calls */
|
|
161
|
+
client: DOClient;
|
|
37
162
|
}
|
|
38
163
|
/**
|
|
39
|
-
*
|
|
164
|
+
* Primary hook for accessing the DO provider context.
|
|
165
|
+
*
|
|
166
|
+
* This is the **main hook for application development** with @mdxui/do.
|
|
167
|
+
* It provides access to configuration, connection state, RPC URL, and the client.
|
|
168
|
+
*
|
|
169
|
+
* @returns The DO context value containing config, state, rpcUrl, and client
|
|
170
|
+
* @throws Error if called outside of a `DOProvider`
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```tsx
|
|
174
|
+
* import { useDO } from '@mdxui/do'
|
|
175
|
+
*
|
|
176
|
+
* function ConnectionStatus() {
|
|
177
|
+
* const { isConnected, namespace, rpcUrl, client } = useDO()
|
|
178
|
+
*
|
|
179
|
+
* const handleFetch = async () => {
|
|
180
|
+
* const users = await client.Thing.list({ type: 'User' })
|
|
181
|
+
* console.log(users)
|
|
182
|
+
* }
|
|
183
|
+
*
|
|
184
|
+
* return (
|
|
185
|
+
* <div>
|
|
186
|
+
* <span>Namespace: {namespace}</span>
|
|
187
|
+
* <span>Connected: {isConnected ? 'Yes' : 'No'}</span>
|
|
188
|
+
* <button onClick={handleFetch}>Fetch Users</button>
|
|
189
|
+
* </div>
|
|
190
|
+
* )
|
|
191
|
+
* }
|
|
192
|
+
* ```
|
|
40
193
|
*/
|
|
41
194
|
declare function useDO(): DOContextValue;
|
|
42
195
|
/**
|
|
43
|
-
* Hook to access
|
|
196
|
+
* Hook to access the @dotdo/client instance directly.
|
|
197
|
+
*
|
|
198
|
+
* Convenience hook for components that only need the RPC client.
|
|
199
|
+
*
|
|
200
|
+
* @returns The @dotdo/client instance
|
|
201
|
+
* @throws Error if called outside of a `DOProvider`
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```tsx
|
|
205
|
+
* import { useDOClient } from '@mdxui/do'
|
|
206
|
+
*
|
|
207
|
+
* function UserList() {
|
|
208
|
+
* const client = useDOClient()
|
|
209
|
+
* const [users, setUsers] = useState([])
|
|
210
|
+
*
|
|
211
|
+
* useEffect(() => {
|
|
212
|
+
* client.Thing.list({ type: 'User' }).then(setUsers)
|
|
213
|
+
* }, [client])
|
|
214
|
+
*
|
|
215
|
+
* return <ul>{users.map(u => <li key={u.id}>{u.name}</li>)}</ul>
|
|
216
|
+
* }
|
|
217
|
+
* ```
|
|
218
|
+
*/
|
|
219
|
+
declare function useDOClient(): DOClient;
|
|
220
|
+
/**
|
|
221
|
+
* Convenience hook to access derived URLs for API operations.
|
|
222
|
+
*
|
|
223
|
+
* Returns URL endpoints from the DOProvider configuration,
|
|
224
|
+
* useful for making direct API calls or debugging connection issues.
|
|
225
|
+
*
|
|
226
|
+
* @returns Object containing rpcUrl and apiEndpoint
|
|
44
227
|
*/
|
|
45
228
|
declare function useDOUrls(): {
|
|
46
|
-
rpcUrl: string
|
|
47
|
-
syncUrl: string | null;
|
|
229
|
+
rpcUrl: string;
|
|
48
230
|
apiEndpoint: string;
|
|
49
|
-
doUrl: string | null;
|
|
50
231
|
};
|
|
51
232
|
/**
|
|
52
|
-
*
|
|
233
|
+
* @deprecated Sync status is no longer available in the simplified RPC-only architecture.
|
|
234
|
+
* This function is kept for backward compatibility but always returns 'disconnected'.
|
|
53
235
|
*/
|
|
54
|
-
declare function useSyncStatus():
|
|
236
|
+
declare function useSyncStatus(): 'disconnected';
|
|
55
237
|
/**
|
|
56
238
|
* Props for DOProvider
|
|
57
239
|
*/
|
|
@@ -67,24 +249,54 @@ interface DOProviderProps {
|
|
|
67
249
|
/** Custom QueryClient (for testing) */
|
|
68
250
|
queryClient?: QueryClient;
|
|
69
251
|
}
|
|
70
|
-
declare function DOProvider({ config, initialNamespace, userId, children, queryClient: providedQueryClient, }: DOProviderProps): react_jsx_runtime.JSX.Element;
|
|
71
|
-
|
|
72
252
|
/**
|
|
73
|
-
*
|
|
253
|
+
* DOProvider - Main provider for @mdxui/do
|
|
74
254
|
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
255
|
+
* Provides a single-mode RPC-first architecture using @dotdo/client for typed RPC calls.
|
|
256
|
+
* All data operations go through the RPC endpoint using promise pipelining.
|
|
77
257
|
*
|
|
78
258
|
* @example
|
|
79
259
|
* ```tsx
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
260
|
+
* <DOProvider
|
|
261
|
+
* config={{
|
|
262
|
+
* apiEndpoint: 'https://admin.do.ai',
|
|
263
|
+
* authMethod: 'jwt',
|
|
264
|
+
* authToken: 'xxx',
|
|
265
|
+
* bindings: [...],
|
|
266
|
+
* realTimeUpdates: false,
|
|
267
|
+
* }}
|
|
268
|
+
* initialNamespace="my-app"
|
|
269
|
+
* userId="user_123"
|
|
270
|
+
* >
|
|
271
|
+
* <App />
|
|
272
|
+
* </DOProvider>
|
|
273
|
+
* ```
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* ```tsx
|
|
277
|
+
* // Accessing the client in a child component
|
|
278
|
+
* function MyComponent() {
|
|
279
|
+
* const { client } = useDO()
|
|
280
|
+
*
|
|
281
|
+
* const fetchData = async () => {
|
|
282
|
+
* // Promise pipelining - efficient batched RPC calls
|
|
283
|
+
* const [users, projects] = await Promise.all([
|
|
284
|
+
* client.Thing.list({ type: 'User' }),
|
|
285
|
+
* client.Thing.list({ type: 'Project' }),
|
|
286
|
+
* ])
|
|
287
|
+
* return { users, projects }
|
|
288
|
+
* }
|
|
85
289
|
* }
|
|
86
290
|
* ```
|
|
87
291
|
*/
|
|
292
|
+
declare function DOProvider({ config, initialNamespace, userId, children, queryClient: providedQueryClient, }: DOProviderProps): react_jsx_runtime.JSX.Element;
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Hook to safely access the DataProvider, returning null if not available.
|
|
296
|
+
*
|
|
297
|
+
* This is useful for hooks that can optionally use a DataProvider when one
|
|
298
|
+
* is configured, but should fall back to RPC when no DataProvider is present.
|
|
299
|
+
*/
|
|
88
300
|
declare function useDataProviderSafe(): DataProvider | null;
|
|
89
301
|
|
|
90
|
-
export { type DOContextValue, DOProvider, type DOProviderProps, useDO, useDOUrls, useDataProviderSafe, useSyncStatus };
|
|
302
|
+
export { type DOClient, type DOContextValue, DOProvider, type DOProviderProps, useDO, useDOClient, useDOUrls, useDataProviderSafe, useSyncStatus };
|
package/dist/providers/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import '../chunk-GKSP5RIA.js';
|
|
2
|
-
export { DOProvider, useDO, useDOUrls, useDataProviderSafe, useSyncStatus } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
2
|
+
export { DOProvider, useDO, useDOClient, useDOUrls, useDataProviderSafe, useQueryClient, useSyncStatus } from '../chunk-FO3N7SXV.js';
|
|
3
|
+
import '../chunk-OWEAW4U6.js';
|
|
4
|
+
import '../chunk-Y52IEYVM.js';
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
5
6
|
//# sourceMappingURL=index.js.map
|