@object-ui/auth 6.2.3 → 7.1.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/CHANGELOG.md +54 -0
- package/dist/AuthContext.d.ts +9 -2
- package/dist/AuthContext.d.ts.map +1 -1
- package/dist/AuthGuard.d.ts +1 -1
- package/dist/AuthGuard.d.ts.map +1 -1
- package/dist/AuthProvider.d.ts +1 -1
- package/dist/AuthProvider.d.ts.map +1 -1
- package/dist/AuthProvider.js +20 -1
- package/dist/AuthShell.d.ts +1 -1
- package/dist/AuthShell.d.ts.map +1 -1
- package/dist/ForgotPasswordForm.d.ts +1 -1
- package/dist/ForgotPasswordForm.d.ts.map +1 -1
- package/dist/LoginForm.d.ts +8 -1
- package/dist/LoginForm.d.ts.map +1 -1
- package/dist/LoginForm.js +3 -2
- package/dist/PreviewBanner.d.ts +2 -1
- package/dist/PreviewBanner.d.ts.map +1 -1
- package/dist/RegisterForm.d.ts +13 -2
- package/dist/RegisterForm.d.ts.map +1 -1
- package/dist/RegisterForm.js +8 -3
- package/dist/SocialSignInButtons.d.ts +2 -1
- package/dist/SocialSignInButtons.d.ts.map +1 -1
- package/dist/UserMenu.d.ts +1 -1
- package/dist/UserMenu.d.ts.map +1 -1
- package/dist/authStyles.d.ts +7 -7
- package/dist/authStyles.d.ts.map +1 -1
- package/dist/createAuthClient.d.ts.map +1 -1
- package/dist/createAuthClient.js +149 -18
- package/dist/createAuthenticatedFetch.d.ts.map +1 -1
- package/dist/createAuthenticatedFetch.js +18 -5
- package/dist/types.d.ts +5 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/useAuth.d.ts.map +1 -1
- package/dist/useAuth.js +1 -0
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,59 @@
|
|
|
1
1
|
# @object-ui/auth
|
|
2
2
|
|
|
3
|
+
## 7.1.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [677f7ed]
|
|
8
|
+
- Updated dependencies [a71be60]
|
|
9
|
+
- Updated dependencies [cb03bc3]
|
|
10
|
+
- @object-ui/types@7.1.0
|
|
11
|
+
|
|
12
|
+
## 7.0.0
|
|
13
|
+
|
|
14
|
+
### Minor Changes
|
|
15
|
+
|
|
16
|
+
- 18d0339: Relabel metadata-driven UI on a language switch without a page refresh (#1319)
|
|
17
|
+
|
|
18
|
+
Switching the UI language left server-resolved metadata labels (object/field/
|
|
19
|
+
view labels, action-dialog text) in the old language until a hard refresh,
|
|
20
|
+
because renderers cache those labels by object name and never refetch on a
|
|
21
|
+
language change.
|
|
22
|
+
|
|
23
|
+
**`@object-ui/auth`** — `createAuthenticatedFetch` now folds the active
|
|
24
|
+
`<html lang>` into `Accept-Language` on API calls (never clobbering an explicit
|
|
25
|
+
header), so a switch carries the new locale on every subsequent request.
|
|
26
|
+
|
|
27
|
+
**`@object-ui/app-shell`** — `ConnectedShellInner` drops the adapter's
|
|
28
|
+
locale-blind metadata cache in the render phase and remounts the metadata
|
|
29
|
+
subtree via `key={language}`, so every renderer refetches in the new locale.
|
|
30
|
+
The adapter and its connection sit above the key and are preserved — an in-app
|
|
31
|
+
relabel, not a reconnect.
|
|
32
|
+
|
|
33
|
+
**`@object-ui/i18n`** — dev-mode missing-key warnings: `createI18n` gains
|
|
34
|
+
`warnMissingKeys` (default on outside production) wiring a deduped i18next
|
|
35
|
+
`missingKeyHandler`. `useObjectLabel`'s convention-key probes are flagged so
|
|
36
|
+
their intentional misses (which fall back to server metadata) stay silent.
|
|
37
|
+
|
|
38
|
+
Pairs with the framework-side locale-aware metadata changes in
|
|
39
|
+
`@objectstack/client` / `@objectstack/objectql` / `@objectstack/rest`.
|
|
40
|
+
|
|
41
|
+
### Patch Changes
|
|
42
|
+
|
|
43
|
+
- f011479: getSession self-heals a stale localStorage bearer: an invalid `auth-session-token` used to SHADOW a perfectly valid cookie session — SSO landings (e.g. the cloud console's sso-exchange into a tenant environment) only set the cookie and cannot touch the target origin's localStorage, so users with a leftover token bounced back to the login page forever. On a bearer get-session miss the client now retries once cookie-only: a live cookie session wins (its token replaces the stale one); an affirmative double-miss drops the dead token; transport errors keep it. getSession also no longer throws on network errors (better-fetch rethrows them).
|
|
44
|
+
- Updated dependencies [ddbe4a2]
|
|
45
|
+
- Updated dependencies [9049bbe]
|
|
46
|
+
- Updated dependencies [cb2fdb1]
|
|
47
|
+
- Updated dependencies [6cfa330]
|
|
48
|
+
- Updated dependencies [ad8ade6]
|
|
49
|
+
- Updated dependencies [3870c20]
|
|
50
|
+
- Updated dependencies [b88c560]
|
|
51
|
+
- Updated dependencies [d16566f]
|
|
52
|
+
- Updated dependencies [300d755]
|
|
53
|
+
- Updated dependencies [4eb9cb6]
|
|
54
|
+
- Updated dependencies [858ad94]
|
|
55
|
+
- @object-ui/types@7.0.0
|
|
56
|
+
|
|
3
57
|
## 6.2.3
|
|
4
58
|
|
|
5
59
|
### Patch Changes
|
package/dist/AuthContext.d.ts
CHANGED
|
@@ -30,14 +30,21 @@ export interface AuthContextValue {
|
|
|
30
30
|
previewMode: PreviewModeOptions | null;
|
|
31
31
|
/** Sign in with email and password */
|
|
32
32
|
signIn: (email: string, password: string) => Promise<void>;
|
|
33
|
-
/** Sign up with name, email, and password
|
|
34
|
-
|
|
33
|
+
/** Sign up with name, email, and password.
|
|
34
|
+
* Returns `{ requiresVerification: true }` when the server accepted the
|
|
35
|
+
* account but is gating sign-in on email verification; callers should
|
|
36
|
+
* show a "check your inbox" UI instead of navigating to a protected page. */
|
|
37
|
+
signUp: (name: string, email: string, password: string) => Promise<{
|
|
38
|
+
requiresVerification: boolean;
|
|
39
|
+
}>;
|
|
35
40
|
/** Sign out the current user */
|
|
36
41
|
signOut: () => Promise<void>;
|
|
37
42
|
/** Update user profile */
|
|
38
43
|
updateUser: (data: Partial<AuthUser>) => Promise<void>;
|
|
39
44
|
/** Request password reset */
|
|
40
45
|
forgotPassword: (email: string) => Promise<void>;
|
|
46
|
+
/** Send (or resend) the email-verification link to the given address. */
|
|
47
|
+
sendVerificationEmail: (email: string, callbackURL?: string) => Promise<void>;
|
|
41
48
|
/** Reset password with token */
|
|
42
49
|
resetPassword: (token: string, newPassword: string) => Promise<void>;
|
|
43
50
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../src/AuthContext.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,cAAc,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAEhL,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,kCAAkC;IAClC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,wCAAwC;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,2BAA2B;IAC3B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,iDAAiD;IACjD,aAAa,EAAE,OAAO,CAAC;IACvB,uEAAuE;IACvE,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACvC,sCAAsC;IACtC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D
|
|
1
|
+
{"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../src/AuthContext.ts"],"names":[],"mappings":"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"}
|
package/dist/AuthGuard.d.ts
CHANGED
|
@@ -33,5 +33,5 @@ export interface AuthGuardProps {
|
|
|
33
33
|
* </AuthGuard>
|
|
34
34
|
* ```
|
|
35
35
|
*/
|
|
36
|
-
export declare function AuthGuard({ fallback, requiredRoles, loadingFallback, children, }: AuthGuardProps):
|
|
36
|
+
export declare function AuthGuard({ fallback, requiredRoles, loadingFallback, children, }: AuthGuardProps): React.JSX.Element;
|
|
37
37
|
//# sourceMappingURL=AuthGuard.d.ts.map
|
package/dist/AuthGuard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthGuard.d.ts","sourceRoot":"","sources":["../src/AuthGuard.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,qCAAqC;IACrC,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,4CAA4C;IAC5C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAe,EACf,aAAa,EACb,eAAe,EACf,QAAQ,GACT,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"AuthGuard.d.ts","sourceRoot":"","sources":["../src/AuthGuard.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,qCAAqC;IACrC,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,4CAA4C;IAC5C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAe,EACf,aAAa,EACb,eAAe,EACf,QAAQ,GACT,EAAE,cAAc,qBAqBhB"}
|
package/dist/AuthProvider.d.ts
CHANGED
|
@@ -49,5 +49,5 @@ export interface AuthProviderProps extends AuthProviderConfig {
|
|
|
49
49
|
* </AuthProvider>
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
|
-
export declare function AuthProvider({ authUrl, client: externalClient, onAuthStateChange, enabled, previewMode, children, }: AuthProviderProps):
|
|
52
|
+
export declare function AuthProvider({ authUrl, client: externalClient, onAuthStateChange, enabled, previewMode, children, }: AuthProviderProps): React.JSX.Element;
|
|
53
53
|
//# sourceMappingURL=AuthProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAwB,kBAAkB,EAAE,kBAAkB,EAAyG,MAAM,SAAS,CAAC;AAKnM,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,MAAM,EAAE,cAAc,EACtB,iBAAiB,EACjB,OAAc,EACd,WAAW,EACX,QAAQ,GACT,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAwB,kBAAkB,EAAE,kBAAkB,EAAyG,MAAM,SAAS,CAAC;AAKnM,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,MAAM,EAAE,cAAc,EACtB,iBAAiB,EACjB,OAAc,EACd,WAAW,EACX,QAAQ,GACT,EAAE,iBAAiB,qBA6gBnB"}
|
package/dist/AuthProvider.js
CHANGED
|
@@ -149,8 +149,15 @@ export function AuthProvider({ authUrl, client: externalClient, onAuthStateChang
|
|
|
149
149
|
setError(null);
|
|
150
150
|
try {
|
|
151
151
|
const result = await client.signUp({ name, email, password });
|
|
152
|
+
if (result.requiresVerification) {
|
|
153
|
+
// No session was created — the user must verify their email before
|
|
154
|
+
// they can sign in. Leave auth state untouched so the caller can
|
|
155
|
+
// render a "check your inbox" UI without bouncing through guards.
|
|
156
|
+
return { requiresVerification: true };
|
|
157
|
+
}
|
|
152
158
|
setUser(result.user);
|
|
153
159
|
setSession(result.session);
|
|
160
|
+
return { requiresVerification: false };
|
|
154
161
|
}
|
|
155
162
|
catch (err) {
|
|
156
163
|
const authError = err instanceof Error ? err : new Error(String(err));
|
|
@@ -199,6 +206,17 @@ export function AuthProvider({ authUrl, client: externalClient, onAuthStateChang
|
|
|
199
206
|
throw authError;
|
|
200
207
|
}
|
|
201
208
|
}, [client]);
|
|
209
|
+
const sendVerificationEmail = useCallback(async (email, callbackURL) => {
|
|
210
|
+
setError(null);
|
|
211
|
+
try {
|
|
212
|
+
await client.sendVerificationEmail(email, callbackURL);
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
const authError = err instanceof Error ? err : new Error(String(err));
|
|
216
|
+
setError(authError);
|
|
217
|
+
throw authError;
|
|
218
|
+
}
|
|
219
|
+
}, [client]);
|
|
202
220
|
const resetPassword = useCallback(async (token, newPassword) => {
|
|
203
221
|
setError(null);
|
|
204
222
|
try {
|
|
@@ -400,6 +418,7 @@ export function AuthProvider({ authUrl, client: externalClient, onAuthStateChang
|
|
|
400
418
|
signOut,
|
|
401
419
|
updateUser,
|
|
402
420
|
forgotPassword,
|
|
421
|
+
sendVerificationEmail,
|
|
403
422
|
resetPassword,
|
|
404
423
|
changePassword,
|
|
405
424
|
setInitialPassword,
|
|
@@ -428,7 +447,7 @@ export function AuthProvider({ authUrl, client: externalClient, onAuthStateChang
|
|
|
428
447
|
listUserInvitations,
|
|
429
448
|
}), [
|
|
430
449
|
user, session, isAuthenticated, isAuthEnabled, isLoading, error, isPreviewMode, previewMode,
|
|
431
|
-
signIn, signUp, signOut, updateUser, forgotPassword, resetPassword, changePassword, setInitialPassword, hasLocalPassword, getAuthConfig, signInWithProvider,
|
|
450
|
+
signIn, signUp, signOut, updateUser, forgotPassword, sendVerificationEmail, resetPassword, changePassword, setInitialPassword, hasLocalPassword, getAuthConfig, signInWithProvider,
|
|
432
451
|
organizations, activeOrganization, activeMember, isOrganizationsLoading, switchOrganization, createOrganization, refreshOrganizations,
|
|
433
452
|
updateOrganization, deleteOrganization, leaveOrganization,
|
|
434
453
|
getMembers, inviteMember, removeMember, updateMemberRole,
|
package/dist/AuthShell.d.ts
CHANGED
|
@@ -64,5 +64,5 @@ export interface AuthShellProps {
|
|
|
64
64
|
* </AuthShell>
|
|
65
65
|
* ```
|
|
66
66
|
*/
|
|
67
|
-
export declare function AuthShell({ children, brand, className, formColumnClassName, brandColumnClassName, }: AuthShellProps):
|
|
67
|
+
export declare function AuthShell({ children, brand, className, formColumnClassName, brandColumnClassName, }: AuthShellProps): React.JSX.Element;
|
|
68
68
|
//# sourceMappingURL=AuthShell.d.ts.map
|
package/dist/AuthShell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthShell.d.ts","sourceRoot":"","sources":["../src/AuthShell.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,gDAAgD;IAChD,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,qEAAqE;IACrE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,KAAK,EACL,SAAS,EACT,mBAAmB,EACnB,oBAAoB,GACrB,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"AuthShell.d.ts","sourceRoot":"","sources":["../src/AuthShell.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,gDAAgD;IAChD,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,qEAAqE;IACrE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,KAAK,EACL,SAAS,EACT,mBAAmB,EACnB,oBAAoB,GACrB,EAAE,cAAc,qBAwDhB"}
|
|
@@ -52,5 +52,5 @@ export interface ForgotPasswordFormProps {
|
|
|
52
52
|
* />
|
|
53
53
|
* ```
|
|
54
54
|
*/
|
|
55
|
-
export declare function ForgotPasswordForm({ onSuccess, onError, loginUrl, title, description, icon, hideIcon, linkComponent: LinkComp, labels, }: ForgotPasswordFormProps):
|
|
55
|
+
export declare function ForgotPasswordForm({ onSuccess, onError, loginUrl, title, description, icon, hideIcon, linkComponent: LinkComp, labels, }: ForgotPasswordFormProps): React.JSX.Element;
|
|
56
56
|
//# sourceMappingURL=ForgotPasswordForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForgotPasswordForm.d.ts","sourceRoot":"","sources":["../src/ForgotPasswordForm.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAYtD,qDAAqD;AACrD,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,wBAAwB;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC5D,uCAAuC;IACvC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAqBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,OAAO,EACP,QAAmB,EACnB,KAA6B,EAC7B,WAAyF,EACzF,IAAI,EACJ,QAAgB,EAChB,aAAa,EAAE,QAAsB,EACrC,MAAW,GACZ,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"ForgotPasswordForm.d.ts","sourceRoot":"","sources":["../src/ForgotPasswordForm.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAYtD,qDAAqD;AACrD,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,wBAAwB;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC5D,uCAAuC;IACvC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAqBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,OAAO,EACP,QAAmB,EACnB,KAA6B,EAC7B,WAAyF,EACzF,IAAI,EACJ,QAAgB,EAChB,aAAa,EAAE,QAAsB,EACrC,MAAW,GACZ,EAAE,uBAAuB,qBAyGzB"}
|
package/dist/LoginForm.d.ts
CHANGED
|
@@ -40,6 +40,13 @@ export interface LoginFormProps {
|
|
|
40
40
|
linkComponent?: React.ComponentType<AuthLinkComponentProps>;
|
|
41
41
|
/** Override default labels for i18n */
|
|
42
42
|
labels?: LoginFormLabels;
|
|
43
|
+
/**
|
|
44
|
+
* Map of better-auth error `code` → localized message. When a sign-in error
|
|
45
|
+
* carries a known code (e.g. `INVALID_EMAIL_OR_PASSWORD`), the mapped string
|
|
46
|
+
* is shown instead of the raw English server message. Unknown codes fall
|
|
47
|
+
* back to the server message.
|
|
48
|
+
*/
|
|
49
|
+
errorMessages?: Record<string, string>;
|
|
43
50
|
/** Hide the icon disc above the form title. Defaults to false. */
|
|
44
51
|
hideIcon?: boolean;
|
|
45
52
|
}
|
|
@@ -57,5 +64,5 @@ export interface LoginFormProps {
|
|
|
57
64
|
* />
|
|
58
65
|
* ```
|
|
59
66
|
*/
|
|
60
|
-
export declare function LoginForm({ onSuccess, onError, registerUrl, forgotPasswordUrl, title, description, icon, hideIcon, linkComponent: LinkComp, labels, }: LoginFormProps):
|
|
67
|
+
export declare function LoginForm({ onSuccess, onError, registerUrl, forgotPasswordUrl, title, description, icon, hideIcon, linkComponent: LinkComp, labels, errorMessages, }: LoginFormProps): React.JSX.Element;
|
|
61
68
|
//# sourceMappingURL=LoginForm.d.ts.map
|
package/dist/LoginForm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.d.ts","sourceRoot":"","sources":["../src/LoginForm.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAYtD,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC5D,uCAAuC;IACvC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAsBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EACxB,SAAS,EACT,OAAO,EACP,WAAyB,EACzB,iBAAsC,EACtC,KAAiC,EACjC,WAAyD,EACzD,IAAI,EACJ,QAAgB,EAChB,aAAa,EAAE,QAAsB,EACrC,MAAW,
|
|
1
|
+
{"version":3,"file":"LoginForm.d.ts","sourceRoot":"","sources":["../src/LoginForm.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAYtD,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC5D,uCAAuC;IACvC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAsBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EACxB,SAAS,EACT,OAAO,EACP,WAAyB,EACzB,iBAAsC,EACtC,KAAiC,EACjC,WAAyD,EACzD,IAAI,EACJ,QAAgB,EAChB,aAAa,EAAE,QAAsB,EACrC,MAAW,EACX,aAAa,GACd,EAAE,cAAc,qBAoHhB"}
|
package/dist/LoginForm.js
CHANGED
|
@@ -26,7 +26,7 @@ const DefaultLockIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none"
|
|
|
26
26
|
* />
|
|
27
27
|
* ```
|
|
28
28
|
*/
|
|
29
|
-
export function LoginForm({ onSuccess, onError, registerUrl = '/register', forgotPasswordUrl = '/forgot-password', title = 'Sign in to your account', description = 'Enter your email and password to continue', icon, hideIcon = false, linkComponent: LinkComp = DefaultLink, labels = {}, }) {
|
|
29
|
+
export function LoginForm({ onSuccess, onError, registerUrl = '/register', forgotPasswordUrl = '/forgot-password', title = 'Sign in to your account', description = 'Enter your email and password to continue', icon, hideIcon = false, linkComponent: LinkComp = DefaultLink, labels = {}, errorMessages, }) {
|
|
30
30
|
const { signIn, isLoading } = useAuth();
|
|
31
31
|
const [email, setEmail] = useState('');
|
|
32
32
|
const [password, setPassword] = useState('');
|
|
@@ -53,7 +53,8 @@ export function LoginForm({ onSuccess, onError, registerUrl = '/register', forgo
|
|
|
53
53
|
}
|
|
54
54
|
catch (err) {
|
|
55
55
|
const authError = err instanceof Error ? err : new Error(String(err));
|
|
56
|
-
|
|
56
|
+
const code = authError.code;
|
|
57
|
+
setError((code && errorMessages?.[code]) || authError.message);
|
|
57
58
|
onError?.(authError);
|
|
58
59
|
}
|
|
59
60
|
};
|
package/dist/PreviewBanner.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* This source code is licensed under the MIT license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
|
+
import React from 'react';
|
|
8
9
|
export interface PreviewBannerProps {
|
|
9
10
|
/** Custom class name for the banner */
|
|
10
11
|
className?: string;
|
|
@@ -19,5 +20,5 @@ export interface PreviewBannerProps {
|
|
|
19
20
|
* <PreviewBanner />
|
|
20
21
|
* ```
|
|
21
22
|
*/
|
|
22
|
-
export declare function PreviewBanner({ className }: PreviewBannerProps):
|
|
23
|
+
export declare function PreviewBanner({ className }: PreviewBannerProps): React.JSX.Element | null;
|
|
23
24
|
//# sourceMappingURL=PreviewBanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewBanner.d.ts","sourceRoot":"","sources":["../src/PreviewBanner.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"PreviewBanner.d.ts","sourceRoot":"","sources":["../src/PreviewBanner.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,kBAAkB,4BAyB9D"}
|
package/dist/RegisterForm.d.ts
CHANGED
|
@@ -27,8 +27,13 @@ export interface RegisterFormLabels {
|
|
|
27
27
|
orText?: string;
|
|
28
28
|
}
|
|
29
29
|
export interface RegisterFormProps {
|
|
30
|
-
/** Callback on successful registration
|
|
30
|
+
/** Callback on successful registration AND auto sign-in. Not called when the
|
|
31
|
+
* server requires email verification — use `onVerificationRequired` for that. */
|
|
31
32
|
onSuccess?: () => void;
|
|
33
|
+
/** Callback when the server accepted the registration but is gating
|
|
34
|
+
* sign-in on email verification. The page should swap the form for a
|
|
35
|
+
* "check your inbox" confirmation. */
|
|
36
|
+
onVerificationRequired?: (email: string) => void;
|
|
32
37
|
/** Callback on registration error */
|
|
33
38
|
onError?: (error: Error) => void;
|
|
34
39
|
/** Link to login page */
|
|
@@ -43,6 +48,12 @@ export interface RegisterFormProps {
|
|
|
43
48
|
linkComponent?: React.ComponentType<AuthLinkComponentProps>;
|
|
44
49
|
/** Override default labels for i18n */
|
|
45
50
|
labels?: RegisterFormLabels;
|
|
51
|
+
/**
|
|
52
|
+
* Map of better-auth error `code` → localized message (e.g.
|
|
53
|
+
* `USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL`). Unknown codes fall back to the
|
|
54
|
+
* raw server message.
|
|
55
|
+
*/
|
|
56
|
+
errorMessages?: Record<string, string>;
|
|
46
57
|
/** Hide the icon disc above the form title. Defaults to false. */
|
|
47
58
|
hideIcon?: boolean;
|
|
48
59
|
}
|
|
@@ -59,5 +70,5 @@ export interface RegisterFormProps {
|
|
|
59
70
|
* />
|
|
60
71
|
* ```
|
|
61
72
|
*/
|
|
62
|
-
export declare function RegisterForm({ onSuccess, onError, loginUrl, title, description, icon, hideIcon, linkComponent: LinkComp, labels, }: RegisterFormProps):
|
|
73
|
+
export declare function RegisterForm({ onSuccess, onVerificationRequired, onError, loginUrl, title, description, icon, hideIcon, linkComponent: LinkComp, labels, errorMessages, }: RegisterFormProps): React.JSX.Element;
|
|
63
74
|
//# sourceMappingURL=RegisterForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegisterForm.d.ts","sourceRoot":"","sources":["../src/RegisterForm.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAYtD,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC
|
|
1
|
+
{"version":3,"file":"RegisterForm.d.ts","sourceRoot":"","sources":["../src/RegisterForm.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAYtD,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC;sFACkF;IAClF,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;2CAEuC;IACvC,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC5D,uCAAuC;IACvC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAwBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,sBAAsB,EACtB,OAAO,EACP,QAAmB,EACnB,KAA2B,EAC3B,WAAqD,EACrD,IAAI,EACJ,QAAgB,EAChB,aAAa,EAAE,QAAsB,EACrC,MAAW,EACX,aAAa,GACd,EAAE,iBAAiB,qBAmKnB"}
|
package/dist/RegisterForm.js
CHANGED
|
@@ -25,7 +25,7 @@ const DefaultUserPlusIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "n
|
|
|
25
25
|
* />
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
|
-
export function RegisterForm({ onSuccess, onError, loginUrl = '/login', title = 'Create an account', description = 'Enter your information to get started', icon, hideIcon = false, linkComponent: LinkComp = DefaultLink, labels = {}, }) {
|
|
28
|
+
export function RegisterForm({ onSuccess, onVerificationRequired, onError, loginUrl = '/login', title = 'Create an account', description = 'Enter your information to get started', icon, hideIcon = false, linkComponent: LinkComp = DefaultLink, labels = {}, errorMessages, }) {
|
|
29
29
|
const { signUp, isLoading } = useAuth();
|
|
30
30
|
const [name, setName] = useState('');
|
|
31
31
|
const [email, setEmail] = useState('');
|
|
@@ -62,12 +62,17 @@ export function RegisterForm({ onSuccess, onError, loginUrl = '/login', title =
|
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
64
|
try {
|
|
65
|
-
await signUp(name, email, password);
|
|
65
|
+
const result = await signUp(name, email, password);
|
|
66
|
+
if (result?.requiresVerification) {
|
|
67
|
+
onVerificationRequired?.(email);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
66
70
|
onSuccess?.();
|
|
67
71
|
}
|
|
68
72
|
catch (err) {
|
|
69
73
|
const authError = err instanceof Error ? err : new Error(String(err));
|
|
70
|
-
|
|
74
|
+
const code = authError.code;
|
|
75
|
+
setError((code && errorMessages?.[code]) || authError.message);
|
|
71
76
|
onError?.(authError);
|
|
72
77
|
}
|
|
73
78
|
};
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* This source code is licensed under the MIT license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
|
+
import React from 'react';
|
|
8
9
|
export interface SocialSignInButtonsProps {
|
|
9
10
|
/** Sign-in vs sign-up changes the button label ("Continue with" vs "Sign up with") */
|
|
10
11
|
mode?: 'sign-in' | 'sign-up';
|
|
@@ -24,5 +25,5 @@ export interface SocialSignInButtonsProps {
|
|
|
24
25
|
*
|
|
25
26
|
* Returns `null` while loading or when the server reports no providers.
|
|
26
27
|
*/
|
|
27
|
-
export declare function SocialSignInButtons({ mode, callbackURL, errorCallbackURL, dividerText, onProvidersResolved, }: SocialSignInButtonsProps):
|
|
28
|
+
export declare function SocialSignInButtons({ mode, callbackURL, errorCallbackURL, dividerText, onProvidersResolved, }: SocialSignInButtonsProps): React.JSX.Element | null;
|
|
28
29
|
//# sourceMappingURL=SocialSignInButtons.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SocialSignInButtons.d.ts","sourceRoot":"","sources":["../src/SocialSignInButtons.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"SocialSignInButtons.d.ts","sourceRoot":"","sources":["../src/SocialSignInButtons.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAiFnD,MAAM,WAAW,wBAAwB;IACvC,sFAAsF;IACtF,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;CACvD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,IAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,WAAsC,EACtC,mBAAmB,GACpB,EAAE,wBAAwB,4BA8E1B"}
|
package/dist/UserMenu.d.ts
CHANGED
|
@@ -28,5 +28,5 @@ export interface UserMenuProps {
|
|
|
28
28
|
* <UserMenu onProfile={() => navigate('/profile')} />
|
|
29
29
|
* ```
|
|
30
30
|
*/
|
|
31
|
-
export declare function UserMenu({ avatarUrl, onProfile, onSettings, }: UserMenuProps):
|
|
31
|
+
export declare function UserMenu({ avatarUrl, onProfile, onSettings, }: UserMenuProps): React.JSX.Element | null;
|
|
32
32
|
//# sourceMappingURL=UserMenu.d.ts.map
|
package/dist/UserMenu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserMenu.d.ts","sourceRoot":"","sources":["../src/UserMenu.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,SAAS,EACT,UAAU,GACX,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"UserMenu.d.ts","sourceRoot":"","sources":["../src/UserMenu.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,SAAS,EACT,UAAU,GACX,EAAE,aAAa,4BAiEf"}
|
package/dist/authStyles.d.ts
CHANGED
|
@@ -19,19 +19,19 @@ export declare const AUTH_PRIMARY_BUTTON_CLASS = "inline-flex h-11 w-full items-
|
|
|
19
19
|
export declare const AUTH_FIELD_LABEL_CLASS = "text-sm font-medium leading-none text-foreground";
|
|
20
20
|
export declare const AUTH_LINK_CLASS = "font-medium text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:underline";
|
|
21
21
|
/** Decorative spinner shown while a submit is pending. */
|
|
22
|
-
export declare function AuthSpinner():
|
|
22
|
+
export declare function AuthSpinner(): React.JSX.Element;
|
|
23
23
|
/** Inline alert icon for the error banner. */
|
|
24
24
|
export declare function AuthAlertIcon({ className }: {
|
|
25
25
|
className?: string;
|
|
26
|
-
}):
|
|
26
|
+
}): React.JSX.Element;
|
|
27
27
|
/** Inline success check icon for confirmation states. */
|
|
28
28
|
export declare function AuthCheckIcon({ className }: {
|
|
29
29
|
className?: string;
|
|
30
|
-
}):
|
|
30
|
+
}): React.JSX.Element;
|
|
31
31
|
/** Inline mail icon for the forgot-password success state. */
|
|
32
32
|
export declare function AuthMailIcon({ className }: {
|
|
33
33
|
className?: string;
|
|
34
|
-
}):
|
|
34
|
+
}): React.JSX.Element;
|
|
35
35
|
/**
|
|
36
36
|
* Decorative wrapper that renders the form title block:
|
|
37
37
|
* optional icon disc + title + description, centered.
|
|
@@ -40,13 +40,13 @@ export declare function AuthFormHeader({ icon, title, description, }: {
|
|
|
40
40
|
icon?: React.ReactNode;
|
|
41
41
|
title: React.ReactNode;
|
|
42
42
|
description?: React.ReactNode;
|
|
43
|
-
}):
|
|
43
|
+
}): React.JSX.Element;
|
|
44
44
|
/** Inline error banner used by all auth forms. */
|
|
45
45
|
export declare function AuthErrorBanner({ message }: {
|
|
46
46
|
message: string;
|
|
47
|
-
}):
|
|
47
|
+
}): React.JSX.Element;
|
|
48
48
|
/** "or" divider used when social sign-in buttons are present. */
|
|
49
49
|
export declare function AuthDivider({ label }: {
|
|
50
50
|
label?: string;
|
|
51
|
-
}):
|
|
51
|
+
}): React.JSX.Element;
|
|
52
52
|
//# sourceMappingURL=authStyles.d.ts.map
|
package/dist/authStyles.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authStyles.d.ts","sourceRoot":"","sources":["../src/authStyles.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,0XAC4V,CAAC;AAE1X,eAAO,MAAM,yBAAyB,oiBAC6f,CAAC;AAEpiB,eAAO,MAAM,sBAAsB,qDAAqD,CAAC;AAEzF,eAAO,MAAM,eAAe,mHACsF,CAAC;AAEnH,0DAA0D;AAC1D,wBAAgB,WAAW,
|
|
1
|
+
{"version":3,"file":"authStyles.d.ts","sourceRoot":"","sources":["../src/authStyles.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,0XAC4V,CAAC;AAE1X,eAAO,MAAM,yBAAyB,oiBAC6f,CAAC;AAEpiB,eAAO,MAAM,sBAAsB,qDAAqD,CAAC;AAEzF,eAAO,MAAM,eAAe,mHACsF,CAAC;AAEnH,0DAA0D;AAC1D,wBAAgB,WAAW,sBAyB1B;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,qBAiBlE;AAED,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,qBAgBlE;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,qBAgBjE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,KAAK,EACL,WAAW,GACZ,EAAE;IACD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC/B,qBAgBA;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,qBAU/D;AAED,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,EAAE,KAAY,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,qBAW/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAuthClient.d.ts","sourceRoot":"","sources":["../src/createAuthClient.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,UAAU,EAAE,gBAAgB,EAE7B,MAAM,SAAS,CAAC;AAIjB;;;GAGG;AACH,eAAO,MAAM,YAAY;kBACD,MAAM,GAAG,IAAI;WAE5B,MAAM,GAAG,IAAI;eAST,MAAM,GAAG,IAAI;aASf,IAAI;CAQd,CAAC;
|
|
1
|
+
{"version":3,"file":"createAuthClient.d.ts","sourceRoot":"","sources":["../src/createAuthClient.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,UAAU,EAAE,gBAAgB,EAE7B,MAAM,SAAS,CAAC;AAIjB;;;GAGG;AACH,eAAO,MAAM,YAAY;kBACD,MAAM,GAAG,IAAI;WAE5B,MAAM,GAAG,IAAI;eAST,MAAM,GAAG,IAAI;aASf,IAAI;CAQd,CAAC;AAmHF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA+crE"}
|
package/dist/createAuthClient.js
CHANGED
|
@@ -42,6 +42,18 @@ export const TokenStorage = {
|
|
|
42
42
|
catch { /* SSR / test */ }
|
|
43
43
|
},
|
|
44
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Build an `Error` from a better-auth client error, preserving the machine
|
|
47
|
+
* `code` on the thrown Error so callers (LoginForm/RegisterForm) can map it to
|
|
48
|
+
* a localized message instead of surfacing the raw English server text. Falls
|
|
49
|
+
* back to the server message, then the HTTP status.
|
|
50
|
+
*/
|
|
51
|
+
function toAuthError(error) {
|
|
52
|
+
const err = new Error(error.message ?? `Auth request failed with status ${error.status}`);
|
|
53
|
+
if (error.code)
|
|
54
|
+
err.code = error.code;
|
|
55
|
+
return err;
|
|
56
|
+
}
|
|
45
57
|
/**
|
|
46
58
|
* Resolve a baseURL (which may be relative or absolute) into the
|
|
47
59
|
* `{ origin, basePath }` pair required by the better-auth client.
|
|
@@ -73,6 +85,36 @@ function getWindowOrigin() {
|
|
|
73
85
|
}
|
|
74
86
|
return undefined;
|
|
75
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Resolve the redirect URL appended to password-reset emails as
|
|
90
|
+
* `?callbackURL=<value>`. better-auth sends users to `<value>?token=…`
|
|
91
|
+
* after verifying the token, so the value must point at the SPA's
|
|
92
|
+
* `/reset-password` route — including the SPA basename when mounted
|
|
93
|
+
* under a subpath (e.g. `/_console/reset-password`).
|
|
94
|
+
*
|
|
95
|
+
* Resolution order:
|
|
96
|
+
* 1. `<base href="…">` in the document head (matches how Console &
|
|
97
|
+
* Account derive React Router's basename) — preferred since it
|
|
98
|
+
* tracks whatever path the host SPA is served from.
|
|
99
|
+
* 2. `'/reset-password'` — sensible default for a SPA at the origin root.
|
|
100
|
+
*/
|
|
101
|
+
function resolveResetPasswordRedirect() {
|
|
102
|
+
try {
|
|
103
|
+
if (typeof document !== 'undefined') {
|
|
104
|
+
const baseEl = document.querySelector('base');
|
|
105
|
+
const href = baseEl?.getAttribute('href');
|
|
106
|
+
if (href) {
|
|
107
|
+
const url = new URL(href, getWindowOrigin() ?? 'http://localhost');
|
|
108
|
+
const path = url.pathname.replace(/\/$/, '');
|
|
109
|
+
return `${path}/reset-password`;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// ignore — fall through to default
|
|
115
|
+
}
|
|
116
|
+
return '/reset-password';
|
|
117
|
+
}
|
|
76
118
|
/**
|
|
77
119
|
* Create a fetch wrapper that injects Bearer token from localStorage
|
|
78
120
|
* and captures updated tokens from the `set-auth-token` response header
|
|
@@ -138,7 +180,7 @@ export function createAuthClient(config) {
|
|
|
138
180
|
password: credentials.password,
|
|
139
181
|
});
|
|
140
182
|
if (error) {
|
|
141
|
-
throw
|
|
183
|
+
throw toAuthError(error);
|
|
142
184
|
}
|
|
143
185
|
const payload = data;
|
|
144
186
|
// Persist token for cross-origin session persistence
|
|
@@ -154,13 +196,40 @@ export function createAuthClient(config) {
|
|
|
154
196
|
name: signUpData.name,
|
|
155
197
|
});
|
|
156
198
|
if (error) {
|
|
157
|
-
throw
|
|
199
|
+
throw toAuthError(error);
|
|
158
200
|
}
|
|
201
|
+
// better-auth's /sign-up/email returns { token: string | null, user }.
|
|
202
|
+
// - When auto sign-in is enabled and verification is not required, `token`
|
|
203
|
+
// is the new session token (cookie also set server-side).
|
|
204
|
+
// - When `requireEmailVerification` is on (or `autoSignIn: false`),
|
|
205
|
+
// `token` is null — no session, no cookie. The user must verify their
|
|
206
|
+
// email before signing in.
|
|
207
|
+
// Some deployments / older mocks return a `{ user, session }` shape; we
|
|
208
|
+
// accept either to stay compatible.
|
|
159
209
|
const payload = data;
|
|
160
|
-
|
|
161
|
-
|
|
210
|
+
const token = payload.token ?? payload.session?.token ?? null;
|
|
211
|
+
if (token) {
|
|
212
|
+
TokenStorage.set(token);
|
|
213
|
+
}
|
|
214
|
+
// Synthesize a session object when the server returned a flat token so
|
|
215
|
+
// existing callers that read `result.session` keep working.
|
|
216
|
+
let session = payload.session ?? null;
|
|
217
|
+
if (!session && token) {
|
|
218
|
+
session = { token };
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
user: payload.user,
|
|
222
|
+
session,
|
|
223
|
+
requiresVerification: token === null,
|
|
224
|
+
};
|
|
225
|
+
},
|
|
226
|
+
async sendVerificationEmail(email, callbackURL) {
|
|
227
|
+
// better-auth client exposes this on the root, not under a namespace.
|
|
228
|
+
const baseAuth = betterAuth;
|
|
229
|
+
const { error } = await baseAuth.sendVerificationEmail({ email, callbackURL });
|
|
230
|
+
if (error) {
|
|
231
|
+
throw new Error(error.message ?? `Auth request failed with status ${error.status}`);
|
|
162
232
|
}
|
|
163
|
-
return { user: payload.user, session: payload.session };
|
|
164
233
|
},
|
|
165
234
|
async signOut() {
|
|
166
235
|
const { error } = await betterAuth.signOut();
|
|
@@ -170,19 +239,70 @@ export function createAuthClient(config) {
|
|
|
170
239
|
}
|
|
171
240
|
},
|
|
172
241
|
async getSession() {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
242
|
+
// better-fetch RETHROWS transport errors (it does not wrap them in
|
|
243
|
+
// `{ error }`); a network hiccup must read as "signed out for now",
|
|
244
|
+
// not an exception in every AuthProvider boot.
|
|
245
|
+
let data = null;
|
|
246
|
+
try {
|
|
247
|
+
const res = await betterAuth.getSession();
|
|
248
|
+
if (!res.error)
|
|
249
|
+
data = res.data;
|
|
180
250
|
}
|
|
181
|
-
|
|
251
|
+
catch { /* transport error — fall through to the retry/null path */ }
|
|
252
|
+
if (data) {
|
|
253
|
+
const payload = data;
|
|
254
|
+
// Keep localStorage in sync if the server returns a fresh token
|
|
255
|
+
if (payload.session?.token) {
|
|
256
|
+
TokenStorage.set(payload.session.token);
|
|
257
|
+
}
|
|
258
|
+
return { user: payload.user, session: payload.session };
|
|
259
|
+
}
|
|
260
|
+
// Stale-bearer self-heal: every request injects the localStorage
|
|
261
|
+
// bearer, and an INVALID bearer shadows a perfectly valid cookie
|
|
262
|
+
// session. SSO landings (e.g. the cloud console's sso-exchange into a
|
|
263
|
+
// tenant environment) only set the cookie — they cannot touch this
|
|
264
|
+
// origin's localStorage — so a leftover token from an earlier login
|
|
265
|
+
// bounces a freshly signed-in user back to the login page forever.
|
|
266
|
+
// Retry once WITHOUT the bearer: a cookie session means the stored
|
|
267
|
+
// token was stale — adopt the live session (and its token) instead.
|
|
268
|
+
if (TokenStorage.get()) {
|
|
269
|
+
try {
|
|
270
|
+
const rawFetch = fetchFn || globalThis.fetch.bind(globalThis);
|
|
271
|
+
const resp = await rawFetch(`${origin}${basePath}/get-session`, {
|
|
272
|
+
method: 'GET',
|
|
273
|
+
credentials: 'include',
|
|
274
|
+
headers: { 'Content-Type': 'application/json' },
|
|
275
|
+
});
|
|
276
|
+
if (resp.ok) {
|
|
277
|
+
const body = (await resp.json().catch(() => null));
|
|
278
|
+
if (body?.user && body?.session) {
|
|
279
|
+
if (body.session.token)
|
|
280
|
+
TokenStorage.set(body.session.token);
|
|
281
|
+
else
|
|
282
|
+
TokenStorage.clear();
|
|
283
|
+
return { user: body.user, session: body.session };
|
|
284
|
+
}
|
|
285
|
+
// The server affirmatively says the cookie has no session either
|
|
286
|
+
// — the stored bearer is dead weight; drop it so the next
|
|
287
|
+
// sign-in starts clean. (Transport errors keep the token: they
|
|
288
|
+
// prove nothing about its validity.)
|
|
289
|
+
TokenStorage.clear();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch { /* network hiccup — treat as signed out, keep the token */ }
|
|
293
|
+
}
|
|
294
|
+
return null;
|
|
182
295
|
},
|
|
183
296
|
async forgotPassword(email) {
|
|
184
|
-
const
|
|
185
|
-
const
|
|
297
|
+
const ba = betterAuth;
|
|
298
|
+
const requestReset = ba.requestPasswordReset ?? ba.forgetPassword;
|
|
299
|
+
if (typeof requestReset !== 'function') {
|
|
300
|
+
throw new Error('password reset is not available on this auth backend');
|
|
301
|
+
}
|
|
302
|
+
const { error } = await requestReset({
|
|
303
|
+
email,
|
|
304
|
+
redirectTo: resolveResetPasswordRedirect(),
|
|
305
|
+
});
|
|
186
306
|
if (error) {
|
|
187
307
|
throw new Error(error.message ?? `Auth request failed with status ${error.status}`);
|
|
188
308
|
}
|
|
@@ -279,19 +399,26 @@ export function createAuthClient(config) {
|
|
|
279
399
|
},
|
|
280
400
|
async signInWithProvider(providerId, options = {}) {
|
|
281
401
|
const { type = 'social', callbackURL, errorCallbackURL } = options;
|
|
282
|
-
//
|
|
402
|
+
// We pass `disableDefaultFetchPlugins: true` to better-auth above,
|
|
403
|
+
// which also disables better-auth's `redirectPlugin` (the one that
|
|
404
|
+
// navigates the browser to `data.url` when the server responds with
|
|
405
|
+
// `{ url, redirect: true }`). The server still returns that payload
|
|
406
|
+
// for OAuth/OIDC providers — we just have to honour it ourselves.
|
|
283
407
|
if (type === 'oidc') {
|
|
284
408
|
const oauth2 = betterAuth.signIn.oauth2;
|
|
285
409
|
if (!oauth2) {
|
|
286
410
|
throw new Error('OIDC sign-in is not supported by this auth client build');
|
|
287
411
|
}
|
|
288
|
-
const { error } = await oauth2({ providerId, callbackURL, errorCallbackURL });
|
|
412
|
+
const { data, error } = await oauth2({ providerId, callbackURL, errorCallbackURL });
|
|
289
413
|
if (error) {
|
|
290
414
|
throw new Error(error.message ?? `Auth request failed with status ${error.status}`);
|
|
291
415
|
}
|
|
416
|
+
if (data?.url && typeof window !== 'undefined') {
|
|
417
|
+
window.location.href = data.url;
|
|
418
|
+
}
|
|
292
419
|
return;
|
|
293
420
|
}
|
|
294
|
-
const { error } = await betterAuth.signIn.social({
|
|
421
|
+
const { data, error } = await betterAuth.signIn.social({
|
|
295
422
|
provider: providerId,
|
|
296
423
|
callbackURL,
|
|
297
424
|
errorCallbackURL,
|
|
@@ -299,6 +426,10 @@ export function createAuthClient(config) {
|
|
|
299
426
|
if (error) {
|
|
300
427
|
throw new Error(error.message ?? `Auth request failed with status ${error.status}`);
|
|
301
428
|
}
|
|
429
|
+
const socialUrl = data?.url;
|
|
430
|
+
if (socialUrl && typeof window !== 'undefined') {
|
|
431
|
+
window.location.href = socialUrl;
|
|
432
|
+
}
|
|
302
433
|
},
|
|
303
434
|
// --- Organization / Workspace methods ---
|
|
304
435
|
async listOrganizations() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAuthenticatedFetch.d.ts","sourceRoot":"","sources":["../src/createAuthenticatedFetch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;;GAGG;AACH,eAAO,MAAM,yBAAyB;kBACd,MAAM,GAAG,IAAI;WAE5B,MAAM,GAAG,IAAI;eAST,MAAM,GAAG,IAAI;aASf,IAAI;CAQd,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"createAuthenticatedFetch.d.ts","sourceRoot":"","sources":["../src/createAuthenticatedFetch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;;GAGG;AACH,eAAO,MAAM,yBAAyB;kBACd,MAAM,GAAG,IAAI;WAE5B,MAAM,GAAG,IAAI;eAST,MAAM,GAAG,IAAI;aASf,IAAI;CAQd,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CA8B9G"}
|
|
@@ -62,18 +62,31 @@ export const ActiveOrganizationStorage = {
|
|
|
62
62
|
export function createAuthenticatedFetch() {
|
|
63
63
|
return async (input, init) => {
|
|
64
64
|
const headers = new Headers(init?.headers);
|
|
65
|
+
const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
66
|
+
const isApiCall = /\/api\//i.test(url);
|
|
65
67
|
const token = TokenStorage.get();
|
|
66
|
-
if (token) {
|
|
67
|
-
|
|
68
|
-
if (/\/api\//i.test(url)) {
|
|
69
|
-
headers.set('Authorization', `Bearer ${token}`);
|
|
70
|
-
}
|
|
68
|
+
if (token && isApiCall) {
|
|
69
|
+
headers.set('Authorization', `Bearer ${token}`);
|
|
71
70
|
}
|
|
72
71
|
// Inject tenant header for multi-tenant routing
|
|
73
72
|
const activeOrgId = ActiveOrganizationStorage.get();
|
|
74
73
|
if (activeOrgId) {
|
|
75
74
|
headers.set('X-Tenant-ID', activeOrgId);
|
|
76
75
|
}
|
|
76
|
+
// Inject the active UI language so the server resolves metadata labels
|
|
77
|
+
// (object/field/view labels, action-dialog text) in the right locale. The
|
|
78
|
+
// i18n provider keeps `<html lang>` in sync with the in-app language
|
|
79
|
+
// switcher, so reading it here means a language switch carries the new
|
|
80
|
+
// `Accept-Language` on every subsequent request — closing the gap where
|
|
81
|
+
// server-resolved labels stayed in the old language until a page refresh
|
|
82
|
+
// (issue #1319). We only fold it in for our own API calls, and never
|
|
83
|
+
// clobber an `Accept-Language` the caller set explicitly.
|
|
84
|
+
if (isApiCall && !headers.has('Accept-Language') && typeof document !== 'undefined') {
|
|
85
|
+
const lang = document.documentElement.lang;
|
|
86
|
+
if (lang) {
|
|
87
|
+
headers.set('Accept-Language', lang);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
77
90
|
return fetch(input, { ...init, headers });
|
|
78
91
|
};
|
|
79
92
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -121,10 +121,11 @@ export interface AuthClient {
|
|
|
121
121
|
user: AuthUser;
|
|
122
122
|
session: AuthSession;
|
|
123
123
|
}>;
|
|
124
|
-
/** Sign up with email/password */
|
|
124
|
+
/** Sign up with email/password. `session` is null when email verification is required. */
|
|
125
125
|
signUp: (data: SignUpData) => Promise<{
|
|
126
126
|
user: AuthUser;
|
|
127
|
-
session: AuthSession;
|
|
127
|
+
session: AuthSession | null;
|
|
128
|
+
requiresVerification: boolean;
|
|
128
129
|
}>;
|
|
129
130
|
/** Sign out */
|
|
130
131
|
signOut: () => Promise<void>;
|
|
@@ -135,6 +136,8 @@ export interface AuthClient {
|
|
|
135
136
|
} | null>;
|
|
136
137
|
/** Reset password request */
|
|
137
138
|
forgotPassword: (email: string) => Promise<void>;
|
|
139
|
+
/** Send (or resend) the email-verification link to the given address. */
|
|
140
|
+
sendVerificationEmail: (email: string, callbackURL?: string) => Promise<void>;
|
|
138
141
|
/** Reset password with token */
|
|
139
142
|
resetPassword: (token: string, newPassword: string) => Promise<void>;
|
|
140
143
|
/** Change password (requires current password). For users who already have a local password. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;GAEG;AAEH,qCAAqC;AACrC,MAAM,WAAW,QAAQ;IACvB,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gCAAgC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAWjG;AAED,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,2BAA2B;AAC3B,MAAM,WAAW,SAAS;IACxB,iCAAiC;IACjC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,sBAAsB;IACtB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,wCAAwC;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,2BAA2B;IAC3B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,0BAA0B;AAC1B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,mBAAmB;AACnB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC1B;AAED,uDAAuD;AACvD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,wBAAwB,CAAC,EAAE,OAAO,CAAC;KACpC,CAAC;IACF,eAAe,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACvC,QAAQ,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB;;;;WAIG;QACH,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH;AAED,oDAAoD;AACpD,MAAM,WAAW,yBAAyB;IACxC,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC1B;AAED,oEAAoE;AACpE,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,MAAM,EAAE,CAAC,WAAW,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IAC9F,0FAA0F;IAC1F,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;QAAC,oBAAoB,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtH,eAAe;IACf,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,0BAA0B;IAC1B,UAAU,EAAE,MAAM,OAAO,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC3E,6BAA6B;IAC7B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,yEAAyE;IACzE,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,gCAAgC;IAChC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,gGAAgG;IAChG,cAAc,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7H,wFAAwF;IACxF,kBAAkB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,0BAA0B;IAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE3D,gFAAgF;IAChF,SAAS,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3C,gFAAgF;IAChF,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAI/F,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACrD,gCAAgC;IAChC,kBAAkB,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvG,0DAA0D;IAC1D,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC3E,8CAA8C;IAC9C,qBAAqB,EAAE,MAAM,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC9D,iFAAiF;IACjF,eAAe,EAAE,MAAM,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAC9D,qCAAqC;IACrC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACjE,yCAAyC;IACzC,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACzG,2CAA2C;IAC3C,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,6BAA6B;IAC7B,gBAAgB,EAAE,CAAC,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtG,kCAAkC;IAClC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC,CAAC,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/I,6BAA6B;IAC7B,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,iDAAiD;IACjD,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAIpD,iEAAiE;IACjE,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC9D,yCAAyC;IACzC,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,uEAAuE;IACvE,aAAa,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACjE,+CAA+C;IAC/C,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,+CAA+C;IAC/C,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CACtD;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qDAAqD;IACrD,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC5C,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qFAAqF;AACrF,MAAM,WAAW,sBAAsB;IACrC,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8BAA8B;AAC9B,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,0BAA0B;AAC1B,MAAM,WAAW,sBAAsB;IACrC,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC/C,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
package/dist/useAuth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAW,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE/D;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,IAAI,gBAAgB,
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAW,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE/D;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,IAAI,gBAAgB,CAkD1C"}
|
package/dist/useAuth.js
CHANGED
|
@@ -38,6 +38,7 @@ export function useAuth() {
|
|
|
38
38
|
signOut: async () => { throw new Error('useAuth must be used within an AuthProvider'); },
|
|
39
39
|
updateUser: async () => { throw new Error('useAuth must be used within an AuthProvider'); },
|
|
40
40
|
forgotPassword: async () => { throw new Error('useAuth must be used within an AuthProvider'); },
|
|
41
|
+
sendVerificationEmail: async () => { throw new Error('useAuth must be used within an AuthProvider'); },
|
|
41
42
|
resetPassword: async () => { throw new Error('useAuth must be used within an AuthProvider'); },
|
|
42
43
|
changePassword: async () => { throw new Error('useAuth must be used within an AuthProvider'); },
|
|
43
44
|
setInitialPassword: async () => { throw new Error('useAuth must be used within an AuthProvider'); },
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/auth",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Authentication system for Object UI with AuthProvider, useAuth hook, AuthGuard, and form components.",
|
|
@@ -30,14 +30,14 @@
|
|
|
30
30
|
"react": "^18.0.0 || ^19.0.0"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"better-auth": "^1.6.
|
|
34
|
-
"@object-ui/types": "
|
|
33
|
+
"better-auth": "^1.6.20",
|
|
34
|
+
"@object-ui/types": "7.1.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@types/react": "19.2.
|
|
38
|
-
"react": "19.2.
|
|
37
|
+
"@types/react": "19.2.17",
|
|
38
|
+
"react": "19.2.7",
|
|
39
39
|
"typescript": "^6.0.3",
|
|
40
|
-
"vitest": "^4.1.
|
|
40
|
+
"vitest": "^4.1.9"
|
|
41
41
|
},
|
|
42
42
|
"keywords": [
|
|
43
43
|
"objectui",
|