fauxbase-vue 0.4.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 ADDED
@@ -0,0 +1,290 @@
1
+ 'use strict';
2
+
3
+ var vue = require('vue');
4
+
5
+ // src/context.ts
6
+ var FAUXBASE_KEY = /* @__PURE__ */ Symbol("fauxbase");
7
+ var FauxbasePlugin = {
8
+ install(app, options) {
9
+ const registry = /* @__PURE__ */ new Map();
10
+ const value = {
11
+ client: options.client,
12
+ invalidate: (service) => {
13
+ const subscribers = registry.get(service);
14
+ if (subscribers) {
15
+ for (const fn of subscribers) {
16
+ fn();
17
+ }
18
+ }
19
+ },
20
+ subscribe: (service, refetchFn) => {
21
+ if (!registry.has(service)) {
22
+ registry.set(service, /* @__PURE__ */ new Set());
23
+ }
24
+ registry.get(service).add(refetchFn);
25
+ return () => {
26
+ registry.get(service)?.delete(refetchFn);
27
+ };
28
+ }
29
+ };
30
+ app.provide(FAUXBASE_KEY, value);
31
+ }
32
+ };
33
+ function provideFauxbase(client) {
34
+ const registry = /* @__PURE__ */ new Map();
35
+ const value = {
36
+ client,
37
+ invalidate: (service) => {
38
+ const subscribers = registry.get(service);
39
+ if (subscribers) {
40
+ for (const fn of subscribers) {
41
+ fn();
42
+ }
43
+ }
44
+ },
45
+ subscribe: (service, refetchFn) => {
46
+ if (!registry.has(service)) {
47
+ registry.set(service, /* @__PURE__ */ new Set());
48
+ }
49
+ registry.get(service).add(refetchFn);
50
+ return () => {
51
+ registry.get(service)?.delete(refetchFn);
52
+ };
53
+ }
54
+ };
55
+ vue.provide(FAUXBASE_KEY, value);
56
+ }
57
+ function useFauxbaseContext() {
58
+ const ctx = vue.inject(FAUXBASE_KEY);
59
+ if (!ctx) {
60
+ throw new Error("useFauxbaseContext requires FauxbasePlugin to be installed or provideFauxbase to be called");
61
+ }
62
+ return ctx;
63
+ }
64
+
65
+ // src/use-fauxbase.ts
66
+ function useFauxbase() {
67
+ const ctx = useFauxbaseContext();
68
+ return ctx.client;
69
+ }
70
+ function useList(service, query, options) {
71
+ const ctx = useFauxbaseContext();
72
+ const items = vue.ref([]);
73
+ const meta = vue.ref(null);
74
+ const loading = vue.ref(true);
75
+ const error = vue.ref(null);
76
+ let mounted = true;
77
+ const enabled = options?.enabled !== false;
78
+ const fetch = async () => {
79
+ if (!enabled) return;
80
+ loading.value = true;
81
+ error.value = null;
82
+ try {
83
+ const result = await service.list(query);
84
+ if (mounted) {
85
+ items.value = result.items;
86
+ meta.value = result.meta;
87
+ }
88
+ } catch (err) {
89
+ if (mounted) {
90
+ error.value = err instanceof Error ? err : new Error(String(err));
91
+ }
92
+ } finally {
93
+ if (mounted) {
94
+ loading.value = false;
95
+ }
96
+ }
97
+ };
98
+ const unsub = ctx.subscribe(service, fetch);
99
+ vue.onMounted(() => {
100
+ fetch();
101
+ });
102
+ let intervalId;
103
+ if (options?.refetchInterval && enabled) {
104
+ vue.onMounted(() => {
105
+ intervalId = setInterval(fetch, options.refetchInterval);
106
+ });
107
+ }
108
+ vue.onUnmounted(() => {
109
+ mounted = false;
110
+ unsub();
111
+ if (intervalId) clearInterval(intervalId);
112
+ });
113
+ vue.watch(
114
+ () => JSON.stringify(query),
115
+ () => {
116
+ fetch();
117
+ }
118
+ );
119
+ return { items, meta, loading, error, refetch: fetch };
120
+ }
121
+ function useGet(service, id, options) {
122
+ const ctx = useFauxbaseContext();
123
+ const data = vue.ref(null);
124
+ const loading = vue.ref(true);
125
+ const error = vue.ref(null);
126
+ let mounted = true;
127
+ const enabled = options?.enabled !== false && id != null;
128
+ const fetch = async () => {
129
+ if (!enabled || !id) {
130
+ data.value = null;
131
+ loading.value = false;
132
+ return;
133
+ }
134
+ loading.value = true;
135
+ error.value = null;
136
+ try {
137
+ const result = await service.get(id);
138
+ if (mounted) {
139
+ data.value = result.data;
140
+ }
141
+ } catch (err) {
142
+ if (mounted) {
143
+ error.value = err instanceof Error ? err : new Error(String(err));
144
+ data.value = null;
145
+ }
146
+ } finally {
147
+ if (mounted) {
148
+ loading.value = false;
149
+ }
150
+ }
151
+ };
152
+ const unsub = ctx.subscribe(service, fetch);
153
+ vue.onMounted(() => {
154
+ fetch();
155
+ });
156
+ vue.onUnmounted(() => {
157
+ mounted = false;
158
+ unsub();
159
+ });
160
+ vue.watch(
161
+ () => id,
162
+ () => {
163
+ fetch();
164
+ }
165
+ );
166
+ return { data, loading, error, refetch: fetch };
167
+ }
168
+ function useMutation(service) {
169
+ const ctx = useFauxbaseContext();
170
+ const loading = vue.ref(false);
171
+ const error = vue.ref(null);
172
+ const create = async (data) => {
173
+ loading.value = true;
174
+ error.value = null;
175
+ try {
176
+ const result = await service.create(data);
177
+ ctx.invalidate(service);
178
+ return result.data;
179
+ } catch (err) {
180
+ const e = err instanceof Error ? err : new Error(String(err));
181
+ error.value = e;
182
+ throw e;
183
+ } finally {
184
+ loading.value = false;
185
+ }
186
+ };
187
+ const update = async (id, data) => {
188
+ loading.value = true;
189
+ error.value = null;
190
+ try {
191
+ const result = await service.update(id, data);
192
+ ctx.invalidate(service);
193
+ return result.data;
194
+ } catch (err) {
195
+ const e = err instanceof Error ? err : new Error(String(err));
196
+ error.value = e;
197
+ throw e;
198
+ } finally {
199
+ loading.value = false;
200
+ }
201
+ };
202
+ const remove = async (id) => {
203
+ loading.value = true;
204
+ error.value = null;
205
+ try {
206
+ const result = await service.delete(id);
207
+ ctx.invalidate(service);
208
+ return result.data;
209
+ } catch (err) {
210
+ const e = err instanceof Error ? err : new Error(String(err));
211
+ error.value = e;
212
+ throw e;
213
+ } finally {
214
+ loading.value = false;
215
+ }
216
+ };
217
+ return { create, update, remove, loading, error };
218
+ }
219
+ function useAuth() {
220
+ const ctx = useFauxbaseContext();
221
+ const authService = ctx.client.auth;
222
+ if (!authService) {
223
+ throw new Error("useAuth requires auth to be configured in createClient");
224
+ }
225
+ const tick = vue.ref(0);
226
+ const loading = vue.ref(false);
227
+ const error = vue.ref(null);
228
+ const rerender = () => {
229
+ tick.value++;
230
+ };
231
+ const user = vue.ref(authService.currentUser);
232
+ const isLoggedIn = vue.ref(authService.isLoggedIn);
233
+ const token = vue.ref(authService.token);
234
+ const syncState = () => {
235
+ user.value = authService.currentUser;
236
+ isLoggedIn.value = authService.isLoggedIn;
237
+ token.value = authService.token;
238
+ rerender();
239
+ };
240
+ const login = async (credentials) => {
241
+ loading.value = true;
242
+ error.value = null;
243
+ try {
244
+ const result = await authService.login(credentials);
245
+ syncState();
246
+ return result;
247
+ } catch (err) {
248
+ const e = err instanceof Error ? err : new Error(String(err));
249
+ error.value = e;
250
+ throw e;
251
+ } finally {
252
+ loading.value = false;
253
+ }
254
+ };
255
+ const register = async (data) => {
256
+ loading.value = true;
257
+ error.value = null;
258
+ try {
259
+ const result = await authService.register(data);
260
+ syncState();
261
+ return result;
262
+ } catch (err) {
263
+ const e = err instanceof Error ? err : new Error(String(err));
264
+ error.value = e;
265
+ throw e;
266
+ } finally {
267
+ loading.value = false;
268
+ }
269
+ };
270
+ const logout = () => {
271
+ authService.logout();
272
+ syncState();
273
+ };
274
+ const hasRole = (role) => {
275
+ return authService.hasRole(role);
276
+ };
277
+ return { user, isLoggedIn, token, login, register, logout, hasRole, loading, error };
278
+ }
279
+
280
+ exports.FAUXBASE_KEY = FAUXBASE_KEY;
281
+ exports.FauxbasePlugin = FauxbasePlugin;
282
+ exports.provideFauxbase = provideFauxbase;
283
+ exports.useAuth = useAuth;
284
+ exports.useFauxbase = useFauxbase;
285
+ exports.useFauxbaseContext = useFauxbaseContext;
286
+ exports.useGet = useGet;
287
+ exports.useList = useList;
288
+ exports.useMutation = useMutation;
289
+ //# sourceMappingURL=index.cjs.map
290
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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"]}
@@ -0,0 +1,70 @@
1
+ import { Ref, InjectionKey, App } from 'vue';
2
+ import { Service, PageMeta, Entity, QueryParams } from 'fauxbase';
3
+
4
+ interface UseListResult<T> {
5
+ items: Ref<T[]>;
6
+ meta: Ref<PageMeta | null>;
7
+ loading: Ref<boolean>;
8
+ error: Ref<Error | null>;
9
+ refetch: () => void;
10
+ }
11
+ interface UseGetResult<T> {
12
+ data: Ref<T | null>;
13
+ loading: Ref<boolean>;
14
+ error: Ref<Error | null>;
15
+ refetch: () => void;
16
+ }
17
+ interface UseMutationResult<T> {
18
+ create: (data: Partial<T>) => Promise<T>;
19
+ update: (id: string, data: Partial<T>) => Promise<T>;
20
+ remove: (id: string) => Promise<T>;
21
+ loading: Ref<boolean>;
22
+ error: Ref<Error | null>;
23
+ }
24
+ interface UseAuthResult<T> {
25
+ user: Ref<T | null>;
26
+ isLoggedIn: Ref<boolean>;
27
+ token: Ref<string | null>;
28
+ login: (credentials: {
29
+ email: string;
30
+ password: string;
31
+ }) => Promise<T>;
32
+ register: (data: Partial<T>) => Promise<T>;
33
+ logout: () => void;
34
+ hasRole: (role: string) => boolean;
35
+ loading: Ref<boolean>;
36
+ error: Ref<Error | null>;
37
+ }
38
+ interface UseListOptions {
39
+ enabled?: boolean;
40
+ refetchInterval?: number;
41
+ }
42
+ interface UseGetOptions {
43
+ enabled?: boolean;
44
+ }
45
+ interface FauxbaseContextValue {
46
+ client: any;
47
+ invalidate: (service: Service<any>) => void;
48
+ subscribe: (service: Service<any>, refetchFn: () => void) => () => void;
49
+ }
50
+
51
+ declare const FAUXBASE_KEY: InjectionKey<FauxbaseContextValue>;
52
+ declare const FauxbasePlugin: {
53
+ install(app: App, options: {
54
+ client: any;
55
+ }): void;
56
+ };
57
+ declare function provideFauxbase(client: any): void;
58
+ declare function useFauxbaseContext(): FauxbaseContextValue;
59
+
60
+ declare function useFauxbase(): any;
61
+
62
+ declare function useList<T extends Entity>(service: Service<T>, query?: QueryParams, options?: UseListOptions): UseListResult<T>;
63
+
64
+ declare function useGet<T extends Entity>(service: Service<T>, id: string | null | undefined, options?: UseGetOptions): UseGetResult<T>;
65
+
66
+ declare function useMutation<T extends Entity>(service: Service<T>): UseMutationResult<T>;
67
+
68
+ declare function useAuth<T extends Entity>(): UseAuthResult<T>;
69
+
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 };
@@ -0,0 +1,70 @@
1
+ import { Ref, InjectionKey, App } from 'vue';
2
+ import { Service, PageMeta, Entity, QueryParams } from 'fauxbase';
3
+
4
+ interface UseListResult<T> {
5
+ items: Ref<T[]>;
6
+ meta: Ref<PageMeta | null>;
7
+ loading: Ref<boolean>;
8
+ error: Ref<Error | null>;
9
+ refetch: () => void;
10
+ }
11
+ interface UseGetResult<T> {
12
+ data: Ref<T | null>;
13
+ loading: Ref<boolean>;
14
+ error: Ref<Error | null>;
15
+ refetch: () => void;
16
+ }
17
+ interface UseMutationResult<T> {
18
+ create: (data: Partial<T>) => Promise<T>;
19
+ update: (id: string, data: Partial<T>) => Promise<T>;
20
+ remove: (id: string) => Promise<T>;
21
+ loading: Ref<boolean>;
22
+ error: Ref<Error | null>;
23
+ }
24
+ interface UseAuthResult<T> {
25
+ user: Ref<T | null>;
26
+ isLoggedIn: Ref<boolean>;
27
+ token: Ref<string | null>;
28
+ login: (credentials: {
29
+ email: string;
30
+ password: string;
31
+ }) => Promise<T>;
32
+ register: (data: Partial<T>) => Promise<T>;
33
+ logout: () => void;
34
+ hasRole: (role: string) => boolean;
35
+ loading: Ref<boolean>;
36
+ error: Ref<Error | null>;
37
+ }
38
+ interface UseListOptions {
39
+ enabled?: boolean;
40
+ refetchInterval?: number;
41
+ }
42
+ interface UseGetOptions {
43
+ enabled?: boolean;
44
+ }
45
+ interface FauxbaseContextValue {
46
+ client: any;
47
+ invalidate: (service: Service<any>) => void;
48
+ subscribe: (service: Service<any>, refetchFn: () => void) => () => void;
49
+ }
50
+
51
+ declare const FAUXBASE_KEY: InjectionKey<FauxbaseContextValue>;
52
+ declare const FauxbasePlugin: {
53
+ install(app: App, options: {
54
+ client: any;
55
+ }): void;
56
+ };
57
+ declare function provideFauxbase(client: any): void;
58
+ declare function useFauxbaseContext(): FauxbaseContextValue;
59
+
60
+ declare function useFauxbase(): any;
61
+
62
+ declare function useList<T extends Entity>(service: Service<T>, query?: QueryParams, options?: UseListOptions): UseListResult<T>;
63
+
64
+ declare function useGet<T extends Entity>(service: Service<T>, id: string | null | undefined, options?: UseGetOptions): UseGetResult<T>;
65
+
66
+ declare function useMutation<T extends Entity>(service: Service<T>): UseMutationResult<T>;
67
+
68
+ declare function useAuth<T extends Entity>(): UseAuthResult<T>;
69
+
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 };
package/dist/index.js ADDED
@@ -0,0 +1,280 @@
1
+ import { provide, inject, ref, onMounted, onUnmounted, watch } from 'vue';
2
+
3
+ // src/context.ts
4
+ var FAUXBASE_KEY = /* @__PURE__ */ Symbol("fauxbase");
5
+ var FauxbasePlugin = {
6
+ install(app, options) {
7
+ const registry = /* @__PURE__ */ new Map();
8
+ const value = {
9
+ client: options.client,
10
+ invalidate: (service) => {
11
+ const subscribers = registry.get(service);
12
+ if (subscribers) {
13
+ for (const fn of subscribers) {
14
+ fn();
15
+ }
16
+ }
17
+ },
18
+ subscribe: (service, refetchFn) => {
19
+ if (!registry.has(service)) {
20
+ registry.set(service, /* @__PURE__ */ new Set());
21
+ }
22
+ registry.get(service).add(refetchFn);
23
+ return () => {
24
+ registry.get(service)?.delete(refetchFn);
25
+ };
26
+ }
27
+ };
28
+ app.provide(FAUXBASE_KEY, value);
29
+ }
30
+ };
31
+ function provideFauxbase(client) {
32
+ const registry = /* @__PURE__ */ new Map();
33
+ const value = {
34
+ client,
35
+ invalidate: (service) => {
36
+ const subscribers = registry.get(service);
37
+ if (subscribers) {
38
+ for (const fn of subscribers) {
39
+ fn();
40
+ }
41
+ }
42
+ },
43
+ subscribe: (service, refetchFn) => {
44
+ if (!registry.has(service)) {
45
+ registry.set(service, /* @__PURE__ */ new Set());
46
+ }
47
+ registry.get(service).add(refetchFn);
48
+ return () => {
49
+ registry.get(service)?.delete(refetchFn);
50
+ };
51
+ }
52
+ };
53
+ provide(FAUXBASE_KEY, value);
54
+ }
55
+ function useFauxbaseContext() {
56
+ const ctx = inject(FAUXBASE_KEY);
57
+ if (!ctx) {
58
+ throw new Error("useFauxbaseContext requires FauxbasePlugin to be installed or provideFauxbase to be called");
59
+ }
60
+ return ctx;
61
+ }
62
+
63
+ // src/use-fauxbase.ts
64
+ function useFauxbase() {
65
+ const ctx = useFauxbaseContext();
66
+ return ctx.client;
67
+ }
68
+ function useList(service, query, options) {
69
+ const ctx = useFauxbaseContext();
70
+ const items = ref([]);
71
+ const meta = ref(null);
72
+ const loading = ref(true);
73
+ const error = ref(null);
74
+ let mounted = true;
75
+ const enabled = options?.enabled !== false;
76
+ const fetch = async () => {
77
+ if (!enabled) return;
78
+ loading.value = true;
79
+ error.value = null;
80
+ try {
81
+ const result = await service.list(query);
82
+ if (mounted) {
83
+ items.value = result.items;
84
+ meta.value = result.meta;
85
+ }
86
+ } catch (err) {
87
+ if (mounted) {
88
+ error.value = err instanceof Error ? err : new Error(String(err));
89
+ }
90
+ } finally {
91
+ if (mounted) {
92
+ loading.value = false;
93
+ }
94
+ }
95
+ };
96
+ const unsub = ctx.subscribe(service, fetch);
97
+ onMounted(() => {
98
+ fetch();
99
+ });
100
+ let intervalId;
101
+ if (options?.refetchInterval && enabled) {
102
+ onMounted(() => {
103
+ intervalId = setInterval(fetch, options.refetchInterval);
104
+ });
105
+ }
106
+ onUnmounted(() => {
107
+ mounted = false;
108
+ unsub();
109
+ if (intervalId) clearInterval(intervalId);
110
+ });
111
+ watch(
112
+ () => JSON.stringify(query),
113
+ () => {
114
+ fetch();
115
+ }
116
+ );
117
+ return { items, meta, loading, error, refetch: fetch };
118
+ }
119
+ function useGet(service, id, options) {
120
+ const ctx = useFauxbaseContext();
121
+ const data = ref(null);
122
+ const loading = ref(true);
123
+ const error = ref(null);
124
+ let mounted = true;
125
+ const enabled = options?.enabled !== false && id != null;
126
+ const fetch = async () => {
127
+ if (!enabled || !id) {
128
+ data.value = null;
129
+ loading.value = false;
130
+ return;
131
+ }
132
+ loading.value = true;
133
+ error.value = null;
134
+ try {
135
+ const result = await service.get(id);
136
+ if (mounted) {
137
+ data.value = result.data;
138
+ }
139
+ } catch (err) {
140
+ if (mounted) {
141
+ error.value = err instanceof Error ? err : new Error(String(err));
142
+ data.value = null;
143
+ }
144
+ } finally {
145
+ if (mounted) {
146
+ loading.value = false;
147
+ }
148
+ }
149
+ };
150
+ const unsub = ctx.subscribe(service, fetch);
151
+ onMounted(() => {
152
+ fetch();
153
+ });
154
+ onUnmounted(() => {
155
+ mounted = false;
156
+ unsub();
157
+ });
158
+ watch(
159
+ () => id,
160
+ () => {
161
+ fetch();
162
+ }
163
+ );
164
+ return { data, loading, error, refetch: fetch };
165
+ }
166
+ function useMutation(service) {
167
+ const ctx = useFauxbaseContext();
168
+ const loading = ref(false);
169
+ const error = ref(null);
170
+ const create = async (data) => {
171
+ loading.value = true;
172
+ error.value = null;
173
+ try {
174
+ const result = await service.create(data);
175
+ ctx.invalidate(service);
176
+ return result.data;
177
+ } catch (err) {
178
+ const e = err instanceof Error ? err : new Error(String(err));
179
+ error.value = e;
180
+ throw e;
181
+ } finally {
182
+ loading.value = false;
183
+ }
184
+ };
185
+ const update = async (id, data) => {
186
+ loading.value = true;
187
+ error.value = null;
188
+ try {
189
+ const result = await service.update(id, data);
190
+ ctx.invalidate(service);
191
+ return result.data;
192
+ } catch (err) {
193
+ const e = err instanceof Error ? err : new Error(String(err));
194
+ error.value = e;
195
+ throw e;
196
+ } finally {
197
+ loading.value = false;
198
+ }
199
+ };
200
+ const remove = async (id) => {
201
+ loading.value = true;
202
+ error.value = null;
203
+ try {
204
+ const result = await service.delete(id);
205
+ ctx.invalidate(service);
206
+ return result.data;
207
+ } catch (err) {
208
+ const e = err instanceof Error ? err : new Error(String(err));
209
+ error.value = e;
210
+ throw e;
211
+ } finally {
212
+ loading.value = false;
213
+ }
214
+ };
215
+ return { create, update, remove, loading, error };
216
+ }
217
+ function useAuth() {
218
+ const ctx = useFauxbaseContext();
219
+ const authService = ctx.client.auth;
220
+ if (!authService) {
221
+ throw new Error("useAuth requires auth to be configured in createClient");
222
+ }
223
+ const tick = ref(0);
224
+ const loading = ref(false);
225
+ const error = ref(null);
226
+ const rerender = () => {
227
+ tick.value++;
228
+ };
229
+ const user = ref(authService.currentUser);
230
+ const isLoggedIn = ref(authService.isLoggedIn);
231
+ const token = ref(authService.token);
232
+ const syncState = () => {
233
+ user.value = authService.currentUser;
234
+ isLoggedIn.value = authService.isLoggedIn;
235
+ token.value = authService.token;
236
+ rerender();
237
+ };
238
+ const login = async (credentials) => {
239
+ loading.value = true;
240
+ error.value = null;
241
+ try {
242
+ const result = await authService.login(credentials);
243
+ syncState();
244
+ return result;
245
+ } catch (err) {
246
+ const e = err instanceof Error ? err : new Error(String(err));
247
+ error.value = e;
248
+ throw e;
249
+ } finally {
250
+ loading.value = false;
251
+ }
252
+ };
253
+ const register = async (data) => {
254
+ loading.value = true;
255
+ error.value = null;
256
+ try {
257
+ const result = await authService.register(data);
258
+ syncState();
259
+ return result;
260
+ } catch (err) {
261
+ const e = err instanceof Error ? err : new Error(String(err));
262
+ error.value = e;
263
+ throw e;
264
+ } finally {
265
+ loading.value = false;
266
+ }
267
+ };
268
+ const logout = () => {
269
+ authService.logout();
270
+ syncState();
271
+ };
272
+ const hasRole = (role) => {
273
+ return authService.hasRole(role);
274
+ };
275
+ return { user, isLoggedIn, token, login, register, logout, hasRole, loading, error };
276
+ }
277
+
278
+ export { FAUXBASE_KEY, FauxbasePlugin, provideFauxbase, useAuth, useFauxbase, useFauxbaseContext, useGet, useList, useMutation };
279
+ //# sourceMappingURL=index.js.map
280
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "fauxbase-vue",
3
+ "version": "0.4.0",
4
+ "type": "module",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
15
+ "files": ["dist"],
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "test:coverage": "vitest run --coverage",
21
+ "clean": "rm -rf dist"
22
+ },
23
+ "peerDependencies": {
24
+ "vue": ">=3.3",
25
+ "fauxbase": ">=0.4.0"
26
+ },
27
+ "devDependencies": {
28
+ "vue": "^3.5.0",
29
+ "@vue/test-utils": "^2.4.0",
30
+ "fauxbase": "workspace:*",
31
+ "jsdom": "^25.0.0",
32
+ "tsup": "^8.0.0",
33
+ "vitest": "^3.0.0",
34
+ "@vitest/coverage-v8": "^3.0.0",
35
+ "typescript": "^5.7.0"
36
+ }
37
+ }