fauxbase-react 0.5.9 → 0.6.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/dist/index.cjs CHANGED
@@ -260,6 +260,32 @@ function useAuth() {
260
260
  error
261
261
  };
262
262
  }
263
+ function useSyncStatus() {
264
+ const ctx = react.useContext(FauxbaseContext);
265
+ const [state, setState] = react.useState({
266
+ isOnline: true,
267
+ isSyncing: false,
268
+ pendingCount: 0,
269
+ lastSynced: null
270
+ });
271
+ react.useEffect(() => {
272
+ const eventBus = ctx?.client?._eventBus;
273
+ if (!eventBus) return;
274
+ const handler = (event) => {
275
+ if (event.data?.type === "state") {
276
+ setState({
277
+ isOnline: event.data.isOnline,
278
+ isSyncing: event.data.isSyncing,
279
+ pendingCount: event.data.pendingCount,
280
+ lastSynced: event.data.lastSynced
281
+ });
282
+ }
283
+ };
284
+ const unsub = eventBus.on("__sync", handler);
285
+ return unsub;
286
+ }, [ctx]);
287
+ return state;
288
+ }
263
289
 
264
290
  exports.FauxbaseContext = FauxbaseContext;
265
291
  exports.FauxbaseProvider = FauxbaseProvider;
@@ -270,5 +296,6 @@ exports.useFauxbaseContext = useFauxbaseContext;
270
296
  exports.useGet = useGet;
271
297
  exports.useList = useList;
272
298
  exports.useMutation = useMutation;
299
+ exports.useSyncStatus = useSyncStatus;
273
300
  //# sourceMappingURL=index.cjs.map
