@douvery/auth 0.3.2 → 0.3.3

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.
@@ -1,31 +1,50 @@
1
- import { createContextId, component$, useSignal, useContextProvider, useVisibleTask$, Slot, useContext, useTask$ } from '@builder.io/qwik';
1
+ import { createContextId, component$, useSignal, useTask$, useContextProvider, useVisibleTask$, noSerialize, Slot, useContext, $ } from '@builder.io/qwik';
2
2
  import { createDouveryAuth } from '@douvery/auth';
3
3
  export { DouveryAuthClient, createDouveryAuth } from '@douvery/auth';
4
4
  import { jsx } from '@builder.io/qwik/jsx-runtime';
5
5
 
6
6
  // src/qwik/index.tsx
7
7
  var DouveryAuthContext = createContextId("douvery-auth");
8
+ var DEFAULT_STATE = {
9
+ status: "unauthenticated",
10
+ user: null,
11
+ tokens: null,
12
+ error: null
13
+ };
8
14
  var DouveryAuthProvider = component$(
9
- ({ config }) => {
10
- const client = createDouveryAuth(config);
11
- const state = useSignal(client.getState());
15
+ ({ config$, appUser: externalAppUser }) => {
16
+ const state = useSignal(DEFAULT_STATE);
12
17
  const isInitialized = useSignal(false);
13
18
  const isLoading = useSignal(false);
14
19
  const error = useSignal(null);
20
+ const clientRef = useSignal();
21
+ const internalAppUser = useSignal(externalAppUser?.value ?? null);
22
+ const appUser = externalAppUser ?? internalAppUser;
23
+ const appUserAuthenticated = useSignal(!!appUser.value);
24
+ useTask$(({ track }) => {
25
+ const u = track(() => appUser.value);
26
+ appUserAuthenticated.value = !!u;
27
+ });
15
28
  useContextProvider(DouveryAuthContext, {
16
29
  state,
17
30
  isInitialized,
18
31
  isLoading,
19
32
  error,
20
- client
33
+ clientRef,
34
+ appUser,
35
+ appUserAuthenticated
21
36
  });
22
- useVisibleTask$(() => {
23
- client.initialize().then(() => {
37
+ useVisibleTask$(async () => {
38
+ const config = await config$();
39
+ const client = createDouveryAuth(config);
40
+ clientRef.value = noSerialize(client);
41
+ try {
42
+ await client.initialize();
24
43
  isInitialized.value = true;
25
44
  state.value = client.getState();
26
- }).catch((err) => {
45
+ } catch (err) {
27
46
  error.value = err instanceof Error ? err : new Error(String(err));
28
- });
47
+ }
29
48
  const unsubscribe = client.subscribe((event) => {
30
49
  state.value = client.getState();
31
50
  if (event.type === "LOGIN_ERROR" || event.type === "LOGOUT_ERROR" || event.type === "TOKEN_REFRESH_ERROR") {
@@ -40,6 +59,15 @@ var DouveryAuthProvider = component$(
40
59
  function useDouveryAuth() {
41
60
  return useContext(DouveryAuthContext);
42
61
  }
62
+ function getClient(ctx) {
63
+ const client = ctx.clientRef.value;
64
+ if (!client) {
65
+ throw new Error(
66
+ "DouveryAuth client not initialized. Ensure DouveryAuthProvider is mounted and the page has hydrated."
67
+ );
68
+ }
69
+ return client;
70
+ }
43
71
  function useUser() {
44
72
  const { state } = useDouveryAuth();
45
73
  const user = useSignal(state.value.user);
@@ -59,8 +87,10 @@ function useIsAuthenticated() {
59
87
  return isAuth;
60
88
  }
61
89
  function useAuthActions() {
62
- const { client, isLoading, error } = useDouveryAuth();
63
- const login = async (options) => {
90
+ const ctx = useDouveryAuth();
91
+ const { isLoading, error } = ctx;
92
+ const login = $(async (options) => {
93
+ const client = getClient(ctx);
64
94
  isLoading.value = true;
65
95
  error.value = null;
66
96
  try {
@@ -71,8 +101,9 @@ function useAuthActions() {
71
101
  } finally {
72
102
  isLoading.value = false;
73
103
  }
74
- };
75
- const logout = async (options) => {
104
+ });
105
+ const logout = $(async (options) => {
106
+ const client = getClient(ctx);
76
107
  isLoading.value = true;
77
108
  error.value = null;
78
109
  try {
@@ -83,32 +114,33 @@ function useAuthActions() {
83
114
  } finally {
84
115
  isLoading.value = false;
85
116
  }
86
- };
87
- const selectAccount = (options) => {
88
- client.selectAccount(options);
89
- };
90
- const addAccount = (options) => {
91
- client.addAccount(options);
92
- };
93
- const register = (options) => {
94
- client.register(options);
95
- };
96
- const recoverAccount = (options) => {
97
- client.recoverAccount(options);
98
- };
99
- const verifyAccount = (options) => {
100
- client.verifyAccount(options);
101
- };
102
- const upgradeAccount = (options) => {
103
- client.upgradeAccount(options);
104
- };
105
- const setupPasskey = (options) => {
106
- client.setupPasskey(options);
107
- };
108
- const setupAddress = (options) => {
109
- client.setupAddress(options);
110
- };
111
- const revokeToken = async (options) => {
117
+ });
118
+ const selectAccount = $((options) => {
119
+ getClient(ctx).selectAccount(options);
120
+ });
121
+ const addAccount = $((options) => {
122
+ getClient(ctx).addAccount(options);
123
+ });
124
+ const register = $((options) => {
125
+ getClient(ctx).register(options);
126
+ });
127
+ const recoverAccount = $((options) => {
128
+ getClient(ctx).recoverAccount(options);
129
+ });
130
+ const verifyAccount = $((options) => {
131
+ getClient(ctx).verifyAccount(options);
132
+ });
133
+ const upgradeAccount = $((options) => {
134
+ getClient(ctx).upgradeAccount(options);
135
+ });
136
+ const setupPasskey = $((options) => {
137
+ getClient(ctx).setupPasskey(options);
138
+ });
139
+ const setupAddress = $((options) => {
140
+ getClient(ctx).setupAddress(options);
141
+ });
142
+ const revokeToken = $(async (options) => {
143
+ const client = getClient(ctx);
112
144
  isLoading.value = true;
113
145
  error.value = null;
114
146
  try {
@@ -119,7 +151,7 @@ function useAuthActions() {
119
151
  } finally {
120
152
  isLoading.value = false;
121
153
  }
122
- };
154
+ });
123
155
  return {
124
156
  login,
125
157
  logout,
@@ -136,34 +168,97 @@ function useAuthActions() {
136
168
  };
137
169
  }
138
170
  function useAuthUrls() {
139
- const { client } = useDouveryAuth();
171
+ const ctx = useDouveryAuth();
140
172
  return {
141
- loginUrl: (options) => client.buildLoginUrl(options),
142
- logoutUrl: (options) => client.buildLogoutUrl(options),
143
- selectAccountUrl: (options) => client.buildSelectAccountUrl(options),
144
- addAccountUrl: (options) => client.buildAddAccountUrl(options),
145
- registerUrl: (options) => client.buildRegisterUrl(options),
146
- recoverAccountUrl: (options) => client.buildRecoverAccountUrl(options),
147
- verifyAccountUrl: (options) => client.buildVerifyAccountUrl(options),
148
- upgradeAccountUrl: (options) => client.buildUpgradeAccountUrl(options),
149
- setupPasskeyUrl: (options) => client.buildSetupPasskeyUrl(options),
150
- setupAddressUrl: (options) => client.buildSetupAddressUrl(options)
173
+ loginUrl: $(
174
+ (options) => getClient(ctx).buildLoginUrl(options)
175
+ ),
176
+ logoutUrl: $(
177
+ (options) => getClient(ctx).buildLogoutUrl(options)
178
+ ),
179
+ selectAccountUrl: $(
180
+ (options) => getClient(ctx).buildSelectAccountUrl(options)
181
+ ),
182
+ addAccountUrl: $(
183
+ (options) => getClient(ctx).buildAddAccountUrl(options)
184
+ ),
185
+ registerUrl: $(
186
+ (options) => getClient(ctx).buildRegisterUrl(options)
187
+ ),
188
+ recoverAccountUrl: $(
189
+ (options) => getClient(ctx).buildRecoverAccountUrl(options)
190
+ ),
191
+ verifyAccountUrl: $(
192
+ (options) => getClient(ctx).buildVerifyAccountUrl(options)
193
+ ),
194
+ upgradeAccountUrl: $(
195
+ (options) => getClient(ctx).buildUpgradeAccountUrl(options)
196
+ ),
197
+ setupPasskeyUrl: $(
198
+ (options) => getClient(ctx).buildSetupPasskeyUrl(options)
199
+ ),
200
+ setupAddressUrl: $(
201
+ (options) => getClient(ctx).buildSetupAddressUrl(options)
202
+ )
151
203
  };
152
204
  }
153
205
  function useSessionStatus() {
154
- const { client, state } = useDouveryAuth();
155
- const isExpired = useSignal(client.isSessionExpired());
156
- const needsVerification = useSignal(client.needsEmailVerification());
157
- const isGuest = useSignal(client.isGuestAccount());
206
+ const ctx = useDouveryAuth();
207
+ const { state } = ctx;
208
+ const c = ctx.clientRef.value;
209
+ const isExpired = useSignal(c ? c.isSessionExpired() : false);
210
+ const needsVerification = useSignal(c ? c.needsEmailVerification() : false);
211
+ const isGuest = useSignal(c ? c.isGuestAccount() : false);
158
212
  useTask$(({ track }) => {
159
213
  track(() => state.value);
160
- isExpired.value = client.isSessionExpired();
161
- needsVerification.value = client.needsEmailVerification();
162
- isGuest.value = client.isGuestAccount();
214
+ const client = ctx.clientRef.value;
215
+ if (client) {
216
+ isExpired.value = client.isSessionExpired();
217
+ needsVerification.value = client.needsEmailVerification();
218
+ isGuest.value = client.isGuestAccount();
219
+ }
163
220
  });
164
221
  return { isExpired, needsVerification, isGuest };
165
222
  }
223
+ function useAppUser() {
224
+ const { appUser, appUserAuthenticated } = useDouveryAuth();
225
+ return {
226
+ user: appUser,
227
+ isAuthenticated: appUserAuthenticated
228
+ };
229
+ }
230
+ function useAppUserActions() {
231
+ const { appUser, appUserAuthenticated } = useDouveryAuth();
232
+ const updateUser = $((userData) => {
233
+ appUser.value = userData;
234
+ appUserAuthenticated.value = !!userData;
235
+ });
236
+ const refreshUser = $(async () => {
237
+ try {
238
+ const response = await fetch("/api/auth/me", {
239
+ method: "GET",
240
+ credentials: "include",
241
+ headers: { "Cache-Control": "no-cache", Pragma: "no-cache" }
242
+ });
243
+ if (response.ok) {
244
+ const data = await response.json();
245
+ appUser.value = data.user;
246
+ appUserAuthenticated.value = true;
247
+ } else if (response.status === 401 || response.status === 403) {
248
+ appUser.value = null;
249
+ appUserAuthenticated.value = false;
250
+ }
251
+ } catch {
252
+ }
253
+ });
254
+ return {
255
+ user: appUser,
256
+ isAuthenticated: appUserAuthenticated,
257
+ updateUser,
258
+ refreshUser
259
+ };
260
+ }
166
261
 
167
- export { DouveryAuthContext, DouveryAuthProvider, useAuthActions, useAuthUrls, useDouveryAuth, useIsAuthenticated, useSessionStatus, useUser };
262
+ export { DouveryAuthContext, DouveryAuthProvider, useAppUser, useAppUserActions, useAuthActions, useAuthUrls, useDouveryAuth, useIsAuthenticated, useSessionStatus, useUser };
168
263
  //# sourceMappingURL=index.js.map
169
264
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/qwik/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @douvery/auth/qwik - Qwik adapter\n */\n\nimport {\n createContextId,\n useContextProvider,\n useContext,\n useSignal,\n useTask$,\n useVisibleTask$,\n component$,\n Slot,\n type Signal,\n} from \"@builder.io/qwik\";\nimport {\n DouveryAuthClient,\n createDouveryAuth,\n type DouveryAuthConfig,\n type AuthState,\n type User,\n type LoginOptions,\n type LogoutOptions,\n type SelectAccountOptions,\n type RegisterOptions,\n type RecoverAccountOptions,\n type VerifyAccountOptions,\n type UpgradeAccountOptions,\n type SetupPasskeyOptions,\n type SetupAddressOptions,\n type AddAccountOptions,\n type RevokeTokenOptions,\n type AuthUrl,\n} from \"@douvery/auth\";\n\ninterface DouveryAuthContextValue {\n state: Signal<AuthState>;\n isInitialized: Signal<boolean>;\n isLoading: Signal<boolean>;\n error: Signal<Error | null>;\n client: DouveryAuthClient;\n}\n\nexport const DouveryAuthContext =\n createContextId<DouveryAuthContextValue>(\"douvery-auth\");\n\nexport interface DouveryAuthProviderProps {\n config: DouveryAuthConfig;\n}\n\nexport const DouveryAuthProvider = component$<DouveryAuthProviderProps>(\n ({ config }) => {\n const client = createDouveryAuth(config);\n const state = useSignal<AuthState>(client.getState());\n const isInitialized = useSignal(false);\n const isLoading = useSignal(false);\n const error = useSignal<Error | null>(null);\n\n useContextProvider(DouveryAuthContext, {\n state,\n isInitialized,\n isLoading,\n error,\n client,\n });\n\n useVisibleTask$(() => {\n client\n .initialize()\n .then(() => {\n isInitialized.value = true;\n state.value = client.getState();\n })\n .catch((err) => {\n error.value = err instanceof Error ? err : new Error(String(err));\n });\n\n const unsubscribe = client.subscribe((event) => {\n state.value = client.getState();\n if (\n event.type === \"LOGIN_ERROR\" ||\n event.type === \"LOGOUT_ERROR\" ||\n event.type === \"TOKEN_REFRESH_ERROR\"\n ) {\n error.value = event.error;\n }\n });\n\n return () => unsubscribe();\n });\n\n return <Slot />;\n },\n);\n\nexport function useDouveryAuth() {\n return useContext(DouveryAuthContext);\n}\n\nexport function useUser(): Signal<User | null> {\n const { state } = useDouveryAuth();\n const user = useSignal<User | null>(state.value.user);\n useTask$(({ track }) => {\n track(() => state.value);\n user.value = state.value.user;\n });\n return user;\n}\n\nexport function useIsAuthenticated(): Signal<boolean> {\n const { state } = useDouveryAuth();\n const isAuth = useSignal(state.value.status === \"authenticated\");\n useTask$(({ track }) => {\n track(() => state.value);\n isAuth.value = state.value.status === \"authenticated\";\n });\n return isAuth;\n}\n\nexport function useAuthActions() {\n const { client, isLoading, error } = useDouveryAuth();\n\n const login = async (options?: LoginOptions) => {\n isLoading.value = true;\n error.value = null;\n try {\n await client.login(options);\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n isLoading.value = false;\n }\n };\n\n const logout = async (options?: LogoutOptions) => {\n isLoading.value = true;\n error.value = null;\n try {\n await client.logout(options);\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n isLoading.value = false;\n }\n };\n\n const selectAccount = (options?: SelectAccountOptions) => {\n client.selectAccount(options);\n };\n\n const addAccount = (options?: AddAccountOptions) => {\n client.addAccount(options);\n };\n\n const register = (options?: RegisterOptions) => {\n client.register(options);\n };\n\n const recoverAccount = (options?: RecoverAccountOptions) => {\n client.recoverAccount(options);\n };\n\n const verifyAccount = (options?: VerifyAccountOptions) => {\n client.verifyAccount(options);\n };\n\n const upgradeAccount = (options?: UpgradeAccountOptions) => {\n client.upgradeAccount(options);\n };\n\n const setupPasskey = (options?: SetupPasskeyOptions) => {\n client.setupPasskey(options);\n };\n\n const setupAddress = (options?: SetupAddressOptions) => {\n client.setupAddress(options);\n };\n\n const revokeToken = async (options?: RevokeTokenOptions) => {\n isLoading.value = true;\n error.value = null;\n try {\n await client.revokeToken(options);\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n isLoading.value = false;\n }\n };\n\n return {\n login,\n logout,\n selectAccount,\n addAccount,\n register,\n recoverAccount,\n verifyAccount,\n upgradeAccount,\n setupPasskey,\n setupAddress,\n revokeToken,\n isLoading,\n };\n}\n\n/** Get URL builders for auth pages (non-redirecting, useful for <a> tags) */\nexport function useAuthUrls() {\n const { client } = useDouveryAuth();\n return {\n loginUrl: (options?: LoginOptions): AuthUrl =>\n client.buildLoginUrl(options),\n logoutUrl: (options?: LogoutOptions): AuthUrl =>\n client.buildLogoutUrl(options),\n selectAccountUrl: (options?: SelectAccountOptions): AuthUrl =>\n client.buildSelectAccountUrl(options),\n addAccountUrl: (options?: AddAccountOptions): AuthUrl =>\n client.buildAddAccountUrl(options),\n registerUrl: (options?: RegisterOptions): AuthUrl =>\n client.buildRegisterUrl(options),\n recoverAccountUrl: (options?: RecoverAccountOptions): AuthUrl =>\n client.buildRecoverAccountUrl(options),\n verifyAccountUrl: (options?: VerifyAccountOptions): AuthUrl =>\n client.buildVerifyAccountUrl(options),\n upgradeAccountUrl: (options?: UpgradeAccountOptions): AuthUrl =>\n client.buildUpgradeAccountUrl(options),\n setupPasskeyUrl: (options?: SetupPasskeyOptions): AuthUrl =>\n client.buildSetupPasskeyUrl(options),\n setupAddressUrl: (options?: SetupAddressOptions): AuthUrl =>\n client.buildSetupAddressUrl(options),\n };\n}\n\n/** Get session status helpers */\nexport function useSessionStatus() {\n const { client, state } = useDouveryAuth();\n const isExpired = useSignal(client.isSessionExpired());\n const needsVerification = useSignal(client.needsEmailVerification());\n const isGuest = useSignal(client.isGuestAccount());\n\n useTask$(({ track }) => {\n track(() => state.value);\n isExpired.value = client.isSessionExpired();\n needsVerification.value = client.needsEmailVerification();\n isGuest.value = client.isGuestAccount();\n });\n\n return { isExpired, needsVerification, isGuest };\n}\n\nexport { DouveryAuthClient, createDouveryAuth } from \"@douvery/auth\";\nexport type {\n DouveryAuthConfig,\n AuthState,\n User,\n LoginOptions,\n LogoutOptions,\n SelectAccountOptions,\n RegisterOptions,\n RecoverAccountOptions,\n VerifyAccountOptions,\n UpgradeAccountOptions,\n SetupPasskeyOptions,\n SetupAddressOptions,\n AddAccountOptions,\n RevokeTokenOptions,\n AuthUrl,\n} from \"@douvery/auth\";\n"]}
1
+ {"version":3,"sources":["../../src/qwik/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @douvery/auth/qwik - Qwik adapter\n *\n * Uses QRL for config to avoid Qwik serialization issues with\n * function-based storage adapters (customStorage).\n * The client is created inside useVisibleTask$ and wrapped with\n * noSerialize() since DouveryAuthClient has non-serializable methods.\n */\n\nimport {\n createContextId,\n useContextProvider,\n useContext,\n useSignal,\n useTask$,\n useVisibleTask$,\n component$,\n $,\n Slot,\n noSerialize,\n type Signal,\n type NoSerialize,\n type QRL,\n} from \"@builder.io/qwik\";\nimport {\n DouveryAuthClient,\n createDouveryAuth,\n type DouveryAuthConfig,\n type AuthState,\n type User,\n type LoginOptions,\n type LogoutOptions,\n type SelectAccountOptions,\n type RegisterOptions,\n type RecoverAccountOptions,\n type VerifyAccountOptions,\n type UpgradeAccountOptions,\n type SetupPasskeyOptions,\n type SetupAddressOptions,\n type AddAccountOptions,\n type RevokeTokenOptions,\n type AuthUrl,\n} from \"@douvery/auth\";\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface DouveryAuthContextValue {\n state: Signal<AuthState>;\n isInitialized: Signal<boolean>;\n isLoading: Signal<boolean>;\n error: Signal<Error | null>;\n clientRef: Signal<NoSerialize<DouveryAuthClient> | undefined>;\n /** Application-specific user data from SSR (e.g. routeLoader$). */\n appUser: Signal<unknown>;\n appUserAuthenticated: Signal<boolean>;\n}\n\nexport const DouveryAuthContext =\n createContextId<DouveryAuthContextValue>(\"douvery-auth\");\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface DouveryAuthProviderProps {\n /**\n * QRL that returns the auth configuration.\n * Use $(() => getDouveryAuthConfig()) to wrap your config factory.\n * This avoids Qwik serialization issues with customStorage functions.\n */\n config$: QRL<() => DouveryAuthConfig>;\n /**\n * Optional application-specific user data loaded from SSR (routeLoader$).\n * This is separate from OAuth user – it holds the full app user object\n * (e.g. UserACC with address, active, sessionId, etc.).\n * Pass the routeLoader$ signal directly.\n */\n appUser?: Signal<unknown>;\n}\n\nconst DEFAULT_STATE: AuthState = {\n status: \"unauthenticated\",\n user: null,\n tokens: null,\n error: null,\n};\n\nexport const DouveryAuthProvider = component$<DouveryAuthProviderProps>(\n ({ config$, appUser: externalAppUser }) => {\n // All signals are serializable - no functions stored directly\n const state = useSignal<AuthState>(DEFAULT_STATE);\n const isInitialized = useSignal(false);\n const isLoading = useSignal(false);\n const error = useSignal<Error | null>(null);\n const clientRef = useSignal<NoSerialize<DouveryAuthClient>>();\n\n // App user data: use external signal if provided, otherwise create internal one\n const internalAppUser = useSignal<unknown>(externalAppUser?.value ?? null);\n const appUser = externalAppUser ?? internalAppUser;\n const appUserAuthenticated = useSignal<boolean>(!!appUser.value);\n\n // Keep appUserAuthenticated in sync\n useTask$(({ track }) => {\n const u = track(() => appUser.value);\n appUserAuthenticated.value = !!u;\n });\n\n useContextProvider(DouveryAuthContext, {\n state,\n isInitialized,\n isLoading,\n error,\n clientRef,\n appUser,\n appUserAuthenticated,\n });\n\n // Client creation deferred to browser-only task.\n // The QRL is invoked here, returning the full config (with customStorage).\n // noSerialize() wraps the client so Qwik doesn't try to serialize it.\n useVisibleTask$(async () => {\n const config = await config$();\n const client = createDouveryAuth(config);\n clientRef.value = noSerialize(client);\n\n try {\n await client.initialize();\n isInitialized.value = true;\n state.value = client.getState();\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n }\n\n const unsubscribe = client.subscribe((event) => {\n state.value = client.getState();\n if (\n event.type === \"LOGIN_ERROR\" ||\n event.type === \"LOGOUT_ERROR\" ||\n event.type === \"TOKEN_REFRESH_ERROR\"\n ) {\n error.value = event.error;\n }\n });\n\n return () => unsubscribe();\n });\n\n return <Slot />;\n },\n);\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport function useDouveryAuth() {\n return useContext(DouveryAuthContext);\n}\n\n/**\n * Internal helper: safely access the client from context.\n * Throws if the client hasn't been initialized yet (before useVisibleTask$ runs).\n */\nfunction getClient(ctx: DouveryAuthContextValue): DouveryAuthClient {\n const client = ctx.clientRef.value;\n if (!client) {\n throw new Error(\n \"DouveryAuth client not initialized. \" +\n \"Ensure DouveryAuthProvider is mounted and the page has hydrated.\",\n );\n }\n return client;\n}\n\nexport function useUser(): Signal<User | null> {\n const { state } = useDouveryAuth();\n const user = useSignal<User | null>(state.value.user);\n useTask$(({ track }) => {\n track(() => state.value);\n user.value = state.value.user;\n });\n return user;\n}\n\nexport function useIsAuthenticated(): Signal<boolean> {\n const { state } = useDouveryAuth();\n const isAuth = useSignal(state.value.status === \"authenticated\");\n useTask$(({ track }) => {\n track(() => state.value);\n isAuth.value = state.value.status === \"authenticated\";\n });\n return isAuth;\n}\n\nexport function useAuthActions() {\n const ctx = useDouveryAuth();\n const { isLoading, error } = ctx;\n\n const login = $(async (options?: LoginOptions) => {\n const client = getClient(ctx);\n isLoading.value = true;\n error.value = null;\n try {\n await client.login(options);\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n isLoading.value = false;\n }\n });\n\n const logout = $(async (options?: LogoutOptions) => {\n const client = getClient(ctx);\n isLoading.value = true;\n error.value = null;\n try {\n await client.logout(options);\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n isLoading.value = false;\n }\n });\n\n const selectAccount = $((options?: SelectAccountOptions) => {\n getClient(ctx).selectAccount(options);\n });\n\n const addAccount = $((options?: AddAccountOptions) => {\n getClient(ctx).addAccount(options);\n });\n\n const register = $((options?: RegisterOptions) => {\n getClient(ctx).register(options);\n });\n\n const recoverAccount = $((options?: RecoverAccountOptions) => {\n getClient(ctx).recoverAccount(options);\n });\n\n const verifyAccount = $((options?: VerifyAccountOptions) => {\n getClient(ctx).verifyAccount(options);\n });\n\n const upgradeAccount = $((options?: UpgradeAccountOptions) => {\n getClient(ctx).upgradeAccount(options);\n });\n\n const setupPasskey = $((options?: SetupPasskeyOptions) => {\n getClient(ctx).setupPasskey(options);\n });\n\n const setupAddress = $((options?: SetupAddressOptions) => {\n getClient(ctx).setupAddress(options);\n });\n\n const revokeToken = $(async (options?: RevokeTokenOptions) => {\n const client = getClient(ctx);\n isLoading.value = true;\n error.value = null;\n try {\n await client.revokeToken(options);\n } catch (err) {\n error.value = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n isLoading.value = false;\n }\n });\n\n return {\n login,\n logout,\n selectAccount,\n addAccount,\n register,\n recoverAccount,\n verifyAccount,\n upgradeAccount,\n setupPasskey,\n setupAddress,\n revokeToken,\n isLoading,\n };\n}\n\n/** Get URL builders for auth pages (non-redirecting, useful for <a> tags) */\nexport function useAuthUrls() {\n const ctx = useDouveryAuth();\n return {\n loginUrl: $(\n (options?: LoginOptions): AuthUrl =>\n getClient(ctx).buildLoginUrl(options),\n ),\n logoutUrl: $(\n (options?: LogoutOptions): AuthUrl =>\n getClient(ctx).buildLogoutUrl(options),\n ),\n selectAccountUrl: $(\n (options?: SelectAccountOptions): AuthUrl =>\n getClient(ctx).buildSelectAccountUrl(options),\n ),\n addAccountUrl: $(\n (options?: AddAccountOptions): AuthUrl =>\n getClient(ctx).buildAddAccountUrl(options),\n ),\n registerUrl: $(\n (options?: RegisterOptions): AuthUrl =>\n getClient(ctx).buildRegisterUrl(options),\n ),\n recoverAccountUrl: $(\n (options?: RecoverAccountOptions): AuthUrl =>\n getClient(ctx).buildRecoverAccountUrl(options),\n ),\n verifyAccountUrl: $(\n (options?: VerifyAccountOptions): AuthUrl =>\n getClient(ctx).buildVerifyAccountUrl(options),\n ),\n upgradeAccountUrl: $(\n (options?: UpgradeAccountOptions): AuthUrl =>\n getClient(ctx).buildUpgradeAccountUrl(options),\n ),\n setupPasskeyUrl: $(\n (options?: SetupPasskeyOptions): AuthUrl =>\n getClient(ctx).buildSetupPasskeyUrl(options),\n ),\n setupAddressUrl: $(\n (options?: SetupAddressOptions): AuthUrl =>\n getClient(ctx).buildSetupAddressUrl(options),\n ),\n };\n}\n\n/** Get session status helpers */\nexport function useSessionStatus() {\n const ctx = useDouveryAuth();\n const { state } = ctx;\n const c = ctx.clientRef.value;\n const isExpired = useSignal(c ? c.isSessionExpired() : false);\n const needsVerification = useSignal(c ? c.needsEmailVerification() : false);\n const isGuest = useSignal(c ? c.isGuestAccount() : false);\n\n useTask$(({ track }) => {\n track(() => state.value);\n const client = ctx.clientRef.value;\n if (client) {\n isExpired.value = client.isSessionExpired();\n needsVerification.value = client.needsEmailVerification();\n isGuest.value = client.isGuestAccount();\n }\n });\n\n return { isExpired, needsVerification, isGuest };\n}\n\n// ============================================================================\n// App User hooks\n// ============================================================================\n\n/**\n * Returns the application-specific user data provided via `appUser` prop.\n * Cast to your app's user type: `const user = useAppUser<UserACC>()`.\n * Returns `{ user: Signal<T | null>, isAuthenticated: Signal<boolean> }`.\n */\nexport function useAppUser<T = unknown>() {\n const { appUser, appUserAuthenticated } = useDouveryAuth();\n return {\n user: appUser as Signal<T | null>,\n isAuthenticated: appUserAuthenticated,\n };\n}\n\n/**\n * Full app user context with refresh capabilities.\n * Use when you need to re-fetch user data from the server.\n */\nexport function useAppUserActions<T = unknown>() {\n const { appUser, appUserAuthenticated } = useDouveryAuth();\n\n const updateUser = $((userData: T | null) => {\n (appUser as Signal<T | null>).value = userData;\n appUserAuthenticated.value = !!userData;\n });\n\n const refreshUser = $(async () => {\n try {\n const response = await fetch(\"/api/auth/me\", {\n method: \"GET\",\n credentials: \"include\",\n headers: { \"Cache-Control\": \"no-cache\", Pragma: \"no-cache\" },\n });\n\n if (response.ok) {\n const data = await response.json();\n (appUser as Signal<T | null>).value = data.user;\n appUserAuthenticated.value = true;\n } else if (response.status === 401 || response.status === 403) {\n (appUser as Signal<T | null>).value = null;\n appUserAuthenticated.value = false;\n }\n } catch {\n // Network error: keep current state\n }\n });\n\n return {\n user: appUser as Signal<T | null>,\n isAuthenticated: appUserAuthenticated,\n updateUser,\n refreshUser,\n };\n}\n\n// ============================================================================\n// Re-exports\n// ============================================================================\n\nexport { DouveryAuthClient, createDouveryAuth } from \"@douvery/auth\";\nexport type {\n DouveryAuthConfig,\n AuthState,\n User,\n LoginOptions,\n LogoutOptions,\n SelectAccountOptions,\n RegisterOptions,\n RecoverAccountOptions,\n VerifyAccountOptions,\n UpgradeAccountOptions,\n SetupPasskeyOptions,\n SetupAddressOptions,\n AddAccountOptions,\n RevokeTokenOptions,\n AuthUrl,\n} from \"@douvery/auth\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@douvery/auth",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "OAuth 2.0/OIDC client for Douvery authentication",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",