@fayz-ai/plugin-auth 0.1.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/LICENSE +21 -0
- package/README.md +22 -0
- package/dist/forms.d.ts +30 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/index.cjs +399 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +347 -0
- package/dist/index.js.map +1 -0
- package/dist/pages.d.ts +32 -0
- package/dist/pages.d.ts.map +1 -0
- package/dist/runtime.d.ts +6 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +52 -0
- package/src/forms.tsx +252 -0
- package/src/index.ts +49 -0
- package/src/pages.tsx +196 -0
- package/src/runtime.ts +59 -0
- package/src/types.ts +53 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Faya Labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @fayz-ai/plugin-auth
|
|
2
|
+
|
|
3
|
+
Reusable auth runtime and UI for Fayz apps.
|
|
4
|
+
|
|
5
|
+
`plugin-auth` is a thin layer over `@fayz-ai/auth`: it resolves Supabase/mock/custom adapters, renders login/signup/recovery/reset/callback surfaces, and gives SaaS or storefront apps one consistent auth integration path.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { createAuthPlugin } from '@fayz-ai/plugin-auth'
|
|
11
|
+
|
|
12
|
+
export const auth = createAuthPlugin({
|
|
13
|
+
provider: import.meta.env.VITE_SUPABASE_URL ? 'supabase' : 'mock',
|
|
14
|
+
supabase: {
|
|
15
|
+
url: import.meta.env.VITE_SUPABASE_URL,
|
|
16
|
+
anonKey: import.meta.env.VITE_SUPABASE_ANON_KEY,
|
|
17
|
+
},
|
|
18
|
+
requireAuth: true,
|
|
19
|
+
layout: 'split',
|
|
20
|
+
oauth: { enabled: true, providers: ['google'] },
|
|
21
|
+
})
|
|
22
|
+
```
|
package/dist/forms.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { AuthProvider } from '@fayz-ai/core';
|
|
3
|
+
export interface OAuthButtonsProps {
|
|
4
|
+
providers?: Exclude<AuthProvider, 'email'>[];
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
onProviderClick?: (provider: AuthProvider) => void | Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function OAuthButtons({ providers, disabled, onProviderClick }: OAuthButtonsProps): React.JSX.Element;
|
|
9
|
+
export interface LoginFormProps {
|
|
10
|
+
onSuccess?: () => void;
|
|
11
|
+
onForgotPassword?: () => void;
|
|
12
|
+
showOAuth?: boolean;
|
|
13
|
+
oauthProviders?: Exclude<AuthProvider, 'email'>[];
|
|
14
|
+
}
|
|
15
|
+
export declare function LoginForm({ onSuccess, onForgotPassword, showOAuth, oauthProviders }: LoginFormProps): React.JSX.Element;
|
|
16
|
+
export interface SignupFormProps {
|
|
17
|
+
onSuccess?: () => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function SignupForm({ onSuccess }: SignupFormProps): React.JSX.Element;
|
|
20
|
+
export interface ForgotPasswordFormProps {
|
|
21
|
+
redirectTo?: string;
|
|
22
|
+
onSent?: (email: string) => void;
|
|
23
|
+
onBackToLogin?: () => void;
|
|
24
|
+
}
|
|
25
|
+
export declare function ForgotPasswordForm({ redirectTo, onSent, onBackToLogin }: ForgotPasswordFormProps): React.JSX.Element;
|
|
26
|
+
export interface ResetPasswordFormProps {
|
|
27
|
+
onSuccess?: () => void;
|
|
28
|
+
}
|
|
29
|
+
export declare function ResetPasswordForm({ onSuccess }: ResetPasswordFormProps): React.JSX.Element;
|
|
30
|
+
//# sourceMappingURL=forms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../src/forms.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAkBjD,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnE;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAsB,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,iBAAiB,qBAmBpG;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;CAClD;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,cAAc,qBA0CnG;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,eAAe,qBAsDxD;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAC3B;AAED,wBAAgB,kBAAkB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,uBAAuB,qBAqChG;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,sBAAsB,qBA4CtE"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var auth = require('@fayz-ai/auth');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
26
|
+
|
|
27
|
+
// src/runtime.ts
|
|
28
|
+
function absoluteUrl(path) {
|
|
29
|
+
if (typeof window === "undefined") return void 0;
|
|
30
|
+
if (/^https?:\/\//.test(path)) return path;
|
|
31
|
+
return `${window.location.origin}${path.startsWith("/") ? path : `/${path}`}`;
|
|
32
|
+
}
|
|
33
|
+
function resolveAuthAdapter(options = {}) {
|
|
34
|
+
const configured = options.adapter ?? options.provider;
|
|
35
|
+
if (configured && typeof configured === "object") return configured;
|
|
36
|
+
const provider = configured ?? (options.supabase?.url ? "supabase" : "mock");
|
|
37
|
+
if (provider === "supabase") {
|
|
38
|
+
const url = options.supabase?.url;
|
|
39
|
+
const anonKey = options.supabase?.anonKey;
|
|
40
|
+
if (!url || !anonKey) {
|
|
41
|
+
throw new Error('plugin-auth provider="supabase" requires supabase.url and supabase.anonKey.');
|
|
42
|
+
}
|
|
43
|
+
return auth.createSupabaseAuthAdapter({
|
|
44
|
+
supabaseUrl: url,
|
|
45
|
+
supabaseAnonKey: anonKey,
|
|
46
|
+
supabaseClient: options.supabase?.client,
|
|
47
|
+
callbackUrl: options.supabase?.callbackUrl ?? absoluteUrl(options.routes?.callback ?? "/auth/callback"),
|
|
48
|
+
resetPasswordUrl: options.supabase?.resetPasswordUrl ?? absoluteUrl(options.routes?.resetPassword ?? "/auth/reset-password")
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return auth.createMockAuthAdapter();
|
|
52
|
+
}
|
|
53
|
+
function createAuthRuntime(options = {}) {
|
|
54
|
+
return {
|
|
55
|
+
kind: "auth",
|
|
56
|
+
adapter: resolveAuthAdapter(options),
|
|
57
|
+
requireAuth: options.requireAuth ?? true,
|
|
58
|
+
layout: options.layout ?? "split",
|
|
59
|
+
logo: options.logo,
|
|
60
|
+
tagline: options.tagline,
|
|
61
|
+
description: options.description,
|
|
62
|
+
oauth: {
|
|
63
|
+
enabled: options.oauth?.enabled ?? false,
|
|
64
|
+
providers: options.oauth?.providers ?? ["google"]
|
|
65
|
+
},
|
|
66
|
+
routes: {
|
|
67
|
+
login: options.routes?.login ?? "/login",
|
|
68
|
+
callback: options.routes?.callback ?? "/auth/callback",
|
|
69
|
+
resetPassword: options.routes?.resetPassword ?? "/auth/reset-password",
|
|
70
|
+
afterSignIn: options.routes?.afterSignIn ?? "/"
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function createAuthPlugin(options = {}) {
|
|
75
|
+
return createAuthRuntime(options);
|
|
76
|
+
}
|
|
77
|
+
function providerLabel(provider) {
|
|
78
|
+
return provider.charAt(0).toUpperCase() + provider.slice(1);
|
|
79
|
+
}
|
|
80
|
+
function fieldClass() {
|
|
81
|
+
return "h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50";
|
|
82
|
+
}
|
|
83
|
+
function buttonClass(variant = "primary") {
|
|
84
|
+
if (variant === "outline") {
|
|
85
|
+
return "inline-flex h-10 w-full items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-muted disabled:pointer-events-none disabled:opacity-50";
|
|
86
|
+
}
|
|
87
|
+
if (variant === "ghost") return "text-sm font-medium text-primary hover:underline";
|
|
88
|
+
return "inline-flex h-10 w-full items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50";
|
|
89
|
+
}
|
|
90
|
+
function OAuthButtons({ providers = ["google"], disabled, onProviderClick }) {
|
|
91
|
+
const { signInWithOAuth } = auth.useAuth();
|
|
92
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: providers.map((provider) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
93
|
+
"button",
|
|
94
|
+
{
|
|
95
|
+
type: "button",
|
|
96
|
+
className: buttonClass("outline"),
|
|
97
|
+
disabled,
|
|
98
|
+
onClick: () => {
|
|
99
|
+
void (onProviderClick ? onProviderClick(provider) : signInWithOAuth(provider));
|
|
100
|
+
},
|
|
101
|
+
children: [
|
|
102
|
+
"Continue with ",
|
|
103
|
+
providerLabel(provider)
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
provider
|
|
107
|
+
)) });
|
|
108
|
+
}
|
|
109
|
+
function LoginForm({ onSuccess, onForgotPassword, showOAuth, oauthProviders }) {
|
|
110
|
+
const { signIn, error, isLoading } = auth.useAuth();
|
|
111
|
+
const [email, setEmail] = React__namespace.useState("");
|
|
112
|
+
const [password, setPassword] = React__namespace.useState("");
|
|
113
|
+
const [busy, setBusy] = React__namespace.useState(false);
|
|
114
|
+
const disabled = busy || isLoading;
|
|
115
|
+
async function submit(event) {
|
|
116
|
+
event.preventDefault();
|
|
117
|
+
setBusy(true);
|
|
118
|
+
try {
|
|
119
|
+
await signIn(email, password);
|
|
120
|
+
onSuccess?.();
|
|
121
|
+
} finally {
|
|
122
|
+
setBusy(false);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: submit, className: "space-y-4", children: [
|
|
126
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
127
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Email" }),
|
|
128
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { className: fieldClass(), type: "email", autoComplete: "username", required: true, value: email, onChange: (e) => setEmail(e.target.value), disabled })
|
|
129
|
+
] }),
|
|
130
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
131
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Password" }),
|
|
132
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { className: fieldClass(), type: "password", autoComplete: "current-password", required: true, value: password, onChange: (e) => setPassword(e.target.value), disabled })
|
|
133
|
+
] }),
|
|
134
|
+
onForgotPassword && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "-mt-1 flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: buttonClass("ghost"), onClick: onForgotPassword, children: "Forgot password?" }) }),
|
|
135
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: error.message }),
|
|
136
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? "Signing in..." : "Sign in" }),
|
|
137
|
+
showOAuth && /* @__PURE__ */ jsxRuntime.jsx(OAuthButtons, { providers: oauthProviders, disabled })
|
|
138
|
+
] });
|
|
139
|
+
}
|
|
140
|
+
function SignupForm({ onSuccess }) {
|
|
141
|
+
const { signUp, error, isLoading } = auth.useAuth();
|
|
142
|
+
const [fullName, setFullName] = React__namespace.useState("");
|
|
143
|
+
const [email, setEmail] = React__namespace.useState("");
|
|
144
|
+
const [password, setPassword] = React__namespace.useState("");
|
|
145
|
+
const [confirmPassword, setConfirmPassword] = React__namespace.useState("");
|
|
146
|
+
const [localError, setLocalError] = React__namespace.useState(null);
|
|
147
|
+
const [busy, setBusy] = React__namespace.useState(false);
|
|
148
|
+
const disabled = busy || isLoading;
|
|
149
|
+
async function submit(event) {
|
|
150
|
+
event.preventDefault();
|
|
151
|
+
setLocalError(null);
|
|
152
|
+
if (password.length < 8) {
|
|
153
|
+
setLocalError("Password must be at least 8 characters.");
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (password !== confirmPassword) {
|
|
157
|
+
setLocalError("Passwords do not match.");
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
setBusy(true);
|
|
161
|
+
try {
|
|
162
|
+
await signUp(email, password, fullName);
|
|
163
|
+
onSuccess?.();
|
|
164
|
+
} finally {
|
|
165
|
+
setBusy(false);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: submit, className: "space-y-4", children: [
|
|
169
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
170
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Full name" }),
|
|
171
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { className: fieldClass(), required: true, value: fullName, onChange: (e) => setFullName(e.target.value), disabled })
|
|
172
|
+
] }),
|
|
173
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
174
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Email" }),
|
|
175
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { className: fieldClass(), type: "email", autoComplete: "username", required: true, value: email, onChange: (e) => setEmail(e.target.value), disabled })
|
|
176
|
+
] }),
|
|
177
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
178
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Password" }),
|
|
179
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { className: fieldClass(), type: "password", autoComplete: "new-password", required: true, value: password, onChange: (e) => setPassword(e.target.value), disabled })
|
|
180
|
+
] }),
|
|
181
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
182
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Confirm password" }),
|
|
183
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { className: fieldClass(), type: "password", autoComplete: "new-password", required: true, value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), disabled })
|
|
184
|
+
] }),
|
|
185
|
+
(localError || error) && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: localError ?? error?.message }),
|
|
186
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? "Creating account..." : "Create account" })
|
|
187
|
+
] });
|
|
188
|
+
}
|
|
189
|
+
function ForgotPasswordForm({ redirectTo, onSent, onBackToLogin }) {
|
|
190
|
+
const { resetPassword, error, isLoading } = auth.useAuth();
|
|
191
|
+
const [email, setEmail] = React__namespace.useState("");
|
|
192
|
+
const [sent, setSent] = React__namespace.useState(false);
|
|
193
|
+
const [busy, setBusy] = React__namespace.useState(false);
|
|
194
|
+
const disabled = busy || isLoading;
|
|
195
|
+
async function submit(event) {
|
|
196
|
+
event.preventDefault();
|
|
197
|
+
setBusy(true);
|
|
198
|
+
try {
|
|
199
|
+
await resetPassword(email, { redirectTo });
|
|
200
|
+
setSent(true);
|
|
201
|
+
onSent?.(email);
|
|
202
|
+
} finally {
|
|
203
|
+
setBusy(false);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: submit, className: "space-y-4", children: [
|
|
207
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
208
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Email" }),
|
|
209
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { className: fieldClass(), type: "email", autoComplete: "username", required: true, value: email, onChange: (e) => setEmail(e.target.value), disabled })
|
|
210
|
+
] }),
|
|
211
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: error.message }),
|
|
212
|
+
sent && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-emerald-600", children: "Password reset instructions sent." }),
|
|
213
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? "Sending..." : "Send reset link" }),
|
|
214
|
+
onBackToLogin && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: buttonClass("ghost"), onClick: onBackToLogin, children: "Back to login" })
|
|
215
|
+
] });
|
|
216
|
+
}
|
|
217
|
+
function ResetPasswordForm({ onSuccess }) {
|
|
218
|
+
const { updatePassword, error, isLoading } = auth.useAuth();
|
|
219
|
+
const [password, setPassword] = React__namespace.useState("");
|
|
220
|
+
const [confirmPassword, setConfirmPassword] = React__namespace.useState("");
|
|
221
|
+
const [localError, setLocalError] = React__namespace.useState(null);
|
|
222
|
+
const [busy, setBusy] = React__namespace.useState(false);
|
|
223
|
+
const disabled = busy || isLoading;
|
|
224
|
+
async function submit(event) {
|
|
225
|
+
event.preventDefault();
|
|
226
|
+
setLocalError(null);
|
|
227
|
+
if (password.length < 8) {
|
|
228
|
+
setLocalError("Password must be at least 8 characters.");
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (password !== confirmPassword) {
|
|
232
|
+
setLocalError("Passwords do not match.");
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
setBusy(true);
|
|
236
|
+
try {
|
|
237
|
+
await updatePassword(password);
|
|
238
|
+
onSuccess?.();
|
|
239
|
+
} finally {
|
|
240
|
+
setBusy(false);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: submit, className: "space-y-4", children: [
|
|
244
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
245
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "New password" }),
|
|
246
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { className: fieldClass(), type: "password", autoComplete: "new-password", required: true, value: password, onChange: (e) => setPassword(e.target.value), disabled })
|
|
247
|
+
] }),
|
|
248
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
249
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Confirm password" }),
|
|
250
|
+
/* @__PURE__ */ jsxRuntime.jsx("input", { className: fieldClass(), type: "password", autoComplete: "new-password", required: true, value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), disabled })
|
|
251
|
+
] }),
|
|
252
|
+
(localError || error) && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: localError ?? error?.message }),
|
|
253
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? "Saving..." : "Update password" })
|
|
254
|
+
] });
|
|
255
|
+
}
|
|
256
|
+
function LoginPage({
|
|
257
|
+
appName = "App",
|
|
258
|
+
logo,
|
|
259
|
+
loginLogo,
|
|
260
|
+
layout = "split",
|
|
261
|
+
tagline,
|
|
262
|
+
description,
|
|
263
|
+
showOAuth,
|
|
264
|
+
oauthProviders,
|
|
265
|
+
resetPasswordUrl,
|
|
266
|
+
onSuccess
|
|
267
|
+
}) {
|
|
268
|
+
const [view, setView] = React__namespace.useState("login");
|
|
269
|
+
const brandLogo = loginLogo ?? logo;
|
|
270
|
+
const heading = view === "login" ? "Welcome back" : view === "signup" ? "Create account" : "Reset password";
|
|
271
|
+
const subtitle = view === "login" ? "Enter your credentials to continue" : view === "signup" ? "Create your account to get started" : "Enter your email and we will send reset instructions";
|
|
272
|
+
const form = view === "login" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
273
|
+
LoginForm,
|
|
274
|
+
{
|
|
275
|
+
onSuccess,
|
|
276
|
+
onForgotPassword: () => setView("recovery"),
|
|
277
|
+
showOAuth,
|
|
278
|
+
oauthProviders
|
|
279
|
+
}
|
|
280
|
+
) : view === "signup" ? /* @__PURE__ */ jsxRuntime.jsx(SignupForm, { onSuccess }) : /* @__PURE__ */ jsxRuntime.jsx(ForgotPasswordForm, { redirectTo: resetPasswordUrl, onBackToLogin: () => setView("login") });
|
|
281
|
+
const switcher = view === "login" ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-center text-sm text-muted-foreground", children: [
|
|
282
|
+
"Do not have an account?",
|
|
283
|
+
" ",
|
|
284
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "font-medium text-primary hover:underline", onClick: () => setView("signup"), children: "Sign up" })
|
|
285
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-center text-sm text-muted-foreground", children: [
|
|
286
|
+
view === "signup" ? "Already have an account?" : "Remembered your password?",
|
|
287
|
+
" ",
|
|
288
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "font-medium text-primary hover:underline", onClick: () => setView("login"), children: "Sign in" })
|
|
289
|
+
] });
|
|
290
|
+
if (layout === "centered") {
|
|
291
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-screen items-center justify-center bg-sidebar p-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl sm:p-10", children: [
|
|
292
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-8 text-center", children: [
|
|
293
|
+
brandLogo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 flex justify-center", children: brandLogo }),
|
|
294
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-foreground", children: heading }),
|
|
295
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: subtitle })
|
|
296
|
+
] }),
|
|
297
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
298
|
+
form,
|
|
299
|
+
switcher
|
|
300
|
+
] })
|
|
301
|
+
] }) });
|
|
302
|
+
}
|
|
303
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-screen bg-sidebar", children: [
|
|
304
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative hidden w-1/2 overflow-hidden lg:block", children: [
|
|
305
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-sidebar-accent/50 via-transparent to-sidebar/80" }),
|
|
306
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative flex h-full flex-col justify-end p-12", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
307
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-sidebar-muted", children: appName }),
|
|
308
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-3xl font-bold text-sidebar-foreground", children: tagline ?? `Welcome to ${appName}` }),
|
|
309
|
+
description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-md text-sm leading-relaxed text-sidebar-muted", children: description })
|
|
310
|
+
] }) })
|
|
311
|
+
] }),
|
|
312
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-1 flex-col lg:p-3 lg:pl-3", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-1 flex-col justify-center bg-background px-6 py-12 lg:rounded-[1.25rem] lg:px-16", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-sm", children: [
|
|
313
|
+
brandLogo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-8", children: brandLogo }),
|
|
314
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-8", children: [
|
|
315
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-foreground", children: heading }),
|
|
316
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: subtitle })
|
|
317
|
+
] }),
|
|
318
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
319
|
+
form,
|
|
320
|
+
switcher
|
|
321
|
+
] })
|
|
322
|
+
] }) }) })
|
|
323
|
+
] });
|
|
324
|
+
}
|
|
325
|
+
function AuthGate({ requireAuth = true, loadingFallback, children, ...loginProps }) {
|
|
326
|
+
const { isAuthenticated, isLoading } = auth.useAuth();
|
|
327
|
+
if (!requireAuth || isAuthenticated) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
|
|
328
|
+
if (isLoading) {
|
|
329
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: loadingFallback ?? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-screen items-center justify-center bg-background", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: "Loading..." }) }) });
|
|
330
|
+
}
|
|
331
|
+
return /* @__PURE__ */ jsxRuntime.jsx(LoginPage, { ...loginProps });
|
|
332
|
+
}
|
|
333
|
+
function AuthCallbackPage({ onSuccess, onError }) {
|
|
334
|
+
const { handleCallback } = auth.useAuth();
|
|
335
|
+
const [error, setError] = React__namespace.useState(null);
|
|
336
|
+
React__namespace.useEffect(() => {
|
|
337
|
+
let cancelled = false;
|
|
338
|
+
handleCallback(typeof window === "undefined" ? void 0 : window.location.href).then(() => {
|
|
339
|
+
if (!cancelled) onSuccess?.();
|
|
340
|
+
}).catch((err) => {
|
|
341
|
+
const errorObject = err instanceof Error ? err : new Error(String(err));
|
|
342
|
+
if (!cancelled) {
|
|
343
|
+
setError(errorObject.message);
|
|
344
|
+
onError?.(errorObject);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
return () => {
|
|
348
|
+
cancelled = true;
|
|
349
|
+
};
|
|
350
|
+
}, [handleCallback, onError, onSuccess]);
|
|
351
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-screen items-center justify-center bg-background p-6 text-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
352
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-xl font-semibold text-foreground", children: error ? "Authentication failed" : "Completing sign in..." }),
|
|
353
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-destructive", children: error })
|
|
354
|
+
] }) });
|
|
355
|
+
}
|
|
356
|
+
function ResetPasswordPage({ onSuccess }) {
|
|
357
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-screen items-center justify-center bg-background p-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full max-w-md rounded-2xl border bg-card p-8 shadow-xl", children: [
|
|
358
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-6", children: [
|
|
359
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-foreground", children: "Update password" }),
|
|
360
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: "Choose a new password for your account." })
|
|
361
|
+
] }),
|
|
362
|
+
/* @__PURE__ */ jsxRuntime.jsx(ResetPasswordForm, { onSuccess })
|
|
363
|
+
] }) });
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
Object.defineProperty(exports, "AuthProvider", {
|
|
367
|
+
enumerable: true,
|
|
368
|
+
get: function () { return auth.AuthProvider; }
|
|
369
|
+
});
|
|
370
|
+
Object.defineProperty(exports, "createMockAuthAdapter", {
|
|
371
|
+
enumerable: true,
|
|
372
|
+
get: function () { return auth.createMockAuthAdapter; }
|
|
373
|
+
});
|
|
374
|
+
Object.defineProperty(exports, "createSupabaseAuthAdapter", {
|
|
375
|
+
enumerable: true,
|
|
376
|
+
get: function () { return auth.createSupabaseAuthAdapter; }
|
|
377
|
+
});
|
|
378
|
+
Object.defineProperty(exports, "useAuth", {
|
|
379
|
+
enumerable: true,
|
|
380
|
+
get: function () { return auth.useAuth; }
|
|
381
|
+
});
|
|
382
|
+
Object.defineProperty(exports, "useAuthStore", {
|
|
383
|
+
enumerable: true,
|
|
384
|
+
get: function () { return auth.useAuthStore; }
|
|
385
|
+
});
|
|
386
|
+
exports.AuthCallbackPage = AuthCallbackPage;
|
|
387
|
+
exports.AuthGate = AuthGate;
|
|
388
|
+
exports.ForgotPasswordForm = ForgotPasswordForm;
|
|
389
|
+
exports.LoginForm = LoginForm;
|
|
390
|
+
exports.LoginPage = LoginPage;
|
|
391
|
+
exports.OAuthButtons = OAuthButtons;
|
|
392
|
+
exports.ResetPasswordForm = ResetPasswordForm;
|
|
393
|
+
exports.ResetPasswordPage = ResetPasswordPage;
|
|
394
|
+
exports.SignupForm = SignupForm;
|
|
395
|
+
exports.createAuthPlugin = createAuthPlugin;
|
|
396
|
+
exports.createAuthRuntime = createAuthRuntime;
|
|
397
|
+
exports.resolveAuthAdapter = resolveAuthAdapter;
|
|
398
|
+
//# sourceMappingURL=index.cjs.map
|
|
399
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts","../src/forms.tsx","../src/pages.tsx"],"names":["createSupabaseAuthAdapter","createMockAuthAdapter","useAuth","jsxs","React","jsx","React2","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AuthAdapter } from '@fayz-ai/core'\nimport { createMockAuthAdapter, createSupabaseAuthAdapter } from '@fayz-ai/auth'\nimport type { AuthPluginOptions, ResolvedAuthPlugin } from './types'\n\nfunction absoluteUrl(path: string): string | undefined {\n if (typeof window === 'undefined') return undefined\n if (/^https?:\\/\\//.test(path)) return path\n return `${window.location.origin}${path.startsWith('/') ? path : `/${path}`}`\n}\n\nexport function resolveAuthAdapter(options: AuthPluginOptions = {}): AuthAdapter {\n const configured = options.adapter ?? options.provider\n if (configured && typeof configured === 'object') return configured\n\n const provider = configured ?? (options.supabase?.url ? 'supabase' : 'mock')\n if (provider === 'supabase') {\n const url = options.supabase?.url\n const anonKey = options.supabase?.anonKey\n if (!url || !anonKey) {\n throw new Error('plugin-auth provider=\"supabase\" requires supabase.url and supabase.anonKey.')\n }\n return createSupabaseAuthAdapter({\n supabaseUrl: url,\n supabaseAnonKey: anonKey,\n supabaseClient: options.supabase?.client,\n callbackUrl: options.supabase?.callbackUrl ?? absoluteUrl(options.routes?.callback ?? '/auth/callback'),\n resetPasswordUrl:\n options.supabase?.resetPasswordUrl ?? absoluteUrl(options.routes?.resetPassword ?? '/auth/reset-password'),\n })\n }\n\n return createMockAuthAdapter()\n}\n\nexport function createAuthRuntime(options: AuthPluginOptions = {}): ResolvedAuthPlugin {\n return {\n kind: 'auth',\n adapter: resolveAuthAdapter(options),\n requireAuth: options.requireAuth ?? true,\n layout: options.layout ?? 'split',\n logo: options.logo,\n tagline: options.tagline,\n description: options.description,\n oauth: {\n enabled: options.oauth?.enabled ?? false,\n providers: options.oauth?.providers ?? ['google'],\n },\n routes: {\n login: options.routes?.login ?? '/login',\n callback: options.routes?.callback ?? '/auth/callback',\n resetPassword: options.routes?.resetPassword ?? '/auth/reset-password',\n afterSignIn: options.routes?.afterSignIn ?? '/',\n },\n }\n}\n\nexport function createAuthPlugin(options: AuthPluginOptions = {}): ResolvedAuthPlugin {\n return createAuthRuntime(options)\n}\n","import * as React from 'react'\nimport { useAuth } from '@fayz-ai/auth'\nimport type { AuthProvider } from '@fayz-ai/core'\n\nfunction providerLabel(provider: string): string {\n return provider.charAt(0).toUpperCase() + provider.slice(1)\n}\n\nfunction fieldClass() {\n return 'h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n}\n\nfunction buttonClass(variant: 'primary' | 'outline' | 'ghost' = 'primary') {\n if (variant === 'outline') {\n return 'inline-flex h-10 w-full items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-muted disabled:pointer-events-none disabled:opacity-50'\n }\n if (variant === 'ghost') return 'text-sm font-medium text-primary hover:underline'\n return 'inline-flex h-10 w-full items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50'\n}\n\nexport interface OAuthButtonsProps {\n providers?: Exclude<AuthProvider, 'email'>[]\n disabled?: boolean\n onProviderClick?: (provider: AuthProvider) => void | Promise<void>\n}\n\nexport function OAuthButtons({ providers = ['google'], disabled, onProviderClick }: OAuthButtonsProps) {\n const { signInWithOAuth } = useAuth()\n return (\n <div className=\"space-y-2\">\n {providers.map((provider) => (\n <button\n key={provider}\n type=\"button\"\n className={buttonClass('outline')}\n disabled={disabled}\n onClick={() => {\n void (onProviderClick ? onProviderClick(provider) : signInWithOAuth(provider))\n }}\n >\n Continue with {providerLabel(provider)}\n </button>\n ))}\n </div>\n )\n}\n\nexport interface LoginFormProps {\n onSuccess?: () => void\n onForgotPassword?: () => void\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n}\n\nexport function LoginForm({ onSuccess, onForgotPassword, showOAuth, oauthProviders }: LoginFormProps) {\n const { signIn, error, isLoading } = useAuth()\n const [email, setEmail] = React.useState('')\n const [password, setPassword] = React.useState('')\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setBusy(true)\n try {\n await signIn(email, password)\n onSuccess?.()\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Email</span>\n <input className={fieldClass()} type=\"email\" autoComplete=\"username\" required value={email} onChange={(e) => setEmail(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"current-password\" required value={password} onChange={(e) => setPassword(e.target.value)} disabled={disabled} />\n </label>\n {onForgotPassword && (\n <div className=\"-mt-1 flex justify-end\">\n <button type=\"button\" className={buttonClass('ghost')} onClick={onForgotPassword}>\n Forgot password?\n </button>\n </div>\n )}\n {error && <p className=\"text-sm text-destructive\">{error.message}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? 'Signing in...' : 'Sign in'}\n </button>\n {showOAuth && <OAuthButtons providers={oauthProviders} disabled={disabled} />}\n </form>\n )\n}\n\nexport interface SignupFormProps {\n onSuccess?: () => void\n}\n\nexport function SignupForm({ onSuccess }: SignupFormProps) {\n const { signUp, error, isLoading } = useAuth()\n const [fullName, setFullName] = React.useState('')\n const [email, setEmail] = React.useState('')\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [localError, setLocalError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setLocalError(null)\n if (password.length < 8) {\n setLocalError('Password must be at least 8 characters.')\n return\n }\n if (password !== confirmPassword) {\n setLocalError('Passwords do not match.')\n return\n }\n setBusy(true)\n try {\n await signUp(email, password, fullName)\n onSuccess?.()\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Full name</span>\n <input className={fieldClass()} required value={fullName} onChange={(e) => setFullName(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Email</span>\n <input className={fieldClass()} type=\"email\" autoComplete=\"username\" required value={email} onChange={(e) => setEmail(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={password} onChange={(e) => setPassword(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Confirm password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)} disabled={disabled} />\n </label>\n {(localError || error) && <p className=\"text-sm text-destructive\">{localError ?? error?.message}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? 'Creating account...' : 'Create account'}\n </button>\n </form>\n )\n}\n\nexport interface ForgotPasswordFormProps {\n redirectTo?: string\n onSent?: (email: string) => void\n onBackToLogin?: () => void\n}\n\nexport function ForgotPasswordForm({ redirectTo, onSent, onBackToLogin }: ForgotPasswordFormProps) {\n const { resetPassword, error, isLoading } = useAuth()\n const [email, setEmail] = React.useState('')\n const [sent, setSent] = React.useState(false)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setBusy(true)\n try {\n await resetPassword(email, { redirectTo })\n setSent(true)\n onSent?.(email)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Email</span>\n <input className={fieldClass()} type=\"email\" autoComplete=\"username\" required value={email} onChange={(e) => setEmail(e.target.value)} disabled={disabled} />\n </label>\n {error && <p className=\"text-sm text-destructive\">{error.message}</p>}\n {sent && <p className=\"text-sm text-emerald-600\">Password reset instructions sent.</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? 'Sending...' : 'Send reset link'}\n </button>\n {onBackToLogin && (\n <button type=\"button\" className={buttonClass('ghost')} onClick={onBackToLogin}>\n Back to login\n </button>\n )}\n </form>\n )\n}\n\nexport interface ResetPasswordFormProps {\n onSuccess?: () => void\n}\n\nexport function ResetPasswordForm({ onSuccess }: ResetPasswordFormProps) {\n const { updatePassword, error, isLoading } = useAuth()\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [localError, setLocalError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setLocalError(null)\n if (password.length < 8) {\n setLocalError('Password must be at least 8 characters.')\n return\n }\n if (password !== confirmPassword) {\n setLocalError('Passwords do not match.')\n return\n }\n setBusy(true)\n try {\n await updatePassword(password)\n onSuccess?.()\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>New password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={password} onChange={(e) => setPassword(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Confirm password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)} disabled={disabled} />\n </label>\n {(localError || error) && <p className=\"text-sm text-destructive\">{localError ?? error?.message}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? 'Saving...' : 'Update password'}\n </button>\n </form>\n )\n}\n","import * as React from 'react'\nimport { useAuth } from '@fayz-ai/auth'\nimport type { AuthProvider } from '@fayz-ai/core'\nimport { ForgotPasswordForm, LoginForm, ResetPasswordForm, SignupForm } from './forms'\nimport type { AuthFormView, AuthLayout } from './types'\n\nexport interface LoginPageProps {\n appName?: string\n logo?: React.ReactNode\n loginLogo?: React.ReactNode\n layout?: AuthLayout\n tagline?: string\n description?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n resetPasswordUrl?: string\n onSuccess?: () => void\n}\n\nexport function LoginPage({\n appName = 'App',\n logo,\n loginLogo,\n layout = 'split',\n tagline,\n description,\n showOAuth,\n oauthProviders,\n resetPasswordUrl,\n onSuccess,\n}: LoginPageProps) {\n const [view, setView] = React.useState<AuthFormView>('login')\n const brandLogo = loginLogo ?? logo\n const heading = view === 'login' ? 'Welcome back' : view === 'signup' ? 'Create account' : 'Reset password'\n const subtitle =\n view === 'login'\n ? 'Enter your credentials to continue'\n : view === 'signup'\n ? 'Create your account to get started'\n : 'Enter your email and we will send reset instructions'\n const form =\n view === 'login' ? (\n <LoginForm\n onSuccess={onSuccess}\n onForgotPassword={() => setView('recovery')}\n showOAuth={showOAuth}\n oauthProviders={oauthProviders}\n />\n ) : view === 'signup' ? (\n <SignupForm onSuccess={onSuccess} />\n ) : (\n <ForgotPasswordForm redirectTo={resetPasswordUrl} onBackToLogin={() => setView('login')} />\n )\n const switcher =\n view === 'login' ? (\n <p className=\"text-center text-sm text-muted-foreground\">\n Do not have an account?{' '}\n <button type=\"button\" className=\"font-medium text-primary hover:underline\" onClick={() => setView('signup')}>\n Sign up\n </button>\n </p>\n ) : (\n <p className=\"text-center text-sm text-muted-foreground\">\n {view === 'signup' ? 'Already have an account?' : 'Remembered your password?'}{' '}\n <button type=\"button\" className=\"font-medium text-primary hover:underline\" onClick={() => setView('login')}>\n Sign in\n </button>\n </p>\n )\n\n if (layout === 'centered') {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-sidebar p-4\">\n <div className=\"w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl sm:p-10\">\n <div className=\"mb-8 text-center\">\n {brandLogo && <div className=\"mb-4 flex justify-center\">{brandLogo}</div>}\n <h1 className=\"text-2xl font-bold text-foreground\">{heading}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <div className=\"space-y-6\">\n {form}\n {switcher}\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex min-h-screen bg-sidebar\">\n <div className=\"relative hidden w-1/2 overflow-hidden lg:block\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-sidebar-accent/50 via-transparent to-sidebar/80\" />\n <div className=\"relative flex h-full flex-col justify-end p-12\">\n <div className=\"space-y-4\">\n <p className=\"text-sm font-medium text-sidebar-muted\">{appName}</p>\n <h2 className=\"text-3xl font-bold text-sidebar-foreground\">{tagline ?? `Welcome to ${appName}`}</h2>\n {description && <p className=\"max-w-md text-sm leading-relaxed text-sidebar-muted\">{description}</p>}\n </div>\n </div>\n </div>\n <div className=\"flex flex-1 flex-col lg:p-3 lg:pl-3\">\n <div className=\"flex flex-1 flex-col justify-center bg-background px-6 py-12 lg:rounded-[1.25rem] lg:px-16\">\n <div className=\"mx-auto w-full max-w-sm\">\n {brandLogo && <div className=\"mb-8\">{brandLogo}</div>}\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-bold text-foreground\">{heading}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <div className=\"space-y-6\">\n {form}\n {switcher}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport interface AuthGateProps extends LoginPageProps {\n requireAuth?: boolean\n loadingFallback?: React.ReactNode\n children: React.ReactNode\n}\n\nexport function AuthGate({ requireAuth = true, loadingFallback, children, ...loginProps }: AuthGateProps) {\n const { isAuthenticated, isLoading } = useAuth()\n if (!requireAuth || isAuthenticated) return <>{children}</>\n if (isLoading) {\n return (\n <>\n {loadingFallback ?? (\n <div className=\"flex min-h-screen items-center justify-center bg-background\">\n <span className=\"text-sm text-muted-foreground\">Loading...</span>\n </div>\n )}\n </>\n )\n }\n return <LoginPage {...loginProps} />\n}\n\nexport interface AuthCallbackPageProps {\n onSuccess?: () => void\n onError?: (error: Error) => void\n}\n\nexport function AuthCallbackPage({ onSuccess, onError }: AuthCallbackPageProps) {\n const { handleCallback } = useAuth()\n const [error, setError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n handleCallback(typeof window === 'undefined' ? undefined : window.location.href)\n .then(() => {\n if (!cancelled) onSuccess?.()\n })\n .catch((err: unknown) => {\n const errorObject = err instanceof Error ? err : new Error(String(err))\n if (!cancelled) {\n setError(errorObject.message)\n onError?.(errorObject)\n }\n })\n return () => {\n cancelled = true\n }\n }, [handleCallback, onError, onSuccess])\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-background p-6 text-center\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">{error ? 'Authentication failed' : 'Completing sign in...'}</h1>\n {error && <p className=\"mt-2 text-sm text-destructive\">{error}</p>}\n </div>\n </div>\n )\n}\n\nexport interface ResetPasswordPageProps {\n onSuccess?: () => void\n}\n\nexport function ResetPasswordPage({ onSuccess }: ResetPasswordPageProps) {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-background p-4\">\n <div className=\"w-full max-w-md rounded-2xl border bg-card p-8 shadow-xl\">\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-bold text-foreground\">Update password</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">Choose a new password for your account.</p>\n </div>\n <ResetPasswordForm onSuccess={onSuccess} />\n </div>\n </div>\n )\n}\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { createAuthPlugin, createAuthRuntime, resolveAuthAdapter, } from './runtime';
|
|
2
|
+
export { AuthGate, LoginPage, AuthCallbackPage, ResetPasswordPage, } from './pages';
|
|
3
|
+
export type { AuthCallbackPageProps, AuthGateProps, LoginPageProps, ResetPasswordPageProps, } from './pages';
|
|
4
|
+
export { LoginForm, SignupForm, ForgotPasswordForm, ResetPasswordForm, OAuthButtons, } from './forms';
|
|
5
|
+
export type { ForgotPasswordFormProps, LoginFormProps, OAuthButtonsProps, ResetPasswordFormProps, SignupFormProps, } from './forms';
|
|
6
|
+
export { createMockAuthAdapter, createSupabaseAuthAdapter, AuthProvider, useAuth, useAuthStore, } from '@fayz-ai/auth';
|
|
7
|
+
export type { AuthPluginOptions, ResolvedAuthPlugin, AuthRoutesConfig, AuthOAuthConfig, AuthSupabaseConfig, AuthProviderKey, AuthLayout, AuthFormView, } from './types';
|
|
8
|
+
export type { AuthAdapter, AuthSession, AuthUser, AuthProvider as OAuthProvider } from '@fayz-ai/core';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,sBAAsB,GACvB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,YAAY,EACZ,OAAO,EACP,YAAY,GACb,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,YAAY,GACb,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,eAAe,CAAA"}
|