@absolutejs/auth 0.56.19 → 0.57.1
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/agents/index.js +44 -37
- package/dist/agents/index.js.map +7 -7
- package/dist/audit/postgresAuditStore.d.ts +1 -1
- package/dist/audit/types.d.ts +2 -0
- package/dist/audit/wrap.d.ts +4 -2
- package/dist/cli/import/auth0.d.ts +1 -1
- package/dist/cli/import/clerk.d.ts +1 -1
- package/dist/cli/import/lucia.d.ts +1 -1
- package/dist/cli/import/nextauth.d.ts +1 -1
- package/dist/cli/import/types.d.ts +1 -0
- package/dist/cli/migrate.js +91 -47
- package/dist/cli/migrate.js.map +14 -13
- package/dist/client/react.d.ts +21 -21
- package/dist/client/react.js +35 -37
- package/dist/client/react.js.map +6 -6
- package/dist/client/solid.d.ts +21 -21
- package/dist/client/solid.js +24 -24
- package/dist/client/solid.js.map +3 -3
- package/dist/client/svelte.d.ts +21 -21
- package/dist/client/svelte.js +25 -25
- package/dist/client/svelte.js.map +3 -3
- package/dist/client/vue.d.ts +21 -21
- package/dist/client/vue.js +32 -32
- package/dist/client/vue.js.map +3 -3
- package/dist/credentials/import.d.ts +16 -1
- package/dist/credentials/register.d.ts +1 -1
- package/dist/credentials/routes.d.ts +1 -1
- package/dist/fingerprint-client/index.js +4 -3
- package/dist/fingerprint-client/index.js.map +3 -3
- package/dist/index.d.ts +4 -4
- package/dist/index.js +6416 -262
- package/dist/index.js.map +166 -26
- package/dist/manifest.js +3713 -271
- package/dist/manifest.js.map +30 -4
- package/dist/manifest.json +3 -2
- package/dist/oidc/clientIdMetadata.d.ts +1 -5
- package/dist/oidc/index.js.map +2 -2
- package/dist/oidc/routes.d.ts +1 -1
- package/dist/oidc/vci.d.ts +1 -1
- package/dist/routes/callback.d.ts +1 -1
- package/dist/server.js +6412 -261
- package/dist/server.js.map +166 -26
- package/dist/session/neonStore.d.ts +2 -2
- package/dist/session/redisStore.d.ts +2 -2
- package/dist/session/types.d.ts +2 -0
- package/dist/stores/postgres.d.ts +2 -2
- package/dist/types.d.ts +2 -1
- package/dist/vault/index.js.map +2 -2
- package/dist/webauthn.js +27 -1
- package/dist/webauthn.js.map +3 -3
- package/docs/MIGRATE-FROM-LUCIA.md +19 -2
- package/package.json +1 -1
package/dist/client/react.d.ts
CHANGED
|
@@ -15,6 +15,11 @@ export declare const useMagicLink: (client: AuthClient) => MutationState<{
|
|
|
15
15
|
}, {
|
|
16
16
|
ok: true;
|
|
17
17
|
}>;
|
|
18
|
+
export declare const useMfaChallenge: (client: AuthClient) => MutationState<{
|
|
19
|
+
code: string;
|
|
20
|
+
}, {
|
|
21
|
+
status: "authenticated";
|
|
22
|
+
}>;
|
|
18
23
|
export declare const usePasskeyAutofill: (client: AuthClient) => {
|
|
19
24
|
cancel: () => void;
|
|
20
25
|
data: {
|
|
@@ -24,27 +29,6 @@ export declare const usePasskeyAutofill: (client: AuthClient) => {
|
|
|
24
29
|
isPending: boolean;
|
|
25
30
|
start: () => Promise<void>;
|
|
26
31
|
};
|
|
27
|
-
export declare const useUpgradeToPasskey: (client: AuthClient) => {
|
|
28
|
-
error: AuthClientError | null;
|
|
29
|
-
isPending: boolean;
|
|
30
|
-
passkeys: unknown[] | null;
|
|
31
|
-
refetch: () => Promise<void>;
|
|
32
|
-
register: () => Promise<{
|
|
33
|
-
data: null;
|
|
34
|
-
error: AuthClientError;
|
|
35
|
-
} | {
|
|
36
|
-
data: {
|
|
37
|
-
ok: true;
|
|
38
|
-
};
|
|
39
|
-
error: null;
|
|
40
|
-
}>;
|
|
41
|
-
shouldPrompt: boolean;
|
|
42
|
-
};
|
|
43
|
-
export declare const useMfaChallenge: (client: AuthClient) => MutationState<{
|
|
44
|
-
code: string;
|
|
45
|
-
}, {
|
|
46
|
-
status: "authenticated";
|
|
47
|
-
}>;
|
|
48
32
|
export declare const usePasswordReset: (client: AuthClient) => MutationState<{
|
|
49
33
|
email: string;
|
|
50
34
|
}, {
|
|
@@ -82,6 +66,22 @@ export declare const useSignUp: (client: AuthClient) => MutationState<{
|
|
|
82
66
|
} | {
|
|
83
67
|
status: "verification_required";
|
|
84
68
|
}>;
|
|
69
|
+
export declare const useUpgradeToPasskey: (client: AuthClient) => {
|
|
70
|
+
error: AuthClientError | null;
|
|
71
|
+
isPending: boolean;
|
|
72
|
+
passkeys: unknown[] | null;
|
|
73
|
+
refetch: () => Promise<void>;
|
|
74
|
+
register: () => Promise<{
|
|
75
|
+
data: null;
|
|
76
|
+
error: AuthClientError;
|
|
77
|
+
} | {
|
|
78
|
+
data: {
|
|
79
|
+
ok: true;
|
|
80
|
+
};
|
|
81
|
+
error: null;
|
|
82
|
+
}>;
|
|
83
|
+
shouldPrompt: boolean;
|
|
84
|
+
};
|
|
85
85
|
export { SignIn, type SignInProps } from './components/react/SignIn';
|
|
86
86
|
export { SignUp, type SignUpProps } from './components/react/SignUp';
|
|
87
87
|
export { UserButton, type UserButtonItem, type UserButtonProps, type UserButtonUser } from './components/react/UserButton';
|
package/dist/client/react.js
CHANGED
|
@@ -99,8 +99,7 @@ var runPasskeyRegistration = async (client) => {
|
|
|
99
99
|
};
|
|
100
100
|
|
|
101
101
|
// src/client/components/react/SignIn.ts
|
|
102
|
-
import { createElement } from "react";
|
|
103
|
-
import { useState } from "react";
|
|
102
|
+
import { createElement, useState } from "react";
|
|
104
103
|
var SignIn = ({
|
|
105
104
|
client,
|
|
106
105
|
classNames,
|
|
@@ -149,19 +148,19 @@ var SignIn = ({
|
|
|
149
148
|
autoComplete: "username webauthn",
|
|
150
149
|
className: classNames?.input,
|
|
151
150
|
name: "email",
|
|
152
|
-
onChange: (event) => setEmail(event.currentTarget.value),
|
|
153
151
|
required: true,
|
|
154
152
|
type: "email",
|
|
155
|
-
value: email
|
|
153
|
+
value: email,
|
|
154
|
+
onChange: (event) => setEmail(event.currentTarget.value)
|
|
156
155
|
})), createElement("label", { className: classNames?.field, "data-abs-auth": "password-field" }, createElement("span", { className: classNames?.label }, passwordLabel), createElement("input", {
|
|
157
156
|
autoComplete: "current-password",
|
|
158
157
|
className: classNames?.input,
|
|
159
158
|
minLength: 12,
|
|
160
159
|
name: "password",
|
|
161
|
-
onChange: (event) => setPassword(event.currentTarget.value),
|
|
162
160
|
required: true,
|
|
163
161
|
type: "password",
|
|
164
|
-
value: password
|
|
162
|
+
value: password,
|
|
163
|
+
onChange: (event) => setPassword(event.currentTarget.value)
|
|
165
164
|
})), errorBanner, createElement("button", {
|
|
166
165
|
className: classNames?.button,
|
|
167
166
|
"data-abs-auth": "submit",
|
|
@@ -170,8 +169,7 @@ var SignIn = ({
|
|
|
170
169
|
}, isPending ? "Signing in\u2026" : submitLabel));
|
|
171
170
|
};
|
|
172
171
|
// src/client/components/react/SignUp.ts
|
|
173
|
-
import { createElement as createElement2 } from "react";
|
|
174
|
-
import { useState as useState2 } from "react";
|
|
172
|
+
import { createElement as createElement2, useState as useState2 } from "react";
|
|
175
173
|
var SignUp = ({
|
|
176
174
|
client,
|
|
177
175
|
classNames,
|
|
@@ -207,19 +205,19 @@ var SignUp = ({
|
|
|
207
205
|
autoComplete: "email",
|
|
208
206
|
className: classNames?.input,
|
|
209
207
|
name: "email",
|
|
210
|
-
onChange: (event) => setEmail(event.currentTarget.value),
|
|
211
208
|
required: true,
|
|
212
209
|
type: "email",
|
|
213
|
-
value: email
|
|
210
|
+
value: email,
|
|
211
|
+
onChange: (event) => setEmail(event.currentTarget.value)
|
|
214
212
|
})), createElement2("label", { className: classNames?.field, "data-abs-auth": "password-field" }, createElement2("span", { className: classNames?.label }, passwordLabel), createElement2("input", {
|
|
215
213
|
autoComplete: "new-password",
|
|
216
214
|
className: classNames?.input,
|
|
217
215
|
minLength: 12,
|
|
218
216
|
name: "password",
|
|
219
|
-
onChange: (event) => setPassword(event.currentTarget.value),
|
|
220
217
|
required: true,
|
|
221
218
|
type: "password",
|
|
222
|
-
value: password
|
|
219
|
+
value: password,
|
|
220
|
+
onChange: (event) => setPassword(event.currentTarget.value)
|
|
223
221
|
})), errorBanner, createElement2("button", {
|
|
224
222
|
className: classNames?.button,
|
|
225
223
|
"data-abs-auth": "submit",
|
|
@@ -262,12 +260,12 @@ var UserButton = ({
|
|
|
262
260
|
}, item.label)), createElement3("button", {
|
|
263
261
|
className: classNames?.signOut,
|
|
264
262
|
"data-abs-auth": "sign-out",
|
|
263
|
+
type: "button",
|
|
265
264
|
onClick: async () => {
|
|
266
265
|
await mutate(undefined);
|
|
267
266
|
setOpen(false);
|
|
268
267
|
onSignOut?.();
|
|
269
|
-
}
|
|
270
|
-
type: "button"
|
|
268
|
+
}
|
|
271
269
|
}, signOutLabel)) : null;
|
|
272
270
|
const avatar = user.avatarUrl === undefined ? createElement3("span", {
|
|
273
271
|
className: classNames?.avatar,
|
|
@@ -286,8 +284,8 @@ var UserButton = ({
|
|
|
286
284
|
"aria-expanded": open,
|
|
287
285
|
className: classNames?.toggle,
|
|
288
286
|
"data-abs-auth": "user-toggle",
|
|
289
|
-
|
|
290
|
-
|
|
287
|
+
type: "button",
|
|
288
|
+
onClick: () => setOpen((prev) => !prev)
|
|
291
289
|
}, avatar, createElement3("span", { className: classNames?.email, "data-abs-auth": "user-email" }, user.givenName ?? user.email ?? "Account")), menu);
|
|
292
290
|
};
|
|
293
291
|
|
|
@@ -319,6 +317,7 @@ var useMutation = (run) => {
|
|
|
319
317
|
return { data, error, isPending, mutate, reset };
|
|
320
318
|
};
|
|
321
319
|
var useMagicLink = (client) => useMutation(client.passwordless.requestMagicLink);
|
|
320
|
+
var useMfaChallenge = (client) => useMutation(client.mfa.challenge);
|
|
322
321
|
var usePasskeyAutofill = (client) => {
|
|
323
322
|
const [data, setData] = useState4(null);
|
|
324
323
|
const [error, setError] = useState4(null);
|
|
@@ -342,8 +341,9 @@ var usePasskeyAutofill = (client) => {
|
|
|
342
341
|
}, []);
|
|
343
342
|
return { cancel, data, error, isPending, start };
|
|
344
343
|
};
|
|
345
|
-
var
|
|
346
|
-
|
|
344
|
+
var usePasswordReset = (client) => useMutation(client.passwordReset.request);
|
|
345
|
+
var useSessions = (client) => {
|
|
346
|
+
const [data, setData] = useState4(null);
|
|
347
347
|
const [error, setError] = useState4(null);
|
|
348
348
|
const [isPending, setIsPending] = useState4(true);
|
|
349
349
|
const mountedRef = useRef(true);
|
|
@@ -352,9 +352,9 @@ var useUpgradeToPasskey = (client) => {
|
|
|
352
352
|
}, []);
|
|
353
353
|
const refetch = useCallback(async () => {
|
|
354
354
|
setIsPending(true);
|
|
355
|
-
const result = await client.
|
|
355
|
+
const result = await client.sessions.list();
|
|
356
356
|
if (mountedRef.current) {
|
|
357
|
-
|
|
357
|
+
setData(result.data);
|
|
358
358
|
setError(result.error);
|
|
359
359
|
setIsPending(false);
|
|
360
360
|
}
|
|
@@ -362,19 +362,19 @@ var useUpgradeToPasskey = (client) => {
|
|
|
362
362
|
useEffect(() => {
|
|
363
363
|
refetch();
|
|
364
364
|
}, [refetch]);
|
|
365
|
-
const
|
|
366
|
-
const result = await
|
|
365
|
+
const revoke = useCallback(async (sessionId) => {
|
|
366
|
+
const result = await client.sessions.revoke(sessionId);
|
|
367
367
|
if (result.error === null)
|
|
368
368
|
await refetch();
|
|
369
369
|
return result;
|
|
370
370
|
}, [client, refetch]);
|
|
371
|
-
|
|
372
|
-
return { error, isPending, passkeys, refetch, register, shouldPrompt };
|
|
371
|
+
return { data, error, isPending, refetch, revoke };
|
|
373
372
|
};
|
|
374
|
-
var
|
|
375
|
-
var
|
|
376
|
-
var
|
|
377
|
-
|
|
373
|
+
var useSignIn = (client) => useMutation(client.signIn.email);
|
|
374
|
+
var useSignOut = (client) => useMutation(client.signOut);
|
|
375
|
+
var useSignUp = (client) => useMutation(client.signUp.email);
|
|
376
|
+
var useUpgradeToPasskey = (client) => {
|
|
377
|
+
const [passkeys, setPasskeys] = useState4(null);
|
|
378
378
|
const [error, setError] = useState4(null);
|
|
379
379
|
const [isPending, setIsPending] = useState4(true);
|
|
380
380
|
const mountedRef = useRef(true);
|
|
@@ -383,9 +383,9 @@ var useSessions = (client) => {
|
|
|
383
383
|
}, []);
|
|
384
384
|
const refetch = useCallback(async () => {
|
|
385
385
|
setIsPending(true);
|
|
386
|
-
const result = await client.
|
|
386
|
+
const result = await client.passkeys.list();
|
|
387
387
|
if (mountedRef.current) {
|
|
388
|
-
|
|
388
|
+
setPasskeys(result.data);
|
|
389
389
|
setError(result.error);
|
|
390
390
|
setIsPending(false);
|
|
391
391
|
}
|
|
@@ -393,17 +393,15 @@ var useSessions = (client) => {
|
|
|
393
393
|
useEffect(() => {
|
|
394
394
|
refetch();
|
|
395
395
|
}, [refetch]);
|
|
396
|
-
const
|
|
397
|
-
const result = await client
|
|
396
|
+
const register = useCallback(async () => {
|
|
397
|
+
const result = await runPasskeyRegistration(client);
|
|
398
398
|
if (result.error === null)
|
|
399
399
|
await refetch();
|
|
400
400
|
return result;
|
|
401
401
|
}, [client, refetch]);
|
|
402
|
-
|
|
402
|
+
const shouldPrompt = passkeys !== null && passkeys.length === 0;
|
|
403
|
+
return { error, isPending, passkeys, refetch, register, shouldPrompt };
|
|
403
404
|
};
|
|
404
|
-
var useSignIn = (client) => useMutation(client.signIn.email);
|
|
405
|
-
var useSignOut = (client) => useMutation(client.signOut);
|
|
406
|
-
var useSignUp = (client) => useMutation(client.signUp.email);
|
|
407
405
|
export {
|
|
408
406
|
useUpgradeToPasskey,
|
|
409
407
|
useSignUp,
|
|
@@ -419,5 +417,5 @@ export {
|
|
|
419
417
|
SignIn
|
|
420
418
|
};
|
|
421
419
|
|
|
422
|
-
//# debugId=
|
|
420
|
+
//# debugId=BD77ABF59C4B6DD264756E2164756E21
|
|
423
421
|
//# sourceMappingURL=react.js.map
|
package/dist/client/react.js.map
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/client/react.ts", "../src/client/passkeyHelpers.ts", "../src/client/components/react/SignIn.ts", "../src/client/components/react/SignUp.ts", "../src/client/components/react/UserButton.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"// Thin React hooks over `createAuthClient`. Same `{ data, error }` shape; the hook adds\n// `isPending` state and a stable mutator. Bring your own form/UI — these are primitives, not\n// components. Composables (Vue/Solid/Svelte) will follow the same pattern over the same client.\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { AuthClient, AuthClientError } from './createAuthClient';\nimport {\n\trunConditionalAuthentication,\n\trunPasskeyRegistration\n} from './passkeyHelpers';\n\ntype Mutator<Args, Data> = (\n\targs: Args\n) => Promise<{ data: Data | null; error: AuthClientError | null }>;\n\ntype MutationState<Args, Data> = {\n\tdata: Data | null;\n\terror: AuthClientError | null;\n\tisPending: boolean;\n\tmutate: Mutator<Args, Data>;\n\treset: () => void;\n};\n\n// Generic mutation hook. The other hooks are 1–2 line specializations of this — kept private\n// here so consumers see the cohesive named API and don't depend on this shape.\nconst useMutation = <Args, Data>(\n\trun: Mutator<Args, Data>\n): MutationState<Args, Data> => {\n\tconst [data, setData] = useState<Data | null>(null);\n\tconst [error, setError] = useState<AuthClientError | null>(null);\n\tconst [isPending, setIsPending] = useState(false);\n\tconst mountedRef = useRef(true);\n\tuseEffect(\n\t\t() => () => {\n\t\t\tmountedRef.current = false;\n\t\t},\n\t\t[]\n\t);\n\n\tconst mutate: Mutator<Args, Data> = useCallback(\n\t\tasync (args) => {\n\t\t\tsetIsPending(true);\n\t\t\tsetError(null);\n\t\t\tconst result = await run(args);\n\t\t\tif (mountedRef.current) {\n\t\t\t\tsetData(result.data);\n\t\t\t\tsetError(result.error);\n\t\t\t\tsetIsPending(false);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\t[run]\n\t);\n\n\tconst reset = useCallback(() => {\n\t\tsetData(null);\n\t\tsetError(null);\n\t\tsetIsPending(false);\n\t}, []);\n\n\treturn { data, error, isPending, mutate, reset };\n};\n\nexport const useMagicLink = (client: AuthClient) =>\n\tuseMutation(client.passwordless.requestMagicLink);\
|
|
5
|
+
"// Thin React hooks over `createAuthClient`. Same `{ data, error }` shape; the hook adds\n// `isPending` state and a stable mutator. Bring your own form/UI — these are primitives, not\n// components. Composables (Vue/Solid/Svelte) will follow the same pattern over the same client.\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { AuthClient, AuthClientError } from './createAuthClient';\nimport {\n\trunConditionalAuthentication,\n\trunPasskeyRegistration\n} from './passkeyHelpers';\n\ntype Mutator<Args, Data> = (\n\targs: Args\n) => Promise<{ data: Data | null; error: AuthClientError | null }>;\n\ntype MutationState<Args, Data> = {\n\tdata: Data | null;\n\terror: AuthClientError | null;\n\tisPending: boolean;\n\tmutate: Mutator<Args, Data>;\n\treset: () => void;\n};\n\n// Generic mutation hook. The other hooks are 1–2 line specializations of this — kept private\n// here so consumers see the cohesive named API and don't depend on this shape.\nconst useMutation = <Args, Data>(\n\trun: Mutator<Args, Data>\n): MutationState<Args, Data> => {\n\tconst [data, setData] = useState<Data | null>(null);\n\tconst [error, setError] = useState<AuthClientError | null>(null);\n\tconst [isPending, setIsPending] = useState(false);\n\tconst mountedRef = useRef(true);\n\tuseEffect(\n\t\t() => () => {\n\t\t\tmountedRef.current = false;\n\t\t},\n\t\t[]\n\t);\n\n\tconst mutate: Mutator<Args, Data> = useCallback(\n\t\tasync (args) => {\n\t\t\tsetIsPending(true);\n\t\t\tsetError(null);\n\t\t\tconst result = await run(args);\n\t\t\tif (mountedRef.current) {\n\t\t\t\tsetData(result.data);\n\t\t\t\tsetError(result.error);\n\t\t\t\tsetIsPending(false);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\t[run]\n\t);\n\n\tconst reset = useCallback(() => {\n\t\tsetData(null);\n\t\tsetError(null);\n\t\tsetIsPending(false);\n\t}, []);\n\n\treturn { data, error, isPending, mutate, reset };\n};\n\nexport const useMagicLink = (client: AuthClient) =>\n\tuseMutation(client.passwordless.requestMagicLink);\nexport const useMfaChallenge = (client: AuthClient) =>\n\tuseMutation(client.mfa.challenge);\nexport const usePasskeyAutofill = (client: AuthClient) => {\n\tconst [data, setData] = useState<{ status: 'authenticated' } | null>(null);\n\tconst [error, setError] = useState<AuthClientError | null>(null);\n\tconst [isPending, setIsPending] = useState(false);\n\tconst mountedRef = useRef(true);\n\tuseEffect(\n\t\t() => () => {\n\t\t\tmountedRef.current = false;\n\t\t},\n\t\t[]\n\t);\n\n\tconst start = useCallback(async () => {\n\t\tsetIsPending(true);\n\t\tsetError(null);\n\t\tconst result = await runConditionalAuthentication(client);\n\t\tif (mountedRef.current) {\n\t\t\tsetData(result.data);\n\t\t\tsetError(result.error);\n\t\t\tsetIsPending(false);\n\t\t}\n\t}, [client]);\n\n\tconst cancel = useCallback(() => {\n\t\t// startAuthentication doesn't expose an AbortController in @simplewebauthn/browser;\n\t\t// best-effort cancel is to clear the pending flag. The Promise will still resolve\n\t\t// when the browser autofill dismisses; mountedRef gates the result write.\n\t\tsetIsPending(false);\n\t}, []);\n\n\treturn { cancel, data, error, isPending, start };\n};\nexport const usePasswordReset = (client: AuthClient) =>\n\tuseMutation(client.passwordReset.request);\nexport const useSessions = (client: AuthClient) => {\n\tconst [data, setData] = useState<unknown[] | null>(null);\n\tconst [error, setError] = useState<AuthClientError | null>(null);\n\tconst [isPending, setIsPending] = useState(true);\n\tconst mountedRef = useRef(true);\n\tuseEffect(\n\t\t() => () => {\n\t\t\tmountedRef.current = false;\n\t\t},\n\t\t[]\n\t);\n\n\tconst refetch = useCallback(async () => {\n\t\tsetIsPending(true);\n\t\tconst result = await client.sessions.list();\n\t\tif (mountedRef.current) {\n\t\t\tsetData(result.data);\n\t\t\tsetError(result.error);\n\t\t\tsetIsPending(false);\n\t\t}\n\t}, [client]);\n\n\tuseEffect(() => {\n\t\tvoid refetch();\n\t}, [refetch]);\n\n\tconst revoke = useCallback(\n\t\tasync (sessionId: string) => {\n\t\t\tconst result = await client.sessions.revoke(sessionId);\n\t\t\tif (result.error === null) await refetch();\n\n\t\t\treturn result;\n\t\t},\n\t\t[client, refetch]\n\t);\n\n\treturn { data, error, isPending, refetch, revoke };\n};\nexport const useSignIn = (client: AuthClient) =>\n\tuseMutation(client.signIn.email);\nexport const useSignOut = (client: AuthClient) => useMutation(client.signOut);\nexport const useSignUp = (client: AuthClient) =>\n\tuseMutation(client.signUp.email);\nexport const useUpgradeToPasskey = (client: AuthClient) => {\n\tconst [passkeys, setPasskeys] = useState<unknown[] | null>(null);\n\tconst [error, setError] = useState<AuthClientError | null>(null);\n\tconst [isPending, setIsPending] = useState(true);\n\tconst mountedRef = useRef(true);\n\tuseEffect(\n\t\t() => () => {\n\t\t\tmountedRef.current = false;\n\t\t},\n\t\t[]\n\t);\n\n\tconst refetch = useCallback(async () => {\n\t\tsetIsPending(true);\n\t\tconst result = await client.passkeys.list();\n\t\tif (mountedRef.current) {\n\t\t\tsetPasskeys(result.data);\n\t\t\tsetError(result.error);\n\t\t\tsetIsPending(false);\n\t\t}\n\t}, [client]);\n\n\tuseEffect(() => {\n\t\tvoid refetch();\n\t}, [refetch]);\n\n\tconst register = useCallback(async () => {\n\t\tconst result = await runPasskeyRegistration(client);\n\t\tif (result.error === null) await refetch();\n\n\t\treturn result;\n\t}, [client, refetch]);\n\n\tconst shouldPrompt = passkeys !== null && passkeys.length === 0;\n\n\treturn { error, isPending, passkeys, refetch, register, shouldPrompt };\n};\n\n// Drop-in headless components — minimal default markup, fully\n// restyleable via the `classNames` prop. Every element carries a\n// `data-abs-auth=…` attribute the consumer can target from CSS. Useful\n// when migrating off Clerk's `<UserButton />` / `<SignIn />`: pass\n// `classNames` to match your existing visual treatment, drop the\n// vendor dep.\nexport { SignIn, type SignInProps } from './components/react/SignIn';\nexport { SignUp, type SignUpProps } from './components/react/SignUp';\nexport {\n\tUserButton,\n\ttype UserButtonItem,\n\ttype UserButtonProps,\n\ttype UserButtonUser\n} from './components/react/UserButton';\n",
|
|
6
6
|
"// Framework-agnostic glue between the WebAuthn ceremonies the package exposes via\n// `createAuthClient` and the browser's `navigator.credentials.{get,create}` APIs.\n// Used by the framework composables (`./react`, `./vue`, `./solid`, `./svelte`) so the\n// React + Vue + Solid + Svelte hooks all share the same imperative core; the framework\n// wrappers only add reactivity.\n//\n// `@simplewebauthn/browser` is an OPTIONAL peer dep — consumers that don't import any\n// of the passkey composables never load it. We dynamic-import lazily on first call so a\n// non-passkey consumer pays nothing at module load.\n\nimport type { AuthClient, AuthClientError } from './createAuthClient';\n\nconst loadBrowser = () => import('@simplewebauthn/browser');\n\nconst errorFor = (caught: unknown): AuthClientError => ({\n\tbody: null,\n\tmessage: caught instanceof Error ? caught.message : 'webauthn_failed',\n\tstatus: 0\n});\n\n// Runs the WebAuthn authentication ceremony in conditional-UI mode (the browser surfaces\n// saved passkeys directly via autofill on a focused `<input autocomplete=\"webauthn\">`).\n// Returns the same `{ data, error }` shape `createAuthClient` already uses, so composables\n// can pipe the result into their state setters unchanged.\nexport const runConditionalAuthentication = async (client: AuthClient) => {\n\tif (typeof window === 'undefined' || !window.PublicKeyCredential) {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\terror: errorFor(new Error('webauthn_unavailable'))\n\t\t};\n\t}\n\tconst options = await client.passkeys.authenticateOptions();\n\tif (options.error) return { data: null, error: options.error };\n\ttry {\n\t\tconst { startAuthentication } = await loadBrowser();\n\t\tconst credential = await startAuthentication({\n\t\t\toptionsJSON: options.data,\n\t\t\tuseBrowserAutofill: true\n\t\t});\n\n\t\treturn client.passkeys.authenticateVerify(credential);\n\t} catch (caught) {\n\t\treturn { data: null, error: errorFor(caught) };\n\t}\n};\n\n// Runs the WebAuthn registration ceremony for the currently authenticated user. Used by\n// the \"upgrade to passkey\" prompt — after a password sign-in, surface a \"save a passkey\n// to this device for next time?\" CTA.\nexport const runPasskeyRegistration = async (client: AuthClient) => {\n\tif (typeof window === 'undefined' || !window.PublicKeyCredential) {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\terror: errorFor(new Error('webauthn_unavailable'))\n\t\t};\n\t}\n\tconst options = await client.passkeys.registerOptions();\n\tif (options.error) return { data: null, error: options.error };\n\ttry {\n\t\tconst { startRegistration } = await loadBrowser();\n\t\tconst credential = await startRegistration({\n\t\t\toptionsJSON: options.data\n\t\t});\n\n\t\treturn client.passkeys.registerVerify(credential);\n\t} catch (caught) {\n\t\treturn { data: null, error: errorFor(caught) };\n\t}\n};\n",
|
|
7
|
-
"// Drop-in sign-in component for React. Headless — minimal default\n// markup, every element has a stable `data-abs-auth` attribute the\n// consumer can target from their own CSS. Doesn't bundle styles;\n// consumers bring their own (Tailwind class lists, CSS-in-JS,\n// vanilla CSS, whatever).\n//\n// Usage:\n//\n// import { SignIn } from '@absolutejs/auth/react';\n//\n// <SignIn\n// client={authClient}\n// onSuccess={() => router.push('/dashboard')}\n// providers={['google', 'github']}\n// />\n//\n// The component renders an email/password form, calls the package's\n// useSignIn hook on submit, and emits onSuccess/onError. OAuth provider\n// buttons (when `providers` is set) are real anchor links to\n// `/oauth2/authorize?provider=…` — the consumer's existing OAuth\n// roundtrip + onCallbackSuccess hook is what handles the rest.\nimport { createElement, type FormEvent
|
|
8
|
-
"// Drop-in sign-up component for React. Mirrors SignIn but calls\n// useSignUp + advertises the 12-character minimum-length we enforce\n// at the package level. See SignIn for the design rationale + the\n// data-abs-auth attribute hook system.\nimport { createElement, type FormEvent
|
|
9
|
-
"// Drop-in current-user button for React. The component that Clerk's\n// `<UserButton />` was sticky for: shows the signed-in user's email +\n// avatar, expands to a menu on click, exposes sign-out + a\n// customizable list of links.\n//\n// Usage:\n//\n// <UserButton\n// client={authClient}\n// user={user} // your AuthUser-shaped record\n// items={[\n// { label: 'Settings', href: '/settings' },\n// { label: 'API keys', href: '/settings/api' }\n// ]}\n// onSignOut={() => router.push('/')}\n// />\n//\n// The component owns NO data fetching — the consumer passes `user` from\n// wherever they keep session state. Sign-out goes through the package's\n// /oauth2/signout (universal across credential + OAuth sessions since\n// 0.32.0).\nimport { createElement, useState } from 'react';\nimport type { AuthClient } from '../../createAuthClient';\nimport { useSignOut } from '../../react';\n\nexport type UserButtonUser = {\n\tavatarUrl?: string;\n\temail?: string;\n\tgivenName?: string;\n};\n\nexport type UserButtonItem = {\n\thref: string;\n\tlabel: string;\n};\n\nexport type UserButtonProps = {\n\tclient: AuthClient;\n\tclassNames?: {\n\t\tavatar?: string;\n\t\tcontainer?: string;\n\t\temail?: string;\n\t\tmenu?: string;\n\t\tmenuItem?: string;\n\t\tsignOut?: string;\n\t\ttoggle?: string;\n\t};\n\titems?: UserButtonItem[];\n\tonSignOut?: () => void;\n\tsignedOutHref?: string;\n\tsignOutLabel?: string;\n\tuser: UserButtonUser | null;\n};\n\nconst initial = (user: UserButtonUser) => {\n\tconst source = user.givenName ?? user.email ?? '?';\n\n\treturn source.slice(0, 1).toUpperCase();\n};\n\nexport const UserButton = ({\n\tclient,\n\tclassNames,\n\titems,\n\tonSignOut,\n\tsignedOutHref = '/',\n\tsignOutLabel = 'Sign out',\n\tuser\n}: UserButtonProps) => {\n\tconst [open, setOpen] = useState(false);\n\tconst { mutate } = useSignOut(client);\n\n\tif (user === null) {\n\t\treturn createElement(\n\t\t\t'a',\n\t\t\t{\n\t\t\t\tclassName: classNames?.toggle,\n\t\t\t\t'data-abs-auth': 'signed-out',\n\t\t\t\thref: signedOutHref\n\t\t\t},\n\t\t\t'Sign in'\n\t\t);\n\t}\n\n\tconst menu = open\n\t\t? createElement(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tclassName: classNames?.menu,\n\t\t\t\t\t'data-abs-auth': 'menu'\n\t\t\t\t},\n\t\t\t\t...(
|
|
7
|
+
"// Drop-in sign-in component for React. Headless — minimal default\n// markup, every element has a stable `data-abs-auth` attribute the\n// consumer can target from their own CSS. Doesn't bundle styles;\n// consumers bring their own (Tailwind class lists, CSS-in-JS,\n// vanilla CSS, whatever).\n//\n// Usage:\n//\n// import { SignIn } from '@absolutejs/auth/react';\n//\n// <SignIn\n// client={authClient}\n// onSuccess={() => router.push('/dashboard')}\n// providers={['google', 'github']}\n// />\n//\n// The component renders an email/password form, calls the package's\n// useSignIn hook on submit, and emits onSuccess/onError. OAuth provider\n// buttons (when `providers` is set) are real anchor links to\n// `/oauth2/authorize?provider=…` — the consumer's existing OAuth\n// roundtrip + onCallbackSuccess hook is what handles the rest.\nimport { createElement, type FormEvent, useState } from 'react';\nimport type { AuthClient, AuthClientError } from '../../createAuthClient';\nimport { useSignIn } from '../../react';\n\ntype AuthnSuccess = {\n\tpasswordCompromised?: boolean;\n\tstatus: 'authenticated' | 'mfa_required';\n};\n\nexport type SignInProps = {\n\tclient: AuthClient;\n\tclassNames?: {\n\t\tbutton?: string;\n\t\tcontainer?: string;\n\t\tdivider?: string;\n\t\terror?: string;\n\t\tfield?: string;\n\t\tinput?: string;\n\t\tlabel?: string;\n\t\toauthButton?: string;\n\t\toauthGrid?: string;\n\t};\n\temailLabel?: string;\n\tonError?: (error: AuthClientError) => void;\n\tonSuccess?: (result: AuthnSuccess) => void;\n\tpasswordLabel?: string;\n\t// OAuth provider keys (lowercase, matching your auth() config) to render\n\t// as buttons above the email/password form. e.g. ['google', 'github'].\n\tproviders?: string[];\n\tsubmitLabel?: string;\n};\n\nexport const SignIn = ({\n\tclient,\n\tclassNames,\n\temailLabel = 'Email',\n\tonError,\n\tonSuccess,\n\tpasswordLabel = 'Password',\n\tproviders,\n\tsubmitLabel = 'Sign in'\n}: SignInProps) => {\n\tconst [email, setEmail] = useState('');\n\tconst [password, setPassword] = useState('');\n\tconst { error, isPending, mutate } = useSignIn(client);\n\n\tconst handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n\t\tevent.preventDefault();\n\t\tconst result = await mutate({ email, password });\n\t\tif (result.error !== null) {\n\t\t\tonError?.(result.error);\n\n\t\t\treturn;\n\t\t}\n\t\tif (result.data !== null) onSuccess?.(result.data);\n\t};\n\n\tconst oauthButtons =\n\t\tproviders === undefined || providers.length === 0\n\t\t\t? null\n\t\t\t: createElement(\n\t\t\t\t\t'div',\n\t\t\t\t\t{\n\t\t\t\t\t\tclassName: classNames?.oauthGrid,\n\t\t\t\t\t\t'data-abs-auth': 'oauth-grid'\n\t\t\t\t\t},\n\t\t\t\t\t...providers.map((provider) =>\n\t\t\t\t\t\tcreateElement(\n\t\t\t\t\t\t\t'a',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tclassName: classNames?.oauthButton,\n\t\t\t\t\t\t\t\t'data-abs-auth-provider': provider,\n\t\t\t\t\t\t\t\thref: `/oauth2/authorize?provider=${provider}`,\n\t\t\t\t\t\t\t\tkey: provider\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`Continue with ${provider}`\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\tcreateElement(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclassName: classNames?.divider,\n\t\t\t\t\t\t\t'data-abs-auth': 'divider'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'or'\n\t\t\t\t\t)\n\t\t\t\t);\n\n\tconst errorBanner =\n\t\terror === null\n\t\t\t? null\n\t\t\t: createElement(\n\t\t\t\t\t'p',\n\t\t\t\t\t{\n\t\t\t\t\t\tclassName: classNames?.error,\n\t\t\t\t\t\t'data-abs-auth': 'error',\n\t\t\t\t\t\trole: 'alert'\n\t\t\t\t\t},\n\t\t\t\t\terror.message\n\t\t\t\t);\n\n\treturn createElement(\n\t\t'form',\n\t\t{\n\t\t\tclassName: classNames?.container,\n\t\t\t'data-abs-auth': 'sign-in',\n\t\t\tonSubmit: handleSubmit\n\t\t},\n\t\toauthButtons,\n\t\tcreateElement(\n\t\t\t'label',\n\t\t\t{ className: classNames?.field, 'data-abs-auth': 'email-field' },\n\t\t\tcreateElement('span', { className: classNames?.label }, emailLabel),\n\t\t\tcreateElement('input', {\n\t\t\t\tautoComplete: 'username webauthn',\n\t\t\t\tclassName: classNames?.input,\n\t\t\t\tname: 'email',\n\t\t\t\trequired: true,\n\t\t\t\ttype: 'email',\n\t\t\t\tvalue: email,\n\t\t\t\tonChange: (event: { currentTarget: HTMLInputElement }) =>\n\t\t\t\t\tsetEmail(event.currentTarget.value)\n\t\t\t})\n\t\t),\n\t\tcreateElement(\n\t\t\t'label',\n\t\t\t{ className: classNames?.field, 'data-abs-auth': 'password-field' },\n\t\t\tcreateElement(\n\t\t\t\t'span',\n\t\t\t\t{ className: classNames?.label },\n\t\t\t\tpasswordLabel\n\t\t\t),\n\t\t\tcreateElement('input', {\n\t\t\t\tautoComplete: 'current-password',\n\t\t\t\tclassName: classNames?.input,\n\t\t\t\tminLength: 12,\n\t\t\t\tname: 'password',\n\t\t\t\trequired: true,\n\t\t\t\ttype: 'password',\n\t\t\t\tvalue: password,\n\t\t\t\tonChange: (event: { currentTarget: HTMLInputElement }) =>\n\t\t\t\t\tsetPassword(event.currentTarget.value)\n\t\t\t})\n\t\t),\n\t\terrorBanner,\n\t\tcreateElement(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tclassName: classNames?.button,\n\t\t\t\t'data-abs-auth': 'submit',\n\t\t\t\tdisabled: isPending,\n\t\t\t\ttype: 'submit'\n\t\t\t},\n\t\t\tisPending ? 'Signing in…' : submitLabel\n\t\t)\n\t);\n};\n",
|
|
8
|
+
"// Drop-in sign-up component for React. Mirrors SignIn but calls\n// useSignUp + advertises the 12-character minimum-length we enforce\n// at the package level. See SignIn for the design rationale + the\n// data-abs-auth attribute hook system.\nimport { createElement, type FormEvent, useState } from 'react';\nimport type { AuthClient, AuthClientError } from '../../createAuthClient';\nimport { useSignUp } from '../../react';\n\ntype SignUpSuccess =\n\t| { status: 'authenticated' }\n\t| { status: 'verification_required' };\n\nexport type SignUpProps = {\n\tclient: AuthClient;\n\tclassNames?: {\n\t\tbutton?: string;\n\t\tcontainer?: string;\n\t\terror?: string;\n\t\tfield?: string;\n\t\tinput?: string;\n\t\tlabel?: string;\n\t};\n\temailLabel?: string;\n\tonError?: (error: AuthClientError) => void;\n\tonSuccess?: (result: SignUpSuccess) => void;\n\tpasswordLabel?: string;\n\tsubmitLabel?: string;\n};\n\nexport const SignUp = ({\n\tclient,\n\tclassNames,\n\temailLabel = 'Email',\n\tonError,\n\tonSuccess,\n\tpasswordLabel = 'Password (12+ characters)',\n\tsubmitLabel = 'Create account'\n}: SignUpProps) => {\n\tconst [email, setEmail] = useState('');\n\tconst [password, setPassword] = useState('');\n\tconst { error, isPending, mutate } = useSignUp(client);\n\n\tconst handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n\t\tevent.preventDefault();\n\t\tconst result = await mutate({ email, password });\n\t\tif (result.error !== null) {\n\t\t\tonError?.(result.error);\n\n\t\t\treturn;\n\t\t}\n\t\tif (result.data !== null) onSuccess?.(result.data);\n\t};\n\n\tconst errorBanner =\n\t\terror === null\n\t\t\t? null\n\t\t\t: createElement(\n\t\t\t\t\t'p',\n\t\t\t\t\t{\n\t\t\t\t\t\tclassName: classNames?.error,\n\t\t\t\t\t\t'data-abs-auth': 'error',\n\t\t\t\t\t\trole: 'alert'\n\t\t\t\t\t},\n\t\t\t\t\terror.message\n\t\t\t\t);\n\n\treturn createElement(\n\t\t'form',\n\t\t{\n\t\t\tclassName: classNames?.container,\n\t\t\t'data-abs-auth': 'sign-up',\n\t\t\tonSubmit: handleSubmit\n\t\t},\n\t\tcreateElement(\n\t\t\t'label',\n\t\t\t{ className: classNames?.field, 'data-abs-auth': 'email-field' },\n\t\t\tcreateElement('span', { className: classNames?.label }, emailLabel),\n\t\t\tcreateElement('input', {\n\t\t\t\tautoComplete: 'email',\n\t\t\t\tclassName: classNames?.input,\n\t\t\t\tname: 'email',\n\t\t\t\trequired: true,\n\t\t\t\ttype: 'email',\n\t\t\t\tvalue: email,\n\t\t\t\tonChange: (event: { currentTarget: HTMLInputElement }) =>\n\t\t\t\t\tsetEmail(event.currentTarget.value)\n\t\t\t})\n\t\t),\n\t\tcreateElement(\n\t\t\t'label',\n\t\t\t{ className: classNames?.field, 'data-abs-auth': 'password-field' },\n\t\t\tcreateElement(\n\t\t\t\t'span',\n\t\t\t\t{ className: classNames?.label },\n\t\t\t\tpasswordLabel\n\t\t\t),\n\t\t\tcreateElement('input', {\n\t\t\t\tautoComplete: 'new-password',\n\t\t\t\tclassName: classNames?.input,\n\t\t\t\tminLength: 12,\n\t\t\t\tname: 'password',\n\t\t\t\trequired: true,\n\t\t\t\ttype: 'password',\n\t\t\t\tvalue: password,\n\t\t\t\tonChange: (event: { currentTarget: HTMLInputElement }) =>\n\t\t\t\t\tsetPassword(event.currentTarget.value)\n\t\t\t})\n\t\t),\n\t\terrorBanner,\n\t\tcreateElement(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tclassName: classNames?.button,\n\t\t\t\t'data-abs-auth': 'submit',\n\t\t\t\tdisabled: isPending,\n\t\t\t\ttype: 'submit'\n\t\t\t},\n\t\t\tisPending ? 'Creating account…' : submitLabel\n\t\t)\n\t);\n};\n",
|
|
9
|
+
"// Drop-in current-user button for React. The component that Clerk's\n// `<UserButton />` was sticky for: shows the signed-in user's email +\n// avatar, expands to a menu on click, exposes sign-out + a\n// customizable list of links.\n//\n// Usage:\n//\n// <UserButton\n// client={authClient}\n// user={user} // your AuthUser-shaped record\n// items={[\n// { label: 'Settings', href: '/settings' },\n// { label: 'API keys', href: '/settings/api' }\n// ]}\n// onSignOut={() => router.push('/')}\n// />\n//\n// The component owns NO data fetching — the consumer passes `user` from\n// wherever they keep session state. Sign-out goes through the package's\n// /oauth2/signout (universal across credential + OAuth sessions since\n// 0.32.0).\nimport { createElement, useState } from 'react';\nimport type { AuthClient } from '../../createAuthClient';\nimport { useSignOut } from '../../react';\n\nexport type UserButtonUser = {\n\tavatarUrl?: string;\n\temail?: string;\n\tgivenName?: string;\n};\n\nexport type UserButtonItem = {\n\thref: string;\n\tlabel: string;\n};\n\nexport type UserButtonProps = {\n\tclient: AuthClient;\n\tclassNames?: {\n\t\tavatar?: string;\n\t\tcontainer?: string;\n\t\temail?: string;\n\t\tmenu?: string;\n\t\tmenuItem?: string;\n\t\tsignOut?: string;\n\t\ttoggle?: string;\n\t};\n\titems?: UserButtonItem[];\n\tonSignOut?: () => void;\n\tsignedOutHref?: string;\n\tsignOutLabel?: string;\n\tuser: UserButtonUser | null;\n};\n\nconst initial = (user: UserButtonUser) => {\n\tconst source = user.givenName ?? user.email ?? '?';\n\n\treturn source.slice(0, 1).toUpperCase();\n};\n\nexport const UserButton = ({\n\tclient,\n\tclassNames,\n\titems,\n\tonSignOut,\n\tsignedOutHref = '/',\n\tsignOutLabel = 'Sign out',\n\tuser\n}: UserButtonProps) => {\n\tconst [open, setOpen] = useState(false);\n\tconst { mutate } = useSignOut(client);\n\n\tif (user === null) {\n\t\treturn createElement(\n\t\t\t'a',\n\t\t\t{\n\t\t\t\tclassName: classNames?.toggle,\n\t\t\t\t'data-abs-auth': 'signed-out',\n\t\t\t\thref: signedOutHref\n\t\t\t},\n\t\t\t'Sign in'\n\t\t);\n\t}\n\n\tconst menu = open\n\t\t? createElement(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tclassName: classNames?.menu,\n\t\t\t\t\t'data-abs-auth': 'menu'\n\t\t\t\t},\n\t\t\t\t...(items ?? []).map((item) =>\n\t\t\t\t\tcreateElement(\n\t\t\t\t\t\t'a',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclassName: classNames?.menuItem,\n\t\t\t\t\t\t\t'data-abs-auth-menu-item': item.label,\n\t\t\t\t\t\t\thref: item.href,\n\t\t\t\t\t\t\tkey: item.href\n\t\t\t\t\t\t},\n\t\t\t\t\t\titem.label\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t\tcreateElement(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tclassName: classNames?.signOut,\n\t\t\t\t\t\t'data-abs-auth': 'sign-out',\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tonClick: async () => {\n\t\t\t\t\t\t\tawait mutate(undefined);\n\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\tonSignOut?.();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tsignOutLabel\n\t\t\t\t)\n\t\t\t)\n\t\t: null;\n\n\tconst avatar =\n\t\tuser.avatarUrl === undefined\n\t\t\t? createElement(\n\t\t\t\t\t'span',\n\t\t\t\t\t{\n\t\t\t\t\t\tclassName: classNames?.avatar,\n\t\t\t\t\t\t'data-abs-auth': 'avatar-initial'\n\t\t\t\t\t},\n\t\t\t\t\tinitial(user)\n\t\t\t\t)\n\t\t\t: createElement('img', {\n\t\t\t\t\talt: '',\n\t\t\t\t\tclassName: classNames?.avatar,\n\t\t\t\t\t'data-abs-auth': 'avatar',\n\t\t\t\t\tsrc: user.avatarUrl\n\t\t\t\t});\n\n\treturn createElement(\n\t\t'div',\n\t\t{\n\t\t\tclassName: classNames?.container,\n\t\t\t'data-abs-auth': 'user-button',\n\t\t\t'data-abs-auth-open': open ? 'true' : 'false'\n\t\t},\n\t\tcreateElement(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\t'aria-expanded': open,\n\t\t\t\tclassName: classNames?.toggle,\n\t\t\t\t'data-abs-auth': 'user-toggle',\n\t\t\t\ttype: 'button',\n\t\t\t\tonClick: () => setOpen((prev) => !prev)\n\t\t\t},\n\t\t\tavatar,\n\t\t\tcreateElement(\n\t\t\t\t'span',\n\t\t\t\t{ className: classNames?.email, 'data-abs-auth': 'user-email' },\n\t\t\t\tuser.givenName ?? user.email ?? 'Account'\n\t\t\t)\n\t\t),\n\t\tmenu\n\t);\n};\n"
|
|
10
10
|
],
|
|
11
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,qDAAyC;;;ACQzC,IAAM,cAAc,MAAa;AAEjC,IAAM,WAAW,CAAC,YAAsC;AAAA,EACvD,MAAM;AAAA,EACN,SAAS,kBAAkB,QAAQ,OAAO,UAAU;AAAA,EACpD,QAAQ;AACT;AAMO,IAAM,+BAA+B,OAAO,WAAuB;AAAA,EACzE,IAAI,OAAO,WAAW,eAAe,CAAC,OAAO,qBAAqB;AAAA,IACjE,OAAO;AAAA,MACN,MAAM;AAAA,MACN,OAAO,SAAS,IAAI,MAAM,sBAAsB,CAAC;AAAA,IAClD;AAAA,EACD;AAAA,EACA,MAAM,UAAU,MAAM,OAAO,SAAS,oBAAoB;AAAA,EAC1D,IAAI,QAAQ;AAAA,IAAO,OAAO,EAAE,MAAM,MAAM,OAAO,QAAQ,MAAM;AAAA,EAC7D,IAAI;AAAA,IACH,QAAQ,wBAAwB,MAAM,YAAY;AAAA,IAClD,MAAM,aAAa,MAAM,oBAAoB;AAAA,MAC5C,aAAa,QAAQ;AAAA,MACrB,oBAAoB;AAAA,IACrB,CAAC;AAAA,IAED,OAAO,OAAO,SAAS,mBAAmB,UAAU;AAAA,IACnD,OAAO,QAAQ;AAAA,IAChB,OAAO,EAAE,MAAM,MAAM,OAAO,SAAS,MAAM,EAAE;AAAA;AAAA;AAOxC,IAAM,yBAAyB,OAAO,WAAuB;AAAA,EACnE,IAAI,OAAO,WAAW,eAAe,CAAC,OAAO,qBAAqB;AAAA,IACjE,OAAO;AAAA,MACN,MAAM;AAAA,MACN,OAAO,SAAS,IAAI,MAAM,sBAAsB,CAAC;AAAA,IAClD;AAAA,EACD;AAAA,EACA,MAAM,UAAU,MAAM,OAAO,SAAS,gBAAgB;AAAA,EACtD,IAAI,QAAQ;AAAA,IAAO,OAAO,EAAE,MAAM,MAAM,OAAO,QAAQ,MAAM;AAAA,EAC7D,IAAI;AAAA,IACH,QAAQ,sBAAsB,MAAM,YAAY;AAAA,IAChD,MAAM,aAAa,MAAM,kBAAkB;AAAA,MAC1C,aAAa,QAAQ;AAAA,IACtB,CAAC;AAAA,IAED,OAAO,OAAO,SAAS,eAAe,UAAU;AAAA,IAC/C,OAAO,QAAQ;AAAA,IAChB,OAAO,EAAE,MAAM,MAAM,OAAO,SAAS,MAAM,EAAE;AAAA;AAAA;;;AC7C/C;
|
|
12
|
-
"debugId": "
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "BD77ABF59C4B6DD264756E2164756E21",
|
|
13
13
|
"names": []
|
|
14
14
|
}
|
package/dist/client/solid.d.ts
CHANGED
|
@@ -16,6 +16,11 @@ export declare const useMagicLink: (client: AuthClient) => MutationState<{
|
|
|
16
16
|
}, {
|
|
17
17
|
ok: true;
|
|
18
18
|
}>;
|
|
19
|
+
export declare const useMfaChallenge: (client: AuthClient) => MutationState<{
|
|
20
|
+
code: string;
|
|
21
|
+
}, {
|
|
22
|
+
status: "authenticated";
|
|
23
|
+
}>;
|
|
19
24
|
export declare const usePasskeyAutofill: (client: AuthClient) => {
|
|
20
25
|
cancel: () => void;
|
|
21
26
|
data: Accessor<{
|
|
@@ -25,27 +30,6 @@ export declare const usePasskeyAutofill: (client: AuthClient) => {
|
|
|
25
30
|
isPending: Accessor<boolean>;
|
|
26
31
|
start: () => Promise<void>;
|
|
27
32
|
};
|
|
28
|
-
export declare const useUpgradeToPasskey: (client: AuthClient) => {
|
|
29
|
-
error: Accessor<AuthClientError | null>;
|
|
30
|
-
isPending: Accessor<boolean>;
|
|
31
|
-
passkeys: Accessor<unknown[] | null>;
|
|
32
|
-
refetch: () => Promise<void>;
|
|
33
|
-
register: () => Promise<{
|
|
34
|
-
data: null;
|
|
35
|
-
error: AuthClientError;
|
|
36
|
-
} | {
|
|
37
|
-
data: {
|
|
38
|
-
ok: true;
|
|
39
|
-
};
|
|
40
|
-
error: null;
|
|
41
|
-
}>;
|
|
42
|
-
shouldPrompt: () => boolean;
|
|
43
|
-
};
|
|
44
|
-
export declare const useMfaChallenge: (client: AuthClient) => MutationState<{
|
|
45
|
-
code: string;
|
|
46
|
-
}, {
|
|
47
|
-
status: "authenticated";
|
|
48
|
-
}>;
|
|
49
33
|
export declare const usePasswordReset: (client: AuthClient) => MutationState<{
|
|
50
34
|
email: string;
|
|
51
35
|
}, {
|
|
@@ -83,4 +67,20 @@ export declare const useSignUp: (client: AuthClient) => MutationState<{
|
|
|
83
67
|
} | {
|
|
84
68
|
status: "verification_required";
|
|
85
69
|
}>;
|
|
70
|
+
export declare const useUpgradeToPasskey: (client: AuthClient) => {
|
|
71
|
+
error: Accessor<AuthClientError | null>;
|
|
72
|
+
isPending: Accessor<boolean>;
|
|
73
|
+
passkeys: Accessor<unknown[] | null>;
|
|
74
|
+
refetch: () => Promise<void>;
|
|
75
|
+
register: () => Promise<{
|
|
76
|
+
data: null;
|
|
77
|
+
error: AuthClientError;
|
|
78
|
+
} | {
|
|
79
|
+
data: {
|
|
80
|
+
ok: true;
|
|
81
|
+
};
|
|
82
|
+
error: null;
|
|
83
|
+
}>;
|
|
84
|
+
shouldPrompt: () => boolean;
|
|
85
|
+
};
|
|
86
86
|
export {};
|
package/dist/client/solid.js
CHANGED
|
@@ -126,6 +126,7 @@ var useMutation = (run) => {
|
|
|
126
126
|
return { data, error, isPending, mutate, reset };
|
|
127
127
|
};
|
|
128
128
|
var useMagicLink = (client) => useMutation(client.passwordless.requestMagicLink);
|
|
129
|
+
var useMfaChallenge = (client) => useMutation(client.mfa.challenge);
|
|
129
130
|
var usePasskeyAutofill = (client) => {
|
|
130
131
|
const [data, setData] = createSignal(null);
|
|
131
132
|
const [error, setError] = createSignal(null);
|
|
@@ -149,8 +150,9 @@ var usePasskeyAutofill = (client) => {
|
|
|
149
150
|
};
|
|
150
151
|
return { cancel, data, error, isPending, start };
|
|
151
152
|
};
|
|
152
|
-
var
|
|
153
|
-
|
|
153
|
+
var usePasswordReset = (client) => useMutation(client.passwordReset.request);
|
|
154
|
+
var useSessions = (client) => {
|
|
155
|
+
const [data, setData] = createSignal(null);
|
|
154
156
|
const [error, setError] = createSignal(null);
|
|
155
157
|
const [isPending, setIsPending] = createSignal(true);
|
|
156
158
|
let alive = true;
|
|
@@ -159,30 +161,27 @@ var useUpgradeToPasskey = (client) => {
|
|
|
159
161
|
});
|
|
160
162
|
const refetch = async () => {
|
|
161
163
|
setIsPending(true);
|
|
162
|
-
const result = await client.
|
|
164
|
+
const result = await client.sessions.list();
|
|
163
165
|
if (alive) {
|
|
164
|
-
|
|
166
|
+
setData(() => result.data);
|
|
165
167
|
setError(result.error);
|
|
166
168
|
setIsPending(false);
|
|
167
169
|
}
|
|
168
170
|
};
|
|
169
|
-
const
|
|
170
|
-
const result = await
|
|
171
|
+
const revoke = async (sessionId) => {
|
|
172
|
+
const result = await client.sessions.revoke(sessionId);
|
|
171
173
|
if (result.error === null)
|
|
172
174
|
await refetch();
|
|
173
175
|
return result;
|
|
174
176
|
};
|
|
175
177
|
refetch();
|
|
176
|
-
|
|
177
|
-
const list = passkeys();
|
|
178
|
-
return list !== null && list.length === 0;
|
|
179
|
-
};
|
|
180
|
-
return { error, isPending, passkeys, refetch, register, shouldPrompt };
|
|
178
|
+
return { data, error, isPending, refetch, revoke };
|
|
181
179
|
};
|
|
182
|
-
var
|
|
183
|
-
var
|
|
184
|
-
var
|
|
185
|
-
|
|
180
|
+
var useSignIn = (client) => useMutation(client.signIn.email);
|
|
181
|
+
var useSignOut = (client) => useMutation(client.signOut);
|
|
182
|
+
var useSignUp = (client) => useMutation(client.signUp.email);
|
|
183
|
+
var useUpgradeToPasskey = (client) => {
|
|
184
|
+
const [passkeys, setPasskeys] = createSignal(null);
|
|
186
185
|
const [error, setError] = createSignal(null);
|
|
187
186
|
const [isPending, setIsPending] = createSignal(true);
|
|
188
187
|
let alive = true;
|
|
@@ -191,25 +190,26 @@ var useSessions = (client) => {
|
|
|
191
190
|
});
|
|
192
191
|
const refetch = async () => {
|
|
193
192
|
setIsPending(true);
|
|
194
|
-
const result = await client.
|
|
193
|
+
const result = await client.passkeys.list();
|
|
195
194
|
if (alive) {
|
|
196
|
-
|
|
195
|
+
setPasskeys(() => result.data);
|
|
197
196
|
setError(result.error);
|
|
198
197
|
setIsPending(false);
|
|
199
198
|
}
|
|
200
199
|
};
|
|
201
|
-
const
|
|
202
|
-
const result = await client
|
|
200
|
+
const register = async () => {
|
|
201
|
+
const result = await runPasskeyRegistration(client);
|
|
203
202
|
if (result.error === null)
|
|
204
203
|
await refetch();
|
|
205
204
|
return result;
|
|
206
205
|
};
|
|
207
206
|
refetch();
|
|
208
|
-
|
|
207
|
+
const shouldPrompt = () => {
|
|
208
|
+
const list = passkeys();
|
|
209
|
+
return list !== null && list.length === 0;
|
|
210
|
+
};
|
|
211
|
+
return { error, isPending, passkeys, refetch, register, shouldPrompt };
|
|
209
212
|
};
|
|
210
|
-
var useSignIn = (client) => useMutation(client.signIn.email);
|
|
211
|
-
var useSignOut = (client) => useMutation(client.signOut);
|
|
212
|
-
var useSignUp = (client) => useMutation(client.signUp.email);
|
|
213
213
|
export {
|
|
214
214
|
useUpgradeToPasskey,
|
|
215
215
|
useSignUp,
|
|
@@ -222,5 +222,5 @@ export {
|
|
|
222
222
|
useMagicLink
|
|
223
223
|
};
|
|
224
224
|
|
|
225
|
-
//# debugId=
|
|
225
|
+
//# debugId=4B1DDEBE7A756E1464756E2164756E21
|
|
226
226
|
//# sourceMappingURL=solid.js.map
|