274
301
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts","../src/use-fauxbase.ts","../src/use-list.ts","../src/use-get.ts","../src/use-mutation.ts","../src/use-event.ts","../src/use-auth.ts"],"names":["createContext","createElement","useContext","useState","useRef","useCallback","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, createElement, useContext } from 'react';\nimport type { Service, EventBus } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\n// --- Context ---\n\nexport const FauxbaseContext = createContext<FauxbaseContextValue | null>(null);\n\n// --- Provider ---\n\nexport function FauxbaseProvider(props: {\n client: any;\n children: React.ReactNode;\n}) {\n // Invalidation registry: Service → Set of refetch callbacks\n const registryRef = { current: new Map<Service<any>, Set<() => void>>() };\n\n const value: FauxbaseContextValue = {\n client: props.client,\n invalidate: (service: Service<any>) => {\n const subscribers = registryRef.current.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registryRef.current.has(service)) {\n registryRef.current.set(service, new Set());\n }\n registryRef.current.get(service)!.add(refetchFn);\n return () => {\n registryRef.current.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = props.client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = props.client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n return createElement(FauxbaseContext.Provider, { value }, props.children);\n}\n\n// --- Hook ---\n\nexport function useFauxbaseContext(): FauxbaseContextValue {\n const ctx = useContext(FauxbaseContext);\n if (!ctx) {\n throw new Error('useFauxbaseContext must be used within a FauxbaseProvider');\n }\n return ctx;\n}\n","import { useFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = useFauxbaseContext();\n return ctx.client;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n): UseListResult<T> {\n const ctx = useFauxbaseContext();\n const [items, setItems] = useState<T[]>([]);\n const [meta, setMeta] = useState<PageMeta | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const enabled = options?.enabled !== false;\n\n const fetch = useCallback(async () => {\n if (!enabled) return;\n setLoading(true);\n setError(null);\n try {\n const result = await service.list(query);\n if (mountedRef.current) {\n setItems(result.items);\n setMeta(result.meta);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [service, JSON.stringify(query), enabled]);\n\n // Subscribe for invalidation\n useEffect(() => {\n const unsub = ctx.subscribe(service, fetch);\n return unsub;\n }, [ctx, service, fetch]);\n\n // Fetch on mount and query change\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => { mountedRef.current = false; };\n }, [fetch]);\n\n // Refetch interval\n useEffect(() => {\n if (!options?.refetchInterval || !enabled) return;\n const id = setInterval(fetch, options.refetchInterval);\n return () => clearInterval(id);\n }, [fetch, options?.refetchInterval, enabled]);\n\n return { items, meta, loading, error, refetch: fetch };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n): UseGetResult<T> {\n const ctx = useFauxbaseContext();\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = useCallback(async () => {\n if (!enabled || !id) {\n setData(null);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await service.get(id);\n if (mountedRef.current) {\n setData(result.data);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setData(null);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [service, id, enabled]);\n\n // Subscribe for invalidation\n useEffect(() => {\n const unsub = ctx.subscribe(service, fetch);\n return unsub;\n }, [ctx, service, fetch]);\n\n // Fetch on mount and id change\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => { mountedRef.current = false; };\n }, [fetch]);\n\n return { data, loading, error, refetch: fetch };\n}\n","import { useState, useCallback } from 'react';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n): UseMutationResult<T> {\n const ctx = useFauxbaseContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const create = useCallback(async (data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.create(data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n const update = useCallback(async (id: string, data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.update(id, data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n const remove = useCallback(async (id: string): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.delete(id);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n return { create, update, remove, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { Service, Entity, EventBus, EventHandler } from 'fauxbase';\nimport { useFauxbaseContext } from './context';\n\nexport function useEvent<T extends Entity>(\n serviceOrResource: Service<T> | string,\n handler: EventHandler<T>,\n): void {\n const ctx = useFauxbaseContext();\n\n useEffect(() => {\n const eventBus: EventBus | undefined = ctx.client._eventBus;\n if (!eventBus) return;\n\n const resource = typeof serviceOrResource === 'string'\n ? serviceOrResource\n : (serviceOrResource as any).resourceName;\n\n return eventBus.on(resource, handler);\n }, [serviceOrResource, handler, ctx.client]);\n}\n","import { useState, useCallback } from 'react';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(): UseAuthResult<T> {\n const ctx = useFauxbaseContext();\n const authService = ctx.client.auth;\n\n if (!authService) {\n throw new Error('useAuth requires auth to be configured in createClient');\n }\n\n const [, forceUpdate] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const rerender = useCallback(() => forceUpdate(n => n + 1), []);\n\n const login = useCallback(async (credentials: { email: string; password: string }): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const user = await authService.login(credentials);\n rerender();\n return user;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [authService, rerender]);\n\n const register = useCallback(async (data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const user = await authService.register(data);\n rerender();\n return user;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [authService, rerender]);\n\n const logout = useCallback(() => {\n authService.logout();\n rerender();\n }, [authService, rerender]);\n\n const hasRole = useCallback((role: string): boolean => {\n return authService.hasRole(role);\n }, [authService]);\n\n return {\n user: authService.currentUser as T | null,\n isLoggedIn: authService.isLoggedIn,\n token: authService.token,\n login,\n register,\n logout,\n hasRole,\n loading,\n error,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/context.ts","../src/use-fauxbase.ts","../src/use-list.ts","../src/use-get.ts","../src/use-mutation.ts","../src/use-event.ts","../src/use-auth.ts","../src/use-sync-status.ts"],"names":["createContext","createElement","useContext","useState","useRef","useCallback","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, createElement, useContext } from 'react';\nimport type { Service, EventBus } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\n// --- Context ---\n\nexport const FauxbaseContext = createContext<FauxbaseContextValue | null>(null);\n\n// --- Provider ---\n\nexport function FauxbaseProvider(props: {\n client: any;\n children: React.ReactNode;\n}) {\n // Invalidation registry: Service → Set of refetch callbacks\n const registryRef = { current: new Map<Service<any>, Set<() => void>>() };\n\n const value: FauxbaseContextValue = {\n client: props.client,\n invalidate: (service: Service<any>) => {\n const subscribers = registryRef.current.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registryRef.current.has(service)) {\n registryRef.current.set(service, new Set());\n }\n registryRef.current.get(service)!.add(refetchFn);\n return () => {\n registryRef.current.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = props.client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = props.client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n return createElement(FauxbaseContext.Provider, { value }, props.children);\n}\n\n// --- Hook ---\n\nexport function useFauxbaseContext(): FauxbaseContextValue {\n const ctx = useContext(FauxbaseContext);\n if (!ctx) {\n throw new Error('useFauxbaseContext must be used within a FauxbaseProvider');\n }\n return ctx;\n}\n","import { useFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = useFauxbaseContext();\n return ctx.client;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n): UseListResult<T> {\n const ctx = useFauxbaseContext();\n const [items, setItems] = useState<T[]>([]);\n const [meta, setMeta] = useState<PageMeta | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const enabled = options?.enabled !== false;\n\n const fetch = useCallback(async () => {\n if (!enabled) return;\n setLoading(true);\n setError(null);\n try {\n const result = await service.list(query);\n if (mountedRef.current) {\n setItems(result.items);\n setMeta(result.meta);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [service, JSON.stringify(query), enabled]);\n\n // Subscribe for invalidation\n useEffect(() => {\n const unsub = ctx.subscribe(service, fetch);\n return unsub;\n }, [ctx, service, fetch]);\n\n // Fetch on mount and query change\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => { mountedRef.current = false; };\n }, [fetch]);\n\n // Refetch interval\n useEffect(() => {\n if (!options?.refetchInterval || !enabled) return;\n const id = setInterval(fetch, options.refetchInterval);\n return () => clearInterval(id);\n }, [fetch, options?.refetchInterval, enabled]);\n\n return { items, meta, loading, error, refetch: fetch };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n): UseGetResult<T> {\n const ctx = useFauxbaseContext();\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = useCallback(async () => {\n if (!enabled || !id) {\n setData(null);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await service.get(id);\n if (mountedRef.current) {\n setData(result.data);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setData(null);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [service, id, enabled]);\n\n // Subscribe for invalidation\n useEffect(() => {\n const unsub = ctx.subscribe(service, fetch);\n return unsub;\n }, [ctx, service, fetch]);\n\n // Fetch on mount and id change\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => { mountedRef.current = false; };\n }, [fetch]);\n\n return { data, loading, error, refetch: fetch };\n}\n","import { useState, useCallback } from 'react';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n): UseMutationResult<T> {\n const ctx = useFauxbaseContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const create = useCallback(async (data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.create(data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n const update = useCallback(async (id: string, data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.update(id, data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n const remove = useCallback(async (id: string): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.delete(id);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n return { create, update, remove, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { Service, Entity, EventBus, EventHandler } from 'fauxbase';\nimport { useFauxbaseContext } from './context';\n\nexport function useEvent<T extends Entity>(\n serviceOrResource: Service<T> | string,\n handler: EventHandler<T>,\n): void {\n const ctx = useFauxbaseContext();\n\n useEffect(() => {\n const eventBus: EventBus | undefined = ctx.client._eventBus;\n if (!eventBus) return;\n\n const resource = typeof serviceOrResource === 'string'\n ? serviceOrResource\n : (serviceOrResource as any).resourceName;\n\n return eventBus.on(resource, handler);\n }, [serviceOrResource, handler, ctx.client]);\n}\n","import { useState, useCallback } from 'react';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(): UseAuthResult<T> {\n const ctx = useFauxbaseContext();\n const authService = ctx.client.auth;\n\n if (!authService) {\n throw new Error('useAuth requires auth to be configured in createClient');\n }\n\n const [, forceUpdate] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const rerender = useCallback(() => forceUpdate(n => n + 1), []);\n\n const login = useCallback(async (credentials: { email: string; password: string }): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const user = await authService.login(credentials);\n rerender();\n return user;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [authService, rerender]);\n\n const register = useCallback(async (data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const user = await authService.register(data);\n rerender();\n return user;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [authService, rerender]);\n\n const logout = useCallback(() => {\n authService.logout();\n rerender();\n }, [authService, rerender]);\n\n const hasRole = useCallback((role: string): boolean => {\n return authService.hasRole(role);\n }, [authService]);\n\n return {\n user: authService.currentUser as T | null,\n isLoggedIn: authService.isLoggedIn,\n token: authService.token,\n login,\n register,\n logout,\n hasRole,\n loading,\n error,\n };\n}\n","import { useState, useEffect, useContext } from 'react';\nimport { FauxbaseContext } from './context';\n\nexport interface UseSyncStatusResult {\n isOnline: boolean;\n isSyncing: boolean;\n pendingCount: number;\n lastSynced: number | null;\n}\n\nexport function useSyncStatus(): UseSyncStatusResult {\n const ctx = useContext(FauxbaseContext);\n const [state, setState] = useState<UseSyncStatusResult>({\n isOnline: true,\n isSyncing: false,\n pendingCount: 0,\n lastSynced: null,\n });\n\n useEffect(() => {\n const eventBus = ctx?.client?._eventBus;\n if (!eventBus) return;\n\n const handler = (event: any) => {\n if (event.data?.type === 'state') {\n setState({\n isOnline: event.data.isOnline,\n isSyncing: event.data.isSyncing,\n pendingCount: event.data.pendingCount,\n lastSynced: event.data.lastSynced,\n });\n }\n };\n\n const unsub = eventBus.on('__sync', handler);\n return unsub;\n }, [ctx]);\n\n return state;\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -67,4 +67,12 @@ declare function useEvent<T extends Entity>(serviceOrResource: Service<T> | stri
67
67
 
