@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/hooks/use-schema.ts","../src/hooks/use-namespaces.ts","../src/hooks/use-types.ts","../src/hooks/use-subscription.ts","../src/hooks/use-edit-history.ts","../src/hooks/use-keyboard-shortcuts.ts"],"names":["useQuery","error","useState","useRef","useCallback","useEffect"],"mappings":"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","file":"chunk-IESVTECE.js","sourcesContent":["'use client'\n\n/**\n * Schema discovery hook\n *\n * Discovers available schemas/resources from the DO backend.\n * Uses @dotdo/client for RPC calls.\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useDO } from '../providers/do-provider'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Property definition in a schema\n */\nexport interface SchemaProperty {\n /** Property name */\n name: string\n /** Property type (string, number, boolean, object, array, etc.) */\n type: string\n /** Whether the property is required */\n required?: boolean\n /** Property description */\n description?: string\n /** Default value */\n default?: unknown\n /** For array types, the item type */\n items?: SchemaProperty\n /** For object types, nested properties */\n properties?: SchemaProperty[]\n}\n\n/**\n * Schema definition for a resource type\n */\nexport interface SchemaDefinition {\n /** Schema name (usually the type name) */\n name: string\n /** Namespace this schema belongs to */\n ns?: string\n /** Human-readable description */\n description?: string\n /** Properties defined in this schema */\n properties: SchemaProperty[]\n /** Primary key field(s) */\n primaryKey?: string | string[]\n /** Indexes defined on this schema */\n indexes?: Array<{\n name: string\n fields: string[]\n unique?: boolean\n }>\n /** Timestamps */\n createdAt?: Date\n updatedAt?: Date\n}\n\n/**\n * Result from schema discovery\n */\nexport interface SchemaDiscoveryResult {\n /** Available schemas */\n schemas: SchemaDefinition[]\n /** Available namespaces */\n namespaces: string[]\n /** Types by namespace */\n typesByNamespace: Record<string, string[]>\n /** Server version/info */\n serverInfo?: {\n version?: string\n capabilities?: string[]\n }\n}\n\n/**\n * Options for useSchema hook\n */\nexport interface UseSchemaOptions {\n /** Filter by namespace */\n ns?: string\n /** Filter by type name */\n type?: string\n /** Whether to include system schemas */\n includeSystem?: boolean\n /** Enable/disable the query */\n enabled?: boolean\n}\n\n/**\n * Result from useSchema hook\n */\nexport interface UseSchemaResult {\n /** Schema discovery result */\n data: SchemaDiscoveryResult | null\n /** Loading state */\n isLoading: boolean\n /** Error if any */\n error: Error | null\n /** Refetch function */\n refetch: () => Promise<unknown>\n /** Whether data is being refetched */\n isRefetching: boolean\n}\n\n// ============================================================================\n// Query Keys\n// ============================================================================\n\nexport const schemaKeys = {\n all: ['schema'] as const,\n discovery: (ns?: string) => [...schemaKeys.all, 'discovery', ns ?? 'all'] as const,\n definition: (ns: string, type: string) => [...schemaKeys.all, 'definition', ns, type] as const,\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to discover schemas from the DO backend\n *\n * @example\n * ```tsx\n * function SchemaExplorer() {\n * const { data, isLoading } = useSchema()\n *\n * if (isLoading) return <div>Loading schemas...</div>\n *\n * return (\n * <ul>\n * {data?.schemas.map(schema => (\n * <li key={schema.name}>{schema.name}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n */\nexport function useSchema(options: UseSchemaOptions = {}): UseSchemaResult {\n const { ns, type, includeSystem = false, enabled = true } = options\n const { client } = useDO()\n\n const query = useQuery({\n queryKey: schemaKeys.discovery(ns),\n queryFn: async (): Promise<SchemaDiscoveryResult> => {\n // Try to discover schemas via RPC\n // The actual API shape depends on the backend\n try {\n const result = await (client as any).Schema.discover({\n ns,\n type,\n includeSystem,\n })\n\n // Normalize the response\n return {\n schemas: result.schemas ?? [],\n namespaces: result.namespaces ?? [],\n typesByNamespace: result.typesByNamespace ?? {},\n serverInfo: result.serverInfo,\n }\n } catch (error) {\n // Fallback: try to get types from Thing.types() if Schema.discover fails\n try {\n const typesResult = await (client as any).Thing.types({ ns })\n const namespaces = typesResult.namespaces ?? [ns ?? 'default']\n const types = typesResult.types ?? []\n\n return {\n schemas: types.map((t: string) => ({\n name: t,\n ns: ns ?? 'default',\n properties: [],\n })),\n namespaces,\n typesByNamespace: {\n [ns ?? 'default']: types,\n },\n }\n } catch {\n // If both fail, return empty result\n return {\n schemas: [],\n namespaces: [],\n typesByNamespace: {},\n }\n }\n }\n },\n enabled,\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n isRefetching: query.isRefetching,\n }\n}\n\n/**\n * Hook to get a specific schema definition\n *\n * @example\n * ```tsx\n * function SchemaViewer({ ns, type }: { ns: string; type: string }) {\n * const { data, isLoading } = useSchemaDefinition(ns, type)\n *\n * if (isLoading) return <div>Loading...</div>\n *\n * return (\n * <pre>{JSON.stringify(data, null, 2)}</pre>\n * )\n * }\n * ```\n */\nexport function useSchemaDefinition(\n ns: string,\n type: string,\n options: { enabled?: boolean } = {}\n): {\n data: SchemaDefinition | null\n isLoading: boolean\n error: Error | null\n refetch: () => Promise<unknown>\n} {\n const { enabled = true } = options\n const { client } = useDO()\n\n const query = useQuery({\n queryKey: schemaKeys.definition(ns, type),\n queryFn: async (): Promise<SchemaDefinition> => {\n try {\n const result = await (client as any).Schema.get({ ns, type })\n return result as SchemaDefinition\n } catch {\n // Return minimal schema if not available\n return {\n name: type,\n ns,\n properties: [],\n }\n }\n },\n enabled: enabled && Boolean(ns && type),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\n/**\n * Namespaces hook\n *\n * Fetches available namespaces from the DO backend.\n * Namespaces are the top-level organizational unit for Things.\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useDO } from '../providers/do-provider'\nimport type { Namespace } from '../types'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for useNamespaces hook\n */\nexport interface UseNamespacesOptions {\n /** Include hidden/system namespaces */\n includeSystem?: boolean\n /** Enable/disable the query */\n enabled?: boolean\n}\n\n/**\n * Result from useNamespaces hook\n */\nexport interface UseNamespacesResult {\n /** List of namespaces */\n data: Namespace[] | null\n /** Loading state */\n isLoading: boolean\n /** Error if any */\n error: Error | null\n /** Refetch function */\n refetch: () => Promise<unknown>\n /** Whether data is being refetched */\n isRefetching: boolean\n /** Query status */\n status: 'pending' | 'error' | 'success'\n}\n\n// ============================================================================\n// Query Keys\n// ============================================================================\n\nexport const namespacesKeys = {\n all: ['namespaces'] as const,\n list: (includeSystem?: boolean) =>\n [...namespacesKeys.all, 'list', includeSystem ?? false] as const,\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to fetch available namespaces\n *\n * @example\n * ```tsx\n * function NamespaceSelector() {\n * const { data: namespaces, isLoading } = useNamespaces()\n *\n * if (isLoading) return <div>Loading namespaces...</div>\n *\n * return (\n * <select>\n * {namespaces?.map(ns => (\n * <option key={ns.id} value={ns.name}>\n * {ns.name}\n * </option>\n * ))}\n * </select>\n * )\n * }\n * ```\n */\nexport function useNamespaces(options: UseNamespacesOptions = {}): UseNamespacesResult {\n const { includeSystem = false, enabled = true } = options\n const { client } = useDO()\n\n const query = useQuery({\n queryKey: namespacesKeys.list(includeSystem),\n queryFn: async (): Promise<Namespace[]> => {\n let primaryError: Error | null = null\n\n try {\n // Try to get namespaces via RPC\n const result = await (client as any).Namespace.list({ includeSystem })\n\n // Handle different response shapes\n if (Array.isArray(result)) {\n return result.map(normalizeNamespace)\n }\n\n if (result.namespaces && Array.isArray(result.namespaces)) {\n return result.namespaces.map(normalizeNamespace)\n }\n\n if (result.data && Array.isArray(result.data)) {\n return result.data.map(normalizeNamespace)\n }\n\n return []\n } catch (err) {\n primaryError = err instanceof Error ? err : new Error(String(err))\n // Fallback: try Schema.discover\n try {\n const schemaResult = await (client as any).Schema.discover({})\n const namespaceNames = schemaResult.namespaces ?? ['default']\n return namespaceNames.map((name: string) => ({\n id: name,\n name,\n types: [],\n thingCount: 0,\n createdAt: new Date(),\n }))\n } catch (fallbackErr) {\n // Both methods failed - throw the primary error for visibility\n throw new Error(\n `Failed to fetch namespaces: ${primaryError.message}. ` +\n `Fallback also failed: ${fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)}`\n )\n }\n }\n },\n enabled,\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n isRefetching: query.isRefetching,\n status: query.status,\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Normalize namespace response to standard shape\n */\nfunction normalizeNamespace(ns: unknown): Namespace {\n if (typeof ns === 'string') {\n return {\n id: ns,\n name: ns,\n types: [],\n thingCount: 0,\n createdAt: new Date(),\n }\n }\n\n const nsObj = ns as Record<string, unknown>\n return {\n id: (nsObj.id as string) ?? (nsObj.name as string) ?? 'unknown',\n name: (nsObj.name as string) ?? (nsObj.id as string) ?? 'unknown',\n description: nsObj.description as string | undefined,\n baseUrl: nsObj.baseUrl as string | undefined,\n types: (nsObj.types as string[]) ?? [],\n thingCount: (nsObj.thingCount as number) ?? 0,\n createdAt: nsObj.createdAt ? new Date(nsObj.createdAt as string) : new Date(),\n }\n}\n","'use client'\n\n/**\n * Types hook\n *\n * Fetches available Thing types within a namespace.\n * Types are the categories of Things (e.g., User, Task, Project).\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useDO } from '../providers/do-provider'\nimport type { SemanticType } from '../types'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for useTypes hook\n */\nexport interface UseTypesOptions {\n /** Namespace to fetch types from (defaults to current namespace) */\n ns?: string\n /** Include hidden/system types */\n includeSystem?: boolean\n /** Enable/disable the query */\n enabled?: boolean\n}\n\n/**\n * Result from useTypes hook\n */\nexport interface UseTypesResult {\n /** List of types */\n data: SemanticType[] | null\n /** Loading state */\n isLoading: boolean\n /** Error if any */\n error: Error | null\n /** Refetch function */\n refetch: () => Promise<unknown>\n /** Whether data is being refetched */\n isRefetching: boolean\n /** Query status */\n status: 'pending' | 'error' | 'success'\n}\n\n// ============================================================================\n// Query Keys\n// ============================================================================\n\nexport const typesKeys = {\n all: ['types'] as const,\n list: (ns: string, includeSystem?: boolean) =>\n [...typesKeys.all, 'list', ns, includeSystem ?? false] as const,\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to fetch available types within a namespace\n *\n * @example\n * ```tsx\n * function TypeSelector({ ns }: { ns: string }) {\n * const { data: types, isLoading } = useTypes({ ns })\n *\n * if (isLoading) return <div>Loading types...</div>\n *\n * return (\n * <select>\n * {types?.map(type => (\n * <option key={type.id} value={type.name}>\n * {type.label}\n * </option>\n * ))}\n * </select>\n * )\n * }\n * ```\n */\nexport function useTypes(options: UseTypesOptions = {}): UseTypesResult {\n const { includeSystem = false, enabled = true } = options\n const { namespace, client } = useDO()\n\n // Use provided ns or fall back to current namespace\n const ns = options.ns ?? namespace\n\n const query = useQuery({\n queryKey: typesKeys.list(ns, includeSystem),\n queryFn: async (): Promise<SemanticType[]> => {\n let primaryError: Error | null = null\n\n try {\n // Try to get types via RPC\n const result = await (client as any).Thing.types({ ns, includeSystem })\n\n // Handle different response shapes\n if (Array.isArray(result)) {\n return result.map((t) => normalizeType(t, ns))\n }\n\n if (result.types && Array.isArray(result.types)) {\n return result.types.map((t: unknown) => normalizeType(t, ns))\n }\n\n if (result.data && Array.isArray(result.data)) {\n return result.data.map((t: unknown) => normalizeType(t, ns))\n }\n\n return []\n } catch (err) {\n primaryError = err instanceof Error ? err : new Error(String(err))\n // Fallback: try Schema.discover\n try {\n const schemaResult = await (client as any).Schema.discover({ ns })\n const typeNames = schemaResult.typesByNamespace?.[ns] ?? []\n return typeNames.map((name: string) => normalizeType(name, ns))\n } catch (fallbackErr) {\n // Both methods failed - throw the primary error for visibility\n throw new Error(\n `Failed to fetch types: ${primaryError.message}. ` +\n `Fallback also failed: ${fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)}`\n )\n }\n }\n },\n enabled: enabled && Boolean(ns),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n isRefetching: query.isRefetching,\n status: query.status,\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Normalize type response to standard SemanticType shape\n */\nfunction normalizeType(type: unknown, defaultNs: string): SemanticType {\n if (typeof type === 'string') {\n return {\n namespace: defaultNs,\n name: type,\n id: `${defaultNs}/${type}`,\n label: type,\n parentTypes: [],\n properties: [],\n subtypes: [],\n }\n }\n\n const typeObj = type as Record<string, unknown>\n const name = (typeObj.name as string) ?? (typeObj.type as string) ?? 'unknown'\n const namespace = (typeObj.namespace as string) ?? (typeObj.ns as string) ?? defaultNs\n\n return {\n namespace,\n name,\n id: (typeObj.id as string) ?? `${namespace}/${name}`,\n label: (typeObj.label as string) ?? (typeObj.displayName as string) ?? name,\n description: typeObj.description as string | undefined,\n parentTypes: (typeObj.parentTypes as string[]) ?? [],\n properties: (typeObj.properties as SemanticType['properties']) ?? [],\n subtypes: (typeObj.subtypes as string[]) ?? [],\n examples: typeObj.examples as SemanticType['examples'],\n }\n}\n","'use client'\n\n/**\n * Real-time subscription hooks\n *\n * Provides real-time updates for Things via WebSocket subscriptions.\n * Integrates with @dotdo/react for sync capabilities when available.\n */\n\nimport { useEffect, useCallback, useState, useRef } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useDO } from '../providers/do-provider'\nimport { thingsKeys } from './things'\nimport type { Thing, ThingFilter } from '../types'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Subscription event types\n */\nexport type SubscriptionEventType = 'created' | 'updated' | 'deleted' | 'connected' | 'disconnected' | 'error'\n\n/**\n * Subscription event payload\n */\nexport interface SubscriptionEvent {\n /** Event type */\n type: SubscriptionEventType\n /** Affected Thing (for created/updated/deleted) */\n thing?: Thing\n /** Thing ID (for deleted events) */\n thingId?: string\n /** Error message (for error events) */\n error?: string\n /** Timestamp */\n timestamp: Date\n}\n\n/**\n * Subscription state\n */\nexport type SubscriptionState = 'connecting' | 'connected' | 'disconnected' | 'error'\n\n/**\n * Options for useThingSubscription hook\n */\nexport interface UseThingSubscriptionOptions {\n /** Namespace to subscribe to */\n ns?: string\n /** Type to subscribe to (optional, subscribes to all if not specified) */\n type?: string\n /** Specific Thing ID to subscribe to */\n id?: string\n /** Filter for subscription */\n filter?: ThingFilter\n /** Callback when a Thing is created */\n onCreated?: (thing: Thing) => void\n /** Callback when a Thing is updated */\n onUpdated?: (thing: Thing) => void\n /** Callback when a Thing is deleted */\n onDeleted?: (thingId: string) => void\n /** Callback for any event */\n onEvent?: (event: SubscriptionEvent) => void\n /** Callback for connection state changes */\n onStateChange?: (state: SubscriptionState) => void\n /** Enable/disable subscription */\n enabled?: boolean\n /** Auto-invalidate React Query cache on updates */\n invalidateOnUpdate?: boolean\n}\n\n/**\n * Result from useThingSubscription hook\n */\nexport interface UseThingSubscriptionResult {\n /** Current subscription state */\n state: SubscriptionState\n /** Recent events (limited buffer) */\n events: SubscriptionEvent[]\n /** Whether currently connected */\n isConnected: boolean\n /** Last error if any */\n error: Error | null\n /** Manually reconnect */\n reconnect: () => void\n /** Disconnect */\n disconnect: () => void\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for real-time Thing subscriptions\n *\n * Subscribes to changes on Things and provides real-time updates.\n * Automatically invalidates React Query cache when data changes.\n *\n * @example Subscribe to all Things of a type\n * ```tsx\n * function TaskList() {\n * const { state, events } = useThingSubscription({\n * type: 'Task',\n * onCreated: (task) => console.log('New task:', task),\n * onUpdated: (task) => console.log('Task updated:', task),\n * })\n *\n * return (\n * <div>\n * <div>Status: {state}</div>\n * <div>Recent events: {events.length}</div>\n * </div>\n * )\n * }\n * ```\n *\n * @example Subscribe to a specific Thing\n * ```tsx\n * function TaskDetail({ id }: { id: string }) {\n * useThingSubscription({\n * type: 'Task',\n * id,\n * onUpdated: (task) => console.log('Task updated:', task),\n * })\n *\n * // ...\n * }\n * ```\n */\nexport function useThingSubscription(\n options: UseThingSubscriptionOptions = {}\n): UseThingSubscriptionResult {\n const {\n type,\n id,\n filter,\n onCreated,\n onUpdated,\n onDeleted,\n onEvent,\n onStateChange,\n enabled = true,\n invalidateOnUpdate = true,\n } = options\n\n const { client, namespace } = useDO()\n const ns = options.ns ?? namespace\n const queryClient = useQueryClient()\n\n const [state, setState] = useState<SubscriptionState>('disconnected')\n const [events, setEvents] = useState<SubscriptionEvent[]>([])\n const [error, setError] = useState<Error | null>(null)\n\n // Keep track of WebSocket/subscription\n const subscriptionRef = useRef<{ unsubscribe?: () => void } | null>(null)\n const reconnectTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Event buffer limit\n const MAX_EVENTS = 100\n\n // Add event to buffer\n const addEvent = useCallback((event: SubscriptionEvent) => {\n setEvents((prev) => {\n const newEvents = [event, ...prev]\n return newEvents.slice(0, MAX_EVENTS)\n })\n onEvent?.(event)\n }, [onEvent])\n\n // Handle Thing created\n const handleCreated = useCallback((thing: Thing) => {\n addEvent({ type: 'created', thing, timestamp: new Date() })\n onCreated?.(thing)\n\n if (invalidateOnUpdate) {\n // Invalidate list queries\n queryClient.invalidateQueries({ queryKey: thingsKeys.lists() })\n }\n }, [addEvent, onCreated, invalidateOnUpdate, queryClient])\n\n // Handle Thing updated\n const handleUpdated = useCallback((thing: Thing) => {\n addEvent({ type: 'updated', thing, timestamp: new Date() })\n onUpdated?.(thing)\n\n if (invalidateOnUpdate) {\n // Update specific Thing in cache\n queryClient.setQueryData(\n thingsKeys.detail(thing.ns, thing.type, thing.id),\n thing\n )\n // Invalidate list queries\n queryClient.invalidateQueries({ queryKey: thingsKeys.lists() })\n }\n }, [addEvent, onUpdated, invalidateOnUpdate, queryClient])\n\n // Handle Thing deleted\n const handleDeleted = useCallback((thingId: string) => {\n addEvent({ type: 'deleted', thingId, timestamp: new Date() })\n onDeleted?.(thingId)\n\n if (invalidateOnUpdate) {\n // Invalidate list queries\n queryClient.invalidateQueries({ queryKey: thingsKeys.lists() })\n }\n }, [addEvent, onDeleted, invalidateOnUpdate, queryClient])\n\n // Update state and notify\n const updateState = useCallback((newState: SubscriptionState) => {\n setState(newState)\n onStateChange?.(newState)\n\n if (newState === 'connected') {\n addEvent({ type: 'connected', timestamp: new Date() })\n } else if (newState === 'disconnected') {\n addEvent({ type: 'disconnected', timestamp: new Date() })\n }\n }, [onStateChange, addEvent])\n\n // Connect to subscription\n const connect = useCallback(async () => {\n if (!enabled) return\n\n try {\n updateState('connecting')\n setError(null)\n\n // Build subscription params\n const subscriptionParams = {\n ns,\n type,\n id,\n filter,\n }\n\n // Try to subscribe via @dotdo/client\n // The exact API depends on the backend implementation\n const subscription = await (client as any).Thing.subscribe?.(subscriptionParams, {\n onCreated: handleCreated,\n onUpdated: handleUpdated,\n onDeleted: handleDeleted,\n onError: (err: Error) => {\n setError(err)\n addEvent({ type: 'error', error: err.message, timestamp: new Date() })\n updateState('error')\n },\n onConnected: () => updateState('connected'),\n onDisconnected: () => updateState('disconnected'),\n })\n\n if (subscription) {\n subscriptionRef.current = subscription\n updateState('connected')\n } else {\n // Subscription not available, stay disconnected\n updateState('disconnected')\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Subscription failed')\n setError(error)\n addEvent({ type: 'error', error: error.message, timestamp: new Date() })\n updateState('error')\n }\n }, [\n enabled,\n ns,\n type,\n id,\n filter,\n client,\n handleCreated,\n handleUpdated,\n handleDeleted,\n updateState,\n addEvent,\n ])\n\n // Disconnect\n const disconnect = useCallback(() => {\n if (subscriptionRef.current?.unsubscribe) {\n subscriptionRef.current.unsubscribe()\n }\n subscriptionRef.current = null\n updateState('disconnected')\n }, [updateState])\n\n // Reconnect\n const reconnect = useCallback(() => {\n disconnect()\n // Small delay before reconnecting\n reconnectTimeoutRef.current = setTimeout(connect, 100)\n }, [disconnect, connect])\n\n // Set up subscription on mount\n useEffect(() => {\n if (enabled) {\n connect()\n }\n\n return () => {\n disconnect()\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current)\n }\n }\n }, [enabled, connect, disconnect])\n\n return {\n state,\n events,\n isConnected: state === 'connected',\n error,\n reconnect,\n disconnect,\n }\n}\n\n/**\n * Hook to subscribe to a single Thing's changes\n *\n * Convenience wrapper around useThingSubscription for single-Thing use cases.\n *\n * @example\n * ```tsx\n * function TaskEditor({ ns, type, id }: ThingParams) {\n * const { isConnected, lastUpdate } = useSingleThingSubscription({\n * ns,\n * type,\n * id,\n * onUpdated: (thing) => {\n * // Handle optimistic update conflicts\n * },\n * })\n *\n * return (\n * <div>\n * {isConnected && <Badge>Live</Badge>}\n * {/* Editor UI *\\/}\n * </div>\n * )\n * }\n * ```\n */\nexport function useSingleThingSubscription(options: {\n ns: string\n type: string\n id: string\n onUpdated?: (thing: Thing) => void\n onDeleted?: () => void\n enabled?: boolean\n}): {\n isConnected: boolean\n lastUpdate: Date | null\n error: Error | null\n} {\n const [lastUpdate, setLastUpdate] = useState<Date | null>(null)\n\n const { isConnected, error } = useThingSubscription({\n ns: options.ns,\n type: options.type,\n id: options.id,\n enabled: options.enabled,\n onUpdated: (thing) => {\n setLastUpdate(new Date())\n options.onUpdated?.(thing)\n },\n onDeleted: () => {\n options.onDeleted?.()\n },\n })\n\n return {\n isConnected,\n lastUpdate,\n error,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useRef } from 'react'\n\n/**\n * Represents a single edit operation that can be undone/redone\n */\nexport interface EditOperation {\n /** Type of operation */\n type: 'cell_update'\n /** Row index that was modified */\n rowIndex: number\n /** Column ID that was modified */\n columnId: string\n /** Value before the edit */\n oldValue: unknown\n /** Value after the edit */\n newValue: unknown\n /** Timestamp of the operation */\n timestamp: number\n}\n\n/**\n * Configuration for the edit history hook\n */\nexport interface UseEditHistoryOptions {\n /** Maximum number of operations to keep in history (default: 50) */\n maxHistory?: number\n /** Callback when undo is triggered */\n onUndo?: (operation: EditOperation) => void\n /** Callback when redo is triggered */\n onRedo?: (operation: EditOperation) => void\n}\n\n/**\n * Return type for the edit history hook\n */\nexport interface UseEditHistoryReturn {\n /** Push a new edit operation to history */\n pushOperation: (operation: Omit<EditOperation, 'timestamp'>) => void\n /** Undo the last operation */\n undo: () => EditOperation | null\n /** Redo the last undone operation */\n redo: () => EditOperation | null\n /** Whether undo is available */\n canUndo: boolean\n /** Whether redo is available */\n canRedo: boolean\n /** Number of operations that can be undone */\n undoCount: number\n /** Number of operations that can be redone */\n redoCount: number\n /** Clear all history */\n clearHistory: () => void\n}\n\n/**\n * Custom hook for managing edit history with undo/redo support\n *\n * This hook provides a dual-stack architecture for undo/redo operations,\n * without keyboard shortcuts (use useKeyboardShortcuts separately).\n *\n * @example\n * ```tsx\n * const { pushOperation, undo, redo, canUndo, canRedo } = useEditHistory({\n * onUndo: (op) => updateCell(op.rowIndex, op.columnId, op.oldValue),\n * onRedo: (op) => updateCell(op.rowIndex, op.columnId, op.newValue),\n * })\n *\n * // When a cell is edited:\n * pushOperation({\n * type: 'cell_update',\n * rowIndex: 0,\n * columnId: 'name',\n * oldValue: 'John',\n * newValue: 'Jane',\n * })\n * ```\n */\nexport function useEditHistory(options: UseEditHistoryOptions = {}): UseEditHistoryReturn {\n const { maxHistory = 50, onUndo, onRedo } = options\n\n // History stacks\n const [undoStack, setUndoStack] = useState<EditOperation[]>([])\n const [redoStack, setRedoStack] = useState<EditOperation[]>([])\n\n // Track if we're currently performing an undo/redo to prevent recursion\n const isUndoingRef = useRef(false)\n\n /**\n * Push a new operation to the history\n */\n const pushOperation = useCallback(\n (operation: Omit<EditOperation, 'timestamp'>) => {\n // Don't push if we're in the middle of an undo/redo\n if (isUndoingRef.current) return\n\n const fullOperation: EditOperation = {\n ...operation,\n timestamp: Date.now(),\n }\n\n setUndoStack((prev) => {\n const newStack = [...prev, fullOperation]\n // Limit history size\n if (newStack.length > maxHistory) {\n return newStack.slice(-maxHistory)\n }\n return newStack\n })\n\n // Clear redo stack when a new operation is pushed\n setRedoStack([])\n },\n [maxHistory]\n )\n\n /**\n * Undo the last operation\n */\n const undo = useCallback((): EditOperation | null => {\n if (undoStack.length === 0) return null\n\n const operation = undoStack[undoStack.length - 1]\n\n isUndoingRef.current = true\n try {\n // Move from undo stack to redo stack\n setUndoStack((prev) => prev.slice(0, -1))\n setRedoStack((prev) => [...prev, operation])\n\n // Call the undo callback\n onUndo?.(operation)\n } finally {\n isUndoingRef.current = false\n }\n\n return operation\n }, [undoStack, onUndo])\n\n /**\n * Redo the last undone operation\n */\n const redo = useCallback((): EditOperation | null => {\n if (redoStack.length === 0) return null\n\n const operation = redoStack[redoStack.length - 1]\n\n isUndoingRef.current = true\n try {\n // Move from redo stack to undo stack\n setRedoStack((prev) => prev.slice(0, -1))\n setUndoStack((prev) => [...prev, operation])\n\n // Call the redo callback\n onRedo?.(operation)\n } finally {\n isUndoingRef.current = false\n }\n\n return operation\n }, [redoStack, onRedo])\n\n /**\n * Clear all history\n */\n const clearHistory = useCallback(() => {\n setUndoStack([])\n setRedoStack([])\n }, [])\n\n return {\n pushOperation,\n undo,\n redo,\n canUndo: undoStack.length > 0,\n canRedo: redoStack.length > 0,\n undoCount: undoStack.length,\n redoCount: redoStack.length,\n clearHistory,\n }\n}\n","'use client'\n\nimport { useEffect, useCallback, useRef } from 'react'\n\n/**\n * Configuration for a single keyboard shortcut\n */\nexport interface KeyboardShortcutConfig {\n /** The key to listen for (e.g., 'z', 'y', 'Enter') */\n key: string\n /** Whether Ctrl key must be pressed (Windows/Linux) */\n ctrl?: boolean\n /** Whether Shift key must be pressed */\n shift?: boolean\n /** Whether Meta key must be pressed (Mac Command key) */\n meta?: boolean\n /** Handler function to call when shortcut is triggered */\n handler: () => void\n /** Whether this shortcut is disabled */\n disabled?: boolean\n}\n\n/**\n * Options for the useKeyboardShortcuts hook\n */\nexport interface UseKeyboardShortcutsOptions {\n /** Whether to enable the shortcuts (default: true) */\n enabled?: boolean\n /** Whether to prevent default behavior (default: true) */\n preventDefault?: boolean\n /** Whether to stop propagation (default: false) */\n stopPropagation?: boolean\n}\n\n/**\n * Check if the event target is an editable element\n */\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!target || !(target instanceof HTMLElement)) return false\n\n const tagName = target.tagName\n if (tagName === 'INPUT' || tagName === 'TEXTAREA') {\n return true\n }\n\n // Check for contentEditable - check both the property and attribute\n // (jsdom may not properly set isContentEditable from the attribute)\n if (target.isContentEditable || target.getAttribute('contenteditable') === 'true') {\n return true\n }\n\n return false\n}\n\n/**\n * Check if a keyboard event matches a shortcut config\n */\nfunction matchesShortcut(event: KeyboardEvent, config: KeyboardShortcutConfig): boolean {\n // Check the key (case-insensitive)\n if (event.key.toLowerCase() !== config.key.toLowerCase()) {\n return false\n }\n\n // Check modifier keys\n // For cross-platform support: Ctrl on Windows/Linux, Meta (Cmd) on Mac\n const isModifierPressed = config.ctrl || config.meta\n if (isModifierPressed) {\n // Accept either ctrlKey or metaKey for cross-platform compat\n if (!event.ctrlKey && !event.metaKey) {\n return false\n }\n }\n\n // Check shift\n if (config.shift && !event.shiftKey) {\n return false\n }\n if (!config.shift && event.shiftKey) {\n // If shift is not required but is pressed, don't match\n // This allows Ctrl+Z and Ctrl+Shift+Z to be distinct\n return false\n }\n\n return true\n}\n\n/**\n * Custom hook for registering global keyboard shortcuts\n *\n * This hook registers keyboard event listeners on the document and\n * triggers handlers when matching shortcuts are pressed. It automatically\n * bypasses shortcuts when the user is typing in an input, textarea, or\n * contentEditable element.\n *\n * @example\n * ```tsx\n * // Basic undo/redo shortcuts\n * useKeyboardShortcuts([\n * { key: 'z', ctrl: true, handler: handleUndo },\n * { key: 'z', ctrl: true, shift: true, handler: handleRedo },\n * ])\n *\n * // With options\n * useKeyboardShortcuts(\n * [{ key: 's', ctrl: true, handler: handleSave }],\n * { preventDefault: true }\n * )\n *\n * // Conditionally disabled\n * useKeyboardShortcuts(\n * [{ key: 'z', ctrl: true, handler: handleUndo, disabled: !canUndo }],\n * )\n * ```\n */\nexport function useKeyboardShortcuts(\n shortcuts: KeyboardShortcutConfig[],\n options: UseKeyboardShortcutsOptions = {}\n): void {\n const { enabled = true, preventDefault = true, stopPropagation = false } = options\n\n // Use refs to avoid recreating the handler when shortcuts change\n const shortcutsRef = useRef(shortcuts)\n shortcutsRef.current = shortcuts\n\n const optionsRef = useRef({ preventDefault, stopPropagation })\n optionsRef.current = { preventDefault, stopPropagation }\n\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n // Skip if target is an editable element\n if (isEditableTarget(event.target)) {\n return\n }\n\n const currentShortcuts = shortcutsRef.current\n const currentOptions = optionsRef.current\n\n for (const config of currentShortcuts) {\n // Skip disabled shortcuts\n if (config.disabled) {\n continue\n }\n\n if (matchesShortcut(event, config)) {\n if (currentOptions.preventDefault) {\n event.preventDefault()\n }\n if (currentOptions.stopPropagation) {\n event.stopPropagation()\n }\n\n config.handler()\n return\n }\n }\n }, [])\n\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [enabled, handleKeyDown])\n}\n"]}
@@ -0,0 +1,234 @@
1
+ import { thingsKeys } from './chunk-4KXVN3EQ.js';
2
+ import { useDO, useDataProviderSafe } from './chunk-FO3N7SXV.js';
3
+ import { ThingFilterSchema, ThingSortSchema, ThingPaginationSchema, ThingCreateInputSchema, ThingUpdateInputSchema, ThingDeleteOptionsSchema } from './chunk-GGO5GW72.js';
4
+ import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
5
+ import { useMemo } from 'react';
6
+ import { useDeepCompareMemo } from 'use-deep-compare';
7
+
8
+ function isThingParams(arg) {
9
+ return typeof arg === "object" && arg !== null && "ns" in arg && "type" in arg && "id" in arg && typeof arg.ns === "string" && typeof arg.type === "string" && typeof arg.id === "string";
10
+ }
11
+ function isTypeStatsParams(arg) {
12
+ return typeof arg === "object" && arg !== null && "ns" in arg && "type" in arg && typeof arg.ns === "string" && typeof arg.type === "string";
13
+ }
14
+ function useThings(filter = {}, sort, pagination) {
15
+ const { client, namespace } = useDO();
16
+ const queryKey = useDeepCompareMemo(
17
+ () => thingsKeys.list({ ...filter, ns: filter.ns ?? namespace }, sort, pagination),
18
+ [filter, namespace, sort, pagination]
19
+ );
20
+ const query = useQuery({
21
+ queryKey,
22
+ queryFn: async () => {
23
+ const validatedFilter = ThingFilterSchema.parse(filter);
24
+ const validatedSort = sort ? ThingSortSchema.parse(sort) : void 0;
25
+ const validatedPagination = pagination ? ThingPaginationSchema.parse(pagination) : void 0;
26
+ const result = await client.Thing.list({
27
+ filter: { ...validatedFilter, ns: validatedFilter.ns ?? namespace },
28
+ sort: validatedSort,
29
+ pagination: validatedPagination
30
+ });
31
+ return result;
32
+ }
33
+ });
34
+ return {
35
+ data: query.data ?? null,
36
+ isLoading: query.isLoading,
37
+ error: query.error,
38
+ refetch: query.refetch,
39
+ queryKey,
40
+ isRefetching: query.isRefetching,
41
+ isFetching: query.isFetching,
42
+ status: query.status
43
+ };
44
+ }
45
+ function useThing(nsOrParams, type, id) {
46
+ const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams;
47
+ const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type;
48
+ const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id;
49
+ const { client } = useDO();
50
+ const queryKey = useMemo(() => thingsKeys.detail(ns, thingType, thingId), [ns, thingType, thingId]);
51
+ const query = useQuery({
52
+ queryKey,
53
+ queryFn: async () => {
54
+ const result = await client.Thing.get({ ns, type: thingType, id: thingId });
55
+ return result;
56
+ },
57
+ enabled: Boolean(ns && thingType && thingId)
58
+ });
59
+ return {
60
+ data: query.data ?? null,
61
+ isLoading: query.isLoading,
62
+ error: query.error,
63
+ refetch: query.refetch,
64
+ queryKey,
65
+ isRefetching: query.isRefetching,
66
+ isFetching: query.isFetching,
67
+ status: query.status
68
+ };
69
+ }
70
+ function useThingVersions(nsOrParams, type, id) {
71
+ const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams;
72
+ const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type;
73
+ const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id;
74
+ const { client } = useDO();
75
+ const queryKey = useMemo(() => thingsKeys.versions(ns, thingType, thingId), [ns, thingType, thingId]);
76
+ const query = useQuery({
77
+ queryKey,
78
+ queryFn: async () => {
79
+ const result = await client.Thing.versions({ ns, type: thingType, id: thingId });
80
+ return result;
81
+ },
82
+ enabled: Boolean(ns && thingType && thingId)
83
+ });
84
+ return {
85
+ data: query.data ?? null,
86
+ isLoading: query.isLoading,
87
+ error: query.error,
88
+ refetch: query.refetch,
89
+ queryKey,
90
+ isRefetching: query.isRefetching,
91
+ isFetching: query.isFetching,
92
+ status: query.status
93
+ };
94
+ }
95
+ function useTypeStats(nsOrParams, type) {
96
+ const ns = isTypeStatsParams(nsOrParams) ? nsOrParams.ns : nsOrParams;
97
+ const thingType = isTypeStatsParams(nsOrParams) ? nsOrParams.type : type;
98
+ const { client } = useDO();
99
+ const queryKey = useMemo(() => thingsKeys.typeStats(ns, thingType), [ns, thingType]);
100
+ const query = useQuery({
101
+ queryKey,
102
+ queryFn: async () => {
103
+ const result = await client.Thing.stats({ ns, type: thingType });
104
+ return result;
105
+ },
106
+ enabled: Boolean(ns && thingType)
107
+ });
108
+ return {
109
+ data: query.data ?? null,
110
+ isLoading: query.isLoading,
111
+ error: query.error,
112
+ refetch: query.refetch,
113
+ queryKey,
114
+ isRefetching: query.isRefetching,
115
+ isFetching: query.isFetching,
116
+ status: query.status
117
+ };
118
+ }
119
+ function isThingParams2(arg) {
120
+ return typeof arg === "object" && arg !== null && "ns" in arg && "type" in arg && "id" in arg && typeof arg.ns === "string" && typeof arg.type === "string" && typeof arg.id === "string";
121
+ }
122
+ function useCreateThing() {
123
+ const { client, namespace } = useDO();
124
+ const queryClient = useQueryClient();
125
+ const dataProvider = useDataProviderSafe();
126
+ const mutation = useMutation({
127
+ mutationFn: async (input) => {
128
+ const validatedInput = ThingCreateInputSchema.parse(input);
129
+ if (dataProvider) {
130
+ const result2 = await dataProvider.create("Thing", {
131
+ data: {
132
+ type: validatedInput.type,
133
+ name: validatedInput.name,
134
+ data: validatedInput.data,
135
+ ns: validatedInput.ns ?? namespace,
136
+ variant: validatedInput.variant
137
+ }
138
+ });
139
+ return result2.data;
140
+ }
141
+ const result = await client.Thing.create(validatedInput);
142
+ return result;
143
+ },
144
+ onSuccess: () => {
145
+ queryClient.invalidateQueries({ queryKey: thingsKeys.all });
146
+ }
147
+ });
148
+ return {
149
+ mutate: mutation.mutate,
150
+ mutateAsync: mutation.mutateAsync,
151
+ isLoading: mutation.isPending,
152
+ error: mutation.error,
153
+ isSuccess: mutation.isSuccess,
154
+ reset: mutation.reset
155
+ };
156
+ }
157
+ function useUpdateThing(nsOrParams, type, id) {
158
+ const ns = isThingParams2(nsOrParams) ? nsOrParams.ns : nsOrParams;
159
+ const thingType = isThingParams2(nsOrParams) ? nsOrParams.type : type;
160
+ const thingId = isThingParams2(nsOrParams) ? nsOrParams.id : id;
161
+ const { client } = useDO();
162
+ const queryClient = useQueryClient();
163
+ const dataProvider = useDataProviderSafe();
164
+ const mutation = useMutation({
165
+ mutationFn: async (input) => {
166
+ const validatedInput = ThingUpdateInputSchema.parse(input);
167
+ if (dataProvider) {
168
+ const result2 = await dataProvider.update("Thing", {
169
+ id: thingId,
170
+ data: {
171
+ ...validatedInput,
172
+ ns,
173
+ type: thingType
174
+ }
175
+ });
176
+ return result2.data;
177
+ }
178
+ const result = await client.Thing.update({
179
+ ns,
180
+ type: thingType,
181
+ id: thingId,
182
+ ...validatedInput
183
+ });
184
+ return result;
185
+ },
186
+ onSuccess: (data) => {
187
+ queryClient.setQueryData(thingsKeys.detail(ns, thingType, thingId), data);
188
+ queryClient.invalidateQueries({ queryKey: thingsKeys.lists() });
189
+ }
190
+ });
191
+ return {
192
+ mutate: mutation.mutate,
193
+ mutateAsync: mutation.mutateAsync,
194
+ isLoading: mutation.isPending,
195
+ error: mutation.error,
196
+ isSuccess: mutation.isSuccess,
197
+ reset: mutation.reset
198
+ };
199
+ }
200
+ function useDeleteThing(nsOrParams, type, id) {
201
+ const ns = isThingParams2(nsOrParams) ? nsOrParams.ns : nsOrParams;
202
+ const thingType = isThingParams2(nsOrParams) ? nsOrParams.type : type;
203
+ const thingId = isThingParams2(nsOrParams) ? nsOrParams.id : id;
204
+ const { client } = useDO();
205
+ const queryClient = useQueryClient();
206
+ const dataProvider = useDataProviderSafe();
207
+ const mutation = useMutation({
208
+ mutationFn: async (options) => {
209
+ const validatedOptions = options ? ThingDeleteOptionsSchema.parse(options) : {};
210
+ const hard = validatedOptions.hard ?? false;
211
+ if (dataProvider && !hard) {
212
+ await dataProvider.delete("Thing", { id: thingId });
213
+ return;
214
+ }
215
+ await client.Thing.delete({ ns, type: thingType, id: thingId, hard });
216
+ },
217
+ onSuccess: () => {
218
+ queryClient.removeQueries({ queryKey: thingsKeys.detail(ns, thingType, thingId) });
219
+ queryClient.invalidateQueries({ queryKey: thingsKeys.lists() });
220
+ }
221
+ });
222
+ return {
223
+ mutate: mutation.mutate,
224
+ mutateAsync: mutation.mutateAsync,
225
+ isLoading: mutation.isPending,
226
+ error: mutation.error,
227
+ isSuccess: mutation.isSuccess,
228
+ reset: mutation.reset
229
+ };
230
+ }
231
+
232
+ export { useCreateThing, useDeleteThing, useThing, useThingVersions, useThings, useTypeStats, useUpdateThing };
233
+ //# sourceMappingURL=chunk-JWKIONEO.js.map
234
+ //# sourceMappingURL=chunk-JWKIONEO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/things/queries.ts","../src/hooks/things/mutations.ts"],"names":["isThingParams","result"],"mappings":"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","file":"chunk-JWKIONEO.js","sourcesContent":["'use client'\n\n/**\n * Query hooks for Things\n *\n * Provides reactive data access to Things via React Query + @dotdo/client RPC.\n * Automatic caching, background refetching, and cache invalidation.\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useDeepCompareMemo } from 'use-deep-compare'\nimport { useDO } from '../../providers/do-provider'\nimport { thingsKeys } from '../../lib/query-keys'\nimport type {\n Thing,\n ThingFilter,\n ThingSort,\n ThingPagination,\n ThingQueryResult,\n ThingVersion,\n TypeStats,\n} from '../../types'\nimport {\n ThingFilterSchema,\n ThingSortSchema,\n ThingPaginationSchema,\n} from '../../types/schemas'\nimport type {\n UseThingsResult,\n UseThingResult,\n UseThingVersionsResult,\n UseTypeStatsResult,\n ThingParams,\n TypeStatsParams,\n} from './types'\n\n// ============================================================================\n// Helper to detect object-based API usage\n// ============================================================================\n\n/**\n * Type guard to check if argument is a ThingParams object\n */\nfunction isThingParams(arg: unknown): arg is ThingParams {\n return (\n typeof arg === 'object' &&\n arg !== null &&\n 'ns' in arg &&\n 'type' in arg &&\n 'id' in arg &&\n typeof (arg as ThingParams).ns === 'string' &&\n typeof (arg as ThingParams).type === 'string' &&\n typeof (arg as ThingParams).id === 'string'\n )\n}\n\n/**\n * Type guard to check if argument is a TypeStatsParams object\n */\nfunction isTypeStatsParams(arg: unknown): arg is TypeStatsParams {\n return (\n typeof arg === 'object' &&\n arg !== null &&\n 'ns' in arg &&\n 'type' in arg &&\n typeof (arg as TypeStatsParams).ns === 'string' &&\n typeof (arg as TypeStatsParams).type === 'string'\n )\n}\n\n/**\n * Hook to fetch a list of Things\n *\n * Uses React Query for caching with @dotdo/client RPC for data fetching.\n */\nexport function useThings(\n filter: ThingFilter = {},\n sort?: ThingSort,\n pagination?: ThingPagination\n): UseThingsResult {\n const { client, namespace } = useDO()\n\n // Build query key with merged namespace\n // Use deep comparison for object dependencies to avoid unnecessary recomputations\n const queryKey = useDeepCompareMemo(\n () => thingsKeys.list({ ...filter, ns: filter.ns ?? namespace }, sort, pagination),\n [filter, namespace, sort, pagination]\n )\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n // Validate inputs before API call\n const validatedFilter = ThingFilterSchema.parse(filter)\n const validatedSort = sort ? ThingSortSchema.parse(sort) : undefined\n const validatedPagination = pagination ? ThingPaginationSchema.parse(pagination) : undefined\n\n // Use @dotdo/client RPC for data fetching\n const result = await (client as any).Thing.list({\n filter: { ...validatedFilter, ns: validatedFilter.ns ?? namespace },\n sort: validatedSort,\n pagination: validatedPagination,\n })\n return result as ThingQueryResult\n },\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n\n/**\n * Hook to fetch a single Thing\n *\n * Uses React Query for caching with @dotdo/client RPC calls.\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const { data } = useThing({ ns: 'default', type: 'Task', id: 'task-123' })\n * ```\n *\n * @example Positional API (deprecated)\n * ```tsx\n * const { data } = useThing('default', 'Task', 'task-123')\n * ```\n */\nexport function useThing(params: ThingParams): UseThingResult\n/**\n * @deprecated Use object-based API: `useThing({ ns, type, id })` instead\n */\nexport function useThing(ns: string, type: string, id: string): UseThingResult\nexport function useThing(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseThingResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n\n const queryKey = useMemo(() => thingsKeys.detail(ns, thingType, thingId), [ns, thingType, thingId])\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n const result = await (client as any).Thing.get({ ns, type: thingType, id: thingId })\n return result as Thing\n },\n enabled: Boolean(ns && thingType && thingId),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n\n/**\n * Hook to fetch Thing version history\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const { data } = useThingVersions({ ns: 'default', type: 'Task', id: 'task-123' })\n * ```\n *\n * @example Positional API (deprecated)\n * ```tsx\n * const { data } = useThingVersions('default', 'Task', 'task-123')\n * ```\n */\nexport function useThingVersions(params: ThingParams): UseThingVersionsResult\n/**\n * @deprecated Use object-based API: `useThingVersions({ ns, type, id })` instead\n */\nexport function useThingVersions(ns: string, type: string, id: string): UseThingVersionsResult\nexport function useThingVersions(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseThingVersionsResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n\n const queryKey = useMemo(() => thingsKeys.versions(ns, thingType, thingId), [ns, thingType, thingId])\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n const result = await (client as any).Thing.versions({ ns, type: thingType, id: thingId })\n return result as ThingVersion[]\n },\n enabled: Boolean(ns && thingType && thingId),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n\n/**\n * Hook to fetch type statistics\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const { data } = useTypeStats({ ns: 'default', type: 'Task' })\n * ```\n *\n * @example Positional API (deprecated)\n * ```tsx\n * const { data } = useTypeStats('default', 'Task')\n * ```\n */\nexport function useTypeStats(params: TypeStatsParams): UseTypeStatsResult\n/**\n * @deprecated Use object-based API: `useTypeStats({ ns, type })` instead\n */\nexport function useTypeStats(ns: string, type: string): UseTypeStatsResult\nexport function useTypeStats(\n nsOrParams: string | TypeStatsParams,\n type?: string\n): UseTypeStatsResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isTypeStatsParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isTypeStatsParams(nsOrParams) ? nsOrParams.type : type!\n\n const { client } = useDO()\n\n const queryKey = useMemo(() => thingsKeys.typeStats(ns, thingType), [ns, thingType])\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n const result = await (client as any).Thing.stats({ ns, type: thingType })\n return result as TypeStats\n },\n enabled: Boolean(ns && thingType),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n","'use client'\n\n/**\n * Mutation hooks for Things\n *\n * Provides create, update, and delete operations with automatic cache invalidation.\n * Uses @dotdo/client RPC for backend communication.\n */\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useDO, useDataProviderSafe } from '../../providers/do-provider'\nimport { thingsKeys } from '../../lib/query-keys'\nimport type { Thing, ThingCreateInput, ThingUpdateInput } from '../../types'\nimport {\n ThingCreateInputSchema,\n ThingUpdateInputSchema,\n ThingDeleteOptionsSchema,\n} from '../../types/schemas'\nimport type {\n UseCreateThingResult,\n UseUpdateThingResult,\n UseDeleteThingResult,\n ThingParams,\n} from './types'\n\n// ============================================================================\n// Helper to detect object-based API usage\n// ============================================================================\n\n/**\n * Type guard to check if argument is a ThingParams object\n */\nfunction isThingParams(arg: unknown): arg is ThingParams {\n return (\n typeof arg === 'object' &&\n arg !== null &&\n 'ns' in arg &&\n 'type' in arg &&\n 'id' in arg &&\n typeof (arg as ThingParams).ns === 'string' &&\n typeof (arg as ThingParams).type === 'string' &&\n typeof (arg as ThingParams).id === 'string'\n )\n}\n\n/**\n * Hook to create a Thing\n *\n * Automatically invalidates the things list cache on success.\n *\n * Supports two modes:\n * 1. **DataProvider mode**: Uses DataProvider.create() when available (via DoDataProviderProvider)\n * 2. **RPC mode**: Uses @dotdo/client for backend communication\n */\nexport function useCreateThing(): UseCreateThingResult {\n const { client, namespace } = useDO()\n const queryClient = useQueryClient()\n const dataProvider = useDataProviderSafe()\n\n const mutation = useMutation({\n mutationFn: async (input: ThingCreateInput): Promise<Thing> => {\n // Validate input before API call\n const validatedInput = ThingCreateInputSchema.parse(input)\n\n // Priority 1: Use DataProvider if available\n if (dataProvider) {\n const result = await dataProvider.create<Thing>('Thing', {\n data: {\n type: validatedInput.type,\n name: validatedInput.name,\n data: validatedInput.data,\n ns: validatedInput.ns ?? namespace,\n variant: validatedInput.variant,\n },\n })\n return result.data\n }\n\n // Priority 2: Use @dotdo/client RPC\n // The client is a dynamic proxy - we can call any method\n const result = await (client as any).Thing.create(validatedInput)\n return result as Thing\n },\n onSuccess: () => {\n // Invalidate all things queries to refetch\n queryClient.invalidateQueries({ queryKey: thingsKeys.all })\n },\n })\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n }\n}\n\n/**\n * Hook to update a Thing\n *\n * Automatically invalidates the related cache entries on success.\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const updateThing = useUpdateThing({ ns: 'default', type: 'Task', id: 'task-123' })\n * updateThing.mutate({ name: 'Updated Task' })\n * ```\n */\nexport function useUpdateThing(params: ThingParams): UseUpdateThingResult\n/**\n * @deprecated Use object-based API: `useUpdateThing({ ns, type, id })` instead\n */\nexport function useUpdateThing(ns: string, type: string, id: string): UseUpdateThingResult\nexport function useUpdateThing(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseUpdateThingResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n const queryClient = useQueryClient()\n const dataProvider = useDataProviderSafe()\n\n const mutation = useMutation({\n mutationFn: async (input: ThingUpdateInput): Promise<Thing> => {\n // Validate input before API call\n const validatedInput = ThingUpdateInputSchema.parse(input)\n\n // Priority 1: Use DataProvider if available\n if (dataProvider) {\n const result = await dataProvider.update<Thing>('Thing', {\n id: thingId,\n data: {\n ...validatedInput,\n ns,\n type: thingType,\n },\n })\n return result.data\n }\n\n // Priority 2: Use @dotdo/client RPC\n const result = await (client as any).Thing.update({\n ns,\n type: thingType,\n id: thingId,\n ...validatedInput,\n })\n return result as Thing\n },\n onSuccess: (data) => {\n // Update the cache for this specific thing\n queryClient.setQueryData(thingsKeys.detail(ns, thingType, thingId), data)\n // Invalidate list queries\n queryClient.invalidateQueries({ queryKey: thingsKeys.lists() })\n },\n })\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n }\n}\n\n/**\n * Hook to delete a Thing (soft delete by default)\n *\n * Automatically invalidates the related cache entries on success.\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const deleteThing = useDeleteThing({ ns: 'default', type: 'Task', id: 'task-123' })\n * deleteThing.mutate() // soft delete\n * deleteThing.mutate({ hard: true }) // hard delete\n * ```\n */\nexport function useDeleteThing(params: ThingParams): UseDeleteThingResult\n/**\n * @deprecated Use object-based API: `useDeleteThing({ ns, type, id })` instead\n */\nexport function useDeleteThing(ns: string, type: string, id: string): UseDeleteThingResult\nexport function useDeleteThing(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseDeleteThingResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n const queryClient = useQueryClient()\n const dataProvider = useDataProviderSafe()\n\n const mutation = useMutation({\n mutationFn: async (options?: { hard?: boolean }): Promise<void> => {\n // Validate options before API call\n const validatedOptions = options ? ThingDeleteOptionsSchema.parse(options) : {}\n const hard = validatedOptions.hard ?? false\n\n // Priority 1: Use DataProvider if available (soft delete only)\n if (dataProvider && !hard) {\n await dataProvider.delete('Thing', { id: thingId })\n return\n }\n\n // Priority 2: Use @dotdo/client RPC\n await (client as any).Thing.delete({ ns, type: thingType, id: thingId, hard })\n },\n onSuccess: () => {\n // Remove from cache\n queryClient.removeQueries({ queryKey: thingsKeys.detail(ns, thingType, thingId) })\n // Invalidate list queries\n queryClient.invalidateQueries({ queryKey: thingsKeys.lists() })\n },\n })\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n }\n}\n"]}