@tern-secure/nextjs 3.4.3 → 4.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/dist/cjs/app-router/client/TernSecureProvider.js +17 -2
- package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/cjs/app-router/client/actions.js +55 -55
- package/dist/cjs/app-router/client/actions.js.map +1 -1
- package/dist/cjs/app-router/route-handler/internal-route.js +22 -3
- package/dist/cjs/app-router/route-handler/internal-route.js.map +1 -1
- package/dist/cjs/boundary/TernSecureClientProvider.js +167 -34
- package/dist/cjs/boundary/TernSecureClientProvider.js.map +1 -1
- package/dist/cjs/boundary/TernSecureCtx.js.map +1 -1
- package/dist/cjs/boundary/hooks/useAuth.js +15 -2
- package/dist/cjs/boundary/hooks/useAuth.js.map +1 -1
- package/dist/cjs/components/sign-in.js +158 -35
- package/dist/cjs/components/sign-in.js.map +1 -1
- package/dist/cjs/components/sign-out-button.js +84 -0
- package/dist/cjs/components/sign-out-button.js.map +1 -0
- package/dist/cjs/components/sign-out.js +39 -9
- package/dist/cjs/components/sign-out.js.map +1 -1
- package/dist/cjs/components/sign-up.js +10 -5
- package/dist/cjs/components/sign-up.js.map +1 -1
- package/dist/cjs/errors.js +233 -5
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types.js +14 -0
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils/construct.js +50 -18
- package/dist/cjs/utils/construct.js.map +1 -1
- package/dist/cjs/utils/redirect.js +57 -0
- package/dist/cjs/utils/redirect.js.map +1 -0
- package/dist/esm/app-router/client/TernSecureProvider.js +17 -2
- package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/esm/app-router/client/actions.js +64 -56
- package/dist/esm/app-router/client/actions.js.map +1 -1
- package/dist/esm/app-router/route-handler/internal-route.js +18 -2
- package/dist/esm/app-router/route-handler/internal-route.js.map +1 -1
- package/dist/esm/boundary/TernSecureClientProvider.js +168 -35
- package/dist/esm/boundary/TernSecureClientProvider.js.map +1 -1
- package/dist/esm/boundary/TernSecureCtx.js.map +1 -1
- package/dist/esm/boundary/hooks/useAuth.js +15 -2
- package/dist/esm/boundary/hooks/useAuth.js.map +1 -1
- package/dist/esm/components/sign-in.js +160 -37
- package/dist/esm/components/sign-in.js.map +1 -1
- package/dist/esm/components/sign-out-button.js +60 -0
- package/dist/esm/components/sign-out-button.js.map +1 -0
- package/dist/esm/components/sign-out.js +30 -10
- package/dist/esm/components/sign-out.js.map +1 -1
- package/dist/esm/components/sign-up.js +10 -5
- package/dist/esm/components/sign-up.js.map +1 -1
- package/dist/esm/errors.js +229 -4
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types.js +6 -0
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/construct.js +46 -17
- package/dist/esm/utils/construct.js.map +1 -1
- package/dist/esm/utils/redirect.js +32 -0
- package/dist/esm/utils/redirect.js.map +1 -0
- package/dist/types/app-router/client/TernSecureProvider.d.ts +14 -3
- package/dist/types/app-router/client/TernSecureProvider.d.ts.map +1 -1
- package/dist/types/app-router/client/actions.d.ts +24 -18
- package/dist/types/app-router/client/actions.d.ts.map +1 -1
- package/dist/types/app-router/route-handler/internal-route.d.ts +8 -1
- package/dist/types/app-router/route-handler/internal-route.d.ts.map +1 -1
- package/dist/types/boundary/TernSecureClientProvider.d.ts +17 -1
- package/dist/types/boundary/TernSecureClientProvider.d.ts.map +1 -1
- package/dist/types/boundary/TernSecureCtx.d.ts +3 -8
- package/dist/types/boundary/TernSecureCtx.d.ts.map +1 -1
- package/dist/types/boundary/hooks/useAuth.d.ts +6 -1
- package/dist/types/boundary/hooks/useAuth.d.ts.map +1 -1
- package/dist/types/components/sign-in.d.ts.map +1 -1
- package/dist/types/components/sign-out-button.d.ts +14 -0
- package/dist/types/components/sign-out-button.d.ts.map +1 -0
- package/dist/types/components/sign-out.d.ts +7 -5
- package/dist/types/components/sign-out.d.ts.map +1 -1
- package/dist/types/components/sign-up.d.ts +4 -0
- package/dist/types/components/sign-up.d.ts.map +1 -1
- package/dist/types/components/ui/alert.d.ts +1 -1
- package/dist/types/components/ui/button.d.ts +1 -1
- package/dist/types/errors.d.ts +37 -2
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +45 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/construct.d.ts +20 -4
- package/dist/types/utils/construct.d.ts.map +1 -1
- package/dist/types/utils/redirect.d.ts +9 -0
- package/dist/types/utils/redirect.d.ts.map +1 -0
- package/package.json +6 -6
- package/dist/cjs/boundary/hooks/useUser.js +0 -44
- package/dist/cjs/boundary/hooks/useUser.js.map +0 -1
- package/dist/esm/boundary/hooks/useUser.js +0 -20
- package/dist/esm/boundary/hooks/useUser.js.map +0 -1
- package/dist/types/boundary/hooks/useUser.d.ts +0 -7
- package/dist/types/boundary/hooks/useUser.d.ts.map +0 -1
|
@@ -48,6 +48,7 @@ var import_separator = require("./ui/separator");
|
|
|
48
48
|
var import_actions = require("../app-router/client/actions");
|
|
49
49
|
var import_useSignUp = require("../boundary/hooks/useSignUp");
|
|
50
50
|
var import_internal_route = require("../app-router/route-handler/internal-route");
|
|
51
|
+
var import_errors = require("../errors");
|
|
51
52
|
function SignUp({
|
|
52
53
|
redirectUrl,
|
|
53
54
|
onError,
|
|
@@ -55,10 +56,10 @@ function SignUp({
|
|
|
55
56
|
}) {
|
|
56
57
|
const pathname = (0, import_navigation.usePathname)();
|
|
57
58
|
const InternalComponent = (0, import_internal_route.handleInternalRoute)(pathname);
|
|
59
|
+
const { setEmail: setContextEmail } = (0, import_useSignUp.useSignUp)();
|
|
58
60
|
if (InternalComponent) {
|
|
59
61
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InternalComponent, {});
|
|
60
62
|
}
|
|
61
|
-
const { setEmail: setContextEmail } = (0, import_useSignUp.useSignUp)();
|
|
62
63
|
const [formData, setFormData] = (0, import_react.useState)({
|
|
63
64
|
email: "",
|
|
64
65
|
password: "",
|
|
@@ -67,7 +68,7 @@ function SignUp({
|
|
|
67
68
|
const [showPassword, setShowPassword] = (0, import_react.useState)(false);
|
|
68
69
|
const [showConfirmPassword, setShowConfirmPassword] = (0, import_react.useState)(false);
|
|
69
70
|
const [isLoading, setLoading] = (0, import_react.useState)(false);
|
|
70
|
-
const [error, setError] = (0, import_react.useState)(
|
|
71
|
+
const [error, setError] = (0, import_react.useState)(null);
|
|
71
72
|
const [passwordFocused, setPasswordFocused] = (0, import_react.useState)(false);
|
|
72
73
|
const router = (0, import_navigation.useRouter)();
|
|
73
74
|
const passwordRequirements = [
|
|
@@ -102,6 +103,7 @@ function SignUp({
|
|
|
102
103
|
...prev,
|
|
103
104
|
[name]: value
|
|
104
105
|
}));
|
|
106
|
+
setError(null);
|
|
105
107
|
};
|
|
106
108
|
const isFormValid = () => {
|
|
107
109
|
return formData.email.length > 0 && passwordRequirements.every((req) => req.satisfied);
|
|
@@ -110,15 +112,18 @@ function SignUp({
|
|
|
110
112
|
e.preventDefault();
|
|
111
113
|
if (!isFormValid()) return;
|
|
112
114
|
setLoading(true);
|
|
115
|
+
setError(null);
|
|
113
116
|
try {
|
|
114
117
|
const result = await (0, import_actions.createUser)(formData.email, formData.password);
|
|
115
118
|
if (result.success) {
|
|
116
119
|
setContextEmail(formData.email);
|
|
117
120
|
onSuccess == null ? void 0 : onSuccess();
|
|
118
121
|
router.push(`sign-up/verify`);
|
|
122
|
+
} else {
|
|
123
|
+
setError(result);
|
|
119
124
|
}
|
|
120
125
|
} catch (error2) {
|
|
121
|
-
const errorMessage = error2
|
|
126
|
+
const errorMessage = error2;
|
|
122
127
|
setError(errorMessage);
|
|
123
128
|
onError == null ? void 0 : onError(error2 instanceof Error ? error2 : new Error("Failed to create account"));
|
|
124
129
|
} finally {
|
|
@@ -136,7 +141,7 @@ function SignUp({
|
|
|
136
141
|
throw new Error(result.error);
|
|
137
142
|
}
|
|
138
143
|
} catch (err) {
|
|
139
|
-
const errorMessage = err
|
|
144
|
+
const errorMessage = err;
|
|
140
145
|
setError(errorMessage);
|
|
141
146
|
const newUrl = new URL(window.location.href);
|
|
142
147
|
newUrl.searchParams.delete("signInRedirect");
|
|
@@ -152,7 +157,7 @@ function SignUp({
|
|
|
152
157
|
] }),
|
|
153
158
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("form", { onSubmit: handleSubmit, children: [
|
|
154
159
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_card.CardContent, { className: "space-y-4", children: [
|
|
155
|
-
error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_alert.Alert, { variant: "
|
|
160
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_alert.Alert, { variant: (0, import_errors.getErrorAlertVariant)(error), className: "animate-in fade-in-50", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_alert.AlertDescription, { children: error.message }) }),
|
|
156
161
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
|
|
157
162
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_label.Label, { htmlFor: "email", children: "Email" }),
|
|
158
163
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/sign-up.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState } from \"react\"\nimport { useRouter, usePathname } from 'next/navigation'\nimport Link from \"next/link\"\nimport { Eye, EyeOff, Check, X, Loader2 } from \"lucide-react\"\nimport { Button } from \"./ui/button\"\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription, CardFooter } from \"./ui/card\"\nimport { Input } from \"./ui/input\"\nimport { Label } from \"./ui/label\"\nimport { Alert, AlertDescription } from \"./ui/alert\"\nimport { cn } from \"../lib/utils\"\nimport { AuthBackground } from \"./background\"\nimport { Separator } from \"./ui/separator\"\nimport { createUser, signInWithRedirectGoogle, signInWithMicrosoft } from '../app-router/client/actions'\nimport { useSignUp } from '../boundary/hooks/useSignUp'\nimport { handleInternalRoute } from '../app-router/route-handler/internal-route'\n\nexport interface SignUpProps {\n redirectUrl?: string\n onError?: (error: Error) => void\n onSuccess?: () => void\n}\n\ninterface PasswordRequirement {\n text: string\n satisfied: boolean\n}\n\nexport function SignUp({\n redirectUrl, \n onError,\n onSuccess,\n }: SignUpProps) {\n const pathname = usePathname()\n const InternalComponent = handleInternalRoute(pathname)\n\n if (InternalComponent) {\n return <InternalComponent />\n }\n\n const { setEmail: setContextEmail } = useSignUp()\n const [formData, setFormData] = useState({\n email: \"\",\n password: \"\",\n confirmPassword: \"\",\n })\n const [showPassword, setShowPassword] = useState(false)\n const [showConfirmPassword, setShowConfirmPassword] = useState(false)\n const [isLoading, setLoading] = useState(false)\n const [error, setError] = useState(\"\")\n const [passwordFocused, setPasswordFocused] = useState(false)\n const router = useRouter()\n\n const passwordRequirements: PasswordRequirement[] = [\n {\n text: \"At least 8 characters long\",\n satisfied: formData.password.length >= 8,\n },\n {\n text: \"Contains at least one uppercase letter\",\n satisfied: /[A-Z]/.test(formData.password),\n },\n {\n text: \"Contains at least one lowercase letter\",\n satisfied: /[a-z]/.test(formData.password),\n },\n {\n text: \"Contains at least one number\",\n satisfied: /\\d/.test(formData.password),\n },\n {\n text: \"Contains at least one special character\",\n satisfied: /[!@#$%^&*(),.?\":{}|<>]/.test(formData.password),\n },\n {\n text: \"Passwords match\",\n satisfied: formData.password === formData.confirmPassword && formData.password !== \"\",\n },\n ]\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value } = e.target\n setFormData((prev) => ({\n ...prev,\n [name]: value,\n }))\n }\n\n const isFormValid = () => {\n return formData.email.length > 0 && passwordRequirements.every((req) => req.satisfied)\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!isFormValid()) return\n\n setLoading(true)\n try {\n const result = await createUser(formData.email, formData.password)\n if(result.success) {\n setContextEmail(formData.email)\n\n onSuccess?.()\n\n router.push(`sign-up/verify`)\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to sign in'\n setError(errorMessage)\n onError?.(error instanceof Error ? error : new Error('Failed to create account'))\n } finally {\n setLoading(false)\n }\n }\n\n\n const handleSocialSignIn = async (provider: 'google' | 'microsoft') => {\n setLoading(true)\n try {\n const currentUrl = new URL(window.location.href)\n currentUrl.searchParams.set('signInRedirect', 'true')\n window.history.replaceState({}, '', currentUrl.toString())\n\n const result = provider === 'google' ? await signInWithRedirectGoogle() : await signInWithMicrosoft()\n if (!result.success) {\n throw new Error(result.error)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${provider}`\n setError(errorMessage)\n const newUrl = new URL(window.location.href)\n newUrl.searchParams.delete('signInRedirect')\n window.history.replaceState({}, '', newUrl.toString())\n }\n }\n\n return (\n <div className=\"relative flex min-h-screen items-center justify-center\">\n <AuthBackground />\n <Card className=\"w-full max-w-md mx-auto mt-8\">\n <CardHeader className=\"space-y-1 text-center\">\n <CardTitle className=\"text-2xl font-bold\">Create an account</CardTitle>\n <CardDescription>Enter your information below to create your account</CardDescription>\n </CardHeader>\n <form onSubmit={handleSubmit}>\n <CardContent className=\"space-y-4\">\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n placeholder=\"name@example.com\"\n value={formData.email}\n onChange={handleInputChange}\n required\n disabled={isLoading}\n />\n </div>\n\n <div className=\"space-y-2 relative flex-1\">\n <Label htmlFor=\"password\">Password</Label>\n <div className=\"relative\">\n <Input\n id=\"password\"\n name=\"password\"\n type={showPassword ? \"text\" : \"password\"}\n value={formData.password}\n onChange={handleInputChange}\n onFocus={() => setPasswordFocused(true)}\n onBlur={() => setPasswordFocused(false)}\n required\n disabled={isLoading}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-8 w-8 hover:bg-transparent\"\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" /> : <Eye className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />}\n <span className=\"sr-only\">{showPassword ? \"Hide password\" : \"Show password\"}</span>\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2 relative flex-1\">\n <Label htmlFor=\"confirmPassword\">Confirm Password</Label>\n <div className=\"relative\">\n <Input\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n type={showConfirmPassword ? \"text\" : \"password\"}\n value={formData.confirmPassword}\n onChange={handleInputChange}\n required\n disabled={isLoading}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-8 w-8 hover:bg-transparent\"\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n >\n {showConfirmPassword ? <EyeOff className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" /> : <Eye className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />}\n <span className=\"sr-only\">{showConfirmPassword ? \"Hide password\" : \"Show password\"}</span>\n </Button>\n </div>\n </div>\n\n {/* Password Requirements */}\n <div\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n \"p-4 transition-all duration-200\",\n passwordFocused ? \"opacity-100\" : \"opacity-70\",\n )}\n >\n <div className=\"grid gap-2 text-sm\">\n {passwordRequirements.map((requirement, index) => (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-2\",\n requirement.satisfied ? \"text-green-500\" : \"text-muted-foreground\",\n )}\n >\n {requirement.satisfied ? (\n <Check className=\"h-4 w-4 shrink-0\" />\n ) : (\n <X className=\"h-4 w-4 shrink-0\" />\n )}\n <span className=\"text-sm\">{requirement.text}</span>\n </div>\n ))}\n </div>\n </div>\n </CardContent>\n\n <CardFooter className=\"flex flex-col space-y-4\">\n <Button type=\"submit\" className=\"w-full\" disabled={!isFormValid() || isLoading}>\n {isLoading ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Creating account...\n </>\n ) : (\n \"Create account\"\n )}\n </Button>\n <p className=\"text-sm text-muted-foreground text-center\">\n Already have an account?{\" \"}\n <Link href=\"/sign-in\" className=\"text-primary underline-offset-4 transition-colors hover:underline\">\n Sign in\n </Link> or sign up with email\n </p>\n </CardFooter>\n </form>\n <Separator className=\"my-4 px-6\" />\n <div className=\"px-6 pb-4\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <Separator className=\"w-full\" />\n </div>\n <div className=\"relative flex justify-center text-xs uppercase\">\n <span className=\"bg-background px-2 text-muted-foreground\">\n Or continue with\n </span>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mt-4\">\n <Button \n variant=\"outline\" \n disabled={isLoading}\n onClick={() => handleSocialSignIn('google')} \n className=\"flex items-center justify-center\"\n >\n <svg className=\"w-5 h-5 mr-2\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\"/>\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/>\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n </svg>\n Google\n </Button>\n <Button \n variant=\"outline\" \n disabled={isLoading}\n onClick={() => handleSocialSignIn('microsoft')} \n className=\"flex items-center justify-center\"\n >\n <svg className=\"w-5 h-5 mr-2\" viewBox=\"0 0 23 23\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#f3f3f3\" d=\"M0 0h23v23H0z\"/>\n <path fill=\"#f35325\" d=\"M1 1h10v10H1z\"/>\n <path fill=\"#81bc06\" d=\"M12 1h10v10H12z\"/>\n <path fill=\"#05a6f0\" d=\"M1 12h10v10H1z\"/>\n <path fill=\"#ffba08\" d=\"M12 12h10v10H12z\"/>\n </svg>\n Microsoft\n </Button>\n </div>\n </div>\n </Card>\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCW;AApCX,mBAAyB;AACzB,wBAAuC;AACvC,kBAAiB;AACjB,0BAA+C;AAC/C,oBAAuB;AACvB,kBAAsF;AACtF,mBAAsB;AACtB,mBAAsB;AACtB,mBAAwC;AACxC,mBAAmB;AACnB,wBAA+B;AAC/B,uBAA0B;AAC1B,qBAA0E;AAC1E,uBAA0B;AAC1B,4BAAoC;AAa7B,SAAS,OAAO;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACH,GAAgB;AACf,QAAM,eAAW,+BAAY;AAC7B,QAAM,wBAAoB,2CAAoB,QAAQ;AAEtD,MAAI,mBAAmB;AACrB,WAAO,4CAAC,qBAAkB;AAAA,EAC5B;AAEA,QAAM,EAAE,UAAU,gBAAgB,QAAI,4BAAU;AAChD,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS;AAAA,IACvC,OAAO;AAAA,IACP,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAS,KAAK;AACtD,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,uBAAS,KAAK;AACpE,QAAM,CAAC,WAAW,UAAU,QAAI,uBAAS,KAAK;AAC9C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,EAAE;AACrC,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,uBAAS,KAAK;AAC5D,QAAM,aAAS,6BAAU;AAEzB,QAAM,uBAA8C;AAAA,IAClD;AAAA,MACE,MAAM;AAAA,MACN,WAAW,SAAS,SAAS,UAAU;AAAA,IACzC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,QAAQ,KAAK,SAAS,QAAQ;AAAA,IAC3C;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,QAAQ,KAAK,SAAS,QAAQ;AAAA,IAC3C;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,KAAK,KAAK,SAAS,QAAQ;AAAA,IACxC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,yBAAyB,KAAK,SAAS,QAAQ;AAAA,IAC5D;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,SAAS,aAAa,SAAS,mBAAmB,SAAS,aAAa;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,MAA2C;AACpE,UAAM,EAAE,MAAM,MAAM,IAAI,EAAE;AAC1B,gBAAY,CAAC,UAAU;AAAA,MACrB,GAAG;AAAA,MACH,CAAC,IAAI,GAAG;AAAA,IACV,EAAE;AAAA,EACJ;AAEA,QAAM,cAAc,MAAM;AACxB,WAAO,SAAS,MAAM,SAAS,KAAK,qBAAqB,MAAM,CAAC,QAAQ,IAAI,SAAS;AAAA,EACvF;AAEA,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,QAAI,CAAC,YAAY,EAAG;AAEpB,eAAW,IAAI;AACf,QAAI;AACH,YAAM,SAAS,UAAM,2BAAW,SAAS,OAAO,SAAS,QAAQ;AACjE,UAAG,OAAO,SAAS;AAChB,wBAAgB,SAAS,KAAK;AAE9B;AAEA,eAAO,KAAK,gBAAgB;AAAA,MAC/B;AAAA,IACD,SAASA,QAAO;AACd,YAAM,eAAeA,kBAAiB,QAAQA,OAAM,UAAU;AAC9D,eAAS,YAAY;AACrB,yCAAUA,kBAAiB,QAAQA,SAAQ,IAAI,MAAM,0BAA0B;AAAA,IACjF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,qBAAqB,OAAO,aAAqC;AACrE,eAAW,IAAI;AACf,QAAI;AACF,YAAM,aAAa,IAAI,IAAI,OAAO,SAAS,IAAI;AAC/C,iBAAW,aAAa,IAAI,kBAAkB,MAAM;AACpD,aAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,WAAW,SAAS,CAAC;AAEzD,YAAM,SAAS,aAAa,WAAW,UAAM,yCAAyB,IAAI,UAAM,oCAAoB;AACpG,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI,MAAM,OAAO,KAAK;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,0BAA0B,QAAQ;AAC5F,eAAS,YAAY;AACrB,YAAM,SAAS,IAAI,IAAI,OAAO,SAAS,IAAI;AAC3C,aAAO,aAAa,OAAO,gBAAgB;AAC3C,aAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC;AAAA,IACvD;AAAA,EACF;AAEA,SACE,6CAAC,SAAI,WAAU,0DACb;AAAA,gDAAC,oCAAe;AAAA,IAChB,6CAAC,oBAAK,WAAU,gCACd;AAAA,mDAAC,0BAAW,WAAU,yBACpB;AAAA,oDAAC,yBAAU,WAAU,sBAAqB,+BAAiB;AAAA,QAC3D,4CAAC,+BAAgB,iEAAmD;AAAA,SACtE;AAAA,MACA,6CAAC,UAAK,UAAU,cACd;AAAA,qDAAC,2BAAY,WAAU,aACpB;AAAA,mBACC,4CAAC,sBAAM,SAAQ,eACb,sDAAC,iCAAkB,iBAAM,GAC3B;AAAA,UAGF,6CAAC,SAAI,WAAU,aACb;AAAA,wDAAC,sBAAM,SAAQ,SAAQ,mBAAK;AAAA,YAC5B;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,aAAY;AAAA,gBACZ,OAAO,SAAS;AAAA,gBAChB,UAAU;AAAA,gBACV,UAAQ;AAAA,gBACR,UAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UAEA,6CAAC,SAAI,WAAU,6BACb;AAAA,wDAAC,sBAAM,SAAQ,YAAW,sBAAQ;AAAA,YAClC,6CAAC,SAAI,WAAU,YACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,MAAM,eAAe,SAAS;AAAA,kBAC9B,OAAO,SAAS;AAAA,kBAChB,UAAU;AAAA,kBACV,SAAS,MAAM,mBAAmB,IAAI;AAAA,kBACtC,QAAQ,MAAM,mBAAmB,KAAK;AAAA,kBACtC,UAAQ;AAAA,kBACR,UAAU;AAAA;AAAA,cACZ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,kBAE3C;AAAA,mCAAe,4CAAC,8BAAO,WAAU,uDAAsD,IAAK,4CAAC,2BAAI,WAAU,uDAAsD;AAAA,oBAClK,4CAAC,UAAK,WAAU,WAAW,yBAAe,kBAAkB,iBAAgB;AAAA;AAAA;AAAA,cAC9E;AAAA,eACF;AAAA,aACF;AAAA,UAEA,6CAAC,SAAI,WAAU,6BACb;AAAA,wDAAC,sBAAM,SAAQ,mBAAkB,8BAAgB;AAAA,YACjD,6CAAC,SAAI,WAAU,YACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,MAAM,sBAAsB,SAAS;AAAA,kBACrC,OAAO,SAAS;AAAA,kBAChB,UAAU;AAAA,kBACV,UAAQ;AAAA,kBACR,UAAU;AAAA;AAAA,cACZ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,uBAAuB,CAAC,mBAAmB;AAAA,kBAEzD;AAAA,0CAAsB,4CAAC,8BAAO,WAAU,uDAAsD,IAAK,4CAAC,2BAAI,WAAU,uDAAsD;AAAA,oBACzK,4CAAC,UAAK,WAAU,WAAW,gCAAsB,kBAAkB,iBAAgB;AAAA;AAAA;AAAA,cACrF;AAAA,eACF;AAAA,aACF;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,kBAAkB,gBAAgB;AAAA,cACpC;AAAA,cAEA,sDAAC,SAAI,WAAU,sBACZ,+BAAqB,IAAI,CAAC,aAAa,UACtC;AAAA,gBAAC;AAAA;AAAA,kBAEC,eAAW;AAAA,oBACT;AAAA,oBACA,YAAY,YAAY,mBAAmB;AAAA,kBAC7C;AAAA,kBAEC;AAAA,gCAAY,YACX,4CAAC,6BAAM,WAAU,oBAAmB,IAEpC,4CAAC,yBAAE,WAAU,oBAAmB;AAAA,oBAElC,4CAAC,UAAK,WAAU,WAAW,sBAAY,MAAK;AAAA;AAAA;AAAA,gBAXvC;AAAA,cAYP,CACD,GACH;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAEA,6CAAC,0BAAW,WAAU,2BACpB;AAAA,sDAAC,wBAAO,MAAK,UAAS,WAAU,UAAS,UAAU,CAAC,YAAY,KAAK,WAClE,sBACC,4EACE;AAAA,wDAAC,+BAAQ,WAAU,6BAA4B;AAAA,YAAE;AAAA,aAEnD,IAEA,kBAEJ;AAAA,UACA,6CAAC,OAAE,WAAU,6CAA4C;AAAA;AAAA,YAC9B;AAAA,YACzB,4CAAC,YAAAC,SAAA,EAAK,MAAK,YAAW,WAAU,qEAAoE,qBAEpG;AAAA,YAAO;AAAA,aACT;AAAA,WACF;AAAA,SACA;AAAA,MACA,4CAAC,8BAAU,WAAU,aAAY;AAAA,MACjC,6CAAC,SAAI,WAAU,aACb;AAAA,qDAAC,SAAI,WAAU,YACb;AAAA,sDAAC,SAAI,WAAU,sCACb,sDAAC,8BAAU,WAAU,UAAS,GAChC;AAAA,UACA,4CAAC,SAAI,WAAU,kDACb,sDAAC,UAAK,WAAU,4CAA2C,8BAE3D,GACF;AAAA,WACF;AAAA,QACA,6CAAC,SAAI,WAAU,+BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,UAAU;AAAA,cACV,SAAS,MAAM,mBAAmB,QAAQ;AAAA,cAC1C,WAAU;AAAA,cAEV;AAAA,6DAAC,SAAI,WAAU,gBAAe,SAAQ,aAAY,OAAM,8BACtD;AAAA,8DAAC,UAAK,GAAE,2HAA0H,MAAK,WAAS;AAAA,kBAChJ,4CAAC,UAAK,GAAE,yIAAwI,MAAK,WAAS;AAAA,kBAC9J,4CAAC,UAAK,GAAE,iIAAgI,MAAK,WAAS;AAAA,kBACtJ,4CAAC,UAAK,GAAE,uIAAsI,MAAK,WAAS;AAAA,mBAC9J;AAAA,gBAAM;AAAA;AAAA;AAAA,UAER;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,UAAU;AAAA,cACV,SAAS,MAAM,mBAAmB,WAAW;AAAA,cAC7C,WAAU;AAAA,cAEV;AAAA,6DAAC,SAAI,WAAU,gBAAe,SAAQ,aAAY,OAAM,8BACtD;AAAA,8DAAC,UAAK,MAAK,WAAU,GAAE,iBAAe;AAAA,kBACtC,4CAAC,UAAK,MAAK,WAAU,GAAE,iBAAe;AAAA,kBACtC,4CAAC,UAAK,MAAK,WAAU,GAAE,mBAAiB;AAAA,kBACxC,4CAAC,UAAK,MAAK,WAAU,GAAE,kBAAgB;AAAA,kBACvC,4CAAC,UAAK,MAAK,WAAU,GAAE,oBAAkB;AAAA,mBAC3C;AAAA,gBAAM;AAAA;AAAA;AAAA,UAER;AAAA,WACF;AAAA,SACF;AAAA,OACJ;AAAA,KACF;AAEJ;","names":["error","Link"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/sign-up.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState } from \"react\"\nimport { useRouter, usePathname } from 'next/navigation'\nimport Link from \"next/link\"\nimport { Eye, EyeOff, Check, X, Loader2 } from \"lucide-react\"\nimport { Button } from \"./ui/button\"\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription, CardFooter } from \"./ui/card\"\nimport { Input } from \"./ui/input\"\nimport { Label } from \"./ui/label\"\nimport { Alert, AlertDescription } from \"./ui/alert\"\nimport { cn } from \"../lib/utils\"\nimport { AuthBackground } from \"./background\"\nimport { Separator } from \"./ui/separator\"\nimport { createUser, signInWithRedirectGoogle, signInWithMicrosoft } from '../app-router/client/actions'\nimport { useSignUp } from '../boundary/hooks/useSignUp'\nimport { handleInternalRoute } from '../app-router/route-handler/internal-route'\nimport { SignInResponse } from \"../types\"\nimport { getErrorAlertVariant, ErrorCode} from \"../errors\"\n\nexport interface SignUpProps {\n redirectUrl?: string\n onError?: (error: Error) => void\n onSuccess?: () => void\n}\n\nexport interface PasswordRequirement {\n text: string\n satisfied: boolean\n}\n\n\nexport function SignUp({\n redirectUrl, \n onError,\n onSuccess,\n }: SignUpProps) {\n const pathname = usePathname()\n const InternalComponent = handleInternalRoute(pathname)\n const { setEmail: setContextEmail } = useSignUp()\n\n if (InternalComponent) {\n return <InternalComponent />\n }\n\n \n const [formData, setFormData] = useState({\n email: \"\",\n password: \"\",\n confirmPassword: \"\",\n })\n const [showPassword, setShowPassword] = useState(false)\n const [showConfirmPassword, setShowConfirmPassword] = useState(false)\n const [isLoading, setLoading] = useState(false)\n const [error, setError] = useState<SignInResponse | null>(null)\n const [passwordFocused, setPasswordFocused] = useState(false)\n const router = useRouter()\n\n const passwordRequirements: PasswordRequirement[] = [\n {\n text: \"At least 8 characters long\",\n satisfied: formData.password.length >= 8,\n },\n {\n text: \"Contains at least one uppercase letter\",\n satisfied: /[A-Z]/.test(formData.password),\n },\n {\n text: \"Contains at least one lowercase letter\",\n satisfied: /[a-z]/.test(formData.password),\n },\n {\n text: \"Contains at least one number\",\n satisfied: /\\d/.test(formData.password),\n },\n {\n text: \"Contains at least one special character\",\n satisfied: /[!@#$%^&*(),.?\":{}|<>]/.test(formData.password),\n },\n {\n text: \"Passwords match\",\n satisfied: formData.password === formData.confirmPassword && formData.password !== \"\",\n },\n ]\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value } = e.target\n setFormData((prev) => ({\n ...prev,\n [name]: value,\n }))\n setError(null)\n }\n\n const isFormValid = () => {\n return formData.email.length > 0 && passwordRequirements.every((req) => req.satisfied)\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!isFormValid()) return\n\n setLoading(true)\n setError(null)\n try {\n const result = await createUser(formData.email, formData.password)\n if(result.success) {\n setContextEmail(formData.email)\n\n onSuccess?.()\n\n router.push(`sign-up/verify`)\n } else {\n setError(result)\n }\n } catch (error) {\n const errorMessage = error as SignInResponse\n setError(errorMessage)\n onError?.(error instanceof Error ? error : new Error('Failed to create account'))\n } finally {\n setLoading(false)\n }\n }\n\n\n const handleSocialSignIn = async (provider: 'google' | 'microsoft') => {\n setLoading(true)\n try {\n const currentUrl = new URL(window.location.href)\n currentUrl.searchParams.set('signInRedirect', 'true')\n window.history.replaceState({}, '', currentUrl.toString())\n\n const result = provider === 'google' ? await signInWithRedirectGoogle() : await signInWithMicrosoft()\n if (!result.success) {\n throw new Error(result.error)\n }\n } catch (err) {\n const errorMessage = err as SignInResponse\n setError(errorMessage)\n const newUrl = new URL(window.location.href)\n newUrl.searchParams.delete('signInRedirect')\n window.history.replaceState({}, '', newUrl.toString())\n }\n }\n\n return (\n <div className=\"relative flex min-h-screen items-center justify-center\">\n <AuthBackground />\n <Card className=\"w-full max-w-md mx-auto mt-8\">\n <CardHeader className=\"space-y-1 text-center\">\n <CardTitle className=\"text-2xl font-bold\">Create an account</CardTitle>\n <CardDescription>Enter your information below to create your account</CardDescription>\n </CardHeader>\n <form onSubmit={handleSubmit}>\n <CardContent className=\"space-y-4\">\n {error && (\n <Alert variant={getErrorAlertVariant(error)} className=\"animate-in fade-in-50\">\n <AlertDescription>{error.message}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n placeholder=\"name@example.com\"\n value={formData.email}\n onChange={handleInputChange}\n required\n disabled={isLoading}\n />\n </div>\n\n <div className=\"space-y-2 relative flex-1\">\n <Label htmlFor=\"password\">Password</Label>\n <div className=\"relative\">\n <Input\n id=\"password\"\n name=\"password\"\n type={showPassword ? \"text\" : \"password\"}\n value={formData.password}\n onChange={handleInputChange}\n onFocus={() => setPasswordFocused(true)}\n onBlur={() => setPasswordFocused(false)}\n required\n disabled={isLoading}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-8 w-8 hover:bg-transparent\"\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" /> : <Eye className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />}\n <span className=\"sr-only\">{showPassword ? \"Hide password\" : \"Show password\"}</span>\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2 relative flex-1\">\n <Label htmlFor=\"confirmPassword\">Confirm Password</Label>\n <div className=\"relative\">\n <Input\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n type={showConfirmPassword ? \"text\" : \"password\"}\n value={formData.confirmPassword}\n onChange={handleInputChange}\n required\n disabled={isLoading}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-8 w-8 hover:bg-transparent\"\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n >\n {showConfirmPassword ? <EyeOff className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" /> : <Eye className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />}\n <span className=\"sr-only\">{showConfirmPassword ? \"Hide password\" : \"Show password\"}</span>\n </Button>\n </div>\n </div>\n\n {/* Password Requirements */}\n <div\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n \"p-4 transition-all duration-200\",\n passwordFocused ? \"opacity-100\" : \"opacity-70\",\n )}\n >\n <div className=\"grid gap-2 text-sm\">\n {passwordRequirements.map((requirement, index) => (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-2\",\n requirement.satisfied ? \"text-green-500\" : \"text-muted-foreground\",\n )}\n >\n {requirement.satisfied ? (\n <Check className=\"h-4 w-4 shrink-0\" />\n ) : (\n <X className=\"h-4 w-4 shrink-0\" />\n )}\n <span className=\"text-sm\">{requirement.text}</span>\n </div>\n ))}\n </div>\n </div>\n </CardContent>\n\n <CardFooter className=\"flex flex-col space-y-4\">\n <Button type=\"submit\" className=\"w-full\" disabled={!isFormValid() || isLoading}>\n {isLoading ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Creating account...\n </>\n ) : (\n \"Create account\"\n )}\n </Button>\n <p className=\"text-sm text-muted-foreground text-center\">\n Already have an account?{\" \"}\n <Link href=\"/sign-in\" className=\"text-primary underline-offset-4 transition-colors hover:underline\">\n Sign in\n </Link> or sign up with email\n </p>\n </CardFooter>\n </form>\n <Separator className=\"my-4 px-6\" />\n <div className=\"px-6 pb-4\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <Separator className=\"w-full\" />\n </div>\n <div className=\"relative flex justify-center text-xs uppercase\">\n <span className=\"bg-background px-2 text-muted-foreground\">\n Or continue with\n </span>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mt-4\">\n <Button \n variant=\"outline\" \n disabled={isLoading}\n onClick={() => handleSocialSignIn('google')} \n className=\"flex items-center justify-center\"\n >\n <svg className=\"w-5 h-5 mr-2\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\"/>\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/>\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n </svg>\n Google\n </Button>\n <Button \n variant=\"outline\" \n disabled={isLoading}\n onClick={() => handleSocialSignIn('microsoft')} \n className=\"flex items-center justify-center\"\n >\n <svg className=\"w-5 h-5 mr-2\" viewBox=\"0 0 23 23\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#f3f3f3\" d=\"M0 0h23v23H0z\"/>\n <path fill=\"#f35325\" d=\"M1 1h10v10H1z\"/>\n <path fill=\"#81bc06\" d=\"M12 1h10v10H12z\"/>\n <path fill=\"#05a6f0\" d=\"M1 12h10v10H1z\"/>\n <path fill=\"#ffba08\" d=\"M12 12h10v10H12z\"/>\n </svg>\n Microsoft\n </Button>\n </div>\n </div>\n </Card>\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CW;AAxCX,mBAAyB;AACzB,wBAAuC;AACvC,kBAAiB;AACjB,0BAA+C;AAC/C,oBAAuB;AACvB,kBAAsF;AACtF,mBAAsB;AACtB,mBAAsB;AACtB,mBAAwC;AACxC,mBAAmB;AACnB,wBAA+B;AAC/B,uBAA0B;AAC1B,qBAA0E;AAC1E,uBAA0B;AAC1B,4BAAoC;AAEpC,oBAA+C;AAcxC,SAAS,OAAO;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACH,GAAgB;AACf,QAAM,eAAW,+BAAY;AAC7B,QAAM,wBAAoB,2CAAoB,QAAQ;AACtD,QAAM,EAAE,UAAU,gBAAgB,QAAI,4BAAU;AAEhD,MAAI,mBAAmB;AACrB,WAAO,4CAAC,qBAAkB;AAAA,EAC5B;AAGA,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS;AAAA,IACvC,OAAO;AAAA,IACP,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAS,KAAK;AACtD,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,uBAAS,KAAK;AACpE,QAAM,CAAC,WAAW,UAAU,QAAI,uBAAS,KAAK;AAC9C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAgC,IAAI;AAC9D,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,uBAAS,KAAK;AAC5D,QAAM,aAAS,6BAAU;AAEzB,QAAM,uBAA8C;AAAA,IAClD;AAAA,MACE,MAAM;AAAA,MACN,WAAW,SAAS,SAAS,UAAU;AAAA,IACzC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,QAAQ,KAAK,SAAS,QAAQ;AAAA,IAC3C;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,QAAQ,KAAK,SAAS,QAAQ;AAAA,IAC3C;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,KAAK,KAAK,SAAS,QAAQ;AAAA,IACxC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,yBAAyB,KAAK,SAAS,QAAQ;AAAA,IAC5D;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,SAAS,aAAa,SAAS,mBAAmB,SAAS,aAAa;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,MAA2C;AACpE,UAAM,EAAE,MAAM,MAAM,IAAI,EAAE;AAC1B,gBAAY,CAAC,UAAU;AAAA,MACrB,GAAG;AAAA,MACH,CAAC,IAAI,GAAG;AAAA,IACV,EAAE;AACF,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,cAAc,MAAM;AACxB,WAAO,SAAS,MAAM,SAAS,KAAK,qBAAqB,MAAM,CAAC,QAAQ,IAAI,SAAS;AAAA,EACvF;AAEA,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,QAAI,CAAC,YAAY,EAAG;AAEpB,eAAW,IAAI;AACf,aAAS,IAAI;AACb,QAAI;AACH,YAAM,SAAS,UAAM,2BAAW,SAAS,OAAO,SAAS,QAAQ;AACjE,UAAG,OAAO,SAAS;AAChB,wBAAgB,SAAS,KAAK;AAE9B;AAEA,eAAO,KAAK,gBAAgB;AAAA,MAC/B,OAAO;AACN,iBAAS,MAAM;AAAA,MAChB;AAAA,IACD,SAASA,QAAO;AACd,YAAM,eAAeA;AACrB,eAAS,YAAY;AACrB,yCAAUA,kBAAiB,QAAQA,SAAQ,IAAI,MAAM,0BAA0B;AAAA,IACjF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,qBAAqB,OAAO,aAAqC;AACrE,eAAW,IAAI;AACf,QAAI;AACF,YAAM,aAAa,IAAI,IAAI,OAAO,SAAS,IAAI;AAC/C,iBAAW,aAAa,IAAI,kBAAkB,MAAM;AACpD,aAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,WAAW,SAAS,CAAC;AAEzD,YAAM,SAAS,aAAa,WAAW,UAAM,yCAAyB,IAAI,UAAM,oCAAoB;AACpG,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI,MAAM,OAAO,KAAK;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,eAAe;AACrB,eAAS,YAAY;AACrB,YAAM,SAAS,IAAI,IAAI,OAAO,SAAS,IAAI;AAC3C,aAAO,aAAa,OAAO,gBAAgB;AAC3C,aAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC;AAAA,IACvD;AAAA,EACF;AAEA,SACE,6CAAC,SAAI,WAAU,0DACb;AAAA,gDAAC,oCAAe;AAAA,IAChB,6CAAC,oBAAK,WAAU,gCACd;AAAA,mDAAC,0BAAW,WAAU,yBACpB;AAAA,oDAAC,yBAAU,WAAU,sBAAqB,+BAAiB;AAAA,QAC3D,4CAAC,+BAAgB,iEAAmD;AAAA,SACtE;AAAA,MACA,6CAAC,UAAK,UAAU,cACd;AAAA,qDAAC,2BAAY,WAAU,aACpB;AAAA,mBACC,4CAAC,sBAAM,aAAS,oCAAqB,KAAK,GAAG,WAAU,yBACrD,sDAAC,iCAAkB,gBAAM,SAAQ,GACnC;AAAA,UAGF,6CAAC,SAAI,WAAU,aACb;AAAA,wDAAC,sBAAM,SAAQ,SAAQ,mBAAK;AAAA,YAC5B;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,aAAY;AAAA,gBACZ,OAAO,SAAS;AAAA,gBAChB,UAAU;AAAA,gBACV,UAAQ;AAAA,gBACR,UAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UAEA,6CAAC,SAAI,WAAU,6BACb;AAAA,wDAAC,sBAAM,SAAQ,YAAW,sBAAQ;AAAA,YAClC,6CAAC,SAAI,WAAU,YACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,MAAM,eAAe,SAAS;AAAA,kBAC9B,OAAO,SAAS;AAAA,kBAChB,UAAU;AAAA,kBACV,SAAS,MAAM,mBAAmB,IAAI;AAAA,kBACtC,QAAQ,MAAM,mBAAmB,KAAK;AAAA,kBACtC,UAAQ;AAAA,kBACR,UAAU;AAAA;AAAA,cACZ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,kBAE3C;AAAA,mCAAe,4CAAC,8BAAO,WAAU,uDAAsD,IAAK,4CAAC,2BAAI,WAAU,uDAAsD;AAAA,oBAClK,4CAAC,UAAK,WAAU,WAAW,yBAAe,kBAAkB,iBAAgB;AAAA;AAAA;AAAA,cAC9E;AAAA,eACF;AAAA,aACF;AAAA,UAEA,6CAAC,SAAI,WAAU,6BACb;AAAA,wDAAC,sBAAM,SAAQ,mBAAkB,8BAAgB;AAAA,YACjD,6CAAC,SAAI,WAAU,YACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,MAAM,sBAAsB,SAAS;AAAA,kBACrC,OAAO,SAAS;AAAA,kBAChB,UAAU;AAAA,kBACV,UAAQ;AAAA,kBACR,UAAU;AAAA;AAAA,cACZ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,uBAAuB,CAAC,mBAAmB;AAAA,kBAEzD;AAAA,0CAAsB,4CAAC,8BAAO,WAAU,uDAAsD,IAAK,4CAAC,2BAAI,WAAU,uDAAsD;AAAA,oBACzK,4CAAC,UAAK,WAAU,WAAW,gCAAsB,kBAAkB,iBAAgB;AAAA;AAAA;AAAA,cACrF;AAAA,eACF;AAAA,aACF;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,kBAAkB,gBAAgB;AAAA,cACpC;AAAA,cAEA,sDAAC,SAAI,WAAU,sBACZ,+BAAqB,IAAI,CAAC,aAAa,UACtC;AAAA,gBAAC;AAAA;AAAA,kBAEC,eAAW;AAAA,oBACT;AAAA,oBACA,YAAY,YAAY,mBAAmB;AAAA,kBAC7C;AAAA,kBAEC;AAAA,gCAAY,YACX,4CAAC,6BAAM,WAAU,oBAAmB,IAEpC,4CAAC,yBAAE,WAAU,oBAAmB;AAAA,oBAElC,4CAAC,UAAK,WAAU,WAAW,sBAAY,MAAK;AAAA;AAAA;AAAA,gBAXvC;AAAA,cAYP,CACD,GACH;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAEA,6CAAC,0BAAW,WAAU,2BACpB;AAAA,sDAAC,wBAAO,MAAK,UAAS,WAAU,UAAS,UAAU,CAAC,YAAY,KAAK,WAClE,sBACC,4EACE;AAAA,wDAAC,+BAAQ,WAAU,6BAA4B;AAAA,YAAE;AAAA,aAEnD,IAEA,kBAEJ;AAAA,UACA,6CAAC,OAAE,WAAU,6CAA4C;AAAA;AAAA,YAC9B;AAAA,YACzB,4CAAC,YAAAC,SAAA,EAAK,MAAK,YAAW,WAAU,qEAAoE,qBAEpG;AAAA,YAAO;AAAA,aACT;AAAA,WACF;AAAA,SACA;AAAA,MACA,4CAAC,8BAAU,WAAU,aAAY;AAAA,MACjC,6CAAC,SAAI,WAAU,aACb;AAAA,qDAAC,SAAI,WAAU,YACb;AAAA,sDAAC,SAAI,WAAU,sCACb,sDAAC,8BAAU,WAAU,UAAS,GAChC;AAAA,UACA,4CAAC,SAAI,WAAU,kDACb,sDAAC,UAAK,WAAU,4CAA2C,8BAE3D,GACF;AAAA,WACF;AAAA,QACA,6CAAC,SAAI,WAAU,+BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,UAAU;AAAA,cACV,SAAS,MAAM,mBAAmB,QAAQ;AAAA,cAC1C,WAAU;AAAA,cAEV;AAAA,6DAAC,SAAI,WAAU,gBAAe,SAAQ,aAAY,OAAM,8BACtD;AAAA,8DAAC,UAAK,GAAE,2HAA0H,MAAK,WAAS;AAAA,kBAChJ,4CAAC,UAAK,GAAE,yIAAwI,MAAK,WAAS;AAAA,kBAC9J,4CAAC,UAAK,GAAE,iIAAgI,MAAK,WAAS;AAAA,kBACtJ,4CAAC,UAAK,GAAE,uIAAsI,MAAK,WAAS;AAAA,mBAC9J;AAAA,gBAAM;AAAA;AAAA;AAAA,UAER;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,UAAU;AAAA,cACV,SAAS,MAAM,mBAAmB,WAAW;AAAA,cAC7C,WAAU;AAAA,cAEV;AAAA,6DAAC,SAAI,WAAU,gBAAe,SAAQ,aAAY,OAAM,8BACtD;AAAA,8DAAC,UAAK,MAAK,WAAU,GAAE,iBAAe;AAAA,kBACtC,4CAAC,UAAK,MAAK,WAAU,GAAE,iBAAe;AAAA,kBACtC,4CAAC,UAAK,MAAK,WAAU,GAAE,mBAAiB;AAAA,kBACxC,4CAAC,UAAK,MAAK,WAAU,GAAE,kBAAgB;AAAA,kBACvC,4CAAC,UAAK,MAAK,WAAU,GAAE,oBAAkB;AAAA,mBAC3C;AAAA,gBAAM;AAAA;AAAA;AAAA,UAER;AAAA,WACF;AAAA,SACF;AAAA,OACJ;AAAA,KACF;AAEJ;","names":["error","Link"]}
|
package/dist/cjs/errors.js
CHANGED
|
@@ -19,23 +19,251 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var errors_exports = {};
|
|
20
20
|
__export(errors_exports, {
|
|
21
21
|
ERRORS: () => ERRORS,
|
|
22
|
-
TernSecureError: () => TernSecureError
|
|
22
|
+
TernSecureError: () => TernSecureError,
|
|
23
|
+
getErrorAlertVariant: () => getErrorAlertVariant,
|
|
24
|
+
handleFirebaseAuthError: () => handleFirebaseAuthError,
|
|
25
|
+
isAuthErrorResponse: () => isAuthErrorResponse
|
|
23
26
|
});
|
|
24
27
|
module.exports = __toCommonJS(errors_exports);
|
|
25
28
|
const ERRORS = {
|
|
26
29
|
SERVER_SIDE_INITIALIZATION: "TernSecure must be initialized on the client side",
|
|
30
|
+
REQUIRES_VERIFICATION: "AUTH_REQUIRES_VERIFICATION",
|
|
31
|
+
AUTHENTICATED: "AUTHENTICATED",
|
|
32
|
+
UNAUTHENTICATED: "UNAUTHENTICATED",
|
|
33
|
+
UNVERIFIED: "UNVERIFIED",
|
|
27
34
|
NOT_INITIALIZED: "TernSecure services are not initialized. Call initializeTernSecure() first",
|
|
28
|
-
HOOK_CONTEXT:
|
|
35
|
+
HOOK_CONTEXT: "Hook must be used within TernSecureProvider",
|
|
36
|
+
EMAIL_NOT_VERIFIED: "EMAIL_NOT_VERIFIED",
|
|
37
|
+
INVALID_CREDENTIALS: "INVALID_CREDENTIALS",
|
|
38
|
+
USER_DISABLED: "USER_DISABLED",
|
|
39
|
+
TOO_MANY_ATTEMPTS: "TOO_MANY_ATTEMPTS",
|
|
40
|
+
NETWORK_ERROR: "NETWORK_ERROR",
|
|
41
|
+
INVALID_EMAIL: "INVALID_EMAIL",
|
|
42
|
+
WEAK_PASSWORD: "WEAK_PASSWORD",
|
|
43
|
+
EMAIL_EXISTS: "EMAIL_EXISTS",
|
|
44
|
+
POPUP_BLOCKED: "POPUP_BLOCKED",
|
|
45
|
+
OPERATION_NOT_ALLOWED: "OPERATION_NOT_ALLOWED",
|
|
46
|
+
EXPIRED_TOKEN: "EXPIRED_TOKEN",
|
|
47
|
+
INVALID_TOKEN: "INVALID_TOKEN",
|
|
48
|
+
SESSION_EXPIRED: "SESSION_EXPIRED",
|
|
49
|
+
INTERNAL_ERROR: "INTERNAL_ERROR"
|
|
50
|
+
};
|
|
51
|
+
const ERROR_PATTERNS = {
|
|
52
|
+
INVALID_EMAIL: /auth.*invalid.*email|invalid.*email.*auth|Firebase:.*Error.*auth\/invalid-email/i,
|
|
53
|
+
INVALID_CREDENTIALS: /auth.*invalid.*credential|invalid.*password|wrong.*password|Firebase:.*Error.*auth\/(invalid-credential|wrong-password|user-not-found)/i,
|
|
54
|
+
USER_DISABLED: /user.*disabled|disabled.*user|Firebase:.*Error.*auth\/user-disabled/i,
|
|
55
|
+
TOO_MANY_ATTEMPTS: /too.*many.*attempts|too.*many.*requests|Firebase:.*Error.*auth\/too-many-requests/i,
|
|
56
|
+
NETWORK_ERROR: /network.*request.*failed|failed.*network|Firebase:.*Error.*auth\/network-request-failed/i,
|
|
57
|
+
OPERATION_NOT_ALLOWED: /operation.*not.*allowed|method.*not.*allowed|Firebase:.*Error.*auth\/operation-not-allowed/i,
|
|
58
|
+
POPUP_BLOCKED: /popup.*blocked|blocked.*popup|Firebase:.*Error.*auth\/popup-blocked/i,
|
|
59
|
+
EMAIL_EXISTS: /email.*exists|email.*already.*use|Firebase:.*Error.*auth\/email-already-in-use/i,
|
|
60
|
+
EXPIRED_TOKEN: /token.*expired|expired.*token|Firebase:.*Error.*auth\/expired-token/i,
|
|
61
|
+
INVALID_TOKEN: /invalid.*token|token.*invalid|Firebase:.*Error.*auth\/invalid-token/i,
|
|
62
|
+
SESSION_EXPIRED: /session.*expired|expired.*session|Firebase:.*Error.*auth\/session-expired/i,
|
|
63
|
+
WEAK_PASSWORD: /weak.*password|password.*weak|Firebase:.*Error.*auth\/weak-password/i
|
|
29
64
|
};
|
|
30
65
|
class TernSecureError extends Error {
|
|
31
|
-
constructor(message) {
|
|
32
|
-
super(message);
|
|
66
|
+
constructor(code, message) {
|
|
67
|
+
super(message || code);
|
|
33
68
|
this.name = "TernSecureError";
|
|
69
|
+
this.code = code;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function isFirebaseErrorLike(error) {
|
|
73
|
+
if (!error || typeof error !== "object") return false;
|
|
74
|
+
const err = error;
|
|
75
|
+
if (typeof err.message === "string") {
|
|
76
|
+
const bundledErrorMatch = err.message.match(/Firebase:\s*Error\s*$$auth\/([^)]+)$$/);
|
|
77
|
+
if (bundledErrorMatch) {
|
|
78
|
+
err.code = `auth/${bundledErrorMatch[1]}`;
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return typeof err.code === "string" && err.code.startsWith("auth/") || typeof err.name === "string" && err.name.includes("FirebaseError");
|
|
83
|
+
}
|
|
84
|
+
function extractFirebaseErrorCode(error) {
|
|
85
|
+
if (typeof error.message === "string") {
|
|
86
|
+
const bundledErrorMatch = error.message.match(/Firebase:\s*Error\s*$$auth\/([^)]+)$$/);
|
|
87
|
+
if (bundledErrorMatch) {
|
|
88
|
+
return bundledErrorMatch[1];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (error.code) {
|
|
92
|
+
return error.code.replace("auth/", "");
|
|
93
|
+
}
|
|
94
|
+
if (typeof error.message === "string") {
|
|
95
|
+
const messageCodeMatch = error.message.match(/auth\/([a-z-]+)/);
|
|
96
|
+
if (messageCodeMatch) {
|
|
97
|
+
return messageCodeMatch[1];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return "";
|
|
101
|
+
}
|
|
102
|
+
function mapFirebaseErrorCode(code) {
|
|
103
|
+
const directMappings = {
|
|
104
|
+
"invalid-email": "INVALID_EMAIL",
|
|
105
|
+
"user-disabled": "USER_DISABLED",
|
|
106
|
+
"too-many-requests": "TOO_MANY_ATTEMPTS",
|
|
107
|
+
"network-request-failed": "NETWORK_ERROR",
|
|
108
|
+
"operation-not-allowed": "OPERATION_NOT_ALLOWED",
|
|
109
|
+
"popup-blocked": "POPUP_BLOCKED",
|
|
110
|
+
"email-already-in-use": "EMAIL_EXISTS",
|
|
111
|
+
"weak-password": "WEAK_PASSWORD",
|
|
112
|
+
"invalid-credential": "INVALID_CREDENTIALS",
|
|
113
|
+
"wrong-password": "INVALID_CREDENTIALS",
|
|
114
|
+
"user-not-found": "INVALID_CREDENTIALS",
|
|
115
|
+
"invalid-password": "INVALID_CREDENTIALS",
|
|
116
|
+
"user-token-expired": "EXPIRED_TOKEN",
|
|
117
|
+
"invalid-id-token": "INVALID_TOKEN"
|
|
118
|
+
};
|
|
119
|
+
return directMappings[code] || "INTERNAL_ERROR";
|
|
120
|
+
}
|
|
121
|
+
function determineErrorTypeFromMessage(message) {
|
|
122
|
+
const bundledErrorMatch = message.match(/Firebase:\s*Error\s*$$auth\/([^)]+)$$/);
|
|
123
|
+
if (bundledErrorMatch) {
|
|
124
|
+
const errorCode = bundledErrorMatch[1];
|
|
125
|
+
const mappedCode = mapFirebaseErrorCode(errorCode);
|
|
126
|
+
if (mappedCode) {
|
|
127
|
+
return mappedCode;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
for (const [errorType, pattern] of Object.entries(ERROR_PATTERNS)) {
|
|
131
|
+
if (pattern.test(message)) {
|
|
132
|
+
return errorType;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return "INTERNAL_ERROR";
|
|
136
|
+
}
|
|
137
|
+
function createErrorResponse(code, message) {
|
|
138
|
+
const defaultMessages = {
|
|
139
|
+
INVALID_EMAIL: "Invalid email format",
|
|
140
|
+
INVALID_CREDENTIALS: "Invalid email or password",
|
|
141
|
+
USER_DISABLED: "This account has been disabled",
|
|
142
|
+
TOO_MANY_ATTEMPTS: "Too many attempts. Please try again later",
|
|
143
|
+
NETWORK_ERROR: "Network error. Please check your connection",
|
|
144
|
+
OPERATION_NOT_ALLOWED: "This login method is not enabled",
|
|
145
|
+
POPUP_BLOCKED: "Login popup was blocked. Please enable popups",
|
|
146
|
+
EMAIL_EXISTS: "This email is already in use",
|
|
147
|
+
EXPIRED_TOKEN: "Your session has expired. Please login again",
|
|
148
|
+
INVALID_TOKEN: "Invalid authentication token",
|
|
149
|
+
SESSION_EXPIRED: "Your session has expired",
|
|
150
|
+
WEAK_PASSWORD: "Password is too weak",
|
|
151
|
+
EMAIL_NOT_VERIFIED: "Email verification required",
|
|
152
|
+
INTERNAL_ERROR: "An internal error occurred. Please try again",
|
|
153
|
+
SERVER_SIDE_INITIALIZATION: "TernSecure must be initialized on the client side",
|
|
154
|
+
REQUIRES_VERIFICATION: "Email verification required",
|
|
155
|
+
AUTHENTICATED: "Already authenticated",
|
|
156
|
+
UNAUTHENTICATED: "Authentication required",
|
|
157
|
+
UNVERIFIED: "Email verification required",
|
|
158
|
+
NOT_INITIALIZED: "TernSecure services are not initialized",
|
|
159
|
+
HOOK_CONTEXT: "Hook must be used within TernSecureProvider"
|
|
160
|
+
};
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
message: message || defaultMessages[code],
|
|
164
|
+
code
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function handleFirebaseAuthError(error) {
|
|
168
|
+
function extractErrorInfo(input) {
|
|
169
|
+
if (typeof input === "string") {
|
|
170
|
+
const match = input.match(/Firebase:\s*Error\s*\(auth\/([^)]+)\)/);
|
|
171
|
+
if (match) {
|
|
172
|
+
return { code: match[1], message: input };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (input && typeof input === "object") {
|
|
176
|
+
const err = input;
|
|
177
|
+
if (err.message) {
|
|
178
|
+
const match = err.message.match(/Firebase:\s*Error\s*\(auth\/([^)]+)\)/);
|
|
179
|
+
if (match) {
|
|
180
|
+
return { code: match[1], message: err.message };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (err.code) {
|
|
184
|
+
return {
|
|
185
|
+
code: err.code.replace("auth/", ""),
|
|
186
|
+
message: err.message || ""
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
const ERROR_MESSAGES = {
|
|
193
|
+
"invalid-email": { message: "Invalid email format", code: "INVALID_EMAIL" },
|
|
194
|
+
"invalid-credential": { message: "Invalid email or password", code: "INVALID_CREDENTIALS" },
|
|
195
|
+
"invalid-login-credentials": { message: "Invalid email or password", code: "INVALID_CREDENTIALS" },
|
|
196
|
+
"wrong-password": { message: "Invalid email or password", code: "INVALID_CREDENTIALS" },
|
|
197
|
+
"user-not-found": { message: "Invalid email or password", code: "INVALID_CREDENTIALS" },
|
|
198
|
+
"user-disabled": { message: "This account has been disabled", code: "USER_DISABLED" },
|
|
199
|
+
"too-many-requests": { message: "Too many attempts. Please try again later", code: "TOO_MANY_ATTEMPTS" },
|
|
200
|
+
"network-request-failed": { message: "Network error. Please check your connection", code: "NETWORK_ERROR" },
|
|
201
|
+
"email-already-in-use": { message: "This email is already in use", code: "EMAIL_EXISTS" },
|
|
202
|
+
"weak-password": { message: "Password is too weak", code: "WEAK_PASSWORD" },
|
|
203
|
+
"operation-not-allowed": { message: "This login method is not enabled", code: "OPERATION_NOT_ALLOWED" },
|
|
204
|
+
"popup-blocked": { message: "Login popup was blocked. Please enable popups", code: "POPUP_BLOCKED" },
|
|
205
|
+
"expired-action-code": { message: "Your session has expired. Please login again", code: "EXPIRED_TOKEN" },
|
|
206
|
+
"user-token-expired": { message: "Your session has expired. Please login again", code: "EXPIRED_TOKEN" }
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
const errorInfo = extractErrorInfo(error);
|
|
210
|
+
if (errorInfo) {
|
|
211
|
+
const mappedError = ERROR_MESSAGES[errorInfo.code];
|
|
212
|
+
if (mappedError) {
|
|
213
|
+
return {
|
|
214
|
+
success: false,
|
|
215
|
+
message: mappedError.message,
|
|
216
|
+
code: mappedError.code
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const errorString = String(error);
|
|
221
|
+
const lastMatch = errorString.match(/Firebase:\s*Error\s*\(auth\/([^)]+)\)/);
|
|
222
|
+
if (lastMatch && ERROR_MESSAGES[lastMatch[1]]) {
|
|
223
|
+
return {
|
|
224
|
+
success: false,
|
|
225
|
+
...ERROR_MESSAGES[lastMatch[1]]
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
} catch (e) {
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
success: false,
|
|
232
|
+
message: "An unexpected error occurred. Please try again later",
|
|
233
|
+
code: "INTERNAL_ERROR"
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function isAuthErrorResponse(response) {
|
|
237
|
+
return typeof response === "object" && response !== null && "success" in response && response.success === false && "code" in response && "message" in response;
|
|
238
|
+
}
|
|
239
|
+
function getErrorAlertVariant(error) {
|
|
240
|
+
if (!error) return "destructive";
|
|
241
|
+
switch (error.error) {
|
|
242
|
+
case "AUTHENTICATED":
|
|
243
|
+
return "default";
|
|
244
|
+
case "EMAIL_EXISTS":
|
|
245
|
+
case "UNAUTHENTICATED":
|
|
246
|
+
case "UNVERIFIED":
|
|
247
|
+
case "REQUIRES_VERIFICATION":
|
|
248
|
+
case "INVALID_EMAIL":
|
|
249
|
+
case "INVALID_TOKEN":
|
|
250
|
+
case "INTERNAL_ERROR":
|
|
251
|
+
case "USER_DISABLED":
|
|
252
|
+
case "TOO_MANY_ATTEMPTS":
|
|
253
|
+
case "NETWORK_ERROR":
|
|
254
|
+
case "SESSION_EXPIRED":
|
|
255
|
+
case "EXPIRED_TOKEN":
|
|
256
|
+
case "INVALID_CREDENTIALS":
|
|
257
|
+
default:
|
|
258
|
+
return "destructive";
|
|
34
259
|
}
|
|
35
260
|
}
|
|
36
261
|
// Annotate the CommonJS export names for ESM import in node:
|
|
37
262
|
0 && (module.exports = {
|
|
38
263
|
ERRORS,
|
|
39
|
-
TernSecureError
|
|
264
|
+
TernSecureError,
|
|
265
|
+
getErrorAlertVariant,
|
|
266
|
+
handleFirebaseAuthError,
|
|
267
|
+
isAuthErrorResponse
|
|
40
268
|
});
|
|
41
269
|
//# sourceMappingURL=errors.js.map
|
package/dist/cjs/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors.ts"],"sourcesContent":["export const ERRORS = {\n SERVER_SIDE_INITIALIZATION: 'TernSecure must be initialized on the client side',\n NOT_INITIALIZED: 'TernSecure services are not initialized. Call initializeTernSecure() first',\n HOOK_CONTEXT: (hookName: string) => `${hookName} must be used within TernSecureProvider`,\n } as const;\n \n export class TernSecureError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TernSecureError';\n }\n }"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,SAAS;AAAA,EAClB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,cAAc,CAAC,aAAqB,GAAG,QAAQ;AACjD;AAEO,MAAM,wBAAwB,MAAM;AAAA,EACzC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/errors.ts"],"sourcesContent":["import { SignInResponse } from \"./types\"\n\nexport type ErrorCode = keyof typeof ERRORS\n\nexport interface AuthErrorResponse {\n success: false\n message: string\n code: ErrorCode\n}\n\nexport const ERRORS = {\n SERVER_SIDE_INITIALIZATION: \"TernSecure must be initialized on the client side\",\n REQUIRES_VERIFICATION: \"AUTH_REQUIRES_VERIFICATION\",\n AUTHENTICATED: \"AUTHENTICATED\",\n UNAUTHENTICATED: \"UNAUTHENTICATED\",\n UNVERIFIED: \"UNVERIFIED\",\n NOT_INITIALIZED: \"TernSecure services are not initialized. Call initializeTernSecure() first\",\n HOOK_CONTEXT: \"Hook must be used within TernSecureProvider\",\n EMAIL_NOT_VERIFIED: \"EMAIL_NOT_VERIFIED\",\n INVALID_CREDENTIALS: \"INVALID_CREDENTIALS\",\n USER_DISABLED: \"USER_DISABLED\",\n TOO_MANY_ATTEMPTS: \"TOO_MANY_ATTEMPTS\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n INVALID_EMAIL: \"INVALID_EMAIL\",\n WEAK_PASSWORD: \"WEAK_PASSWORD\",\n EMAIL_EXISTS: \"EMAIL_EXISTS\",\n POPUP_BLOCKED: \"POPUP_BLOCKED\",\n OPERATION_NOT_ALLOWED: \"OPERATION_NOT_ALLOWED\",\n EXPIRED_TOKEN: \"EXPIRED_TOKEN\",\n INVALID_TOKEN: \"INVALID_TOKEN\",\n SESSION_EXPIRED: \"SESSION_EXPIRED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const\n\n// Firebase Auth Error Code patterns\nconst ERROR_PATTERNS = {\n INVALID_EMAIL: /auth.*invalid.*email|invalid.*email.*auth|Firebase:.*Error.*auth\\/invalid-email/i,\n INVALID_CREDENTIALS:\n /auth.*invalid.*credential|invalid.*password|wrong.*password|Firebase:.*Error.*auth\\/(invalid-credential|wrong-password|user-not-found)/i,\n USER_DISABLED: /user.*disabled|disabled.*user|Firebase:.*Error.*auth\\/user-disabled/i,\n TOO_MANY_ATTEMPTS: /too.*many.*attempts|too.*many.*requests|Firebase:.*Error.*auth\\/too-many-requests/i,\n NETWORK_ERROR: /network.*request.*failed|failed.*network|Firebase:.*Error.*auth\\/network-request-failed/i,\n OPERATION_NOT_ALLOWED: /operation.*not.*allowed|method.*not.*allowed|Firebase:.*Error.*auth\\/operation-not-allowed/i,\n POPUP_BLOCKED: /popup.*blocked|blocked.*popup|Firebase:.*Error.*auth\\/popup-blocked/i,\n EMAIL_EXISTS: /email.*exists|email.*already.*use|Firebase:.*Error.*auth\\/email-already-in-use/i,\n EXPIRED_TOKEN: /token.*expired|expired.*token|Firebase:.*Error.*auth\\/expired-token/i,\n INVALID_TOKEN: /invalid.*token|token.*invalid|Firebase:.*Error.*auth\\/invalid-token/i,\n SESSION_EXPIRED: /session.*expired|expired.*session|Firebase:.*Error.*auth\\/session-expired/i,\n WEAK_PASSWORD: /weak.*password|password.*weak|Firebase:.*Error.*auth\\/weak-password/i,\n} as const\n\nexport class TernSecureError extends Error {\n code: ErrorCode\n\n constructor(code: ErrorCode, message?: string) {\n super(message || code)\n this.name = \"TernSecureError\"\n this.code = code\n }\n}\n\ninterface SerializedFirebaseError {\n name?: string\n code?: string\n message?: string\n stack?: string\n}\n\n/**\n * Determines if an object matches the shape of a Firebase Error\n */\nfunction isFirebaseErrorLike(error: unknown): error is SerializedFirebaseError {\n if (!error || typeof error !== \"object\") return false\n\n const err = error as SerializedFirebaseError\n\n // Check for bundled Firebase error format: \"Firebase: Error (auth/error-code)\"\n if (typeof err.message === \"string\") {\n const bundledErrorMatch = err.message.match(/Firebase:\\s*Error\\s*$$auth\\/([^)]+)$$/)\n if (bundledErrorMatch) {\n // Add the extracted code to the error object\n err.code = `auth/${bundledErrorMatch[1]}`\n return true\n }\n }\n\n return (\n (typeof err.code === \"string\" && err.code.startsWith(\"auth/\")) ||\n (typeof err.name === \"string\" && err.name.includes(\"FirebaseError\"))\n )\n}\n\n/**\n * Extracts the error code from a Firebase-like error object\n */\nfunction extractFirebaseErrorCode(error: SerializedFirebaseError): string {\n // First try to extract from bundled error message format\n if (typeof error.message === \"string\") {\n const bundledErrorMatch = error.message.match(/Firebase:\\s*Error\\s*$$auth\\/([^)]+)$$/)\n if (bundledErrorMatch) {\n return bundledErrorMatch[1]\n }\n }\n\n // Then try the standard code property\n if (error.code) {\n return error.code.replace(\"auth/\", \"\")\n }\n\n // Finally try to extract from error message if it contains an error code\n if (typeof error.message === \"string\") {\n const messageCodeMatch = error.message.match(/auth\\/([a-z-]+)/)\n if (messageCodeMatch) {\n return messageCodeMatch[1]\n }\n }\n\n return \"\"\n}\n\n/**\n * Maps a Firebase error code to our internal error code\n */\nfunction mapFirebaseErrorCode(code: string): ErrorCode {\n // Direct mapping for known error codes\n const directMappings: Record<string, ErrorCode> = {\n \"invalid-email\": \"INVALID_EMAIL\",\n \"user-disabled\": \"USER_DISABLED\",\n \"too-many-requests\": \"TOO_MANY_ATTEMPTS\",\n \"network-request-failed\": \"NETWORK_ERROR\",\n \"operation-not-allowed\": \"OPERATION_NOT_ALLOWED\",\n \"popup-blocked\": \"POPUP_BLOCKED\",\n \"email-already-in-use\": \"EMAIL_EXISTS\",\n \"weak-password\": \"WEAK_PASSWORD\",\n \"invalid-credential\": \"INVALID_CREDENTIALS\",\n \"wrong-password\": \"INVALID_CREDENTIALS\",\n \"user-not-found\": \"INVALID_CREDENTIALS\",\n \"invalid-password\": \"INVALID_CREDENTIALS\",\n \"user-token-expired\": \"EXPIRED_TOKEN\",\n \"invalid-id-token\": \"INVALID_TOKEN\",\n }\n\n return directMappings[code] || \"INTERNAL_ERROR\"\n}\n\n/**\n * Determines error type based on error message pattern matching\n */\nfunction determineErrorTypeFromMessage(message: string): ErrorCode {\n // First check for bundled Firebase error format\n const bundledErrorMatch = message.match(/Firebase:\\s*Error\\s*$$auth\\/([^)]+)$$/)\n if (bundledErrorMatch) {\n const errorCode = bundledErrorMatch[1]\n const mappedCode = mapFirebaseErrorCode(errorCode)\n if (mappedCode) {\n return mappedCode\n }\n }\n\n // Then check standard patterns\n for (const [errorType, pattern] of Object.entries(ERROR_PATTERNS)) {\n if (pattern.test(message)) {\n return errorType as ErrorCode\n }\n }\n\n return \"INTERNAL_ERROR\"\n}\n\n/**\n * Creates a standardized error response\n */\nfunction createErrorResponse(code: ErrorCode, message: string): AuthErrorResponse {\n const defaultMessages: Record<ErrorCode, string> = {\n INVALID_EMAIL: \"Invalid email format\",\n INVALID_CREDENTIALS: \"Invalid email or password\",\n USER_DISABLED: \"This account has been disabled\",\n TOO_MANY_ATTEMPTS: \"Too many attempts. Please try again later\",\n NETWORK_ERROR: \"Network error. Please check your connection\",\n OPERATION_NOT_ALLOWED: \"This login method is not enabled\",\n POPUP_BLOCKED: \"Login popup was blocked. Please enable popups\",\n EMAIL_EXISTS: \"This email is already in use\",\n EXPIRED_TOKEN: \"Your session has expired. Please login again\",\n INVALID_TOKEN: \"Invalid authentication token\",\n SESSION_EXPIRED: \"Your session has expired\",\n WEAK_PASSWORD: \"Password is too weak\",\n EMAIL_NOT_VERIFIED: \"Email verification required\",\n INTERNAL_ERROR: \"An internal error occurred. Please try again\",\n SERVER_SIDE_INITIALIZATION: \"TernSecure must be initialized on the client side\",\n REQUIRES_VERIFICATION: \"Email verification required\",\n AUTHENTICATED: \"Already authenticated\",\n UNAUTHENTICATED: \"Authentication required\",\n UNVERIFIED: \"Email verification required\",\n NOT_INITIALIZED: \"TernSecure services are not initialized\",\n HOOK_CONTEXT: \"Hook must be used within TernSecureProvider\",\n }\n\n return {\n success: false,\n message: message || defaultMessages[code],\n code,\n }\n}\n\n/**\n * Handles Firebase authentication errors with multiple fallback mechanisms\n */\nexport function handleFirebaseAuthError(error: unknown): AuthErrorResponse {\n // Helper to extract clean error code from bundled format\n function extractErrorInfo(input: unknown): { code: string; message: string } | null {\n // Case 1: String input (direct Firebase error message)\n if (typeof input === 'string') {\n const match = input.match(/Firebase:\\s*Error\\s*\\(auth\\/([^)]+)\\)/);\n if (match) {\n return { code: match[1], message: input };\n }\n }\n\n // Case 2: Error object\n if (input && typeof input === 'object') {\n const err = input as { code?: string; message?: string };\n \n // Check for bundled message format first\n if (err.message) {\n const match = err.message.match(/Firebase:\\s*Error\\s*\\(auth\\/([^)]+)\\)/);\n if (match) {\n return { code: match[1], message: err.message };\n }\n }\n\n // Check for direct code\n if (err.code) {\n return {\n code: err.code.replace('auth/', ''),\n message: err.message || ''\n };\n }\n }\n\n return null;\n }\n\n // Map error codes to user-friendly messages\n const ERROR_MESSAGES: Record<string, { message: string; code: ErrorCode }> = {\n 'invalid-email': { message: 'Invalid email format', code: 'INVALID_EMAIL' },\n 'invalid-credential': { message: 'Invalid email or password', code: 'INVALID_CREDENTIALS' },\n 'invalid-login-credentials': { message: 'Invalid email or password', code: 'INVALID_CREDENTIALS' },\n 'wrong-password': { message: 'Invalid email or password', code: 'INVALID_CREDENTIALS' },\n 'user-not-found': { message: 'Invalid email or password', code: 'INVALID_CREDENTIALS' },\n 'user-disabled': { message: 'This account has been disabled', code: 'USER_DISABLED' },\n 'too-many-requests': { message: 'Too many attempts. Please try again later', code: 'TOO_MANY_ATTEMPTS' },\n 'network-request-failed': { message: 'Network error. Please check your connection', code: 'NETWORK_ERROR' },\n 'email-already-in-use': { message: 'This email is already in use', code: 'EMAIL_EXISTS' },\n 'weak-password': { message: 'Password is too weak', code: 'WEAK_PASSWORD' },\n 'operation-not-allowed': { message: 'This login method is not enabled', code: 'OPERATION_NOT_ALLOWED' },\n 'popup-blocked': { message: 'Login popup was blocked. Please enable popups', code: 'POPUP_BLOCKED' },\n 'expired-action-code': { message: 'Your session has expired. Please login again', code: 'EXPIRED_TOKEN' },\n 'user-token-expired': { message: 'Your session has expired. Please login again', code: 'EXPIRED_TOKEN' }\n };\n\n try {\n // Extract error information\n const errorInfo = extractErrorInfo(error);\n \n if (errorInfo) {\n const mappedError = ERROR_MESSAGES[errorInfo.code];\n if (mappedError) {\n return {\n success: false,\n message: mappedError.message,\n code: mappedError.code\n };\n }\n }\n\n // If we couldn't extract or map the error, try one last time with string conversion\n const errorString = String(error);\n const lastMatch = errorString.match(/Firebase:\\s*Error\\s*\\(auth\\/([^)]+)\\)/);\n if (lastMatch && ERROR_MESSAGES[lastMatch[1]]) {\n return {\n success: false,\n ...ERROR_MESSAGES[lastMatch[1]]\n };\n }\n\n } catch (e) {\n // Silent catch - we'll return the default error\n }\n\n // Default fallback\n return {\n success: false,\n message: 'An unexpected error occurred. Please try again later',\n code: 'INTERNAL_ERROR'\n };\n}\n\n/**\n * Type guard to check if a response is an AuthErrorResponse\n */\nexport function isAuthErrorResponse(response: unknown): response is AuthErrorResponse {\n return (\n typeof response === \"object\" &&\n response !== null &&\n \"success\" in response &&\n (response as { success: boolean }).success === false &&\n \"code\" in response &&\n \"message\" in response\n )\n}\n\n\n\nexport function getErrorAlertVariant(error: SignInResponse | undefined) {\n if (!error) return \"destructive\"\n\n switch (error.error) {\n case \"AUTHENTICATED\":\n return \"default\"\n case \"EMAIL_EXISTS\":\n case \"UNAUTHENTICATED\":\n case \"UNVERIFIED\":\n case \"REQUIRES_VERIFICATION\":\n case \"INVALID_EMAIL\":\n case \"INVALID_TOKEN\":\n case \"INTERNAL_ERROR\":\n case \"USER_DISABLED\":\n case \"TOO_MANY_ATTEMPTS\":\n case \"NETWORK_ERROR\":\n case \"SESSION_EXPIRED\":\n case \"EXPIRED_TOKEN\":\n case \"INVALID_CREDENTIALS\":\n default:\n return \"destructive\"\n }\n}"],"mappings":"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","names":[]}
|
package/dist/cjs/index.js
CHANGED
|
@@ -20,6 +20,7 @@ var index_exports = {};
|
|
|
20
20
|
__export(index_exports, {
|
|
21
21
|
SignIn: () => import_sign_in.SignIn,
|
|
22
22
|
SignOut: () => import_sign_out.SignOut,
|
|
23
|
+
SignOutButton: () => import_sign_out_button.SignOutButton,
|
|
23
24
|
SignUp: () => import_sign_up.SignUp,
|
|
24
25
|
TernSecureAuth: () => import_client_init.TernSecureAuth,
|
|
25
26
|
TernSecureFirestore: () => import_client_init.TernSecureFirestore,
|
|
@@ -28,7 +29,6 @@ __export(index_exports, {
|
|
|
28
29
|
signInWithEmail: () => import_actions.signInWithEmail,
|
|
29
30
|
ternSecureAuth: () => import_client_init.ternSecureAuth,
|
|
30
31
|
useAuth: () => import_useAuth.useAuth,
|
|
31
|
-
useUser: () => import_useUser.useUser,
|
|
32
32
|
validateConfig: () => import_config.validateConfig
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -37,14 +37,15 @@ var import_config = require("./utils/config");
|
|
|
37
37
|
var import_actions = require("./app-router/client/actions");
|
|
38
38
|
var import_TernSecureProvider = require("./app-router/client/TernSecureProvider");
|
|
39
39
|
var import_useAuth = require("./boundary/hooks/useAuth");
|
|
40
|
-
var import_useUser = require("./boundary/hooks/useUser");
|
|
41
40
|
var import_sign_in = require("./components/sign-in");
|
|
41
|
+
var import_sign_out_button = require("./components/sign-out-button");
|
|
42
42
|
var import_sign_out = require("./components/sign-out");
|
|
43
43
|
var import_sign_up = require("./components/sign-up");
|
|
44
44
|
// Annotate the CommonJS export names for ESM import in node:
|
|
45
45
|
0 && (module.exports = {
|
|
46
46
|
SignIn,
|
|
47
47
|
SignOut,
|
|
48
|
+
SignOutButton,
|
|
48
49
|
SignUp,
|
|
49
50
|
TernSecureAuth,
|
|
50
51
|
TernSecureFirestore,
|
|
@@ -53,7 +54,6 @@ var import_sign_up = require("./components/sign-up");
|
|
|
53
54
|
signInWithEmail,
|
|
54
55
|
ternSecureAuth,
|
|
55
56
|
useAuth,
|
|
56
|
-
useUser,
|
|
57
57
|
validateConfig
|
|
58
58
|
});
|
|
59
59
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["\n//import { TernSecureServerProvider } from './app-router/server/TernSecureServerProvider'\n//import type { TernSecureState } from './app-router/client/TernSecureProvider'\nexport { TernSecureAuth, TernSecureFirestore, ternSecureAuth } from './utils/client-init'\nexport { loadFireConfig, validateConfig } from './utils/config'\nexport { signInWithEmail } from './app-router/client/actions'\n//export { useInternalContext } from './boundary/TernSecureCtx'\n//export { TernSecureClientProvider } from './app-router/client/TernSecureProvider'\nexport { TernSecureProvider } from './app-router/client/TernSecureProvider'\nexport { useAuth } from './boundary/hooks/useAuth' \nexport {
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["\n//import { TernSecureServerProvider } from './app-router/server/TernSecureServerProvider'\n//import type { TernSecureState } from './app-router/client/TernSecureProvider'\nexport { TernSecureAuth, TernSecureFirestore, ternSecureAuth } from './utils/client-init'\nexport { loadFireConfig, validateConfig } from './utils/config'\nexport { signInWithEmail } from './app-router/client/actions'\n//export { useInternalContext } from './boundary/TernSecureCtx'\n//export { TernSecureClientProvider } from './app-router/client/TernSecureProvider'\nexport { TernSecureProvider } from './app-router/client/TernSecureProvider'\nexport { useAuth } from './boundary/hooks/useAuth' \nexport { SignIn } from './components/sign-in'\nexport { SignOutButton } from './components/sign-out-button'\nexport { SignOut } from './components/sign-out'\nexport { SignUp } from './components/sign-up'\n\n//export const TernSecureProvider = TernSecureServerProvider\n//export type { TernSecureState }"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,yBAAoE;AACpE,oBAA+C;AAC/C,qBAAgC;AAGhC,gCAAmC;AACnC,qBAAwB;AACxB,qBAAuB;AACvB,6BAA8B;AAC9B,sBAAwB;AACxB,qBAAuB;","names":[]}
|
package/dist/cjs/types.js
CHANGED
|
@@ -3,6 +3,10 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
6
10
|
var __copyProps = (to, from, except, desc) => {
|
|
7
11
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
12
|
for (let key of __getOwnPropNames(from))
|
|
@@ -13,5 +17,15 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
13
17
|
};
|
|
14
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
19
|
var types_exports = {};
|
|
20
|
+
__export(types_exports, {
|
|
21
|
+
isSignInResponse: () => isSignInResponse
|
|
22
|
+
});
|
|
16
23
|
module.exports = __toCommonJS(types_exports);
|
|
24
|
+
function isSignInResponse(value) {
|
|
25
|
+
return typeof value === "object" && "success" in value && typeof value.success === "boolean";
|
|
26
|
+
}
|
|
27
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
+
0 && (module.exports = {
|
|
29
|
+
isSignInResponse
|
|
30
|
+
});
|
|
17
31
|
//# sourceMappingURL=types.js.map
|
package/dist/cjs/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types.ts"],"sourcesContent":["import { FirebaseOptions } from 'firebase/app'\n\n/**\n * TernSecure Firebase configuration interface\n * Extends Firebase's base configuration options\n */\nexport interface TernSecureConfig extends FirebaseOptions {\n apiKey: string\n authDomain: string\n projectId: string\n storageBucket: string\n messagingSenderId: string\n appId: string\n measurementId?: string // Optional for analytics\n}\n\n/**\n * TernSecure initialization options\n */\nexport interface TernSecureOptions {\n /** Environment setting for different configurations */\n environment?: 'development' | 'production'\n /** Geographic region for data storage */\n region?: string\n /** Custom error handler */\n onError?: (error: Error) => void\n /** Debug mode flag */\n debug?: boolean\n}\n\n/**\n * Firebase initialization state\n */\nexport interface FirebaseState {\n /** Whether Firebase has been initialized */\n initialized: boolean\n /** Any initialization errors */\n error: Error | null\n /** Timestamp of last initialization attempt */\n lastInitAttempt?: number\n}\n\n/**\n * Configuration validation result\n */\nexport interface ConfigValidationResult {\n isValid: boolean\n errors: string[]\n config: TernSecureConfig\n}\n\n/**\n * Firebase Admin configuration interface\n */\nexport interface TernSecureAdminConfig {\n projectId: string\n clientEmail: string\n privateKey: string\n}\n\n/**\n * Firebase Admin configuration validation result\n */\nexport interface AdminConfigValidationResult {\n isValid: boolean\n errors: string[]\n config: TernSecureAdminConfig\n}\n\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/types.ts"],"sourcesContent":["import { FirebaseOptions } from 'firebase/app'\nimport { ERRORS } from './errors'\n\n\n/**\n * TernSecure Firebase configuration interface\n * Extends Firebase's base configuration options\n */\nexport interface TernSecureConfig extends FirebaseOptions {\n apiKey: string\n authDomain: string\n projectId: string\n storageBucket: string\n messagingSenderId: string\n appId: string\n measurementId?: string // Optional for analytics\n}\n\n/**\n * TernSecure initialization options\n */\nexport interface TernSecureOptions {\n /** Environment setting for different configurations */\n environment?: 'development' | 'production'\n /** Geographic region for data storage */\n region?: string\n /** Custom error handler */\n onError?: (error: Error) => void\n /** Debug mode flag */\n debug?: boolean\n}\n\n/**\n * Firebase initialization state\n */\nexport interface FirebaseState {\n /** Whether Firebase has been initialized */\n initialized: boolean\n /** Any initialization errors */\n error: Error | null\n /** Timestamp of last initialization attempt */\n lastInitAttempt?: number\n}\n\n/**\n * Configuration validation result\n */\nexport interface ConfigValidationResult {\n isValid: boolean\n errors: string[]\n config: TernSecureConfig\n}\n\n/**\n * Firebase Admin configuration interface\n */\nexport interface TernSecureAdminConfig {\n projectId: string\n clientEmail: string\n privateKey: string\n}\n\n/**\n * Firebase Admin configuration validation result\n */\nexport interface AdminConfigValidationResult {\n isValid: boolean\n errors: string[]\n config: TernSecureAdminConfig\n}\n\n\nexport interface SignInResponse {\n success: boolean;\n message?: string;\n error?: keyof typeof ERRORS | undefined; \n user?: any;\n}\n\nexport interface AuthError extends Error {\n code?: string\n message: string\n response?: SignInResponse\n}\n\nexport function isSignInResponse(value: any): value is SignInResponse {\n return typeof value === \"object\" && \"success\" in value && typeof value.success === \"boolean\"\n}\n\n\nexport interface TernSecureState {\n userId: string | null\n isLoaded: boolean\n error: Error | null\n isValid: boolean\n isVerified: boolean\n isAuthenticated: boolean\n token: any | null\n email: string | null\n status: \"loading\" | \"authenticated\" | \"unauthenticated\" | \"unverified\"\n requiresVerification: boolean\n}\n\nexport interface RedirectConfig {\n // URL to redirect to after successful authentication\n redirectUrl?: string\n // Whether this is a return visit (e.g. after sign out)\n isReturn?: boolean\n // Priority of the redirect (higher number = higher priority)\n priority?: number\n}\n\n\nexport interface SignInProps extends RedirectConfig {\n onError?: (error: Error) => void\n onSuccess?: () => void\n className?: string\n customStyles?: {\n card?: string\n input?: string\n button?: string\n label?: string\n separator?: string\n title?: string\n description?: string\n socialButton?: string\n }\n}\n\n\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqFO,SAAS,iBAAiB,OAAqC;AACpE,SAAO,OAAO,UAAU,YAAY,aAAa,SAAS,OAAO,MAAM,YAAY;AACrF;","names":[]}
|