68
68
  declare function useAuth<T extends Entity>(): UseAuthResult<T>;
69
69
 
70
- export { FauxbaseContext, type FauxbaseContextValue, FauxbaseProvider, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
70
+ interface UseSyncStatusResult {
71
+ isOnline: boolean;
72
+ isSyncing: boolean;
73
+ pendingCount: number;
74
+ lastSynced: number | null;
75
+ }
76
+ declare function useSyncStatus(): UseSyncStatusResult;
77
+
78
+ export { FauxbaseContext, type FauxbaseContextValue, FauxbaseProvider, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, type UseSyncStatusResult, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation, useSyncStatus };
package/dist/index.d.ts CHANGED
@@ -67,4 +67,12 @@ declare function useEvent<T extends Entity>(serviceOrResource: Service<T> | stri
67
67
 
68
68
  declare function useAuth<T extends Entity>(): UseAuthResult<T>;
69
69
 
70
- export { FauxbaseContext, type FauxbaseContextValue, FauxbaseProvider, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
70
+ interface UseSyncStatusResult {
71
+ isOnline: boolean;
72
+ isSyncing: boolean;
73
+ pendingCount: number;
74
+ lastSynced: number | null;
75
+ }
76
+ declare function useSyncStatus(): UseSyncStatusResult;
77
+
78
+ export { FauxbaseContext, type FauxbaseContextValue, FauxbaseProvider, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, type UseSyncStatusResult, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation, useSyncStatus };
package/dist/index.js CHANGED
@@ -258,7 +258,33 @@ function useAuth() {
258
258
  error
259
259
  };
260
260
  }
261
+ function useSyncStatus() {
262
+ const ctx = useContext(FauxbaseContext);
263
+ const [state, setState] = useState({
264
+ isOnline: true,
265
+ isSyncing: false,
266
+ pendingCount: 0,
267
+ lastSynced: null
268
+ });
269
+ useEffect(() => {
270
+ const eventBus = ctx?.client?._eventBus;
271
+ if (!eventBus) return;
272
+ const handler = (event) => {
273
+ if (event.data?.type === "state") {
274
+ setState({
275
+ isOnline: event.data.isOnline,
276
+ isSyncing: event.data.isSyncing,
277
+ pendingCount: event.data.pendingCount,
278
+ lastSynced: event.data.lastSynced
279
+ });
280
+ }
281
+ };
282
+ const unsub = eventBus.on("__sync", handler);
283
+ return unsub;
284
+ }, [ctx]);
285
+ return state;
286
+ }
261
287
 
262
- export { FauxbaseContext, FauxbaseProvider, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
288
+ export { FauxbaseContext, FauxbaseProvider, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation, useSyncStatus };
263
289
  //# sourceMappingURL=index.js.map
264
290
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts","../src/use-fauxbase.ts","../src/use-list.ts","../src/use-get.ts","../src/use-mutation.ts","../src/use-event.ts","../src/use-auth.ts"],"names":["useState","useRef","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, createElement, useContext } from 'react';\nimport type { Service, EventBus } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\n// --- Context ---\n\nexport const FauxbaseContext = createContext<FauxbaseContextValue | null>(null);\n\n// --- Provider ---\n\nexport function FauxbaseProvider(props: {\n client: any;\n children: React.ReactNode;\n}) {\n // Invalidation registry: Service → Set of refetch callbacks\n const registryRef = { current: new Map<Service<any>, Set<() => void>>() };\n\n const value: FauxbaseContextValue = {\n client: props.client,\n invalidate: (service: Service<any>) => {\n const subscribers = registryRef.current.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registryRef.current.has(service)) {\n registryRef.current.set(service, new Set());\n }\n registryRef.current.get(service)!.add(refetchFn);\n return () => {\n registryRef.current.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = props.client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = props.client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n return createElement(FauxbaseContext.Provider, { value }, props.children);\n}\n\n// --- Hook ---\n\nexport function useFauxbaseContext(): FauxbaseContextValue {\n const ctx = useContext(FauxbaseContext);\n if (!ctx) {\n throw new Error('useFauxbaseContext must be used within a FauxbaseProvider');\n }\n return ctx;\n}\n","import { useFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = useFauxbaseContext();\n return ctx.client;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n): UseListResult<T> {\n const ctx = useFauxbaseContext();\n const [items, setItems] = useState<T[]>([]);\n const [meta, setMeta] = useState<PageMeta | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const enabled = options?.enabled !== false;\n\n const fetch = useCallback(async () => {\n if (!enabled) return;\n setLoading(true);\n setError(null);\n try {\n const result = await service.list(query);\n if (mountedRef.current) {\n setItems(result.items);\n setMeta(result.meta);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [service, JSON.stringify(query), enabled]);\n\n // Subscribe for invalidation\n useEffect(() => {\n const unsub = ctx.subscribe(service, fetch);\n return unsub;\n }, [ctx, service, fetch]);\n\n // Fetch on mount and query change\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => { mountedRef.current = false; };\n }, [fetch]);\n\n // Refetch interval\n useEffect(() => {\n if (!options?.refetchInterval || !enabled) return;\n const id = setInterval(fetch, options.refetchInterval);\n return () => clearInterval(id);\n }, [fetch, options?.refetchInterval, enabled]);\n\n return { items, meta, loading, error, refetch: fetch };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n): UseGetResult<T> {\n const ctx = useFauxbaseContext();\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = useCallback(async () => {\n if (!enabled || !id) {\n setData(null);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await service.get(id);\n if (mountedRef.current) {\n setData(result.data);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setData(null);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [service, id, enabled]);\n\n // Subscribe for invalidation\n useEffect(() => {\n const unsub = ctx.subscribe(service, fetch);\n return unsub;\n }, [ctx, service, fetch]);\n\n // Fetch on mount and id change\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => { mountedRef.current = false; };\n }, [fetch]);\n\n return { data, loading, error, refetch: fetch };\n}\n","import { useState, useCallback } from 'react';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n): UseMutationResult<T> {\n const ctx = useFauxbaseContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const create = useCallback(async (data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.create(data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n const update = useCallback(async (id: string, data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.update(id, data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n const remove = useCallback(async (id: string): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.delete(id);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n return { create, update, remove, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { Service, Entity, EventBus, EventHandler } from 'fauxbase';\nimport { useFauxbaseContext } from './context';\n\nexport function useEvent<T extends Entity>(\n serviceOrResource: Service<T> | string,\n handler: EventHandler<T>,\n): void {\n const ctx = useFauxbaseContext();\n\n useEffect(() => {\n const eventBus: EventBus | undefined = ctx.client._eventBus;\n if (!eventBus) return;\n\n const resource = typeof serviceOrResource === 'string'\n ? serviceOrResource\n : (serviceOrResource as any).resourceName;\n\n return eventBus.on(resource, handler);\n }, [serviceOrResource, handler, ctx.client]);\n}\n","import { useState, useCallback } from 'react';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(): UseAuthResult<T> {\n const ctx = useFauxbaseContext();\n const authService = ctx.client.auth;\n\n if (!authService) {\n throw new Error('useAuth requires auth to be configured in createClient');\n }\n\n const [, forceUpdate] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const rerender = useCallback(() => forceUpdate(n => n + 1), []);\n\n const login = useCallback(async (credentials: { email: string; password: string }): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const user = await authService.login(credentials);\n rerender();\n return user;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [authService, rerender]);\n\n const register = useCallback(async (data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const user = await authService.register(data);\n rerender();\n return user;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [authService, rerender]);\n\n const logout = useCallback(() => {\n authService.logout();\n rerender();\n }, [authService, rerender]);\n\n const hasRole = useCallback((role: string): boolean => {\n return authService.hasRole(role);\n }, [authService]);\n\n return {\n user: authService.currentUser as T | null,\n isLoggedIn: authService.isLoggedIn,\n token: authService.token,\n login,\n register,\n logout,\n hasRole,\n loading,\n error,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/context.ts","../src/use-fauxbase.ts","../src/use-list.ts","../src/use-get.ts","../src/use-mutation.ts","../src/use-event.ts","../src/use-auth.ts","../src/use-sync-status.ts"],"names":["useState","useRef","useCallback","useEffect","useContext"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, createElement, useContext } from 'react';\nimport type { Service, EventBus } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\n// --- Context ---\n\nexport const FauxbaseContext = createContext<FauxbaseContextValue | null>(null);\n\n// --- Provider ---\n\nexport function FauxbaseProvider(props: {\n client: any;\n children: React.ReactNode;\n}) {\n // Invalidation registry: Service → Set of refetch callbacks\n const registryRef = { current: new Map<Service<any>, Set<() => void>>() };\n\n const value: FauxbaseContextValue = {\n client: props.client,\n invalidate: (service: Service<any>) => {\n const subscribers = registryRef.current.get(service);\n if (subscribers) {\n for (const fn of subscribers) {\n fn();\n }\n }\n },\n subscribe: (service: Service<any>, refetchFn: () => void) => {\n if (!registryRef.current.has(service)) {\n registryRef.current.set(service, new Set());\n }\n registryRef.current.get(service)!.add(refetchFn);\n return () => {\n registryRef.current.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = props.client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = props.client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n return createElement(FauxbaseContext.Provider, { value }, props.children);\n}\n\n// --- Hook ---\n\nexport function useFauxbaseContext(): FauxbaseContextValue {\n const ctx = useContext(FauxbaseContext);\n if (!ctx) {\n throw new Error('useFauxbaseContext must be used within a FauxbaseProvider');\n }\n return ctx;\n}\n","import { useFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = useFauxbaseContext();\n return ctx.client;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n): UseListResult<T> {\n const ctx = useFauxbaseContext();\n const [items, setItems] = useState<T[]>([]);\n const [meta, setMeta] = useState<PageMeta | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const enabled = options?.enabled !== false;\n\n const fetch = useCallback(async () => {\n if (!enabled) return;\n setLoading(true);\n setError(null);\n try {\n const result = await service.list(query);\n if (mountedRef.current) {\n setItems(result.items);\n setMeta(result.meta);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [service, JSON.stringify(query), enabled]);\n\n // Subscribe for invalidation\n useEffect(() => {\n const unsub = ctx.subscribe(service, fetch);\n return unsub;\n }, [ctx, service, fetch]);\n\n // Fetch on mount and query change\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => { mountedRef.current = false; };\n }, [fetch]);\n\n // Refetch interval\n useEffect(() => {\n if (!options?.refetchInterval || !enabled) return;\n const id = setInterval(fetch, options.refetchInterval);\n return () => clearInterval(id);\n }, [fetch, options?.refetchInterval, enabled]);\n\n return { items, meta, loading, error, refetch: fetch };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n): UseGetResult<T> {\n const ctx = useFauxbaseContext();\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = useCallback(async () => {\n if (!enabled || !id) {\n setData(null);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await service.get(id);\n if (mountedRef.current) {\n setData(result.data);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setData(null);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [service, id, enabled]);\n\n // Subscribe for invalidation\n useEffect(() => {\n const unsub = ctx.subscribe(service, fetch);\n return unsub;\n }, [ctx, service, fetch]);\n\n // Fetch on mount and id change\n useEffect(() => {\n mountedRef.current = true;\n fetch();\n return () => { mountedRef.current = false; };\n }, [fetch]);\n\n return { data, loading, error, refetch: fetch };\n}\n","import { useState, useCallback } from 'react';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n): UseMutationResult<T> {\n const ctx = useFauxbaseContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const create = useCallback(async (data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.create(data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n const update = useCallback(async (id: string, data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.update(id, data);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n const remove = useCallback(async (id: string): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const result = await service.delete(id);\n ctx.invalidate(service);\n return result.data;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [service, ctx]);\n\n return { create, update, remove, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { Service, Entity, EventBus, EventHandler } from 'fauxbase';\nimport { useFauxbaseContext } from './context';\n\nexport function useEvent<T extends Entity>(\n serviceOrResource: Service<T> | string,\n handler: EventHandler<T>,\n): void {\n const ctx = useFauxbaseContext();\n\n useEffect(() => {\n const eventBus: EventBus | undefined = ctx.client._eventBus;\n if (!eventBus) return;\n\n const resource = typeof serviceOrResource === 'string'\n ? serviceOrResource\n : (serviceOrResource as any).resourceName;\n\n return eventBus.on(resource, handler);\n }, [serviceOrResource, handler, ctx.client]);\n}\n","import { useState, useCallback } from 'react';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport { useFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(): UseAuthResult<T> {\n const ctx = useFauxbaseContext();\n const authService = ctx.client.auth;\n\n if (!authService) {\n throw new Error('useAuth requires auth to be configured in createClient');\n }\n\n const [, forceUpdate] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const rerender = useCallback(() => forceUpdate(n => n + 1), []);\n\n const login = useCallback(async (credentials: { email: string; password: string }): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const user = await authService.login(credentials);\n rerender();\n return user;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [authService, rerender]);\n\n const register = useCallback(async (data: Partial<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n const user = await authService.register(data);\n rerender();\n return user;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setLoading(false);\n }\n }, [authService, rerender]);\n\n const logout = useCallback(() => {\n authService.logout();\n rerender();\n }, [authService, rerender]);\n\n const hasRole = useCallback((role: string): boolean => {\n return authService.hasRole(role);\n }, [authService]);\n\n return {\n user: authService.currentUser as T | null,\n isLoggedIn: authService.isLoggedIn,\n token: authService.token,\n login,\n register,\n logout,\n hasRole,\n loading,\n error,\n };\n}\n","import { useState, useEffect, useContext } from 'react';\nimport { FauxbaseContext } from './context';\n\nexport interface UseSyncStatusResult {\n isOnline: boolean;\n isSyncing: boolean;\n pendingCount: number;\n lastSynced: number | null;\n}\n\nexport function useSyncStatus(): UseSyncStatusResult {\n const ctx = useContext(FauxbaseContext);\n const [state, setState] = useState<UseSyncStatusResult>({\n isOnline: true,\n isSyncing: false,\n pendingCount: 0,\n lastSynced: null,\n });\n\n useEffect(() => {\n const eventBus = ctx?.client?._eventBus;\n if (!eventBus) return;\n\n const handler = (event: any) => {\n if (event.data?.type === 'state') {\n setState({\n isOnline: event.data.isOnline,\n isSyncing: event.data.isSyncing,\n pendingCount: event.data.pendingCount,\n lastSynced: event.data.lastSynced,\n });\n }\n };\n\n const unsub = eventBus.on('__sync', handler);\n return unsub;\n }, [ctx]);\n\n return state;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fauxbase-react",
3
- "version": "0.5.9",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",