fauxbase-vue 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
@@ -27,6 +27,16 @@ var FauxbasePlugin = {
27
27
  };
28
28
  }
29
29
  };
30
+ const eventBus = options.client._eventBus;
31
+ if (eventBus) {
32
+ eventBus.onAny((event) => {
33
+ if (event.source !== "remote") return;
34
+ const svc = options.client[event.resource];
35
+ if (svc) {
36
+ value.invalidate(svc);
37
+ }
38
+ });
39
+ }
30
40
  app.provide(FAUXBASE_KEY, value);
31
41
  }
32
42
  };
@@ -52,6 +62,16 @@ function provideFauxbase(client) {
52
62
  };
53
63
  }
54
64
  };
65
+ const eventBus = client._eventBus;
66
+ if (eventBus) {
67
+ eventBus.onAny((event) => {
68
+ if (event.source !== "remote") return;
69
+ const svc = client[event.resource];
70
+ if (svc) {
71
+ value.invalidate(svc);
72
+ }
73
+ });
74
+ }
55
75
  vue.provide(FAUXBASE_KEY, value);
56
76
  }
57
77
  function useFauxbaseContext() {
@@ -216,6 +236,14 @@ function useMutation(service) {
216
236
  };
217
237
  return { create, update, remove, loading, error };
218
238
  }
