fauxbase-svelte 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,309 @@
1
+ 'use strict';
2
+
3
+ var svelte = require('svelte');
4
+ var store = require('svelte/store');
5
+
6
+ // src/context.ts
7
+ var FAUXBASE_KEY = "fauxbase";
8
+ function setFauxbaseContext(client) {
9
+ const registry = /* @__PURE__ */ new Map();
10
+ const value = {
11
+ 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
+ svelte.setContext(FAUXBASE_KEY, value);
31
+ return value;
32
+ }
33
+ function getFauxbaseContext() {
34
+ const ctx = svelte.getContext(FAUXBASE_KEY);
35
+ if (!ctx) {
36
+ throw new Error("getFauxbaseContext requires setFauxbaseContext to be called in a parent component");
37
+ }
38
+ return ctx;
39
+ }
40
+ function createFauxbaseContext(client) {
41
+ const registry = /* @__PURE__ */ new Map();
42
+ return {
43
+ client,
44
+ invalidate: (service) => {
45
+ const subscribers = registry.get(service);
46
+ if (subscribers) {
47
+ for (const fn of subscribers) {
48
+ fn();
49
+ }
50
+ }
51
+ },
52
+ subscribe: (service, refetchFn) => {
53
+ if (!registry.has(service)) {
54
+ registry.set(service, /* @__PURE__ */ new Set());
55
+ }
56
+ registry.get(service).add(refetchFn);
57
+ return () => {
58
+ registry.get(service)?.delete(refetchFn);
59
+ };
60
+ }
61
+ };
62
+ }
63
+
64
+ // src/use-fauxbase.ts
65
+ function useFauxbase() {
66
+ const ctx = getFauxbaseContext();
67
+ return ctx.client;
68
+ }
69
+ function useList(service, query, options, _ctx) {
70
+ const ctx = _ctx ?? getFauxbaseContext();
71
+ const items = store.writable([]);
72
+ const meta = store.writable(null);
73
+ const loading = store.writable(true);
74
+ const error = store.writable(null);
75
+ let destroyed = false;
76
+ const enabled = options?.enabled !== false;
77
+ const fetch = async () => {
78
+ if (!enabled) return;
79
+ loading.set(true);
80
+ error.set(null);
81
+ try {
82
+ const result = await service.list(query);
83
+ if (!destroyed) {
84
+ items.set(result.items);
85
+ meta.set(result.meta);
86
+ }
87
+ } catch (err) {
88
+ if (!destroyed) {
89
+ error.set(err instanceof Error ? err : new Error(String(err)));
90
+ }
91
+ } finally {
92
+ if (!destroyed) {
93
+ loading.set(false);
94
+ }
95
+ }
96
+ };
97
+ const unsub = ctx.subscribe(service, fetch);
98
+ fetch();
99
+ let intervalId;
100
+ if (options?.refetchInterval && enabled) {
101
+ intervalId = setInterval(fetch, options.refetchInterval);
102
+ }
103
+ try {
104
+ svelte.onDestroy(() => {
105
+ destroyed = true;
106
+ unsub();
107
+ if (intervalId) clearInterval(intervalId);
108
+ });
109
+ } catch {
110
+ }
111
+ const destroy = () => {
112
+ destroyed = true;
113
+ unsub();
114
+ if (intervalId) clearInterval(intervalId);
115
+ };
116
+ return {
117
+ items: { subscribe: items.subscribe },
118
+ meta: { subscribe: meta.subscribe },
119
+ loading: { subscribe: loading.subscribe },
120
+ error: { subscribe: error.subscribe },
121
+ refetch: fetch,
122
+ _destroy: destroy
123
+ };
124
+ }
125
+ function useGet(service, id, options, _ctx) {
126
+ const ctx = _ctx ?? getFauxbaseContext();
127
+ const data = store.writable(null);
128
+ const loading = store.writable(true);
129
+ const error = store.writable(null);
130
+ let destroyed = false;
131
+ const enabled = options?.enabled !== false && id != null;
132
+ const fetch = async () => {
133
+ if (!enabled || !id) {
134
+ data.set(null);
135
+ loading.set(false);
136
+ return;
137
+ }
138
+ loading.set(true);
139
+ error.set(null);
140
+ try {
141
+ const result = await service.get(id);
142
+ if (!destroyed) {
143
+ data.set(result.data);
144
+ }
145
+ } catch (err) {
146
+ if (!destroyed) {
147
+ error.set(err instanceof Error ? err : new Error(String(err)));
148
+ data.set(null);
149
+ }
150
+ } finally {
151
+ if (!destroyed) {
152
+ loading.set(false);
153
+ }
154
+ }
155
+ };
156
+ const unsub = ctx.subscribe(service, fetch);
157
+ fetch();
158
+ try {
159
+ svelte.onDestroy(() => {
160
+ destroyed = true;
161
+ unsub();
162
+ });
163
+ } catch {
164
+ }
165
+ const destroy = () => {
166
+ destroyed = true;
167
+ unsub();
168
+ };
169
+ return {
170
+ data: { subscribe: data.subscribe },
171
+ loading: { subscribe: loading.subscribe },
172
+ error: { subscribe: error.subscribe },
173
+ refetch: fetch,
174
+ _destroy: destroy
175
+ };
176
+ }
177
+ function useMutation(service, _ctx) {
178
+ const ctx = _ctx ?? getFauxbaseContext();
179
+ const loading = store.writable(false);
180
+ const error = store.writable(null);
181
+ const create = async (data) => {
182
+ loading.set(true);
183
+ error.set(null);
184
+ try {
185
+ const result = await service.create(data);
186
+ ctx.invalidate(service);
187
+ return result.data;
188
+ } catch (err) {
189
+ const e = err instanceof Error ? err : new Error(String(err));
190
+ error.set(e);
191
+ throw e;
192
+ } finally {
193
+ loading.set(false);
194
+ }
195
+ };
196
+ const update = async (id, data) => {
197
+ loading.set(true);
198
+ error.set(null);
199
+ try {
200
+ const result = await service.update(id, data);
201
+ ctx.invalidate(service);
202
+ return result.data;
203
+ } catch (err) {
204
+ const e = err instanceof Error ? err : new Error(String(err));
205
+ error.set(e);
206
+ throw e;
207
+ } finally {
208
+ loading.set(false);
209
+ }
210
+ };
211
+ const remove = async (id) => {
212
+ loading.set(true);
213
+ error.set(null);
214
+ try {
215
+ const result = await service.delete(id);
216
+ ctx.invalidate(service);
217
+ return result.data;
218
+ } catch (err) {
219
+ const e = err instanceof Error ? err : new Error(String(err));
220
+ error.set(e);
221
+ throw e;
222
+ } finally {
223
+ loading.set(false);
224
+ }
225
+ };
226
+ return {
227
+ create,
228
+ update,
229
+ remove,
230
+ loading: { subscribe: loading.subscribe },
231
+ error: { subscribe: error.subscribe }
232
+ };
233
+ }
234
+ function useAuth(_ctx) {
235
+ const ctx = _ctx ?? getFauxbaseContext();
236
+ const authService = ctx.client.auth;
237
+ if (!authService) {
238
+ throw new Error("useAuth requires auth to be configured in createClient");
239
+ }
240
+ const user = store.writable(authService.currentUser);
241
+ const isLoggedIn = store.writable(authService.isLoggedIn);
242
+ const token = store.writable(authService.token);
243
+ const loading = store.writable(false);
244
+ const error = store.writable(null);
245
+ const syncState = () => {
246
+ user.set(authService.currentUser);
247
+ isLoggedIn.set(authService.isLoggedIn);
248
+ token.set(authService.token);
249
+ };
250
+ const login = async (credentials) => {
251
+ loading.set(true);
252
+ error.set(null);
253
+ try {
254
+ const result = await authService.login(credentials);
255
+ syncState();
256
+ return result;
257
+ } catch (err) {
258
+ const e = err instanceof Error ? err : new Error(String(err));
259
+ error.set(e);
260
+ throw e;
261
+ } finally {
262
+ loading.set(false);
263
+ }
264
+ };
265
+ const register = async (data) => {
266
+ loading.set(true);
267
+ error.set(null);
268
+ try {
269
+ const result = await authService.register(data);
270
+ syncState();
271
+ return result;
272
+ } catch (err) {
273
+ const e = err instanceof Error ? err : new Error(String(err));
274
+ error.set(e);
275
+ throw e;
276
+ } finally {
277
+ loading.set(false);
278
+ }
279
+ };
280
+ const logout = () => {
281
+ authService.logout();
282
+ syncState();
283
+ };
284
+ const hasRole = (role) => {
285
+ return authService.hasRole(role);
286
+ };
287
+ return {
288
+ user: { subscribe: user.subscribe },
289
+ isLoggedIn: { subscribe: isLoggedIn.subscribe },
290
+ token: { subscribe: token.subscribe },
291
+ login,
292
+ register,
293
+ logout,
294
+ hasRole,
295
+ loading: { subscribe: loading.subscribe },
296
+ error: { subscribe: error.subscribe }
297
+ };
298
+ }
299
+
300
+ exports.createFauxbaseContext = createFauxbaseContext;
301
+ exports.getFauxbaseContext = getFauxbaseContext;
302
+ exports.setFauxbaseContext = setFauxbaseContext;
303
+ exports.useAuth = useAuth;
304
+ exports.useFauxbase = useFauxbase;
305
+ exports.useGet = useGet;
306
+ exports.useList = useList;
307
+ exports.useMutation = useMutation;
308
+ //# sourceMappingURL=index.cjs.map
309
+ //# 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":["setContext","getContext","writable","onDestroy"],"mappings":"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","file":"index.cjs","sourcesContent":["import { setContext, getContext } from 'svelte';\nimport type { Service } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY = 'fauxbase';\n\nexport function setFauxbaseContext(client: any): FauxbaseContextValue {\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 setContext(FAUXBASE_KEY, value);\n return value;\n}\n\nexport function getFauxbaseContext(): FauxbaseContextValue {\n const ctx = getContext<FauxbaseContextValue>(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('getFauxbaseContext requires setFauxbaseContext to be called in a parent component');\n }\n return ctx;\n}\n\n// For testing: create context value without svelte's setContext/getContext\nexport function createFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n return {\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","import { getFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = getFauxbaseContext();\n return ctx.client;\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n _ctx?: FauxbaseContextValue,\n): UseListResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const items = writable<T[]>([]);\n const meta = writable<PageMeta | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.set(true);\n error.set(null);\n try {\n const result = await service.list(query);\n if (!destroyed) {\n items.set(result.items);\n meta.set(result.meta);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n intervalId = setInterval(fetch, options.refetchInterval);\n }\n\n // Cleanup — try onDestroy but don't fail outside component context\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n } catch {\n // Outside component context (tests) — caller handles cleanup\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n };\n\n return {\n items: { subscribe: items.subscribe },\n meta: { subscribe: meta.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseListResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n _ctx?: FauxbaseContextValue,\n): UseGetResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const data = writable<T | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.set(null);\n loading.set(false);\n return;\n }\n loading.set(true);\n error.set(null);\n try {\n const result = await service.get(id);\n if (!destroyed) {\n data.set(result.data);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n data.set(null);\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n });\n } catch {\n // Outside component context\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n };\n\n return {\n data: { subscribe: data.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseGetResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n _ctx?: FauxbaseContextValue,\n): UseMutationResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n return {\n create,\n update,\n remove,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n","import { writable } from 'svelte/store';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(\n _ctx?: FauxbaseContextValue,\n): UseAuthResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\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 user = writable<T | null>(authService.currentUser);\n const isLoggedIn = writable<boolean>(authService.isLoggedIn);\n const token = writable<string | null>(authService.token);\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const syncState = () => {\n user.set(authService.currentUser);\n isLoggedIn.set(authService.isLoggedIn);\n token.set(authService.token);\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(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 {\n user: { subscribe: user.subscribe },\n isLoggedIn: { subscribe: isLoggedIn.subscribe },\n token: { subscribe: token.subscribe },\n login,\n register,\n logout,\n hasRole,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n"]}
@@ -0,0 +1,65 @@
1
+ import { Readable } from 'svelte/store';
2
+ import { Service, PageMeta, Entity, QueryParams } from 'fauxbase';
3
+
4
+ interface UseListResult<T> {
5
+ items: Readable<T[]>;
6
+ meta: Readable<PageMeta | null>;
7
+ loading: Readable<boolean>;
8
+ error: Readable<Error | null>;
9
+ refetch: () => void;
10
+ }
11
+ interface UseGetResult<T> {
12
+ data: Readable<T | null>;
13
+ loading: Readable<boolean>;
14
+ error: Readable<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: Readable<boolean>;
22
+ error: Readable<Error | null>;
23
+ }
24
+ interface UseAuthResult<T> {
25
+ user: Readable<T | null>;
26
+ isLoggedIn: Readable<boolean>;
27
+ token: Readable<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: Readable<boolean>;
36
+ error: Readable<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 function setFauxbaseContext(client: any): FauxbaseContextValue;
52
+ declare function getFauxbaseContext(): FauxbaseContextValue;
53
+ declare function createFauxbaseContext(client: any): FauxbaseContextValue;
54
+
55
+ declare function useFauxbase(): any;
56
+
57
+ declare function useList<T extends Entity>(service: Service<T>, query?: QueryParams, options?: UseListOptions, _ctx?: FauxbaseContextValue): UseListResult<T>;
58
+
59
+ declare function useGet<T extends Entity>(service: Service<T>, id: string | null | undefined, options?: UseGetOptions, _ctx?: FauxbaseContextValue): UseGetResult<T>;
60
+
61
+ declare function useMutation<T extends Entity>(service: Service<T>, _ctx?: FauxbaseContextValue): UseMutationResult<T>;
62
+
63
+ declare function useAuth<T extends Entity>(_ctx?: FauxbaseContextValue): UseAuthResult<T>;
64
+
65
+ export { type FauxbaseContextValue, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, createFauxbaseContext, getFauxbaseContext, setFauxbaseContext, useAuth, useFauxbase, useGet, useList, useMutation };
@@ -0,0 +1,65 @@
1
+ import { Readable } from 'svelte/store';
2
+ import { Service, PageMeta, Entity, QueryParams } from 'fauxbase';
3
+
4
+ interface UseListResult<T> {
5
+ items: Readable<T[]>;
6
+ meta: Readable<PageMeta | null>;
7
+ loading: Readable<boolean>;
8
+ error: Readable<Error | null>;
9
+ refetch: () => void;
10
+ }
11
+ interface UseGetResult<T> {
12
+ data: Readable<T | null>;
13
+ loading: Readable<boolean>;
14
+ error: Readable<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: Readable<boolean>;
22
+ error: Readable<Error | null>;
23
+ }
24
+ interface UseAuthResult<T> {
25
+ user: Readable<T | null>;
26
+ isLoggedIn: Readable<boolean>;
27
+ token: Readable<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: Readable<boolean>;
36
+ error: Readable<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 function setFauxbaseContext(client: any): FauxbaseContextValue;
52
+ declare function getFauxbaseContext(): FauxbaseContextValue;
53
+ declare function createFauxbaseContext(client: any): FauxbaseContextValue;
54
+
55
+ declare function useFauxbase(): any;
56
+
57
+ declare function useList<T extends Entity>(service: Service<T>, query?: QueryParams, options?: UseListOptions, _ctx?: FauxbaseContextValue): UseListResult<T>;
58
+
59
+ declare function useGet<T extends Entity>(service: Service<T>, id: string | null | undefined, options?: UseGetOptions, _ctx?: FauxbaseContextValue): UseGetResult<T>;
60
+
61
+ declare function useMutation<T extends Entity>(service: Service<T>, _ctx?: FauxbaseContextValue): UseMutationResult<T>;
62
+
63
+ declare function useAuth<T extends Entity>(_ctx?: FauxbaseContextValue): UseAuthResult<T>;
64
+
65
+ export { type FauxbaseContextValue, type UseAuthResult, type UseGetOptions, type UseGetResult, type UseListOptions, type UseListResult, type UseMutationResult, createFauxbaseContext, getFauxbaseContext, setFauxbaseContext, useAuth, useFauxbase, useGet, useList, useMutation };
package/dist/index.js ADDED
@@ -0,0 +1,300 @@
1
+ import { setContext, getContext, onDestroy } from 'svelte';
2
+ import { writable } from 'svelte/store';
3
+
4
+ // src/context.ts
5
+ var FAUXBASE_KEY = "fauxbase";
6
+ function setFauxbaseContext(client) {
7
+ const registry = /* @__PURE__ */ new Map();
8
+ const value = {
9
+ 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
+ setContext(FAUXBASE_KEY, value);
29
+ return value;
30
+ }
31
+ function getFauxbaseContext() {
32
+ const ctx = getContext(FAUXBASE_KEY);
33
+ if (!ctx) {
34
+ throw new Error("getFauxbaseContext requires setFauxbaseContext to be called in a parent component");
35
+ }
36
+ return ctx;
37
+ }
38
+ function createFauxbaseContext(client) {
39
+ const registry = /* @__PURE__ */ new Map();
40
+ return {
41
+ client,
42
+ invalidate: (service) => {
43
+ const subscribers = registry.get(service);
44
+ if (subscribers) {
45
+ for (const fn of subscribers) {
46
+ fn();
47
+ }
48
+ }
49
+ },
50
+ subscribe: (service, refetchFn) => {
51
+ if (!registry.has(service)) {
52
+ registry.set(service, /* @__PURE__ */ new Set());
53
+ }
54
+ registry.get(service).add(refetchFn);
55
+ return () => {
56
+ registry.get(service)?.delete(refetchFn);
57
+ };
58
+ }
59
+ };
60
+ }
61
+
62
+ // src/use-fauxbase.ts
63
+ function useFauxbase() {
64
+ const ctx = getFauxbaseContext();
65
+ return ctx.client;
66
+ }
67
+ function useList(service, query, options, _ctx) {
68
+ const ctx = _ctx ?? getFauxbaseContext();
69
+ const items = writable([]);
70
+ const meta = writable(null);
71
+ const loading = writable(true);
72
+ const error = writable(null);
73
+ let destroyed = false;
74
+ const enabled = options?.enabled !== false;
75
+ const fetch = async () => {
76
+ if (!enabled) return;
77
+ loading.set(true);
78
+ error.set(null);
79
+ try {
80
+ const result = await service.list(query);
81
+ if (!destroyed) {
82
+ items.set(result.items);
83
+ meta.set(result.meta);
84
+ }
85
+ } catch (err) {
86
+ if (!destroyed) {
87
+ error.set(err instanceof Error ? err : new Error(String(err)));
88
+ }
89
+ } finally {
90
+ if (!destroyed) {
91
+ loading.set(false);
92
+ }
93
+ }
94
+ };
95
+ const unsub = ctx.subscribe(service, fetch);
96
+ fetch();
97
+ let intervalId;
98
+ if (options?.refetchInterval && enabled) {
99
+ intervalId = setInterval(fetch, options.refetchInterval);
100
+ }
101
+ try {
102
+ onDestroy(() => {
103
+ destroyed = true;
104
+ unsub();
105
+ if (intervalId) clearInterval(intervalId);
106
+ });
107
+ } catch {
108
+ }
109
+ const destroy = () => {
110
+ destroyed = true;
111
+ unsub();
112
+ if (intervalId) clearInterval(intervalId);
113
+ };
114
+ return {
115
+ items: { subscribe: items.subscribe },
116
+ meta: { subscribe: meta.subscribe },
117
+ loading: { subscribe: loading.subscribe },
118
+ error: { subscribe: error.subscribe },
119
+ refetch: fetch,
120
+ _destroy: destroy
121
+ };
122
+ }
123
+ function useGet(service, id, options, _ctx) {
124
+ const ctx = _ctx ?? getFauxbaseContext();
125
+ const data = writable(null);
126
+ const loading = writable(true);
127
+ const error = writable(null);
128
+ let destroyed = false;
129
+ const enabled = options?.enabled !== false && id != null;
130
+ const fetch = async () => {
131
+ if (!enabled || !id) {
132
+ data.set(null);
133
+ loading.set(false);
134
+ return;
135
+ }
136
+ loading.set(true);
137
+ error.set(null);
138
+ try {
139
+ const result = await service.get(id);
140
+ if (!destroyed) {
141
+ data.set(result.data);
142
+ }
143
+ } catch (err) {
144
+ if (!destroyed) {
145
+ error.set(err instanceof Error ? err : new Error(String(err)));
146
+ data.set(null);
147
+ }
148
+ } finally {
149
+ if (!destroyed) {
150
+ loading.set(false);
151
+ }
152
+ }
153
+ };
154
+ const unsub = ctx.subscribe(service, fetch);
155
+ fetch();
156
+ try {
157
+ onDestroy(() => {
158
+ destroyed = true;
159
+ unsub();
160
+ });
161
+ } catch {
162
+ }
163
+ const destroy = () => {
164
+ destroyed = true;
165
+ unsub();
166
+ };
167
+ return {
168
+ data: { subscribe: data.subscribe },
169
+ loading: { subscribe: loading.subscribe },
170
+ error: { subscribe: error.subscribe },
171
+ refetch: fetch,
172
+ _destroy: destroy
173
+ };
174
+ }
175
+ function useMutation(service, _ctx) {
176
+ const ctx = _ctx ?? getFauxbaseContext();
177
+ const loading = writable(false);
178
+ const error = writable(null);
179
+ const create = async (data) => {
180
+ loading.set(true);
181
+ error.set(null);
182
+ try {
183
+ const result = await service.create(data);
184
+ ctx.invalidate(service);
185
+ return result.data;
186
+ } catch (err) {
187
+ const e = err instanceof Error ? err : new Error(String(err));
188
+ error.set(e);
189
+ throw e;
190
+ } finally {
191
+ loading.set(false);
192
+ }
193
+ };
194
+ const update = async (id, data) => {
195
+ loading.set(true);
196
+ error.set(null);
197
+ try {
198
+ const result = await service.update(id, data);
199
+ ctx.invalidate(service);
200
+ return result.data;
201
+ } catch (err) {
202
+ const e = err instanceof Error ? err : new Error(String(err));
203
+ error.set(e);
204
+ throw e;
205
+ } finally {
206
+ loading.set(false);
207
+ }
208
+ };
209
+ const remove = async (id) => {
210
+ loading.set(true);
211
+ error.set(null);
212
+ try {
213
+ const result = await service.delete(id);
214
+ ctx.invalidate(service);
215
+ return result.data;
216
+ } catch (err) {
217
+ const e = err instanceof Error ? err : new Error(String(err));
218
+ error.set(e);
219
+ throw e;
220
+ } finally {
221
+ loading.set(false);
222
+ }
223
+ };
224
+ return {
225
+ create,
226
+ update,
227
+ remove,
228
+ loading: { subscribe: loading.subscribe },
229
+ error: { subscribe: error.subscribe }
230
+ };
231
+ }
232
+ function useAuth(_ctx) {
233
+ const ctx = _ctx ?? getFauxbaseContext();
234
+ const authService = ctx.client.auth;
235
+ if (!authService) {
236
+ throw new Error("useAuth requires auth to be configured in createClient");
237
+ }
238
+ const user = writable(authService.currentUser);
239
+ const isLoggedIn = writable(authService.isLoggedIn);
240
+ const token = writable(authService.token);
241
+ const loading = writable(false);
242
+ const error = writable(null);
243
+ const syncState = () => {
244
+ user.set(authService.currentUser);
245
+ isLoggedIn.set(authService.isLoggedIn);
246
+ token.set(authService.token);
247
+ };
248
+ const login = async (credentials) => {
249
+ loading.set(true);
250
+ error.set(null);
251
+ try {
252
+ const result = await authService.login(credentials);
253
+ syncState();
254
+ return result;
255
+ } catch (err) {
256
+ const e = err instanceof Error ? err : new Error(String(err));
257
+ error.set(e);
258
+ throw e;
259
+ } finally {
260
+ loading.set(false);
261
+ }
262
+ };
263
+ const register = async (data) => {
264
+ loading.set(true);
265
+ error.set(null);
266
+ try {
267
+ const result = await authService.register(data);
268
+ syncState();
269
+ return result;
270
+ } catch (err) {
271
+ const e = err instanceof Error ? err : new Error(String(err));
272
+ error.set(e);
273
+ throw e;
274
+ } finally {
275
+ loading.set(false);
276
+ }
277
+ };
278
+ const logout = () => {
279
+ authService.logout();
280
+ syncState();
281
+ };
282
+ const hasRole = (role) => {
283
+ return authService.hasRole(role);
284
+ };
285
+ return {
286
+ user: { subscribe: user.subscribe },
287
+ isLoggedIn: { subscribe: isLoggedIn.subscribe },
288
+ token: { subscribe: token.subscribe },
289
+ login,
290
+ register,
291
+ logout,
292
+ hasRole,
293
+ loading: { subscribe: loading.subscribe },
294
+ error: { subscribe: error.subscribe }
295
+ };
296
+ }
297
+
298
+ export { createFauxbaseContext, getFauxbaseContext, setFauxbaseContext, useAuth, useFauxbase, useGet, useList, useMutation };
299
+ //# sourceMappingURL=index.js.map
300
+ //# 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":["writable","onDestroy"],"mappings":"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","file":"index.js","sourcesContent":["import { setContext, getContext } from 'svelte';\nimport type { Service } from 'fauxbase';\nimport type { FauxbaseContextValue } from './types';\n\nconst FAUXBASE_KEY = 'fauxbase';\n\nexport function setFauxbaseContext(client: any): FauxbaseContextValue {\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 setContext(FAUXBASE_KEY, value);\n return value;\n}\n\nexport function getFauxbaseContext(): FauxbaseContextValue {\n const ctx = getContext<FauxbaseContextValue>(FAUXBASE_KEY);\n if (!ctx) {\n throw new Error('getFauxbaseContext requires setFauxbaseContext to be called in a parent component');\n }\n return ctx;\n}\n\n// For testing: create context value without svelte's setContext/getContext\nexport function createFauxbaseContext(client: any): FauxbaseContextValue {\n const registry = new Map<Service<any>, Set<() => void>>();\n\n return {\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","import { getFauxbaseContext } from './context';\n\nexport function useFauxbase() {\n const ctx = getFauxbaseContext();\n return ctx.client;\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity, QueryParams, PageMeta } from 'fauxbase';\nimport type { UseListResult, UseListOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useList<T extends Entity>(\n service: Service<T>,\n query?: QueryParams,\n options?: UseListOptions,\n _ctx?: FauxbaseContextValue,\n): UseListResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const items = writable<T[]>([]);\n const meta = writable<PageMeta | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false;\n\n const fetch = async () => {\n if (!enabled) return;\n loading.set(true);\n error.set(null);\n try {\n const result = await service.list(query);\n if (!destroyed) {\n items.set(result.items);\n meta.set(result.meta);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n // Refetch interval\n let intervalId: ReturnType<typeof setInterval> | undefined;\n if (options?.refetchInterval && enabled) {\n intervalId = setInterval(fetch, options.refetchInterval);\n }\n\n // Cleanup — try onDestroy but don't fail outside component context\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n });\n } catch {\n // Outside component context (tests) — caller handles cleanup\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n if (intervalId) clearInterval(intervalId);\n };\n\n return {\n items: { subscribe: items.subscribe },\n meta: { subscribe: meta.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseListResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport { onDestroy } from 'svelte';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseGetResult, UseGetOptions } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useGet<T extends Entity>(\n service: Service<T>,\n id: string | null | undefined,\n options?: UseGetOptions,\n _ctx?: FauxbaseContextValue,\n): UseGetResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const data = writable<T | null>(null);\n const loading = writable(true);\n const error = writable<Error | null>(null);\n let destroyed = false;\n\n const enabled = options?.enabled !== false && id != null;\n\n const fetch = async () => {\n if (!enabled || !id) {\n data.set(null);\n loading.set(false);\n return;\n }\n loading.set(true);\n error.set(null);\n try {\n const result = await service.get(id);\n if (!destroyed) {\n data.set(result.data);\n }\n } catch (err) {\n if (!destroyed) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n data.set(null);\n }\n } finally {\n if (!destroyed) {\n loading.set(false);\n }\n }\n };\n\n // Subscribe for invalidation\n const unsub = ctx.subscribe(service, fetch);\n\n // Initial fetch\n fetch();\n\n try {\n onDestroy(() => {\n destroyed = true;\n unsub();\n });\n } catch {\n // Outside component context\n }\n\n const destroy = () => {\n destroyed = true;\n unsub();\n };\n\n return {\n data: { subscribe: data.subscribe },\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n refetch: fetch,\n _destroy: destroy,\n } as UseGetResult<T> & { _destroy: () => void };\n}\n","import { writable } from 'svelte/store';\nimport type { Service, Entity } from 'fauxbase';\nimport type { UseMutationResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useMutation<T extends Entity>(\n service: Service<T>,\n _ctx?: FauxbaseContextValue,\n): UseMutationResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const create = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const update = async (id: string, data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const remove = async (id: string): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n return {\n create,\n update,\n remove,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n","import { writable } from 'svelte/store';\nimport type { Entity } from 'fauxbase';\nimport type { UseAuthResult } from './types';\nimport type { FauxbaseContextValue } from './types';\nimport { getFauxbaseContext } from './context';\n\nexport function useAuth<T extends Entity>(\n _ctx?: FauxbaseContextValue,\n): UseAuthResult<T> {\n const ctx = _ctx ?? getFauxbaseContext();\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 user = writable<T | null>(authService.currentUser);\n const isLoggedIn = writable<boolean>(authService.isLoggedIn);\n const token = writable<string | null>(authService.token);\n const loading = writable(false);\n const error = writable<Error | null>(null);\n\n const syncState = () => {\n user.set(authService.currentUser);\n isLoggedIn.set(authService.isLoggedIn);\n token.set(authService.token);\n };\n\n const login = async (credentials: { email: string; password: string }): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(false);\n }\n };\n\n const register = async (data: Partial<T>): Promise<T> => {\n loading.set(true);\n error.set(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.set(e);\n throw e;\n } finally {\n loading.set(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 {\n user: { subscribe: user.subscribe },\n isLoggedIn: { subscribe: isLoggedIn.subscribe },\n token: { subscribe: token.subscribe },\n login,\n register,\n logout,\n hasRole,\n loading: { subscribe: loading.subscribe },\n error: { subscribe: error.subscribe },\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "fauxbase-svelte",
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
+ "svelte": ">=4",
25
+ "fauxbase": ">=0.4.0"
26
+ },
27
+ "devDependencies": {
28
+ "svelte": "^4.2.0",
29
+ "fauxbase": "workspace:*",
30
+ "tsup": "^8.0.0",
31
+ "vitest": "^3.0.0",
32
+ "@vitest/coverage-v8": "^3.0.0",
33
+ "typescript": "^5.7.0"
34
+ }
35
+ }