fauxbase-react 0.4.0 → 0.5.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
@@ -26,6 +26,16 @@ function FauxbaseProvider(props) {
26
26
  };
27
27
  }
28
28
  };
29
+ const eventBus = props.client._eventBus;
30
+ if (eventBus) {
31
+ eventBus.onAny((event) => {
32
+ if (event.source !== "remote") return;
33
+ const svc = props.client[event.resource];
34
+ if (svc) {
35
+ value.invalidate(svc);
36
+ }
37
+ });
38
+ }
29
39
  return react.createElement(FauxbaseContext.Provider, { value }, props.children);
30
40
  }
31
41
  function useFauxbaseContext() {
@@ -182,6 +192,15 @@ function useMutation(service) {
182
192
  }, [service, ctx]);
183
193
  return { create, update, remove, loading, error };
184
194
  }
195
+ function useEvent(serviceOrResource, handler) {
196
+ const ctx = useFauxbaseContext();
197
+ react.useEffect(() => {
198
+ const eventBus = ctx.client._eventBus;
199
+ if (!eventBus) return;
200
+ const resource = typeof serviceOrResource === "string" ? serviceOrResource : serviceOrResource.resourceName;
201
+ return eventBus.on(resource, handler);
202
+ }, [serviceOrResource, handler, ctx.client]);
203
+ }
185
204
  function useAuth() {
186
205
  const ctx = useFauxbaseContext();
187
206
  const authService = ctx.client.auth;
@@ -245,6 +264,7 @@ function useAuth() {
245
264
  exports.FauxbaseContext = FauxbaseContext;
246
265
  exports.FauxbaseProvider = FauxbaseProvider;
247
266
  exports.useAuth = useAuth;
267
+ exports.useEvent = useEvent;
248
268
  exports.useFauxbase = useFauxbase;
249
269
  exports.useFauxbaseContext = useFauxbaseContext;
250
270
  exports.useGet = useGet;
@@ -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-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 } 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 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 { 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"],"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"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { Service, PageMeta, Entity, QueryParams } from 'fauxbase';
2
+ import { Service, PageMeta, Entity, QueryParams, EventHandler } from 'fauxbase';
3
3
 
4
4
  interface UseListResult<T> {
5
5
  items: T[];
@@ -63,6 +63,8 @@ declare function useGet<T extends Entity>(service: Service<T>, id: string | null
63
63
 
64
64
  declare function useMutation<T extends Entity>(service: Service<T>): UseMutationResult<T>;
65
65
 
66
+ declare function useEvent<T extends Entity>(serviceOrResource: Service<T> | string, handler: EventHandler<T>): void;
67
+
66
68
  declare function useAuth<T extends Entity>(): UseAuthResult<T>;
67
69
 
68
- export { FauxbaseContext, type FauxbaseContextValue, FauxbaseProvider, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, useAuth, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
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 };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { Service, PageMeta, Entity, QueryParams } from 'fauxbase';
2
+ import { Service, PageMeta, Entity, QueryParams, EventHandler } from 'fauxbase';
3
3
 
4
4
  interface UseListResult<T> {
5
5
  items: T[];
@@ -63,6 +63,8 @@ declare function useGet<T extends Entity>(service: Service<T>, id: string | null
63
63
 
64
64
  declare function useMutation<T extends Entity>(service: Service<T>): UseMutationResult<T>;
65
65
 
66
+ declare function useEvent<T extends Entity>(serviceOrResource: Service<T> | string, handler: EventHandler<T>): void;
67
+
66
68
  declare function useAuth<T extends Entity>(): UseAuthResult<T>;
67
69
 
68
- export { FauxbaseContext, type FauxbaseContextValue, FauxbaseProvider, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, useAuth, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
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 };
package/dist/index.js CHANGED
@@ -24,6 +24,16 @@ function FauxbaseProvider(props) {
24
24
  };
25
25
  }
26
26
  };
27
+ const eventBus = props.client._eventBus;
28
+ if (eventBus) {
29
+ eventBus.onAny((event) => {
30
+ if (event.source !== "remote") return;
31
+ const svc = props.client[event.resource];
32
+ if (svc) {
33
+ value.invalidate(svc);
34
+ }
35
+ });
36
+ }
27
37
  return createElement(FauxbaseContext.Provider, { value }, props.children);
28
38
  }
29
39
  function useFauxbaseContext() {
@@ -180,6 +190,15 @@ function useMutation(service) {
180
190
  }, [service, ctx]);
181
191
  return { create, update, remove, loading, error };
182
192
  }
193
+ function useEvent(serviceOrResource, handler) {
194
+ const ctx = useFauxbaseContext();
195
+ useEffect(() => {
196
+ const eventBus = ctx.client._eventBus;
197
+ if (!eventBus) return;
198
+ const resource = typeof serviceOrResource === "string" ? serviceOrResource : serviceOrResource.resourceName;
199
+ return eventBus.on(resource, handler);
200
+ }, [serviceOrResource, handler, ctx.client]);
201
+ }
183
202
  function useAuth() {
184
203
  const ctx = useFauxbaseContext();
185
204
  const authService = ctx.client.auth;
@@ -240,6 +259,6 @@ function useAuth() {
240
259
  };
241
260
  }
242
261
 
243
- export { FauxbaseContext, FauxbaseProvider, useAuth, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
262
+ export { FauxbaseContext, FauxbaseProvider, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
244
263
  //# sourceMappingURL=index.js.map
245
264
  //# 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-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 } 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 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 { 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"],"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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fauxbase-react",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "peerDependencies": {
24
24
  "react": ">=18",
25
- "fauxbase": ">=0.4.0"
25
+ "fauxbase": ">=0.5.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "react": "^18.3.0",