239
+ function useEvent(serviceOrResource, handler) {
240
+ const ctx = useFauxbaseContext();
241
+ const eventBus = ctx.client._eventBus;
242
+ if (!eventBus) return;
243
+ const resource = typeof serviceOrResource === "string" ? serviceOrResource : serviceOrResource.resourceName;
244
+ const unsub = eventBus.on(resource, handler);
245
+ vue.onUnmounted(unsub);
246
+ }
219
247
  function useAuth() {
220
248
  const ctx = useFauxbaseContext();
221
249
  const authService = ctx.client.auth;
@@ -281,6 +309,7 @@ exports.FAUXBASE_KEY = FAUXBASE_KEY;
281
309
  exports.FauxbasePlugin = FauxbasePlugin;
282
310
  exports.provideFauxbase = provideFauxbase;
283
311
  exports.useAuth = useAuth;
312
+ exports.useEvent = useEvent;
284
313
  exports.useFauxbase = useFauxbase;
285
314
  exports.useFauxbaseContext = useFauxbaseContext;
286
315
  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":["provide","inject","ref","onMounted","onUnmounted","watch"],"mappings":"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","file":"index.cjs","sourcesContent":["import { inject, provide } from 'vue';\nimport type { App, InjectionKey } from 'vue';\nimport type { Service } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY: InjectionKey<FauxbaseContextValue> = Symbol('fauxbase');\n\n// --- Plugin (app.use) ---\n\nexport const FauxbasePlugin = {\n install(app: App, options: { client: any }) {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client: options.client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.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 (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n app.provide(FAUXBASE_KEY, value);\n },\n};\n\n// --- Manual provide (for Composition API without plugin) ---\n\nexport function provideFauxbase(client: any): void {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.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 (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n provide(FAUXBASE_KEY, value);\n}\n\n// --- Inject ---\n\nexport function useFauxbaseContext(): FauxbaseContextValue {\n const ctx = inject(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('useFauxbaseContext requires FauxbasePlugin to be installed or provideFauxbase to be called');\n }\n return ctx;\n}\n\nexport { FAUXBASE_KEY };\n","import { useFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = useFauxbaseContext();\n return ctx.client;\n}\n","import { ref, watch, onMounted, onUnmounted } from 'vue';\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 = ref<T[]>([]) as UseListResult<T>['items'];\n const meta = ref<PageMeta | null>(null) as UseListResult<T>['meta'];\n const loading = ref(true);\n const error = ref<Error | null>(null);\n let mounted = true;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.value = true;\n error.value = null;\n try {\n const result = await service.list(query);\n if (mounted) {\n items.value = result.items;\n meta.value = result.meta;\n }\n } catch (err) {\n if (mounted) {\n error.value = err instanceof Error ? err : new Error(String(err));\n }\n } finally {\n if (mounted) {\n loading.value = false;\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Fetch on mount\n onMounted(() => {\n fetch();\n });\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n onMounted(() => {\n intervalId = setInterval(fetch, options.refetchInterval);\n });\n }\n\n onUnmounted(() => {\n mounted = false;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n\n // Watch query changes\n watch(\n () => JSON.stringify(query),\n () => { fetch(); },\n );\n\n return { items, meta, loading, error, refetch: fetch };\n}\n","import { ref, watch, onMounted, onUnmounted } from 'vue';\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 = ref<T | null>(null) as UseGetResult<T>['data'];\n const loading = ref(true);\n const error = ref<Error | null>(null);\n let mounted = true;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.value = null;\n loading.value = false;\n return;\n }\n loading.value = true;\n error.value = null;\n try {\n const result = await service.get(id);\n if (mounted) {\n data.value = result.data;\n }\n } catch (err) {\n if (mounted) {\n error.value = err instanceof Error ? err : new Error(String(err));\n data.value = null;\n }\n } finally {\n if (mounted) {\n loading.value = false;\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n onMounted(() => {\n fetch();\n });\n\n onUnmounted(() => {\n mounted = false;\n unsub();\n });\n\n // Watch id changes\n watch(\n () => id,\n () => { fetch(); },\n );\n\n return { data, loading, error, refetch: fetch };\n}\n","import { ref } from 'vue';\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 = ref(false);\n const error = ref<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n return { create, update, remove, loading, error };\n}\n","import { ref } from 'vue';\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 tick = ref(0);\n const loading = ref(false);\n const error = ref<Error | null>(null);\n\n const rerender = () => { tick.value++; };\n\n const user = ref<T | null>(authService.currentUser) as UseAuthResult<T>['user'];\n const isLoggedIn = ref(authService.isLoggedIn);\n const token = ref<string | null>(authService.token);\n\n const syncState = () => {\n user.value = authService.currentUser;\n isLoggedIn.value = authService.isLoggedIn;\n token.value = authService.token;\n rerender();\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.value = true;\n error.value = null;\n try {\n const result = await authService.login(credentials);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = null;\n try {\n const result = await authService.register(data);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const logout = () => {\n authService.logout();\n syncState();\n };\n\n const hasRole = (role: string): boolean => {\n return authService.hasRole(role);\n };\n\n return { user, isLoggedIn, token, login, register, logout, hasRole, loading, error };\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":["provide","inject","ref","onMounted","onUnmounted","watch"],"mappings":"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","file":"index.cjs","sourcesContent":["import { inject, provide } from 'vue';\nimport type { App, InjectionKey } from 'vue';\nimport type { Service, EventBus } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY: InjectionKey<FauxbaseContextValue> = Symbol('fauxbase');\n\n// --- Plugin (app.use) ---\n\nexport const FauxbasePlugin = {\n install(app: App, options: { client: any }) {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client: options.client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.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 (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = options.client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = options.client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n app.provide(FAUXBASE_KEY, value);\n },\n};\n\n// --- Manual provide (for Composition API without plugin) ---\n\nexport function provideFauxbase(client: any): void {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.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 (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n provide(FAUXBASE_KEY, value);\n}\n\n// --- Inject ---\n\nexport function useFauxbaseContext(): FauxbaseContextValue {\n const ctx = inject(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('useFauxbaseContext requires FauxbasePlugin to be installed or provideFauxbase to be called');\n }\n return ctx;\n}\n\nexport { FAUXBASE_KEY };\n","import { useFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = useFauxbaseContext();\n return ctx.client;\n}\n","import { ref, watch, onMounted, onUnmounted } from 'vue';\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 = ref<T[]>([]) as UseListResult<T>['items'];\n const meta = ref<PageMeta | null>(null) as UseListResult<T>['meta'];\n const loading = ref(true);\n const error = ref<Error | null>(null);\n let mounted = true;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.value = true;\n error.value = null;\n try {\n const result = await service.list(query);\n if (mounted) {\n items.value = result.items;\n meta.value = result.meta;\n }\n } catch (err) {\n if (mounted) {\n error.value = err instanceof Error ? err : new Error(String(err));\n }\n } finally {\n if (mounted) {\n loading.value = false;\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Fetch on mount\n onMounted(() => {\n fetch();\n });\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n onMounted(() => {\n intervalId = setInterval(fetch, options.refetchInterval);\n });\n }\n\n onUnmounted(() => {\n mounted = false;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n\n // Watch query changes\n watch(\n () => JSON.stringify(query),\n () => { fetch(); },\n );\n\n return { items, meta, loading, error, refetch: fetch };\n}\n","import { ref, watch, onMounted, onUnmounted } from 'vue';\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 = ref<T | null>(null) as UseGetResult<T>['data'];\n const loading = ref(true);\n const error = ref<Error | null>(null);\n let mounted = true;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.value = null;\n loading.value = false;\n return;\n }\n loading.value = true;\n error.value = null;\n try {\n const result = await service.get(id);\n if (mounted) {\n data.value = result.data;\n }\n } catch (err) {\n if (mounted) {\n error.value = err instanceof Error ? err : new Error(String(err));\n data.value = null;\n }\n } finally {\n if (mounted) {\n loading.value = false;\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n onMounted(() => {\n fetch();\n });\n\n onUnmounted(() => {\n mounted = false;\n unsub();\n });\n\n // Watch id changes\n watch(\n () => id,\n () => { fetch(); },\n );\n\n return { data, loading, error, refetch: fetch };\n}\n","import { ref } from 'vue';\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 = ref(false);\n const error = ref<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n return { create, update, remove, loading, error };\n}\n","import { onUnmounted } from 'vue';\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 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 const unsub = eventBus.on(resource, handler);\n onUnmounted(unsub);\n}\n","import { ref } from 'vue';\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 tick = ref(0);\n const loading = ref(false);\n const error = ref<Error | null>(null);\n\n const rerender = () => { tick.value++; };\n\n const user = ref<T | null>(authService.currentUser) as UseAuthResult<T>['user'];\n const isLoggedIn = ref(authService.isLoggedIn);\n const token = ref<string | null>(authService.token);\n\n const syncState = () => {\n user.value = authService.currentUser;\n isLoggedIn.value = authService.isLoggedIn;\n token.value = authService.token;\n rerender();\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.value = true;\n error.value = null;\n try {\n const result = await authService.login(credentials);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = null;\n try {\n const result = await authService.register(data);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const logout = () => {\n authService.logout();\n syncState();\n };\n\n const hasRole = (role: string): boolean => {\n return authService.hasRole(role);\n };\n\n return { user, isLoggedIn, token, login, register, logout, hasRole, loading, error };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Ref, InjectionKey, App } from 'vue';
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: Ref<T[]>;
@@ -65,6 +65,8 @@ declare function useGet<T extends Entity>(service: Service<T>, id: string | null
65
65
 
66
66
  declare function useMutation<T extends Entity>(service: Service<T>): UseMutationResult<T>;
67
67
 
68
+ declare function useEvent<T extends Entity>(serviceOrResource: Service<T> | string, handler: EventHandler<T>): void;
69
+
68
70
  declare function useAuth<T extends Entity>(): UseAuthResult<T>;
69
71
 
70
- export { FAUXBASE_KEY, type FauxbaseContextValue, FauxbasePlugin, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, provideFauxbase, useAuth, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
72
+ export { FAUXBASE_KEY, type FauxbaseContextValue, FauxbasePlugin, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, provideFauxbase, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Ref, InjectionKey, App } from 'vue';
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: Ref<T[]>;
@@ -65,6 +65,8 @@ declare function useGet<T extends Entity>(service: Service<T>, id: string | null
65
65
 
66
66
  declare function useMutation<T extends Entity>(service: Service<T>): UseMutationResult<T>;
67
67
 
68
+ declare function useEvent<T extends Entity>(serviceOrResource: Service<T> | string, handler: EventHandler<T>): void;
69
+
68
70
  declare function useAuth<T extends Entity>(): UseAuthResult<T>;
69
71
 
70
- export { FAUXBASE_KEY, type FauxbaseContextValue, FauxbasePlugin, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, provideFauxbase, useAuth, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
72
+ export { FAUXBASE_KEY, type FauxbaseContextValue, FauxbasePlugin, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, provideFauxbase, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
package/dist/index.js CHANGED
@@ -25,6 +25,16 @@ var FauxbasePlugin = {
25
25
  };
26
26
  }
27
27
  };
28
+ const eventBus = options.client._eventBus;
29
+ if (eventBus) {
30
+ eventBus.onAny((event) => {
31
+ if (event.source !== "remote") return;
32
+ const svc = options.client[event.resource];
33
+ if (svc) {
34
+ value.invalidate(svc);
35
+ }
36
+ });
37
+ }
28
38
  app.provide(FAUXBASE_KEY, value);
29
39
  }
30
40
  };
@@ -50,6 +60,16 @@ function provideFauxbase(client) {
50
60
  };
51
61
  }
52
62
  };
63
+ const eventBus = client._eventBus;
64
+ if (eventBus) {
65
+ eventBus.onAny((event) => {
66
+ if (event.source !== "remote") return;
67
+ const svc = client[event.resource];
68
+ if (svc) {
69
+ value.invalidate(svc);
70
+ }
71
+ });
72
+ }
53
73
  provide(FAUXBASE_KEY, value);
54
74
  }
55
75
  function useFauxbaseContext() {
@@ -214,6 +234,14 @@ function useMutation(service) {
214
234
  };
215
235
  return { create, update, remove, loading, error };
216
236
  }
237
+ function useEvent(serviceOrResource, handler) {
238
+ const ctx = useFauxbaseContext();
239
+ const eventBus = ctx.client._eventBus;
240
+ if (!eventBus) return;
241
+ const resource = typeof serviceOrResource === "string" ? serviceOrResource : serviceOrResource.resourceName;
242
+ const unsub = eventBus.on(resource, handler);
243
+ onUnmounted(unsub);
244
+ }
217
245
  function useAuth() {
218
246
  const ctx = useFauxbaseContext();
219
247
  const authService = ctx.client.auth;
@@ -275,6 +303,6 @@ function useAuth() {
275
303
  return { user, isLoggedIn, token, login, register, logout, hasRole, loading, error };
276
304
  }
277
305
 
278
- export { FAUXBASE_KEY, FauxbasePlugin, provideFauxbase, useAuth, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
306
+ export { FAUXBASE_KEY, FauxbasePlugin, provideFauxbase, useAuth, useEvent, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
279
307
  //# sourceMappingURL=index.js.map
280
308
  //# 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":["ref","onMounted","onUnmounted","watch"],"mappings":"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","file":"index.js","sourcesContent":["import { inject, provide } from 'vue';\nimport type { App, InjectionKey } from 'vue';\nimport type { Service } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY: InjectionKey<FauxbaseContextValue> = Symbol('fauxbase');\n\n// --- Plugin (app.use) ---\n\nexport const FauxbasePlugin = {\n install(app: App, options: { client: any }) {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client: options.client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.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 (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n app.provide(FAUXBASE_KEY, value);\n },\n};\n\n// --- Manual provide (for Composition API without plugin) ---\n\nexport function provideFauxbase(client: any): void {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.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 (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n provide(FAUXBASE_KEY, value);\n}\n\n// --- Inject ---\n\nexport function useFauxbaseContext(): FauxbaseContextValue {\n const ctx = inject(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('useFauxbaseContext requires FauxbasePlugin to be installed or provideFauxbase to be called');\n }\n return ctx;\n}\n\nexport { FAUXBASE_KEY };\n","import { useFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = useFauxbaseContext();\n return ctx.client;\n}\n","import { ref, watch, onMounted, onUnmounted } from 'vue';\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 = ref<T[]>([]) as UseListResult<T>['items'];\n const meta = ref<PageMeta | null>(null) as UseListResult<T>['meta'];\n const loading = ref(true);\n const error = ref<Error | null>(null);\n let mounted = true;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.value = true;\n error.value = null;\n try {\n const result = await service.list(query);\n if (mounted) {\n items.value = result.items;\n meta.value = result.meta;\n }\n } catch (err) {\n if (mounted) {\n error.value = err instanceof Error ? err : new Error(String(err));\n }\n } finally {\n if (mounted) {\n loading.value = false;\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Fetch on mount\n onMounted(() => {\n fetch();\n });\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n onMounted(() => {\n intervalId = setInterval(fetch, options.refetchInterval);\n });\n }\n\n onUnmounted(() => {\n mounted = false;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n\n // Watch query changes\n watch(\n () => JSON.stringify(query),\n () => { fetch(); },\n );\n\n return { items, meta, loading, error, refetch: fetch };\n}\n","import { ref, watch, onMounted, onUnmounted } from 'vue';\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 = ref<T | null>(null) as UseGetResult<T>['data'];\n const loading = ref(true);\n const error = ref<Error | null>(null);\n let mounted = true;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.value = null;\n loading.value = false;\n return;\n }\n loading.value = true;\n error.value = null;\n try {\n const result = await service.get(id);\n if (mounted) {\n data.value = result.data;\n }\n } catch (err) {\n if (mounted) {\n error.value = err instanceof Error ? err : new Error(String(err));\n data.value = null;\n }\n } finally {\n if (mounted) {\n loading.value = false;\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n onMounted(() => {\n fetch();\n });\n\n onUnmounted(() => {\n mounted = false;\n unsub();\n });\n\n // Watch id changes\n watch(\n () => id,\n () => { fetch(); },\n );\n\n return { data, loading, error, refetch: fetch };\n}\n","import { ref } from 'vue';\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 = ref(false);\n const error = ref<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n return { create, update, remove, loading, error };\n}\n","import { ref } from 'vue';\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 tick = ref(0);\n const loading = ref(false);\n const error = ref<Error | null>(null);\n\n const rerender = () => { tick.value++; };\n\n const user = ref<T | null>(authService.currentUser) as UseAuthResult<T>['user'];\n const isLoggedIn = ref(authService.isLoggedIn);\n const token = ref<string | null>(authService.token);\n\n const syncState = () => {\n user.value = authService.currentUser;\n isLoggedIn.value = authService.isLoggedIn;\n token.value = authService.token;\n rerender();\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.value = true;\n error.value = null;\n try {\n const result = await authService.login(credentials);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = null;\n try {\n const result = await authService.register(data);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const logout = () => {\n authService.logout();\n syncState();\n };\n\n const hasRole = (role: string): boolean => {\n return authService.hasRole(role);\n };\n\n return { user, isLoggedIn, token, login, register, logout, hasRole, loading, error };\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":["ref","onMounted","onUnmounted","watch"],"mappings":"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","file":"index.js","sourcesContent":["import { inject, provide } from 'vue';\nimport type { App, InjectionKey } from 'vue';\nimport type { Service, EventBus } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY: InjectionKey<FauxbaseContextValue> = Symbol('fauxbase');\n\n// --- Plugin (app.use) ---\n\nexport const FauxbasePlugin = {\n install(app: App, options: { client: any }) {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client: options.client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.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 (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = options.client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = options.client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n app.provide(FAUXBASE_KEY, value);\n },\n};\n\n// --- Manual provide (for Composition API without plugin) ---\n\nexport function provideFauxbase(client: any): void {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n const value: FauxbaseContextValue = {\n client,\n invalidate: (service: Service<any>) => {\n const subscribers = registry.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 (!registry.has(service)) {\n registry.set(service, new Set());\n }\n registry.get(service)!.add(refetchFn);\n return () => {\n registry.get(service)?.delete(refetchFn);\n };\n },\n };\n\n // Bridge remote events → auto-invalidation\n const eventBus: EventBus | undefined = client._eventBus;\n if (eventBus) {\n eventBus.onAny((event) => {\n if (event.source !== 'remote') return;\n const svc = client[event.resource];\n if (svc) {\n value.invalidate(svc);\n }\n });\n }\n\n provide(FAUXBASE_KEY, value);\n}\n\n// --- Inject ---\n\nexport function useFauxbaseContext(): FauxbaseContextValue {\n const ctx = inject(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('useFauxbaseContext requires FauxbasePlugin to be installed or provideFauxbase to be called');\n }\n return ctx;\n}\n\nexport { FAUXBASE_KEY };\n","import { useFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = useFauxbaseContext();\n return ctx.client;\n}\n","import { ref, watch, onMounted, onUnmounted } from 'vue';\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 = ref<T[]>([]) as UseListResult<T>['items'];\n const meta = ref<PageMeta | null>(null) as UseListResult<T>['meta'];\n const loading = ref(true);\n const error = ref<Error | null>(null);\n let mounted = true;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.value = true;\n error.value = null;\n try {\n const result = await service.list(query);\n if (mounted) {\n items.value = result.items;\n meta.value = result.meta;\n }\n } catch (err) {\n if (mounted) {\n error.value = err instanceof Error ? err : new Error(String(err));\n }\n } finally {\n if (mounted) {\n loading.value = false;\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Fetch on mount\n onMounted(() => {\n fetch();\n });\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n onMounted(() => {\n intervalId = setInterval(fetch, options.refetchInterval);\n });\n }\n\n onUnmounted(() => {\n mounted = false;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n\n // Watch query changes\n watch(\n () => JSON.stringify(query),\n () => { fetch(); },\n );\n\n return { items, meta, loading, error, refetch: fetch };\n}\n","import { ref, watch, onMounted, onUnmounted } from 'vue';\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 = ref<T | null>(null) as UseGetResult<T>['data'];\n const loading = ref(true);\n const error = ref<Error | null>(null);\n let mounted = true;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.value = null;\n loading.value = false;\n return;\n }\n loading.value = true;\n error.value = null;\n try {\n const result = await service.get(id);\n if (mounted) {\n data.value = result.data;\n }\n } catch (err) {\n if (mounted) {\n error.value = err instanceof Error ? err : new Error(String(err));\n data.value = null;\n }\n } finally {\n if (mounted) {\n loading.value = false;\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n onMounted(() => {\n fetch();\n });\n\n onUnmounted(() => {\n mounted = false;\n unsub();\n });\n\n // Watch id changes\n watch(\n () => id,\n () => { fetch(); },\n );\n\n return { data, loading, error, refetch: fetch };\n}\n","import { ref } from 'vue';\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 = ref(false);\n const error = ref<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.value = true;\n error.value = 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 error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n return { create, update, remove, loading, error };\n}\n","import { onUnmounted } from 'vue';\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 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 const unsub = eventBus.on(resource, handler);\n onUnmounted(unsub);\n}\n","import { ref } from 'vue';\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 tick = ref(0);\n const loading = ref(false);\n const error = ref<Error | null>(null);\n\n const rerender = () => { tick.value++; };\n\n const user = ref<T | null>(authService.currentUser) as UseAuthResult<T>['user'];\n const isLoggedIn = ref(authService.isLoggedIn);\n const token = ref<string | null>(authService.token);\n\n const syncState = () => {\n user.value = authService.currentUser;\n isLoggedIn.value = authService.isLoggedIn;\n token.value = authService.token;\n rerender();\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.value = true;\n error.value = null;\n try {\n const result = await authService.login(credentials);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.value = true;\n error.value = null;\n try {\n const result = await authService.register(data);\n syncState();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.value = e;\n throw e;\n } finally {\n loading.value = false;\n }\n };\n\n const logout = () => {\n authService.logout();\n syncState();\n };\n\n const hasRole = (role: string): boolean => {\n return authService.hasRole(role);\n };\n\n return { user, isLoggedIn, token, login, register, logout, hasRole, loading, error };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fauxbase-vue",
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
  "vue": ">=3.3",
25
- "fauxbase": ">=0.4.0"
25
+ "fauxbase": ">=0.5.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "vue": "^3.5.0",